建構堅固的Linux安全環境:從選購到強化的完整
安全性在現代伺服器管理中已成為不可忽視的核心環節。無論是個人專案還是企業應用,一個未經安全加固的Linux伺服器都如同在網路世界中敞開大門。在多年的伺服器管理經驗中,玄貓發現許多安全事故其實源於基礎防護措施的缺失。
這篇將帶你從零開始,逐步建立一個安全的Linux伺服器環境。從選購伺服器、安裝系統到實施各項安全措施,每個步驟都經過精心設計,確保你的伺服器能夠抵禦常見的安全威脅。
伺服器選購與初始設定
選擇合適的伺服器提供商是安全旅程的第一步。在挑選時,我建議考慮以下幾點:
- 提供商的安全聲譽
- 硬體規格是否符合需求
- 網路連線品質與穩定性
- 價格與效能比
以德國的Hetzner為例,他們提供價格合理的伺服器選擇,但需注意這類別服務通常不包含管理支援,適合有一定Linux經驗的使用者。
當訂購伺服器後,記得從提供商的控制檯安裝Linux系統,而非從救援系統安裝。以Hetzner為例,應從 https://robot.your-server.de/server/index 的"Linux"分頁進行安裝,避免SSH金鑰設定問題。
在這個中,我選用Debian 8.7作為基礎系統,因為它具有優秀的穩定性和安全性。接下來的所有操作都假設你以root身份登入伺服器。
系統更新:安全基礎的第一步
伺服器安全的根本在於保持系統更新。過時的軟體包含已知漏洞,是攻擊者的首選目標。
apt-get update && apt-get upgrade
這個命令組合執行了兩個關鍵操作:apt-get update
重新整理套件資訊函式庫得可用更新的最新列表;apt-get upgrade
則下載並安裝這些更新。注意,這個命令只會更新已安裝的套件,不會安裝新套件或移除舊套件,也不會處理跨儲存函式庫件切換。
確保伺服器時間準確也是安全管理的重要環節,尤其當你的伺服器需要與其他系統同步時:
aptitude install ntp
dpkg-reconfigure tzdata
第一行安裝網路時間協定(NTP)服務,確保伺服器時間與網路標準時間同步。第二行命令啟動時區設定工具,讓你選擇伺服器所在的時區。正確的時間設定對於日誌分析、排程任務和安全憑證驗證都至關重要。
核心加固:深層次的安全防護
Linux核心(kernel)是作業系統的心臟,也是安全架構的關鍵部分。透過調整核心引數,我們可以大幅提高系統對入侵嘗試的抵抗力。
建立一個新的設定檔案來儲存核心安全設定:
vi /etc/sysctl.d/local.conf
在這個檔案中,我們可以加入以下安全引數:
# IP Spoofing protection
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Ignore ICMP broadcast requests
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Disable source packet routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# Ignore send redirects
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Block SYN attacks
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5
# Log Martians
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# Disable IPv6 if not needed
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
這些設定提供了多層防護:防止IP欺騙攻擊、忽略廣播ICMP請求、停用源路由封包、防止SYN洪水攻擊、記錄可疑封包,並在不需要時停用IPv6。這些微調會使攻擊者更難利用網路層面的漏洞。設定完成後,重新啟動伺服器以應用這些設定。
轉發root郵件:保持警覺
系統自動傳送給root的郵件通常包含重要的安全警告和系統通知。將這些郵件轉發到你經常檢視的電子信箱,可以確保你不會錯過任何重要訊息:
vi /etc/aliases
增加或修改以下行:
root: youraddress@email.com
然後重建別名資料函式庫
newaliases
這個設定將所有傳送給root使用者的系統郵件轉發到你指定的外部信箱。/etc/aliases
檔案管理系統郵件的轉發規則,而newaliases
命令則使修改生效。這是一個簡單但有效的方法,讓你能即時獲得系統的重要通知。
變更SSH連線埠:基本的模糊處理
大多數自動化攻擊會針對預設的SSH埠(22)進行掃描。將SSH服務移至非標準埠能有效減少這類別嘗試:
vi /etc/ssh/sshd_config
找到並修改埠號設定:
Port 1234 # 選擇一個1024到65535之間的數字
儲存檔案並重啟SSH服務:
service sshd restart
雖然這並非強大的安全措施,但確實能阻擋大量的自動掃描攻擊。選擇一個不常用的高位埠號(如1234只是範例),並記住在連線時需要指定這個埠號。實施此變更後,下次連線時需使用ssh -p 1234 user@server
格式的命令。
建立一般使用者並停用root登入
在Linux安全最佳實踐中,直接以root身份進行SSH連線被視為重大風險。以下是我建議的更安全方法:
- 建立一個普通使用者
- 允許該使用者透過sudo取得臨時root許可權
- 禁止root直接登入
這種方法增加了攻擊難度,因為攻擊者需要猜測使用者名稱和密碼,而非僅破解root密碼。
安裝sudo命令:
apt-get install sudo
建立新使用者:
adduser myUser -shell /bin/bash
adduser myUser sudo
第一個命令建立名為myUser
的新使用者,並指定其使用bash作為預設shell。第二個命令將此使用者加入sudo群組,授予執行特權命令的能力。請確保為新使用者設定一個強密碼,這是防禦的第一道防線。
允許新使用者SSH連線:
編輯SSH設定檔案:
vi /etc/ssh/sshd_config
增加以下行:
AllowUsers myUser
禁止root登入:
在同一設定檔中,找到並修改:
PermitRootLogin no
儲存變更並重啟SSH服務:
service sshd restart
AllowUsers
選項明確指定哪些使用者可以透過SSH登入,而PermitRootLogin no
則完全禁止以root身份直接登入。這是一個關鍵的安全設定,能有效降低伺服器被入侵的風險。實施後,你需要先以普通使用者登入,再使用su -
或sudo
命令取得root許可權。
停用密碼驗證,啟用SSH金鑰認證
密碼驗證存在多種風險,包括字典攻擊、暴力破解和密碼在網路傳輸過程中被擷取。SSH金鑰提供了更強大的安全性:
- 金鑰通常比密碼更長、更複雜
- 私鑰永遠不會在網路上載輸
- 即使攻擊者截獲流量,也無法擷取認證資訊
生成SSH金鑰:
在不同系統上生成SSH金鑰的方法:
- Windows:使用PuTTYgen
- macOS/Linux:使用ssh-keygen命令
在Linux或macOS終端機中:
ssh-keygen -t rsa -b 4096
這個命令生成一對4096位元的RSA金鑰。系統會詢問儲存位置(預設為~/.ssh/id_rsa
)和密碼。強烈建議設定密碼以保護私鑰,這樣即便私鑰被盜,攻擊者也無法直接使用。
設定SSH伺服器啟用金鑰認證並停用密碼:
編輯SSH設定檔案:
vi /etc/ssh/sshd_config
修改或增加以下設定:
ChallengeResponseAuthentication no
X11Forwarding no
UsePAM no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
LogLevel DEBUG3
上載你的公鑰:
在伺服器上,以你的普通使用者身份:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
將你的公鑰(通常在本地電腦的~/.ssh/id_rsa.pub
中)貼入此檔案,然後設定正確的許可權:
chmod 600 ~/.ssh/authorized_keys
重啟SSH服務:
sudo service sshd restart
這些步驟建立了單向認證機制。PubkeyAuthentication yes
啟用金鑰認證,而其他設定則關閉各種形式的密碼認證。.ssh
目錄和authorized_keys
檔案的許可權設定至關重要 - 太寬鬆的許可權會導致SSH服務拒絕使用金鑰。
實施這些變更時要特別小心,最好保持一個活躍的SSH工作階段,直到確認新設定工作正常,以避免鎖定自己。
設定防火牆:控制網路流量
防火牆是伺服器安全的重要組成部分,限制只有必要的服務能夠接收連線。Linux提供了多種防火牆解決方案,從基本的iptables到更友善的前端工具。
使用iptables(基本方法):
以下是一個簡單的iptables防火牆設定範例:
# 清空現有規則
iptables -F
# 設定預設政策
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允許已建立的連線
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允許本地連線
iptables -A INPUT -i lo -j ACCEPT
# 允許SSH(假設我們使用1234埠)
iptables -A INPUT -p tcp --dport 1234 -j ACCEPT
# 允許HTTP和HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 儲存規則供重啟後使用
apt-get install iptables-persistent
netfilter-persistent save
這個基本設定實作了"預設拒絕"策略 - 僅允許明確指定的連線。它允許SSH(在自訂埠號)、HTTP和HTTPS流量,以及已建立連線的回傳流量。iptables-persistent
套件確保這些規則在系統重啟後
SSH金鑰認證問題排查與安全強化策略
在伺服器安全設定過程中,SSH金鑰認證是最基礎也最重要的一環。然而,許多開發者在設定過程中會遇到各種問題。當SSH金鑰認證無法正常運作時,檢查認證日誌是找出原因的關鍵第一步:
tail -f /var/log/auth.log
這個命令會即時顯示認證日誌的最新內容,讓你能夠觀察SSH連線嘗試的細節,包括金鑰驗證失敗的原因。透過分析這些日誌,你可以確認問題是出在伺服器設定還是客戶端金鑰設定上。
當遇到SSH金鑰問題時,網路上有一些極為有用的資源可以協助排除故障。雖然具體連結在此不列出,但我建議查詢關於SSH金鑰設定步驟的完整以及專門針對SSH金鑰除錯的技術文章。這些資源通常會提供系統化的故障排除方法。
設定密碼認證停用
在成功設定SSH金鑰認證後,為了進一步增強伺服器安全性,應該停用密碼認證。這樣可以有效防止暴力破解攻擊:
# 在 /etc/ssh/sshd_config 中設定
PasswordAuthentication no
# 重啟SSH服務使設定生效
service sshd restart
這項設定是伺服器安全的關鍵一步。透過將PasswordAuthentication
設為no
,伺服器將拒絕所有根據密碼的登入嘗試,只允許持有效私鑰的使用者連線。這種設定能有效阻止字典攻擊和暴力破解,因為攻擊者無法透過猜測密碼來取得存取許可權。重啟SSH服務是必要的,這樣新的設定才能生效。
在實際實施這項變更前,玄貓強烈建議確保至少有一個SSH金鑰連線已經過測試並確認能正常工作。如果在測試前就停用密碼認證,可能會導致自己被鎖在系統外面,特別是當金鑰設定有問題時。
防火牆設定:控制網路流量
防火牆是伺服器安全的第二道防線,它能控制進出伺服器的網路流量。Linux系統中有多種防火牆解決方案,從傳統的iptables到更簡便的工具都有。
iptables基本概念
iptables是Linux系統中功能強大的防火牆工具,但其規則複雜與不易掌握。雖然iptables的規則設定邏輯清晰,但對於新手來說,學習曲線較陡峭。市面上有許多iptables規則生成器可以幫助簡化這個過程。
使用UFW簡化防火牆管理
UFW (Uncomplicated Firewall) 是一個為簡化iptables操作而設計的工具,使防火牆設定變得更加直觀。以下是設定UFW的基本步驟:
# 安裝UFW
apt-get install ufw
# 設定預設策略:拒絕所有傳入連線
ufw default deny incoming
# 允許SSH連線(假設SSH使用1234連線埠)
ufw allow 1234/tcp
# 啟用防火牆
ufw enable
這段設定展示了UFW的簡潔之處。首先安裝UFW套件,然後設定預設策略為拒絕所有傳入連線,這是一種「白名單」安全策略,只有明確允許的連線才能進入。接著我們允許SSH連線透過特定連線埠(範例中使用1234,這是一個非標準連線埠,增加了安全性),最後啟用防火牆使設定生效。
在實際應用中,玄貓發現使用非標準SSH連線埠(如範例中的1234)可以顯著減少自動化掃描和攻擊嘗試。這是因為大多數自動化攻擊會針對預設的22連線埠。當然,這只是增加安全性的一小部分,不應該作為唯一的安全措施。
入侵防禦系統與安全稽核
除了基本的SSH安全和防火牆設定外,還有一些專門用於入侵防禦和安全稽核的工具可以進一步增強伺服器安全。
PSAD:連線埠掃描攻擊偵測器
PSAD (Port Scan Attack Detector) 是一個能夠偵測並阻擋連線埠掃描行為的工具。在安裝前,需要確保防火牆已設定為記錄流量:
# 設定iptables記錄流量
iptables -A INPUT -j LOG
iptables -A FORWARD -j LOG
# 安裝PSAD
apt-get install psad
安裝後,需要修改PSAD的設定檔:
# 編輯PSAD設定
vi /etc/psad/psad.conf
還需要在白名單中加入伺服器自己的IP位址,以防止誤封:
# 編輯自動封鎖等級設定
vi /etc/psad/auto_dl
# 加入以下內容
127.0.0.1 0; # localhost
xx.xx.xxx.xxx 0; # 伺服器IP(替換為實際IP)
最後,更新簽名並重啟服務:
sudo psad --sig-update
sudo service psad restart
PSAD的工作原理是分析iptables的日誌,識別可能的連線埠掃描行為。首先我們需要設定iptables記錄所有傳入和轉發的流量。安裝PSAD後,需要修改其設定檔以調整檢測靈敏度和回應策略。特別重要的是在auto_dl
檔案中將伺服器自身的IP位址加入白名單,以防止因為誤判導致正常操作被阻止。--sig-update
命令會更新PSAD的攻擊簽名資料函式庫保能夠識別最新的攻擊模式。
在我管理的多台伺服器上,PSAD成功攔截了大量的自動化掃描嘗試。這些掃描通常是攻擊的前奏,及早發現並阻止這些活動可以顯著降低被成功入侵的風險。
Fail2ban:自動阻擋失敗登入嘗試
Fail2ban是一個可以監控日誌並臨時封鎖反覆嘗試失敗登入的IP位址的工具。它不僅可以監控SSH登入,還能擴充套件到監控其他服務如MongoDB、Apache伺服器、GlassFish等。
Fail2ban的強大之處在於它能夠透過正規表示式解析各種應用程式的日誌格式,識別失敗的存取嘗試,並根據設定的策略自動封鎖來源IP。這使得它成為抵禦自動化攻擊的有力工具。
Lynis:安全稽核工具
Lynis是一個強大的安全稽核工具,它可以掃描系統並提供安全建議:
# 安裝Lynis
apt-get install lynis
# 執行安全稽核
lynis audit system
Lynis會全面檢查系統設定,識別潛在的安全風險,並提供改進建議。它會檢查系統更新狀態、安全設定、已安裝的套件等多個方面,並生成詳細報告。稽核結果會顯示在螢幕上,同時儲存在/var/log/lynis-report.dat
檔案中供後續參考。
玄貓認為,定期執行Lynis稽核是維護伺服器安全的好習慣。它能幫助識別那些容易被忽視的安全漏洞,並提供具體的修復建議。在多次系統佈署中,玄貓發現Lynis能夠發現一些連經驗豐富的系統管理員也可能忽略的安全問題。
伺服器安全的綜合策略
伺服器安全不僅依賴於單一工具或技術,而是需要多層次的防護策略。透過結合SSH金鑰認證、防火牆設定、入侵偵測系統和定期安全稽核,可以建立一個相對強固的安全環境。
在實際操作中,這些安全措施應該根據伺服器的具體用途和環境進行調整。例如,Web伺服器可能需要開放80和443連線埠,而資料函式庫器則需要不同的設定。安全設定應該遵循「最小許可權原則」,只開放必要的服務和連線埠。
安全是一個持續的過程,而不是一次性的設定。定期更新系統、檢查日誌、調整安全策略,是維護伺服器安全的關鍵步驟。透過本文介紹的工具和技術,你可以建立一個基本的安全架構,但仍需要根據實際需求不斷最佳化和調整。
在伺服器安全設定過程中,玄貓建議保持謹慎態度,每次變更後都要測試確認系統功能正常,特別是在修改SSH設定或防火牆規則後。一個小的設定錯誤可能導致無法遠端存取伺服器,造成嚴重的維運問題。因此,在實施重要變更前,確保你有備用的存取方式或還原計劃。
安全與便利性往往需要平衡。過於嚴格的安全措施可能影響系統的可用性和使用體驗,而過於寬鬆的設定則可能留下安全漏洞。找到適合自己需求的平衡點,是系統管理的藝術所在。