欢迎关注「全栈工程师修炼指南」公众号
点击 👇 下方卡片 即可关注我哟!
设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习!
专注 企业运维实践、网络安全、系统运维、应用开发、物联网实战、全栈文章 等知识分享
“ 花开堪折直须折,莫待无花空折枝。 ”
作者主页:[ https://www.weiyigeek.top ]
博客:[ https://blog.weiyigeek.top ]
作者<安全开发运维>答疑交流群,回复【学习交流群】即可加入
本章目录:
本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复。
免责申明:本文分享旨在给网络安全从业人员、网站开发人员以及运维管理人员在日常工作中进行安全攻防测试以及防范恶意攻击, 请勿恶意使用下面介绍技术进行非法网络攻击,作者不为此承担任何责任,所有渗透都需获取授权,谨防从入门到入狱!
【中华人民共和国网络安全法】: http://www.npc.gov.cn/npc/c30834/201611/270b43e8b35e4f7ea98502b6f0e26f8a.shtml
0x00 前言简述
描述: 千呼万唤始出来,网安等保系列之Linux系统主机安全加固文章又更新了,由于作者的【安全开发运维】运维学习答疑群(PS: 公众号回复【微信交流群】即可进入哟
)的小伙伴们企业中需要针对CentOS8服务器系统进行安全加固,以通过等保3级的主机安全合规检查,作为群主大大的我必须响应群员们的号召,在工作之余,边带娃,边编写该系统加固脚本, 遂在昨日完成该脚本的编写以及验证,可谓是真不容易呀。
原文地址:网安等保 | 主机安全之CentOS8服务器配置优化与安全加固基线文档脚本分享当前企业中还有大量的服务器上使用了CentOS8服务器操作系统,为满足于企业中需要针对CentOS8系统进行安全加固的道友,文章脚本中实现了CentOS8 系统基础运维配)、安全加固配置、系统优化配置等方法,若不全之处也希望大佬们多多指正。https://mp.weixin.qq.com/s?__biz=MzIwNDA3ODg3OQ==&mid=2648002806&idx=1&sn=a449482c593bfa8f3915f1cd654095ca&chksm=8ee45a86b993d390cd9bd01ecc51ea4a82fd1395308fd295d15f1b7b08da75b024e740a09613#rd
当前由于 CentOS Linux/Stream 8
即将停止更新维护(EOL)了,作者已经在2021年底基本将企业中CentOS服务器上的业务进行迁移,我是迁移到了Ubuntu和KylinOS 银河麒麟国产Linux系统之上, 当然网上也有其他迁移方案,此处不再累述。
虽然 CentOS 8 生命周期即将结束了,但是企业中还是有大量的服务器机器上使用了CentOS8服务器操作系统,所以本文也满足于企业中需要针对CentOS8系统进行安全加固的道友,也帮助Liunx初学者快速配置一个安全的CentOS8服务器(加固脚本也是值得学习借鉴的哟),文章脚本中实现了CentOS8 系统基础运维配、安全加固配置、系统优化配置等方法,若不全之处也希望大佬们多多指正。
请在【全栈工程师修炼指南
】公众号中回复【CentOS8安全加固
】或【10006
】关键字,获取演示视频、CentOS8安全加固文档和脚本(本文末尾获取下载链接)。
温馨提示: 此处为了防止伸手党,以及尊重作者编写脚本及实践成果,象征性的设置为收费合集(#网络安全攻防等保 点击查看 ),付费后可直接联系作者发加固脚本或者文章末尾获取下载链接,希望大家理解支持!
此处作者我,已经将其写成一个Shell项目,各位看官可以直接运行加固,大大的节省了我们运维人的时间,最后我会将CentOS8安全加固shell脚本,下载链接放在文章末尾, 以供各位看友使用实践参考,若有错误欢迎在【全栈工程师修炼指南】公众号留言。
## 名称: Start::Help
## 用途:程序执行帮助命令
## 参数: 无
Start::Help ()
{
echo -e "\nUsage: $0 [--start ] [--network] [--function] [--clear] [--version] [--help]"
echo -e "Option: "
echo -e " --start Start System initialization and security reinforcement."
echo -e " --network Configure the system network and DNS resolution server."
echo -e " --function PCall the specified shell function."
echo -e " --clear Clear all system logs, cache and backup files."
echo -e " --info Print System information and exit."
echo -e " --version Print version and exit."
echo -e " --help Print help and exit."
echo -e "\nMail bug reports or suggestions to <master@weiyigeek.top> or pull request (pr)."
echo -e "current version : ${VAR_VERSION}"
log::warning "温馨提示:使用前先请配置机器上网环境及其在config文件夹中的CentOS8.conf配置进行对应配置."
exit 0
}
此加固脚本的使用方法,请参照演示视频:
# 常用命令示例:
# 进行自动安全加固
./CentOS8-InitializeReinforce --start
# 使用function参数指定优化加固
./CentOS8-InitializeReinforce --function
# 使用info参数打印系统相关信息
./CentOS8-InitializeReinforce --info
在实践前,也请大家多多支持我的【#网络安全攻防等保(点击查看)】付费合集,后续将推出更多网安入门学习、企业安全实践与漏洞挖掘实践文章, 也将持续更新CentOS7安全加固实践文章以及安全加固脚本。
温馨提示: 针对于 Ubuntu 22.04 以及 KylinOS V10 服务器操作系统,作者都编写对应安全加固实践文章,有想了解的童鞋可以访问如下文章链接:
-
网安等保-主机安全测评之Linux服务器Ubuntu-22.04-LTS操作系统安全加固制作基线系统脚本分享与实践
-
网安等保-国产Linux操作系统银河麒麟KylinOS-V10SP3常规配置、系统优化与安全加固基线实践文档
好了废话不多说,此处我将本文其分为三个章节,没小节包含了配置Shell脚本片段:
第一个章节主要针对 CentOS8 系统初始化运维配置实践,
第二个章节主要针对 CentOS8 系统内核参数及服务优化实践,
第三个章节主要针对 CentOS8 系统安全加固实践,
0x01 主机系统配置
重要提示: 在线上生产环境中,进行系统安全加固操作时,请注意备份操作文件,以便于异常时及时回退。
重要提示: 在线上生产环境中,进行系统安全加固操作时,请注意备份操作文件,以便于异常时及时回退。
重要提示: 在线上生产环境中,进行系统安全加固操作时,请注意备份操作文件,以便于异常时及时回退。
1.主机IP和网关地址设置
描述: 一台新安装的主机必须配置IP地址才能方便我们通过远程连接,所以第一步肯定是把网络打通,主要根据配置的IP地址与网络地址环境变量进行对应设置,例如下述部分脚本片段。
示例片段:
# Modify the IP/MASK and Gateway
VAR_NETINTERFACE=ens192
VAR_IP=192.168.4.201/24
VAR_GATEWAY=192.168.4.1
cp -a /etc/sysconfig/network-scripts/* /tmp
if [ ! -f /opt/init/ ];then
mkdir -vp /opt/init/
sudo tee /opt/init/network.sh <<'EOF'
#!/bin/bash
# @Author: WeiyiGeek
# @Description: Configure CentOS Linux/Stream 8 Server Network
# @E-mail: master@weiyigeek.top
# @Blog: https://www.weiyigeek.top
if [[ $# -lt 4 ]];then
echo "Usage: $0 NetInterface IP/NETMASK GATEWAY DNS"
echo "Example: $0 ens192 192.168.12.12/24 192.168.12.1 223.6.6.6"
echo "@Author: WeiyiGeek"
echo "@Blog: https://blog.weiyigeek.top"
exit
fi
echo "Setting Network interface card: ${1}, IP: ${2} , GATEWAY: ${3}"
CURRENT_IP=$(hostname -I | cut -f 1 -d " ")
CURRENT_GATEWAY=$(hostname -I | cut -f 1,2,3,4 -d ".")
CURRENT_FILE=/etc/sysconfig/network-scripts/ifcfg-${1}
CONFIG_IP=${2%%/*}
CONFIG_PREFIX=${2##*/}
echo "Original Network info: IP: ${CURRENT_IP} , GATEWAY: ${CURRENT_GATEWAY}"
echo "Setting Network interface card: ${1}, IP/NETMASK: ${2} , GATEWAY: ${3}, DNS: ${4}"
if [[ -f ${CURRENT_FILE} ]];then
# 已存在网卡配置文件的情况下
egrep -q "^\s*ONBOOT=.*$" ${CURRENT_FILE} && sed -ri "s/^\s*ONBOOT=.*$/ONBOOT=yes/" ${CURRENT_FILE}|| echo "ONBOOT=yes" >> ${CURRENT_FILE}
egrep -q "^\s*BOOTPROTO=.*$" ${CURRENT_FILE} && sed -ri "s/^\s*BOOTPROTO=.*$/BOOTPROTO=static/" ${CURRENT_FILE}|| echo "BOOTPROTO=static" >> ${CURRENT_FILE}
egrep -q "^\s*IPADDR=.*$" ${CURRENT_FILE} && sed -ri "s/^\s*IPADDR=.*$/IPADDR=${CONFIG_IP}/" ${CURRENT_FILE}|| echo "IPADDR=${CONFIG_IP}" >> ${CURRENT_FILE}
egrep -q "^\s*PREFIX=.*$" ${CURRENT_FILE} && sed -ri "s/^\s*PREFIX=.*$/PREFIX=${CONFIG_PREFIX}/" ${CURRENT_FILE}|| echo "PREFIX=${CONFIG_PREFIX}" >> ${CURRENT_FILE}
egrep -q "^\s*GATEWAY=.*$" ${CURRENT_FILE} && sed -ri "s/^\s*GATEWAY=.*$/GATEWAY=${3}/" ${CURRENT_FILE}|| echo "GATEWAY=${3}" >> ${CURRENT_FILE}
egrep -q "^\s*DNS1=.*$" ${CURRENT_FILE} && sed -ri "s/^\s*DNS1=.*$/DNS1=${4}/" ${CURRENT_FILE}|| echo "DNS1=${4}" >> ${CURRENT_FILE}
else
nmcli dev show ${1}
nmcli conn add connection.id ${1}-staic connection.interface-name ${1} connection.autoconnect yes type Ethernet ifname ${1} ipv4.method manual ipv4.address ${2} ipv4.gateway ${3} ipv4.dns ${4} ipv4.ignore-auto-dns true
fi
sudo nmcli c reload
read -t 5 -p "Heavy load network card, It is recommended to enter N during initialization (Y/N): " VERTIFY
if [[ ${VERIFY:="N"} == "Y" || ${VERIFY:="N"} == "y" ]]; then
sudo nmcli c up ${1}
sudo nmcli d reapply ${1}
else
echo "Please reload the network card manually, run sudo nmcli d reapply ${1}."
fi
EOF
# 权限赋予
sudo chmod +x /opt/init/network.sh
/opt/init/network.sh ${VAR_NETINTERFACE} ${VAR_IP} ${VAR_GATEWAY} ${VAR_DNS_SERVER}
2.主机DNS服务器地址配置
描述: 在完成系统主机的IP地址的配置后,便需要为主机配置私有DNS服务器
或者公共的DNS服务器
,以便解析内部或外部域名。
示例片段:
# Show Script Execute result (Y/N)
VAR_VERIFY_RESULT=Y
# Modify the DNS server
# DNSPod: 119.29.29.29 Alidns: 223.5.5.5 223.6.6.6
# Google: 8.8.8.8 8.8.4.4 Cloudflare: 1.1.1.1 1.0.0.1
# Baidu: 114.114.114.114
# Internal : Your intranet domain name resolution server
VAR_DNS_SERVER=( "223.5.5.5" "114.114.114.114" "192.168.4.254")
cp /etc/systemd/resolved.conf /tmp
local flag
# 此处配置的是阿里云IPV4 DNS与阿里云IPV6 DNS
sed -i -e "s/^#FallbackDNS=.*/FallbackDNS=223.6.6.6 2400:3200::1 2400:3200:baba::1/" -e "s/^#DNSSEC=.*/DNSSEC=allow-downgrade/" -e "s/^#DNSOverTLS=.*/DNSOverTLS=opportunistic/" /etc/systemd/resolved.conf
# 此处配置DNSPod 以及 阿里云 DNS
for dns in ${VAR_DNS_SERVER[@]};do
grep -q "${dns}" /etc/systemd/resolved.conf
if [ $? != 0 ];then
echo -e "\033[32mnameserver ${dns} \033[0m]"
sed -i "/#DNS=/i DNS=${dns}" /etc/systemd/resolved.conf;
fi
done
# 重启相关服务
systemctl restart systemd-resolved && systemctl enable systemd-resolved
# 创建解析文件映射
find /etc/resolv.conf -delete
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
if [[ ${VERIFY:="N"} == "Y" || ${VERIFY:="N"} == "y" ]]; then
echo "/etc/resolv.conf"
grep -Ev '^#|^$' /etc/resolv.conf | uniq
echo "/etc/systemd/resolved.conf"
grep -Ev '^#|^$' /etc/systemd/resolved.conf | uniq
fi
3.主机系统软件镜像源配置
描述: 使用国外的操作系统,例如CentOS、Ubuntu、Debian、Alpine
等操作系统,通常为了加快Linux系统中下载安装软件的速度,我们是需要配置软件镜像源,但此处为了防止小伙伴们更改过该镜像源,我也将各发行版镜像源配置罗列出来。
示例片段:
# 1.获取操作系统发行版
local release
# release=$(grep -e "^VERSION=" /etc/os-release | cut -f 2 -d "=" | tr -d '[:punct:][:space:]')
release=$(cat /etc/redhat-release)
echo -e "\033[32m[${COUNT}] ${release} \033[0m"
# 2.验证CentOS8镜像仓库文件,由于其发行版本有差异此处将Stream版本以及原始版本都进行验证。
# 注意:在2022年1月31日,CentOS 团队从官方镜像中移除CentOS8的所有包,针对过期源设置如下。
# 直接使用yum下载会出现ERROR: Cannot prepare internal mirrorlist: No URLs in mirrorlist
# 故需要设置yum源,否则无法提供下载。
# CentOS 过期源(centos-vault):https://developer.aliyun.com/mirror/centos-vault
# CentOS arm源(centos-altarch):https://developer.aliyun.com/mirror/centos-altarch/
# CentOS Stream源(centos-stream):https://developer.aliyun.com/mirror/centos-stream
# CentOS debuginfo源(centos-debuginfo):https://developer.aliyun.com/mirror/centos-debuginfo/
local repo_name
if [ -f /etc/yum.repos.d/CentOS-Stream-BaseOS.repo ];then
repo_name="CentOS-Stream-BaseOS.repo"
echo -e "\033[32m[${COUNT}] 备份 /etc/yum.repos.d/${repo_name} 文件中...... \033[0m"
# rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo
cp /etc/yum.repos.d/${repo_name} ${BACKUPDIR}
sed -i -e 's|mirrorlist=|#mirrorlist=|g' -e 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-*
fi
if [ -f /etc/yum.repos.d/CentOS-Base.repo ];then
repo_name="CentOS-Base.repo"
echo -e "\033[32m[${COUNT}] 备份 /etc/yum.repos.d/${repo_name} 文件中...... \033[0m"
rename '.repo' '.repo.bak' /etc/yum.repos.d/*.repo
cp /etc/yum.repos.d/${repo_name}.bak ${BACKUPDIR}
# centos8(centos8官方源已下线,建议切换centos-vault源)
curl -o /etc/yum.repos.d/${repo_name} https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
# 删除"mirrors.cloud.aliyuncs.com" 及 "mirrors.aliyuncs.com" 字符串所在的行.
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/${repo_name}
# sed -i 's/releasever\//releasever-stream\//g' /etc/yum.repos.d/${repo_name}
fi
# 清理缓存并创建仓库元数据
sudo dnf clean all && sudo yum makecache
# Centos 8 - Epel 阿里云镜像快速配置
yum install -y epel-release
sed -i -e 's|metalink=https://mirrors.fedoraproject.org|#metalink=https://mirrors.fedoraproject.org|g' -e 's|#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|g' /etc/yum.repos.d/epel.repo
dnf repolist epel -v
read -t ${VAR_VERIFY_TIMEOUT} -p "Please input, Perform system software update and upgrade. (Y/N) : " VERIFY
if [[ ${VERIFY:="N"} == "Y" || ${VERIFY:="N"} == "y" ]]; then
sudo dnf update -y && sudo dnf upgrade -y
fi
PS: 在2022年1月31日,CentOS 团队从官方镜像中移除CentOS8的所有包, 所以网上设置CentOS8的镜像源地址有变化,建议通过镜像站获取,例如 阿里云的镜像地址:https://developer.aliyun.com/mirror/centos
完整原文地址:网安等保 | 主机安全之CentOS8服务器配置优化与安全加固基线文档脚本分享