1. 程式人生 > >CentOS 7部署chroot ssh和sftp監牢

CentOS 7部署chroot ssh和sftp監牢

看過很多文章,講如何部署ssh/sftp監牢,但全部都是ssh遠端登入後,進入監牢,卻無法使用外部命令,即只有pwd、echo、history三個命令可用。經過多方查詢,終於找到方法。

第01步

# mkdir /var/jail
# chown root: /var/jail
# chmod 0755 /var/jail

建立一個目錄,將用來“囚禁”遠端登入進來的使用者,即將他們限制在這個目錄內。當然,也可以將他們各自“囚禁”在各自的家目錄下。稍我們再討論這個話題。

第02步

# mkdir /var/jail/{bin,dev,lib64}

同時建立了三個目錄:/var/jail/bin、/var/jail/dev、/var/jail/lib64

第03步

# ldd $(which bash)

用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)

第04步

# cp -r /lib64 /var/jail/

# cp -r /usr/bin/* /var/jail/bin
以上大約拷貝了/lib64目錄下所有的動態連結庫,以及/usr/bin下所有的命令,共13萬多個檔案。網上大多的教程是用ldd查詢,需要哪些,就拷貝哪一些。如果,我們如需要讓被“囚禁”的使用者使用ls命令,就:

# ldd $(which ls)

然後再拷貝上面這個命令列舉出來的連結庫。此時,就當/var/jail是根目錄即可。如果動態連結庫在/lib64下,就建立一個/var/jail/lib64,再把那些檔案拷貝進來,依此類推。

第05步

# 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。

第06步

# groupadd jail
# useradd -G jail tom
# passwd tom

如果在建立一個蜜罐,就不要把組命名為jail了。黑客進來一看,就不玩了。我們可以將某個使用者或某個組的使用者“囚禁起來”。這裡,我要把jail組的使用者“囚禁”起來。本例可能用不到這個組。你也可以不建立。想好要把哪個使用者“關起來”就行。

第07步

# mkdir /var/jail/etc
# cp -vf /etc/{passwd,group} /var/jail/etc/

建立一個/var/jail/etc目錄。

第08步

用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

第09步

# mkdir /var/jail/dev/pts
# mount --bind /dev /var/jail/dev
# mount --bind /dev/pts /var/jail/dev/pts

如果不處理,會出現:/dev/pts/2 not found的錯誤。

第10步

# vim /etc/profile

內容如下:

export PATH=$PATH:/bin

儲存退出。然後再:

# source /etc/profile

這一步是絕大部分教程都忽略的一條。如果沒有,登入後,也是找不到命令。

第11步

# systemctl restart sshd

重啟sshd服務

第12步

測試。
 

# 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