CentOS7.9安全加固镜像制作流程梳理

2021-07-15 15:44:12 浏览数 (2)

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

等等,这里不详细列举了

总之你能想到的加固项越全面越好,可以集思广益,不断来完善脚本

我这边改写的脚本部分内容如下

代码语言:javascript复制
#!/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='33[31;1m'
RGB_WAIT='33[37;2m'
RGB_SUCCESS='33[32m'
RGB_WARNING='33[33;1m'
RGB_INFO='33[36;1m'
RGB_END='33[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_histroy history -c /var/log/目录下系统日志进行清理 如果是公有云平台,云厂商制作镜像时自动把这些操作包含进去
  • 2)删除相关基线检查自动化工具
  • 3)删除加固脚本 等等清理操作,总之保证制作镜像前环境是干净的

8、关闭虚拟机制作镜像

关闭虚拟机制作镜像

(图片可放大查看)

最后使用自定义镜像创建实例进行验证

如果要在生产环境中使用的话,还需要进行稳定性测试

0 人点赞