前言
之前使用VSCode的SFTP插件一直用的是FTP,这次想尝试使用SFTP用基于密匙的方式来向服务器传输文件,并且需要限制用户的访问目录。
同时想让SFTP上传的文件让Nginx和PHP-FPM也能访问修改(虽然直接把网站目录的权限设置成777也能更方便的解决,但不是很想这样操作)。
思路
由于Laravel(PHP的框架)会产生日志等文件,又需要使用SFTP来下载或修改这些日志。并且SFTP上传的文件可能也会被Laravel所使用。所以如果能让SFTP的用户和Laravel所使用的用户一样,就可以不用担心权限问题。而Laravel生成文件的用户即是PHP-FPM的配置用户(默认为nobody),同时Nginx的默认用户也是nobody。
所以只需要把网站目录的相关文件的用户和用户组修改成nobody,并且用nobody去登录SFTP就能解决了。
说明:同样的思路,如果你不想使用nobody,换成其他的也行。
配置
服务端
由于nobody是伪用户,所以需要先给其创建个家目录,以便存放客户端的公匙。
# 1、手动创建.ssh目录
# 因为nobody是伪用户没有家目录,所以先要配置一下
# 家目录位置,看自己习惯就好
mkdir /var/empty/nobody
# 修改权限
chown nobody:nobody /var/empty/nobody
chmod 700 /var/empty/nobody
# 在passwd中手动改下家目录的位置,用命令修改不了,因为nobody用户已经是登录状态。
vi /etc/passwd
---
nobody:x:65534:65534:Kernel Overflow User:/var/empty/nobody:/sbin/nologin
# 进入目录,用nobody身份操作
cd /var/empty/nobody
su -s /bin/bash nobody # 切换身份
mkdir .ssh
# 2、添加公匙
echo 客户端的公匙 >> .ssh/authorized_keys
# 3、切换回root
exit
然后修改配置文件,把用户限制在指定目录下面
vi /etc/ssh/sshd_config
---
# 这个一定要放在Match前面,不然root用户不能登录
PermitRootLogin yes
Subsystem sftp internal-sftp
Match User nobody # 配置nobody用户
ChrootDirectory /var/www # 限制访问目录的上一级目录,这个目录的所有权只能是root:root
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp -d /test # 限制访问目录 完整的就是:/var/www/test
重启服务即可
systemctl restart sshd
客户端
客户端使用的是VSCode的SFTP插件
注意:这个插件被翻新了一版,之前的被废弃了我使用的新的,可能配置会有稍微的不同。
{
"name": "test",
"host": "192.168.137.137",
"protocol": "sftp",
"port": 22,
"username": "nobody",
"privateKeyPath": "C:\\Users\\xxx\\.ssh\\id_rsa", // 私匙的存放位置
"uploadOnSave": false,
"useTempFile": false,
"openSsh": true
}
结语
至此就能以nobody的身份上传下载文件,并且与框架自身产生的文件的权限不会冲突。