做爲一種開放源代碼的操做系統,Linux服務器以其安全、高效和穩定的顯著優點而得以普遍的應用。隨着而來的就是——Linux系統的安全問題。linux
本篇博客主要圍繞Linux系統的安全問題:
1、帳號安全控制;
2、系統引導和登陸控制;
3、弱口令檢測、端口掃描。git
用戶帳號是計算機使用者的身份憑證或標識,每一個要訪問系統資源的人,必須憑藉其用戶帳號才能進入計算機。在Linux系統中,提供了多種機制來確保用戶帳號的正當、安全地使用。算法
在Linux系統中,除了用戶手動建立的各類帳號以外,還包括隨系統或程序安裝過程而產生的其餘大量的系統帳號。除了超級用戶root以外,其餘大量帳號只是用來維護系統運行服務進程,通常狀況是毫不容許登陸系統的,所以也被稱爲非登陸用戶帳號。shell
常見的非登陸用戶帳號的登陸shell一般是/sbin/nologin,表示禁止終端登陸,應確保不被認爲改動,好比:vim
[root@localhost ~]# grep "/sbin/nologin" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin ……………… //省略部份內容
各類非登陸用戶帳號中,還有至關一部分是不多用到的,好比games。這些用戶帳號被稱爲冗餘帳號(建議刪除)。除此以外,還有一些隨應用程序安裝的用戶帳號,若卸載應用程序後未能自動刪除,則需管理員手動將其刪除。安全
對於Linux服務器中長期不用的用戶帳號,若沒法肯定是否應該刪除,能夠暫時將其鎖定。好比:bash
[root@localhost ~]# usermod -L q1 //鎖定帳號 [root@localhost ~]# passwd -S q1 //查看帳號狀態 q1 LK 2019-08-27 0 99999 7 -1 (密碼已被鎖定。) [root@localhost ~]# usermod -U q1 //解鎖帳號 [root@localhost ~]# passwd -S q1 q1 PS 2019-08-27 0 99999 7 -1 (密碼已設置,使用 SHA512 算法。)
若是服務器中的用戶帳號已經固定,再也不進行修改,還能夠採起鎖定帳號配置文件的方法,進一步保障帳號的安全性。好比:服務器
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow //鎖定文件 [root@localhost ~]# lsattr /etc/passwd /etc/shadow //查看爲鎖定的狀態 ----i----------- /etc/passwd ----i----------- /etc/shadow [root@localhost ~]# chattr -i /etc/passwd /etc/shadow //解鎖文件 [root@localhost ~]# lsattr /etc/passwd /etc/shadow //查看爲解鎖的狀態 ---------------- /etc/passwd ---------------- /etc/shadow
在帳號文件被鎖定的狀況下,其內容將不容許被修改。所以也就沒法添加、刪除帳號,也不能更改用戶的密碼、登陸shell、宿主目錄等屬性信息。網絡
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow [root@localhost ~]# lsattr /etc/passwd /etc/shadow ----i----------- /etc/passwd ----i----------- /etc/shadow [root@localhost ~]# useradd a1 useradd:沒法打開 /etc/passwd
在不安全的網絡環境中,爲了下降密碼被猜出或被非法操做破解的風險,用戶應養成按期修改密碼的習慣,避免長期使用同一個密碼。管理員能夠在服務器端限制用戶密碼的最大有效天數,對於密碼已過時的用戶,登陸時被要求從新設置密碼,不然將拒絕登陸。ide
如下操做能夠將密碼的有效期設爲30天:
[root@localhost ~]# vim /etc/login.defs //適用於修改完文件新建的用戶 ……………… //省略部份內容 PASS_MAX_DAYS 30 //默認存在,修改便可 [root@localhost ~]# chage -M 30 q1 //適用於已經存在的q1用戶
在某些特殊狀況下,如要求批量建立用戶初次登陸時必須自設密碼。好比:
[root@localhost ~]# chage -d 0 q1 //新建的用戶、已存在的用戶都適用 Localhost login:q1 password: You are required to change your password immediately (root enforced) WARNING: Your password has expired. You must change your password now and login again! 更改用戶 q1 的密碼 。 爲 q1 更改 STRESS 密碼。 (當前)UNIX 密碼:
Shell環境的命令歷史機制爲用戶提供了極大的便利,但另外一方面也給用戶帶來了潛在的風險,只要得到用戶的命令歷史文件,該用戶的命令操做過程將會一覽無遺,若是曾經在命令行輸入了明文的密碼,則會給服務器帶來巨大的風險。
Bash終端環境中,歷史命令的記錄條目是由變量HISTSIZE控制,默認是1000條,經過修改其配置文件,能夠影響系統中的全部用戶。好比:
[root@localhost ~]# vim /etc/profile //適用於新登陸的用戶 ………… //省略部份內容,添加如下內容 HISTSIZE=200 [root@localhost ~]# export HISTSIZE=200 //適用於當前用戶,export的做用:將一個變量設置爲全局變量
除此以外,還能夠修改用戶宿主目錄中的~/.bash_logout文件,添加狀況歷史命令的操做語句:
[root@localhost ~]# vim ~/.bash_logout //打開配置文件,添加如下內容 history -c //清空歷史命令 clear //清屏
這樣,當用戶退出已登陸Bash環境後,所記錄的歷史命令將自動清空。
Bash終端環境中,還能夠設置一個閒置超時時間,當超過指定的時間見沒有任何輸入時自動註銷終端,這樣能夠有效避免當管理員不在時其餘人員對服務器的誤操做風險,閒置超時由變量TMOUT來控制,默認單位爲秒(s)。
[root@localhost ~]# vim /etc/profile //適用於新登陸的用戶 ………… //省略部份內容,添加如下內容 export TMOUT=600 [root@localhost ~]# export TMOUT=600 //適用於當前用戶
注意:當正在執行程序代碼編譯時,修改系統配置等耗時較長的操做時,應避免設置TMOUT變量。必要時可使用「unset TMOUT」命令取消TMOUT變量設置。
大多數Linux服務器並不建議用戶直接以root用戶進行登陸,一方面能夠大大減小因誤操做而致使的破壞;另外一方面也下降了特權密碼在不安全的網絡中被泄露的風險。針對這些緣由,須要爲普通用戶提供一種身份或權限提高機制,以便在必要的時候執行管理任務。
Linux系統爲咱們提供了su、sudo兩種命令,其中su命令主要用來切換用戶,而sudo命令用來提高執行權限。
使用su命令,能夠切換爲指定的另外一個用戶,從而具備該用戶的全部權限。固然,切換時須要對目標用戶的密碼進行驗證(從root用戶切換爲其餘用戶時除外)。例如:
[root@localhost ~]# su - xiaoli [xiaoli@localhost ~]$ su - root 密碼: //輸入用戶root密碼 [root@localhost ~]# //驗證成後得到root權限
上述命令中,選項「-」等同於「--login」或「-l」,表示切換用戶後進入目標用戶的登陸shell環境,若不添加「-」選項,則表示僅切換身份,不切換用戶環境。對於切換爲root用戶的狀況時,「root」能夠省略。
默認狀況下,任何用戶都容許使用su命令。從而有機會反覆嘗試其餘用戶(如root)的登陸密碼。這樣帶來了很大的安全風險,爲了增強su命令的使用控制,能夠藉助於pam_wheel認證模塊,只容許極個別用戶可使用su命令進行切換。實現過程:
[root@localhost ~]# gpasswd -a xiaoli wheel //正在將用戶「xiaoli」加入到「wheel」組中 [root@localhost ~]# grep "wheel" /etc/group wheel:x:10:xiaoli [root@localhost ~]# vim /etc/pam.d/su auth sufficient pam_rootok.so //默認存在 ………… //省略部份內容 auth required pam_wheel.so use_uid //默認存在,去掉「#」號便可! ………… //省略部份內容
啓用pam_wheel認證後,未加入wheel組內的其餘用戶將沒法使用su命令,嘗試進行切換時,將提示「拒絕權限」,從而將切換用戶的權限控制在最小範圍內。
[xiaozhang@localhost ~]$ su - root 密碼: //不論密碼正確與否,都將提示拒絕權限 su: 拒絕權限
對用戶的任何操做(添加、刪除、切換)等操做都將記錄在/var/log/secure 文件中,根據須要便可進行查看。
經過su命令能夠很是方便地切換到另外一個用戶,可是前提條件是必須知道目標用戶的登陸密碼(從root用戶切換爲其餘用戶時除外),從任意用戶切換至root用戶就必須得知道root用戶的密碼。對於生產環境中的Linux服務器,root用戶的密碼,知道的人,越少越好,不然就會存在巨大的風險。
有一種方法,既可讓普通用戶擁有一部分的管理權限,又不須要知道root用戶的密碼,那就是使用——sudo命令。
使用sudo命令皆能夠提高執行權限。不過,須要由管理員預先執行受權,指定哪些用戶以超級用戶(或其餘用戶)的身份來執行哪些命令。
sudo機制的配置文件爲/etc/sudoers,文件的默認權限是400,需使用專門的visudo工具進行編寫,雖然能夠經過「vim」進行編輯,可是保存時必須執行「:w!」命令強制操做,不然系統將提示只讀文件而拒絕保存。
配置文件/etc/sudoers中,受權記錄的基本配置格式:
用戶 主機名列表=命令程序列表
受權配置主要包括用戶、主機、命令三個部分,即受權哪些人在哪些主機上執行哪些命令。各部分的具體含義:
- 用戶:直接受權指定的用戶名,或者採用「%組名」的方式(受權一個組的全部用戶);
- 主機:使用此配置文件的主機名稱。此部分主要是方便在多個主機間共用一份sudoers文件,通常設置爲localhost或實際的主機名便可;
- 命令:容許受權的用戶經過sudo方式制定的特權命令,需填寫命令程序的完整路徑,多個命令執行用逗號「,」進行分隔;
典型的sudo配置記錄中,每行對應一個用戶或組的sudo受權配置。好比:
[root@localhost ~]# visudo ……………… //省略部份內容 xiaozhang localhost=/sbin/ifconfig //容許用戶xiaozhang在本機使用ifconfig命令 %wheel ALL=NOPASSWD:ALL //容許wheel組中的成員在任意主機上不須要使用密碼便可執行任意命令
當使用相同受權的用戶較多,或者受權的命令較多時,能夠採用集中定義的別名。用戶、主機、命令部分均可以定義爲別名(必須爲大寫)分別經過關鍵字User_Alias、Host_Alias、Cmnd_Alias來進行設置。好比:
[root@localhost ~]# visudo ……………… //省略部份內容 User_Alias OPERATORS=user1,user2,user3 //定義用戶名列表 Host_Alias MAILSVRS=smtp,pop //定義主機列表 Cmnd_Alias PKGTOOLS=/bin/rpm,/usr/bin/yum //定義命令列表 OPERATORS MAILSVRS=PKGTOOLS //使定義的列表所有關聯起來
sudo配置記錄的命令部分容許使用通配符「*」、取反符號「!」,當須要受權某個目錄下的全部命令或取消其中個別命令時特別有用。好比:
[root@localhost ~]# visudo ……………… //省略部份內容 xiaowang localhost=/bin/*,!/bin/passwd root //容許xiaowang用戶在本機使用/bin路徑下的全部命令,可是不容許給root用戶修改密碼
一般狀況下,經過sudo方式執行的操做並不記錄,若要啓用sudo日誌記錄以備查看,應該這麼作:
[root@localhost ~]# visudo ……………… //省略部份內容 Defaults logfile="/var/log/sudo"
對於已得到受權的用戶,經過sudo方式執行特權命令時,只需在正常的命令前加「sudo」便可!
[xiaosun@localhost ~]$ sudo ifconfig ens33 192.168.1.1/24 We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for xiaosun: xiaosun 不在 sudoers 文件中。此事將被報告。 //由於xiaosun沒得到特權命令的受權 [xiaozhang@localhost ~]$ ifconfig ens33 192.168.1.1/24 SIOCSIFADDR: 不容許的操做 SIOCSIFFLAGS: 不容許的操做 SIOCSIFNETMASK: 不容許的操做 [xiaozhang@localhost ~]$ sudo ifconfig ens33 192.168.1.1/24 We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for xiaozhang: //執行命令時須要輸入本身的密碼進行驗證(若是不但願輸入密碼應在命令前添加「NOPASSWD」) //xiaozhang 可使用特權命令(已經得到受權)
在當前會話中,第一次經過sudo執行命令時,必須知道用戶自己的密碼(並非root的密碼)進行驗證,此後再使用sudo命令時,只要與前一次sudo操做的間隔時間不超過5分鐘,則不須要重複驗證。
若想查看用戶本身得到哪些特權命令、環境變量,能夠執行「sudo -l」命令。
[xiaozhang@localhost ~]$ sudo -l [sudo] password for xiaozhang: 匹配此主機上 xiaozhang 的默認條目: !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin, logfile=/var/log/sudo 用戶 xiaozhang 能夠在該主機上運行如下命令: (root) /sbin/ifconfig //查看已經受權的用戶 [root@localhost ~]# su - xiaosun 上一次登陸:二 8月 27 21:41:40 CST 2019pts/0 上 [xiaosun@localhost ~]$ sudo -l [sudo] password for xiaosun: 對不起,用戶 xiaosun 不能在 localhost 上運行 sudo。 //查看爲受權的用戶
若是啓用sudo日誌,則能夠查看用戶sudo的操做記錄。
[root@localhost ~]# tail /var/log/sudo Aug 27 21:41:07 : xiaoli : TTY=pts/0 ; PWD=/home/xiaoli ; USER=root ; COMMAND=/sbin/ifconfig ens33 192.168.1.1/24 Aug 27 21:42:53 : xiaozhang : TTY=pts/0 ; PWD=/home/xiaozhang ; USER=root ; COMMAND=/sbin/ifconfig ens33 192.168.1.1/24
在互聯網環境中,大部分服務器是經過遠程登陸的方式來進行管理的,而本地引導和終端登陸每每容易被忽視,從而留下安全隱患。特別是當服務器所在的機房環境卻反嚴格、安全的管理制度時,如何防止其餘用戶的非法介入就成爲必須重視的問題。
對於服務器主機,除了物理上的安全防禦以外。在開關機安全控制方面,除了要作好物理安全防禦之外,還要作好系統自己的一些安全措施。
- 將第一引導設備設爲當前系統所在硬盤;
- 禁止從其餘設備(光盤、U盤、網絡)引導系統;
- 將安全級別設爲setup,並設置管理員密碼;
快捷鍵重啓功能爲服務器本地維護提供了方便,但對於多終端登陸的Linux服務器,禁用此功能是比較安全的選擇。操做以下:
[root@localhost ~]# cat /etc/inittab //查看提供ctrl+Alt+Del快捷鍵的文件 ……………… //省略部份內容 # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target [root@localhost ~]# ll /usr/lib/systemd/system/ctrl-alt-del.target lrwxrwxrwx. 1 root root 13 7月 14 18:54 /usr/lib/systemd/system/ctrl-alt-del.target -> reboot.target //查看得知它是reboot.target文件的軟鏈接
不影響reboot.target文件的前提下執行如下命令便可禁用ctrl+Alt+Del快捷鍵
[root@localhost ~]# systemctl mask ctrl-alt-del.target //註銷ctrl+Alt+Del服務 Created symlink from /etc/systemd/system/ctrl-alt-del.target to /dev/null. [root@localhost ~]# systemctl daemon-reload //從新加載systemd配置 [root@localhost ~]# systemctl unmask ctrl-alt-del.target //從新開啓ctrl+Alt+Del服務 Removed symlink /etc/systemd/system/ctrl-alt-del.target. [root@localhost ~]# systemctl daemon-reload //從新加載systemd配置
從系統安全的角度來看,若是人很都可以修改GRUB引導參數,對服務器自己顯然是一個極大的安全隱患。爲了增強對引導過程的安全控制,能夠爲GRUB菜單設置一個密碼,只有提供正確的密碼才被容許修改引導參數。
爲GRUB菜單設置的密碼建議採用「grub2-mkpasswd-pbkdf2 」命令生成。
爲GRUB菜單設置的密碼建議採用「grub2-mkpasswd-pbkdf2 」命令生成。
[root@localhost ~]# grub2-mkpasswd-pbkdf2 //根據提示輸入密碼 輸入口令: Reenter password: PBKDF2 hash of your password is //「is」以後是通過加密的密碼字串符(因爲限制,不可發佈) [root@localhost ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak [root@localhost ~]# cp /etc/grub.d/00_header /etc/grub.d/00_header.bak //建議作個備份(實驗環境,無所謂) [root@localhost ~]# vim /etc/grub.d/00_header //這是經過密鑰工具生成密碼的配置文件 …………………… //省略部份內容 cat << EOF set superusers="root" //設置用戶名 password_pbkdf2 root //填寫剛纔經過密鑰工具生成的密鑰文件(就是剛纔生成密鑰文件「is」以後的內容,因爲限制不可發佈) //設置用戶名的密碼 EOF [root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg //從新生成配置文件
從新計算機測試,按「e」鍵進入GRUB菜單時,將提示:
輸入正確的用戶名和密碼方可進入(實驗用的是 root,跟系統中的root沒有任何關係)!
在Linux系統中,login程序會讀取/etc/securetty文件,以決定root用戶從哪些終端上登陸系統。
[root@localhost ~]# vim /etc/securetty …………………… //省略部份內容 #tty5 #tty6 //禁止root用戶從tty五、tty6登陸系統
當服務器正在進行備份或調試等維護工做時,可能不但願再有新的用戶登陸系統,這時,只需創建/etc/nologin空文件便可;反之則容許普通用戶登陸。
[root@localhost ~]# touch /etc/nologin //禁止普通用戶登陸 [root@localhost ~]# rm -rf /etc/nologin //容許普通用戶登陸
注意:僅建議在服務器維護期間、測試期間使用!
本次實驗使用的安全工具是——John the Ripper和NMAP。
John the Ripper工具網盤連接:https://pan.baidu.com/s/1HQNCPFnKNBQWmjSNSEZ7_Q
提取碼:q1b0
NMAP工具使用yum安裝便可!
對於任何一個承擔着安全責任的管理員,及時找出這些弱口令是很是必要的,這樣便於採起進一步的安全措施(修改口令)。
John the Ripper是一款開源的密 碼 破 解 工具,可以在已知密文的狀況下快速分析出明文的密碼字串,支持DES、MD5等多種加密算法,並且容許使用字典進行破解。
[root@localhost ~]# tar zxf john-1.8.0.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/john-1.8.0/ [root@localhost john-1.8.0]# ls doc README run src //doc目錄是手冊文檔、README是連接的說明文件、run是運行程序、src是源碼文件 [root@localhost john-1.8.0]# cd src [root@localhost src]# make clean linux-x86-64 //經過這種方式進行編譯 [root@localhost src]# cd ../run [root@localhost run]# ls ascii.chr john lm_ascii.chr makechr relbench unique digits.chr john.conf mailer password.lst unafs unshadow //確認有john可執行程序產生
以實驗環境Linux系統爲例(若是檢測別的密文文件,能夠複製一份到本地):
[root@localhost run]# ./john /etc/shadow Loaded 6 password hashes with 6 different salts (crypt, generic crypt(3) [?/64]) Press 'q' or Ctrl-C to abort, almost any other key for status 123456 (user1) 123456 (xiaowang) 123456 (xiaosun) 123456 (xiaoli) 123456 (xiaozhang) ……………… 按Ctrl+C組合鍵終止後續過程 //密碼破譯須要時間,需耐心等待
[root@localhost run]# :>john.opt //狀況已破解的帳戶列表,以便從新分析、破解 [root@localhost run]# ./john --wordlist=./password.lst /etc/shadow //使用工具自己自帶的密碼字典進行破解 Loaded 6 password hashes with 6 different salts (crypt, generic crypt(3) [?/64]) Press 'q' or Ctrl-C to abort, almost any other key for status 123456 (user1) 123456 (xiaowang) 123456 (xiaosun) 123456 (xiaoli) 123456 (xiaozhang) ……………… 按Ctrl+C組合鍵終止後續過程
[root@localhost ~]# yum -y install nmap
nmap [掃描類型] [選項] <掃描目標 ...>
經常使用的選項有:
「-p」用來指定掃描的端口信息;
「-n」表示禁用反向DNS解析(加快掃描速度);
經常使用的幾種掃描類型,如圖:
[root@localhost ~]# nmap 127.0.0.1 //掃描本機開啓的TCP端口 [root@localhost ~]# nmap -sU 127.0.0.1 //掃描本機開啓的UDP端口 [root@localhost ~]# nmap -p 21 192.168.1.0/24 //掃描192.168.1.0網段中哪些主機提供了FTP服務 [root@localhost ~]# nmap -n -sP 192.168.1.0/24 //掃描192.168.1.0網段存活的主機(能夠ping通) [root@localhost ~]# nmap -p 139,445 192.168.1.0/24 //掃描192.168.1.0網段中開啓共享服務的主機
能夠根據實際的需求更換不一樣的選項!
———————— 本文至此結束,感謝閱讀 ————————