Linux服务器(Centos7)
本文最后更新于56 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

身份鉴别

应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换

单一口令重复使用

这个就没啥讲的,测评的时候注意一下就好了

空口令用户

设置空口令用户
删除用户口令
passwd -d username
允许空口令用户登录
修改ssh配置文件
vim /etc/ssh/sshd_config

找到#PermitEmptyPasswords no
改成PermitEmptyPasswords yes

最后重启ssh服务
systemctl restart sshd
查看空口令用户

这里两个用户,我测试过g7用户可以空口令用户登录的

其它空口令情况

可以通过sudoers配置文件,设置用户/用户组免密切换到root

我这里是设置了用户

单个用户:在文件末尾添加
username ALL=(ALL) NOPASSWD: ALL

我这边设置
g7 ALL=(ALL) NOPASSWD: ALL

身份标识唯一

Centos7中身份标识为UID具有唯一性,因此都无需进行查看

其中UID=0是root用户,1~999是系统用户,1000往后是普通用户

为什么是UID而不是用户名呢,因为用户名其实是UID的别名,当别的用户配置了UID为0的时候,会自动识别为root(权限)

密码复杂度配置:

配置文件

口令复杂度配置文件有很多个,包括:

/etc/pam.d/system-auth和password-auth,以system-auth为准

/etc/login.defs

/etc/security/pwquality.conf

都能起到配置口令复杂度的作用

但是我尝试了Centos7的1611版本,默认是无法使用普通账户修改成不符合口令复杂度用户的,但是我无法确认是否是该版本的问题,因此我还是按没有配置则默认不符合处理

同时需要注意,所有的配置都不会对原有用户生效,需要更新口令后才会生效,包括口令有效期

  • 对于system-auth文件,我测试过很多位置(system-auth直接生效,不用重启):
原有配置:
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
新配置:
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= enforce_for_root minlen=8 ucredit=1 lcredit=1 ocredit=1 dcredit=1

在原有配置不被注释/注释的情况下,新配置放在文件首行、旧配置下一行以及尾行,情况如下:

原有配置不被注释,文件首行、旧配置下一行新配置生效,尾行配置不生效(这种情况新旧配置同时生效)

原有配置被注释,文件首行、旧配置下一行和尾行新配置生效

原有配置和新配置都被注释,无法更改密码,passwd 用户报错

所以system-auth文件的运行是按配置的(与认知一致),且新配置放在尾行也是生效的,但是这是使用默认已生效的pam_pwquality.so模块

因此如果是让客户修改配置,最好是删除旧配置,新增新配置,替代旧配置的位置

同时还有一个情况,比如用的是原来是pam_cracklib.so等模块,我这边没有进行校验替换成pam_pwquality.so模块或使用pam_cracklib.so模块如何才能进行生效

  • 对于/etc/login.defs文件,密码复杂度的长度可以在这里配置,但是还是建议统一在system-auth文件配置,system-auth优先级较高。
  • 对于pwquality.conf文件,这个文件我修改过,pwquality.so模块是正常的,但是重启后配置也没有生效,我怀疑已经弃用了。

口令有效期

口令有效期就是直接更改/etc/login.defs中的PASS_MAX_DAYS参数

查询的话,我直接查询shadow文件中的参数,比较直观



应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施

登录失败配置

登录方式

登录失败有3种形式,分别是tty、桌面和ssh远程连接

tty如下(一般就是没安装桌面的前提下,虚拟机的登录界面):

桌面如下:

远程SSH如下:

默认配置:
添加的配置:
auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600

auth sufficient pam_unix.so nullok try_first_pass

auth [default=die] pam_faillock.so authfail audit

account required pam_faillock.so

添加后配置截图:

登录认证流程:
  1. 用户尝试登录 → 触发 preauth 阶段:
    • 检查是否已锁定(失败次数 ≥3 且未到 unlock_time=600 秒)→ 若锁定,直接拒绝(不提示密码输入)。
    • 未锁定 → 允许用户输入密码。
  2. 输入密码后 → 触发 pam_unix.so
    • 密码正确 → sufficient 标志生效,跳过后续 auth 模块 → 进入 account 阶段。
    • 密码错误 → 继续执行第3行 authfail 模块。
  3. 密码错误时 → authfail 阶段:
    • 记录本次失败次数到 faillock 日志 → 累计次数达到 deny=3 → 触发锁定(持续 unlock_time=600 秒)。
  4. account 阶段
    • 无论密码是否正确,均检查账户锁定状态 → 若锁定,拒绝登录;未锁定,允许登录。
一、第1次失败:记录失败次数(未锁定)

触发场景:用户输入错误密码 → PAM 认证流程启动

阶段模块行 & 参数作用细节
1. preauth 检查(未锁定)auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600preauth:登录前检查锁定状态(当前失败次数=0 < 3,未锁定)。
silent:不向用户显示“未锁定”的提示信息。
audit:记录“开始登录尝试”的审计日志。
deny=3:失败次数阈值(累计3次触发锁定)。
unlock_time=600:锁定持续时间(10分钟,当前未生效)。
2. 密码认证失败auth sufficient pam_unix.so nullok try_first_passnullok:允许空密码(此处用户输入非空但错误)。
try_first_pass:尝试使用前序模块(如指纹)未成功的密码(此处无指纹,直接校验输入密码)。
– 密码错误 → sufficient 不生效,继续执行后续模块。
3. 记录失败次数auth [default=die] pam_faillock.so authfail auditauthfail:标记本次为“认证失败”,记录失败次数(累计失败=1/3)。
audit:记录“密码错误”的审计日志(含用户名、时间)。
[default=die]:失败后终止后续 auth 模块(不再执行 pam_succeed_if.sopam_deny.so)。
4. 拒绝登录(因 [default=die],跳过后续 auth 模块,直接返回失败)用户看到“密码错误”提示(由 pam_unix.so 输出),登录失败。
二、第3次失败:触发锁定

触发场景:连续第3次输入错误密码 → 失败次数达 deny=3

阶段模块行 & 参数作用细节
1. preauth 检查(仍未锁定)auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600– 当前累计失败次数=2 < 3,未锁定 → 允许输入密码。
deny=3:仍未达阈值,继续执行。
2. 密码认证再次失败auth sufficient pam_unix.so nullok try_first_pass密码错误 → 继续执行 authfail 模块。
3. 累计失败达阈值auth [default=die] pam_faillock.so authfail auditauthfail:记录第3次失败(累计失败=3/3)→ 触发锁定。
deny=3:满足锁定条件,系统自动设置账户锁定状态(锁定时间= unlock_time=600 秒)。
三、锁定后尝试登录:直接拒绝(不提示密码输入)

触发场景:锁定期间(10分钟内)再次尝试登录

阶段模块行 & 参数作用细节
1. preauth 检查(已锁定)auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600preauth:检测到累计失败=3且未到 unlock_time=600 秒 → 判定为“已锁定”。
silent:不向用户显示“账户已锁定”的具体原因(仅提示“登录失败”)。
audit:记录“锁定状态下登录尝试”的审计日志。
直接拒绝登录:不进入密码输入环节,流程终止。
四、锁定后输入正确密码:仍拒绝登录

触发场景:锁定期间,用户输入正确密码(验证锁定机制严格性)

阶段模块行 & 参数作用细节
1. preauth 检查(已锁定)auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600– 锁定状态未解除 → 直接拒绝登录(不提示密码输入),无需进入后续模块。
五、关键参数总结(按作用分类)
参数类型参数名作用(登录失败场景下)
锁定阈值控制deny=3累计失败次数阈值,达此值后触发锁定。
锁定时间控制unlock_time=600锁定持续时间(秒),超时后自动解锁(失败次数清零)。
失败记录触发authfail标记“认证失败”事件,触发失败次数累计(仅在密码/指纹错误时执行)。
前置锁定检查preauth登录前检查锁定状态,已锁定则直接拒绝(不提示密码输入,防暴力破解核心)。
日志与安全性audit将“登录尝试、失败次数、锁定状态”记录到系统审计日志(/var/log/audit/audit.log)。
用户体验控制silent隐藏模块内部状态信息(如“未锁定”“已锁定”的具体原因),仅返回通用“登录失败”提示。
流程控制标志[default=die]认证失败后立即终止 auth 阶段流程,避免执行冗余模块(如 pam_deny.so)。

因此参数缺一不可,必须严格按照参数设置

登录失败配置文件:

对应不同登录方式的的配置文件

tty:/etc/pam.d/system-auth

ssh:/etc/pam.d/sshd

桌面:/etc/pam.d/gdm-password

其中ssh和桌面都是包含session include password-auth,因此直接改password-auth就能对桌面和ssh都生效

这些图片我都是输入了正确的密码的,但是都失败了

登录连接超时自动退出

配置文件:/etc/profile

末尾填写参数:

export TMOUT=100
readonly TMOUT

最后重载文件:

source /etc/profile

验证(新开SSH连接):

echo $TMOUT


当进行远程管理时,应采取必要措施防止鉴别信息在网络传输过程中被窃听

这个我一般是不看的,因为连接进linux服务器一般都是用的ssh,如果真要看就是看一下有没有开telnet

查看telnet是否开启



应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现

先略吧,有机会再补这个实验hh

(先欠着)



访问控制

应对登录的用户分配账户和权限


应重命名或删除默认账户,修改默认账户的默认口令


应及时删除或停用多余的、过期的账户,避免共享账户的存在


应授予管理,实现管理用户的权限分离


应由授权主体配置访问控制策略,访间控制策略用户所需的最小权限规定主体对客体的访间规则


访间控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级


应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问

这一part我也先跳过,后面再补,我有点头疼这部分要怎么写



安全审计

应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计

启用审计功能

关闭audit和rsyslog服务
这里是永久关闭两个服务,重启后也不会自启动
systemctl disable rsyslog.service --now
systemctl disable auditd.service --now
重启

临时可以使用stop关闭,但是我用stop关闭auditd失败了
查看是否关闭audit和rsyslog服务
systemctl status auditd.service
systemctl status rsyslog.service
启用audit和rsyslog服务
临时(重启后失效)
systemctl start rsyslog.service
systemctl start auditd.service

重启后效果

永久(添加到自启动)
systemctl enable auditd.service
systemctl enable rsyslog.service

重启后效果

日志内容(默认记录)
cat /var/log/audit/audit.log
type=USER_AUTH msg=audit(1754237425.281:238): pid=3031 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:authentication grantors=pam_unix acct="g7" exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=ssh res=success'
事件类型(type)

常见类型扩展

type类型含义说明
CRYPTO_KEY_USER加密密钥管理事件(如密钥创建、销毁),记录密钥生命周期操作。
CRYPTO_SESSION加密会话建立事件,记录SSH等加密通信的算法协商、密钥交换过程。
USER_AUTH用户认证事件,记录登录验证过程(如密码校验、PAM模块交互)。
USER_ACCT用户账户事件,记录账户状态校验(如登录权限、密码过期检查)。
CRED_ACQ凭证获取事件,记录用户获取特权凭证(如sudo提权、切换用户权限)。
LOGIN登录状态变更事件,记录用户会话ID、审计用户ID的关联关系。
USER_ROLE_CHANGE用户角色变更事件,记录SELinux安全上下文(角色、类型)的切换。
USER_START用户会话启动事件,记录PAM会话打开(如用户登录后会话初始化)。
USER_LOGIN用户登录成功事件,记录最终登录结果(包含终端、地址等信息)。
USER_CMD用户命令执行事件,记录终端中执行的具体命令(如cat /etc/shadow)。
CRED_DISP凭证释放事件,记录用户释放特权凭证(如退出sudo权限)。
USER_END用户会话结束事件,记录PAM会话关闭(如用户退出登录)。
SERVICE_START服务启动事件,记录系统服务(如fprintd)的启动过程。
事情详情(msg)

事件详情就是包含事件的具体记录情况

时间戳序列号
audit(1754237425.281:238)
1754237425.281转换成就是xx年月日
238是序列号,唯一性
其它参数含义
参数含义解析
pid=3031进程ID:执行当前操作的进程编号(3031对应sshd服务进程,即SSH登录服务)。
uid=0当前用户ID:执行操作的有效用户ID(0为root用户,即该操作由root权限进程发起)。
auid=4294967295审计用户ID:原始登录用户ID(4294967295-1的无符号整数表示,意为“未关联到真实用户”,通常因pam_loginuid.so模块未正确配置导致)。
ses=4294967295会话ID:用户登录会话标识(4294967295表示“未初始化会话”,与auid=-1对应,常见于服务进程或未正确关联会话的操作)。
subj=system_u:system_r:sshd_t:s0-s0:c0.c1023SELinux安全上下文
system_u:SELinux用户(系统用户);
system_r:SELinux角色(系统角色);
sshd_t:SELinux类型(sshd服务进程的域);
s0-s0:c0.c1023:敏感度级别(s0)和类别范围(c0.c1023)。
msg='op=PAM:authentication grantors=pam_unix acct="g7" exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=ssh res=success'事件详情
op=PAM:authentication:操作类型(PAM模块认证);
grantors=pam_unix:认证授权者(pam_unix模块,基于本地密码文件验证);
acct="g7":目标账户(被认证的用户为g7);
exe="/usr/sbin/sshd":执行程序(sshd服务,即SSH登录进程);
hostname=192.168.202.1:客户端主机名(登录来源主机的IP);
addr=192.168.202.1:客户端IP地址(远程登录的来源IP);
terminal=ssh:终端类型(通过SSH协议登录);
res=success:操作结果(认证成功)。
小测试
执行命令
1、g7通过xshell远程连接(包含登录)
2、cat /etc/passwd
3、cat /etc/shadow
4、sudo cat /etc/shadow
5、su - root
6、cat /etc/shadow
对应日志
[root@192 ~]# tail -n 0 /var/log/audit/audit.log -f
type=CRYPTO_KEY_USER msg=audit(1754239057.343:294): pid=3470 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=91:81:6d:1f:60:1f:e5:a2:9a:14:5e:b9:fe:b0:5e:d2 direction=? spid=3470 suid=0  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=CRYPTO_KEY_USER msg=audit(1754239057.343:295): pid=3470 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=f4:b6:3c:87:08:8c:1d:92:72:6e:aa:9b:3e:65:e4:aa direction=? spid=3470 suid=0  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=CRYPTO_KEY_USER msg=audit(1754239057.343:296): pid=3470 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=7b:2d:05:ee:0e:96:ef:53:d6:ce:99:eb:fe:45:16:8e direction=? spid=3470 suid=0  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=CRYPTO_SESSION msg=audit(1754239057.353:297): pid=3469 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=start direction=from-server cipher=chacha20-poly1305@openssh.com ksize=512 mac= pfs=curve25519-sha256@libssh.org spid=3470 suid=74 rport=58924 laddr=192.168.202.134 lport=22  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=CRYPTO_SESSION msg=audit(1754239057.354:298): pid=3469 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=start direction=from-client cipher=chacha20-poly1305@openssh.com ksize=512 mac= pfs=curve25519-sha256@libssh.org spid=3470 suid=74 rport=58924 laddr=192.168.202.134 lport=22  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=USER_AUTH msg=audit(1754239060.245:299): pid=3469 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:authentication grantors=? acct="g7" exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=ssh res=failed'
type=USER_AUTH msg=audit(1754239062.177:300): pid=3469 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=none acct="g7" exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=ssh res=failed'
type=USER_AUTH msg=audit(1754239065.208:301): pid=3469 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:authentication grantors=pam_unix acct="g7" exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=ssh res=success'
type=USER_ACCT msg=audit(1754239065.209:302): pid=3469 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:accounting grantors=pam_unix,pam_localuser acct="g7" exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=ssh res=success'
type=CRYPTO_KEY_USER msg=audit(1754239065.221:303): pid=3469 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=session fp=? direction=both spid=3470 suid=74 rport=58924 laddr=192.168.202.134 lport=22  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=USER_AUTH msg=audit(1754239065.222:304): pid=3469 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=success acct="g7" exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=ssh res=success'
type=CRED_ACQ msg=audit(1754239065.223:305): pid=3469 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:setcred grantors=pam_unix acct="g7" exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=ssh res=success
type=LOGIN msg=audit(1754239065.223:306): pid=3469 uid=0 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 old-auid=4294967295 auid=1000 old-ses=4294967295 ses=9 res=1
type=USER_ROLE_CHANGE msg=audit(1754239065.333:307): pid=3469 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='pam: default-context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 selected-context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=ssh res=success'
type=USER_START msg=audit(1754239065.387:308): pid=3469 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:session_open grantors=pam_selinux,pam_loginuid,pam_selinux,pam_namespace,pam_keyinit,pam_keyinit,pam_limits,pam_systemd,pam_unix,pam_lastlog acct="g7" exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=ssh res=success'
type=CRYPTO_KEY_USER msg=audit(1754239065.387:309): pid=3469 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=session fp=? direction=both spid=3469 suid=0 rport=58924 laddr=192.168.202.134 lport=22  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=CRYPTO_KEY_USER msg=audit(1754239065.393:310): pid=3478 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=91:81:6d:1f:60:1f:e5:a2:9a:14:5e:b9:fe:b0:5e:d2 direction=? spid=3478 suid=0  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=CRYPTO_KEY_USER msg=audit(1754239065.393:311): pid=3478 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=f4:b6:3c:87:08:8c:1d:92:72:6e:aa:9b:3e:65:e4:aa direction=? spid=3478 suid=0  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=CRYPTO_KEY_USER msg=audit(1754239065.393:312): pid=3478 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=7b:2d:05:ee:0e:96:ef:53:d6:ce:99:eb:fe:45:16:8e direction=? spid=3478 suid=0  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
type=CRED_ACQ msg=audit(1754239065.394:313): pid=3478 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=PAM:setcred grantors=pam_unix acct="g7" exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=ssh res=success'
type=USER_LOGIN msg=audit(1754239065.403:314): pid=3469 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=login id=1000 exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=/dev/pts/1 res=success'
type=USER_START msg=audit(1754239065.403:315): pid=3469 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=login id=1000 exe="/usr/sbin/sshd" hostname=192.168.202.1 addr=192.168.202.1 terminal=/dev/pts/1 res=success'
type=CRYPTO_KEY_USER msg=audit(1754239065.412:316): pid=3469 uid=0 auid=1000 ses=9 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=destroy kind=server fp=7b:2d:05:ee:0e:96:ef:53:d6:ce:99:eb:fe:45:16:8e direction=? spid=3480 suid=1000  exe="/usr/sbin/sshd" hostname=? addr=192.168.202.1 terminal=? res=success'
到这里SSH认证结束,SSH认证与pam的模块相关

cat /etc/passwd
没有被记录

cat /etc/shadow
没有被记录

type=USER_CMD msg=audit(1754239104.503:317): pid=3555 uid=1000 auid=1000 ses=9 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='cwd="/home/g7" cmd=636174202F6574632F736861646F77 terminal=pts/1 res=success'
type=CRED_ACQ msg=audit(1754239104.504:318): pid=3555 uid=0 auid=1000 ses=9 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:setcred grantors=pam_env,pam_fprintd acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/1 res=success'
type=USER_START msg=audit(1754239104.505:319): pid=3555 uid=0 auid=1000 ses=9 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:session_open grantors=pam_keyinit,pam_limits acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/1 res=success'
type=USER_END msg=audit(1754239104.509:320): pid=3555 uid=0 auid=1000 ses=9 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:session_close grantors=pam_keyinit,pam_limits acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/1 res=success'
type=CRED_DISP msg=audit(1754239104.509:321): pid=3555 uid=0 auid=1000 ses=9 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:setcred grantors=pam_env,pam_fprintd acct="root" exe="/usr/bin/sudo" hostname=? addr=? terminal=/dev/pts/1 res=success'
到这里是sudo cat /etc/shadow
包括获取root凭证、执行、释放root凭证等

type=SERVICE_START msg=audit(1754239111.554:322): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=fprintd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
这里是su - root

type=USER_AUTH msg=audit(1754239114.263:323): pid=3557 uid=1000 auid=1000 ses=9 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:authentication grantors=pam_unix acct="root" exe="/usr/bin/su" hostname=? addr=? terminal=pts/1 res=success'
type=USER_ACCT msg=audit(1754239114.265:324): pid=3557 uid=1000 auid=1000 ses=9 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:accounting grantors=pam_unix,pam_localuser acct="root" exe="/usr/bin/su" hostname=? addr=? terminal=pts/1 res=success'
type=CRED_ACQ msg=audit(1754239114.267:325): pid=3557 uid=1000 auid=1000 ses=9 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:setcred grantors=pam_unix acct="root" exe="/usr/bin/su" hostname=? addr=? terminal=pts/1 res=success'
type=USER_START msg=audit(1754239114.278:326): pid=3557 uid=1000 auid=1000 ses=9 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:session_open grantors=pam_keyinit,pam_keyinit,pam_limits,pam_systemd,pam_unix,pam_xauth acct="root" exe="/usr/bin/su" hostname=? addr=? terminal=pts/1 res=success'
这里是输入密码后

root权限执行cat /etc/shadow没有被记录
其实我还尝试了vim /etc/ssh/sshd_config,修改和保存也没有被记录
测试结果

查看重要文件/etc/shadow没有被记录,重要行为修改/etc/ssh/sshd_config也没有被记录

配置文件(纯测试)

我后来让ai生成一份满足审计要求的审计配置文件

# ==============================================
# 等保2.0三级要求 - 审计规则配置(GB/T 22239-2019)
# 核心目标:确保所有安全事件可追溯、审计日志不可篡改
# ==============================================

# --------------------------
# 1. 身份鉴别与访问控制审计
# --------------------------
# 监控用户账号变更(符合"身份鉴别"控制点)
-w /etc/passwd -p wa -k identity_change       # 用户密码文件
-w /etc/shadow -p wa -k identity_change       # 影子密码文件
-w /etc/group -p wa -k identity_change        # 用户组文件
-w /etc/gshadow -p wa -k identity_change      # 组密码文件
-w /etc/sudoers -p wa -k privilege_escalation # sudo权限配置

# 监控登录与会话管理(符合"访问控制"控制点)
-w /var/log/lastlog -p wa -k login_activity   # 登录记录
-w /var/run/faillock/ -p wa -k login_failure  # 登录失败记录
-w /var/log/wtmp -p wa -k session_activity    # 会话日志
-a always,exit -F arch=b64 -S login -S logout -k session_change  # 登录/注销系统调用

# --------------------------
# 2. 系统配置变更审计
# --------------------------
# 监控核心系统配置(符合"安全配置管理"控制点)
-w /etc/sysctl.conf -p wa -k system_config    # 内核参数配置
-w /etc/security/limits.conf -p wa -k resource_limit  # 资源限制配置
-w /etc/audit/ -p wa -k audit_config          # 审计规则自身变更(防止篡改)
-w /etc/fstab -p wa -k mount_config           # 文件系统挂载配置

# 监控网络配置变更(符合"网络安全"控制点)
-w /etc/network/ -p wa -k network_config      # 网络接口配置
-w /etc/resolv.conf -p wa -k dns_config       # DNS配置
-w /etc/iptables/ -p wa -k firewall_config    # 防火墙规则

# --------------------------
# 3. 敏感操作与命令审计
# --------------------------
# 监控特权命令执行(符合"入侵防范"控制点)
-w /usr/bin/su -p x -k privilege_escalation   # su命令执行
-w /usr/bin/sudo -p x -k privilege_escalation # sudo命令执行
-a always,exit -F arch=b64 -S execve -k command_exec  # 所有命令执行记录

# 监控系统时间变更(防止日志篡改)
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change  # 时间调整系统调用

# --------------------------
# 4. 数据安全审计
# --------------------------
# 监控敏感文件访问(符合"数据完整性"控制点)
-w /root/ -p rwa -k sensitive_data_access     # root目录访问
-w /home/*/.ssh/ -p rwa -k ssh_key_access     # SSH密钥文件
-w /var/lib/mysql/ -p rwa -k database_access  # 数据库文件访问(根据实际路径调整)

# 监控文件删除与重命名(防止数据销毁)
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -k file_deletion

# --------------------------
# 5. 审计日志自身保护
# --------------------------
# 确保审计日志不可篡改(符合"审计日志完整性"控制点)
-w /var/log/audit/ -p wa -k audit_log_access  # 审计日志文件访问
-a always,exit -F arch=b64 -S auditctl -k audit_command  # 监控auditctl命令(防止规则删除)

# --------------------------
# 6. 规则生效与日志配置
# --------------------------
-D                                           # 清除现有规则
-b 8192                                      # 审计缓冲区大小(8MB,避免日志丢失)
--log-format=raw                             # 原始日志格式(便于集中审计系统解析)
--backlog_wait_time=60                       # 缓冲区满时等待时间(秒)

然后虚拟机CUP就炸了,所以还是要有一定的取舍

覆盖到每个用户,对重要的用户行为和重要安全事件

怎么算重要用户行为和安全事件,我这里也理不太轻,但是我觉得账号和ssh是比较关键的,其它的自行探索吧

核心审计规则:/etc/audit/rules.d/audit.rules

-w /etc/ssh/sshd_config -p wa -k sshd
#-w指定文件
#-p指定操作
#-k是别名
auditctl -l


审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息

这个其实是默认符合的

type=USER_END msg=audit(1754371201.358:337): pid=36377 uid=0 auid=0 ses=7 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_close grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'


应对计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等审

保护

主要是审计日志的权限,默认是符合的

定期备份

定期备份形式有很多,这里就写用crontab本地备份

cron有比较三个查看方式

crontab -l
cat /etc/crontab
ls /etc/cron.d/
定时任务解析
[root@192 ~]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
分时日月周

备份audit.log日志,每周4的4点备份,保存90天

vim /etc/crontab

或者crontab -e都可以

0 4 * * 4 mkdir -p /var/log/backup && cp /var/log/audit/audit.log /var/log/backup/audit_$(date +\%Y\%m\%d).log && gzip /var/log/backup/audit_$(date +\%Y\%m\%d).log && find /var/log/backup -name “audit_*.log.gz” -mtime +90 -delete

rsyslog传输解析

这是rsyslog.conf的配置文件,主要是最后一行

搭建rsyslog服务实验

服务器IP

默认都安装了rsyslog服务的,不重复安装了
客户端:192.168.202.134
服务器端:192.168.202.137
服务器端我直接把防火墙关掉的,所以不涉及端口开放

服务器端原配置

修改成如下(取消注释,用UDP):

存储路径

#按客户端IP分目录存储日志(例如:/var/log/client_logs/192.168.1.100/xxx.log)
$template RemoteLogs,"/var/log/client_logs/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log"
*.* ?RemoteLogs  # 所有日志应用上述模板
& ~  # 停止日志向上级rsyslog服务器转发(避免重复)

创建文件并授权

mkdir -p /var/log/client_logs
chown -R root:root /var/log/client_logs
chmod -R 755 /var/log/client_logs

重启rsyslog服务

systemctl restart rsyslog

查看UDP514端口是否监听

netstat -untlp | grep 514

客户端更改配置

重启rsyslog服务

systemctl restart rsyslog

但是这有很关键的一点,使用rsyslog不会把audit.log文件上传到日志服务器里面去,只会上传一些内核文件,因为audit.log是不通过rsyslog写入的,所以不会上传,需要另外配置

配置rsyslog上传audit.log到日志审计服务器
通过 imfile 模块(rsyslog的模块)直接监控 audit.log
vim /etc/rsyslog.d/audit.conf
配置 imfile 模块监控 audit.log
# 1. 加载文件监控模块(若已在其他配置中加载,可省略此行)
module(load="imfile" PollingInterval="10")  # PollingInterval:10秒检查一次文件变化

# 2. 监控 audit.log 文件
input(
  type="imfile"
  File="/var/log/audit/audit.log"  # 审计日志路径
  Tag="auditd"                     # 日志标签(便于在服务器端识别)
  Severity="info"                  # 日志级别(固定为 info)
  Facility="local6"                # 分配一个专用设施(如 local6,避免与其他服务冲突)
)

# 3. 转发审计日志到日志服务器(复用已有的 *.* 规则或单独指定)
# 若已配置 *.* @192.168.202.137:514,可省略此行;否则需添加:
local6.* @192.168.202.137:514  # 仅转发 local6 设施的日志(即审计日志)
查看rsyslog的权限
systemctl status rsyslog

查看对应权限

这里只是说明不用换权限,并不推荐用root权限运行rsyslog服务

重启 rsyslog 服务

systemctl restart rsyslog
然后就能在服务端查看到对应的日志了,但是日志会很多,容易爆炸
保存6个月日志

使用轮询,或者直接使用备份保存6个月都可以

原配置

更改后配置


应对审计进程进行保护,防止未经授权的中断

审计进程现在只要是rsyslog服务不中断就行



入侵防范

应遵循最小安装的原则,仅安装需要的组件和应用程序

查看当前版本

uname -a

查看已安装程序包

yum list installed

应关闭不需要的系统服务、默认共享和高危端口

查看运行的服务

systemctl list-unit-files | grep enable

检查系统当前端口

netstat -untlp

应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制

防火墙限制

firewall限制
firewall原理

firewall分临时和永久两种规则模式

永久:–permanent 需要重载,否则不生效,生效就永久生效

临时:不需要添加参数,立刻生效,重启失效

firewall使用的是区域(zone)的模式,相当于交换机的分区吧

默认有很多区,比如home dmz public等

区域的优先级按细化程度划分,比如绑定了sources(源 IP)或 interfaces(接口)的区域优先级更高

查看所有区域:
firewall-cmd --get-zones

查看所有区域的规则(不管是否生效):
firewall-cmd --list-all-zones

查看生效区域(有流量,就是有触发的):
firewall-cmd --get-active-zones

查看特定区域的命令:
firewall-cmd --zone=<区域名> --list-all
firewall配置

查看firewall是运行

systemctl status firewalld.service

查看ssh端口(我这里默认是22,可以在配置文件中设置)

netstat -ntlp | grep ssh

查看firewall触发规则的区域

firewall-cmd --get-active-zones

查看public的规则

firewall-cmd --zone=public --list-all

这里显示就是默认允许ssh流量通过

那我们需要设置一个允许通过特定IP和禁止所有IP连接

创建自定义区域

firewall-cmd --new-zone=ssh_whitelist --permanent

重载区域

firewall-cmd --reload

添加源地址到区域

firewall-cmd --zone=ssh_whitelist --add-source=192.168.202.1/32 --permanent

添加端口到区域

firewall-cmd --zone=ssh_whitelist --add-port=22/tcp --permanent

在 public 区域(优先级最低)添加“拒绝所有 IP 访问 SSH”的规则

firewall-cmd --zone=public --add-rich-rule="rule family=ipv4 port port=22 protocol=tcp reject" --permanent
rule family=ipv4 # 指定规则适用的网络协议族(IPv4)
port port=22 # 匹配目标端口为 22(SSH 默认端口)
protocol=tcp # 匹配传输协议为 TCP
reject # 对匹配的流量执行“拒绝”动作(发送拒绝响应)

重载规则

firewall-cmd --reload

然后重启ssh,测试

iptable限制

设置特例及禁止所有

# 1. 允许本地回环通信
iptables -A INPUT -i lo -j ACCEPT

# 2. 允许已建立的连接(避免 SSH 断开)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 3. 仅允许 192.168.202.1 访问 22 端口
iptables -A INPUT -p tcp --dport 22 -s 192.168.202.1 -j ACCEPT

# 4. 拒绝其他所有 IP 访问 22 端口
iptables -A INPUT -p tcp --dport 22 -j DROP

# 5. 设置 INPUT/FORWARD 链默认策略为 DROP(未匹配规则的流量全部拒绝)
iptables -P INPUT DROP
iptables -P FORWARD DROP

立即保存规则并重启服务

# 保存规则到配置文件(CentOS 7 路径)
iptables-save > /etc/sysconfig/iptables

# 重启 iptables 服务使规则生效
systemctl restart iptables

验证规则

iptables -L INPUT --line-numbers

SSH配置文件限制

vi /etc/ssh/sshd_config

# 仅允许 IP 为 192.168.202.1 的主机登录(替换为你的允许 IP)
AllowUsers *@192.168.202.1

systemctl restart sshd

hosts文件限制

vim /etc/hosts.allow
sshd: 192.168.202.1

vim /etc/hosts.deny
sshd: ALL

恶意代码防范

应采用免受恶意代码攻击的技术措施或主动免疫可信验证机制及时识别入侵和病毒行为,并将其有效阻断

ps -ef
查一下看看有没有病毒软件

恶意代码:病毒、木马、蠕虫等等都算恶意代码

可信验证

可基于可信根对计算设备的系统引导程序、系统程序、重要配置参数和应用程序等进行可信验证,并在应用程序的关键执行环节进行动态可信验证,在检测到其可信性受到破坏后进行报警,并将验证结果形成审计记录送至安全管理中心

数据完整性

应采用校验技术或密码技术保证重要数据在传输过程中的完整性,包括但不限于鉴别数据、重要业务数据、重要审计数据、重要配置数据、重要视频数据和重要个人信息等

查看使用的算法

传输过程的数据完整性,数据完整性由差错校验保证,Linux使用ssh传输

ssh查看校验算法

ssh -v 127.0.0.1

这里看到实际算法是MD5(较弱),生成基于 MD5 哈希函数的消息认证码

更换算法

vim /etc/ssh/sshd_config

末尾添加
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-512

重启ssh服务

systemctl restart sshd
ssh -v 127.0.0.1

文末附加内容