看過不少文章,講如何部署ssh/sftp監牢,但所有都是ssh遠程登陸後,進入監牢,卻沒法使用外部命令,即只有pwd、echo、history三個命令可用。通過多方查找,終於找到方法。linux
# mkdir /var/jail
# chown root: /var/jail
# chmod 0755 /var/jailshell
建立一個目錄,將用來「囚禁」遠程登陸進來的用戶,即將他們限制在這個目錄內。固然,也能夠將他們各自「囚禁」在各自的家目錄下。稍咱們再討論這個話題。vim
# mkdir /var/jail/{bin,dev,lib64}bash
同時建立了三個目錄:/var/jail/bin、/var/jail/dev、/var/jail/lib64dom
# ldd $(which bash)ssh
用which命令查看bash的絕對地址,再用ldd查詢其依賴的動態連接庫。根據查看的結果,它須要如下這幾個動態連接庫:
linux-vdso.so.1 => (0x00007ffd73b69000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f3d7dc16000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f3d7da12000)
libc.so.6 => /lib64/libc.so.6 (0x00007f3d7d645000)
/lib64/ld-linux-x86-64.so.2 (0x00007f3d7de40000)測試
# cp -r /lib64 /var/jail/spa
# cp -r /usr/bin/* /var/jail/bin
以上大約拷貝了/lib64目錄下全部的動態連接庫,以及/usr/bin下全部的命令,共13萬多個文件。網上大多的教程是用ldd查詢,須要哪些,就拷貝哪一些。若是,咱們如須要讓被「囚禁」的用戶使用ls命令,就:3d
# ldd $(which ls)rest
而後再拷貝上面這個命令列舉出來的連接庫。此時,就當/var/jail是根目錄便可。若是動態連接庫在/lib64下,就建立一個/var/jail/lib64,再把那些文件拷貝進來,依此類推。
# cd /var/jail/dev # mknod -m 666 null c 1 3 # mknod -m 666 tty c 5 0 # mknod -m 666 zero c 1 5 # mknod -m 666 random c 1 8
根據man sshd_config的說明,建立運行shell和sftp須要的字符設備,如/dev/tty、/dev/zero、/dev/null、/dev/random。
# groupadd jail # useradd -G jail tom # passwd tom
若是在建立一個蜜罐,就不要把組命名爲jail了。黑客進來一看,就不玩了。咱們能夠將某個用戶或某個組的用戶「囚禁起來」。這裏,我要把jail組的用戶「囚禁」起來。本例可能用不到這個組。你也能夠不建立。想好要把哪一個用戶「關起來」就行。
# mkdir /var/jail/etc # cp -vf /etc/{passwd,group} /var/jail/etc/
建立一個/var/jail/etc目錄。
用vim /etc/ssh/sshd_config,在文件最後面添加如下內容
Match User alan ChrootDirectory /var/jail
這裏是將用戶alan關起來。固然,你可使用組,以下:
Match Group jail ChrootDirectory %h
%h,表明各用戶本身的家目錄。若是使用的是這第二種方法,則須要對各用戶的家目錄進行處理。這個方法至關於將監牢的位置進行了調整。因此前面對/var/jail的處理方法要在/home/alan處使用。/var/jail能夠刪除了。
# chown root: /home/alan # mkdir /home/alan/{bin,lib64,dev,etc} # cp -r /lib64/* /home/alan/lib64 # cp -r /usr/bin/* /home/alan/bin # chmod 0755 /home/alan # cd /home/alan/dev # mknod -m 666 null c 1 3 # mknod -m 666 tty c 5 0 # mknod -m 666 zero c 1 5 # mknod -m 666 random c 1 8
# mkdir /var/jail/dev/pts # mount --bind /dev /var/jail/dev # mount --bind /dev/pts /var/jail/dev/pts
若是不處理,會出現:/dev/pts/2 not found的錯誤。
# vim /etc/profile
內容以下:
export PATH=$PATH:/bin
保存退出。而後再:
# source /etc/profile
這一步是絕大部分教程都忽略的一條。若是沒有,登陸後,也是找不到命令。
# systemctl restart sshd
重啓sshd服務
測試。
# ssh alan@localhost bash_4.2# pwd bash_4.2# ls bash_4.2# touch file.txt
測試成功後,咱們再來配置sftp。此時,僅須要修改/etc/ssh/sshd_config將其最後的內容變成以下:
#Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp Match User alan ChrootDirectory /var/jail ForceCommand internal-sftp AllowTcpForwarding no
而後再重啓sshd服務,便可。測試方法以下:
# sftp alan@localhost