为一个服务器创建一个只能使用sftp,并且限定目录在某个子目录的用户。为了之后方便,设置一个用户组,之后添加用户到这里面即可。
首先,肯定是要个用户的,并且为了限制他登录,需要设置为nologin,尝试过后得到此参数可以限制。(并且需要注意的是,在允许的shell类型中需要加入/sbin/nologin)
sudo vim /etc/shells
-g设定用户组,-d设定登录路径,详情查看菜鸟教程
sudo groupadd sftpUser
sudo useradd -d /home/sftpUser -s /sbin/nologin -g sftpUser tyyh
sudo passwd tyyh # 改个密码
sftp是ssh的子模块,需要在其中修改参数,我使用cp进行备份。
Match User tyyh:这行配置用于匹配用户名为"tyyh"的用户。如果要匹配多个用户,可以使用逗号分隔不同的用户名。或者直接Match Group
"ForceCommand internal-sftp" 是一个 OpenSSH(开放式安全外壳协议)的配置选项。它用于限制通过 SSH 连接访问服务器的用户仅能使用 SFTP(SSH 文件传输协议)进行文件传输,而不能执行任何其他命令。
ChrootDirectory /home/sftpUser:这行配置使用chroot将指定用户的根目录限制为/home/sftpUser。
X11Forwarding no:这行配置禁止用户使用X11转发功能,这意味着用户无法在SFTP会话中打开图形界面应用程序。
AllowTcpForwarding no:这行配置禁止用户进行TCP端口转发。这样,用户无法通过SFTP会话在服务器上进行端口转发操作。
cd /etc/ssh
sudo cp -p sshd_config sshd_configbak1018
sudo vim sshd_config
----------------------------
注释: #Subsystem sftp /usr/libexec/openssh/sftp-server
并加上:
Subsystem sftp internal-sftp #指定使用sftp服务使用系统自带的internal-sftp,如果不添加,用户无法通过sftp登录。
并且在文件的末尾加入如下参数,其中特别要注意的是(使用chrootDirectory的这个目录,需要设定为root用户组权限,并且这个参数的先后顺序挺重要的,不然配置无法修改,跟后面的某些参数冲突)
Match User tyyh
ChrootDirectory /home/sftpUser
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
cd /home
mkdir sftpUser
sudo chown -R root:root ./sftpUser/
sudo chmod -R 755 ./sftpUser/
cd sftpUser/
mkdir fileStore
sudo chown tyyh:sftpUser fileStore/
sudo chmod 777 fileStore/
service sshd restart
配置修改成功:
sftp路径:
查看syslogfacility可得到我们的具体日志路径,大概在/var/log/%syslogfacility里
如我的日志就在路径:/var/log/authpriv.log
特别是权限问题,卡了我很久,sshd_config中的ChrootDirectory没想到居然要root权限才能正常使用,否则ssh和sftp都会报错。对于linux的权限还是要多多注意。
修改配置后发现报错,修改配置失败:
Restarting sshd (via systemctl): Job for sshd.service failed because the control process exited with error code.
根据报错指引查看status:
上网查询得到结果后修改添加位置后能正常修改配置:
然后重新发现问题:
配完配置后,该用户的ssh,sftp出问题,所以一个一个排查问题:
将shell类型改为正常,并且删除sshd配置文件中对该用户组的配置:
可以正常登录,但是没有完成限制
编辑
将shell改为nologin:
毫无变化,照样可以sftp登录,可以确认是在配置中的配置参数有误。测试了可以得到所有能看到的文件:
发现无法使用ssh登录,所以设置了nologin后,用户无法使用ssh登录?
加上参数可以正常使用:
Match User tyyh
X11Forwarding no
AllowTcpForwarding no
PermitTTY no
ForceCommand internal-sftp
发现加上了设定目录之后就登录不上了:
得到错误根源,感觉应该是权限设置问题,导致进去没权限?
然后才发现是因为我本来为了方便进这个目录,将其设置为了当前用户的目录,现在设置为root:root即可得到正确结果: