本文匯總整理一些Linux服務器安全相關的知識,有一些常識是每個系統管理員都應該爛熟于心的,就不多說了,比如
下面是一些容易被新手忽視的Linux安全設置要點,
更改SSH默認端口
在搭建好一臺全新的服務器后要做的第一件事情就是更改SSH的默認端口。這個小小的改動能夠使你的服務器避免受到成千上萬的暴力攻擊(LCTT 譯注:不更改默認端口相當于黑客們知道你家的門牌號,這樣他們只需要一把一把的試鑰匙就可能打開你家的鎖)。
要更改默認的SSH端口,先打開sshd_config文件:
- sudo vim /etc/ssh/sshd_config
找到下面這行:
- #Port 22
“#”號表示這行是注釋。首先刪除#號,然后把端口號改成目的端口。端口號不能超過65535,確保要指定的端口號沒有被系統或其它服務占用。建議在[維基百科]上查看常用端口號列表。在本文中,使用這個端口號:
- Port 16543
然后保存并關閉文件。
接下來的一步是:
使用SSH密鑰認證
在通過SSH訪問服務器時,使用SSH密鑰進行認證是尤其重要的。這樣做為服務器增加了額外的保護,確保只有那些擁有密鑰的人才能訪問服務器。
在本地機器上運行下面命令以生成SSH密鑰:
- ssh-keygen -t rsa
你會看到下面的輸出,詢問要將密鑰寫到哪一個文件里,并且設置一個密碼:
- Generating public/private rsa key pair.
- Enter file in which to save the key (/root/.ssh/id_rsa): my_key
- Enter passphrase (empty for no passphrase):
- Enter same passphrase again:
- Your identification has been saved in my_key.
- Your public key has been saved in my_key.pub.
- The key fingerprint is:
- SHA256:MqD/pzzTRsCjZb6mpfjyrr5v1pJLBcgprR5tjNoI20A
完成之后,就得到兩個文件:
- my_key
- my_key.pub
接下來把my_key.pub拷貝到~/.ssh/authorized_key中
- cp my_key.pub ~/.ssh/authorized_keys
然后使用下面命令將密鑰上傳到服務器:
- scp -P16543 authorized_keys user@yourserver-ip:/home/user/.ssh/
至此,你就可以從這臺本地機器上無密碼地訪問服務器了。
關閉SSH的密碼認證
既然已經有了SSH密鑰,那么關閉SSH的密碼認證就會更安全了。再次打開并編輯sshd_config,按如下設置:
- ChallengeResponseAuthentication no
- PasswordAuthentication no
- UsePAM no
關閉Root登錄
下面關鍵的一步是關閉root用戶的直接訪問,而使用sudo或su來執行管理員任務。首先需要添加一個有root權限的新用戶,所以編輯這個路徑下的sudoers文件:
- /etc/sudoers/
推薦使用如visudo這樣的命令編輯該文件,因為它會在關閉文件之前檢查任何可能出現的語法錯誤。當你在編輯文件時出錯了,這就很有用了。
接下來賦予某個用戶root權限。在本文中,使用用戶sysadmin。確保在編輯后這個文件時使用的用戶是系統已有的用戶。找到下面這行:
- root ALL=(ALL) ALL
拷貝這行,然后粘貼在下一行,然后把root更改為“sysadmin”,如下所示:
- root ALL=(ALL) ALL
- sysadmin ALL=(ALL) ALL
現在解釋一下這行的每一個選項的含義:
(1) root (2)ALL=(3)(ALL) (4)ALL
(1) 指定用戶
(2) 指定用戶使用sudo的終端
(3) 指定用戶可以擔任的用戶角色
(4) 這個用戶可以使用的命令
(LCTT 譯注:所以上面的配置是意思是:root 用戶可以在任何終端擔任任何用戶,執行任何命令。)
使用這個配置可以給用戶訪問一些系統工具的權限。
這時,可以放心保存文件了。
為了關閉通過SSH直接訪問root,需要再次打開sshd_config,找到下面這行:
- #PermitRootLogin yes
更改為:
- PermitRootLogin no
然后保存文件,重啟sshd守護進程使改動生效。執行下面命令即可:
- sudo /etc/init.d/sshd restart
設置防火墻
防火墻有助于過濾出入端口和阻止使用暴力法的登錄嘗試。我傾向于使用SCF(Config Server Firewall)這個強力防火墻。它使用了iptables,易于管理,而且對于不擅于輸入命令的用戶提供了web界面。
要安裝CSF,先登錄到服務器,切換到這個目錄下:
- cd /usr/local/src/
然后以root權限執行下面命令:
- wget https://download.configserver.com/csf.tgz
- tar -xzf csf.tgz
- cd csf
- sh install.sh
只需等待安裝程序完成,然后編輯CSF的配置文件:
- /etc/csf/csf.conf
默認情況下CSF是以測試模式運行。通過將“TESTING”的值設置成0,切換到product模式。
- TESTING = "0"
下面要設置的就是服務器上允許通過的端口。在csf.conf中定位到下面的部分,根據需要修改端口:
- # 允許入站的 TCP 端口
- TCP_IN = "20,21,25,53,80,110,143,443,465,587,993,995,16543"
- # 允許出站的 TCP 端口
- TCP_OUT = "20,21,22,25,53,80,110,113,443,587,993,995,16543"
- # 允許入站的 UDP 端口
- UDP_IN = "20,21,53"
- # 允許出站的 UDP 端口
- # 要允許發出 traceroute 請求,請加 33434:33523 端口范圍到該列表
- UDP_OUT = "20,21,53,113,123"
請根據需要逐一設置,推薦只使用那些需要的端口,避免設置對端口進行大范圍設置。此外,也要避免使用不安全服務的不安全端口。比如只允許端口465和587來發送電子郵件,取代默認的SMTP端口25。(LCTT 譯注:前提是你的郵件服務器支持 SMTPS)
重要:千萬不要忘記允許自定義的 ssh 端口。
允許你的IP地址通過防火墻,而絕不被屏蔽,這一點很重要。IP地址定義在下面的文件中:
- /etc/csf/csf.ignore
被屏蔽了的IP地址會出現在這個文件中:
- /etc/csf/csf.deny
一旦完成更改,使用這個命令重啟csf:
- sudo /etc/init.d/csf restart
下面是在某臺服務器上的csf.deny文件的部分內容,來說明CSF是很有用的:
- 211.216.48.205 # lfd: (sshd) Failed SSH login from 211.216.48.205 (KR/Korea, Republic of/-): 5 in the last 3600 secs - Fri Mar 6 00:30:35 2015
- 103.41.124.53 # lfd: (sshd) Failed SSH login from 103.41.124.53 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:06:46 2015
- 103.41.124.42 # lfd: (sshd) Failed SSH login from 103.41.124.42 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:59:04 2015
- 103.41.124.26 # lfd: (sshd) Failed SSH login from 103.41.124.26 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 02:48:26 2015
- 109.169.74.58 # lfd: (sshd) Failed SSH login from 109.169.74.58 (GB/United Kingdom/mail2.algeos.com): 5 in the last 3600 secs - Fri Mar 6 03:49:03 2015
可以看到,嘗試通過暴力法登錄的IP地址都被屏蔽了,真是眼不見心不煩??!
鎖住賬戶
如果某個賬戶在很長一段時間內都不會被使用了,那么可以將其鎖住以防止其它人訪問。使用如下命令:
- passwd -l accountName
當然,這個賬戶依然可以被root用戶使用(LCTT 譯注:可用 su 切換為該賬號)。
了解服務器上的服務
服務器的本質是為各種服務提供訪問功能。使服務器只運行所需的服務,關閉沒有使用的服務。這樣做不僅會釋放一些系統資源,而且也會使服務器變得更加安全。比如,如果只是運行一個簡單的服務器,顯然不需要X顯示或者桌面環境。如果不需要Windows網絡共享功能,則可以放心關閉Samba。
使用下面的命令能查看伴隨系統啟動而啟動的服務:
- chkconfig --list | grep "3:on"
如果系統運行了systemd,執行這條命令:
- systemctl list-unit-files --type=service | grep enabled
然后使用下面的命令關閉服務:
- chkconfig service off
或
- systemctl disable service
在上面的例子中,把“service”替換成真正想要停止的服務名稱。實例如下:
- chkconfig httpd off
或
- systemctl disable httpd
更多Linux安全相關
在如今的技術領域中,做一個完全安全的系統是一個不可能實現的目標。正如 FBI 的 Dennis Hughes 所說,“真正安全的計算機是沒有連線、鎖在一個保險箱中、埋藏在一個秘密場所的地下 20 英尺處的計算機……我甚至不確定這樣是否安全?!痹诓荒苓x擇通過拔掉線纜、鎖住和掩埋計算機來保護系統的世界里,可通過以下步驟縮小 您系統的攻擊面。Open Web Application Security Project (OWASP) 的 攻擊面分析備忘錄 提供了有關攻擊面的更多信息。
sane 系統配置等流程可縮小攻擊面,而滲透測試和模糊測試可幫助工程師加固系統,通過熟練利用漏洞和意外輸入來攻破系統,從而查找可修復的漏洞。這些技術通過在有機會利用惡意實體之前檢測和消除漏洞,提高了系統的安全性。
Sane 配置
Sane 配置是加固任何系統的關鍵,因為任何漏洞都可以在某種程度上被利用。例如,SSH(比如 arcfour)或一些協議(比如用于 Web 服務器的 TLSv1.0)對遺留密碼的支持,是攻擊者獲取訪問權并且損害系統的一種途徑。為了阻止這些和其他漏洞,在執行用戶授權時請遵循最少特權原則;為用戶或進程提供能夠完成需要任務所需的最小訪問權和許可。關閉未用端口,以減少網絡攻擊者可訪問的入口點,從而阻止來自網絡的入侵。此外,確保啟用了防火墻協議,從而進一步限制可能的網絡攻擊。使用某種工具(比如 seccomp)過濾系統調用對進程的可用性,減少暴露的內核表面。
未用的包沒有提供任何額外功能,但卻是潛在的攻擊載體。確認安裝的應用程序和包是必需的,刪除不必要的應用程序和包。一個簡單示例是,如果一個系統僅通過控制臺訪問,則刪除所有未用的 GUI 支持。Center for Internet Security (CIS-CAT) 提供的 Configuration Assessment Tool 是一個有用的應用程序,允許用戶運行不同深度的加固基準測試,以指出系統在哪些地方未滿足想要的標準。強烈推薦使用 CIS-CAT 幫助您發現系統的細微配置加固漏洞。
除了系統加固之外,軟件發布者還為用戶提供了重要的軟件和安全更新。代碼修復和改進對系統安全有一定的影響。過時的系統是攻擊者更容易攻擊的目標。依據 United States Computer Emergency Readiness Team,如果受害者擁有恰當更新的系統,可以避免高達 85% 的針對性攻擊 (https://www.us-cert.gov/ncas/alerts/TA15-119A)。如果系統得到恰當更新,可顯著減少攻擊成功率。普遍攻擊,包括惡意的實體,都是眾所周知的。盡責的供應商會努力及時發布補丁。但是,如果系統管理員未能應用更新,這些補丁就無法保護他們提供的系統和服務。必須盡力確保所有系統得到及時更新。
滲透測試
滲透測試是一種使用自動化工具或自定義攻擊查找系統漏洞的方法。滲透測試的目標是破壞系統安全防護,在沒有期望的權限或憑據的情況下通過非故意操作模式獲得數據的訪問權。這些攻擊使用目標系統中存在的已知利用手段和漏洞。滲透測試需要一種與傳統驗證方法(比如驗證測試)不同的思維。不同于更加傳統的測試,滲透測試人員嘗試使用惡意攻擊者的工具和方法訪問系統組件和數據。盡管滲透測試的原理看起來比較落后,但它提供了比單一傳統測試更加透明和完整的系統安全概況。
滲透測試工具鏈包含一些示例,比如 Metasploit,這是一個功能全面的滲透測試框架,其中包含數據庫中已知的漏洞和用于掃描網絡和已暴露系統的工具。其他示例還有 Nmap 和 Wireshark,它們分別使用端口掃描或包檢查來測試網絡。這兩個工具都提供了系統操作和響應網絡的情況的詳細信息。端口掃描顯示可通過網絡獲得哪些應用程序和系統實用程序,顯示哪些端口未用并應考慮阻止訪問??蓮木W絡訪問的任何實體都是可能的目標,所以需要優先考慮禁止訪問。以下工具非常有用,能在各種目標上執行自動化的漏洞檢測:
除了掃描和工具之外,深入了解正在遭受攻擊的系統始終有利無弊。創建特定的利用手段并手動執行有效負載,比定義許多形式的滲透測試的自動化過程復雜得多。一旦找到某種利用手段,就可以創建自動化測試和有效負載傳送系統,但尋找這類攻擊是一個艱苦的過程。
確定攻擊的潛在目標可能很難。當嘗試利用一個復雜系統時,需要確定哪些攻擊載體比其他攻擊載體更富有成效。如果一個正在運行的進程有一個 Web 接口或連網組件,它可能是比暴露面更小的應用程序更好的目標。一個額外的指標是:是否存在專業軟件。無需嘗試使用擁有既定社區和支持歷史的載體,尋找符合特定用途的軟件或為在冷門環境中運行而構建的軟件可能是更好的選擇。
模糊測試
OWASP 將模糊測試定義為 “以自動化方式注入格式錯誤/格式部分錯誤的數據來尋找實現漏洞” (https://www.owasp.org/index.php/Fuzzing),這是驗證系統和支持的應用程序的穩定性的另一種方法。在應用程序上執行模糊測試的一個示例,可能是在僅接受整數作為輸入的程序上執行測試。當輸入是浮點、字符串或其他任何不想要的格式的數據時,會發生什么?理想情況下,應用程序可處理格式錯誤的輸入。如果應用程序崩潰或出現其他意外情況,系統的穩定性和安全性可能面臨風險。強烈推薦采用的一種應用程序模糊測試工具是 american fuzzy lop (AFL),它能在 QEMU、Clang、OpenSSH、Bash 和 Mozilla Firefox 等流行應用程序中找到多個 bug。AFL 可在任何可執行的應用程序上運行,使用用戶提供的 “良好” 輸入執行測試,這使用戶能夠自定義 AFL 執行模糊測試的初始環境。另一個工具是 OWASP Zap,它既是一個 Web 漏洞掃描器,也是一個 Web 應用程序模糊測試器。該應用程序在可用鏈接上抓取信息,發送模糊化的輸入以及已知的惡意攻擊。IBM Security Appscan 在 Web 應用程序上執行類似功能,但該軟件還提供了使用模糊化輸入測試應用程序源代碼的版本。
運行任何模糊化應用程序,都會給系統資源造成巨大負擔。除了系統資源需求之外,模糊化還需要一定時間才能交付結果。但是,即使擁有大量時間,使用的偽隨機輸入也無法確保能夠發現所有潛在問題。
結束語
服務器加固和驗證需要不斷努力。隨著每天都能發現新的利用手段和漏洞,您系統的安全時常處于危險之中。系統審計、滲透測試和模糊測試分別從獨特的視角提供了系統狀態信息。除了測試標準(比如單元測試和功能測試)之外,還應使用這些方法來幫助提高您對系統的信心。
另外,
我們的Linux肯定不會只是一臺裸機,上邊是運行了apache、nginx、mysql、php等各種應用或數據庫的,它們的安全配置同樣是非常重要的,而且也是linux系統安全的重要組成部分,所以我們也要對這些應用或數據庫進行必要的安全設置。