天天看點

安全運維之:Linux系統賬戶和登入安全

一、合理使用Shell曆史指令記錄功能

在Linux下可通過history指令檢視使用者所有的曆史操作記錄,同時shell指令操作記錄預設儲存在使用者目錄下的.bash_history檔案中,通過這個檔案可以查詢shell指令的執行曆史,有助于運維人員進行系統審計和問題排查,同時,在伺服器遭受黑客攻擊後,也可以通過這個指令或檔案查詢黑客登入伺服器所執行的曆史指令操作,但是有時候黑客在入侵伺服器後為了毀滅痕迹,可能會删除.bash_history檔案,這就需要合理的保護或備份.bash_history檔案。下面介紹下history日志檔案的安全配置方法。

預設的history指令隻能檢視使用者曆史操作記錄,并不能區分每個使用者操作指令的時間,這點對于排查問題十分不便,不過可以通過下面的方法(加入四行内容)讓history指令自動記錄所有shell指令的執行時間,編輯/etc/bashrc檔案:

1

2

3

4

<code>HISTFILESIZE=4000</code>

<code>HISTSIZE=4000</code>

<code>HISTTIMEFORMAT=</code><code>'%F %T'</code>

<code>export</code> <code>HISTTIMEFORMAT</code>

其中,HISTFILESIZE定義了在.bash_history檔案中儲存指令的記錄總數,預設值是1000,這裡設定為4000;HISTSIZE定義了history指令輸出的記錄總數;HISTTIMEFORMAT定義時間顯示格式,這裡的格式與date指令後的“+"%F %T"”是一緻的;HISTTIMEFORMAT作為history的時間變量将值傳遞給history指令。

通過這樣的設定後,執行history指令,就會顯示每個曆史指令的詳細執行時間,例如:

5

6

7

8

9

10

11

<code>[root@server ~]</code><code># history</code>

<code>247  2013-10-05 17:16:28 </code><code>vi</code> <code>/etc/bashrc</code> 

<code>248  2013-10-05 17:16:28 </code><code>top</code>

<code>249  2013-10-05 17:04:18 vmstat</code>

<code>250  2013-10-05 17:04:24 </code><code>ps</code> <code>-ef</code>

<code>251  2013-10-05 17:16:29 </code><code>ls</code> <code>-al</code>

<code>252  2013-10-05 17:16:32 lsattr </code>

<code>253  2013-10-05 17:17:16 </code><code>vi</code> <code>/etc/profile</code>

<code>254  2013-10-05 17:19:32 </code><code>date</code> <code>+</code><code>"%F %T"</code>

<code>255  2013-10-05 17:21:06 </code><code>lsof</code>

<code>256  2013-10-05 17:21:21 </code><code>history</code>

為了確定伺服器的安全,保留shell指令的執行曆史是非常有用的一條技巧。shell雖然有曆史功能,但是這個功能并非針對審計目的而設計,是以很容易被黑客篡改或是丢失。下面再介紹一種方法,可以實作詳細記錄登入過系統的使用者、IP位址、shell指令以及詳細操作時間等,并将這些資訊以檔案的形式儲存在一個安全的地方,以供系統審計和故障排查。

将下面這段代碼添加到/etc/profile檔案中,即可實作上述功能。

12

13

14

15

16

17

18

19

20

21

22

<code>#history</code>

<code>USER_IP=`</code><code>who</code> <code>-u am i 2&gt;</code><code>/dev/null</code><code>| </code><code>awk</code> <code>'{print $NF}'</code><code>|</code><code>sed</code> <code>-e </code><code>'s/[()]//g'</code><code>`</code>

<code>HISTDIR=</code><code>/usr/share/</code><code>.</code><code>history</code>

<code>if</code> <code>[ -z $USER_IP ]</code>

<code>then</code>

<code>USER_IP=`</code><code>hostname</code><code>`</code>

<code>fi</code>

<code>if</code> <code>[ ! -d $HISTDIR ]</code>

<code>mkdir</code> <code>-p $HISTDIR</code>

<code>chmod</code> <code>777 $HISTDIR</code>

<code>if</code> <code>[ ! -d $HISTDIR/${LOGNAME} ]</code>

<code>mkdir</code> <code>-p $HISTDIR/${LOGNAME}</code>

<code>chmod</code> <code>300 $HISTDIR/${LOGNAME}</code>

<code>export</code> <code>HISTSIZE=4000</code>

<code>DT=`</code><code>date</code> <code>+%Y%m%d_%H%M%S`</code>

<code>export</code> <code>HISTFILE=</code><code>"$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT"</code>

<code>export</code> <code>HISTTIMEFORMAT=</code><code>"[%Y.%m.%d %H:%M:%S]"</code>

<code>chmod</code> <code>600 $HISTDIR/${LOGNAME}/*.</code><code>history</code><code>* 2&gt;</code><code>/dev/null</code>

這段代碼将每個使用者的shell指令執行曆史以檔案的形式儲存在/usr/share/.history目錄中,每個使用者一個檔案夾,并且檔案夾下的每個檔案以IP位址加shell指令操作時間的格式命名。下面是user01使用者執行shell指令的曆史記錄檔案,基本效果如下:

<code>[root@server user01]</code><code>#  pwd</code>

<code>/usr/share/</code><code>.</code><code>history</code><code>/user01</code>

<code>[root@server user01]</code><code># ls -al</code>

<code>-rw------- 1 user01 wheel  56 Jul  6 17:07 192.168.12.12.</code><code>history</code><code>.20130706_164512</code>

<code>-rw------- 1 user01 wheel  43 Jul  6 17:42 192.168.12.12.</code><code>history</code><code>.20130706_172800</code>

<code>-rw------- 1 user01 wheel  22 Jul  7 12:05 192.168.12.19.</code><code>history</code><code>.20130707_111123</code>

<code>-rw------- 1 user01 wheel  22 Jul  8 13:41 192.168.12.20.</code><code>history</code><code>.20130708_120053</code>

<code>-rw------- 1 user01 wheel  22 Jul  1 15:28 192.168.12.186.</code><code>history</code><code>.20130701_150941</code>

<code>-rw------- 1 user01 wheel  22 Jul  2 19:47 192.168.12.163.</code><code>history</code><code>.20130702_193645</code>

<code>-rw------- 1 user01 wheel  22 Jul  3 12:38 192.168.12.19.</code><code>history</code><code>.20130703_120948</code>

<code>-rw------- 1 user01 wheel  22 Jul  3 19:14 192.168.12.134.</code><code>history</code><code>.20130703_183150</code>

儲存曆史指令的檔案夾目錄要盡量隐蔽,避免被黑客發現後删除。

二、合理使用su、sudo指令

su指令是一個切換使用者的工具,經常用于将普通使用者切換到超級使用者下,當然也可以從超級使用者切換到普通使用者。為了保證伺服器的安全,幾乎所有伺服器都禁止了超級使用者直接登入系統,而是通過普通使用者登入系統,然後再通過su指令切換到超級使用者下,執行一些需要超級權限的工作。通過su指令能夠給系統管理帶來一定的友善,但是也存在不安全的因素,例如系統有10個普通使用者,每個使用者都需要執行一些有超級權限的操作,就必須把超級使用者的密碼交給這10個普通使用者,如果這10個使用者都有超級權限,通過超級權限可以做任何事,那麼會在一定程度上對系統的安全造成了威協。是以su指令在很多人都需要參與的系統管理中,并不是最好的選擇,超級使用者密碼應該掌握在少數人手中,此時sudo指令就派上用場了。

sudo指令允許系統管理者配置設定給普通使用者一些合理的“權利”,并且不需要普通使用者知道超級使用者密碼,就能讓他們執行一些隻有超級使用者或其他特許使用者才能完成的任務,比如系統服務重新開機、編輯系統配置檔案等,通過這種方式不但能減少超級使用者登入次數和管理時間,也提高了系統安全性。是以,sudo指令相對于權限無限制性的su來說,還是比較安全的,是以sudo也被稱為受限制的su,另外sudo也是需要事先進行授權認證的,是以也被稱為授權認證的su。

sudo執行指令的流程是:将目前使用者切換到超級使用者下,或切換到指定的使用者下,然後以超級使用者或其指定切換到的使用者身份執行指令,執行完成後,直接退回到目前使用者,而這一切的完成要通過sudo的配置檔案/etc/sudoers來進行授權。

例如,/etc/shadow檔案普通使用者是無法通路的:

<code>[user01@unknown ~]$ </code><code>more</code> <code>/etc/shadow</code>

<code>/etc/shadow</code><code>: Permission denied</code>

如果要讓普通使用者user01可通路這個檔案,可以在/etc/sudoers添加如下内容:

<code>user01     ALL = </code><code>/bin/more</code> <code>/etc/shadow</code>

<code>這樣,通過如下方式user01使用者就可通路</code><code>/etc/shadow</code><code>檔案:</code>

<code>[user01@unknown ~]$ </code><code>sudo</code> <code>more</code> <code>/etc/shadow</code>

<code>[</code><code>sudo</code><code>] password </code><code>for</code> <code>user01:</code>

執行這個指令後,需要輸入user01使用者的密碼,然後就可通路檔案内容了。在這裡sudo使用時間戳檔案來完成類似“檢票”的系統,當使用者輸入密碼後就獲得了一張預設存活期為5分鐘的“入場券”(預設值可以在編譯的時候改變)。逾時以後,使用者必須重新輸入密碼才能檢視檔案内容。

如果每次都需要輸入密碼,那麼某些自動調用超級權限的程式就會出現問題,此時可以通過下面的設定,讓普通使用者無需輸入密碼即可執行具有超級權限的程式。例如,要讓普通使用者centreon具有/etc/init.d/nagios腳本重新開機的權限,可以在/etc/sudoers添加如下設定:

<code>CENTREON   ALL = NOPASSWD: </code><code>/etc/init</code><code>.d</code><code>/nagios</code> <code>restart</code>

這樣,普通使用者centreon就可以執行nagios重新開機的腳本而無需輸入密碼了。如果要讓一個普通使用者user02具有超級使用者的所有權限,而又不想輸入超級使用者的密碼,隻需在/etc/sudoers添加如下内容即可:

<code>user02 ALL=(ALL) NOPASSWD: ALL</code>

這樣user02使用者登入系統後,就可以通過執行如下指令切換到超級使用者下:

<code>[user02@unknown ~]$ </code><code>sudo</code> <code>su</code> <code>-</code>

<code>[root@unknown ~]</code><code># pwd</code>

<code>/root</code>

sudo設計的宗旨是:賦予使用者盡可能少的權限但仍允許它們完成自己的工作,這種設計兼顧了安全性和易用性,是以,強烈推薦通過sudo來管理系統賬号的安全,隻允許普通使用者登入系統,如果這些使用者需要特殊的權限,就通過配置/etc/sudoers來完成,這也是多使用者系統下賬号安全管理的基本方式。

三、删減系統登入歡迎資訊

系統的一些歡迎資訊或版本資訊,雖然能給系統管理者帶來一定的友善,但是這些資訊有時候可能被黑客利用,成為攻擊伺服器的幫兇,為了保證系統的安全,可以修改或删除某些系統檔案,需要修改或删除的檔案有4個,分别是/etc/issue、/etc/issue.net、/etc/redhat-release和/etc/motd。

/etc/issue和/etc/issue.net檔案都記錄了作業系統的名稱和版本号,當使用者通過本地終端或本地虛拟控制台等登入系統時,/etc/issue的檔案内容就會顯示,當使用者通過ssh或telnet等遠端登入系統時,/etc/issue.net檔案内容就會在登入後顯示。在預設情況下/etc/issue.net檔案的内容是不會在ssh登入後顯示的,要顯示這個資訊可以修改/etc/ssh/sshd_config檔案,在此檔案中添加如下内容即可:

<code>Banner </code><code>/etc/issue</code><code>.net</code>

其實這些登入提示很明顯洩漏了系統資訊,為了安全起見,建議将此檔案中的内容删除或修改。

/etc/redhat-release檔案也記錄了作業系統的名稱和版本号,為了安全起見,可以将此檔案中的内容删除。

/etc/motd檔案是系統的公告資訊。每次使用者登入後,/etc/motd檔案的内容就會顯示在使用者的終端。通過這個檔案系統管理者可以釋出一些軟體或硬體的更新、系統維護等通告資訊,但是此檔案的最大作用就、是可以釋出一些警告資訊,當黑客登入系統後,會發現這些警告資訊,進而産生一些震懾作用。看過國外的一個報道,黑客入侵了一個伺服器,而這個伺服器卻給出了歡迎登入的資訊,是以法院不做任何裁決。

本文轉自南非螞蟻51CTO部落格,原文連結: http://blog.51cto.com/ixdba/1552907,如需轉載請自行聯系原作者