Linux与等保那些事
1 用户系统资源限制
修改limits.conf
文件
vi /etc/security/limits.conf
根据实际需求对文件中的各个变量参数进行合理设置
- fsize 用户创建的文件大小限制;
- core 生成的core文件大小的限制;
- cpu 用户进程可用cpu的限定值;
- data 进程数据段大小的限定值;
- stack 进程堆栈段大小的限定值;
- rss 进程常驻内存段的限定值;
- nofiles 进程中打开文件的最大数量。
2 身份鉴别
2.1 应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换
检查以下内容:
- 检查是否存在空密码账户;
- 身份标识(UID)具有唯一性;
- 设置密码复杂度要求;
- 定期更换密码;
- 设置密码最短修改时间,防止非法用户短期更改多次;
- 限制密码重用;
- 确保root是唯一的UID为0的帐户
2.1.1 加固建议
1、执行cat /etc/shadow | awk -F: '($2 == "" ) { print $1}'
, 查看空密码账户并处理;
2、查看/etc/passwd
,检查是否有重复UID的用户并清理;
3、编辑/etc/security/pwquality.conf
,密码最小长度minlen
设置为8-32之间,minclass
设置3或4,如 minlen=10
, minclass=3
,Ubuntu为/etc/pam.d/common-password
直接vi编辑器 ,或者用sed命令
# retry= N:定义登录/修改密码失败时,可以重试的次数;
# difok= N:定义新密码中必须有几个字符要与旧密码不同。但是如果新密码中有1/2以上的字符与旧密码不同时,该新密码将被接受;
# minlen = N:定义用户密码的最小长度;
# dcredit = N:定义用户密码中必须包含多少个数字;
# ucredit = N:定义用户密码中必须包含多少个大写字母;
# lcredit = N:定义用户密码中必须包含多少个小些字母;
# ocredit = N:定义用户密码中必须包含多少个特殊字符(除数字、字母之外);
# minclass = N:定义用户密码所需的最少字符类数
其中 =-1表示,至少有一个
sed -i 's/# minlen = 9/minlen = 8/' /etc/security/pwquality.conf
sed -i 's/# dcredit = 1/dcredit = -1/' /etc/security/pwquality.conf
sed -i 's/# ucredit = 1/ucredit = -1/' /etc/security/pwquality.conf
sed -i 's/# lcredit = 1/lcredit = -1/' /etc/security/pwquality.conf
sed -i 's/# ocredit = 1/ocredit = -1/' /etc/security/pwquality.conf
4、定期更换密码,在 /etc/login.defs
中将PASS_MAX_DAYS
参数设置为 30-90
之间,如 PASS_MAX_DAYS 90
。需同时执行命令设置root密码失效时间:chage --maxdays 90 root
sed -i '/PASS_MAX_DAYS/s/99999/90/' /etc/login.defs
chage --maxdays 90 root
5、设置密码最短修改时间,在 /etc/login.defs
中将PASS_MIN_DAYS
参数设置为 7-14
之间,如 PASS_MIN_DAYS 7
。需时执行命令为root用户设置:chage --mindays 7 root
sed -i '/PASS_MIN_DAYS/s/0/7/' /etc/login.defs
chage --mindays 7 root
6、在/etc/pam.d/password-auth
和/etc/pam.d/system-auth
中password sufficient pam_unix.so
这行的末尾配置remember
参数为5-24
之间,建议设为5,即行末尾加remember=5
7、除root以外其他UID为0的用户,都应该删除或者修改其UID
2.2 应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施
检测是否配置登陆失败锁定策略,是否设置空闲会话断开时间和启用登陆时间过期后断开与客户端的连接设置
2.2.1 加固建议
1、配置登陆失败锁定
备份要修改的文件
cp /etc/pam.d/password-auth /etc/pam.d/password-auth.bak
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
检查是否有pam_tally2.so
模块
find /lib*/ -iname "pam_tally2.so"
编辑/etc/pam.d/password-auth
和/etc/pam.d/system-auth
文件,在非注释行的第一行添加以下行(deny为连续失败次数,配置为3-8次,unlock_time为解锁时间,配置为600-1800秒)
auth required pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900
vi /etc/pam.d/system-auth
#%PAM-1.0
auth required pam_faillock.so preauth audit silent deny=5 unlock_time=900
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=900
auth required pam_tally2.so deny=5 unlock_time=900 even_deny_root root_unlock_time=10
# deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户
# unlock_time 设定普通用户锁定后,多少时间后解锁,单位是秒;
# root_unlock_time 设定root用户锁定后,多少时间后解锁,单位是秒;
2、设置系统登陆不活动连接超时退出
编辑/etc/profile
,将TMOUT
设置为300到1800,即5-30分钟
TMOUT=900
3、在/etc/ssh/sshd_config
中取消MaxAuthTries
注释符号#,设置最大密码尝试失败次数3-6,建议为5:MaxAuthTries 5
sed -i 's/^#MaxAuthTries 5/MaxAuthTries 3/' /etc/ssh/sshd_config
2.3 当对服务器进行远程管理时,应采取必要措施,防止鉴别信息在网络传输过程中被窃听
检查sshd是否强制使用V2安全协议(Centos7无需配置);禁止Telnet等不安全的远程连接服务。
2.3.1 加固建议
1、编辑 /etc/ssh/sshd_config
文件设置参数(Centos7无需配置):Protocol 2
2、执行命令service sshd restart
重启sshd服务 3、执行以下命令停止Telnet服务:
systemctl stop telnet.socket
systemctl disable telnet.socket
3 访问控制
3.1 应重命名或删除默认账户,修改默认账户的默认口令
- Linux下root账号不应删除,检查是否禁止SSH直接登陆即可
- root之外的系统默认帐户、数据库帐户禁止登陆(non-login)
- 确保无弱密码存在,对应的弱密码基线检测通过
3.1.1 加固建议
1、(注意:禁止root账户登陆前确保有其他账户可以正常使用)编辑配置文件/etc/ssh/sshd_config
,将PermitRootLogin yes
改为PermitRootLogin no
sed -i 's/^#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
2、执行systemctl restart sshd
重启ssh
3、root之外的系统默认帐户、数据库帐户禁止登陆(non-login)
4、确保所有系统用户的密码都设置为复杂密码
3.2 应对登录的用户分配账户和权限
- 除系统管理用户之外,应该分配普通用户、审计员、安全员帐户;
- 确保用户umask为027或更严格;
- 确保每个用户的home目录权限设置为750或者更严格。
3.2.1 加固建议
1、除系统管理用户之外,应该分配普通用户、审计员、安全员帐户;
2、检查/etc/bashrc
和/etc/profile
文件中uamsk
值是否设置为027
或更严格,否则添加或编辑umask参数: umask 027
执行命令:source /etc/profile
;
3、确保每个用户的home目录权限设置为750或者更严格
3.3 应及时删除或停用多余的、过期的账户,避免共享账户的存在
- root之外的系统默认帐户、数据库帐户禁止登陆(non-login)
- 锁定或删除shutdown、halt帐户
3.3.1 加固建议
1、root之外的系统默认帐户、数据库帐户禁止登陆(non-login)
2、锁定或删除shutdown、halt帐户:
usermod -L shutdown
usermod -L halt
3.4 应授予管理用户所需的最小权限,实现管理用户的权限分离
- 确保 su 命令的访问受限制
- 检查
/etc/sudoers
配置 sudo 权限的用户,根据需要给root以外用户配置 sudo 权限,但除管理员外不能所有用户都配置(ALL)权限。
3.4.1 加固建议
1、确保 su 命令的访问受限制,编辑 /etc/pam.d/su
文件添加:auth required pam_wheel.so use_uid
在/etc/group
文件中创建一个逗号分隔的用户列表:wheel:x:10:root,<user list>
2、检查/etc/sudoers
配置 sudo 权限的用户,不能所有用户都配置(ALL)权限
3.5 访问控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级
检查重要文件,如访问控制配置文件和用户权限配置文件的权限,是否达到用户级别的粒度
3.5.1 加固建议
1、执行以下4条命令:
chown root:root /etc/hosts.allow
chown root:root /etc/hosts.deny
chmod 644 /etc/hosts.deny
chmod 644 /etc/hosts.allow
2、执行以下5条命令
chown root:root /etc/passwd /etc/shadow /etc/group /etc/gshadow
chmod 0644 /etc/group
chmod 0644 /etc/passwd
chmod 0400 /etc/shadow
chmod 0400 /etc/gshadow
3、设置/etc/ssh/sshd_config
的权限:
chown root:root /etc/ssh/sshd_config
chmod 600 /etc/ssh/sshd_config
4、配置/etc/profile
文件权限:
chown root:root /etc/profile
chmod 644 /etc/profile
3.6 应由授权主体配置访问控制策略,访问控制策略规定主体对客体的访问规则
- 确保用户home目录权限设置为750或者更严格
- 无主文件或文件夹的所有权,根据需要重置为系统上的某个活动用户
- 设置ssh主机公钥文件的权限和所有权
- 设置ssh主机私钥文件的权限和所有权
3.6.1 加固建议
1、确保用户home目录权限设置为750或者更严格
2、运行以下命令以设置ssh主机公钥文件的权限和所有权:
find /etc/ssh -xdev -type f -name 'ssh_host_*_key.pub' -exec chmod 0644 {} \; find /etc/ssh -xdev -type f -name 'ssh_host_*_key.pub' -exec chown root:root {} \;
3、运行以下命令以设置ssh主机私钥文件的权限和所有权:
find /etc/ssh -xdev -type f -name 'ssh_host_*_key' -exec chmod 0600 {} \; find /etc/ssh -xdev -type f -name 'ssh_host_*_key' -exec chown root:root {} \;
4 安全审计
4.1 应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计
- 启用 auditd 服务
- 启用 rsyslog 或 syslog-ng 服务
- 确保收集用户的文件删除事件
- 确保收集对系统管理范围(sudoers)的更改
- 确保收集修改用户/组信息的事件 如使用了第三方日志收集服务,可自行举证并忽略此项。
4.1.1 加固建议
1、执行命令启用 auditd 服务:systemctl start auditd
;
2、执行命令systemctl start rsyslog
启用 rsyslog 服务;
3、将以下行添加到/etc/audit/rules.d/audit.rules
和/etc/audit/audit.rules
文件中:
-a always,exit -F arch=b64 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
-a always,exit -F arch=b32 -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
4、将以下行添加到/etc/audit/rules.d/audit.rules
和/etc/audit/audit.rules
文件中:
-w /etc/group -p wa -k identity
-w /etc/passwd -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/security/opasswd -p wa -k identity
5、将以下行添加到/etc/audit/rules.d/audit.rules
和/etc/audit/audit.rules
文件中:
-w /etc/sudoers -p wa -k scope
-w /etc/sudoers.d/ -p wa -k scope
重启:auditd: systemctl restart auditd
4.2 审计记录应包括事件的日期和时间、用户、事件类型、事件是否成功及其他与审计相关的信息
满足另外一个检查项:启用安全审计功能,即满足此项
4.2.1 加固建议
满足另外一个检查项:启用安全审计功能,即满足此项。
4.3 应对审计记录进行保护,定期备份,避免受到未预期的删除、修改或覆盖等
检查 auditd 文件大小、日志拆分配置或者备份至日志服务器
4.3.1 加固建议
可通过日志文件分隔备份或者远程服务器日志备份来实现,以下两种方式之一修复加固:
1、编辑/etc/audit/auditd.conf
,添加或编辑以下配置内容:
log_format定义了log日志的储存方式
log_format = RAW
log file的文件数量,设为5-10之间
num_logs = 5
max_log_file定义单个日志文件最大size,单位MB,设为5-50
max_log_file = 8
max_log_file_action = ROTATE
disk_full_action = SUSPEND
2、编辑/etc/rsyslog.conf
文件添加以下行( logfile.example.com 是日志主机的名称):
*.* @@loghost.example.com
执行以下命令重启 rsyslog :
pkill -HUP rsyslogd
4.4 应保护审计进程,避免受到未预期的中断
auditd 是审计进程audit的守护进程,syslogd 是日志进程 syslog 的守护进程,查看系统进程是否启动
4.4.1 加固建议
1、执行命令启用 auditd 服务:systemctl start auditd
;
2、执行命令启用 rsyslog 服务 :systemctl start rsyslog
;
5 入侵防范
5.1 应遵循最小安装的原则,仅安装需要的组件和应用程序
应卸载NetworkManager、avahi-daemon、bluetooth、firstboot、kdump、wdaemon、wpa_supplicant、ypbind
等软件
5.1.1 加固建议
卸载不必要的组件和程序,如NetworkManager、bluetooth、firstboot、wpa_supplicant、ypbind、kdump、avahi-daemon
yum -y remove avahi*
yum -y remove kexec-tools
yum -y remove *bluetooth*
yum -y remove NetworkManager*
yum -y remove firstboot
yum -y remove wpa_supplicant
yum -y remove ypbind
5.2 应通过设定终端接入方式或网络地址范围对通过网络进行管理的管理终端进行限制
/etc/hosts.allow
文件指定允许连接到主机的 IP 地址,不应配为ALL:ALL
。/etc/hosts.deny
文件指定禁止连接到主机到 IP,应该配置为ALL:ALL
默认禁止所有连接。 两者需要配合使用,且必须先配置/etc/hosts.allow
规则。若是已通过其他方式实现如网络安全组、防火墙等,可自行举证并忽略此项。
5.2.1 加固建议
配置hosts.deny
前请确保hosts.allow
已经正确配置,否则会导致无法远程访问主机
1、执行录入规则命令(<net>/<mask>,代表需要访问该服务器的网段,例如:“192.168.1.0/255.255.255.0”):
echo "ALL: <net>/<mask>, <net>/<mask>, ..." >/etc/hosts.allow
2、执行录入规则命令:
echo "ALL: ALL" >> /etc/hosts.deny
5.3 应关闭不需要的系统服务、默认共享和高危端口
- 应关闭不需要的系统服务、文件共享服务
- 关闭21 、23、25、111、427、631等高危端口 如有特殊需求必须严格配置访问控制策略,需自行举证和忽略。
5.3.1 加固建议
查看已经启动的或者是手动的系统服务,停止一些不必要的服务:
1、如使用命令关闭Telnet、RSH、SMB、Talk
服务服务:
systemctl disable telnet.socket
systemctl disable rsh.socket
systemctl disable smb
systemctl disable ntalk
systemctl stop telnet.socket
systemctl stop rsh.socket
systemctl stop smb
systemctl stop ntalk
2、禁用NFS
和RPC
服务
systemctl disable rpcbind
systemctl disable rpcbind.socket
systemctl disable nfs
systemctl disable nfs-server
systemctl stop rpcbind
systemctl stop rpcbind.socket
systemctl stop nfs
systemctl stop nfs-server
3、禁用IMAP
和POP3
服务
systemctl disable dovecot
systemctl stop dovecot
4、关闭21 、23、25、111、427、631端口
5.4 修改服务器SSH的版本信息
默认情况下,telnet ip 22端口会显示openssh
的版本信息
5.4.1 加固建议
修改ssh banner
信息
whereis sshd
cp /usr/sbin/sshd /usr/sbin/sshd.bak
strings /usr/sbin/sshd | grep OpenSSH
sed -i 's/OpenSSH_7.4/OpenSSH_9.8/g' /usr/sbin/sshd #修改版本
systemctl restart sshd
telnet 22端口测试banner信息,版本最好往大修改,有些漏扫根据服务版本判断漏洞,版本小就会说你有漏洞。
5.5 密码验证
禁止无密码访问,防范恶意占用ssh连接资源
PermitEmptyPasswords no # 禁止无密码访问服务器
LoginGraceTime 2m #在输入密码界面指定时间内没有成功连接断开连接,若无单位则默认时间为秒
sed -i 's/^#PermitEmptyPasswords no/PermitEmptyPasswords no/' /etc/ssh/sshd_config
sed -i 's/^#LoginGraceTime 2m/LoginGraceTime 2m/' /etc/ssh/sshd_config
5.6 ssh空闲超时
长时间无操作断开ssh连接
ClientAliveInterval 600 # 小于等于600s
sed -i 's/^#ClientAliveInterval 0/ClientAliveInterval 300/' /etc/ssh/sshd_config
修改完配置文件后,重新启动sshd服务器(systemctl restart sshd
)即可。
6 其他
6.1 限制用户使用的命令
6.1.1 创建用户并指定用户启动执行的shell
useradd -s /bin/rbash readonly
修改用户密码
passwd readonly
创建用户shell执行命令目录
mkdir /home/readonly/.bin
root修改用户的shell配置文件
chown root. /home/readonly/.bash_profile
chmod 755 /home/readonly/.bash_profile
修改bash配置文件,主要是指定PATH的读取
vi /home/readonly/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$HOME/bin
export PATH
将允许执行的命令链接到$HOME/bin目录
ln -s /usr/bin/wc /home/readonly/.bin/wc
ln -s /usr/bin/tail /home/readonly/.bin/tail
ln -s /bin/more /home/readonly/.bin/more
ln -s /bin/cat /home/readonly/.bin/cat
ln -s /bin/grep /home/readonly/.bin/grep
ln -s /bin/find /home/readonly/.bin/find
ln -s /bin/pwd /home/readonly/.bin/pwd
ln -s /bin/ls /home/readonly/.bin/ls
ln -s /bin/ll /home/readonly/.bin/ll