[步骤] SFTP 日志的开启 (禁止 SFTP 用户 SSH 登录、限制 SFTP 用户可进入的目录范围和端口分离版)

注意:

在禁止 SFTP 用户 SSH 登录、限制 SFTP 用户可进入的目录和端口分离的情况下开启 SFTP 日志前,要先设置 SFTP 相应的安全项:

正文:

步骤一:开启 SFTP 日志

1.1 开启 SFTP 的登录日志

1.1.1 修改配置文件 /etc/ssh/sshdsftp_config,开启 sshdsftp 的日志功能
# vim /etc/ssh/sshdsftp_config

将部分内容修改如下:

......
LogLevel INFO
......
1.1.2 让修改的配置生效
# systemctl restart sshdsftp.service

1.2 开启 SFTP 的文件日志

1.2.1 修改 /etc/audit/auditd.conf 配置文件,指定 auditd 日志的存放位置
# vim /etc/audit/auditd.conf

将部分内容修改如下:

......
log_file = /var/log/audit/audit.log
......
1.2.2 修改 /etc/audit/rules.d/audit.rules 配置文件,监控用于 SFTP 服务器的目录以及目录下的目录和文件
# vim /etc/audit/rules.d/audit.rules

添加以下内容:

......
-a exit,always -F dir=/sftpuser -F perm=rwxa

(补充:这里以添加 /sftpuser 目录为例)

1.2.2 让修改的配置生效
# service auditd restart

或者:

# augenrules

步骤二:显示 SFTP 日志

2.1 显示 SFTP 的登录日志

# cat /var/log/messages | grep systemd-logind


补充:这里会显示
1) 用户
2) 用户的登录时间
3) 用户的退出时间

(注意:普通用户的登录记录也在里面)

2.2 显示 SFTP 的文件日志

# cat /var/log/audit/audit.log


补充:这里会显示
1) 用户
2) 操作的时间
2) 被操作的文件
3) 被操作的动作 (创建、删除和显示)

或者:

# sudo ausearch -i -k user-modify

(补充:这里以显示文件被修改的记录为例)

[命令] Linux 命令 pdbedit Samba 用户的管理

内容一:pdbedit 命令的格式

# pdbedit <option> <user>

内容二:pdbedit 命令的选项

1) -a 或者 –create,创建 Samba 用户
2) -x 或者 –delete,删除 Samba 用户
3) -r 或者 –modify,修改 Samba 用户
4) -L 或者 –list,显示所有 Samba 用户
5) -Lv 或者 –list –verbose,显示所有 Samba 用户的详细信息
6) -c “[D]” -u,锁定该 Samba 用户
7) -c “[]” -u,解锁该 Samba 用户

[步骤] auditd 日志时间格式的转换

步骤一:创建用于 auditd 转换日志时间格式的脚本

# vim time_format_conversion.pl

创建以下内容:

s/(1\d{9})/localtime($1)/e

(补充:这里以创建名为 time_format_conversion.pl 的用于转换 auditd 日志时间格式的脚本为例)

步骤二:转换 auditd 日志时间格式

# cat /var/log/audit/audit.log | perl -p time_format_conversion.pl

或者:

# less /var/log/audit/audit.log | perl -p time_format_conversion.pl

或者:

# more /var/log/audit/audit.log | perl -p time_format_conversion.pl

或者:

# head /var/log/audit/audit.log | perl -p time_format_conversion.pl

或者:

# tail /var/log/audit/audit.log | perl -p time_format_conversion.pl

或者:

# tail -f /var/log/audit/audit.log | perl -p time_format_conversion.pl

(补充:这里以使用名为 time_format_conversion.pl 的用于转换 auditd 日志时间格式的脚本为例)

[内容] NFS 常用参数

内容一:NFS 常用参数

1) no_root_squash 当使用 NFS 共享目录的客户端是以客户端的 root 用户的身份使用,那么对于这个共享目录而言,这个客户端具有 root 权限
2) root_squash 当使用 NFS 共享目录的客户端是以客户端的 root 用户的身份使用,那么对于这个共享目录而言,这个客户端依旧没有 root 权限
3) 此为默认值,anon=0 禁止使用 NFS 共享目录的客户端以随机身份使用
4) anon=1 允许使用 NFS 共享目录的客户端以随机身份使用
5) soft 使用 NFS 共享目录的客户端以软挂载的方式进行挂载,若客户端的请求得不到回应,则会重新发出请求并传回错误信息
6) 此为默认值,hard 使用 NFS 共享目录的客户端以软挂载的方式进行挂载,若客户端的请求得不到回应,则会一直发出请求直到得到 NFS 服务器的回应为止
7) timeo=120 使用 NFS 共享目录的客户端在连接不通后,会以 1/7 秒的时间尝试重新连接,默认会尝试重新连接 7 次,timeo=120 表示会重新尝试连接 120 次
8) rw 设置使用 NFS 共享目录的客户端拥有读和写的权限
9) nolock 取消文件锁

内容二:NFS 的挂载案例

# cat /etc/fstab
192.168.0.1:/test /test nfs timeo=120,rw,soft,nolock 0 0


补充:这里以
1) 挂载 192.168.0.1:/test 的目录到本地的 /test 目录
2) 以 nfs 格式进行挂载
3) 客户端在连接不通后会重新尝试连接 120 次
4) 客户端拥有读和写的权限
5) 以软挂载的方式进行挂载
6) 取消文件锁
7) 不进行数据备份
8) 不进行数据校验
为例

[步骤] SFTP 的搭建 (将 SFTP 端口和 SSH 端口分离、限制 SFTP 用户可以进入的目录和禁止 SFTP 用户 SSH 登录版)

步骤一:将 SFTP 端口和 SSH 端口分离

1.1 创建新的 SFTP 配置文件

1.1.1 创建新的 SFTP 配置文件
# cp /etc/ssh/sshd_config /etc/ssh/sshdsftp_config
1.1.2 让新创建的 SFTP 配置文件被 systemctl 管理
1.1.2.1 创建管理 SFTP 配置文件的 systemctl 管理文件
# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sshdsftp.service
1.1.2.2 修改管理 SFTP 配置文件的 systemctl 管理文件
# vim /etc/systemd/system/sshdsftp.service

将以下内容:

......
Description=OpenSSH server daemon
......
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
......

修改为:

......
Description=OpenSSH SFTP server daemon
......
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshdsftp_config $OPTIONS $CRYPTO_POLICY
......
1.1.2.3 让 systemctl 加载 SFTP 配置文件的 systemctl 管理文件
# systemctl daemon-reload

1.2 将 SFTP 端口和 SSH 端口分离

1.2.1 修改 SFTP 使用的端口
# vim /etc/ssh/sshdsftp_config

将以下内容:

......
#Port 22
......

修改为:

......
Port 2222
......
1.2.2 从 SSH 的配置文件里删除 SFTP 的功能
# vim /etc/ssh/sshd_config

如果是 CentOS Linux & RHEL,将以下内容:

......
Subsystem  sftp    /usr/libexec/openssh/sftp-server
......

修改为:

......
#Subsystem  sftp    /usr/libexec/openssh/sftp-server
......

如果是 openSUSE & SLE, 将以下内容:

......
Subsystem       sftp    /usr/lib/ssh/sftp-server
......

修改为:

......
# Subsystem       sftp    /usr/lib/ssh/sftp-server
......
1.2.3 开放 SFTP 使用的端口
1.2.3.1 在防火墙上允许被 SFTP 使用的端口可以被访问
1.2.3.1.1 在防火墙上允许被 SFTP 使用的端口可以被访问
# firewall-cmd --add-port=2222/tcp --perm

(补充:这里以在 firewalld 防火墙开通 2222 端口为例)

1.2.3.1.2 让新的防火墙策略立刻生效
# firewall-cmd --reload
1.2.3.2 在 SELinux 上给 SFTP 使用的端口打上 SSH 标签
# semanage port -a -t ssh_port_t -p tcp 2222

(补充:这里以给 2222 端口打上 SSH 的标签为例)

(注意:此步骤只有在 SELinux 开启,且处于 enforcing 状态时才需要设置)

1.3 让 SFTP 端口和 SSH 端口分离的设置生效

1.3.1 开启 SFTP 并将 SFTP 设置为开机自启
# systemctl enable --now sshdsftp
1.3.2 重启 SSHD
# systemctl restart sshd

步骤二:限制 SFTP 用户可以进入的目录

2.1 限制 SFTP 用户可以进入的目录

# vim /etc/ssh/sshdsftp_config

如果是 CentOS Linux & RHEL,将以下内容:

......
Subsystem  sftp    /usr/libexec/openssh/sftp-server
......

修改为:

......
#Subsystem  sftp    /usr/libexec/openssh/sftp-server
......

如果是 openSUSE & SLE, 将以下内容:

......
Subsystem       sftp    /usr/lib/ssh/sftp-server
......

修改为:

......
# Subsystem       sftp    /usr/lib/ssh/sftp-server
......

并添加以下内容:

......
Subsystem       sftp    internal-sftp
Match LocalPort 2222
ChrootDirectory /%u
ForceCommand    internal-sftp -m 770
AllowTcpForwarding no
X11Forwarding no


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

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

# systemctl restart sshdsftp

步骤三:禁止 SFTP 用户 SSH 登录

3.1 创建 SFTP 用户

# useradd sftpuser

(补充:这里以创建名为 sftpuser 的用户为例)

3.2 禁止 SFTP 用户 SSH 登录

# usermod -s /bin/false sftpuser

(补充:这里以将用户 sftpuser 的解释器修改成 /bin/false 为例)

或者:

# usermod -s /sbin/nologin sftpuser

(补充:这里以将用户 sftpuser 的解释器修改成 /sbin/nologin 为例)

3.3 给 SFTP 用户设置密码

# passwd sftpuser

(补充:这里以给 sftpuser 用户设置密码为例)

3.4 创建 SFTP 用户的 SFTP 目录

3.4.1 创建 SFTP 用户的 SFTP 目录
# mkdir /sftpuser

(补充:因为在本文步骤 2.1 中,设置的 SFTP 用户的目录是 /<user>,且在本文步骤 3.1 中创建的用户名是 sftpuser,所以这里的 SFTP 目录是 /sftpuser)

3.4.2 设置此 SFTP 目录的所属主为 root
# chown root: /sftpuser

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

3.4.3 设置此 SFTP 目录的权限为 755
# chmod 755 /sftpuser

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

步骤四:测试 SFTP

4.1 创建测试用户

4.1.1 创建测试用户
# useradd nosftp

(补充:这里以创建测试用户 nosftp 为例)

4.1.2 给测试用户设置密码
# passwd nosftp

4.2 测试 SFTP 用户无法 SSH

# ssh sftpuser@127.0.0.1

(补充:这里以测试用户是 sftp 为例)

4.3 测试 SFTP 目录范围

4.3.1 登录 SFTP
# sftp -P 2222 sftpuser@127.0.0.1
Connected to sftpuser@127.0.0.1.
sftp>

(补充:这里以 SFTP 端口是 2222,SFTP 目录时 /sftpuser ,测试用户是 sftpuser 为例)

4.3.2 确认 SFTP 根 “/” 目录
4.3.2.1 切换到 SFTP 的根 “/” 目录
sftp> cd /
4.3.2.2 显示 SFTP 根 “/” 目录下的文件或目录
sftp> ls
write  
sftp>

(补充:此时发现目前 SFTP 的根 “/” 并不是 Linux 系统的根 “/” 目录)

4.4 测试 SSH 和 SFTP 分离

4.4.1 SSH 测试
4.4.1.1 SSH 端口可以正常 SSH
# ssh nosftp@127.0.0.1

(补充:这里以 SSH 端口是 22,测试用户是 nosftp 为例)

4.4.1.2 SFTP 端口不能被 SSH
4.4.1.2.1 有 SFTP 目录的用户不能通过 SFTP 端口 SSH
# ssh -p 2222 sftpuser@127.0.0.1
sftpuser@192.168.8.58's password: 
This service allows sftp connections only.
Connection to 10.0.0.3 closed.
#

(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftpuser,测试用户是 sftpuser 为例)

4.4.1.2.2 没有 SFTP 目录的用户不能通过 SFTP 端口 SSH
# ssh -p 2222 nosftp@127.0.0.1
client_loop: send disconnect: Broken pipe
#

(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftp,测试用户是 nosftp 为例)

4.4.2 SFTP 测试
4.4.2.1 SSH 端口不能 SFTP
# sftp sftpuser@127.0.0.1
subsystem request failed on channel 0
Connection closed
#

(补充:这里以 SFTP 端口是 22,测试用户是 sftpuser 为例)

4.4.2.2 没有 SFTP 目录的用户不能通过 SFTP 端口 SFTP
# sftp -P 2222 nosftp@127.0.0.1
client_loop: send disconnect: Broken pipe
Connection closed
#

(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftp,测试用户是 nosftp 为例)

4.4.2.3 有 SFTP 目录的用户可以通过 SFTP 端口 SFTP
# sftp -P 2222 sftpuser@127.0.0.1
Connected to sftpuser@127.0.0.1.
sftp>

(补充:这里以 SFTP 端口是 2222,SFTP 目录是 /sftpuser ,测试用户是 sftpuser 为例)

补充:当 SFTP 用户密码过期后登陆的报错

# sftp -P 2222 sftpuser@127.0.0.1
sftpuser@127.0.0.1 password: 
Connection closed.  
Connection closed

(补充:这里以测试用户 sftpuser 为例)