目标
1. 授权网站开发人员使用 sftp 上传项目文件
2. 必须使用密钥方式,去掉密码验证方式
3. 简单起见,全部放在 /var/www 目录下
4. 熟练之后,可以在继续修改 sshd 配置文件指定到具体的子目录下
5. 我们的人员不多,采用对每一个账号分别设置的方法
6. 是否使用组策略方式更方便,目前不熟练!以后再处理
大概思路和步骤
1. 创建 sftp 账户 (假设名字:sftp123)
2. 复制管理员的 .ssh 目录到这个 sftp 账户的 home 下(/home/sftp123)
3. 修改 /home/sftp123/.ssh 目录的所有者为 sftp123
4. 修改 authorized_keys 文件,只保留管理员和 sftp123 的 publickey
5. 修改 sshd 配置,限制 sftp123 的目录和命令权限
** 以下必须有root权限的管理员账号来操作,假设 dhbm
1、创建 sftp 账户
sudo adduser sftp123
禁止 sftp 账户 shell 登录
sudo usermod -s /usr/sbin/nologin sftp123
2、创建 sftp 账户的密钥文件夹和文件
直接从管理员 cp
sudo cp -R /home/dhbm/.ssh /home/sftp123
改变 .ssh 目录的拥有者
sudo chown -R sftp123:sftp123 /home/sftp123/.ssh
改变 .ssh 目录属性
sudo chmod -R 755 /home/sftp123/.ssh
只保留管理员和 sftp123 的 publickey
cd /home/sftp123/.ssh
ls
authorized_keys id_rsa id_rsa.pub
sudo vim authorized_keys
sudo systemctl restart sshd
** 如果只操作到这里,sftp123 是可以ssh 登录到服务器的
3、设置 sshd_config ,限制 sftp123 目录和命令权限
sudo vim /etc/ssh/sshd_config
文件最后已经有一个 Example of overriding settings,在最后追加
# add by wzh 20190122 only SFTP users
# only in /var/www
# 告诉SSH服务器仅将以下命令应用于指定的用户
Match User sftp123
# 强制SSH服务器在登录时运行SFTP服务器,禁止shell访问
ForceCommand internal-sftp
# 允许此用户进行密码验证
PasswordAuthentication no
# 只允许访问这个目录
ChrootDirectory /var/www
# 不允许端口转发
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
保存退出后 sudo systemctl restart sshd
4、验证 sftp123
1. ssh sftp123@192.168.1.192
返回结果:
sftp123@192.168.1.192's password:
This service allows sftp connections only.
Connection to 192.168.1.192 closed.
2. sftp sftp123@192.168.1.192
返回结果
Connected to sftp123@192.168.1.192.
sftp>
3. FileZilla 建立一个站点,如下图
连接成功
5、重复以上步骤,再来一个 sftp456
发现问题:
测试发现,sftp123,sftp456 在本地是可以登录的,说明没有完全限制到 Shell
继续学习,找找怎么回事?
6、去掉用户的 shell 权限
以下两种方式都可以去掉用户的 shell 权限
sudo usermod -s /bin/false sftp456
sudo usermod -s /usr/sbin/nologin sftp123
登录时,返回一个错误状态,然后立即退出
** 在 useradd 的时候直接加上 shell 限制,就不会有这个问题了!
sudo adduser sftp789 --shell /bin/false
继续复习一次 sftp789
7、 错误处理
sftp sftp123@192.168.1.161
返回错误:
packet_write_wait: Connection to 192.168.1.161 port 22: Broken pipe
Connection closed
以上操作先在 ubuntu 18.04 下操作的,没有发现问题
但是回到 ubuntu 16.04 Server ,出现以上错误!
1. 按照网上的建议,/var/www 目录拥有者都是 root ,但是 SFTP 上传一个文件之后,文件当然属于 sftp456 了!
sudo chown -R root:root /var/www
sudo chmod 755 /var/www
*** 删除了刚刚上传的文件!还是一样的问题啊!
2. 按照以上操作设置,一条一条的加上去,最后 PasswordAuthentication 这一条加上就出错!
再删除这一条,也不行!
# add by wzh 20190122 only SFTP users
# only in /var/www
Match User sftp123
ForceCommand internal-sftp
ChrootDirectory /var/www
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
PasswordAuthentication no
3. 只能删除掉 Match User 这一段之后,重新来过!
再加上的时候,不要 PasswordAuthentication no z h这一行!
重新来过!发现问题还在 /var/www 这个目录的拥有者问题
sudo rm -rf /var/www
sudo mkdir /var/www
之后,sftp 立刻就正常了!
那么上传文件之后,怎么办?
4、使用 adduser 加上的账号,会自动建立 /home/XXXX ,但是该目录属于XXX:XXX
将它改成 root:root
5、经过多次尝试,最终问题还是在 ChrootDirectory 目录的权限上
8、重新列举整个操作过程(重新做一个 sftp193)
sudo adduser sftp193
sudo cp -R /home/dhbm/.ssh /home/sftp193
sudo chown -R sftp193:sftp193 /home/sftp193/.ssh
sudo chown -R root:root /home/sftp193
sudo chown -R sftp193:sftp193 /home/sftp193/.ssh
sudo chmod -R 755 /home/sftp193/.ssh
sudo chmod -R 755 /var/www/
测试SSH:
ssh -p 3193 sftp193@192.168.1.193
返回错误
This service allows sftp connections only.
Connection to 192.168.1.193 closed.
测试SFTP:
sftp -P 22 sftp193@192.168.1.193
在 /var/www/ 建立几个测试目录
sudo chmod -R 777 /var/www/test
sudo chmod -R 777 /var/www/test.XXXX.cn
sudo chmod -R 777 /var/www/html
** 本来还做了按照组和成员分别控制的操作,直接贴出来我参考的博文
** 我是完全照着该篇文章走了一遍之后,才得到最终的解决办法的!谢谢这位朋友!
** 不过,文章中很多命令都没有空格分开!