文、小州老師

小州老師個人檔案

D018.jpg

       linux 環境上使用 ssh 服務基本上很常見,透過 ssh 服務登入主機進行管理這類需求都很方便。不過由於可以直接存取到系統層級的檔案目錄,所以可能有一些不需要開放給使用者存取的檔案也會被使用者看到。所以這篇簡單談一下如何在 ssh 登入服務之後達成的一些簡易限制。

◎談 chroot 環境限制:

     在 unix 系統上有個系統呼叫稱呼為 chroot,透過該系統函數呼叫可以傳入一個目錄,系統就會把該目錄當作 / 目錄一般提供後續該程式環境存取使用。該系統呼叫目前最常被用於是 ftp 服務的環境,尤其是匿名登入的環境都會用到。匿名 ftp 登入環境後,使用者會瀏覽 ftp 目錄結構的根目錄,不過該根目錄其實是系統某個子目錄所提供的。比方在 RHEL 系統上使用 vsftpd 程式可以提供 ftp 登入的功能,有開放 anonymous 這類參數登入的話,預設 ftp 該帳號的家目錄 /var/ftp 該位置也就是匿名登入的根目錄。

使用匿名的 ftp 登入,vsftpd 於使用者驗證登入成功之後,會透過 chroot 系統呼叫傳入 /var/ftp 該目錄,後續 vsftpd 程式本身的 / 目錄也就是相當於原本系統 /var/ftp 該目錄位置。有人會問到這樣做法的實質功能用途?其實也就是透過該方式簡單限制該服務程式能夠存取的檔案目錄的範圍,至少使用者登入主機之後不管怎樣移動位置,對於原本系統的檔案目錄存取也都是在 /var/ftp 該目錄一下,所以無法離開該目錄進而存取到其他不應該被存取的檔案目錄項目。

談 ssh 為何需要使用 chroot 環境限制:

本篇主要談到的是 ssh 服務登入之後 chroot 環境限制,這個需求面基本上並不是非常的常見。一般會用到該限制也許是考慮到在特定環境下要開放讓使用者可以 ssh 登入主機,但是本身卻希望登入主機之後只能夠針對自己家目錄一些檔案目錄進行管理,而不大希望使用者能夠看到系統面相關檔案進行存取 (像是看到 /etc 目錄內相關程式的設定檔案),那這時候搭配 chroot 該系統呼叫就可以簡單達成該限制環境。

談 ssh 服務使用 chroot 的方式:

若是要設定 ssh 登入後能夠透過 chroot 函數呼叫進行限制,其實做法上有許多方式可以進行。網路上可以找到許多非官方的 chroot patch,簡單說也就是要修改過 openssh 原始碼後來達成限制,不過該方式並不是每個一般人都可以簡單辦到,因為過程需要懂得編譯甚至 rpm 打包等議題環節,所以本文可能就先不採用該方式來進行。

最近的 openssh 版本支援設定 sftp 登入時候的 chroot 功能,可以讓使用者透過 sftp 方式登入主機存取檔案目錄時候能夠限制存取的範圍。最後一種方式比較適合針對是單純檔案目錄的傳輸環境,若是使用 ssh 直接登入就無法進行限制。

那搭配怎樣方式呢?最後還有一種方式是搭配使用 pam 內的 chroot module 來進行限制會比較簡單,所以本文打算採行後者方式來進行該需求。

要達成 ssh 於使用者登入後能chroot 函數呼叫進行限制,基本上有下列這 3 大議題要處理:

1) chroot 呼叫要傳入該目錄的實際環境設定
2) ssh 本身的 pam 驗證設定
3) pam 驗證設定檔案的 chroot module 載入設定

所以下面開始談到每個環節議題的設定方式...

chroot 呼叫要傳入該目錄的實際環境設定:

這個部分簡單來說也就是要部屬一個子目錄環境,該目錄環境與系統原本 / 內相關環境類似,但是只有具備特定檔案與目錄結構可以存取使用。這個由於考量有不少檔案可能要複製與建立,所以先採行簡單偷懶方式進行,後續有必要各位讀者可以自行調整與刪除相關檔案目錄。

# mkdir /home/chroot
# cp -a /bin /home/chroot
# cp -a /lib /home/chroot

# mkdir /home/chroot/usr
# cp -a /usr/lib /home/chroot/usr

這就是先把 /lib, /usr/lib 與 /bin 目錄複製一份到該目錄,完成後簡單先測試一下透過 chroot 命令是否可以用該目錄當作 / 環境。

# chroot /home/chroot

若是沒錯誤訊息成功表示應該就沒問題了。然後於該環境只能夠執行複製過去 bin/ 目錄相關檔案,而且活動範圍也有所限制。

不過這邊要先說說 /usr/lib 內有一堆檔案並不需要用到,都複製過去浪費太多空間。但是整個複製過去會比較簡單,這樣會包含系統所需要驗證程式庫所需要的檔案目錄,以這邊先採行單純方式再說。

ssh 本身的 pam 驗證設定:

這部分設定比較簡單,只要打開 /etc/ssh/sshd_config 設定檔案,確認有該設定即可:

UsePAM yes

若沒有開啟,修改後重新啟動 ssh 服務即可。

# /etc/init.d/sshd restart

◎pam 驗證設定檔案的 chroot module 載入設定:

pam 是目前 linux 內已經整合的環境,程式只要支援 pam 的話可以簡單擴充本身的驗證來源環境,其中包含作業階段的相關資源規範,所以可以讓程式擴充能力增加而不需要再修改程式碼。而現在要支援 ssh 能夠使用 chroot 呼叫,只要修改 /etc/pam.d/ssh 檔案內容即可。原本內容:

auth include      system-auth
account required     pam_nologin.so
account include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    required     pam_loginuid.so

調整加入相關內容,新的設定如下:

auth       include      system-auth
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    required     pam_loginuid.so
session   required      pam_chroot.so

也就是新增最後一行捨定如上,這樣這部分就完成了。請注意修改正確,不然後續 ssh 服務登入都會失敗而無法進入系統了。

pam_chroot.so 該 pam module 本身執行載入會讀入設定檔案決定該帳號是否要使用 chroot 環境,所以還需要搭配修改 /etc/security/chroot.conf 設定檔案達成該需求。

該檔案設定打開後有如下內容,可以看出來相關語法格式:

# /etc/security/chroot.conf
# format:
# username_regex        chroot_dir
#matthew                /home

所以依據上面的配置,比方想要限制 peter 帳號就寫入:

peter      /home/chroot

D018.jpg 

測試 ssh 服務是否可以正常使用該 chroot 環境:

首先先使用 ssh peter@localhost 方式來進行測試

# ssh peter@localhost

不過輸入帳號密碼後得到該錯誤訊息而且卡住了...

Could not chdir to home directory /home/peter: No such file or directory

因為系統有該帳號但是當初部屬 chroot 目錄沒有放入該使用者家目錄,所以修改一下...

# mkdir /home/chroot/home
# mv /home/peter /home/chroot/home

然後再重新登入看看... 不過連線時候就卡住了.... 那查看一下系統紀錄檔案,/var/log/messages 與 /var/log/secure 檔案看一下內容,可以看到:

Jan  3 16:00:41 linux sshd[18764]: pam_chroot(sshd:session): chroot(/home/chroot) succeeded
Jan  3 08:00:41 linux sshd[18766]: pam_env(sshd:setcred): Unable to open config file: /etc/security/pam_env.conf: No such file or directory
Jan  3 08:00:41 linux sshd[18764]: error: openpty: No such file or directory
Jan  3 08:00:41 linux sshd[18766]: error: session_pty_req: session 0 alloc failed

那再次調整所需要目錄結構與環境:

# mkdir /home/chroot/etc
# cp -a /etc/security /home/chroot/etc

然後需要考慮 pts 環境配置,所以需要一份原本 /dev 環境給 chroot 環境使用。目前 /dev 都是給 udev 管理,先簡單完整應對該目錄給 chroot 環境使用

# mkdir -p /home/chroot/dev
# mount --bind /dev /home/chroot/dev
# mount -t devpts -o gid=5,mode=620 devpts /home/chroot/dev/pts

其中考慮到 /proc 該虛擬檔案系統環境,所以需要再執行該指令:

# mkdir /home/chroot/proc
# mount -t proc proc /home/chroot/proc

後續再次登入測試一次,不過還是連線卡住沒有回應。查看紀錄檔案有如下訊息:

Jan  3 08:11:20 lc16888 sshd[18965]: pam_env(sshd:setcred): Unable to open env file: /etc/environment: No such file or directory
Jan  3 08:11:20 lc16888 sshd[18965]: pam_succeed_if(sshd:session): error retrieving information about user 0
Jan  3 08:11:20 lc16888 sshd[18965]: pam_unix(sshd:session): session closed for user peter

所以再行複製 /etc/environment 到 chroot 環境內

# cp /etc/environment /home/chroot/etc

最後再測試一下,直接切斷了連線。查看記錄檔案有該資訊....

Jan  3 08:40:37 lc16888 sshd[19547]: pam_succeed_if(sshd:session): error retrieving information about user 0
Jan  3 08:40:37 lc16888 sshd[19547]: pam_unix(sshd:session): session closed for user peter
Jan  3 08:40:37 lc16888 sshd[19547]: fatal: login_init_entry: Cannot find user "peter"

所以複製必要帳號資訊檔案過去給系統使用

# cp -a /etc/passwd /etc/group /home/chroot/etc

最後再測試一下,可以登入成功了....

不過登入之後 shell 沒有讀入相關設定檔案,所以沒有執行到實際上的 /etc/profile 等檔案,所以簡單複製所需要檔案項目:

# cp -a /etc/profile /etc/profile.d /etc/bashrc /home/chroot/etc

在測試登入與登出的環境可以看到這些訊息訊息:

-bash: /usr/bin/id: No such file or directory
-bash: [: =: unary operator expected

-bash: /usr/bin/clear: No such file or directory

所以再次複製一份 /usr/bin 檔案給該環境使用:

# cp -a /usr/bin /home/chroot/usr

再次測試登入後就沒該問題了。不過登出會看到一段該訊息:

'xterm': unknown terminal type.
Connection to localhost closed.

所以再次複製所需要檔案項目:

# cp -a /etc/termcap /home/chroot/etc
# cp -a /usr/share/terminfo/  /home/chroot/usr/share

再次登入與登出,系統完全沒有錯誤訊息,而且在 chroot 執行大部分命令也都沒有問題。這樣到此整個環境大致上就已經完成。

最後,目前 ssh 登入的環境雖然已經完成,不過還是很粗糙的一個配置環境。下一次文章內容會提到整理 chroot 所需要的環境,避免不需要的檔案目錄進行複製的情況,如此才可以讓整個環境更為單純與乾淨。這部分就需要整理所需要的程式清單,並檢視程式庫相依等環境問題。

希望本篇可以提供給大家實際上所需要的應用建置。

還有更多精采內容  請至38期電子報

, , , , , ,

lccnetvip 發表在 痞客邦 PIXNET 留言(0) 人氣()