[步骤] SFTP 安全 (多用户免密码登录)

注意:

在设置多用户免密码登录 SFTP 之前要先搭建 SFTP

正文:

步骤一:指定 SFTP 公钥的存放位置

1.1 修改 /etc/ssh/sshdsftp_config 配置文件

# vim /etc/ssh/sshdsftp_config

并将部分内容修改如下:

......
Subsystem       sftp    internal-sftp -l VERBOSE -f LOCAL3
Match LocalPort 2222
Match Group sftp
ChrootDirectory /%u
AuthorizedKeysFile /etc/ssh/authorized_keys/%u/.ssh/authorized_keys
ForceCommand    internal-sftp -m 770
AllowTcpForwarding no
X11Forwarding no


补充:
1) 这里以将:
SFTP 的端口设置为 2222
SFTP 用户可以进入的目录只能为 /<user>
SFTP 用户存放的公钥的文件为 /etc/ssh/authorized_keys/<user>/.ssh/authorized_keys
SFTP 上传的文件默认权限是 770 (-m 770 参数也可以使用 -u 770 替代,但是 -u 参数有时候会不起作用)
为例
2) 其它配置方案可以参考

SFTP 的配置案例

(注意:当使用 %u 参数来保证不通的用户使用不通的 SFTP 目录时,用户名为 user_a 、user_b、user_c 的用户可能会使用同一个名为 user 的目录)

1.2 让限制 SFTP 用户可以进入的目录的设置生效

# systemctl restart sshdsftp

步骤二:创建 /etc/ssh/authorized_keys 目录

2.1 进入 /etc/ssh/ 目录

# cd /etc/ssh/

2.2 创建 /etc/ssh/authorized_keys 目录

# mkdir authorized_keys

2.3 更改 /etc/ssh/authorized_keys 目录的所属主和所属组

# chown root:root authorized_keys

2.4 更改 /etc/ssh/authorized_keys 目录的权限

# chmod 755 authorized_keys

步骤三:创建 /etc/ssh/authorized_keys/<user>/ 目录

3.1 进入 /etc/ssh/authorized_keys 目录

# cd authorized_keys

3.2 创建 /etc/ssh/authorized_keys/<user>/ 目录

# mkdir sftpuser

3.3 更改 /etc/ssh/authorized_keys/<user>/ 目录的所属主和所属组

# chown sftpuser:sftpuser sftpuser

3.4 更改 /etc/ssh/authorized_keys/<user>/ 目录的权限

# chmod 755 sftpuser

步骤四:创建 /etc/ssh/authorized_keys/<user>/.ssh 目录

4.1 进入家目录

# cd <user name>

4.2 创建 /etc/ssh/authorized_keys/<user>/.ssh 目录

# mkdir .ssh

4.3 更改 /etc/ssh/authorized_keys/<user>/.ssh 目录的所属主和所属组

# chown sftpuser:sftpuser .ssh

(补充:这里用户名是 sftpuser 主组名是 sftpuser 为例)

4.4 更改 /etc/ssh/authorized_keys/<user>/.ssh 目录的权限

# chmod 700 .ssh

步骤五:创建 /etc/ssh/authorized_keys/<user>/.ssh/authorized_keys 文件

5.1 进入 /etc/ssh/authorized_keys/<user>/.ssh 目录

# cd .ssh

5.2 创建 /etc/ssh/authorized_keys/<user>/.ssh/authorized_keys 文件

# touch authorized_keys

5.3 更改 /etc/ssh/authorized_keys/<user>/.ssh/authorized_keys 文件的所属主和所属组

# chown sftpuser:sftpuser authorized_keys

(补充:这里用户名是 sftpuser 主组名是 sftpuser 为例)

5.4 更改 /etc/ssh/authorized_keys/<user>/.ssh/authorized_keys 文件的权限

# chmod 600 authorized_keys

(补充:在本文步骤二中的 authorized_keys 文件也可以通过使用 ssh-copy-id 命令创建以后拷贝到 /etc/ssh/authorized_keys/<user>/.ssh/ 目录下)

步骤六:复制 SSH 公钥

# vi authorized_keys

将 SSH 公匙复制于此

(步骤略)

(补充:在本文步骤五和步骤六中 authorized_keys 文件也可以通过以 ssh-copy-id 命令创建以后拷贝到 /etc/ssh/authorized_keys/<user>/.ssh/ 目录下)

参考文献:

https://access.redhat.com/solutions/3787571

[命令] SFTP 常用命令

内容一:SFTP 显示相关

1.1 显示目录或文件

1.1.1 显示远程的目录或文件
sftp> ls
1.1.2 显示本地的目录或文件
sftp> lls

1.2 显示目录路径

1.2.1 显示远程目录路径
sftp> pwd
1.2.2 显示本地目录路径
sftp> lpwd

1.3 显示协议版本

sftp> version

1.4 显示帮助信息

sftp> help

内容二:SFTP 目录相关

2.1 创建目录

2.1.1 创建远程目录
sftp> mkdir <directory>
2.1.2 创建本地目录
sftp> lmkdir <directory>

2.2 删除目录

2.2.1 删除远程目录
sftp> rmdir <directory>
2.2.2 删除本地目录
sftp> lmkdir <directory>

2.3 修改目录下

2.3.1 修改目录的所属主
sftp> chown <user> <directory>
2.3.2 修改目录的所属组
sftp> chgrp <group> <directory>
2.3.3 修改目录权限
sftp> chmod <privilege> <directory>

2.4 进入目录

2.4.1 进入远程目录
sftp> cd <directory>
2.4.2 进入本地目录
sftp> lcd <directory>

内容三:SFTP 文件相关

3.1 删除文件

3.1.1 删除远程文件
sftp> rm <file>
3.1.2 删除本地文件
sftp> lrm <file>

3.2 移动文件

移动远程文件

sftp> mv <file>

内容四:上传和下载

4.1 从远程下载文件到本地
sftp> get <file>
4.2 从本地上传文件到远程
sftp> put <file>

内容五:SFTP 管理相关

退出 SFTP

sftp> exit

或者:

sftp> quit

[排错] 解决 SFTP 登录时报错 “client_loop: send disconnect: Broken pipe ……”

报错代码

client_loop: send disconnect: Broken pipe
Connection closed.  
Connection closed

分析

SFTP 目录的所属主必须是 root,权限最高只能是 755,否则就算此目录的所属主是此 SFTP 用户也会报错

解决方法

步骤一:将 SFTP 目录的所属主设置为 root

# chown root: <sftp directory>

步骤二:将 SFTP 目录的权限设置为 755

# chmod 755 <sftp directory>

[内容] SFTP 的配置案例

案例一:SFTP 使用 2200 端口,将 SFTP 用户的家目录作为 SFTP 用户的 SFTP 目录,让 SFTP 用户通过 SFTP 登录时被限制在自己的家目录里

# vim /etc/ssh/sshd_config

将以下内容:

......
Subsystem       sftp ......
......

修改为:

......
# Subsystem       sftp ......
......

并添加以下内容:

......
Subsystem       sftp    internal-sftp
Match LocalPort 2200
  ForceCommand internal-sftp
  PasswordAuthentication yes
  ChrootDirectory %h
  PermitTunnel no
  AllowAgentForwarding no
  AllowTcpForwarding no
  X11Forwarding no

(补充:这里以将 /etc/ssh/sshd_config 作为 SFTP 的配置文件为例)

(注意:SFTP 目录以及所有 SFTP 目录的父目录的所属主必须是 root,权限最高只能是 755 或者 750,否则就算此目录的所属主是此 SFTP 用户,此用户在登录时也会报错)

案例二:将根 “/” 目录下以和 SFTP 用户名同名的目录作为此 SFTP 用户的 SFTP 目录,让此 SFTP 用户通过 SFTP 登录时被限制在根 “/” 目录下以和自己用户名同名的目录里,但是此设置只适用于组是 sftpuser 的用户,并且 SFTP 上传的文件默认权限是 770

# vim /etc/ssh/sshd_config

将以下内容:

......
Subsystem       sftp ......
......

修改为:

......
# Subsystem       sftp ......
......

并添加以下内容:

......
Subsystem       sftp    internal-sftp
Match Group sftpuser
  ForceCommand internal-sftp -m 770
  PasswordAuthentication yes
  ChrootDirectory /%u
  PermitTunnel no
  AllowAgentForwarding no
  AllowTcpForwarding no
  X11Forwarding no


补充:
1) 这里以将 /etc/ssh/sshd_config 作为 SFTP 的配置文件为例
2) -m 770 参数也可以使用 -u 770 替代,但是 -u 参数有时候会不起作用

(注意:SFTP 目录以及所有 SFTP 目录的父目录的所属主必须是 root,权限最高只能是 755 或者 750,否则就算此目录的所属主是此 SFTP 用户,此用户在登录时也会报错)

案例三:SFTP 使用 2222 端口,将根 “/” 目录下以和 SFTP 用户名同名的目录作为此 SFTP 用户的 SFTP 目录,让此 SFTP 用户通过 SFTP 登录时被限制在根 “/” 目录下以和自己用户名同名的目录里,但是此设置只适用于组是 sftpuser 的用户,SFTP 用户存放的公钥的文件为 /etc/ssh/authorized_keys/<user>/.ssh/authorized_keys,SFTP 上传的文件默认权限是 770

# vim /etc/ssh/sshd_config

将以下内容:

......
Subsystem       sftp ......
......

修改为:

......
# Subsystem       sftp ......
......

并添加以下内容:

......
Subsystem       sftp    internal-sftp -l VERBOSE -f LOCAL3
Match LocalPort 2222
Match Group sftp
ChrootDirectory /%u
AuthorizedKeysFile /etc/ssh/authorized_keys/%u/.ssh/authorized_keys
ForceCommand    internal-sftp -m 770
AllowTcpForwarding no
X11Forwarding no


补充:
1) 这里以将 /etc/ssh/sshd_config 作为 SFTP 的配置文件为例
2) -m 770 参数也可以使用 -u 770 替代,但是 -u 参数有时候会不起作用

(注意:SFTP 目录以及所有 SFTP 目录的父目录的所属主必须是 root,权限最高只能是 755 或者 750,否则就算此目录的所属主是此 SFTP 用户,此用户在登录时也会报错)

案例四:将根 “/” 目录下以和 SFTP 用户名同名的目录作为此 SFTP 用户的 SFTP 目录,让此 SFTP 用户通过 SFTP 登录时被限制在根 “/” 目录下以和自己用户名同名的目录里,但是此设置只适用于用户 sftpuser

# vim /etc/ssh/sshd_config

将以下内容:

......
Subsystem       sftp ......
......

修改为:

......
# Subsystem       sftp ......
......

并添加以下内容:

......
Subsystem       sftp    internal-sftp
Match User sftpuser
  ForceCommand internal-sftp
  PasswordAuthentication yes
  ChrootDirectory /%u
  PermitTunnel no
  AllowAgentForwarding no
  AllowTcpForwarding no
  X11Forwarding no

(补充:这里以将 /etc/ssh/sshd_config 作为 SFTP 的配置文件为例)

(注意:SFTP 目录以及所有 SFTP 目录的父目录的所属主必须是 root,权限最高只能是 755 或者 750,否则就算此目录的所属主是此 SFTP 用户,此用户在登录时也会报错)

案例五:给不同的 SFTP 分配不同的 SFTP 目录,让 SFTP 用户通过 SFTP 登录时被限制在自己的家目录里

# vim /etc/ssh/sshd_config

将以下内容:

......
Subsystem       sftp ......
......

修改为:

......
# Subsystem       sftp ......
......

并添加以下内容:

......
Subsystem       sftp    internal-sftp
Match User eternalcenter
  ChrootDirectory /eternalcenter
Match User mingyuzhu
  ChrootDirectory /mingyuzhu
Match User zhumingyu
  ChrootDirectory /zhumingyu


补充:这里以将
1) /etc/ssh/sshd_config 作为 SFTP 的配置文件为例
2) 将 /eternalcenter 作为 eternalcenter 的 SFTP 目录
3) 将 /mingyuzhu 作为 mingyuzhu 的 SFTP 目录
4) 将 /mingyuzhu 作为 mingyuzhu 的 SFTP 目录
为例

(注意:SFTP 目录以及所有 SFTP 目录的父目录的所属主必须是 root,权限最高只能是 755 或者 750,否则就算此目录的所属主是此 SFTP 用户,此用户在登录时也会报错)

[步骤] auditd 的设置 (日志保存时间)

方法一:通过 auditd 配置文件设置

1.1 设置 auditd 日志的保存时间

# vim /etc/audit/auditd.conf

确保部分内容如下:

......
local_events = yes
......
write_logs = yes
......
log_file = /var/log/audit/audit.log
......
max_log_file = 8
......
num_logs =5
......
max_log_file_action = ROTATE
......


补充:这里以
1) 开启 auditd 日志 (local_events = yes) (write_logs = yes)
2) 将 auditd 日志写入 /var/log/audit/audit.log 文件 (log_file = /var/log/audit/audit.log)
3) auditd 日志每达到 8M 大小就将旧的 auditd 日志进行备份并创建新的 auditd 日志 (max_log_file = 8) (max_log_file_action = ROTATE),也可以修改成: max_log_file_action = keep_logs
4) 旧的 auditd 日志保存 5 份 (num_logs =5)
为例

1.2 让设置的 auditd 时间生效

# service auditd restart

方法二:通过 logrotate 配置文件设置

2.1 设置 auditd 日志的保存时间

# vim /etc/logrotate.d/auditd

创建以下内容:

/var/log/audit/*
{
rotate 30
daily
missingok
compress
delaycompress
postrotate
touch /var/log/audit/audit.log ||:
chmod 0600 /var/log/audit/audit.log ||:
service auditd restart
endscript
}


补充:这里以:
1) 备份的日志文件保留 30 份 (rotate 30)
2) 每天将现在的日志文件进行备份并生成新的日志文件 (dayly)

2.2 让设置的 auditd 时间生效

# systemctl restart logrotate.service