身份鉴别

口令策略

介绍

/etc/pam.d/system-auth文件是Linux系统中Pluggable Authentication Modules(PAM)的配置文件之一。PAM允许系统管理员在不修改应用程序的情况下配置认证方式,包括密码验证、账户管理、会话管理等。

system-auth文件的作用是定义系统范围内的默认身份验证策略和配置。当用户尝试登录或执行需要身份验证的操作时,PAM将根据system-auth文件中的配置来执行相关的身份验证模块,例如验证用户密码、检查账户状态、设置会话限制等。

密码口令

1
vim /etc/pam.d/system-auth

修改system-auth配置文件设定密码强度,如下

1
2
# 要求口令长度至少8位,至少包含一个数字、大写字母、小写字母、特殊字符,且不能包含用户名,root用户同样使用
password requisite pam_pwquality.so try_first_pass local_users_only minlen=8 ucredit=-1 dcredit=-1 lcredit=-1 ocredit=-1 enforce_for_root
  • password: 这表示该配置适用于密码验证阶段。
  • requisite: 表示如果这个模块验证失败,将会立即拒绝用户的访问,且不会再执行后续的模块。
  • pam_pwquality.so: 这是进行密码质量检查的模块。
  • try_first_pass: 尝试首先使用之前通过身份验证模块获得的身份验证令牌。
  • local_users_only: 仅对本地用户应用此规则,不适用于远程用户。
  • minlen=8: 密码的最小长度要求为8个字符。
  • ucredit=-1: 至少需要一个大写字母。
  • dcredit=-1: 至少需要一个小写字母。
  • lcredit=-1: 至少需要一个数字。
  • ocredit=-1: 至少需要一个特殊字符。
  • enforce_for_root: 即使是root用户也要强制遵循这些规则。

02-17-CentOS20231107-666

测试

我们试试修改密码测试一下

1
passwd

由下图可以看到,我们设置的密码缺少大写或者非字母或数字字符也会提示强度不够。

03-192.168.2.17 0231107-707

配置口令历史

/etc/pam.d/system-auth配置密码历史记录

1
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
  • password: 这表示该配置适用于密码验证阶段。
  • sufficient: 表示如果这个模块成功验证了用户身份,那么将不再继续向后执行其他模块,就算其他模块返回失败也是如此。
  • pam_unix.so: 这是实际进行密码验证的模块,使用的是UNIX系统的密码验证方式。
  • sha512: 表示使用SHA-512算法对密码进行哈希加密。
  • shadow: 表示使用系统的shadow密码文件来进行验证。
  • nullok: 表示空密码是被允许的。
  • try_first_pass: 尝试首先使用之前通过身份验证模块获得的身份验证令牌。
  • use_authtok: 使用经过身份验证的口令(token)。
  • remember=5: 记住前面5次使用的密码,避免用户频繁切换密码时重复使用相同的密码。

登录失败处理

/etc/pam.d/system-authaccount区段

1
2
3
4
auth        required      pam_faillock.so preauth audit deny=5 even_deny_root unlock_time=600
auth       sufficient   pam_unix.so nullok try_first_pass
auth        [default=die] pam_faillock.so authfail audit deny=5 even_deny_root unlock_time=600
auth       sufficient   pam_faillock.so authsucc audit deny=5 even_deny_root unlock_time=600
  • 行 1: pam_faillock.so 模块被用于在用户进行身份验证前(preauth)执行账户锁定检查。如果失败次数达到指定的阈值,则会拒绝用户的登录请求,并记录审计日志。即使是root用户也会受到相同的限制。
  • 行 2: pam_unix.so 模块在本地用户身份验证时起到必要的作用,nullok 参数表示允许空密码,并且尝试使用之前通过身份验证模块获得的身份验证令牌。
  • 行 3: pam_faillock.so 模块在用户身份验证失败时执行账户锁定操作,并记录审计日志。如果失败次数达到指定的阈值,则会拒绝用户的登录请求,并即使是root用户也会受到相同的限制。
  • 行 4: pam_faillock.so 模块在用户身份验证成功时执行账户锁定操作,并记录审计日志。即使是root用户也会受到相同的限制。

口令使用周期

/etc/login.defs文件包含了许多与用户账户和密码策略相关的配置项。比如口令使用周期

  1. PASS_MAX_DAYS:用户密码的最大有效期,超过该时间未更改密码将会失效
  2. PASS_MIN_DAYS:用户更改密码之间的最小间隔天数
  3. PASS_WARN_AGE:在密码过期前提供警告的天数

设置这些参数,可以强制用户行为,定期修改密码,提高系统安全性

1
2
3
PASS_MAX_DAYS   90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7

补充

/etc/login.defs还有其他很多的配置项,比如以下常用的配置项:

  1. MAIL_DIR:指定用户的邮件存储目录
  2. PASS_MIN_LEN:用户密码的最小长度要求
  3. LOGIN_RETRIES:允许的登录尝试次数
  4. LOGIN_TIMEOUT:登录超时限制

空闲超时自动退出

/etc/profile添加如下设置300秒后自动断开SSH远程

1
export TMOUT=300

05-17-CentOS20231107-751

关闭telnet和ftp服务

telnet

查看telnet端口(默认为23)

1
cat /etc/services | grep telnet

查看端口是否存在进程

1
ps -ef | grep 23

ftp

1
ps -ef | grep vsftpd

SSH1和SSH2

SSH1和SSH2是两个不同版本的安全外壳协议,用于在计算机网络上加密通信和实现远程登录。它们之间的主要区别包括安全性、加密算法、性能和功能方面的改进。

  1. 安全性:SSH2相对于SSH1有更强的安全性。SSH1使用的是基于RSA的加密算法,而SSH2支持更多种类的加密算法,包括RSADSAECDSADiffie-Hellman等。SSH2还修复了SSH1中存在的一些安全漏洞。
  2. 加密算法:SSH2支持更多种类型的加密算法和哈希算法,从而提高了通信数据的安全性。
  3. 性能:SSH2相对于SSH1有更好的性能表现,包括连接速度和数据传输速度。
  4. 功能:SSH2相对于SSH1增加了许多新的功能,包括端口转发、X11转发、SFTP(Secure File Transfer Protocol)等功能。

目前主流的Linux系统默认使用的是SSH2版本,因为SSH2相对于SSH1更安全、更灵活,并且具有更好的性能和功能。在实际应用中,SSH2已经成为了远程登录和安全通信的标准选择。

查看SSH协议

显示SSH客户端和服务器之间的详细连接信息,包括使用的协议版本

1
ssh -v localhost

访问控制

分配合理权限

针对以下文件,文件权限数不能超过644

一、系统配置文件:

  1. /etc/shadow
  2. /etc/passwd
  3. /etc/profile
  4. /etc/group

二、系统日志

  1. /etc/rsyslog.conf
  2. /etc/audit/audit.conf
  3. /var/log/secure(包括轮转后的日志)
  4. /var/log/messages(包括轮转后的日志)
  5. /var/log/cron(包括轮转后的日志)
  6. /var/log/audit/audit.log(包括轮转后的日志)

安全审计

系统日志进程rsyslog、审计日志进程auditd两个日志均必须开启

rsyslog

rsyslog(全称是rocket-fast system for log)是一个强大的日志处理工具,通常用于Linux系统中,它可以帮助用户收集、处理和传输日志信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动 rsyslog 日志进程
systemctl start rsyslog

# 停止 rsyslog 日志进程
systemctl stop rsyslog

# 查看 rsyslog 日志进程状态
systemct status rsyslog

# 开启开机自启
systemctl enable rsyslog

# 关闭开机自启
systemctl disable rsyslog

07-17-CentOS20231108-922

日志规则

对于rsyslog守护进程接收到消息,并且根据伴随消息的备常量和/etc/rsyslog.conf配置文件定义的日志规则进行匹配。

1
authpriv.*       /var/log/secure

这条规则的意思就是匹配authpriv.类型的消息,并将该消息写入到/var/log/secure这个日志文件中。

规则左侧authpriv.*称为选择器(Selector),右侧日志路径称为动作(Action)

  • 选择器:匹配消息的类型,由设备消息等级以点.隔开
  • 动作:如何处理选择器匹配的信息。要么写入日志文件、要么转发到远程日志服务器、要么丢弃

消息等级

消息等级在选择器中是日志等级由高到低排列如下:

  • emerg: 表示系统无法使用
  • alert: 必须立即采取措施
  • crit: 致命级别
  • err: 错误级别
  • warning: 警告级别
  • notice: 通知级别
  • info: 正常级别
  • debug: 调试消息
  • none : 不记录任何东西

选择器

rsyslog的审计配置文件在/etc/rsyslog.conf,下面是配置中的一部分

案例一

1
*.info;mail.none;authpriv.none;cron.none       /var/log/messages

这条规则,有三个;,有4个选择器,他们是并集的关系。

  • *.info:匹配所有任何设备,但消息等级是info
  • mail.none:消息等级是none,意味着不会匹配mail类型任何等级消息
  • authpriv.none:消息等级是none,同理意味着不会匹配authpriv类型任何等级消息
  • cron.none:消息等级是none,同理,意味着不会匹配cron类型任何等级消息

总结:任何设备类型且仅当消息等级为info的消息会被写入到action字段指向/var/log/message文件中

案例二

1
authpriv.*          /var/log/secure 

这条命令比较短,容易理解,即匹配类型为authpriv,且任何等级消息都会被写入到/var/log/secure文件

案例三

1
mail.*       -/var/log/mail.log

这条规则和案例二差不多。匹配类型为mail,且任何消息等级都会被写入到/var/log/mail.log 文件。

注意:这里有一个-号,代表延迟action。即不会马上实现action,这里动作是写入/var/log/mail.log文件,则先写入到Linux缓存区,等一段时间后才会写入到/var/log/mail.log文件

案例四(重点)

1
*.emerg          :omusrmsg:*

匹配了任何消息类型,且emerg是消息等级中最高的(致命性),action是会被发送到系统所有用户的登录终端。字段中的**:omusrmsg:*** 就表达了这个意思。

动作(Action)

我们了解了选择器和简单的动作,但动作应该不只是写入到文件,还可以有其他的动作,我们下面学习一下其他的动作。

通过网络发送rsyslog消息

将消息转发到远程服务器语法格式如下:

1
<selector>    @[compress_level][remote_server]:[port]
  • 使用@将指定UDP传输协议
  • 使用@@将指定TCP传输协议
  • 可选的compress_level字段启动用从1~9的zlib压缩级别
  • remote_server字段指定接收主机
  • 可选的port字段指定接收主机端口

案例一:转发主机

1
*.*        @ 10.10.1.2

该规则将匹配任何类型不限等级的消息,使用UDP协议将消息转发到10.10.1.2

案例二:转发主机端口

1
*.*       @@host.hikki.site:45

该规则表示匹配任何类型且不限等级的消息,使用TCP协议将消息转发到host.hikki.site主机的45端口上

案例三:多用户

1
mail.*   jack,mary,john

指定用于发送rsyslog消息的用户名,用户名之间使用逗号,分隔开以指定多个用户,。使用星号将消息发送给当前登录的每个用户。

以上规则表示将匹配所有邮件相关的消息发送给用户jack,mary,john用户

案例四(重点)执行程序

你还可以选定的rsyslog消息执行程序。在动作(action)前加上^符号,指定用于格式化接收到的消息并将其作为单行参数传递给指定的可执行文件的模板。

1
2
# 模板:<设备>.<优先级>		<^发送消息的程序;日志模板>
kern.* ^knl-prog;knl

auditd

auditd工具可以帮助运维人员审计Linux,分析发生在系统中的发生的事情。Linux内核有种日志记录事情的能力,包括记录系统调用和文件访问。管理员可以检查这些日志,确认是否存在安全漏洞(如多次失败的尝试,或者用户对系统文件不成功的访问)

auditd每次更改配置规则需要重启auditd进程 service auditd restart,通过auditd -l验证是否生效

audit启动、停止、重启

CentOS 7默认安装了audit,检查auditd的状态

1
2
3
4
# 查看 auditd 的运行状态
systemctl status auditd
# 或者使用 service 命令也可以查看 auditd 的运行状态
service auditd status

08-17-CentOS20231108-631

auditd服务的启动与停止

1
2
3
4
5
6
# 启动 auditd 服务
service start auditd
# 停止 auditd 服务
service stop auditd
# 重启 auditd 服务
service auditd restart

09-17-CentOS20231108-131

配置文件

audit.conf文件:审计工具的配置文件

audit.rules文件:审计的规则,该文件由/etc/audit/rules.d产生

audit-stop.rules文件:审计停止规则,该文件定义了定制检测

rules.d目录:定义需要审计的规则,写到文件之后会永久有效

10-17-CentOS20231108-139

添加审计规则

添加有效的审计规则,编辑/rules.d目录下的配置文件,添加规则进去

1
vim /etc/audit/rules.d/audit.rules

添加如下内容到audit.rules里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 监视系统文件
-w /etc/sysconfig -p rwxa
-w /etc/ssh/sshd_config -p rwxa
-w /etc/hosts -p wa
-w /etc/hosts.deny -p wa
-w /etc/hosts.allows -p wa

# 监视审计配置文件
-w /etc/rsyslog.conf -p rwxa
-w /etc/audit/audit.rules -p rwxa
-w /etc/audit/auditd.conf -p rwxa

# 监视密码文件
-w /etc/group -p wa
-w /etc/passwd -p wa
-w /etc/shadow -p rwxa
-w /etc/sudoers -p wa

# 监视环境文件
-w /etc/profile -p wa
-w /etc/bashrc -p wa
-w /etc/profile.d -p rwxa

# 监视定时任务cron配置文件
-w /etc/cron.d -p wa
-w /etc/cron.daily -p wa
-w /etc/cron.hourly -p wa
-w /etc/cron.monthly -p wa
-w /etc/cron.weekly -p wa

添加完规则需要重启auditd进程

1
2
3
4
# 重启 auditd 进程
service auditd restart
# 查看审计规则
auditctl -l

使用auditctl -l命令可用查看到刚添加的规则,如果能看到说明审计规则添加成功了,如果没有看到,说明添加规则写错了

auditd工具

auditctl:auditd默认操作命令
aureport:生成和查看审计规则的文件
ausearch:是一个搜索各种事件的工具
autrce:用于跟踪进程的命令

常用的 auditctl 命令

1
2
3
4
# 添加一条审计规则(仅临时有效,永久生效需要添加到配置文件中)
auditctl -a 规则内容
# 查看当前定义的规则
auditctl -l

11-17-CentOS20231108-898

查看 auditd 服务状态

1
auditctl -s

12-17-CentOS20231108-394

1
2
# 设置使能标志
auditctl -e [012]
  1. 设置为0,关闭audit

  2. 设置为1,开启audit

  3. 设置为2时,表示锁定

一般在设置完其他规则后最后设置,防止其他人修改规则;任何修改规则的行为都会被拒绝,并且记录审计日志,只有当重启系统后,这个使能标志才可以被修改。

13-17-CentOS20231108-950

auditd日志

开启auditd日志输出到rsyslog,同时开启输出local0等级

1
2
3
4
5
6
active = yes
direction = out
path = builtin_syslog
type = builtin
args = LOG_LOCAL0
format = string

15-17-CentOS20231109-415

logrotate日志切割

使用logrotate指令,可让你轻松管理系统所产生的记录文件。它提供自动替换,压缩,删除和邮寄记录文件,每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。

语法

1
logrotate [-?dfv][-s <状态文件>][--usage][配置文件]

参数说明

  • -?或--help:在线帮助。
  • -d或--debug:详细显示指令执行过程,便于排错或了解程序执行的情况。
  • -f或--force:强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。
  • -s<状态文件>或--state=<状态文件>:使用指定的状态文件。
  • -v或--version:显示指令执行过程。
  • -usage:显示指令基本用法。

logrotate相关文件

执行文件:/usr/sbin/logrotate

主配置文件:/etc/logrotate.conf

自定义配置文件:/etc/logrotate.d/*

tips:主配置中有一条include /etc/logrotate.d这样的语句,表示该目录下全是子配置文件,我们有需要自定义的配置文件可以在该目录下创建配置文件

配置格式

1
2
3
4
5
6
7
8
9
/var/log/log_file {
size=50M
rotate 5
dateext
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}

配置参数

  • daily :指定转储周期为每天
  • weekly :指定转储周期为每周
  • monthly :指定转储周期为每月
  • rotate count :指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份
  • tabooext [+] list:让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和~
  • missingok:在日志轮循期间,任何错误将被忽略,例如 “文件无法找到” 之类的错误。
  • size size:当日志文件到达指定的大小时才转储,bytes (缺省) 及 KB (sizek) 或 MB (sizem)
  • compress: 通过 gzip 压缩转储以后的日志
  • nocompress: 不压缩
  • copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
  • nocopytruncate: 备份日志文件但是不截断
  • create mode owner group : 转储文件,使用指定的文件模式创建新的日志文件
  • nocreate: 不建立新的日志文件
  • delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
  • nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。
  • errors address : 专储时的错误信息发送到指定的 Email 地址
  • ifempty :即使是空文件也转储,这个是 logrotate 的缺省选项。
  • notifempty :如果是空文件的话,不转储
  • mail address : 把转储的日志文件发送到指定的 E-mail 地址
  • nomail : 转储时不发送日志文件
  • olddir directory:储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
  • noolddir: 转储后的日志文件和当前日志文件放在同一个目录下
  • prerotate/endscript: 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行

案例演示

案例一:nginx

/etc/logrotate.d目录下创建一个配置文件,后缀可有可无

1
2
3
4
# 创建配置项
vim /etc/logrotate.d/nginx.log
# 创建日志文件
touch /var/log/nginx.log

创建完后检验一下配置是否有写错,使用debug测试一下

1
logrotate -d /etc/logrotate.d/nginx.log

14-17-CentOS20231109-720

案例二:日志切割(未完成)

新建一个配置项

1
vim /etc/logrotate.d/audit

写入以下内容

1
2
3
4
5
6
7
8
/var/log/audit/*.log {
missingok # 日志切割时缺少该日志不会报错
daily # 每日切割一次
rotate 7 # 日志保留7天
compress # 将切割日志压缩
dateext # 切割后日志以年月日保留
notifempty # 日志为空不切割
}

取消默认的