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它很簡單。

cd /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

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

cd /chroot
# 如果你不想使用我的配置文件,下面的命令行不共通
#./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腳本。

cd /chroot
#如果你不想使用我的配置文件,下面的命令行不共通
# ./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
Deny from all
Allow from 127.0.0.1
</Location>


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

  首先,理想的情況下,我們將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腳本。

cd /chroot
# 如果你不想使用我的配置文件,下面的命令行不共通
# ./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腳本。

cd /chroot
# 如果你不想使用我的配置文件,下面的命令行不共通
# ./Config_Chroot.pl config postgres
./Config_Chroot.pl install postgres
./Config_Chroot.pl start postgres

Chroot Sendmail


  繼續進行,執行腳本。

cd /chroot
# 如果你不想使用我的配置文件,下面的命令行不共通
# ./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/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章