通過Chroot機制讓伺服器安全到底

來源:互聯網
上載者:User
作者: hackhome  
所謂"監牢"就是指通過chroot機制來更改某個進程所能看到的根目錄,即將某進程限制在指定目錄中,保證該進程只能對該目錄及其子目錄的檔案有所動作,從而保證整個伺服器的安全。

建立chroot"監牢"

以前,Unix/Linux上的daemon都是以root許可權啟動的。當時,這似乎是一件理所當然的事情,因為像Apache這樣的伺服器軟體需要綁定到"眾所周知"的連接埠上(小於1024)來監聽HTTP請求,而root是惟一有這種許可權的使用者。

但是,隨著攻擊者活動的日益頻繁,尤其是緩衝區溢位漏洞數量的激增,使伺服器安全受到了更大的威脅。一旦某個網路服務存在漏洞,攻擊者就能夠訪問並控制整個系統。因此,為了減緩這種攻擊所帶來的負面影響,現在伺服器軟體通常設計為以root許可權啟動,然後伺服器處理序自行放棄root,再以某個低許可權的系統帳號來運行進程。這種方式的好處在於一旦該服務被攻擊者利用漏洞入侵,由於進程許可權很低,攻擊者得到的存取權限又是基於這個較低許可權的,對系統造成的危害比以前減輕了許多。

有些攻擊者會試圖找到系統其它的漏洞來提升許可權,直至達到root。由於本地安全性遠低於遠程安全保護,因此攻擊者很有可能在系統中找到可以提升許可權的東西。即使沒有找到本地漏洞,攻擊者也可能會造成其它損害,如刪除檔案、塗改首頁等。

字串9

為了進一步提高系統安全性,Linux核心引入了chroot機制。chroot是核心中的一個系統調用,軟體可以通過調用庫函數chroot,來更改某個進程所能見到的根目錄。比如,Apache軟體安裝在/usr/local/httpd/目錄下,以root使用者(或具有相同許可權的其它帳號)啟動Apache,這個root許可權的父進程會派生數個以nobody許可權啟動並執行子進程,具體情況取決於個人設定。父進程監聽請求自80連接埠的tcp資料流,然後根據內部演算法將這個請求分配給某個子進程來處理。這時Apache子進程所處的目錄繼承自父進程,即/usr/local/httpd/。

但是,一旦目錄許可權設定失誤,被攻擊的Apache子進程可以訪問/usr/local、/usr、/tmp,甚至整個檔案系統,因為Apache進程所處的根目錄仍是整個檔案系統的根。如果能夠利用chroot將Apache限制在/usr/local/httpd/,那麼,Apache所能存取的檔案都是/usr/local/httpd/下的檔案或其子目錄下的檔案。建立chroot"監牢"的作用就是將進程許可權限制在檔案系統分類樹中的某一子樹中。

為什麼需要jail

將軟體chroot化的一個問題是該軟體運行時需要的所有程式、設定檔和庫檔案都必須事先安裝到chroot目錄中,通常稱這個目錄為chroot
jail(chroot"監牢")。如果要在"監牢"中運行/sbin/httpd,而事實上根本看不到檔案系統中那個真正的/sbin目錄。因此需要事先建立/sbin目錄,並將httpd複製到其中。同時httpd需要幾個庫檔案,執行如下命令可以看到這些庫檔案(在真實的檔案系統下運行)。
字串3

#ldd /sbin/httpd
libaprutil-0.so.0
=> /usr/local/httpd/lib/libaprutil-0.so.0 (0x40017000)
libgdbm.so.2 =>
/usr/lib/libgdbm.so.2 (0x4003c000)
libdb-4.0.so => /lib/libdb-4.0.so
(0x40043000)
libpthread.so.0 => /lib/tls/libpthread.so.0
(0x400eb000)
libexpat.so.0 => /usr/lib/libexpat.so.0
(0x400f8000)
libapr-0.so.0 => /usr/local/httpd/lib/libapr-0.so.0
(0x40118000)
librt.so.1 => /lib/librt.so.1 (0x40139000)
lIBM.so.6 =>
/lib/tls/lIBM.so.6 (0x4014b000)
libcrypt.so.1 => /lib/libcrypt.so.1
(0x4016d000)
libnsl.so.1 => /lib/libnsl.so.1 (0x4019a000)
libdl.so.2
=> /lib/libdl.so.2 (0x401af000)
libc.so.6 => /lib/tls/libc.so.6
(0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2
(0x40000000)

這意味著還需要在"監牢"中建立lib目錄,並將庫檔案複製到其中。這一工作可以交由電腦完成,用jail等軟體包來協助簡化chroot"監牢"建立的過程。

編譯和安裝jail

從http://www.jmcresearch.com/static/dwn/projects/jail/jail.tar.gz可以下載到jail的最新版本,它是由位於http://www.jmcresearch.com/projects/jail/的jail
chroot項目小組開發的。該軟體包包含了協助自動建立chroot"監牢"的C程式、Perl程式和Bash指令碼。 字串9

首先將jail.tar.gz置於任意目錄,然後執行命令:
#tar xzvf
jail.tar.gz && cd jail/src

按照個人實際情況修改makefile檔案,尤其是安裝路徑(預設安裝路徑是/usr/local)、體繫結構(jail支援Linux、FreeBSD、IRIX和Solaris),以及編譯選項等。最後執行命令:
#make
&& make install

為jail建立chroot"監牢"

現在建立一個目錄作為chroot"監牢",以/var/chroot/為例。執行下面的命令為chroot"監牢"建立環境:
#/usr/local/bin/mkjailenv
/var/chroot

這樣"監牢"就建好了。jail軟體包提供了幾個Perl指令碼作為其核心命令,包括mkjailenv、addjailuser和addjailsw。如addjailsw會從真實檔案系統中拷貝二進位可執行檔及其相關的其它檔案(包括庫檔案、輔助性檔案和裝置檔案)到該"監牢"中。

為jail"監牢"添加軟體

接下來需要為這個"監牢"增加一些軟體,以便讓它運行起來。執行以下命令安裝一些基本的軟體,包括ls、cat、cp等程式和ld-linux.so.2等庫檔案。
#/usr/local/bin/addjailsw
/var/chroot

事實上僅有這些基本軟體是不夠的,還需要把一些真正有用的東西限制起來。下面的例子展示了為"監牢"添加arp程式的過程:
字串7

#/usr/local/bin/addjailsw /var/chroot -P
arp

addjailsw
A component of Jail (version 1.9 for linux)
http://www.jmcresearch.com/projects/jail/
Juan
M. Casillas <juanm.casillas@jmcresearch.com>

Guessing arp
args(0)
Warning: file .//lib/tls/libc.so.6 exists. Overwritting
it
Warning: file .//lib/ld-linux.so.2 exists. Overwritting it
Warning:
file .//etc/ld.so.cache exists. Overwritting it
Warning: file
.//usr/lib/locale/locale-archive exists. Overwritting it
Warning: file
.//usr/share/locale/locale.alias exists. Overwritting it
Warning: can't
create /proc/net/arp from the /proc
filesystem

Done.

再以Apache伺服器軟體為例:

#addjailsw
/var/chroot/ -P /usr/local/httpd/bin/httpd

addjailsw
A component of
Jail (version 1.9 for linux)
http://www.jmcresearch.com/projects/jail/ 字串9
Juan M. Casillas
<juanm.casillas@jmcresearch.com>

Guessing
/usr/local/httpd/bin/httpd args(0)
Warning: file /var/chroot//lib/libssl.so.4
exists. Overwritting it
Warning: file /var/chroot//lib/libcrypto.so.4 exists.
Overwritting it
Warning: file /var/chroot//lib/libresolv.so.2 exists.
Overwritting
it
……

Done.

不用在意那些警告資訊,因為jail會調用ldd檢查httpd用到的庫檔案。而幾乎所有基於共用庫的二進位可執行檔都需要上述的幾個庫檔案。

接下來將Apache的相關檔案拷貝到"監牢"中:
#cp -a /usr/local/httpd/
/var/chroot/usr/local/

可根據個人情況依次將Apache需要的檔案複製到"監牢"中。

"監禁"囚犯

有時候需要為chroot"監牢"建立新的使用者,比如Apache要求建立nobody使用者作為子進程使用者。鑒於可能有其它進程使用nobody,還可以使用另一使用者——httpd。首先需要在真實系統中建立httpd使用者:
#useradd
-d /var/chroot -s /usr/local/bin/jail httpd

然後執行以下命令在chroot"監牢"中建立httpd使用者:
#/usr/local/bin/addjailuser
/var/chroot /usr/local/httpd /usr/sbin/httpd httpd 字串8

接下來修改/var/chroot/usr/local/httpd/conf/httpd.conf,將User nobody替換為User
httpd。由於chroot後Apache將以httpd身份啟動進程,只有root有權將Apache綁定在低連接埠上(通常為80),因此還需要修改連接埠值,該值必須大於1024(假設為8080)。這個修改要應用到Apache的所有設定檔中,包括虛擬機器主機的配置。至於Apache的其它設定,與在真實檔案系統時一樣配置即可。

接下來需要複製一些其它的檔案。啟動Apache最常見的方式就是調用apachectl,這是個Bash指令碼。查看這個檔案,會發現如下行:

HTTPD='/usr/local/httpd/bin/httpd'
LYNX="lynx -dump"

ULIMIT_MAX_FILES="ulimit -S -n `ulimit -H -n`"
ARGV="-h"
$HTTPD -k
$ARGV
$HTTPD -k start -DSSL
$HTTPD -t
$LYNX $STATUSURL awk ' /process$/
{ print; exit } { print }
'

其中ulimit、lynx和awk是輔助性的程式。另外需要注意的是,程式使用不同的參數時,可能會使用不同的庫檔案,因此為了讓Apache完整運行,使用下面的命令來跟蹤所有可能的檔案:
#/usr/local/bin/addjailsw
/var/chroot -P httpd "-k start -DSSL"

字串2

用上述的參數替換引號中的參數,完成全部的工作。

最後,讓成功jail的Apache運行起來:
#su - httpd &

開啟瀏覽器進行測試,訪問Web伺服器時記住加上8080連接埠號碼。

jail進階應用程式

在前面的介紹中,使用了jail軟體包中的三個Perl指令碼。這裡詳細介紹這三個指令碼的使用,以便進階使用者使用。

mkjailenv
用法:mkjailenv
chrootdir
作用:建立chroot"監牢"目錄,並且從真實檔案系統中拷貝基本的軟體環境。
參數:
chrootdir指定chroot"監牢"的路徑。

addjailsw
用法:addjailsw chrootdir [-D] [-P program args]

作用:從真實檔案系統中拷貝指定的檔案及其相關檔案。
參數:
chrootdir指定chroot"監牢"的路徑。
-D顯示詳細資料。
-P
program
args指定要添加到"監牢"中的軟體。program可以是個檔案名稱,也可以是檔案的完整路徑;args是參數。比如可以這樣執行addjailsw:
#addjailsw
/var/chroot -P vi "-c q"

addjailuser
用法:addjailuser chrootdir userdir
usershell username
作用:建立新的chroot"監牢"使用者。
參數:

字串6

chrootdir指定chroot"監牢"的路徑。
userdir指定新添加使用者的主目錄(相對於chroot"監牢"目錄)。
usershell指定新使用者使用的Shell的完整路徑(比如/bin/bash)。
username為新添加的使用者名稱。

比如:
#addjailuser /var/chroot /home/ftp /bin/csh ftp

這個指令碼會自動修改"監牢"中的/etc/passwd、/etc/group和/etc/shadow檔案。

從上文看,如果僅使Apache一個軟體運行在"監牢"中,mkjailenv似乎過於"熱心"了,因此可以不運行mkjailenv
/var/chroot命令,而只運行addjailsw /var/chroot -P
httpd或在調試完chroot"監牢"後刪除多餘的檔案,並修改/etc/passwd中多餘的使用者資訊。由此想到,現在大多數流行的Web網站都採用Apache+PHP+MySQL+SSL的搭配(可能還會有FTP、Mail、Perl等組件),因此完全可以建立一個綜合的Web"監牢"。系統管理員可以為這個"監牢"設定軟體環境,當然這個環境只包括維護Apache+PHP+MySQL+SSL這些組件的必備工具,如使用Bash、SSH、編譯軟體或上傳等。這可能是一個浩大的工程,但是卻非常有意義。參考上面的方法,大家可以嘗試jail出完美的伺服器來。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.