CentOS7.9安全加固镜像制作流程梳理
1、先准备一台CentOS7.9虚拟机
准备虚拟机用于后面脚本的优化
确定好分区方案
2、yum update更新
- 先yum update 检查是否新的更新
- 完成后再yum check-upate
注意yum update 与yum upgrade的区别
是否删除原低版本内核的启动项 这个可以自行决定
3、YUM软件源配置
YUM源及EPEL源设置
4、常用软件包的安装
例如vim lrzsz bash-completion net-tools wget git
当然也可以加入排查需要的一些工具包nmap htop nmon iftop ncdu nethogs tcpdump
以上初始环境完成后,建议对该虚拟机做一下快照
因为下面编写安全加固脚本是一件很冗杂的事,需要初始环境作为沙盘来进行反复测试与验证加固脚本
5、编写安全加固脚本
脚本需要从诸如账号管理,口令策略,授权管理,服务管理,配置管理,网络管理,权限管理等多个角度提高CentOS Linux的安全性。
例如SSH的一些安全加固项
6、借助云厂商的基线检查自动化工具进行验证
上传安全加固脚本并执行
通过自动化基线检查不断完善加固脚本
脚本涉及加固项
- 1)、/etc/pam.d/sshd 中加入pam_tally2.so 设置多次登录失败锁定
- 2)、/etc/logrotate.conf中修改系统相关日志轮转及保留时间
- 3)、历史命令添加时间戳格式
- 4)、rsyslog日志转发到日志服务器
- 5)、SELINUX关闭
- 6)、umask值
- 7)、登陆超时时间设置TMOUT
等等,这里不详细列举了
总之你能想到的加固项越全面越好,可以集思广益,不断来完善脚本
我这边改写的脚本部分内容如下
#!/usr/bin/env bash # Author: yuanfan # Date: 2021-07-03 #sec_system.sh 系统加固脚本 export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin RGB_DANGER='\033[31;1m' RGB_WAIT='\033[37;2m' RGB_SUCCESS='\033[32m' RGB_WARNING='\033[33;1m' RGB_INFO='\033[36;1m' RGB_END='\033[0m' CHECK_CENTOS=$( cat /etc/redhat-release|sed -r 's/.* ([0-9]+)\..*/\1/' ) CHECK_RAM=$( cat /proc/meminfo | grep "MemTotal" | awk -F" " '{ram=$2/1000000}{printf("%.0f",ram)}' ) LOCK=/var/log/sec_centos7_record.log tool_info() { echo -e "=========================================================================================" echo -e " InitSec CentOS 7 Script " echo -e "=========================================================================================" } check_root(){ if [[ $EUID -ne 0 ]]; then echo -e "${RGB_DANGER}This script must be run as root!${RGB_END}" exit 1 fi } check_lock() { if [ ! -f "$LOCK" ];then touch $LOCK else echo -e "${RGB_DANGER}Detects that the initialization is complete and does not need to be initialized any further!${RGB_END}" exit 1 fi } check_os() { if [ "${CHECK_CENTOS}" != '7' ]; then echo -e "${RGB_DANGER}This script must be run in CentOS 7!${RGB_END}" exit 1 fi } new_swap() { echo "============= swap =============" >> ${LOCK} 2>&1 if [ "${CHECK_RAM}" -le '2' ]; then echo -en "${RGB_WAIT}Configuring...${RGB_END}" dd if=/dev/zero of=/swapfile bs=1024 count=1048576 >> ${LOCK} 2>&1 chmod 600 /swapfile >> ${LOCK} 2>&1 mkswap /swapfile >> ${LOCK} 2>&1 swapon /swapfile >> ${LOCK} 2>&1 echo '/swapfile swap swap defaults 0 0' >> /etc/fstab echo '# Swap' >> /etc/sysctl.conf echo 'vm.swappiness = 10' >> /etc/sysctl.conf sysctl -p >> ${LOCK} 2>&1 sysctl -n vm.swappiness >> ${LOCK} 2>&1 echo -e "\r${RGB_SUCCESS}Configuration Success${RGB_END}" else echo -e "${RGB_SUCCESS}Skip, no configuration needed${RGB_END}" fi } open_bbr() { echo "============= bbr =============" >> ${LOCK} 2>&1 echo -en "${RGB_WAIT}Configuring...${RGB_END}" echo "# BBR" >> /etc/sysctl.conf echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf #echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p >> ${LOCK} 2>&1 sysctl -n net.ipv4.tcp_congestion_control >> ${LOCK} 2>&1 lsmod | grep bbr >> ${LOCK} 2>&1 echo -e "\r${RGB_SUCCESS}Configuration Success${RGB_END}" } disable_selinux() { echo "============= selinux =============" >> ${LOCK} 2>&1 echo -en "${RGB_WAIT}Configuring...${RGB_END}" setenforce 0 >> ${LOCK} 2>&1 sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config echo -e "\r${RGB_SUCCESS}Configuration Success${RGB_END}" } time_zone() { echo "============= time zone =============" >> ${LOCK} 2>&1 echo -en "${RGB_WAIT}Configuring...${RGB_END}" rm -rf /etc/localtime >> ${LOCK} 2>&1 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime >> ${LOCK} 2>&1 ls -ln /etc/localtime >> ${LOCK} 2>&1 echo -e "\r${RGB_SUCCESS}Configuration Success${RGB_END}" } custom_profile() { echo "============= custom profile =============" >> ${LOCK} 2>&1 echo -en "${RGB_WAIT}Configuring...${RGB_END}" cat > /etc/profile.d/history_command_record.sh << \EOF export HISTTIMEFORMAT="[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`] " export PROMPT_COMMAND='\ if [ -z "$OLD_PWD" ];then export OLD_PWD=$PWD; fi; if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then logger -t `whoami`_shell_cmd "[$OLD_PWD]$(history 1)"; fi; export LAST_CMD="$(history 1)"; export OLD_PWD=$PWD;' export PATH=$PATH:$HISTTIMEFORMAT:$PROMPT_COMMAND EOF cat > /etc/profile.d/centos7custom.sh << EOF PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[35;40m\]\W\[\e[0m\]]\\\\$ " GREP_OPTIONS="--color=auto" alias l='ls -AFhlt' alias grep='grep --color' alias egrep='egrep --color' alias fgrep='fgrep --color' export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " EOF cat /etc/profile.d/centos7custom.sh >> ${LOCK} 2>&1 echo -e "\r${RGB_SUCCESS}Configuration Success${RGB_END}" } adjust_ulimit() { echo "============= adjust ulimit =============" >> ${LOCK} 2>&1 echo -en "${RGB_WAIT}Configuring...${RGB_END}" sed -i '/^# End of file/,$d' /etc/security/limits.conf cat >> /etc/security/limits.conf <<EOF # End of file * soft core unlimited * hard core unlimited * soft nproc 1000000 * hard nproc 1000000 * soft nofile 1000000 * hard nofile 1000000 root soft core unlimited root hard core unlimited root soft nproc 1000000 root hard nproc 1000000 root soft nofile 1000000 root hard nofile 1000000 EOF cat /etc/security/limits.conf >> ${LOCK} 2>&1 echo -e "\r${RGB_SUCCESS}Configuration Success${RGB_END}" }
7、清理操作
在制作镜像前需要做一些清理
- 1)清空历史命令及系统的一些日志echo > /root/.bash_histroyhistory -c/var/log/目录下系统日志进行清理如果是公有云平台,云厂商制作镜像时自动把这些操作包含进去
- 2)删除相关基线检查自动化工具
- 3)删除加固脚本等等清理操作,总之保证制作镜像前环境是干净的
8、关闭虚拟机制作镜像
关闭虚拟机制作镜像
最后使用自定义镜像创建实例进行验证
如果要在生产环境中使用的话,还需要进行稳定性测试