目标

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 建立一个站点,如下图

sftp密钥连接java sftp 密钥_服务器

连接成功

sftp密钥连接java sftp 密钥_sed_02

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

** 本来还做了按照组和成员分别控制的操作,直接贴出来我参考的博文
** 我是完全照着该篇文章走了一遍之后,才得到最终的解决办法的!谢谢这位朋友!
** 不过,文章中很多命令都没有空格分开!