长亭百川云 - 文章详情

分享一个openEuler20.0+基础安全加固脚本

weishaoiiq

66

2024-06-25

基础安全加固脚本主要参考官方文档https://docs.openeuler.org/zh/

本脚本适用于 22.03 20.03版本,主要内容如下

1.禁止root远程登录,新建远程账户

2.禁止telent服务,关闭23高危端口。
3.配置登录超时退出,统一配置为300秒超时
4.配置不记录服务器历史命令
5.配置服务器用户密码90天过期
6.配置服务器用户密码复杂度
7.配置用户登录失败锁定
8.开启审计日志
9.配置日志转储

脚本内容如下

#!/bin/bash
# 安全配置检查
check_security_config() {
  source /etc/profile
    echo "一、### 安全配置检查 ###"
   #检查是否禁用root远程登录
  if grep "^PermitRootLogin no" /etc/ssh/sshd_config &> /dev/null; then
    echo "- 1.禁用root远程登录:是"
  else
    echo "- 1.未配置禁用root远程登录"
    useradd newuser
        echo "xUwujinZHI@Wx123" | passwd --stdin newuser > /dev/null 2>&1
    usermod -G wheel newuser
    sed -i '/^#PermitRootLogin/s/^#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
    sed -i '/^PermitRootLogin/s/^PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
    systemctl restart sshd
    if [ $? -eq 0 ];then
       echo "-- 禁止root远程登录成功,业务用户为newuser"
else
       echo "-- 禁止root远程登录失败,请检查配置"
           exit 4
fi
fi
  #检查是否禁用telnet服务
  if systemctl status telnet.socket &> /dev/null; then
    echo "- 2.未禁用telnet服务,执行禁用"
    systemctl stop telnet.socket
    systemctl disable telnet.socket
    if [ $? -eq 0 ];then
       echo "-- 禁用telnet服务成功"
else
       echo "-- 禁用telnet服务失败,请检查配置"
           exit 4
fi
else
    echo "- 2.已禁用telnet服务"
  fi
  #检查是否配置登录超时
  if env |grep TMOUT &> /dev/null; then
    echo "- 3.配置登录超时锁定:是"
  else
    echo "- 3.配置登录超时锁定,进行配置"
    echo "TMOUT=300" >> /etc/profile
    if [ $? -eq 0 ];then
       echo "-- 配置登录超时成功"
else
       echo "-- 配置登录超时失败,请检查配置"
           exit 4
fi
  fi
  #检查是否配置不记录历史命令
     if env |grep "HISTSIZE=0" &> /dev/null; then
    echo "- 4.配置不记录历史命:是"
   else
    echo "- 4.未配置不记录历史命,进行配置"
    echo "export HISTSIZE=0" >> /etc/profile
    if [ $? -eq 0 ];then
       echo "-- 配置不记录历史命成功"
else
       echo "-- 配置不记录历史命失败,请检查配置"
           exit 4
fi
  fi
  #检查是否口令定期更换
    if grep "^PASS_MAX_DAYS 90" /etc/login.defs &> /dev/null; then
    echo "- 5.配置口令定期更换:是"
   else
    echo "- 5.未配置口令定期更换,进行配置"
    sed -i 's/^\(PASS_MAX_DAYS\).*$/\1 90/' /etc/login.defs
    if [ $? -eq 0 ];then
       echo "-- 配置口令定期更换成功"
else
       echo "-- 配置口令定期更换失败,请检查配置"
           exit 4
fi
  fi
  #检查是否加固用户密码复杂度
     if grep "pam_pwquality.so minlen=8" /etc/pam.d/system-auth &> /dev/null; then
    echo "- 6.配置加固用户密码复杂度:是"
   else
    echo "- 6.未配置加固用户密码复杂度,进行配置"
    echo "password    requisite     pam_pwquality.so minlen=8 minclass=3 enforce_for_root try_first_pass local_users_only retry=3 dcredit=0 ucredit=0 lcredit=0 ocredit=0" >> /etc/pam.d/system-auth
    echo "password    required      pam_pwhistory.so use_authtok remember=5 enforce_for_root" >> /etc/pam.d/system-auth
    if [ $? -eq 0 ];then
       echo "-- 配置加固用户密码复杂度成功"
else
       echo "-- 配置加固用户密码复杂度失败,请检查配置"
           exit 4
fi
  fi
  #检查是否配置登录失败锁定
     if grep "pam_faillock.so" /etc/pam.d/system-auth &> /dev/null; then
    echo "- 7.配置登录失败锁定:是"
   else
    echo "- 7.未配置登录失败锁定,进行配置"
     sed -i '/auth        required      pam_env.so/a\auth        required      pam_faillock.so preauth audit deny=3 even_deny_root unlock_time=300' /etc/pam.d/system-auth
    if [ $? -eq 0 ];then
       echo "-- 配置登录失败锁定成功"
else
       echo "-- 配置登录失败锁定失败,请检查配置"
           exit 4
fi
  fi
  #检查是否开启审计日志
     if systemctl  status auditd &> /dev/null; then
    echo "- 8.开启审计日志:是"
    auditctl -w /etc/shadow -p wa -k shadow_changes
    auditctl -w /etc/passwd -p wa -k passwd_changes
    auditctl -w /etc/sudoers -p wa -k sudoers_changes
    auditctl -w /etc/ssh -p wa -k ssh_changes
   else
    echo "- 8.未开启审计日志,配置开启"
    yum -y install audit
    systemctl  enable auditd
    systemctl  start  auditd
    if [ $? -eq 0 ];then
       echo "-- 配置开启审计日志成功"
auditctl -w /etc/shadow -p wa -k shadow_changes
       auditctl -w /etc/passwd -p wa -k passwd_changes
       auditctl -w /etc/sudoers -p wa -k sudoers_changes
       auditctl -w /etc/ssh -p wa -k ssh_changes
    else
       echo "-- 配置开启审计日志失败,请检查配置"
           exit 4
fi
    fi
  #检查是否配置日志转储
     if grep "rotate 26" /etc/logrotate.conf&> /dev/null; then
    echo "- 9.配置日志转储:是"
   else
    echo "- 9.未配置日志转储,配置开启"
    sed -i "s#rotate 4#rotate 26#g"   /etc/logrotate.conf
    service rsyslog restart
    if [ $? -eq 0 ];then
       echo "-- 配置日志转储成功"
cat >/var/log/log_bak.sh<<EOF
#!/bin/bash
# 备份目录
backup_dir="/var/log/backups"
 # 日志文件名
system_log_file="/var/log/messages"
audit_log_file="/var/log/audit/audit.log"
 # 日期格式
date_fmt=\$(date +%Y-%m-%d_%H-%M-%S)
 # 创建备份目录
mkdir -p "\$backup_dir"
 # 备份系统日志增量
rsync -av --delete --exclude '*.gz' "\$system_log_file" "\$backup_dir/messages_\$date_fmt.log"
 # 备份审计日志增量
rsync -av --delete --exclude '*.gz' "\$audit_log_file" "\$backup_dir/audit_\$date_fmt.log"
 # 压缩增量备份文件
find "\$backup_dir" -type f -name "*.log" -mtime +1 -exec gzip {} \;
 # 删除 6 个月前的备份
find "\$backup_dir" -type f -name "*.log.gz" -mtime +180 -delete
EOF
       chmod +x /var/log/log_bak.sh
       crontab -l >cron.tmp
       echo "0 2 * * * /var/log/log_bak.sh" >>cron.tmp
       crontab cron.tmp
       rm -rf cron.tmp
    else
       echo "-- 配置日志转储日志失败,请检查配置"
           exit 4
fi
    fi
  #检查是否启用防火墙服务
  if systemctl status firewalld &> /dev/null; then
    echo "- 10.启用防火墙服务:是"
  else
    echo "- 10.启用防火墙服务:否,建议启用防火墙并手动配置放行端口和限制源"
  fi
  #检查是否启用selinux服务
  #if getenforce | grep Enforcing &> /dev/null; then
  #  echo "- 启用selinux服务:是"
  #else
  #  echo "- 启用selinux服务:否(建议启用)"
  #fi
}
# 系统资源检查
 check_system_resource() {
    echo "二、### 系统资源检查 ###"
    echo "- 1.CPU使用率"
    mpstat 1 3
    echo "- 2.内存使用率"
    free -g
    echo "- 3.磁盘使用率"
    df -h
}
  
#本地网络检查
check_local_network() {
    echo "三、### 本地网络连接检查 ###"
echo "- 1.开放端口列表"
    netstat -tulpn | awk '{print $4}' | cut -d: -f2 | sort | uniq
    echo "- 2.外部连接数"
    netstat -an | grep ESTABLISHED | wc -l
echo "- 3.外部连接IP和数量"
    netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
}
# 输出报告到word
generate_doc_report() {
report_date=$(date +%Y%m%d)
read -p "请输入IP地址: " ipaddress
    host_ip=$ipaddress
  mkdir -p /var/log/security_check/
#host_ip=$(ip addr show eth0 | grep "inet" | head -1 | awk '{print $2}' | cut -d '/' -f1)
    echo "### 生成doc报告 ###"
    cat > /var/log/security_check/security_check_${host_ip}_${report_date}.log <<EOF
 ${host_ip}_安全巡检报告
检查日期: ${report_date}
服务器IP: ${host_ip}
  
$(check_security_config)
   
$(check_system_resource)
   
$(check_local_network)
EOF
}
# 主函数
main() {
    generate_doc_report
}
main
echo "巡检日志请在目录/var/log/security_check/ 中查找"
相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2