sftp 配置

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

你可能感兴趣的:(sftp 配置)