服務器安全是 IT 行業一(yī)個老生常談的(de)問題了,每年(nián)的(de)護網行動,企業內(nèi)部的(de)安全培訓都在提醒每個程序員處理(lǐ)好服務器安全問題已變得刻不容緩
如(rú)果在安全方面有疏忽,極易造成數據洩露、隐私洩露等重大安全事故
2022年(nián)美醫療中心數據洩露,超130萬人受影響;
去(qù)年(nián)一(yī)月,勒索軟件攻擊引發墨西哥(gē)州監獄越獄危機;
同樣是2022年(nián),紅(hóng)十字國際委員會遭網絡攻擊,超51萬人信息被黑。
作為(wèi)一(yī)名運維人員,必須要了解一(yī)些安全運維守則,通過一(yī)些手段來保護自(zì)己的(de)服務器不受入侵和(hé)攻擊,再進一(yī)步保護自(zì)己所負責的(de)業務不受影響
下面我将給大家介紹一(yī)些提高(gāo)服務器安全性的(de)方法論
删除特殊的(de)用戶和(hé)用戶組
Linux 系統提供了各種不同角色的(de)系統賬号,在系統安裝完成之後,默認會安裝很多不必要的(de)用戶和(hé)用戶組
如(rú)果你用不上這些用戶和(hé)用戶組,應該删除他們,因為(wèi)賬戶越多,系統就越不安全,這些你不會注意到的(de)用戶很有可(kě)能會被黑客給利用,從而威脅服務器的(de)安全
像:adm、sync、shutdown、lp、halt、news、uucp、games 等系統默認用戶
以及 adm、news、uucp、dip、popusers 等系統默認用戶組
如(rú)果你用不上它們,删除掉
删除的(de)方法很簡單
禁止某些用戶登錄系統的(de)功能
有些情況下,某些用戶僅僅用作進程調用或者用戶組調用,并不需要登錄功能
比如(rú)說 mail 用戶,很多情況下,我們的(de)郵件服務器隻需要進行收取郵件的(de)功能,不需要登錄到系統上
所以給它的(de) shell 設置成 nologin 就行了
總結一(yī)下
關于用戶和(hé)用戶組的(de)删除,其實不是千篇一(yī)律的(de),可(kě)以根據服務器的(de)主要用途來決定:如(rú)果服務器是 web 應用,那麽 apache 用戶或 nginx 用戶就無需删除;而跟數據庫相關的(de)默認用戶,例如(rú) mysql 用戶就可(kě)以删除
合理(lǐ)使用 su、sudo 命令
su 命令是一(yī)個切換用戶的(de)工具,用于将普通用戶切換到超級用戶下,也可(kě)以将超級用戶切換到普通用戶
為(wèi)了保證服務器安全,很多情況都是直接禁止超級用戶直接登錄系統,而是先通過普通用戶登錄,再通過 su 命令切換到超級用戶
但是 su 命令會導緻一(yī)些安全問題:普通用戶想要使用 su 命令切換到超級用戶,就首先要知道(dào)超級用戶的(de)密碼,如(rú)果有多個普通用戶,那麽這多個普通用戶都知道(dào)超級用戶的(de)密碼,這在一(yī)定程度上會對系統的(de)安全造成威脅
超級用戶的(de)密碼應該掌握在少數人手裏
這時候 sudo 命令登場了
sudo 命令允許管理(lǐ)員分配給普通用戶一(yī)些合理(lǐ)的(de)“權利”,并且不需要普通用戶知道(dào)超級用戶的(de)密碼,就能讓普通用戶執行一(yī)些隻有超級用戶或其他特權用戶才能完成的(de)任務,比如(rú)服務重啓,修改配置文件等
sudo 命令也叫受限制的(de) su
sudo 命令的(de)執行流程是:将當前用戶切換到超級用戶下(或切換到指定用戶),然後以超級用戶(指定用戶)身份執行命令,執行完成後,直接退回到當前用戶
舉個例子(zǐ):普通用戶是無法訪問 /etc/shadow 文件的(de)
如(rú)果要讓 user1 能夠訪問這個文件,可(kě)以在 /etc/sudoers.d/ 添加下面內(nèi)容:
添加之後我們用 user1 執行一(yī)下
輸入 user1 的(de)密碼之後就可(kě)以查看文件了
如(rú)果普通用戶沒有在 /etc/sudoers.d/ 或/etc/sudoers 中配置,同樣無法查看
sudo 使用時間戳文件來完成類似“檢票(piào)”的(de)功能:當用戶輸入密碼之後就獲得了一(yī)張默認存活期為(wèi)5分鍾的(de)入場券,超時以後,用戶必須重新輸入密碼才能獲得相應的(de)權限
這樣會導緻一(yī)個問題:如(rú)果超時就要重新輸入密碼,像一(yī)些自(zì)動調用超級權限的(de)程序就會出現問題
我們可(kě)以通過下面的(de)設置讓普通用戶無需輸入密碼也可(kě)執行具有超級權限的(de)程序,例如(rú)需要 user1 用戶 可(kě)以自(zì)動重啓 network 的(de)權限
這樣 user1 用戶就可(kě)以執行重啓 network 的(de)腳本而無需輸入密碼了
如(rú)果要讓 user1 具有超級用戶的(de)所有權限,又不想輸入超級用戶的(de)密碼,隻需要添加如(rú)下內(nèi)容即可(kě)
使用強密碼而非弱密碼
這個準則想必大家都聽過了,一(yī)個強大健壯的(de)密碼,能讓你的(de)系統安全性翻倍提高(gāo)
什麽是強密碼:
至少 12 個字符長(cháng),但 14 個或 14 個字符以上更好
大寫字母、小寫字母、數字和(hé)符号的(de)組合
不是可(kě)以在詞典或人員、角色、産品或組織名稱中找到的(de)單詞
使用密鑰認證作為(wèi)遠程登錄系統的(de)認證方式
Linux 中,遠程登錄系統有兩種認證方式:
密碼認證
密鑰認證
關于密碼認證,雖然設置一(yī)個密碼對系統安全能夠起到一(yī)定作用,但是當遇到像密碼暴力破解、密碼洩露、密碼丢失等問題時,我們往往就會束手無策,而且強密碼也會對我們的(de)工作造成一(yī)定負擔
而密鑰認證是一(yī)種新型的(de)認證方式,公用密鑰存儲在遠程服務器上,專用密鑰保存在本地(dì),當需要登錄系統時,通過本地(dì)專用密鑰和(hé)遠程服務器的(de)公用密鑰進行配對認證,如(rú)果認證成功就能登陸
這種認證方式避免了被暴力破解的(de)風險,同時隻要保存在本地(dì)的(de)專用密碼不被黑客盜用,是一(yī)般無法通過密鑰認證的(de)方式進入系統的(de)
關閉系統不需要的(de)服務
Linux 綁定了很多沒用的(de)服務,這些服務默認都是自(zì)動啓動的(de)
對于服務器來說,運行的(de)服務越多,系統就越不安全,因此關閉一(yī)些不需要的(de)服務,對系統安全有很大的(de)幫助
但具體要關閉那些服務,需要根據服務器的(de)用途而定,一(yī)般情況下,隻要系統本身用不到的(de)服務都認為(wèi)是不必要的(de)服務
例如(rú)某台 Linux 服務提供 web 服務,那麽除了 httpd 服務或者 nginx 服務和(hé)系統運行時必需的(de)服務外,其他服務都可(kě)以關閉
下面列出一(yī)下不常用的(de)服務,大家可(kě)以自(zì)行選擇關閉
關閉服務自(zì)啓動的(de)方法可(kě)以通過 chkconfig 命令實現
對所有需要關閉的(de)服務都執行上面的(de)操作之後,重啓服務器即可(kě)
而為(wèi)了系統能夠安全穩定的(de)運行,就不得不運行一(yī)些服務,如(rú)下所示
acpid:用于電源管理(lǐ)
apmd:高(gāo)級電源能源管理(lǐ)服務,用于監控電池性能
kudzu:檢測硬件是否變化的(de)服務
crond:為(wèi) Linux 下自(zì)動安排的(de)進程提供運行服務
atd:類似于 crond,提供計劃任務功能
keytables:用于裝載鏡像鍵盤
iptables:Linux 內(nèi)置防火牆軟件
xinetd:支持多種網絡服務的(de)核心守護進程
network:Linux 網絡服務
sshd:提供遠程登錄 Linux 的(de)服務
syslog:記錄系統日志的(de)服務
文件權限檢查和(hé)修改
不正确的(de)文件權限設置會直接威脅系統的(de)安全,因此運維人員應該能及時發些這些不正确的(de)權限設置,并立即修改
查找系統中任何用戶都具有寫權限的(de)文件或目錄
查找系統中具有 s 權限的(de)程序
含有 s 權限的(de)程序對系統安全威脅很大,上面的(de)命令可(kě)以把某些不必要的(de) s 權限的(de)程序去(qù)掉,防止用戶濫用權限或者提升權限
檢查系統中所有 suid 和(hé) sgid 文件
檢查系統中沒有屬主的(de)文件
沒有屬主的(de)孤兒文件往往容易成為(wèi)黑客利用的(de)工具,因此再找到這些文件之後,要麽删除要麽修改文件的(de)屬主