Chroot Linux中所有的服務

來源:互聯網
上載者:User
什麼是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上。 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.