天天看點

Linux系統安全及應用

    作為一個開放源代碼的作業系統,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 -&gt; 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># :&gt; 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,如需轉載請自行聯系原作者

繼續閱讀