环境:Ubuntu 14.04.5 LTS
前提:sftp采用的是ssh加密隧道,安装性方面较ftp强,而且依赖的是系统自带的ssh服务,不像ftp还需要额外的进行安装
需求:创建用户,并指定该用户专属的目录,该目录下用户权限为只读。并指定该目录下的某个子目录用户权限为读写
添加用户
一、创建用户组testgroup
groupadd testgroup
二、创建用户testuser并加入用户组testgroup。-g testgroup
的作用是加入testgroup用户组。-s /bin/bash
的作用是设置用户的shell。如果配置为-s /bin/false
,则用户没有shell,用户无法ssh登录也无法sftp登录。
useradd -g testgroup -s /bin/bash testuser
三、为用户配置密码
passwd testuser
四、为用户配置专属目录。mkdir -p /home/foo/bar
的作用是生成用户专属目录/home/foo以及用户有写权限的目录/home/foo/bar。-d /home/foo
的作用是配置该用户的home目录为/home/foo。所以其实所谓的专属目录,就是该用户的home目录
mkdir -p /home/foo/bar usermod -d /home/foo testuser
五、为目录设置权限。首先,为了使上述该用户专属目录对该用户只读,同时便于管理员管理,我们设置该目录所有者为管理员本身root,并设置权限为rwxr-xr-x
。同时为了使该目录中的bar子目录对该用户可写,我们设置该子目录所有者为testuser,并设置权限为rwxr-xr-x
chown root:root /home/foo chmod 755 /home/foo chown testuser:testgroup /home/foo/bar chmod 755 /home/foo/bar
配置ssh
一、修改ssh守护进程配置文件。首先vim /etc/ssh/sshd_config
编辑该文件,然后通过#
注释掉其中的Subsystem sftp /usr/libexec/openssh/sftp-server
,再在末尾添加如下内容:
Subsystem sftp internal-sftp Match Group testgroup ChrootDirectory /home/foo ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no
其中AllowTcpForwarding
设置为no
的作用是,让用户只能通过sftp登录,而不能通过ssh登录
二、重启ssh
sudo service ssh restart
测试
ssh [email protected]
输入密码后,会无法进入ssh,并且返回错误:This service allows sftp connections only.
继续尝试以sftp模式登陆:
sftp [email protected]
输入密码后,成功连上sftp,自动进入了/home/foo目录。可读取目录及下载文件。试着往/home/foo目录上传文件,发现没有权限。进入/home/foo/bar目录后继续尝试上传文件,发现上传成功。测试通过
附录
linux下面的权限是这样表示的(通过ls -ltr 可列出):
d|rwx|rwx|rwx
第一个d 表示是一个目录,如果是文件,则是-
后面的三段分别表示:
第一段是指 owner 属主的读、写、执行权限
第二段是指 group 的读、写、执行权限;
第三段是指 other 的读、写、执行权限
r=4 w=2 x=1
可以使用 chmod 754 /foo/bar
则可将bar目录的权限变成:
drwxrw-r–
即目录所有者具有读写执行权限,同组人员具有读写无执行权限,其他人只有读的权限。
参考文献
https://www.cnblogs.com/reachos/p/11157329.html
https://www.cnblogs.com/pengyunjing/p/8543026.html
https://www.cnblogs.com/pu20065226/p/10962906.html
https://www.cnblogs.com/sea-stream/p/10732847.html
https://askubuntu.com/questions/134425/how-can-i-chroot-sftp-only-ssh-users-into-their-homes