xdm!我又又又回来了!打不死的蟑螂,打不死的李坚强ing
合规基线
主机安全合规检查
本文包含常见16条安全合规检查!
小李有话说:
- 对文件搜索替换
语法: sed 选项 ‘s/搜索的内容/替换的内容/动作’ 文件
其中 s:代表search 搜索; / 分隔符(可以自定义); 动作一般是p打印和全局替换g
\ 代表转义;^代表替换整行
小李有话说:
在linux中通常会使用shell结合正则表达式来过滤字符,本文将以一个简单的例子来说明+,*,[:space:]的一些用法
+ 匹配1个或多个字符
* 匹配0个或多个字符
[:space:] 匹配空白字符,包括空格,tab
小李有话说:
PAM配置文件的每一行的格式:(详情见下文)
Module-type Control-flag Module-path Arguments
模块类型 控制字符 模块路径 模块参数
小李有话说:
① 在包含某个关键字的行上面插入一行文字,命令如下:
sed -i ‘/hello/i\1234’ testfile
执行完命令后,会将i后面反斜杠后面的内容插入到包含hello关键字行的上面
② 在包含某个关键字的行下面插入一行文字,命令如下:
sed -i ‘/hello/a\4567’ testfile
执行完命令后,会将a后面反斜杠后面的内容插入到包含hello关键字行的下面
-
用户帐户和环境 - 检查密码最小长度是否大于等于8
id: 92014 title: "用户帐户和环境 - 检查密码最小长度是否设置为大于等于8" description: "/etc/login.defs 文件中的 PASS_MIN_LEN 参数为口令最小长度,考虑到密码复杂度建议将 PASS_MIN_LEN 参数设置为8或以上。" rationale: "密码最小长度应:大于等于8" condition: all rules: - 'f:/etc/login.defs -> n:^PASS_MIN_LEN\s*\t*(\d+)$ compare >= 8' -
用户帐户和环境 - 检查密码过期时间是否小于等于90天
-
用户帐户和环境 - 检查修改密码的最小间隔时间是否大于等于7天
-
用户帐户和环境 - 检查密码过期警告时间是否大于等于7天
/etc/login.defs文件
PASS_MAX_DAYS 60 #密码最大有效期,此处参数PASS_MAX_DAYS为60,表示60天后,密码会过期。99999表示永不过期。 PASS_MIN_DAYS 0 #两次修改密码的最小间隔时间,0表示可以随时修改账号密码 PASS_MIN_LEN 8 #密码最小长度,对于root无效 PASS_WARN_AGE 7 #密码过期前多少天开始提示 UID_MIN 500 UID_MAX 60000 UID_MIN #用户ID的最小值 UID_MAX #用户ID的最大值 GID_MIN 500 GID_MAX 60000 GID_MIN #组ID最小值 GID_MAX #组ID最大值 CREATE_HOME yes CREATE_HOME #表示是否创建用户home目录 USERGROUPS_ENAB yes USERGROUPS_ENAB #该参数启用,表示userdel删除用户时,如果该用户用户组如果没有成员存在,则会删除该用户组 MD5_CRYPT_ENAB yes ENCRYPT_METHOD MD5 ENCRYPT_METHOD #表示用户密码加密方式,此处表示用MD5加密密码 -
配置PAM认证 - 检查密码重用是否受限制
原理:/etc/pam.d/password-auth 和 /etc/pam.d/system-auth 文件中应存在:password sufficient pam_unix.so remember=5
$ sudo vi /etc/pam.d/common-passwordpassword [success=1 default=ignore] pam_unix.so obscure sha512 remember=5“remember=5” 表示禁止使用最近用过的5个密码(己使用过的密码会被保存在 /etc/security/opasswd 下面
-
SSH服务配置 - 检查SSH空闲超时间隔是否设置
/etc/ssh/sshd_config文件中ClientAliveInterval应设置为:小于等于300,ClientAliveCountMax应设置为:小于等于3
ClientAliveInterval 300 ClientAliveCountMax 3 #按上面的配置的话,300*3=900秒=15分钟,即15分钟客户端不响应时,ssh连接会自动退出。 -
SSH服务配置 - 检查SSH的HostbasedAuthentication是否禁用/
etc/ssh/sshd_config文件中HostbasedAuthentication应设置为:no
HostbasedAuthentication yes #指定身份验证是否允许 EnableSSHKeysign yes StrictHostKeyChecking no -
SSH服务配置 - 检查SSH的MaxAuthTries参数是否小于四
MaxAuthTries参数(初始值为6)指定每个连接允许的最大验证尝试次数。当登录次数达到设置的一半时,错误信息将被写入syslog文件进行记录。
Port 22960 LoginGraceTime 30 #认证的时限 MaxAuthTries 3 #认证的次数 Protocol 2 PermitRootLogin no**sshd:**使用ssh协议(专为远程登录会话和其他网络服务提供安全性的协议)远程开启其他主机shell(最高权限)的服务。
Secure Shell (SSH) 是一个允许两台电脑之间通过安全的连接进行数据交换的网络协议。加密保证了数据的保密性和完整性。SSH采用公钥加密技术来验证远程主机,以及(必要时)允许远程主机验证用户。SSH 通常用于远程访问和执行命令,但是它也支持隧道,转发任意 TCP 端口以及 X11 连接;它还能够用 SFTP 或 SCP 协议来传输文件。SSH服务器默认在tcp的22端口进行监听。一个SSH客户端程序一般建立一个远程连接daosshd守护进程。
systemctl start sshd #启动sshd(前提是使用默认22端口)/etc/ssh/sshd_config文件:
# This is ssh server systemwide configuration file. Port 22 #设置sshd监听的端口号 ListenAddress 192.168.1.1 #设置sshd服务器绑定的IP地址 HostKey /etc/ssh/ssh_host_key #设置包含计算机私人密匙的文件。 ServerKeyBits 1024 #定义服务器密匙的位数。 LoginGraceTime 600 #设置如果用户不能成功登录,在切断连接之前服务器需要等待的时间(以秒为单位) KeyRegenerationInterval 3600 #设置在多少秒之后自动重新生成服务器的密匙(如果使用密匙)。重新生成密匙是为了防止用盗用的密匙解密被截获的信息。 PermitRootLogin no #设置root能不能用ssh登录。这个选项一定不要设成“yes”。 IgnoreRhosts yes #设置验证的时候是否使用“rhosts”和“shosts”文件。这个参数可以忽略以前登陆过的主机的记录。 IgnoreUserKnownHosts yes #设置ssh daemon是否在进行RhostsRSAAuthentication安全验证的时候忽略用户的“$HOME/.ssh/known_hosts” StrictModes yes #设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。这通常是必要的,因为新手经常会把自己的目录和文件设成任何人都有写权限。 X11Forwarding no #设置是否允许X11转发。 PrintMotd yes #设置sshd是否在用户登录的时候显示“/etc/motd”中的信息。 SyslogFacility AUTH #设置在记录来自sshd的消息的时候,是否给出“facility code”(设备码)。 LogLevel INFO #设置记录sshd日志消息的层次。INFO是一个好的选择。查看sshd的man帮助页,已获取更多的信息。 RhostsAuthentication no #设置只用rhosts或“/etc/hosts.equiv”进行安全验证是否已经足够了。 RhostsRSAAuthentication no #设置是否允许用rhosts或“/etc/hosts.equiv”加上RSA进行安全验证。 RSAAuthentication yes #设置是否允许只有RSA安全验证。 PasswordAuthentication yes #设置是否允许口令验证。 PermitEmptyPasswords no #设置是否允许用口令为空的帐号登录。 AllowUsers admin # “AllowUsers”的后面可以跟着任意的数量的用户名的匹配串(patterns)或user@host这样的匹配串,这些字符串用空格隔开。主机名可以是DNS名或IP地址。 -
SSH服务配置 - 检查SSH的PermitEmptyPasswords是否禁用
-
SSH服务配置 - 检查SSH使用的协议版本,应该使用ssh2
SSH1采用DES、3DES、Blowfish和RC4等对称加密算法保护数据安全传输,而对称加密算法的密钥是通过非对称加密算法(RSA)来完成交换的。SSH1使用循环冗余校验码(CRC)来保证数据的完整性,但是后来发现这种方法有缺陷。
SSH2用数字签名算法(DSA)和Diffie-Hellman(DH)算法代替RSA来完成对称密钥的交换,用消息证实代码(HMAC)来代替CRC。同时SSH2增加了AES和Twofish等对称加密算法。
-
配置PAM认证 - 检查密码创建要求是否配置
原理:/etc/pam.d/password-auth 和 /etc/pam.d/system-auth 文件中应:设置密码创建要求,即存在:retry 、minlen 、dcredit、 ucredit 、ocredit、 lcredit 设置
PAM通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。 PAM模块是一种嵌入式模块,修改后即时生效。
PAM配置文件语法格式
每个PAM配置文件都包含一组指令,用于定义模块以及控制标志和参数。每条指令都有一个简单的语法,用于标识模块的目的(接口)和模块的配置设置,语法格式如下:module_interface control_flag module_name module_arguments
如在/etc/pam.d/password-auth-ac配置文件中(CentOS),其中一行PAM模块接口定义如下
多次登录失败用户被锁定及使用Pam_Tally2解锁
PAM配置文件的每一行的格式:
Module-type:
auth:确定有关用户认证的两方面。第一,他确认用户就是他们自己,这通过应用程序提示用户输入密码
或者其他正式身份的办法。第二,这类模块会赋予成员资格。 account:处理非认证级的账号管理。典型的用法是基于一天的不同时间来限制、允许访问某服务。限制
当前可用的系统资源(最大用户数)或者限制特定用户—root只能从控制台登陆。 session:一系列有关动作,只在用户得到/失去服务时要做的事。这包括记录用户的登录/退出、挂载必要 的目录等。
password:设置密码。
Control-flag:
required:表示本模块必须返回成功才能通过认证,但是如果该模块返回失败的话,失败结果也不会立即
通知用户,而是要等到同一stack中的所有模块全部执行完毕再将失败结果返回给应用程序。可以认为是一个必 要条件。 requisite:与required类似,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行
同一stack内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件。注:Solaris不支持。 sufficient:表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是
如果本模块返回失败的话可以忽略。可以认为是一个充分条件。 optional:表明本模块是可选的,它的成功与否一般不会对身份认证起关键作用,其返回值一般被忽略。
include,从字面就知道什么意思了。包含另外一个配置文件。
Module-path:
Debian的PAM
module存放目录默认是在/lib/security。在各个模块的配置文件里,不用写绝对路径,直接
写这个默认目录下面的模块名就可以了。当然,也可以写绝对路径。Arguments:
各个模块的参数都不一样,具体的要开发者的man手册。无效参数不会对结果有影响,但是会被日志记录
下来。首先,看看/lib/security有没有这个模块,再:man 模块名
PAM常见模块
| PAM模块 | 结合管理类型(模块类型) | 说明 |
| ---------------- | ----------------------------- | ------------------------------------------------------------ |
| pam_unix.so | auth | 提示用户输入密码,并与/etc/shadow文件相比对.匹配返回0 |
| pam_unix.so | account | 检查用户的账号信息(包括是否过期等).帐号可用时,返回0. |
| pam_unix.so | password | 修改用户的密码. 将用户输入的密码,作为用户的新密码更新shadow文件 |
| pam_shells.so | auth,account | 如果用户想登录系统,那么它的shell必须是在/etc/shells文件中之一的shell |
| pam_deny.so | account,auth,password,session | 该模块可用于拒绝访问 |
| pam_permit.so | account,auth,password,session | 模块任何时候都返回成功. |
| pam_securetty.so | auth | 如果用户要以root登录时,则登录的tty必须在/etc/securetty之中. |
| pam_listfile.so | account,auth,password,session | 访问应用程的控制开关 |
**cracklib模块**用来检查密码是否违反密码字典,密码的强度检测分二次进行,第一次只是检测密码是否是提供的对比字典中的一部分,如果检测结果是否定的,那么就会提供一些附加的检测来进一步检测其强度,例如检测新密码中的字符占旧密码字符的比例,密码的长度,所用字符大小写状况,以及是否使用了特殊字符等等
**cracklib模块参数补充:**
```
debug:将debug信息写入syslog
type=XXX:提示输入密码的文本内容。默认是"New UNIX password: " and "Retype UNIX password: ",可自定
retry=N:用户最多可以几次输入密码后报错。默认是1次。
difok=N:新密码有几个字符不能和旧密码相同,默认是5个。另外如果新密码有1/2的字符于旧不同,也会被接受。
diginore=N:默认当新密码有23个字符时,difok选项会被忽略。
minlen=N:最小密码长度。
dcredit=N:当N>=0时,N代表新密码最多可以有多少个阿拉伯数字。当N<0时,N代表新密码最少要有多少个阿拉伯数字。
ucredit=N:和dcredit差不多,但是这里说的是大写字母。
lcredit=N:和dcredit差不多,但是这里说的是小写字母。
ocredit=N:和dcredit差不多,但是这里说的是特殊字符。
use_authtok:在某个与密码相关的验证模块后使用此选项,例如pam_unix.so验证模块
```
pam_cracklib 模块式PAM配置接口的基本模块,在Debian系统中配置文件是 /etc/pam.d/common-password 但是在Redhat系统中配置文件是 /etc/pam.d/system-auth 他的配置看起来像以下这样:
```
password required pam_cracklib.so retry=3 minlen=6 difok=3
#cracklib模块以及它的参数
password required pam_unix.so md5 use_authtok
#pam_unix模块,使用MD5加密。通过这个模块可以实现存储用户旧密码。
```
-
配置PAM认证 - 检查登录失败配置
在线上的服务器有时需要限制用户登录次数.这个功能可以通过pam的pam_tally2.so模块来实现。
/etc/pam.d/password-auth 和 /etc/pam.d/system-auth 文件中应:设置登录失败锁定。
格式
-
pam_tally2.so [file=/path/to/counter] [onerr=[fail|succeed]] [magic_root] [even_deny_root] [deny=n] [lock_time=n] [unlock_time=n]
-
[root_unlock_time=n] [serialize] [audit] [silent] [no_log_info]
参数
file:指定统计次数用的文件,默认是/var/log/tallylog magic_root:如果用户uid=0,在帐户认证时调用该模块发现失败时,不计入统计 even_deny_root:root用户一样被锁定 deny:普通用户锁定次数 lock_time:普通用户锁定后等待的时间 unlock_time:普通用户锁定后解锁要等待的时间手动解除锁定:
查看某一用户错误登陆次数: pam_tally –-user 例如,查看work用户的错误登陆次数: pam_tally –-user work 清空某一用户错误登陆次数: pam_tally –-user –-reset 例如,清空 work 用户的错误登陆次数, pam_tally –-user work –-reset faillog -r 命令亦可。 pam_tally2 –u tom --reset将用户的计数器重置清零(SLES 11.2下用此命令才重置成功) 查看错误登录次数:pam_tally2 –u tom -
-
配置PAM认证 - 检查失败密码尝试锁定是否配置
使用pam_tally2模块的pam_tally2部分(剩下一部分是pam_tally2.so)
-
用户和组设置 - 检查SSH密码字段是否不为空
-
配置PAM认证 - 检查密码散列算法是否为SHA-512
/etc/pam.d/system-auth文件的全部内容:
[root@wazuh-test1 ~]# grep -v ^# /etc/pam.d/system-auth auth required pam_env.so auth required pam_faildelay.so delay=2000000 auth sufficient pam_unix.so nullok try_first_pass auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet account required pam_permit.so password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so -session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so auth required pam_tally2.so deny=5 unlock_time=60 even_deny_root=5 root_unlock_time=60
替换脚本(优化中ing)
#! /usr/bin/bash
#用户和账户环境部分
#1. 检查密码最小长度是否大于等于8
#2. 检查密码过期时间是否小于等于90天
#3. 用户帐户和环境 - 检查修改密码的最小间隔时间是否大于等于7天
#4. 检查密码过期警告时间是否大于等于7天
sed -i 's/^PASS_MIN_LEN[[:space:]]*[0-10]*$/PASS_MIN_LEN 8/g' /etc/login.defs
sed -i 's/^PASS_MAX_DAYS[[:space:]]*[0-10]*$/PASS_MAX_DAYS 90/g' /etc/login.defs
sed -i 's/^PASS_MIN_DAYS[[:space:]]*[0-10]*$/PASS_MIN_DAYS 7/g' /etc/login.defs
sed -i 's/^PASS_WARN_AGE[[:space:]]*[0-10]*$/PASS_WARN_AGE 7/g' /etc/login.defs
#配置PAM环境
#1. 检查密码重用是否受限制
#2. 检查密码创建要求是否配置
#3. 检查登录失败配置
#4. 检查失败密码尝试锁定是否配置
#5. 检查密码散列算法是否为SHA-512
sed -i 's/^password sufficient pam_unix.so remember[[:space:]]*[0-10]*$/password sufficient pam_unix.so remember=5/' /etc/pam.d/password-auth
sed -i 's/^password sufficient pam_unix.so remember[[:space:]]*[0-10]*$/password sufficient pam_unix.so remember=5/' /etc/pam.d/system-auth
sed -i 's/^password required pam_cracklib.so retry[[:space:]]*[0-10]*$/password required pam_cracklib.so retry=3 minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1/' /etc/pam.d/password-auth
sed -i 's/^password required pam_cracklib.so retry[[:space:]]*[0-10]*$/password required pam_cracklib.so retry=3 minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1/' /etc/pam.d/system-auth
sed -i '/^#%PAM-1.0/a auth required pam_tally2.so deny=3 unlock_time=40 even_deny_root root_unlock_time=30/' /etc/pam.d/password-auth
sed -i '/^#%PAM-1.0/a auth required pam_tally2.so deny=3 unlock_time=40 even_deny_root root_unlock_time=30/' /etc/pam.d/system-auth
sed -i '/^password sufficient pam_unix.so[[:space:]]*[0-10]*$/a password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok' /etc/pam.d/system-auth
#SSH服务配置
#1. 检查SSH空闲超时间隔是否设置
#2. 检查SSH的HostbasedAuthentication是否禁用
#3. 检查SSH的MaxAuthTries参数是否小于四
#4. 检查SSH的PermitEmptyPasswords是否禁用/检查SSH密码字段是否不为空
sed -i 's/^ClientAliveInterval[[:space:]]*[0-10]*$/ClientAliveInterval 300/g' /etc/ssh/sshd_config
sed -i 's/^ClientAliveCountMax[[:space:]]*[0-10]*$/ClientAliveCountMax 3/g' /etc/ssh/sshd_config
sed -i 's/^HostbasedAuthentication[[:space:]]*[0-10]*$/HostbasedAuthentication yes/g' /etc/ssh/sshd_config
sed -i 's/^EnableSSHKeysign[[:space:]]*[0-10]*$/EnableSSHKeysign yes/g' /etc/ssh/sshd_config
sed -i 's/^StrictHostKeyChecking[[:space:]]*[0-10]*$/StrictHostKeyChecking no/g' /etc/ssh/sshd_config
sed -i 's/^PermitEmptyPasswords[[:space:]]*[0-10]*$/PermitEmptyPasswords no/g' /etc/ssh/sshd_config
## Port
sed -i 's/^Port[[:space:]]*[0-10]*$/Port 22960/g' /etc/ssh/sshd_config
sed -i 's/^MaxAuthTries[[:space:]]*[0-10]*$/MaxAuthTries 3/g' /etc/ssh/sshd_config
sed -i 's/^LoginGraceTime[[:space:]]*[0-10]*$/LoginGraceTime 30/g' /etc/ssh/sshd_config
sed -i 's/^Protocol[[:space:]]*[0-10]*$///g' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin[[:space:]]*[0-10]*$/PermitRootLogin no/g' /etc/ssh/sshd_config
sed -i 's/^PermitEmptyPasswords[[:space:]]*[0-10]*$/PermitEmptyPasswords no/g' /etc/ssh/sshd_config
本文详细介绍了如何使用Shell脚本进行16条常见的Linux主机安全合规检查,包括密码策略、PAM配置、SSH服务配置等,提供具体命令示例,帮助提升系统安全性。
51

被折叠的 条评论
为什么被折叠?



