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:

 

posted on 2023-04-19 17:49  lzlvv  阅读(815)  评论(0编辑  收藏  举报

导航