Linux等级保护2.0笔记

RedHat/CentOS

查看版本

1
2
3
4
5
6
7
8
9
10
# 查看Linux 内核版本
cat /proc/version
uname –a
uname –r
# 查看Linux 版本:
lsb_release –a
cat /etc/redhat-release
cat /etc/centos-release
rpm -q redhat-release
rpm -q centos-release

身份鉴别

密码策略

口令复杂度

  • 使用pam_pwquality.sopam_cracklib.so模块检查口令强度
    文件位置:/etc/pam.d/system-auth
参数 说明
difok=N 口令历史,默认值为5
minlen=N 最短口令长度
dcredit=N 新口令允许使用有的数字的数量,N=-1是至少有一个数字
ucredit=N 新口令允许使用的大写字母的数量,N=-1是至少有一个大写字母
lcredit=N 新口令允许使用的小写字母的数量,N=-1是至少有一个小写字母
ocredit=N 新口令允许使用的特殊字符的数量,N=-1是至少有一个特殊字符
minclass=N 新口令中使用的字符种类,即大小写字母、数字和字符,默认值为0
maxrepeat=N 拒绝包含超过N个相同连续字符的口令,默认值为0
maxsequence=N 拒绝包含大于N的单调字符序列的密码,如‘123456’或‘fedcba’,默认值为0。
maxclassrepeat=N 拒绝包含同一类中超过N个连续字符的密码,默认值为0。
reject_username 检查新密码中是否包含直接或反向形式的用户名称,如root/toor
enforce_for_root 对root用户进行检查
authtok_type=XXX 提示输入密码的文本内容。默认是”New UNIX password: “ and “Retype UNIX password: “,可以自定义
retry=N 返回错误前最多提示用户N次。默认值为1。
dictpath=/path 密码字典路径,centos7.2版本的默认字典路径在/usr/share/cracklib下
示例配置
1
2
3
4
5
6
7
# 在CentOS7中,pam_pwquality模块取代了pam_cracklib模块
# pam_pwquality.so
password requisite pam_pwquality.so enforce_for_root minlen=8 minclass=3 difok=3 reject_username
password requisite pam_pwquality.so enforce_for_root minlen=8 difok=3 reject_username ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
# pam_cracklib.so
password requisite pam_cracklib.so enforce_for_root minlen=8 minclass=3 difok=3 reject_username
password requisite pam_cracklib.so enforce_for_root minlen=8 difok=3 reject_username ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1

口令更换周期

  • /etc/login.defs
1
2
3
4
5
6
7
8
9
10
11
# 默认参数
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7

# 推荐参数
PASS_MAX_DAYS 90 #密码有效期/天
PASS_MIN_DAYS 1 #更换密码的最小天数
PASS_MIN_LEN 8 #密码最小长度,实际无效,需要通过system-auth文件来进行控制
PASS_WARN_AGE 7 #密码失效前多少天开始警告

注意:login.defs仅对新添加的用户生效,不会影响现有账户。

  • chage -l username
查看单个用户的口令更改策略
1
2
3
4
5
6
7
Last password change                                    : Dec 12, 2018 # 上次修改时间
Password expires : never # 密码过期时间
Password inactive : never # 密码失效时间
Account expires : never # 帐户过期时间
Minimum number of days between password change : 0 # 两次改变密码之间相距的最小天数
Maximum number of days between password change : 99999 # 两次改变密码之间相距的最大天数
Number of days of warning before password expires : 7 # 在密码过期之前警告的天数
口令更改时间
1
2
3
# 通过shadow文件计算
cat /etc/shadow
date -u -d "1970-01-01 UTC $((16749 * 86400 )) seconds"
设置账户口令定期更改策略
1
2
3
chage -m 1 username  #设置两次改变密码之间相距的最小天数为1天
chage -M 90 username #设置两次改变密码之间相距的最大天数为90天
chage -W 7 username #在密码过期之前警告的天数为7天

登录失败

  • 使用pam_tally2.sopam_faillock.so模块配置登录失败
选项 说明
onerr=[fail|succeed] 失败或者成功,默认为失败
file=/path/to/counter 在哪里保存计数文件。默认值是/var/log/tallylog
audit 如果找不到用户,则会将用户名登录到系统日志中
silent 关闭信息提示
no_log_info 不要通过syslog(3)记录信息性消息
deny=N 如果此用户的计数超过n,则拒绝访问
lock_time=n 尝试失败后n秒内始终拒绝
unlock_time=n 尝试失败n秒后允许访问。如果使用此选项,则在用户超过允许的最大尝试次数后,将在指定的时间段内被锁定。否则,帐户将被锁定,直到系统管理员手动干预解除锁定
magic_root 如果uid=0的用户调用模块,则计数器不会递增。系统管理员应将此参数用于用户启动的服务(如su),否则应忽略此参数
even_deny_root 拒绝root用户
root_unlock_time=n 此选项意味着甚至可以拒绝根选项。尝试失败后,允许在n秒后访问根帐户。如果使用此选项,则在根用户超过其允许的最大尝试次数后,将在指定的时间内被锁定
serialize 使用锁序列化对计数文件的访问。此选项只能用于非多线程服务,因为它依赖于tally文件的fcntl锁定。另外,仅在身份验证阶段与帐户或setcred阶段之间的时间不依赖于身份验证客户端的配置中使用此选项也是一个好主意。否则,身份验证客户端将能够通过简单地人为地延长文件记录锁的保持时间来防止同一用户同时进行身份验证
可设置文件路径
1
2
3
/etc/pam.d/sshd        #默认仅对ssh登录有效
/etc/pam.d/system-auth #默认仅对本地登录有效
/etc/pam.d/login #默认仅对本地登录有效
示例配置
1
2
3
4
5
# 注意,CentOS8已淘汰tally2.so
# pam_tally2.so
auth required pam_tally2.so deny=5 unlock_time=600 even_deny_root root_unlock_time=600
# pam_faillock.so
auth required pam_faillock.so deny=5 unlock_time=600 even_deny_root root_unlock_time=600
  • 补充
  • auth
    是 authentication (认证) 的缩写,所以这种类别主要用来检验使用者的身份验证,这种类别通常是需要口令来检验的, 所以后续接的模块是用来检验用户的身份。

  • account
    account (账号) 则大部分是在进行 authorization (授权),这种类别则主要在检验使用者是否具有正确的权限, 举例来说,当你使用一个过期的口令来登陆时,当然就无法正确的登陆了。

  • session
    session 是会议期间的意思,所以 session 管理的就是使用者在这次登陆 (或使用这个命令) 期间,PAM 所给予的环境配置。 这个类别通常用在记录用户登陆与注销时的信息!例如,如果你常常使用 su 或者是 sudo 命令的话, 那么应该可以在 /var/log/secure 里面发现很多关于 pam 的说明,而且记载的数据是『session open, session close』的信息!

  • password
    password 就是口令嘛!所以这种类别主要在提供验证的修订工作,举例来说,就是修改/变更口令啦!

关于pam.d第一个字段:验证类别 (Type)
  • required
    此验证若成功则带有 success (成功) 的标志,若失败则带有 failure 的标志,但不论成功或失败都会继续后续的验证流程。 由于后续的验证流程可以继续进行,因此相当有利于数据的登录 (log) ,这也是 PAM 最常使用 required 的原因。

  • requisite
    若验证失败则立刻回报原程序 failure 的标志,并终止后续的验证流程。若验证成功则带有 success 的标志并继续后续的验证流程。 这个项目与 required 最大的差异,就在于失败的时候还要不要继续验证下去?由于 requisite 是失败就终止, 因此失败时所产生的 PAM 信息就无法透过后续的模块来记录了。

  • sufficient
    若验证成功则立刻回传 success 给原程序,并终止后续的验证流程;若验证失败则带有 failure 标志并继续后续的验证流程。 这玩意儿与 requisits 刚好相反!

  • optional
    这个模块控件目大多是在显示信息而已,并不是用在验证方面的。

  • include
    包括指定为该控件参数的配置文件中给定类型的所有行。

  • substack
    包括指定为该控件参数的配置文件中给定类型的所有行。这与包含的不同之处在于,评估子堆栈中的完成和死亡操作不会导致跳过完整模块堆栈的其余部分,而只会跳过子堆栈。子栈中的跳转也不能使求值跳出子栈,在父栈中跳转时,整个子栈都计为一个模块。重置操作会将模块堆栈的状态重置为子堆栈评估开始时的状态。

关于pam.d第二个字段:验证的控制旗标(control flag)

使用者的特殊shell 与PAM 模组

登录超时

  • /etc/profile
1
TMOUT=300
  • /etc/ssh/ssh_config
1
2
ClientAliveInterval 60 #每隔60秒向客户端发送消息
ClientAliveCountMax 3 #3次未响应则关闭连接

ssh_config方式基于网络,即使不操作客户端也会发送消息


远程管理协议

1
2
service sshd status
service telnetd status

双因子身份鉴别


访问控制

强制访问控制/selinux

相关知识点

查看selinux的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
more /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - 强制模式,代表SELinux运作中,且已经正确的开始限制domain/type了并进行日志记录;
# permissive - 宽容模式,代表SELinux运作中,不过仅会有警告信息并不会实际限制domain/type的存取。这种模式可以运来作为SELinux的debug之用,该模式会记录日志;
# disabled - 关闭selinux
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - 针对网路服务限制较多,针对本机限制较少,是预设的策略;
# minimum - 由target修订而来,仅针对选择的程序来保护!
# mls - 完整的SELinux 限制,限制方面较为严格。
SELINUXTYPE=targeted #建议使用预设的targeted策略即可。
selinux相关命令
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
getenforce #查看当前selinux处于何种工作模式
sestatus #查看当前selinux服务状态
sestatus -v #检查列于/etc/sestatus.conf内的文件与程序的安全性本文内容;
sestatus -b #将目前策略的规则布林值列出,亦即某些规则(rule)是否要启动(0/1)之意;
getsebool -a #查看所有selinux规则状态,同sestatus -b

setenforce [0|1]
#0 :转成permissive 宽容模式;
#1 :转成Enforcing 强制模式
#注意,关闭或开启selinux需重新启动,宽容模式或强制模式可在线切换

setsebool [-P] 『规则名称』 [0|1]
#-P :直接将设定值写入配置文件,该设定资料未来会生效的!

#手动修改SELinux type
chcon [-R] [-t type] [-u user] [-r role] 文件
chcon [-R] --reference=范例文件
#-R :连同该目录下的次目录也同时修改;
#-t :后面接安全性本文的类型栏位!例如httpd_sys_content_t ;
#-u :后面接身份识别,例如system_u; (不重要)
#-r :后面接角色,例如system_r; (不重要)
#-v :若有变化成功,请将变动的结果列出来
#--reference=范例:拿某个文件当范例来修改后续接的文件的类型!

#使用restorecon 让文件恢复正确的SELinux type
restorecon [-Rv] 文件或目录
#-R :连同次目录一起修改;
#-v :将过程显示到屏幕上
查看当前标记类型
1
2
3
ls -Z #查看文件
netstat -lntpZ #查看端口和服务
ps -eZ #查看进程

安全审计

审计进程

系统日志服务
1
2
3
4
5
6
7
service rsyslog status #(CentOS6或redhat6以下为syslog)
service auditd status
#或
service --status-all | grep running
#查看进程
PS -ef | grep syslog
ps -ef | grep auditd

auditd命令

1
2
3
auditctl -l #查看audit规则
ausearch #日志搜索
aulastlog #类似于lastlog,所有用户的上次登录时间

日志配置文件

1
/etc/audit/audit.rules
  • /etc/rsyslog.conf、/etc/syslog.conf
rsyslog.conf文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 将info或更高级别的消息送到messages,除了mail、authpriv、cron以外。
# 其中*是通配符;none表示不对任何级别的信息进行记录。
*.info;mail.none;authpriv.none;cron.none /var/log/messages

# 将授权和安全相关的消息记录到secure文件中
authpriv.* /var/log/secure

# 由mail子系统产生的消息记录到maillog中.
mail.* -/var/log/maillog

# cron守护进程相关的信息记录到cron文件中
cron.* /var/log/cron

# 最高级别消息发送给所有在线的用户
*.emerg *

# 网络消息子系统.重要情况
uucp,news.crit /var/log/spooler

# 将和系统启动相关的信息记录到boot.log
local7.* /var/log/boot.log
  • 日志设施有:
日志类别 说明
auth(security), 主要与认证/授权有关的机制,例如login、ssh、su等需要帐号/密码的
authpriv 与auth类似,但记录较多帐号私人的信息,包括pam模组的运作等
kern(kernel) 就是核心(kernel) 产生的信息,大部分都是硬体侦测以及核心功能的启用
mail 由mail子系统产生的消息
cron 就是例行性工作cron/at等产生信息记录的地方
daemon 主要是系统的服务所产生的信息,例如systemd就是这个有关的信息!
news 网络消息子系统的信息
lpr 打印相关的日志信息
user 用户进程相关的信息
uucp 全名为Unix to Unix Copy Protocol,早期用于unix 系统间的程序资料交换
ftp 与FTP通信协定有关的信息输出
local0 to local7 保留给本机用户使用的一些登录文件信息,较常与终端机互动
  • 日志级别有(升序):
日志级别 说明
none 不进行记录
debug 包含详细的开发情报的信息,通常只在调试一个程序时使用。
info 情报信息,正常的系统消息,比如骚扰报告,带宽数据等,不需要处理。
notice 不是错误情况,也不需要立即处理。
warning(warn) 警告信息,不是错误,比如系统磁盘使用了85%等。
err(error) 错误,不是非常紧急,在一定时间内修复即可。
crit 重要情况,如硬盘错误,备用连接丢失。
alert 应该被立即改正的问题,如系统数据库被破坏,ISP连接丢失。
emerg(panic) 紧急情况,需要立即通知技术人员。
  • 配置说明

.代表『比后面还要严重的等级(含该等级) 都被记录下来』的意思,例如:mail.info代表只要是mail的信息,而且该信息等级严重于info(含info本身)时,就会被记录下来的意思。
.=代表所需要的等级就是后面接的等级而已, 其他的不要!
.!有点反向选择的感觉,代表忽略大于等于这个等级的讯息!亦即是低于这个等级的才会被纪录的意思!与.相反

如何对rsyslog进行配置
rsyslog.service:记录登录档的服务

日志文件

日志文件 说明
/var/log/boot.log 开机的时候系统核心会去侦测与启动硬件,接下来开始各种核心功能启动等。这些流程都会记录在/var/log/boot.log 里面哩!不过这个档案只会存在这次开机启动的信息,前次开机的信息并不会被保留下来!
/var/log/cron 系统定时任务相关信息
/var/log/cups 打印信息
/var/log/dmesg 系统在开机时内核自检的信息
/var/log/btmp 错误登录信息(二进制文件,使用lastb命令查看)
/var/log/lastlog 系统中所有用户最后一次登录时间信息(二进制文件,使用lastlog命令查看)
/var/log/mailog 邮件信息
/var/log/message 系统重要信息(Linux绝大多数重要信息)
/var/log/secure 登录和授权方面的信息(登录、切换用户、sudo授权、添加用户、修改密码)
/var/log/wtmp 永久记录所有用户登录,注销信息,系统启动、重启、关机事件(二进制文件,使用last查看)
/var/log/utmp 当前已登录用户信息(二进制文件,使用who、w、users查看)

日志存储时间

/etc/logrotate.conf
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
30
31
32
33
34
35
# see "man logrotate" for details
# rotate log files weekly
weekly #日志切割间隔/每周

# keep 4 weeks worth of backlogs
rotate 4 #轮询次数,linux默认保存4周的日志

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}

/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}

# system-specific logs may be also be configured here.

Linux日志切割神器logrotate原理介绍和配置详解
登录档的轮替(logrotate)


入侵防范

系统服务

1
2
3
4
5
6
7
systemctl list-units --type=service | grep running #查看正在运行的服务
systemctl list-unit-files --type=service #自启动服务
service --status-all #CentOS7以下
ps -ef
setup #通过图形界面记录系统开启的网络服务
chkconfig --list #查看各运行级别下系统开启的服务,命令行为3,5为图形化
who –r #查看系统当前运行级别
  • 可能的多余服务
    • cupsd,TCP631,打印服务
    • portmap/rpcbind,TCP111,文件共享
    • rpc.*

端口

1
2
3
netstat -lntp #查看tcp端口
netstat -lnup #查看udp端口
netstat -ano #早期Linux

地址限制

  • /etc/hosts.allow、/etc/hosts.deny
参数
1
2
sshd:192.168.1.0/24:allow #允许192.168.1.0/24这个网段登录
sshd:*:deny #拒绝所有地址登录
  • /etc/ssh/sshd_config
参数
1
2
AllowUsers root test@192.168.1.1 #允许root登录和从192.168.1.1登录的test用户
DenyUsers root test@192.168.1.1 #禁止root登录和从192.168.1.1登录的test用户
  • firewall
1
2
firewall-cmd --state #查看防火墙是否在运行
firewall-cmd --list-all #查看所有规则
  • iptables
命令
1
iptables -n -L

补丁包

1
rpm -qa grep patch



Solaris

查看版本

1
cat /etc/release #Solaris

身份鉴别

密码策略

  • /etc/default/passwd
参数
1
2
3
4
5
6
MINWEEKS=1   # 密码可以被改变的最小时段
MAXWEEKS=13 # 密码最大的生存周期
WARNWEEKS=4 # 设定密码到期提醒天数
PASSLENGTH=8 # 设定密码长度
MINALPHA=2 # 口令必须包含字母的最小数目
MINDIFF=1 # 口令必须包含唯一字符的最小数目

登录失败

1
2
3
4
5
/etc/security/policy.conf
/etc/default/login

LOCK_AFTER_RETRIES=YES
RETRIES=5

远程协议

Solaris
1
2
svcs | grep ssh
svcs | grep telnet

访问控制

安全审计

Solaris
1
2
3
4
/etc/default/login
SYSLOG=YES #审计进程运行正常

svcs |grep auditd #audit服务

审计内容

Solaris
1
2
3
4
5
6
7
8
9
10
11
/etc/syslog.conf 
*.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages

/etc/security/audit_control
#应设置需审计的事件类,如:
#audit_control file
dir: /var/audit
flags:1o
minfree:20
naflags:lo
*审计事件类型至少应包括:lo、fw、fm、fd。

日志文件

RadHat/CentOS
1
2
3
/var/log/messages
/var/log/secure
/var/log/audit/audit.log
Solaris
1
2
3
/var/adm/messages;
/var/adm/wtmpx;
/var/adm/utmpx;

入侵防范

端口

1
2
3
netstat -lntp #查看tcp端口
netstat -lnup #查看udp端口
netstat -ano #早期Linux

服务

Solaris
1
svcs -a

补丁

Solaris
1
cat /etc/release #系统版本、安全补丁安装

地址限制

Solaris
1
2
3
/etc/default/login
# 参数
CONSOLE=/dev/console