作為一個開放源代碼的作業系統,Linux伺服器以其安全、高效和穩定的顯著優勢而得以廣泛應用。下面主要從賬戶安全、系統引導、登入控制的角度,優化Linux系統的安全性
賬号安全控制
使用者賬号,是計算機使用者的身份憑證,每個通路系統資源的人,必須要有賬号才能登入計算機,在Linux中,提供了多種機制來確定使用者賬号的安全使用
1. 基本安全措施
(1)系統賬号清理、鎖定
在Linux系統中,除了使用者手動建立的各種賬号外,還包括随系統或程式安裝過程中生成的大量其他賬号,用來維護系統運作、啟動或保持服務程序,一般不允許登陸,稱為非登入使用者。為了保持系統安全,這些使用者的登陸shell通常是/sbin/nologin,表示禁止終端登入,應確定不被人為改動
1
2
3
4
5
6
7
<code>[root@localhost ~]</code><code># grep "/sbin/nologin$" /etc/passwd </code>
<code>bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>
<code>daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>
<code>adm:x:3:4:adm:</code><code>/var/adm</code><code>:</code><code>/sbin/nologin</code>
<code>lp:x:4:7:lp:</code><code>/var/spool/lpd</code><code>:</code><code>/sbin/nologin</code>
<code>mail:x:8:12:mail:</code><code>/var/spool/mail</code><code>:</code><code>/sbin/nologin</code>
<code>…… </code><code>//</code><code>省略部分内容</code>
各種非登入使用者中,有一些很少用到,如news、uucp、games、gopher。可使用備援賬戶,直接删除即可,還有一些随着應用程式的解除安裝未能自動删除,則需要管理者手動清除
<code>[root@localhost ~]</code><code># userdel uucp</code>
<code>[root@localhost ~]</code><code># userdel games</code>
<code>[root@localhost ~]</code><code># userdel gopher</code>
對于一些長期不用的賬号,若無法确定是否删除,應暫時鎖定(用usermod、passwd指令都可以鎖定、解鎖賬号)
8
9
10
11
12
<code>[root@localhost ~]</code><code># usermod -L ysf //鎖定賬号</code>
<code>[root@localhost ~]</code><code># passwd -S ysf //檢視賬号狀态</code>
<code>ysf LK 2017-12-22 0 99999 7 -1 (密碼已被鎖定。)</code>
<code>[root@localhost ~]</code><code># usermod -U ysf //解鎖賬号</code>
<code>[root@localhost ~]</code><code># passwd -S ysf</code>
<code>ysf PS 2017-12-22 0 99999 7 -1 (密碼已設定,使用 SHA512 加密。)</code>
<code>[root@localhost ~]</code><code># passwd -l ysf</code>
<code>鎖定使用者 ysf 的密碼 。</code>
<code>passwd</code><code>: 操作成功</code>
<code>[root@localhost ~]</code><code># passwd -u ysf</code>
<code>解鎖使用者 ysf 的密碼 。</code>
如果伺服器中的賬号已經固定,不進行更改,可以采用鎖定賬号配置檔案的方法。使用chattr指令鎖定、解鎖檔案,使用lsattr檢視檔案鎖定情況
<code>[root@localhost ~]</code><code># chattr +i /etc/passwd /etc/shadow //+i,鎖定檔案</code>
<code>[root@localhost ~]</code><code># lsattr /etc/passwd /etc/shadow //檢視檔案鎖定情況</code>
<code>----i--------e- </code><code>/etc/passwd</code>
<code>----i--------e- </code><code>/etc/shadow</code>
<code>[root@localhost ~]</code><code># useradd yangshufan //檔案鎖定,無法添加、删除使用者,也不能更改使用者的密碼、登陸shell、宿主目錄等屬性</code>
<code>useradd</code><code>: cannot </code><code>open</code> <code>/etc/passwd</code>
<code>[root@localhost ~]</code><code># chattr -i /etc/passwd /etc/shadow //-i,解鎖檔案</code>
<code>[root@localhost ~]</code><code># useradd yangshufan //正常建立使用者</code>
<code>[root@localhost ~]</code><code>#</code>
(2)密碼安全控制
為了降低密碼被猜出或暴力破解的風險,應避免長期使用同一個密碼。管理者可以在伺服器端限制使用者密碼使用最大有效期天數,對密碼已過期的使用者,登入時要求重新設定密碼,否則拒絕登入
<code>[root@localhost ~]</code><code># vim /etc/login.defs //适應于建立的使用者</code>
<code>PASS_MAX_DAYS 30 </code><code>//</code><code>密碼最多使用30天,必須更改密碼</code>
<code>PASS_MIN_DAYS 0 </code><code>//</code><code>密碼最少使用0天,才能更改密碼</code>
<code>PASS_MIN_LEN 5 </code><code>//</code><code>可接受的密碼長度 </code>
<code>PASS_WARN_AGE 7 </code><code>//</code><code>密碼到期前的警告時間</code>
<code>[root@localhost ~]</code><code># chage -M 30 ysf //适用于以存在的使用者,密碼30天過期</code>
<code>[root@localhost ~]</code><code># chage -d 0 yangshufan //下次登入時,必須更改密碼</code>
(3)指令曆史、自動登出
shell環境下,指令曆史機制為使用者提供了極大的便利,也帶來了一些潛在的風險。隻有獲得使用者的指令曆史記錄,該使用者的指令操作将一覽無餘,伺服器的安全将受到威脅。曆史指令記錄條數有變量HISTSIZE控制,預設1000條,可修改配置檔案,影響系統中的所有使用者。
<code>[root@localhost ~]</code><code># vim /etc/profile //适用于新登入使用者</code>
<code>HISTSIZE=100</code>
<code>[root@localhost ~]</code><code># HISTSIZE=5 //适用于目前使用者</code>
<code>[root@localhost ~]</code><code># history </code>
<code> </code><code>96 chage -d 0 yangshufan</code>
<code> </code><code>97 vim </code><code>/etc/profile</code>
<code> </code><code>98 </code><code>export</code> <code>HISTSIZE=100</code>
<code> </code><code>99 </code><code>export</code> <code>HISTSIZE=5</code>
<code> </code><code>100 </code><code>history</code>
<code>[root@localhost ~]</code><code># vim ~/.bash_logout //添加以下語句,使用者登出bash時,自動清空曆史指令</code>
<code>history</code> <code>-c</code>
<code>clear</code>
bash終端環境中,可設定一個閑置逾時時間,當超過指定的時間沒有任何輸入時,自動登出終端。由變量TMOUT控制,預設機關
<code>[root@localhost ~]</code><code># vim /etc/profile //适用于新登入使用者</code>
<code>export</code> <code>TMOUT=600</code>
<code>[root@localhost ~]</code><code># TMOUT=600 //适用于目前使用者</code>
<code>[root@localhost ~]</code><code># unset TMOUT //如果進行耗時較長的操作,避免打擾,可取消TMOUT變量</code>
2. 使用者切換與提權
一般情況下,不建議直接使用root使用者登入,一是減少因操作失誤而造成的破壞;二是降低特權密碼被洩露的風險。鑒于這些原因,需要為普通使用者提供一種身份切換或權限提升機制,以進行管理任務
(1)su指令——切換使用者
使用su指令,可以切換一個指定的使用者,擁有該使用者的所有權限
<code>[root@localhost ~]</code><code># su - ysf //root切換為普通使用者,不需要密碼驗證</code>
<code>[ysf@localhost ~]$ </code><code>su</code> <code>- </code><code>//</code><code>普通使用者切換為root,需要驗證,root可省略</code>
<code>密碼:</code>
預設所有使用者允許使用su指令,進而有機會反複嘗試其他使用者(root)的登陸密碼,帶來安全風險。可以使用pam_wheel認證子產品,隻允許極個别使用者使用su指令進行切換
13
14
15
16
<code>[root@localhost ~]</code><code># vim /etc/pam.d/su</code>
<code>auth required pam_wheel.so use_uid </code><code>//</code><code>這行去掉注釋 </code><code># </code>
<code>[root@localhost ~]</code><code># su - ysf</code>
<code>[ysf@localhost ~]$ </code><code>su</code> <code>- root </code><code>//</code><code>再次嘗試切換,就會提示密碼錯誤</code>
<code>su</code><code>: 密碼不正确</code>
<code>[ysf@localhost ~]$ </code><code>exit</code>
<code>logout</code>
<code>[root@localhost ~]</code><code># gpasswd -a ysf wheel //添加授權使用者到wheel組</code>
<code>Adding user ysf to group wheel</code>
<code>[root@localhost ~]</code><code># grep wheel /etc/group //檢視wheel組成員</code>
<code>wheel:x:10:ysf</code>
<code>[root@localhost ~]</code><code># su - ysf </code>
<code>[ysf@localhost ~]$ </code><code>su</code> <code>- </code><code>//</code><code>再次嘗試切換,切換成功</code>
(2)sudo指令——提升執行權限
使用su指令雖然可以切換為root使用者,但必須知道root密碼要知道每多一個人知道特權密碼,就多一份風險。而sudo指令可以讓普通使用者擁有一部分root使用者才能執行的指令,有不用知道特權密碼
1)修改配置檔案/etc/sudoers
<code>[root@localhost ~]</code><code># visudo //也可使用vi進行編輯,但儲存是必須執行“:w!”強制執行</code>
<code>%wheel ALL=(ALL) NOPASSWD: ALL </code><code>//wheel</code><code>組的使用者不需要密碼驗證</code>
<code>yangshufan localhost=</code><code>/sbin/ifconfig</code> <code>//yangshufan</code><code>能在主機localhost上執行</code><code>ifconfig</code><code>指令修改IP位址</code>
<code>User_Alias USER=ysf,yang</code>
<code>Host_Alias HOST=win,www</code>
<code>Cmnd_Alias CMND=</code><code>/bin/rpm</code><code>,</code><code>/usr/bin/yum</code>
<code>USER HOST=CMND </code><code>//</code><code>這四行表示允許使用者ysf,yang在主機win,www上執行rpm,yum指令</code>
<code>yang localhost=</code><code>/sbin/</code><code>*,!</code><code>/sbin/ifconfig</code> <code>//yang</code><code>可以執行在</code><code>/sbin</code><code>目錄下除了</code><code>ifconfig</code><code>外所有的指令程式</code>
<code>Defaults logfile=</code><code>"/var/log/sudo"</code> <code>//</code><code>啟用</code><code>sudo</code><code>日志記錄以備管理者檢視</code>
2)通過sudo執行特權指令
17
18
19
<code>[yangshufan@localhost ~]$ </code><code>ifconfig</code> <code>eth0:0 10.0.0.1</code><code>/8</code> <code>//</code><code>未用</code><code>sudo</code><code>指令</code>
<code>SIOCSIFADDR: 權限不夠</code>
<code>SIOCSIFFLAGS: 權限不夠</code>
<code>[yangshufan@localhost ~]$ </code><code>sudo</code> <code>ifconfig</code> <code>eth0:0 10.0.0.1</code><code>/8</code> <code>//</code><code>使用</code><code>sudo</code><code>指令</code>
<code>[</code><code>sudo</code><code>] password </code><code>for</code> <code>yangshufan: </code><code>//</code><code>驗證密碼</code>
<code>[yangshufan@localhost ~]$ </code><code>ifconfig</code> <code>eth0:0 </code><code>//</code><code>檢視指令,執行成功</code>
<code>eth0:0 Link encap:Ethernet HWaddr 00:0C:29:1C:B4:FB </code>
<code> </code><code>inet addr:10.0.0.1 Bcast:10.255.255.255 Mask:255.0.0.0</code>
<code> </code><code>UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1</code>
<code>[yangshufan@localhost ~]$ </code><code>sudo</code> <code>-l </code><code>//</code><code>檢視獲得哪些</code><code>sudo</code><code>授權</code>
<code>[</code><code>sudo</code><code>] password </code><code>for</code> <code>yangshufan: </code>
<code>使用者 yangshufan 可以在該主機上運作以下指令:</code>
<code> </code><code>(root) </code><code>/sbin/ifconfig</code>
<code> </code>
<code>[root@localhost ~]</code><code># tail /var/log/sudo //可以看到使用者的sudo操作記錄</code>
<code>Dec 27 07:49:35 : yangshufan : TTY=pts</code><code>/0</code> <code>; PWD=</code><code>/home/yangshufan</code> <code>; USER=root ;</code>
<code> </code><code>COMMAND=</code><code>/sbin/ifconfig</code> <code>eth0:0 10.0.0.1</code><code>/8</code>
系統引導和登入控制
現在,大部分伺服器是通過遠端登入的方式來進行管理的,本地引導和終端登入過程往往被忽視,進而留下安全隐患。
1. 開關機安全控制
對于伺服器主機,其實體安全是非常重要的,除了要保持機箱完好、機櫃鎖閉、嚴格控制機房人員進出、硬體裝置現場接觸等,在開關機方面,還要做好系統本身的安全措施
(1)調整BIOS引導設定
* 将第一優先引導裝置設為目前系統所在磁盤
* 禁止從其他裝置引導系統,對應的項為Disabled
* 将BIOS安全級别改為setup,并設好管理密碼,以防止未授權修改
(2)禁止Ctrl+Alt+Del快捷鍵重新開機
<code>[root@localhost ~]</code><code># vim /etc/init/control-alt-delete.conf </code>
<code>#exec /sbin/shutdown -r now "Control-Alt-Delete pressed" //加#,注釋資訊</code>
<code>[root@localhost ~]</code><code># reboot //重新開機生效</code>
(3)限制更改GRUB引導參數
通過修改GRUB引導參數進入單使用者模式,不需要密碼就可以進入系統,而且還用于root權限,隻應在緊急情況下使用。從系統安全角度來看,如果任何人都能修改GRUB引導參數,對伺服器來說是個極大地威脅。是以需要為GRUB菜單設定一個密碼,隻有提供正确的密碼才被允許修改引導參數。
<code>[root@localhost ~]</code><code># grub-md5-crypt //經過MD5算法加密的字元串,安全性更好</code>
<code>Password: </code>
<code>Retype password: </code>
<code>$1$vkPke/$TRfLUURiy7XMKa13XgvIH1 </code><code>//</code><code>經過加密的密碼字元串</code>
<code>[root@localhost ~]</code><code># vim /boot/grub/grub.conf </code>
<code>password --md5 $1$vkPke/$TRfLUURiy7XMKa13XgvIH1 </code><code>//</code><code>複制密碼,添加到第一個title之前就可以了</code>
再次修改GRUB菜單時,必須輸入正确的GRUB密碼,如下圖所示
2. 終端及登入控制
在Linux中,預設開啟了留個tty終端,允許任何使用者進行本地登入,可從以下方面限制本地登入:
(1)減少開放的tty終端個數
對于遠端維護的Linux伺服器,六個tty終端有些多餘
<code>/etc/init/tty</code><code>.conf </code><code>//</code><code>控制</code><code>tty</code><code>終端的開啟</code>
<code>/etc/init/start-ttys</code><code>.conf </code><code>//</code><code>控制</code><code>tty</code><code>終端的開啟數量、裝置檔案</code>
<code>/etc/sysconfig/init</code> <code>//</code><code>控制</code><code>tty</code><code>終端的開啟數量、終端顔色</code>
<code>[root@localhost ~]</code><code># vim /etc/init/start-ttys.conf </code>
<code>env</code> <code>ACTIVE_CONSOLES=</code><code>/dev/tty</code><code>[1-3] </code><code>//</code><code>修改為1-3</code>
<code>[root@localhost ~]</code><code># vim /etc/sysconfig/init </code>
<code>ACTIVE_CONSOLES=</code><code>/dev/tty</code><code>[1-3] </code><code>//</code><code>修改為1-3</code>
<code>[root@localhost ~]</code><code># reboot</code>
重新開機後,将無法切換到tty4、tty5、tty6
(2)禁止root使用者登入
在Linux系統中,login程式會讀取/etc/securetty檔案,以決定允許root使用者從哪些終端登入。若要禁止root使用者從指定的終端登入,隻需注釋或删除對應的行即可
<code>[root@localhost ~]</code><code># vim /etc/securetty </code>
<code>#tty1</code>
<code>#tty2</code>
(3)禁止普通使用者登入
當伺服器在維護時,不希望普通使用者登入系統,隻需建立/etc/nologin檔案即可。當login程式檢測到/etc/nologin檔案存在時,将拒絕普通使用者登入系統(root除外)
<code>[root@localhost ~]</code><code># touch /etc/nologin</code>
當收到删除/etc/nologin檔案或重新開機主機後,即可恢複正常
弱密碼檢測、端口掃描
1. 弱密碼檢測——John the Ripper
過于簡單的密碼是伺服器面臨的最大風險,盡管大家知道設定一個更長、更複雜的密碼會更安全,但總有人貪圖友善而采用簡單、易記的密碼。對于任何一個承擔着安全責任的管理者,及時找出這些弱密碼賬戶是非常重要的,這樣更容易采取安全措施(如提醒重設更安全的密碼)
John the Ripper是一款開源的密碼破解工具,能在已知密文的情況下,快速分析明文的密碼字串,支援DES、MD5等多種加密算法,允許使用密碼字典進行暴力破解。通過John the Ripper,可以檢測Linux/UNIX系統使用者的密碼強度
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<code>[root@localhost ~]</code><code># tar zxf john-1.8.0.tar.gz</code>
<code>[root@localhost ~]</code><code># cd john-1.8.0</code>
<code>[root@localhost john-1.8.0]</code><code># ls -ld *</code>
<code>drwxr-xr-x. 2 root root 4096 12月 27 09:45 doc </code><code>//</code><code>手冊文檔</code>
<code>lrwxrwxrwx. 1 root root 10 12月 27 09:45 README -> doc</code><code>/README</code> <code>//</code><code>連結檔案</code>
<code>drwxr-xr-x. 2 root root 4096 12月 27 09:45 run </code><code>//</code><code>運作程式</code>
<code>drwxr-xr-x. 2 root root 4096 12月 27 09:45 src </code><code>//</code><code>源碼檔案</code>
<code>[root@localhost john-1.8.0]</code><code># cd src/</code>
<code>[root@localhost src]</code><code># make clean linux-x86-64 //切換到src目錄下,編譯</code>
<code>…… </code><code>//</code><code>省略編譯資訊</code>
<code>[root@localhost src]</code><code># ls ../run/john //run子目錄生成john可執行程式</code>
<code>..</code><code>/run/john</code>
<code>[root@localhost src]</code><code># cp /etc/shadow /etc/shadow.txt //準備待破解的密碼檔案</code>
<code>[root@localhost src]</code><code># cd ../run</code>
<code>[root@localhost run]</code><code># ./john /etc/shadow.txt //執行暴力破解,破解後資訊儲存到john.pot檔案</code>
<code>Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?</code><code>/64</code><code>])</code>
<code>Press </code><code>'q'</code> <code>or Ctrl-C to abort, almost any other key </code><code>for</code> <code>status</code>
<code>ysf (ysf)</code>
<code>123 (yangshufan)</code>
<code>…… </code><code>//</code><code>按Ctrl+C,終止後續過程</code>
<code>[root@localhost run]</code><code># ./john --show /etc/shadow.txt //可通過--show選項,檢視已破解的賬戶清單</code>
<code>ysf:ysf:17527:0:30:7:::</code>
<code>yangshufan:123:17527:0:99999:7:::</code>
<code>2 password hashes cracked, 1 left</code>
<code>[root@localhost run]</code><code># :> john.pot //清空以破解的賬戶清單,以便使用密碼字典重新破解</code>
<code>[root@localhost run]</code><code># ./john --wordlist=./password.lst /etc/shadow.txt //提供預設的密碼字典password.lst,可往裡添加更多密碼組合</code>
<code>1g 0:00:00:18 100% 0.05467g</code><code>/s</code> <code>193.8p</code><code>/s</code> <code>393.0c</code><code>/s</code> <code>393.0C</code><code>/s</code> <code>!@</code><code>#$%..sss</code>
<code>Use the </code><code>"--show"</code> <code>option to display all of the cracked passwords reliably</code>
<code>Session completed</code>
從上可看出,由于密碼字典的密碼組合較少,僅破解出一個其中密碼。也不難看出像這類密碼有多麼脆弱了
2. 網絡掃描——NMAP
NMAP是一款強大的端口掃描類安全評測工具,支援ping掃描、多端口檢測、OS識别等多種技術。使用NMAP定期掃描内部網絡,可以找出網絡中不可控的應用服務,及時關閉不安全的服務,較少安全風險
<code>[root@localhost ~]</code><code># mount /dev/cdrom /media/</code>
<code>mount</code><code>: block device </code><code>/dev/sr0</code> <code>is write-protected, mounting </code><code>read</code><code>-only</code>
<code>[root@localhost ~]</code><code># rpm -ivh /media/Packages/nmap-5.51-3.el6.x86_64.rpm</code>
NMAP的掃描程式位于/usr/bin/nmap目錄下,指令基本格式如下:
nmap [掃描類型] [選項] [掃描目标...]
其中:
掃描目标:可以是主機名、IP位址、網絡位址等,多個目标以空格分隔
選項:-p指定掃描的端口;-n禁用反向解析(加快掃描)
常用的掃描類型如下
-sS:TCP SYN掃描(半開掃描),隻向目标發送SYN資料包,如果收到SYN/ACK響應就認為目标正在監聽,并立即斷開連接配接;否則就認為目标端口未開放
-sT:TCP連接配接掃描,完整的TCP掃描方式,如果成功連接配接就認為目标端口正在監聽;否則就認為目标端口未開放
-sF:TCP FIN掃描,開放的端口會忽略,關閉的端口會回應RST資料包。這種方式掃描可間接檢測防火牆的健壯性
-sU:UDP掃描,探測目标主機提供哪些UDP服務,UDP掃描會比較慢
-sP:ICMP掃描,快速判斷目标主機是否存活,不做其他掃描
-s0:跳過ping檢測,當對方不響應ICMP請求時,使用這種方式可避免因無法ping通而放棄掃描
<code>[root@localhost ~]</code><code># nmap 127.0.0.1 //掃描常用的TCP端口</code>
<code>Not shown: 995 closed ports</code>
<code>PORT STATE SERVICE</code>
<code>22</code><code>/tcp</code> <code>open</code> <code>ssh</code>
<code>25</code><code>/tcp</code> <code>open</code> <code>smtp</code>
<code>111</code><code>/tcp</code> <code>open</code> <code>rpcbind</code>
<code>631</code><code>/tcp</code> <code>open</code> <code>ipp</code>
<code>3306</code><code>/tcp</code> <code>open</code> <code>mysql</code>
<code>[root@localhost ~]</code><code># nmap -sU 127.0.0.1 //掃描常用的UDP端口</code>
<code>PORT STATE SERVICE</code>
<code>111</code><code>/udp</code> <code>open</code> <code>rpcbind</code>
<code>631</code><code>/udp</code> <code>open</code><code>|filtered ipp</code>
<code>[root@localhost ~]</code><code># nmap -p 21 192.168.1.0/24 //檢測192.168.1.0/24網段有哪些主機提供FTP服務</code>
<code>[root@localhost ~]</code><code># nmap -n -sP 192.168.1.0/24 //檢測192.168.1.0/24網段有哪些主機存活(能ping通)</code>
<code>[root@localhost ~]</code><code># nmap -p 139,445 192.168.4.10-20 //檢測192.168.10-20的主機是否開啟檔案共享服務</code>
本文轉自 楊書凡 51CTO部落格,原文連結:http://blog.51cto.com/yangshufan/2054982,如需轉載請自行聯系原作者