保證Linux系統安全的必要措施

作爲一種開放源代碼的操作系統,Linux服務器以其安全、高效和穩定的顯著優勢而得以廣泛的應用。隨着而來的就是——Linux系統的安全問題

本篇博客主要圍繞Linux系統的安全問題:
一、賬號安全控制;
二、系統引導和登錄控制;
三、弱口令檢測、端口掃描。

一、賬號安全控制

用戶賬號是計算機使用者的身份憑證或標識,每個要訪問系統資源的人,必須憑藉其用戶賬號才能進入計算機。在Linux系統中,提供了多種機制來確保用戶賬號的正當、安全地使用。

1.基本(必要)的安全措施

(1)系統賬號的清理

在Linux系統中,除了用戶手動創建的各種賬號之外,還包括隨系統或程序安裝過程而產生的其他大量的系統賬號。除了超級用戶root之外,其他大量賬號只是用來維護系統運行服務進程,一般情況是絕不允許登錄系統的,因此也被稱爲非登錄用戶賬號

常見的非登錄用戶賬號的登錄shell通常是/sbin/nologin,表示禁止終端登錄,應確保不被認爲改動,比如:

[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服務器中長期不用的用戶賬號,若無法確定是否應該刪除,可以暫時將其鎖定。比如:

[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

(2)密碼安全控制

在不安全的網絡環境中,爲了降低密碼被猜出或被暴力破解的風險,用戶應養成定期修改密碼的習慣,避免長期使用同一個密碼。管理員可以在服務器端限制用戶密碼的最大有效天數,對於密碼已過期的用戶,登錄時被要求重新設置密碼,否則將拒絕登錄。

以下操作可以將密碼的有效期設爲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 密碼:

(3)命令歷史、自動註銷

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變量設置。

2.用戶切換與提權

大多數Linux服務器並不建議用戶直接以root用戶進行登錄,一方面可以大大減少因誤操作而導致的破壞;另一方面也降低了特權密碼在不安全的網絡中被泄露的風險。針對這些原因,需要爲普通用戶提供一種身份或權限提升機制,以便在必要的時候執行管理任務。

Linux系統爲我們提供了su、sudo兩種命令,其中su命令主要用來切換用戶,而sudo命令用來提升執行權限。

(1)su命令——切換用戶

使用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 文件中,根據需要即可進行查看。

(2)sudo命令——提升執行權限

通過su命令可以非常方便地切換到另一個用戶,但是前提條件是必須知道目標用戶的登錄密碼(從root用戶切換爲其他用戶時除外),從任意用戶切換至root用戶就必須得知道root用戶的密碼。對於生產環境中的Linux服務器,root用戶的密碼,知道的人,越少越好,否則就會存在巨大的風險。

有一種方法,既可以讓普通用戶擁有一部分的管理權限,又不需要知道root用戶的密碼,那就是使用——sudo命令。

使用sudo命令皆可以提升執行權限。不過,需要由管理員預先執行授權,指定哪些用戶以超級用戶(或其他用戶)的身份來執行哪些命令。

1)在配置文件/etc/sudoers中添加授權

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"
2)通過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

二、系統引導和登錄控制

在互聯網環境中,大部分服務器是通過遠程登錄的方式來進行管理的,而本地引導和終端登錄往往容易被忽視,從而留下安全隱患。特別是當服務器所在的機房環境卻反嚴格、安全的管理制度時,如何防止其他用戶的非法介入就成爲必須重視的問題。

1.開關機安全控制

對於服務器主機,除了物理上的安全防護之外。在開關機安全控制方面,除了要做好物理安全防護以外,還要做好系統本身的一些安全措施。

(1)調整BIOS引導設置

  • 將第一引導設備設爲當前系統所在硬盤;
  • 禁止從其他設備(光盤、U盤、網絡)引導系統;
  • 將安全級別設爲setup,並設置管理員密碼;

(2)禁止ctrl+Alt+Del快捷鍵重啓

快捷鍵重啓功能爲服務器本地維護提供了方便,但對於多終端登錄的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配置  

(3)限制更改GRUB引導參數

從系統安全的角度來看,如果人很都能夠修改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菜單時,將提示:
保證Linux系統安全的必要措施
輸入正確的用戶名和密碼方可進入(實驗用的是 root,跟系統中的root沒有任何關係)!

2.終端及登錄控制

(1)限制root用戶的登錄

在Linux系統中,login程序會讀取/etc/securetty文件,以決定root用戶從哪些終端上登錄系統。

[root@localhost ~]# vim /etc/securetty 
                   ……………………                  //省略部分內容
#tty5
#tty6
//禁止root用戶從tty5、tty6登錄系統

(2)禁止普通用戶登錄

當服務器正在進行備份或調試等維護工作時,可能不希望再有新的用戶登錄系統,這時,只需建立/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安裝即可!

1.弱口令檢測工具——John the Ripper

對於任何一個承擔着安全責任的管理員,及時找出這些弱口令是非常必要的,這樣便於採取進一步的安全措施(修改口令)。

John the Ripper是一款開源的密 碼 破 解 工具,能夠在已知密文的情況下快速分析出明文的密碼字串,支持DES、MD5等多種加密算法,而且允許使用字典進行破解。

(1)安裝John the Ripper

[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可執行程序產生

(2)檢測弱口令賬號

以實驗環境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組合鍵終止後續過程
//密碼破譯需要時間,需耐心等待

(3)使用密碼字典進行破解

[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組合鍵終止後續過程

2.網絡掃描工具——NMAP

(1)安裝NMAP軟件包

[root@localhost ~]# yum -y install nmap

(2)掃描語法及類型

nmap  [掃描類型]  [選項]  <掃描目標 ...>

常用的選項有:
“-p”用來指定掃描的端口信息;
“-n”表示禁用反向DNS解析(加快掃描速度);

常用的幾種掃描類型,如圖:
保證Linux系統安全的必要措施

(3)掃描操作示例

[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網段中開啓共享服務的主機

可以根據實際的需求更換不同的選項!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章