Ubuntu搭建SFTP服务器笔记
说明:server01为sftp服务端;client01为客户端
【在server01上操作】
1、强力卸载openssh-server
apt-get remove --purge openssh-server
2、安装openssh-server
1)更新apt-get 源
apt-get update
2)安装openssh-server
apt-get install openssh-server
【在client01上操作】
3、使用 root ssh登录测试
ssh root@server01
可能会出现失败(注意:如果ssh root@server01失败,可以使用以下方法查看详细登录过程中的LOG)
ssh -v root@server01
1)失败:Warning: Remote host identification has changed!
失败原因:由于在ssh登录时,server01会发送给client01一份sever01的publickey,此publickey和client01之前记录的publickey不符时,就会引发以上报错。
解决方案:将client01机上的Known_hosts中记录的server01的 publickey删除即可。
2)失败:root登录时报Permission denied, please try again。
问题原因:是由于sshd黙认root ssh登录是不启用的。
解决方案:vim /etc/ssh/sshd_config 中 PermitRootLogin yes
建议:出于安全考虑,不要启用root ssh登录,另外创建一个admin用于管理,支持ssh登录即可。
修改 /etc/ssh/sshd_config:
PermitRootLogin no 禁止root用户
3)失败:Privilege separation user sshd does not exist
失败原因:可能是passwd文件无sshd用户
解决方案:修改/etc/passwd文件,在其中加入 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
4、创建SSH管理用户
useradd -m admin
添加用户同时创建/home下用户目录
groupadd admingrp
usermod -G admingrp admin
5、SSH支持二种登录方式
1)密码验证登录
修改 /etc/ssh/sshd_config:
PasswordAuthentication yes
ssh admin@server01
注:如果报错参考 ”3、使用 root ssh登录测试“ 中关于失败的处理方法
注:因SSH的publish key和private key都是自己生成的,没法公证。只能通过Client端自己对公钥进行确认。通常在第一次登录的时候,系统会出现下面提示信息:
The authenticity of host 'ssh-server.example.com (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
上面的信息说的是:无法确认主机ssh-server.example.com(12.18.429.21)的真实性,不过知道它的公钥指纹,是否继续连接?
之所以用fingerprint代替key,主要是key过于长(RSA算法生成的公钥有1024位),很难直接比较。所以,对公钥进行hash生成一个128位的指纹,这样就方便比较了。
如果输入yes后,会出现下面信息:
Warning: Permanently added 'ssh-server.example.com,12.18.429.21' (RSA) to the list of known hosts.
Password: (enter password)
2)密钥验证登录(基于公钥认证)
修改 /etc/ssh/sshd_config:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
在上面介绍的登录流程中可以发现,每次登录都需要输入密码,很麻烦。SSH提供了另外一种可以免去输入密码过程的登录方式:公钥登录。流程如下:
首先:Client将自己的公钥存放在Server上,追加在文件authorized_keys中。
添加方法1: ssh-copy-id admin@server01
方法1:会在server01的 /home/admin/.ssh/ 下生成一个authorized_keys文件,并且会将client的id_rsa.pub(公钥)内容存放到此文件中。
添加方法2:scp client01/id_rsa.pub admin@server01:~/.ssh/authorized_keys
方法2:会在server01的 /home/admin/.ssh/ 下生成一个authorized_keys文件,并且会将client的id_rsa.pub(公钥)内容存放到此文件中。
ssh admin@server01
因为PubkeyAuthentication优先级高于PasswordAuthentication,所以执行以上SSH连接时,不会提示输入密码,进入登录成功。(以达到免密登录)
具体流程如下:
=》Server端接收到Client的连接请求后,会在authorized_keys中匹配到Client的公钥pubKey,并生成随机数R,用Client的公钥对该随机数进行加密得到pubKey(R),然后将加密后信息发送给Client。
=》Client端通过私钥进行解密得到随机数R,然后对随机数R和本次会话的SessionKey利用MD5生成摘要Digest1,发送给Server端。
=》Server端会也会对R和SessionKey利用同样摘要算法生成Digest2。
=》Server端会最后比较Digest1和Digest2是否相同,完成认证过程。
6、SFTP登录
sftp的登录方式和ssh是保持一致,因此如下命令即可登录成功(免密登录)
sftp admin@server01
7、启用指定的sftpuser登录,并指定到固定目录,不可跳出此目录
添加以下配置到 /etc/ssh/sshd_config:
Match group sftp #group sftp 只能进行sftp登录
ChrootDirectory /data/sftp/
注意:
从ChrootDirectory指定的目录开始一直往上,到系统根目录为止的目录拥有者必须是root用户。
从ChrootDirectory指定的目录开始一直往上,到系统根目录为止都不可以具有群组写入权限。
注意踩坑点:配置 ChrootDirectory /sftp 必须在这个 Match group sftp 配置后面 不然重启sshd后登录所有账号都报错:/bin/bash: No such file or directory
X11Forwarding no #禁止X11转发
AllowTcpForwarding no #禁止tcp转发
# PermitTTY no
ForceCommand internal-sftp #指定sftp命令,不能ssh连接
ChrootDirectory /sftp #指定用户被锁定到的那个目录,为了能够chroot成功,该目录必须属主是root,并且其他用户或组不能写
~~~~~~~~~~~~~~~【sftp登录小结】~~~~~~~~~~~~~~
目标:
1、指定已用户只能通过sftp访问,不能通过SSH登陆,并锁定在特定的目录下
2、遇到的问题:
修改/etc/ssh/sshd_config配置文件重启sshd导致其他用户登录报错:/bin/bash: No such file or directory
解决方案:
1、建立SFTP用户组
groupadd sftp
2、建立sftp用户
useradd -d /home/sftpuser -m -s /bin/false -g sftp sftpuser
3、设置密码
passwd sftpuser
4、创建指定sftp目录
mkdir /data/sftp
5、备份ssh配置文件并修改
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_back
vi /etc/ssh/sshd_config
1)注释该行,添加新配置
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
2)打开注释
# Example of overriding settings on a per-user basis
#Match User was #指定单用户的话使用这个配置,是使用的是用户组
Match group sftp
X11Forwarding no #禁止X11转发
AllowTcpForwarding no #禁止tcp转发
# PermitTTY no
ForceCommand internal-sftp #指定sftp命令,不能ssh连接
ChrootDirectory /data/sftp #指定用户被锁定到的那个目录,为了能够chroot成功,该目录必须属主是root,并且其他用户或组不能写
注意踩坑点:配置 ChrootDirectory /data/sftp 必须在这个 Match group sftp 配置后面 不然重启sshd后登录所有账号都报错:/bin/bash: No such file or directory
一般出现问题会在ChrootDirectory directory上,这个目录的用户和用户组必须是root:root,在这个目录下建对应sftp账号的目录并给这个用户相应权限
如:
chown root:root /data/sftp/
chmod 755 /data/sftp/
6、重启SSH服务
service sshd restart
7、验证
ssh登录验证
~~~~~~~~~~~~~~~【sftp登录失败原因汇总】~~~~~~~~~~~~~~
1、失败1:
解决方案:
1)、查看 /etc/ssh/sshd_config 中 ChrootDirectory的配置目录是否存在
2)、查看对应目录如果存在,从ChrootDirectory指定的目录开始一直往上,到系统根目录为止的目录拥有者必须是root用户;从ChrootDirectory指定的目录开始一直往上,到系统根目录为止都不可以具有群组写入权限。
2、失败2: