Linux服務器安全配置實例(二)用戶賬戶權限配置
沒有絕對的安全
在上一篇文章《linux服務器安全配置實例(一)》中介紹了我對ssh服務的一些常用的安全配置和性能優化。
其實ssh服務是我們進入服務器的一扇大門,這扇大門是提供正常人使用鑰匙打開后進屋的。而對于一些惡意的小伙伴,他們會使用一些非法的方式,比如走窗戶、暴力開鎖等去不經過我們的同意就進屋大肆破壞。
走窗戶:通過一些系統的0day漏洞或者第三方服務以及軟件的漏洞溢出或者注入,在服務器中運行惡意的代碼來得到登陸權限。
暴力開鎖:通過一些暴力破解軟件,暴力破解我們的ssh服務、網站管理員密碼等。
對于暴力開鎖我們在對sshd服務器安全配置和優化中已經說明如何防范。對于走窗戶、跳煙囪這樣采用漏洞攻擊的方式,我們最簡單的方式就是及時修復漏洞,配置防火墻和殺毒軟件等。
當然在一些大型的企業、政府的辦公環境下,網絡安全是十分主要的,自然會加入更多的安全機制,如:入侵檢測系統、安全網關、網閘、堡壘機等。其實無論我們如何配置或者加入無數安全機制,都是沒有絕對的安全的。沒有絕對安全這句話是在網絡安全圈子內最流行的一句話。
漏洞的產生是防不勝防的,我們曾經依托于openssl去保護我們的信息傳輸過程中不被第三方嗅探到內容,但是萬萬沒想到的心臟大出血漏洞出現了。我們曾經吶喊著Linux服務器是最安全的(沒錯,因為linux操作系統用的人少,它的安全機制也確實十分完善),但是沒有一點點防備的bash破殼漏洞出現了。
攻擊者的目標:root權限
當這些漏洞被挖掘出來,無論漏洞公布者是出于學術交流還是炫耀自己多么牛逼,那么當公布出來的那一刻就意味著成千上萬的服務器造成嚴重的威脅。其實不公布才是最可怕的!所以我們無法預測漏洞合適會出現,也無法預計自己的服務器是否會被人利用。那么我們可以假設:我的服務器被攻陷后怎么辦?
其實在漏洞凌完成后,第二部就是拿到登陸服務器的權限。所以我們可以很確定的說,用戶權限就是惡意攻擊者的下一個目標。linux、unix操作系統的最高權限都是root,其uid為0。
這個用戶權限擁有至高無上的能力。所以惡意攻擊者會用各種手段去獲取root權限。獲取root權限也常在安卓手機中使用,安卓操作系統也是linux的分支,所以當安卓root后手機將不會安全,任何進程都可以使用setuid()系統調用,設置自己進程擁有root權限,那么木馬病毒也不例外了。所以完全杜絕使用root用戶在服務器中啟動任何服務,使用私有用戶去啟動進程,同時禁止root用戶登錄。也就是在惡意攻擊者通過對服務進程漏洞攻擊后,拿到的用戶權限不是root,同時利用一些系統內核級的漏洞對root進行提權也是無法登錄的。對私有用戶的活動目錄進行限制,提權操作也更是難上加難。
防御技巧
下面詳細說明一下賬戶權限和目錄權限的配置。
1.禁止root
禁止root登陸有2個地方可以配置,第一個在ssh服務中:
這一點在對sshd服務安全配置和優化已經說明了,具體配置可以點開鏈接查看。第二個就是在系統內使用su命令切換root用戶了。其實這是一件挺麻煩的事情,我們知道對系統一些更改、安裝軟件、升級系統都需要root權限。那么為了安全我們需要禁用它,為了配置系統我們又要使用它,自相矛盾了。這里給出2種解決矛盾的方法:
徹底禁用root登陸,使用sudo。
root可以使用su切換,但是禁止遠程登陸。
這兩種方法各有利弊,第一種完全可以杜絕root用戶的使用,同時也很難對root提權。這里需要說明下sudo,sudo可以讓普通用戶擁有root用戶的權限,例如在普通用戶下使用
就可以直接在非root用戶的情況下安裝namp端口掃描工具。可以使用sudo命令的用戶需要在/etc/sudoers文件中進行一些配置。
該配置文件的格式為:
用戶或者組(組需要在組名前加%)主機=(用戶) 執行的命令,如:
全句的意思是:授權根用戶在所有計算機上以所有用戶的身份運行所有文件。其實簡單來說,我們可以在sudoers文件中配置哪些用戶可以使用root權限執行哪些命令。
對于第一種方案,我們就是在禁用root以后通過sudo對系統進行一些修改,所以說sudo相當于擁有一定的root權限,因此sudo的權限也需要嚴格控制。這一點就有一些麻煩,通常建議為每個服務創建一個私有用戶,倘若啟動一些服務需要root權限,那么可以將需要root的命令配置到sudoers文件中。例如:為nginx創建了nginx私有用戶,需要使用80端口,linux系統是不允許非root用戶請求低端口的,一般有兩種方案解決:1、創建使能2、在sudoers文件中配置如下:
而對于日常巡檢系統升級需要用到root權限的命令也可以為巡檢用戶進行配置,如:
第一種方案麻煩就麻煩在需要每個用戶都進行配置,但是權限細分安全有保證。
徹底禁用root登陸,當前用戶為root下編輯/etc/shadow執行:
如果當前用戶為非root下編輯/etc/shadow執行:
需要注意如果sudo沒有權限,請通過root用戶配置sudoers。
shadow文件保存了用戶和密碼等信息,每一列中間以:分割。
- 列1 定義與這個 shadow 條目相關聯的特殊用戶帳戶。
- 列2 包含一個加密的密碼。
- 列3 自 1/1/1970 起,密碼被修改的天數
- 列4 密碼將被允許修改之前的天數(0 表示“可在任何時間修改”)
- 列5 系統將強制用戶修改為新密碼之前的天數(1 表示“永遠都不能修改”)
- 列6 密碼過期之前,用戶將被警告過期的天數(-1 表示“沒有警告”)
- 列7 密碼過期之后,系統自動禁用帳戶的天數(-1 表示“永遠不會禁用”)
- 列8 該帳戶被禁用的天數(-1 表示“該帳戶被啟用”)
- 列9 保留供將來使用
在root用戶的第二列之前加入!!,表示禁止該用戶。
對shadow文件編輯完成后保存退出。
編輯/etc/passwd,執行
passwd文件保存了用戶賬戶的基本信息,每一列中間以:分割。
- 列1 用戶名,用戶名在系統中是唯一的。
- 列2 用戶密碼列,新版本的unix/linux系統密碼已經轉移到/etc/shadow中。
- 列3 用戶id(UID),UID是在系統中是唯一的,對于操作系統來說只認識UID,用戶名是給用戶看的。
- 列4 組id(GID),GID是在系統中是唯一的,對于操作系統來說只認識GID,組名稱是給用戶看的。
- 列5 用戶全名,包含有關用戶的一些信息,如用戶的真實姓名、辦公室地址、聯系電話等。在Linux系統中,mail和finger等程序利用這些信息來標識系統的用戶。
- 列6 用戶home目錄,該字段定義了個人用戶的主目錄,當用戶登錄后,他的Shell將把該目錄作為用戶的工作目錄。
- 列7 命令解釋程序(Shell),Shell是當用戶登錄系統時運行的程序名稱,通常是一個Shell程序的全路徑名, 如/bin/bash。 注意如果需要禁止用戶登錄可以把該列改為/sbin/nologin。
根據上面的描述,可以將root用戶的第七列改為/sbin/nologin,禁止root用戶的登錄。
2.創建私有用戶
私有用戶的意思是對每一個服務創建專用的用戶來運行服務,比如nginx使用nginx用戶運行,apache使用apache用戶運行,mariadb使用MySQL用戶運行等。私有用戶包含了私有用戶和私有用戶組,私有用戶組是指組中只有一個用戶,如nginx組為nginx的私有用戶。為每一個服務創建一個私有用戶好處在于,當對外提供的服務由于不可預知的漏洞,惡意攻擊者對服務進行溢出攻擊,溢出的惡意代碼執行成功后惡意攻擊者拿到的用戶權限也只是服務的私有用戶,由于私有用戶的權限非常低,所以減小了系統以及應用暴露的范圍。使得危險可控。
對于服務,我們使用UID為100-999之間任意一個未被使用的UID,UID 1~99是保留給其它預定義用戶的,UID 100~999是保留給系統用戶的。而GID由于是私有組,建議與用戶UID相同。
創建私有用戶和普通用戶一樣,與普通用戶區別在于:
- 針對服務UID在999以內,普通用戶UID在999以后。
- 活動空間一般只在應用服務的安裝路徑,普通用戶活動空間在/home下。
- 針對服務的私有用戶只用于啟動服務,禁止登陸,普通用戶一般用于登陸。
使用groupadd創建組,-g參數指定組ID,即GID
使用useradd創建用戶,-g參數指定GID,-u參數指定UID,-d參數指定用戶的home目錄,-s參數指定用戶的shell程序,由于服務私有用戶不需要遠程登錄,所以配置為/sbin/nologin
3.設置私有用戶活動權限
對于服務的私有用戶,需要對其目錄訪問權限進行一些設定,防止應用服務被滲透后,惡意攻擊者在服務器中使用已有的權限亂搞。同時需要說明一下如何使用私有用戶啟動服務。需要注意的是,每個針對服務的私有用戶權限配置都不同,但是基本配置方式都差不多,都是有規律可循的。首先我們需要確定應用服務的基本,即需要什么?變動什么?不變動什么?
需要什么?應用服務最基本提供的是用戶的交互請求、數據存儲和計算。所以可以看出應用服務需要提供端口來保證用戶的請求,而對于數據存儲需要提供存儲空間。對于web容器我們需要一個合理的端口,大多為80。對于數據庫和緩存我們需要一個合理的存儲空間,這個空間大多與服務器操系統盤分開,以外掛數據盤的方式存在,當然數據庫和緩存服務也需要端口。
變動什么?服務應用程序在運行時間必然會產生臨時文件和日志,臨時文件我們大多保存在/tmp下,對于日志有很多種:
- syslog,大多在/var/log/message中
- 程序自己的日志空間
- 寫入數據庫,mongodb、mysql等
- 標準輸出
不變動什么?應用服務的配置文件、庫文件和可執行文件大多是不變的。在大多情況下,一個應用服務配置完成后啟動對外服務,基本是不變的,但相對于庫文件和可執行文件這種徹底不會變動的文件還算是可變。對于配置文件,與數據存儲一樣通常單獨劃分出來。
所以可以看出,我們只要需要把每個服務的日志文件、存儲數據的文件、端口權限、執行文件和庫文件進行授權。而對于其他目錄和端口是不允許訪問的。
這里使用nginx舉例,我的nginx在服務器上的配置如下:
安裝路徑/srv/nginx
nginx的配置文件路徑/data/config/nginx_config
nginx的日志和pid文件路徑/data/var/nginx
nginx的服務端口為80
針對上面的配置需要對nginx用戶進行授權,下面說一下具體如何授權。
在對每個目錄進行授權之前,先確保這些目錄父目錄的所屬用戶和組都為root,同時保證父目錄中的nginx目錄是700的權限(當然最好父目錄下的所有文件目錄都是700),這樣保證了nginx目錄不被其他用戶所訪問。
修改/srv的權限:
修改/srv/nginx的權限:
修改/data/和/data/config的權限
修改/data/config/nginx_config的權限
修改/data/var/的權限
修改/data/var/nginx的權限
文件權限已經修改好了,接下來需要配置nginx能夠使用80端口。之前說過可以使用sudoers文件給nginx用戶root權限,還有一個方式就是讓nginx的啟動文件/srv/nginx/sbin/nginx進行使能操作。使能顧名思義,使其擁有一定能力,這里使能是請求低端口使能。
內核2.1以后使用
進行使能操作。
接下來再在nginx的配置文件nginx.conf中加入user nginx來配置nginx使用nginx這個用戶運行。
四、刪除沒用的用戶
linux系統中有很多沒用的用戶,這些用戶可以直接刪除掉不影響系統。系統內存在沒用的用戶可能會被惡意入侵者提權利用,存在很大的安全隱患。同樣有一些沒用的組也可以刪除掉。
刪除用戶使用userdel命令:
刪除用戶組使用groupdel命令:
注意組中可能存在多個用戶,同時組內存在用戶的話系統是不讓刪除的,一般沒用的用戶組內的用戶也大多是沒用的,所以可以把組內用戶全部刪除掉再刪除組。
下面列出可刪除的用戶:
adm、lp、sync、shutdown、halt、news、uucp、operator、games、gopher
下面列出可刪除的用戶組:
adm、lp、news、uucp、games、dip、ppusers、popusers、slipusers
用戶賬戶權限配置做到這些就已經可以了,配置用戶權限是個細致的活,尤其在不同用戶活動空間和執行命令上配置需要謹慎,稍有遺漏都有可能會被惡意攻擊者利用。通常我們會采用編寫腳本方式對這些進行配置,如果對服務器腳本有興趣的同學不妨鉆研一下。