by Mark Nielsen (homepage)
關於作者:
Mark 先生是一位將自己的時間都捐獻給 GNUJob.com 等事業的自由咨詢者,他寫了很多的文章和自由軟件,並且是 eastmont.net 的一名志願者。
摘要:
對系統服務進行 chroot 以限制入侵者可能造成的破壞,從而提高系統的安全性。
------------------------------------------------------------
介紹
什麼是 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 腳本。
下載 Config_Chroot.pl.txt 並更名為 Config_Chroot.pl. 這個 Perl 腳本讓你列出所有已安裝的服務,查看配置文件,配置服務,並啟動和停止服務。通常,這就是你應該做的。
創建 chroot 目錄
mkdir -p /chroot/Config/Backup 下載 Config_Chroot.pl.txt 並更名為 /chroot/Config_Chroot.pl 如果你的家目錄(home Directory)不是 /chroot,請把 Perl 腳本裡的 $Home 變量作相應的改變。 下載我的配置文件。
現在,重要的是:我只在 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 文件,請看
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
把 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
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
SetHandler server-info
Order deny,allow
Deny from all
Allow from 127.0.0.1
然後,在你的浏覽器裡輸入 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 insta