天天看點

chroot Linux中的所有服務

作者:Mark Nielsen

譯者:藍風

原文出處:LinuxFocus.org

摘要:當某些人入侵你的系統時,chroot将通過限制入侵者所能造成的損失來提高系統的安全性。

介紹:

什麼時chroot呢?它其實是對一個程式從根本上重新定義。更準确的說,它為一個程式重新定義“root”目錄或“/”或日志。當你使用chroot後,一個程式在目錄以外的東西不再顯得那麼多。

為什麼它有用,如果某些人入侵了你的計算機,它們就不能看到你的系統中的所有的檔案,而且,還可以限制它們使用指令來通路檔案,也不能利用處于不安全狀況下的檔案。chroot唯一的缺點是:它不能阻止那些在網絡連接配接和其他部件偷看的入侵者。這樣,你必須做一些從本文你無法了解得更多的事情。

1.保護你的網絡端口。

2.讓你所有的服務在非root帳号的情況下運作,此外,将所有的服務chrooted。

3.複制系統日志檔案到另一台機器上。

4.分析日志檔案,

5.分析人們試圖探測你的計算機上任一端口的行為。

6.限制每個服務的CPU和記憶體。

7.激活帳号配置設定。

我之是以認為chroot(在non-root服務中)可以對程式起到防護作用的原因是,如果某些人入侵了你的電腦,在non-root帳号的情況下,就沒有檔案來供他們使用以進入root,那麼他們對闖入的區域所造成的破壞就會有限。同樣,如果他們侵入的領域絕大部分在root帳号下所有,可供選擇的破壞也會減少。很明顯,如果某些人入侵了你的帳号,那麼也可以保護你所受的損壞最小化。

請記住:我的方法也不是100%的有效。這是我第一次嘗試這樣做,而且如果這樣做有一部分的有效的話,那麼剩餘的的也将非常簡單了.下面是如何做的步驟.

你準備好了嗎?

好的,我們先建立一個目錄,”/chroot”,然後,我們将我們所有的services都放在它的下面。接下來做以下安排:

系統日志檔案将和每項服務一起chroot。

Apache放在/chroot/httpd。

Ssh放在/chroot/sshd。

PostgreSQL放在/chroot/postmaster。

Sendmail也将被chroot,但是不幸的是,它不能在一個非root權限下運作。

ntpd被chroot到/chroot/ntpd。

named被chroot到/chroot/named。

每一項service都将完全隔絕。

我的perl腳本将生成一個chrooted的環境。

Config_Chroot.pl.txt(下載下傳位址見本文參考)在下載下傳後被重命名為Config_Chroot.pl。perl腳本将安裝的每一項service清單,浏覽配置檔案,對每一項服務進行配置。總之,下面是你需要做的事情。

1.生成chroot目錄。mkdir -p /chroot/Config/Backup

2.下載下傳Config_Chroot.pl.txt到/chroot/Config_Chroot.pl

3.在perl腳本種改變$Home變量,如果你的根目錄不是/chroot

4.下載下傳我寫的配置檔案。

現在,最重要的一件事情是:我隻在RedHat 7.2和RedHat 6.2中進行過測試。是以,請 根據你的版本修改perl腳本。

我不想在Chroot中放置大量的檔案,最後我的Perl腳本将它變得很小。基本上,我注意到當chroot很多service後,其實它們重複chroot了很多相似的檔案和結構。一個最簡單的分辨那些檔案需要複制給一個特殊的service的方法是閱讀手工頁,而且對适用庫檔案的程式鍵入”ldd /usr/bin/file”指令。當然,你也可以chroot你正在安裝的service,并且你可以手工操作,看看你犯的錯誤,後者看看它的日志檔案。

總之,,安裝一項service操作如下:

cd /chroot

./Config_Chroot.pl config SERVICE

./Config_Chroot.pl install SERVICE

./Config_Chroot.pl start SERVICE

Chroot Ntpd

Ntpd隻是一個時間服務項目,它能使你的機器和其他機器與真實時間保持一緻。chroot它很簡單。

# 如果你不想使用我的配置檔案,下面的指令行不共通

#./Config_Chroot.pl config ntpd

./Config_Chroot.pl install ntpd

./Config_Chroot.pl start ntpd

Chroot DNS 或named

已經做好,可以在下面的網址中有償得到:

http://www.linuxdoc.org/HOWTO/Chroot-BIND8-HOWTO.html

或是

http://www.linuxdoc.org/HOWTO/Chroot-BIND-HOWTO.html

或者,你也可以使用我的腳本,

#./Config_Chroot.pl config named

./Config_Chroot.pl install named

./Config_Chroot.pl start named

Chroot 系統日志檔案還有我的抱怨

我想chroot日志檔案,但是有一個問題就是,日志檔案預設使用/dev/log,而且,它不能被chroot service監測到,是以,chroot并不是一件容易的事,下面是可能有效的幾個方法:

1.與每項service一起chroot日志檔案。我測試過确實可行。但是我并不喜歡這樣,因為我有一個連續運轉的root service。

2.看我們能不能連接配接一個斷開的日志工具。

3.記錄檔案到一個檔案而不是通過系統日志檔案。這可能是最可靠的方案,雖然,萬一真的有人闖入系 統,他們就可以對日志檔案為所欲為。

4.配置主要的系統日志檔案,看看個别的位置能不能獲得所有的service。請同時使用-a選項。

我的唯一的解決方法是确信系統日志檔案和每一項service一起chroot。我想有一些方法可以在它們自己的chroot環境中在非root權限下對檔案進行日志備份,就象是一個網絡端口。它是可行的,但我想找到一個更好的解決方案。

如果你不想将每個service的日志檔案分離出來,那麼請在系統日志開始的時候,在主要的日志檔案開始在系統中運作的時候,加入以下指令:

syslogd -a /chroot/SERVICE/dev/log

如果你運作ssh和dns,它可以寫成,

syslogd -a /chroot/ssh/dev/log -a /chroot/named/dev/log -a /dev/log

最後在系統日志檔案中要注意的是,我希望它可以在一個non-root account下運作。我實驗了幾個簡單的操作,但是都不行,最後我放棄了。如果真的能夠在一個non-root account的情況下運作系統日志備份的話,安全問題将會更完善。

Chroot Apache

它非常容易。我隻要一設定好它,就可以運作我的perl腳本。現在我的配置檔案相當大,因為我将Perl腳本和PostgerSQL資料庫都放進了已經chrooted的區域。有一件事情你要注意,如果你連接配接到了一個資料庫,确信你的資料庫是在127.0.0.1閉合回路中運作,而且你要确信你的主機在Perl腳本中為了DBI子產品必須是127.0.0.1。下面是我在apache中使用持續的連接配接來連接配接一個資料庫:

$dbh ||= DBI->connect('dbi:Pg:dbname=DATABASE',"","", {PrintError=>0});

if ($dbh ) {$dbh->{PrintError} = 1;}

else

{$dbh ||= DBI->connect('dbi:Pg:dbname=DATABASE;host=127.0.0.1',"","",

{PrintError=>1});}

來源: http://httpd.apache.org/dist/httpd/

在你的主系統中編譯和安裝apache到/usr/local/apache。然後運作perl腳本。

#如果你不想使用我的配置檔案,下面的指令行不共通

# ./Config_Chroot.pl config httpd

./Config_Chroot.pl install httpd

./Config_Chroot.pl start httpd

我改變我的httpd.conf檔案得到這些材料:

ExtendedStatus On

<Location /server-status>

SetHandler server-status

Order deny,allow

Deny from all

Allow from 127.0.0.1

</Location>

<Location /server-info>

SetHandler server-info

Order deny,allow  

然後,指定你的浏覽器到http://127.0.0.1/server-status 或 http://127.0.0.1/server-info 。

Chroot Ssh

首先,理想的情況下,我們将ssh連接配接到端口22到端口2222。然後,當你啟動ssh,在一個non-root account下将它連接配接到端口2222。在起始的ssh連接配接中,我們使用密碼來確定有一個安全的帳号,這個密碼隻起限制進入系統的人的作用,除此以外起不了其他的作用。當他們登入系統後,是第二個ssh程式,這個程式運作在端口127.0.0.1至127.0.0.2322,這樣,才能連接配接到真正的系統—— 這第二個ssh程式隻聽命于循環裝置。現在,這些都要你動手一試。我就不再做這些事了。我要做的就是chroot ssh。需要你親手做的包括将ssh放在一個non-root account下,安裝第二個ssh程式,而且這個ssh程式隻聽命于循環裝置,這樣才能讓人們進入真正的系統。

然後,我們打算僅僅chroot ssh,而且,你也可以考慮考慮這樣做的後果(如果你這麼做的話,你不能看見整個系統)。同樣,我可以使用OpenSSH,但是我為了簡單使用的是商務SSH(這并不是一個好的借口)。

來源:http://www.ssh.com/products/ssh/download.cfm

安裝ssh在/usr/local/ssh_chroot。然後使用Perl腳本。

# ./Config_Chroot.pl config sshd

./Config_Chroot.pl install sshd

./Config_Chroot.pl start sshd

如果你想在一個已經chroot的環境下使用它來代替一個ftp的話,無疑它是一件好事,它将限制人們接近你的領地。Rsync和SCP互相結合運作得很好,讓人們上傳檔案。我并不是真的喜歡将一個ftp放上去,以供人們運作。很多ftp服務都已經被chroot了,但事它們仍然可以透明的傳遞密碼,這是我不喜歡的。

Chroot PostgreSQL

它和perl一樣簡單,除了它需要更多一些的庫檔案以外。總的來說,它并不難做。我必須要做的事情是把PostgreSQL在網絡上打開,而且隻能在循環裝置上。因為它事被chroot的,是以其他的chrooted的服務不能到達它,象apache web服務。我将Perl編譯成PostgreSQL,是以我需要将大量的Perl材料加入到配置檔案中。

來源:

ftp://ftp.us.postgresql.org/source/v7.1.3/postgresql-7.1.3.tar.gz

編譯和安裝apache在你的主系統中的/usr/local/postgres下。然後運作Perl腳本。

# ./Config_Chroot.pl config postgres

./Config_Chroot.pl install postgres

./Config_Chroot.pl start postgres

Chroot Sendmail

繼續進行,執行腳本。

# ./Config_Chroot.pl config sendmail

./Config_Chroot.pl install sendmail

./Config_Chroot.pl start sendmail

你懂了嗎?是的,它一直作為根在運作。更新檔,同樣,某些檔案在它開始運作的時候被/etc/rc.d/init.d/sendmail 檔案改建。我的腳本不處理這個問題。任何你在/etc/mail下對sendmail做的改動,都請你将改動拷貝到/chroot/sendmail/etc。同樣,你必須指定/var/spool/mail 到/chroot/sendmail/var/spool/mail 這樣sendmail程式和使用者(當他們進入後)才能看到相同的檔案。

好處是,你可以發送郵件,但是收到郵件是一個問題。我可以和apache安裝sendmail沒有任何問題。我将一些perl腳本發送出去,是以,我需要拷貝sendmail 檔案到apache的chroot領域中。

其他chroot的事物

下面是我的理念。

1.任何事物都可以被chrooted,包括sendmail,ssh,apache,postgresql,syslog,以及在計算機中運作的所有服務。

2.所有的事物都可以放在一個非root帳号下(你需要的做的是将被保護的端口連接配接到無保護端口)。這包括sendmail和syslog。

3.日志備份可以是offsite。

4.每一個服務都可以設定一個區間配置設定,這樣當黑客用完磁盤空間改寫檔案的時候會有一個磁盤空間限制。

5.Root可以擁有所有沒有改動的檔案。

現在,關于endmail和syslog,我仍然認為他們應當可以在非root帳号下運作。對于sendmail。這是完全可能的,但是我發,現還是相當困難。在非root帳号下我還沒有成功的運作過sendmail,我想一定有一個嚴重的錯誤.我直到這樣做會有問題,但是我想它們一定都可以解決.檔案已經得到許可,我不明白 為什麼sendmail需要在root下才能運作.可能是我忽略了一些問題,我懷疑是有一些不能逾越的障礙.

至于syslog,我沒有試過,但是我相信在非root帳号下,它一定可以運作,我不相信它不能運作.至少我可以将每項服務的syslog都進行chrooted.

所有的服務都可以在非root帳号下設定.即使是NFS,還有所有的服務.

建議:

1.對ssh進行兩次登記,而且運作兩個sshd.

2.找出如何在非root下運作sendmail和其他郵件程式的辦法。

3.除掉/lib裡的不必要的庫檔案.我為了省力拷貝了裡面的所有東西.其實,裡面的很多東西都是不需要的.

4.遠端登入sysloge,還有弄清楚我們能不能把syslogd連接配接到一個網絡端口,以及所有的services是不是都可以連接配接到在循環裝置上的網絡的端口.看看是否能在非root帳号下運作syslogd.

結論:

我認為chroot對所有的service都是有效的.我相信如果不将所有的服務都chroot到非root帳号下都将是一個大錯誤.我希望無論是一個專業版本還事一個小一些的版本:任何版本.Mandrake一開始從RedHat中獲得源材料,然後将它擴充,是以,人們完全可能使用Mandrake并擴大chroot再斷開它們.沒有什麼能阻止人們在GNU/Linux重複别人的工作,是以我認為,這樣做完全可行.如果有公司願意将任何事情都進行chroot,并創造一個寬松的系統化的環境以友善人們管理它們的chrooted的服務,我相信它們一定會有異想不到的銷售成績!記住,即使Linux已經成為了主流,但是人們還是不願意看見指令行,是以,如果所有的事都可以在圖形互動界面下完成,他們就沒有必要看見所有東西”内髒”,也沒有必要知道事情是怎樣一步一步的進行的——他們所要做的僅僅上配置和知道它正在工作!

我100%的支援一個觀點:所有的服務都可以chroot在非root帳号下,而且還沒有任何版本可以提供給我一個可以真正使用的環境。我打算chroot所有的事情——事實上,我确實這樣做了。

我計劃寫一篇關于如何chroot的文章,我請問你們有誰可以幫我,将這篇文章轉換為LyX格式,這樣它就可以放在Linux的HOWTOs裡邊了。

參考:

如果這篇文章有所改動,你可以在這裡找到它: http://www.gnujobs.com/Articles/23/chroot.html

本文有關配置檔案下載下傳位址: http://www.linuxfocus.org/common/src/article225/

上一篇: RAID 5