一 前言

  • 实验机器腾讯云,centos
  • sftp是在ssh上支持ftp功能,相对于ftp增加了rsa等非对称加密,私密性更良好,但是传输速率上低于ftp。
  • sftp基于ssh则需要客户端将公钥放置ssh的公钥信任列表。默认位置位 .ssh/authorized_keys,加入客户端公钥即可登录ssh

二 准备

# 添加用户组
groupadd 用户组名
# 删除用户组
groupdel 用户组名

# 添加用户
useradd 用户名
-g 用户组   # 用户名归于用户组
-s<shell>  # 指定登录后使用的shell   /bin/false 不允许登录  /bin/nologin 不允许非root登录
-m         # 自动创建用户登录目录
-M         # 不自动创建用户目录
-d         # 指定用户登录家目录

# 删除用户
userdel 用户名

# 为已有用户添加配置
usermod 用户名
-g 用户组   # 用户名归于用户组
-s<shell>  # 指定登录后使用的shell   /bin/false 不允许登录  /bin/nologin 不允许非root登录
-m         # 自动创建用户登录目录.    /home/用户名
-M         # 不自动创建用户目录
-d         # 指定用户登录家目录

# 授权文件权限
chmod mode file...
-R  其和所有子目录
+   添加权限
-   扣除权限
mode 如下图  777表示所有用户所有组有所有权限

# 授权
chown user[:group] file...
-R  其和所有子目录
user 新文件的所有者
group 新文件的所有者使用组
file  root授权给user:group的文件

SFTP公钥认证流程_sftp

SFTP公钥认证流程_SFTP公钥认证流程_02

三 配置sftp

step1: 检查ssh版本

备份配置,以防没有后路

# ssh版本
ssh -V
#OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
# 备份sshd_config
cp  /etc/ssh/sshd_config /etc/ssh/sshd_config.back

step2: 配置ssh对sftp配置

# 1.修改配置
vim /etc/ssh/sshd_config
# 注释
#Subsystem sftp /usr/libexec/openssh/sftp-server
# 末尾新增
Subsystem sftp internal-sftp      # ssh子模块使用sftp
        Match group sftp          # 匹配用户组 sftp
        ChrootDirectory %h        # 指定活动目录为 %h用户家目录 %u表示用户名
        X11Forwarding no          # 不予许X11转发
        AllowTcpForwarding no     # 不允许TCP转发
        ForceCommand internal-sftp # 强制执行内部sftp

# 2. 保存配置
ESC :wq ENTER

# 3. 重启sshd 
service sshd restart

step3: 创建sftp组和用户

注意 此步骤非常关键,主要限制限制sftp用户不使用root权限,与配置中的配置对应。否则将会提示没有权限。

# 1.添加用户组
groupadd sftp

# 2.添加sftp用户
useradd -d /home/zyj -m -g sftp -s /bin/nologin zyj
# zyj 创建用户zyj 
# -g sftp 属sftp组 
# -m 创建/home/zyj
# -d 活动目录/home/zyj
# -s /bin/nologin 不使用root登录

# 3.用户sftp目录授权(此部非常重要!!!)
# sftp主目录必须是root权限,用户的子目录必须是用户权限
chown root:sftp /home/zyj
# 将/home/zyj下所有目录权赋予sftp组zyj用户
chown zyj:sftp /home/zyj/
# 将 /home/zyj 设置为zyj可读可写 sftp组可读 其他用户可读
chmod -R 744 /home/zyj

四 测试sftp

0.sftp根目录

[root@VM-20-9-centos ~]# ls -la /home/zyj
总用量 12
drwxr-xr-x. 3 root sftp 4096 12月  3 23:13 .
drwxr-xr-x. 5 root sftp 4096 12月  3 21:56 ..
-rwxr-xr-x. 1 zyj sftp    0 12月  3 23:12 untitled 2.txt
-rwxr-xr-x. 1 zyj sftp    0 12月  3 23:13 untitled 3.txt
-rwxr-xr-x. 1 zyj sftp    0 12月  3 23:13 untitled 4.txt
drwxr-xr-x. 2 zyj sftp 4096 12月  3 23:12 untitled folder
-rwxr-xr-x. 1 zyj sftp    0 12月  3 23:10 untitled.txt

1.使用客户端连接

SFTP公钥认证流程_用户名_03


SFTP公钥认证流程_centos_04


2.使用命令行

sftp 用户名@主机ip

Connected to 主机ip.
sftp> ls
untitled 2.txt      untitled 3.txt      untitled 4.txt      untitled folder
untitled.txt

五 常见问题

1. Connection to **** port ****: Broken pipe错误

[root@VM-20-9-centos ~]# ls -la /home/zyj
总用量 12
drwxr-xr-x. 3 root sftp 4096 12月  3 23:13 .
drwxr-xr-x. 5 root sftp 4096 12月  3 21:56 .. 
-rwxr-xr-x. 1 zyj sftp    0 12月  3 23:12 untitled 2.txt //此处必须是zyj拥有权限

解决方法: step3 创建sftp组和用户

2. Connection to xxx closed by remote host错误

[root@VM-20-9-centos ~]# ls -la /home/zyj
总用量 12
drwxr-xr-x. 3 root sftp 4096 12月  3 23:13 .
drwxr-xr-x. 5 root sftp 4096 12月  3 21:56 .. //此处必须是root权限 对应 ChrootDirectory中配置的目录
-rwxr-xr-x. 1 zyj sftp    0 12月  3 23:12 untitled 2.txt

解决方法: step3 创建sftp组和用户