天天看點

SSH限制普通使用者到家目錄

在這個例子中,建立了一個"迷你監獄"用來測試一個隻有 ls 指令的 Bash shell。首先用 mkdir 指令設定好 abc "監獄" 路徑。

1.建立使用者abc

useradd abc

passwd abc

2.用root使用者建立目錄 :

mkdir -p /chroot/{etc,dev,proc,lib,bin,lib64,home,usr}mkdir -p /chroot/usr/binmkdir -p /chroot/home/abc

chown abc /chroot/home/abc

3. 建立passwd檔案

tail -1 /etc/passwd >/chroot/etc/passwd

4.把bash檔案拷貝到/chroot/bin下.(對于RHEL6,應該使用cp -a來拷貝檔案。)

cp -a /bin/bash /chroot/bin/

5. 檢視bash指令需要哪些.so檔案,拷貝到chroot相應的目錄中(為ldd /bin/bash的結果)

cp -a /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /chroot/lib64/

拷貝完成後,ls -l,會發現拷貝的是軟連結檔案:

# ll /lib64/

total 0

lrwxrwxrwx. 1 root root 10 Feb 6 13:58 ld-linux-x86-64.so.2 -> ld-2.12.so

lrwxrwxrwx. 1 root root 12 Feb 6 13:58 libc.so.6 -> libc-2.12.so

lrwxrwxrwx. 1 root root 13 Feb 6 13:58 libdl.so.2 -> libdl-2.12.so

lrwxrwxrwx. 1 root root 15 Jan 16 22:36 libtinfo.so.5 -> libtinfo.so.5.7

拷貝原始檔案:

cp -a /lib64/{ld-2.12.so,libc-2.12.so,libdl-2.12.so,libtinfo.so.5.7} /chroot/lib64/

簡單測試一下,看看chroot指令是否可以用該目錄當做/環境。

chroot /chroot

沒有錯誤資訊即可,正常應顯示bash的資訊。

6、ssh設定

/etc/ssh/sshd_config

確定

UsePAM yes

預設即為yes

7. pam驗證增加chroot子產品

vim /etc/pam.d/sshd

在最下面添加一行:

session    required     pam_chroot.so

一定要確定輸入正确,否則可能造成ssh無法登陸。

pam_chroot.so執行後會讀取配置檔案以決定是否使用chroot環境。

vim /etc/security/chroot.conf

# /etc/security/chroot.conf

# format:

# username_regex        chroot_dir

#matthew                /home

添加一行

abc /chroot

8、調試ssh服務

測試:

ssh [email protected]

登陸失敗,打開/var/log/secure日志檢視:

Jun  6 09:40:42 abc sshd[18769]: pam_env(sshd:setcred): Unable to open config file: /etc/security/pam_env.conf: No such file or directory

Jun  6 09:40:42 abc sshd[18694]: error: openpty: No such file or directory

Jun  6 09:40:42 abc sshd[18769]: error: session_pty_req: session 0 alloc failed

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

為chroot準備dev環境,準備pts環境

mount --bind /dev /chroot/dev

mount -t devpts -o gid=5,mode=620 devpts /chroot/dev/pts

準備proc環境

mount -t proc /proc /chroot/proc/

再次登陸測試:

ssh [email protected]

Jun  6 09:50:04 abc sshd[21426]: pam_env(sshd:setcred): Unable to open env file: /etc/environment: No such file or directory

Jun  6 09:50:04 abc sshd[21390]: error: ssh_selinux_setup_pty: security_compute_relabel: No such file or directory

cp -a /etc/environment /chroot/etc/

重新測試:

ssh [email protected]

[email protected]'s password: 

-bash-4.1$ 

OK,可以正常登陸了。

如果通路系統的某個目錄?

mount --bind /usr/local/123 /chroot/usr/local/123

9、複制 ls 指令所需的庫檔案到chroot相應的目錄中。用 ldd 指令列印出 ls 指令依賴的共享庫:

cp -a /bin/ls /chroot/bin/

ldd /bin/ls

輸出樣例:

linux-vdso.so.1=>(0x00007fff68dff000)

libselinux.so.1=>/lib64/libselinux.so.1(0x00000032f8a00000)

librt.so.1=>/lib64/librt.so.1(0x00000032f7a00000)

libcap.so.2=>/lib64/libcap.so.2(0x00000032fda00000)

libacl.so.1=>/lib64/libacl.so.1(0x00000032fbe00000)

libc.so.6=>/lib64/libc.so.6(0x00000032f7200000)

libdl.so.2=>/lib64/libdl.so.2(0x00000032f6e00000)

/lib64/ld-linux-x86-64.so.2(0x00000032f6a00000)

libpthread.so.0=>/lib64/libpthread.so.0(0x00000032f7600000)

libattr.so.1=>/lib64/libattr.so.1(0x00000032f9600000)

你可以一個個的複制庫檔案,為了更高效的作業,我們也可以使用bash shell 的循環指令實作:

list="$(ldd /bin/ls | egrep -o '/lib.*\.[0-9]')"

for i in $list;do cp -a "$i" /chroot/"${i}";done

拷貝原始檔案:

list=`ll $(ldd /bin/ls | egrep -o '/lib.*\.[0-9]') |awk -F '>' '{print $2}'`

for i in $list;do cp -a /lib64/"$i" /chroot/lib64/"${i}";done

最後,chroot 到你的新abc:

chroot /chroot/home/abc /bin/bash

嘗試浏覽一下 /etc 或 /var:

# ls /

10、環境設定

最簡單的就是不設定環境,使用bash版本号作為提示符。

或者也可以按正常的使用者一樣設定提示符,需要做的操作比較多。

#cp -a /etc/{profile,profile.d,bashrc} /chroot/etc/

 ssh [email protected]

[email protected]'s password: 

-bash: id: command not found

-bash: id: command not found

-bash: uname: command not found

-bash: /bin/grep: No such file or directory

-bash: /bin/grep: No such file or directory

-bash: /bin/grep: No such file or directory

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

-bash: [: =: unary operator expected

#whereis id

id: /usr/bin/id /usr/share/man/man1p/id.1p.gz /usr/share/man/man1/id.1.gz

 cp -a /usr/bin/id /chroot/usr/bin/

 cp -a /bin/grep  /chroot/bin/

 cp -a /bin/uname  /chroot/bin/

#  ldd /chroot/usr/bin/id

        linux-vdso.so.1 =>  (0x00007fff4cba1000)

        libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003690200000)

        libc.so.6 => /lib64/libc.so.6 (0x000000368e600000)

        libdl.so.2 => /lib64/libdl.so.2 (0x000000368ea00000)

        /lib64/ld-linux-x86-64.so.2 (0x000000368e200000)

按上面的方法解決即可。