Linux 主机安全基线 2024-06-23 03:18:00 Steven Xeldax [TOC] # RHEL/Centos/AM2 基线(yum系列) ## 账号与口令基线 ### 禁止除 root 之外的特权帐号 #### 要求内容 UID为0的任何帐号都拥有系统的最高特权,应保证主机上UID为0的帐号中,除了root和经批准的帐号之外,没有其他帐号的UID为0 #### 检测方法 /etc/passwd文件里查看除root和经批准的帐号之外,是否有其他帐号的uid为0。 #### 修复建议 执行usermod –u UID username或者修改/etc/passwd文件,将UID设置为非0。 ### 禁止root用户直接SSH远程登录系统 #### 要求内容 限制root用户直接登录系统。 执行管理员权限操作,应先以普通权限用户登录后,再切换到root帐号后执行相应操作。 #### 检测方法 检查SSH登录策略,确认/etc/ssh/sshd_config文件中PermitRootLogin no 是否已设置。 #### 修复建议 修改/etc/ssh/sshd_config文件,将PermitRootLogin yes改为PermitRootLogin no,重启sshd服务。 ### 禁用密码直接登录SSH远程系统 #### 要求内容 禁止SSH 使用密码登录,默认只接收SSH私钥登录系统 #### 检测方法 检查SSH登录策略,确认/etc/ssh/sshd_config文件中PasswordAuthentication no 是否已设置。 #### 修复建议 修改/etc/ssh/sshd_config文件,设置PasswordAuthentication no,重启sshd服务。 ### 检查SSH使用的协议版本 #### 要求内容 检查SSH使用的协议版本,禁用协议版本 1,使用协议版本 2。 #### 检测方法 使用命令“cat /etc/ssh/sshd_config”查看配置文件检查 “Protocol”的参数值。 #### 修复建议 检查/etc/ssh/sshd_config 文件中Protocol参数值是否为1,若为1则修改为2或者删除Protocol参数行,若未设置该值则按照默认值无需修改。 ### 禁止通过SSH服务连接X11图形界面转发检查 #### 要求内容 禁止通过SSH服务连接X11图形界面。 #### 检测方法 使用命令“cat /etc/ssh/sshd_config | grep ^X11Forwarding”查看配置文件检查X11Forwarding的值是否为no。 #### 修复建议 检查/etc/ssh/sshd_config文件中X11Forwarding参数值是否为yes,若为yes则修改为no或者删除X11Forwarding参数行,若为设置改制则按照默认值无需修改。 ### root的环境变量 #### 要求内容 root用户的环境变量中不能含有可执行本地目录执行操作的“点命令”。 #### 检测方法 以root身份执行“echo $PATH”命令,检查root用户环境量中不包含当前目录“.”。 #### 修复建议 使用命令“vi /etc/profile”,修改 echo $PATH 后面的路径。 ### 登录超时时间 #### 要求内容 登录超时时间为1800秒或以下。 #### 检测方法 使用命令“cat /etc/profile |grep TMOUT”查看TMOUT超时时间设置,需小于等于1800. #### 修复建议 在/etc/profile 文件中加入以下3行 TMOUT=1800 readonly TMOUT export TMOUT ### 口令最短长度 #### 要求内容 必须设置口令最短长度为8或以上。 #### 检测方法 RHEL、CentOS、Oracle Linux: 方法一: /etc/pam.d/system-auth文件里“password $CONTROL pam_cracklib.so”一行里是否包括minlen=8的设定 方法二: /etc/pam.d/system-auth文件里“password $CONTROL pam_pwquality.so”一行里是否包括minlen=8的设定 方法三: /etc/pam.d/system-auth文件里“password $CONTROL pam_passwdqc.so”一行里是否包括“min=disabled, disabled, 8, 8,8”(数字都大于等于8)的设定 Ubuntu、Debian、SLES: 方法一: /etc/pam.d/common-password文件里“password $CONTROL pam_cracklib.so”一行里是否包括minlen=8的设定 方法二: /etc/pam.d/common-password文件里“password $CONTROL pam_pwquality.so”一行里是否包括minlen=8的设定 注:$CONTROL为“requisite”或“required” #### 修复建议 RHEL、CentOS、Oracle Linux: 方法一: /etc/pam.d/system-auth文件里“password $CONTROL pam_cracklib.so”一行里设置minlen=8 方法二: /etc/pam.d/system-auth文件里“password $CONTROL pam_pwquality.so”一行里设置minlen=8 方法三: /etc/pam.d/system-auth文件里“password $CONTROL pam_passwdqc.so”一行里设置“min=disabled, disabled, 8, 8,8”(数字都大于等于8) Ubuntu、Debian、SLES: 方法一: /etc/pam.d/common-password文件里“password $CONTROL pam_cracklib.so”一行里设置minlen=8 方法二: /etc/pam.d/common-password文件里“password $CONTROL pam_pwquality.so”一行里设置minlen=8 注:$CONTROL为“requisite”或“required” ### 口令复杂度 #### 要求内容 必须设置口令复杂度包含大写/小写字母、数字、特殊符号任选3种组合。 #### 检测方法 RHEL、CentOS、Oracle Linux: 方法一: /etc/pam.d/system-auth文件里"password $CONTROL pam_cracklib.so"一行里是否包括minclass=3,enforce_for_root的设定 方法二: /etc/pam.d/system-auth 文件里" password $CONTROL pam_pwquality.so "一行里是否包括 minclass=3及enforce_for_root 的设定 方法三: /etc/pam.d/system-auth文件里“password $CONTROL pam_passwdqc.so”一行里是否包括“min=disabled, disabled, 8, 8, 8”(数字都大于等于8)及enforce=everyone的设定 Ubuntu、Debian: 方法一: /etc/pam.d/common-auth文件里"password $CONTROL pam_cracklib.so"一行里是否包括minclass=3及enforce_for_root 的设定 方法二: /etc/pam.d/common-auth 文件里" password $CONTROL pam_pwquality.so "一行里是否包括minclass=3及enforce_for_root 的设定 注:$CONTROL为“requisite”或“required” #### 修复建议 RHEL、CentOS、Oracle Linux: 方法一: /etc/pam.d/system-auth文件里"password $CONTROL pam_cracklib.so"一行添加minclass=3,enforce_for_root的设定 方法二: /etc/pam.d/system-auth 文件里" password $CONTROL pam_pwquality.so "一行添加 minclass=3及enforce_for_root 的设定 方法三: /etc/pam.d/system-auth文件里“password $CONTROL pam_passwdqc.so”一行里添加“min=disabled, disabled, 8, 8, 8”(数字都大于等于8)及enforce=everyone的设定 Ubuntu、Debian: 方法一: /etc/pam.d/common-auth文件里"password $CONTROL pam_cracklib.so"一行里添加minclass=3及enforce_for_root 的设定 方法二: /etc/pam.d/common-auth 文件里" password $CONTROL pam_pwquality.so "一行里添加minclass=3及enforce_for_root 的设定 注:$CONTROL为“requisite”或“required” ### 口令历史 #### 要求内容 修改口令必须不能使用最近10次的密码。 #### 检测方法 RHEL、CentOS、Oracle Linux: /etc/pam.d/system-auth 文件里“password $CONTROL pam_unix.so”一行里是否包括remember=10的设定 Ubuntu、Debian: /etc/pam.d/common-password SLES: /etc/pam.d/common-auth文件里“password $CONTROL pam_unix.so”一行里是否包括remember=10的设定 注:$CONTROL为“required”或“sufficient” #### 修复建议 RHEL、CentOS、Oracle Linux: /etc/pam.d/system-auth 文件里“password $CONTROL pam_unix.so”一行里设置remember=10 Ubuntu、Debian: /etc/pam.d/common-auth 文件里 “password $CONTROL pam_unix.so”一行里设置remember=10 SLES: /etc/pam.d/common-auth文件里“password $CONTROL pam_unix.so”一行里设置remember=10 注:$CONTROL为“required”或“sufficient” ### 口令时间长度 #### 要求内容 设置口令最短修改时间为7天,最长时间为90天,口令过期警告为15天。 #### 检测方法 grep ^PASS_MIN_DAYS /etc/login.defs 命令输出值为 7 grep ^PASS_MAX_DAYS /etc/login.defs 命令输出值为 90 grep ^PASS_WARN_AGE /etc/login.defs 命令输出值为 15 #### 修复建议 修改/etc/login.defs 文件直到符合上面规则。 ## 文件权限 ### Daemon Umask 设置 #### 要求内容 Daemon umask 必须设置为022 或更严格,建议设置为027 #### 检测方法 查看/etc/profile 文件里 umask 设置是否均为 022 或更严格 #### 修复建议 修改/etc/profile,设置 umask 022或更严格(推荐027) ### 系统敏感文件权限设置 #### 要求内容 passwd、shadow 和 group 文件的 Owner 和 Group 必须设置为 root; passwd、group 文件的权限必须设置为 644 或更严格; shadow 文件的权限必须设置为 400 或更严格 #### 检测方法 查看/etc 目录下上述文件的属性 #### 修复建议 通过 chown、chgrp、chmod 命令修改文件属性,参考命令如下: chown root /etc/passwd chgrp root /etc/passwd chmod 644 /etc/passwd chmod 400 /etc/shadow ### 系统关键日志文件属性配置要求 #### 要求内容 系统/var/log/目录下关键日志文件,包括但不限于 messages、secure、cron、wtmp、utmp、lastlog 等日志文 件,权限设置应为 664 或更严格。 #### 检测方法 查找系统/var/log/目录下关键日志文件,将其权限与664比较。 #### 修复建议 chmod 664 /var/log/messages chmod 664 /var/log/secure chmod 664 /var/log/cron chmod 664 /var/log/wtmp chmod 664 /var/log/utmp chmod 664 /var/log/lastlog ## 日志基线 ### 配置history时间戳,便于审计 #### 要求内容 配置history时间戳,便于审计。 #### 检测方法 已添加,如:“export HISTTIMEFORMAT="%F %T”配置为符合。 #### 修复建议 在/etc/bashrc文件中增加如下行: export HISTTIMEFORMAT="%F %T ### 开启安全日志记录功能 #### 要求内容 必须开启安全日志记录功能,捕获发送给 Syslog AUTHPRIV Facility 的消息。 #### 检测方法 /etc/rsyslog.conf 查看是否有 authpriv.* /var/log/secure #### 修复建议 在/etc/rsyslog.conf 添加 authpriv.* /var/log/secure,重启 syslog 服务 ## 安全软件 ### EDR/HIDS 安装 #### 要求内容 为监控主机安全情况,需要安装HIDS/EDR #### 检测方法 执行以下命令查看进程信息 ``` # ps -ef | grep "EDR进程名字" | grep -v "grep" ``` #### 修复建议 参考自家EDR部署文档 # 一键检测脚本 bash 本基线检测 ``` #!/bin/bash # 1. 检查UID为0的账户 echo "Checking for UID 0 accounts..." uid_zero_accounts=$(awk -F: '($3 == 0) {print $1}' /etc/passwd) for account in $uid_zero_accounts; do if [ $account != "root" ] && [ $account != "approved_account1" ] && [ $account != "approved_account2" ]; then echo "Unauthorized UID 0 account found: $account" fi done # 2. 禁止root用户直接SSH远程登录系统 echo "Checking SSH remote login settings..." if grep -q "PermitRootLogin yes" /etc/ssh/sshd_config; then echo "PermitRootLogin is set to yes. Please update your SSH configuration." fi # 3. 禁用密码直接登录SSH远程系统 echo "Checking SSH password authentication settings..." if grep -q "PasswordAuthentication yes" /etc/ssh/sshd_config; then echo "PasswordAuthentication is set to yes. Please update your SSH configuration." fi # 4. 检查SSH协议版本 echo "Checking SSH protocol version..." if grep -q "Protocol 1" /etc/ssh/sshd_config; then echo "Protocol 1 is enabled. Please disable Protocol 1 in your SSH configuration." fi # 5. 禁止X11图形界面转发 echo "Checking SSH X11 forwarding settings..." if grep -q "X11Forwarding yes" /etc/ssh/sshd_config; then echo "X11Forwarding is set to yes. Please update your SSH configuration to disable X11 forwarding." fi # 6. 检查root用户环境变量 echo "Checking root user environment variables..." if [[ $PATH == *"."* ]]; then echo "Root user's PATH contains '.'. Please remove '.' from the PATH." fi # 7. 登录超时时间设置 echo "Checking login timeout settings..." if grep -q "TMOUT" /etc/profile; then echo "Login timeout is set. Please make sure it is set to 1800 seconds or below." fi # 8. 口令最短长度设置 echo "Checking password minimum length..." if grep -q "PASS_MIN_LEN" /etc/login.defs; then pass_min_len=$(grep "PASS_MIN_LEN" /etc/login.defs | awk '{print $2}') if [ $pass_min_len -lt 8 ]; then echo "Password minimum length is less than 8 characters. Please update the password policy." fi fi # 9. 口令复杂度设置 echo "Checking password complexity settings..." if grep -q "pam_cracklib.so" /etc/pam.d/common-password; then complexity=$(grep "pam_cracklib.so" /etc/pam.d/common-password | grep -o '[dlus]{3,}') if [ ${#complexity} -lt 3 ]; then echo "Password complexity requirement is not met. Please update the password policy." fi fi # 10. Daemon umask 设置 echo "Checking daemon umask settings..." if grep -q "umask 022" /etc/init.d/*; then echo "Daemon umask is not set to 022 or stricter. Please update the umask settings." fi # 11. 检测wdavdaemon进程是否安装 echo "Checking for wdavdaemon process..." if ! pgrep wdavdaemon >/dev/null; then echo "wdavdaemon process is not installed." fi ``` 使用nessus 进行基线检测 linux-base-list.audit ``` https://download.xeldax.top/linux-base-list.audit ``` 使用lynis 进行基线检测 https://github.com/CISOfy/lynis ``` Clone or download the project files (no compilation nor installation is required) ; git clone https://github.com/CISOfy/lynis Execute: cd lynis && ./lynis audit system If you want to run the software as root (or sudo), we suggest changing the ownership of the files. Use chown -R 0:0 to recursively alter the owner and group and set it to user ID 0 (root). Otherwise Lynis will warn you about the file permissions. After all, you are executing files owned by a non-privileged user. ``` 使用openscap进行基线检测 https://www.open-scap.org/getting-started/ ``` yum install openscap-scanner oscap info /usr/share/xml/scap/ssg/content/ssg-rhel6-ds.xml ``` # 参考连接 CIS: https://downloads.cisecurity.org/#/ 阿里云:https://developer.aliyun.com/article/552766#slide-10 其他:https://net.njau.edu.cn/__local/1/67/A5/D21715B801E6421539442E4C0DB_BBFF938E_692F7.pdf github: https://github.com/trimstray/linux-hardening-checklist github baseline check: https://github.com/dev-sec/linux-baseline