搭建sftp服务器时,为了系统安全,一定要把这个用户锁定在其存储目录下,这时候,我就需要用到chroot了。
创建 SSH chroot
1 2 3 4 |
# 创建用户所在根目录 mkdir -p /data/staffUpload/ #复制包含支持用户会话所必需的文件和目录 ls -l /dev/{null,zero,stdin,stdout,stderr,random,tty} |
使用 mknod 命令创建 /dev 下的文件:
1 2 3 4 5 6 |
mkdir -p /data/staffUpload/dev/ cd /data/staffUpload/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 |
参数说明:
参数 | 说明 |
-m | 指定文件权限位 |
c | 字符文件 |
数字 | 分别是文件指向的主要号和次要号 |
设置根目录权限:
1 2 3 |
chown root:root /data/staffUpload chmod 755 /data/staffUpload ls -ld /data/staffUpload |
注意:根目录及根目录下非SFTP用户的文件(夹)的所有者必须为root用户,且对普通用户或用户组不可写
设置 SSH chroot 交互式 shell
创建bin目录并复制bash:
1 2 |
mkdir -p /data/staffUpload/bin cp -v /bin/bash /data/staffUpload/bin/ |
复制bash需要用到的共享库:
1 2 3 |
ldd /bin/bash mkdir -p /data/staffUpload/lib64 cp -v /lib64/{libtinfo.so.5,libdl.so.2,libc.so.6,ld-linux-x86-64.so.2} /data/staffUpload/lib64/ |
创建并配置 SSH 用户
配置用户:
1 2 3 4 5 6 |
# 创建用户组 groupadd sftp # 创建用户 useradd -g sftp <username> # 修改用户密码 passwd <username> |
禁止用户ssh登录(如果需要的话):
1 2 3 |
usermod -s /sbin/nologin <username> # 恢复用户登录 # usermod -s /bin/bash <username> |
复制新的账号文件:
1 2 |
mkdir /data/staffUpload/etc cp -vf /etc/{passwd,group} /data/staffUpload/etc/ |
注意:每次向系统添加sftp用户时,都需要将新帐户文件复制到该目录。
修改 SSH 配置文件
编辑/etc/ssh/sshd_config,在尾部适当位置添加如下参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
UseDNS no AddressFamily inet PermitRootLogin yes SyslogFacility AUTHPRIV PasswordAuthentication yes # 从这里开始添加参数 # Subsystem sftp /usr/libexec/openssh/sftp-server Subsystem sftp internal-sftp # 匹配用户 Match User <username> # 匹配用户组 # Match Group <groupname> ChrootDirectory /data/staffUpload/sftp/ |
保存并退出,重启sshd:
1 |
systemctl restart sshd |
配置用户环境
为sftp用户创建一个主目录并配置权限:
1 2 3 |
mkdir -p /data/staffUpload/sftp/<username> chown -R sftp:sftp /data/staffUpload/sftp/<username> chmod -R 700 /data/staffUpload/sftp/<username> |
添加用户可以使用的命令:
1 2 3 4 |
cp -v /bin/ls /data/staffUpload/bin/ cp -v /bin/date /data/staffUpload/bin/ cp -v /bin/mkdir /data/staffUpload/bin/ # 更多命令请自行复制 |
检查以上命令的共享库并将它们移到 chroot 的库目录中:
1 2 |
ldd /bin/ls cp -v /lib64/{libselinux.so.1,libcap.so.2,libacl.so.1,libc.so.6,libpcre.so.1,libdl.so.2,ld-linux-x86-64.so.2,libattr.so.1,libpthread.so.0} /data/staffUpload/lib64/ |
强制用户sftp登录:
在/etc/ssh/sshd_config用户Match位置添加如下参数:
1 |
ForceCommand internal-sftp |
1 |
systemctl restart sshd |
测试 SSH chroot 是否成功
因为我禁止用户ssh登录,所以只能通过FTP软件登录来测试,登录后如果不能进入其他文件夹则表示设置成功。如果未禁止ssh登录,用户也无法跳出当前目录,而且只能执行 bash 以及它内置的命令,如pwd、history、echo等。
原创文章禁止转载:技术学堂 » Linux中通过chroot为SFTP用户指定访问目录