Linux 系统默认安装了Openssh,sftp作为其中的一个组件也默认安装。我们获取private key之后可以直接sftp连接并使用,不需要修改默认配置。
我们修改sftp配置的目的是:限制特定用户只能在特定目录的访问。比如:用户UserA,只能读取/data/usera,可以上传文件到/data/usera/upload。
实操过程:
测试环境:Azure VM, redhat 7.4
用户部分
创建用户
useradd -s /sbin/nologin sftpuser
设置用户密码
passwd sftpuser
创建sftp根目录,更改所有者和权限(这是sftp服务的特殊需求,必须这么改)
mkdir /home/sftpuser
chown root /home/sftpuser
chmod 755 /home/sftpuser
[注意]必须是root,权限最大是755,也可以改成750
创建上传文件夹,改owner
mkdir /home/sftpuser/upload
chown sftpuser /home/sftpuser/upload
chmod 755 /home/sftpuser/upload
sshd部分
配置sshd_config
vi /etc/ssh/sshd_config
修改内容如下:
Subsystem sftp /usr/libexec/openssh/sftp-server ## 这一行注释掉
文件底部添加下面内容:
Subsystem sftp internal-sftp
Match User sftpuser
ChrootDirectory /home/sftpuser
ForceCommand internal-sftp
PasswordAuthentication yes
PermitTunnel no
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
重启ssh服务
systemctl restart sshd
测试
sftp sftpuser@localhost
在用户登录测试过程中,可能会遇到如下错误:
Couldn't read packet: Connection reset by peer
可能是目录权限导致了该问题, 例如 /a/b/c 每一级目录owner都是root,不仅仅是最后一级目录。
特殊需求
如果sftp 定义的主目录跟其他账号共用,直接改这个目录的owner会导致原账号不能用。
解决办法:使用setfacl 命令,设置一个目录有多个owner,都有读写权限。例如:
setfacl -R -m d:u:UserA:rwx /home/sftpuser
[注] ACL 权限控制主要目的是提供传统的 owner,group,other 的 read,wirte,execute 权限之外的具体权限设置,ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,比如:某一目录权限为
drwx------ 2 root root 4096 03-10 13:51./acldir
用户 user 对此目录无任何权限因此无法进入此目录,ACL 可单独为用户 user 设置这个目录的权限,使其可以操作这个目录
如果还不行,就只考虑upload目录,把它link 到UserA的工作目录:
mkdir /home/sftpuser/upload
chown sftpuser /home/sftpuser/upload
chmod 755 /home/sftpuser/upload
setfacl -R -m d:u:UserA:rwx /home/sftpuser/upload
ln -s /home/sftpuser/upload /home/UserA/upload
这样,两个账号就都可以对upload目录操作。
[注] 反过来不行,即UserA的所有者目录,通过setfacl 给sftpuser 加权限,但sftp服务不能识别。
还可以扩大目录权限到777,不用setfacl,这样也可以,具体如下。
mkdir /home/sftpuser/upload
chown sftpuser /home/sftpuser/upload
chmod 777 /home/sftpuser/upload
ln -s /home/sftpuser/upload /home/UserA/upload
网友评论