[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 系統管理 > Linux > 正文
Chroot Linux中所有的服務
本文出自:www.netguard.com 作者: (2002-08-16 06:02:00)
什是chroot?chroot基本上重定義了一個程序的運行環境。更確切地說,它重定義了一個程序(或登錄會話)的“ROOT”目錄或“/”。
也就是說,對chroot了的程序或shell來說,chroot環境之外的目錄是不存在的。

那這樣又有什用呢?如果入侵者入侵了你的電腦,他們就不能看見你系統裡所有的文件了。
這樣,就限制了入侵者可能執行的命令,從而禁止了他們溢出不安全文件的機會。但唯一的缺點是,
我認為這不能阻止他們察看網絡連接和其他資料。因此,你應做一些本文未深入涉及的事情:




保護網絡端口。

察看是否所有的服務都以非root權限運行。另外,是否所有的服務都進行了chroot?

把系統日志轉移到其他電腦。

分析日志文件。

分析那些試圖探測你的計算機的隨機端口的人們。

限制服務所佔用的cpu和內存資源。

激活用戶配額。

我認為(把以非root權限運行的服務進行)chroot可以作為一道安全防線的原因是,
如果入侵者得到了一個非root賬戶,但沒有使他們得到root權限的文件的話,那他們只能對所入侵的區域造成破壞。
而且,如果root賬戶是入侵區域大部分文件的擁有者的話,入侵者是沒有多少攻擊的選擇的。顯然,如果你的賬戶被入侵,
那一定是某些地方出問題了,但最好能減少入侵者所能造成的破壞。

請記住 我所做的並不是100%正確的。這是我第一次嘗試這樣做,就算只是部分有效的話,
也應該是很容易完成基本的配置的。我想做一個chroot的HOWTO,現在所說的只是一些基本的東西。
  


怎樣把所有的服務都chroot呢?

好的,讓我們先創建一個目錄“/chroot”,然以下面的格式把我們的所有服務都放在它下面:



Syslogd 分別和每一個服務一起運行在hroot環境下。

Apache 運行在/chroot/httpd下.

Ssh 運行在/chroot/sshd下.

PostgreSQL 運行在/chroot/postmaster下.

Sendmail 運行在 chroot環境下,但不幸的是,它必須以root權限運行。

ntpd 運行在 /chroot/ntpd下。

named 運行在 /chroot/named 下。
每一個服務都是完全與外界隔離的。
  

我用來創建chroot環境的Perl腳本。

下載 href="http://main.linuxfocus.org/common/src/article225/Config_Chroot.pl.txt">Config_Chroot.pl.txt並更名為 Config_Chroot.pl. 這個Perl腳本讓你列出所有已安裝的服務,查看配置文件,配置服務,並啟動和停止服務。通常,這就是你應該做的。



創建chroot目錄
mkdir -p /chroot/Config/Backup

下載 href="http://main.linuxfocus.org/common/src/article225/Config_Chroot.pl.txt">Config_Chroot.pl.txt
並更名為 /chroot/Config_Chroot.pl

如果你的家目錄(home directory)不是/chroot,請把Perl腳本裡的$Home 變量作相應的改變。

下載我的 href="http://main.linuxfocus.org/common/src/article225/">配置文件。

現在,重要的是:我只在 RedHat
7.2 和 RedHat 6.2 上測試過。.

請在Perl腳本裡作相應的改變以適應你的發行版。


關chroot,我寫了一遍很長的文章,但有了我的腳本,它變得短了很多。在chroot了很多服務之,我注意到這些服務中需要被chroot的文件和配置都很相似。對一個特定的服務來說,判斷哪些文件需要拷貝的最容易的方法是查看man,如果程序要用到庫文件,就再鍵入“ldd /usr/bin/file“。你還可以把你正在安裝的服務進行chroot並手動啟動, 看看出了什錯或查一查它的日志文件。


通常,要安裝一個服務,可以這樣做:

cd /chroot
./Config_Chroot.pl config  SERVICE
./Config_Chroot.pl install SERVICE
./Config_Chroot.pl start   SERVICE


  

對 Ntpd 進行 Chroot


Ntpd 是一個時間服務,它使你的計算機以及其它計算機和實際時間同步。把它chroot是很簡單的。

cd /chroot
# 如果你沒有使用我的配置文件,請把下一行的注釋去掉。
#./Config_Chroot.pl config  ntpd
./Config_Chroot.pl install ntpd
./Config_Chroot.pl start   ntpd


  

對 DNS 和 named 進行 Chroot

已經有了howto文件,請看
href="http://www.linuxdoc.org/HOWTO/Chroot-BIND8-HOWTO.html">http://www.linuxdoc.org/HOWTO/Chroot-BIND8-HOWTO.html


href="http://www.linuxdoc.org/HOWTO/Chroot-BIND-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


  

把 Syslog 和其他服務一起進行chroot以及我所遇到的困難。

我想把syslogd進行chroot。我遇到的困難是,syslogd默認使用/dev/log目錄,而chroot了的服務是看不見這個目錄的。因此,用syslogd做日志記錄就不是很方便了。下面是可能的解決方案。



把syslogd分別和每一個服務進行chroot。我實際上就是這樣測試的,而且記錄了一些日志。我不喜歡這樣做,因為我有一個以root權限運行的服務。

看看我們是否能連接到外部日志記錄設備。

直接把日志記錄到文件上而不是通過syslogd。這可能是最好的安全選擇了,盡管如果被入侵,入侵者可以隨意改動日志。

配置syslogd來查看幾個地方,從而得到所有的服務,你可以用syslogd的-a選項來做到。

我的唯一的解決方案是確保syslogd分別和每一個服務進行chroot。我喜歡這樣的解決方案,它以非root權限在自己的chroot環境(有些像網絡端口)下記錄日志。這也許是可行的,但我正在停止我所做的,然尋求一個更好的解決方案。

如果你不想為每一個服務都配備一個獨立的syslogd,那當你的系統運行syslogd時,請在syslogd開始時運行下面命令:


syslogd -a /chroot/SERVICE/dev/log

如果有ssh和dns要運行,那看上去應該像這樣:
syslogd -a /chroot/ssh/dev/log -a /chroot/named/dev/log -a /dev/log



關syslogd,我最想說的是,我希望它能運行在非root賬戶下。我試了幾個簡單的東西,
但都沒有成功,是就放棄了。如果能讓syslogd和每一個服務一起運行在非root賬戶下,
我就會對我的安全措施感到滿意了。如果可能的話,最好將日志記錄到外部設備上。
  


對 Apache 進行 Chroot

很簡單。一旦我運行它,就可以執行Perl腳本。現在,我的配置文件是很長的,
因為我必須在chroot環境下包括Perl和PostgreSQL函數庫。有一件事要注意,如果你要連接到數據庫上,
請確保你的數據庫服務運行在127.0.0.1 回環設備上,並在關DBI的Perl腳本中指定主機為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 進行 Chroot

首先,如果把ssh從端口22重定向到2222就理想了。然,當你啟動ssh時,
讓它在一個非root賬戶下監聽2222端口。在初始化ssh連接時,我們只想讓有密碼的安全賬戶連進來,但不做其他任何事情。
在他們登錄之,運行在端口127.0.0.1:2222 的第二個ssh程序讓它們連接到真正的系統 -- 這第二個ssh程序應該只在回環設備上監聽。
這才是你應該做的。現在我們不打算去做。我們要做的唯一的事情是以這個chroot的ssh做個例子。
上面提到的一個練習就請讀者自己完成:讓sshd運行在非root賬戶下,再安裝第二個監聽回環設備的sshd以使人們連進真正的系統。

此外,我們只要把ssh進行chroot並讓你看一看那樣做的結果(如果你只做了這些,你不必觀察整個系統)。
當然,如果能把日志記錄在外部設備上就更好了。我們應該用OpenSSH,但為了方便(這好像不是一個好的借口),我用的是一個商業的SSH。


源地址: http://www.ssh.com/products/ssh/download.cfm



在/usr/local/ssh_chroot下安裝ssh並運行腳本。


cd /chroot
# 如果你沒有使用我的配置文件,請把下一行的注釋去掉。
# ./Config_Chroot.pl config  sshd
./Config_Chroot.pl install sshd
./Config_Chroot.pl start   sshd

我覺得把ssh放在chroot環境下的一個真正有益的事情是,如果你用它代替ftp服務器,人們在你的區域裡就只有有限的權限。
Rsync 和 SCP 在人們上傳文件時運行得非常好。我不是很喜歡建立ftp服務器讓人們登錄。很多ftp服務器都運行在chroot環境下,
但我不喜歡他們仍舊傳送明文密碼。
  

把 PostSQL 進行 Chroot

這幾乎和perl一樣簡單,除了它需要一些額外的函數庫。總的來說,這並不難做。
我必須做的一件事是把PostgreSQL放在網絡上,但僅僅是放在回環設備上。因為它是被chroot了的,
所以其他已經chroot了的服務是不能和它接觸的,就像web服務器 apache 一樣。
我把Perl編譯進PostgreSQL裡去了,因此我必須在我的配置文件裡加很多Perl的東西。

源代碼: href="ftp://ftp.us.postgresql.org/source/v7.1.3/postgresql-7.1.3.tar.gz">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


  

把 Sendmail 進行 Chroot

請執行我的Perl腳本。
cd /chroot
# 如果你沒有使用我的配置文件,請把下一行的注釋去掉。
# ./Config_Chroot.pl config  sendmail
./Config_Chroot.pl install sendmail
./Config_Chroot.pl start   sendmail

現在你發現什了?是的,他仍舊以root賬戶運行。而且,當sendmail啟動的時候,程序/etc/rc.d/init.d/sendmail會重新建立一些文件。
我的腳本並沒有解決這個問題。無論何時,如果你在/etc/mail下做了任何改動,請把改動過的文件拷貝到/chroot/sendmail/etc目錄下。
你還必須把/var/spool/mail指向/chroot/sendmail/var/spool/mail,以使sendmail程序和用戶(當他們登錄進來的時候)看到的是相同的文件。

好在你隨時可以發送郵件,當你收信的時候才會出問題。因此,我可以把sendmail和apache一起安裝而不出問題。
我的一些Perl腳本會向外發送郵件,所以我要把sendmail程序拷貝到apache的chroot環境下。
  


關 Chroot 的其他一些事情。

下面是我的觀點:



你的機器上包括sendmail, ssh, apache,
postgresql, syslog在內的所有服務都必須運行在chroot環境下。

每一個服務都必須以非root賬戶運行(你也許需要把已受保護的端口重定向到未受保護得端口。這包括sendmail和syslog。

日志應該遠離現場。

對每一個服務都實行磁盤配額,以限制入侵者所能佔用的磁盤。當磁盤已寫滿時,你應該在回環設備上為某些服務安裝文件系統。

所有不需改動的文件的擁有者應該是root賬戶。
現在,說到sendmail和syslogd,我仍然認為他們不應運行在root賬戶下。
對sendmail,這也許是可能的,但我發現讓它運行在非root賬戶下是極其困難的,至少我還沒有成功過。
我想,sendmail不能運行在非root賬戶下應是一個很嚴重的錯誤。雖然我知道讓它運行在非root賬戶下很困難,
但我認為所有的困難都是可以解決的。只要解決了文件的許可權問題,我覺得sendmail是不必以root權限運行的。
我肯定是忽略了什東西,我不相信這些障礙是不可征服的。

至syslog,我還沒有試過,但我認為應該以非root賬戶去記錄日志,我想這應該是可行的。
至少我可以為每一個服務在chroot的環境下記錄日志。


所有的服務都要運行在非root賬戶下,甚至是NFS。請記住,是所有的服務。
  


建議





請運行兩個sshd守護進程,並進行二次登錄。

設法使sendmail或其他郵件程序運行在非root賬戶下。

刪掉/lib下不需要的函數庫。我只是拷了我需要的函數庫在上面。其實你不需要其中的大部分。

請用syslogd進行遠程日志記錄,看看我們是否能讓syslogd連接到網絡端口上並得到運行在回環設備網絡端口上的所有服務的日志。
看看能否使syslogd運行在非root賬戶下。


  

結論


我覺得對所有的服務來說chroot都是那酷,我想,不能讓所有的服務都運行在非root賬戶的chroot環境下應該是個很大的錯誤。
我希望主要的發行版應該做到這一點,當然,也希望其它發行版做到。Mandrake 以兼容 RedHat 起家並發展,因此,人們可以仿效 Mandrake ,
在其他人的基礎上對chroot進行擴展。我認為這是可行的,因為在GNU/Linux裡,沒有什會阻止你重做其他人的工作。
如果某個公司想chroot所有服務並為人們創建了一套容易管理chroot了的服務的環境,那它就擁有了一個理想的發行版。
記住,Linux正趨向主流,人們不想再看見命令行,因此如果每件事都可以在gui的環境下去做,人們就不需要了解內部的構造,
並且不需要知道到底是什在運行,他們只要能配置並知道這是行之有效的就行了。

我絕對支持讓所有服務都運行在非root權限的chroot的環境下,任何不能做到這一點的發行版,我都不會考慮在生產環境中使用它。
我正使所有的服務都運行在chroot環境下,盡我的可能使越來越多的東西這樣運行 -- 最終,我會達到我的理想。


我打算為chroot寫一個HOWTO。我正發送請求,希望某個人能夠把我這篇文章轉換成LyX格式,以便它可以放到Linux得HOWTO上。
  


參考書目





如有變動,請見 http://www.gnujobs.com/Articles/23/chroot.html

(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
如何在Redhat 7.1下設置chroot DNS (2002-01-16 08:10:00)
什是CHROOT? (2001-04-16 13:51:59)
 

★  樊強制作 歡迎分享  ★