一、为什么要对openEuler做安全增强

openEuler是欧拉操作系统,属于国产操作系统的代表,在x86架构的服务器上跑得非常普遍。很多企业和开发者都选择了它作为基础设施的基础系统,但默认安装完的系统就像刚出工厂的车,能开,但防护不够。攻击者如果从外网扫描到你的服务器,一个默认配置的系统就像一扇没锁的门,稍微用力就能推开。

安全增强说白了就是给系统加锁、加固、补漏洞,让系统在面对各种攻击手段时更能扛得住。openEuler支持多种安全增强手段,包括SELinux、内核参数加固、防火墙配置、SSH加固等等,每一种都有不同的防护侧重点。这篇文章就把这些常用的安全配置手段逐一拆开来讲,让你不仅能看懂,还能直接上手操作。

二、SELinux安全模块的配置

SELinux是openEuler上最核心的安全组件之一,它本质上是一套强制访问控制(MAC)系统。传统的Linux权限模型是DAC(自主访问控制),意味着文件属主可以把权限放得很开。SELinux则是在DAC基础上多了一层策略约束,不管你是不是文件属主,只要你没有被策略授权,就访问不了。

2.1 查看SELinux当前状态

首先需要确认SELinux是开启的,并且处于enforcing模式(强制执行模式),而不是permissive(仅记录不拦截)模式。

# 技术栈:Shell / Bash
# 查看SELinux的当前运行状态
getenforce

# 返回Enforcing表示强制执行模式,效果最好
# 返回Permissive表示仅记录告警但不实际拦截
# 返回Disabled表示SELinux已关闭

2.2 切换SELinux运行模式

如果当前是Permissive或者Disabled,我们需要把它切换到Enforcing模式。修改SELinux的模式配置文件是关键步骤。

# 技术栈:Shell / Bash
# 修改SELinux配置文件,将模式改为enforcing
sed -i 's/^SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config

# 验证修改结果
grep '^SELINUX=' /etc/selinux/config
# 期望输出:SELINUX=enforcing

# 立即生效(不需要重启)
setenforce 1

# 再次确认当前状态
getenforce
# 期望输出:Enforcing

2.3 使用SELinux策略工具管理安全策略

SELinux的策略体系非常庞大,手动写策略规则非常繁琐。openEuler提供了policycoreutils工具集,方便我们管理和定制策略。

# 技术栈:Shell / Bash
# 查看当前系统上所有已加载的SELinux模块
semodule -l

# 查看某个进程的SELinux上下文
ps -eo pid,comm,selinux | head -20

# 查看某个文件的SELinux上下文
ls -Z /etc/passwd
# 输出格式:system_u:object_r:passwd_t:s0 /etc/passwd

# 查看某个SELinux策略的详细信息
seinfo -t passwd_t

三、内核启动参数的安全加固

内核启动参数是系统安全配置的第一道防线。很多安全问题其实可以通过在GRUB引导加载器中添加内核参数来解决,比如禁止加载某些危险的内核模块、限制内核可执行模块加载等等。

3.1 限制内核可执行模块(lockdown)

现代Linux内核支持lockdown模式,可以禁止root用户加载不受信任的内核模块。这对于防范内核级恶意软件攻击非常有效。

# 技术栈:Shell / Bash
# 修改GRUB配置文件,添加内核启动参数
vim /etc/default/grub

# 在GRUB_CMDLINE_LINUX或GRUB_CMDLINE_LINUX_DEFAULT中追加以下参数
# 完整修改后的行示例:
# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash lockdown=confidentiality"

# 重新生成GRUB配置文件(openEuler/x86架构专用命令)
grub2-mkconfig -o /boot/grub2/grub.cfg

# 重启系统使参数生效
reboot

3.2 添加安全相关的内核启动参数

除了lockdown之外,还有一些常见的安全参数值得添加到内核命令行中:

# 技术栈:Shell / Bash
# 修改GRUB配置,追加安全加固参数
# 参数说明:
#   selinux=1            - 强制启用SELinux(双保险)
#   lockdown=confidentiality - 启用机密模式锁定
#   module.sig_enforce   - 强制验证内核模块签名
#   init_on_alloc=1      - 新分配的内存自动清零
#   init_on_free=1       - 释放内存时自动清零
#   panic_on_warn=1      - 内核警告直接panic(适合严格环境)

vim /etc/default/grub

# 修改前(默认值):
# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

# 修改后:
# GRUB_CMDLINE_LINUX_DEFAULT="quiet splash selinux=1 lockdown=confidentiality module.sig_enforce init_on_alloc=1 init_on_free=1"

# 重新生成GRUB配置
grub2-mkconfig -o /boot/grub2/grub.cfg

# 验证修改后的内核参数
grub2-mkconfig -o /boot/grub2/grub.cfg | grep "GRUB_CMDLINE_LINUX_DEFAULT"

3.3 通过sysctl进行运行时安全参数配置

sysctl是Linux内核的动态参数调节接口,很多安全参数不需要重启就能生效。openEuler的sysctl配置文件位于/etc/sysctl.d/目录下。

# 技术栈:Shell / Bash
# 创建自定义sysctl安全加固配置文件
cat > /etc/sysctl.d/99-security-hardening.conf << 'EOF'
# =============================================
# openEuler x86 安全加固 - sysctl参数配置
# =============================================

# --- 内核参数安全加固 ---

# 启用ASLR(地址空间布局随机化),防止内存攻击
kernel.randomize_va_space = 2

# 禁止内核模块的自动加载(防止恶意模块被加载)
kernel.modules_disabled = 0

# 限制核心转储大小,防止敏感信息泄露
fs.suid_dumpable = 0

# 禁用IPv6(如不需要,减少攻击面)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

# 启用TCP SYN洪水攻击防护
net.ipv4.tcp_syncookies = 1

# 禁止ICMP重定向(防止路由欺骗攻击)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 禁止反向路径过滤(防止IP欺骗)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 启用反向路径过滤严格模式
net.ipv4.conf.all.accept_source_route = 0

# 禁止内核指针地址泄露
# (部分版本通过内核配置选项控制)
EOF

# 应用配置
sysctl -p /etc/sysctl.d/99-security-hardening.conf

# 验证配置是否生效
sysctl kernel.randomize_va_space
sysctl net.ipv4.tcp_syncookies
sysctl net.ipv4.conf.all.accept_redirects

四、防火墙和SSH的防护加固

4.1 openEuler自带的firewalld防火墙配置

openEuler默认使用firewalld作为防火墙管理工具,相比iptables的直接操作,firewalld提供了基于zone(区域)的配置方式,对开发者更友好。

# 技术栈:Shell / Bash
# 查看firewalld当前状态
systemctl status firewalld

# 启用firewalld服务(开机自启动)
systemctl enable firewalld
systemctl start firewalld

# 查看所有区域
firewall-cmd --get-zones

# 查看当前默认区域
firewall-cmd --get-default-zone
# 通常输出:public

# 查看当前public区域允许的服务和端口
firewall-cmd --zone=public --list-all

# 关闭不必要的服务,仅保留SSH
firewall-cmd --zone=public --remove-service=http --permanent
firewall-cmd --zone=public --remove-service=https --permanent

# 仅允许SSH端口(22)
firewall-cmd --zone=public --add-service=ssh --permanent

# 重新加载配置使永久规则生效
firewall-cmd --reload

# 验证最终配置
firewall-cmd --zone=public --list-all

4.2 SSH服务的深度加固

SSH是服务器运维最常用的远程管理工具,也是被攻击者盯上的首要目标。openEuler的SSH配置文件位于/etc/ssh/sshd_config。

# 技术栈:Shell / Bash
# 创建SSH安全加固配置(独立配置文件,便于管理和回滚)
cat > /etc/ssh/sshd_config.d/99-hardening.conf << 'EOF'
# =============================================
# openEuler SSH安全加固配置
# =============================================

# 禁止root用户直接SSH登录,必须使用普通用户登录后切换
PermitRootLogin no

# 禁止密码认证,强制使用密钥登录
PasswordAuthentication no
ChallengeResponseAuthentication no

# 禁用SSH空密码登录(虽然默认已禁用,显式配置更安全)
PermitEmptyPasswords no

# 设置SSH密钥认证的算法偏好(禁用弱算法)
PubkeyAuthentication yes

# 限制每个IP地址的最大连接数,防止暴力破解
MaxAuthTries 3
MaxSessions 1

# 设置登录超时时间(秒)
LoginGraceTime 30

# 禁止X11转发(除非确实需要图形界面转发)
X11Forwarding no

# 禁止TCP转发(防止SSH隧道滥用)
AllowTcpForwarding no

# 限制允许的SSH协议版本
Protocol 2

# 设置客户端Alive间隔(秒),断开空闲连接
ClientAliveInterval 300
ClientAliveCountMax 2

# 设置子系统(用于SFTP)
Subsystem sftp /usr/libexec/openssh/sftp-server
EOF

# 测试SSH配置语法是否正确
sshd -t

# 重启SSH服务使配置生效
systemctl restart sshd

# 验证SSH服务状态
systemctl status sshd

4.3 使用fail2ban防范SSH暴力破解

fail2ban是一个基于日志的入侵检测工具,可以自动封禁多次尝试登录失败的IP地址。

# 技术栈:Shell / Bash
# 安装fail2ban
yum install -y fail2ban

# 启用并启动fail2ban
systemctl enable fail2ban
systemctl start fail2ban

# 复制默认SSH jail配置模板(创建自定义配置文件)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.d/ssh-hardening.conf

cat > /etc/fail2ban/jail.d/ssh-hardening.conf << 'EOF'
# =============================================
# openEuler fail2ban SSH防暴力破解配置
# =============================================
[DEFAULT]
# 封禁持续时间(秒),即封禁多长时间
bantime = 3600
# 最大尝试次数,超过即触发封禁
maxretry = 3
# 检测窗口时间(秒),在此时间内超过maxretry次则触发
findtime = 600
# 被封禁的IP记录到哪个防火墙zone
ignoreip = 127.0.0.1/8 ::1

[sshd]
# 启用SSH保护
enabled = true
# 自定义封禁时间为2小时
bantime = 7200
# 5分钟内尝试3次失败即封禁
maxretry = 3
findtime = 300
# 使用journalctl日志
backend = systemd
EOF

# 重新加载fail2ban配置
systemctl reload fail2ban

# 查看当前被封禁的IP列表
fail2ban-client status sshd

# 查看fail2ban日志
journalctl -u fail2ban -f

五、文件系统安全与权限管理

5.1 关键系统文件的权限加固

文件系统的权限是系统安全的基础防线。很多重要的系统文件和目录需要严格的权限控制。

# 技术栈:Shell / Bash
# 加固关键系统文件的权限

# 限制敏感系统文件的权限,防止非root用户读取
chmod 600 /etc/shadow
chmod 400 /etc/gshadow
chmod 644 /etc/passwd
chmod 755 /etc/shells

# 设置关键目录的权限
chmod 700 /root
chmod 750 /etc/ssh
chmod 600 /etc/ssh/sshd_config
chmod 600 /etc/ssh/ssh_host_*_key

# 设置安全删除(删除后数据不易恢复)
# 使用shred替代rm删除敏感文件
shred -u /path/to/sensitive/file

# 查找权限过宽的可执行文件(潜在的安全风险)
find / -perm -u+s -type f 2>/dev/null | head -20  # 带SUID位的文件
find / -perm -g+s -type f 2>/dev/null | head -20  # 带SGID位的文件

# 限制SUID文件的范围,防止提权攻击
# 仅保留必要的SUID程序
chown root:root /usr/bin/passwd
chmod 4755 /usr/bin/passwd
chown root:root /usr/bin/su
chmod 4755 /usr/bin/su

5.2 用户和组的权限管理

用户和组的管理是系统安全中不可忽视的一环。openEuler提供了完善的用户管理工具。

# 技术栈:Shell / Bash
# 设置用户的密码复杂度策略(通过pam配置)
# 编辑PAM配置文件
vim /etc/security/pwquality.conf

# 配置文件内容示例:
# =============================================
# openEuler 密码复杂度策略
# =============================================
# 最小密码长度
minlen = 14

# 至少包含大写字母的数量
minupper = 2

# 至少包含小写字母的数量
minlower = 2

# 至少包含数字的数量
mindigits = 2

# 至少包含特殊字符的数量
minother = 2

# 禁止与用户名相似的部分(防止使用用户名做密码)
usercheck = 1

# 密码与历史记录相比的最大重复字符数
maxrepeat = 3

# 设置密码的最大使用天数
# 编辑/etc/login.defs
# PASSWORD_MAX_DAYS  60
# PASSWORD_MIN_DAYS  7
# PASSWORD_WARN_AGE  7

# 锁定长期不活跃的用户账户
useradd --expiredate 2025-01-01 testuser

# 查看用户账户的过期信息
chage -l testuser

# 查看系统上所有用户信息
awk -F: '{print $1, $3, $4, $6, $7}' /etc/passwd

六、系统审计服务的配置

6.1 auditd审计服务的配置

审计服务能够记录系统中所有的关键操作,对于事后追踪和取证非常重要。openEuler的auditd配置文件位于/etc/audit/audit.rules。

# 技术栈:Shell / Bash
# 启用auditd服务
systemctl enable auditd
systemctl start auditd

# 创建安全审计规则配置
cat > /etc/audit/rules.d/99-security.rules << 'EOF'
# =============================================
# openEuler 安全审计规则配置
# =============================================

# 清除已有规则(确保干净的环境)
-D

# 设置审计缓冲区大小(字节)
-b 8192

# 设置审计日志的最低保留天数
--log_format raw

# --- 用户和身份验证审计 ---

# 审计所有登录尝试
-w /var/log/lastlog -p wa -k login
-w /var/log/wtmp -p wa -k login
-w /var/log/btmp -p wa -k login

# 审计用户信息变更
-w /etc/passwd -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/security/ -p wa -k security

# --- 文件完整性审计 ---

# 审计SELinux策略变更
-w /etc/selinux/ -p wa -k selinux

# 审计系统配置变更
-w /etc/ssh/ -p wa -k ssh_config
-w /etc/firewalld/ -p wa -k firewall

# --- 时间审计 ---

# 审计系统时间变更
-w /etc/localtime -p wa -k time_change
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change

# --- 内核模块审计 ---

# 审计内核模块加载和卸载
-w /sbin/modprobe -p x -k module_load
-w /usr/sbin/modprobe -p x -k module_load
-w /lib/modules/ -p wa -k module
-a always,exit -F arch=b64 -S init_module -S finit_module -k module_load

# --- 网络审计 ---

# 审计网络连接(需要inotify支持)
-w /etc/hosts -p wa -k network_config
-w /etc/resolv.conf -p wa -k network_config
EOF

# 重新加载审计规则
systemctl restart auditd

# 验证审计规则是否加载
auditctl -l | head -30

# 查看审计日志(实时跟踪)
ausearch -k identity --start recent

七、应用场景分析

7.1 企业级服务器环境

在企业数据中心场景中,openEuler作为服务器操作系统,承担着数据库、中间件、应用服务等关键业务。安全增强配置可以保护这些数据资产不被非法访问。比如在金融行业的服务器部署中,内核参数加固可以防止内存级攻击,SELinux可以限制进程之间的横向移动,fail2ban可以阻断外部的暴力破解尝试。

7.2 政务和军工等敏感行业

这类行业对系统安全要求极高,通常需要从内核启动到用户空间进行全方位的安全加固。lockdown模式、SELinux强制策略、审计日志等配置手段能够构建多层次的防御体系,满足合规性要求。

7.3 开发测试环境的安全基线

即使是开发测试环境,也不应该忽视安全配置。很多生产事故都源于测试环境中养成的坏习惯被带入了生产环境。在开发阶段就建立安全基线配置,让开发人员从一开始就适应安全的工作方式,比事后补救更有效。

八、技术优缺点对比

8.1 SELinux

优点是安全级别高,策略精细,可以限制到进程级别的文件访问权限。openEuler的SELinux策略覆盖范围广,开箱即用。缺点是策略配置复杂,学习曲线陡峭,错误的策略配置可能导致系统服务无法正常运行。比如一个自定义的Web应用如果SELinux上下文没有正确设置,可能根本无法访问其静态文件目录。

8.2 fail2ban

优点是对SSH暴力破解的防护效果显著,配置相对简单,对系统性能影响极小。缺点是只能防范基于登录尝试的暴力攻击,对于零日漏洞利用、缓冲区溢出等攻击手段无能为力。

8.3 内核参数加固

优点是防护覆盖面广,从内存安全、网络协议到模块加载等多个维度进行加固,且对应用透明。缺点是一些参数过于严格可能影响系统功能的正常使用。比如关闭IPv6如果企业的网络架构依赖于IPv6,会导致通信中断。

8.4 sysctl参数加固

优点是运行时生效,不需要重启系统,调整灵活。缺点是部分参数需要重启才能生效,且参数之间的交互关系可能产生意想不到的副作用。

九、注意事项

在进行安全增强配置之前,有几件事必须提前注意,否则可能会给自己挖坑。

第一,先备份再操作。尤其是GRUB配置和SSH配置这两个最关键的配置文件,修改前一定要备份。万一改错了导致SSH无法连接,至少可以通过物理控制台或者救援模式恢复。

# 技术栈:Shell / Bash
# 修改关键文件前的备份操作
cp /etc/default/grub /etc/default/grub.bak.$(date +%Y%m%d)
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
cp /etc/selinux/config /etc/selinux/config.bak.$(date +%Y%m%d)

第二,逐条验证。每次只修改一个配置项,修改后立即验证是否生效,确认无误再进行下一项。不要一次性修改几十个参数然后重启,出了问题很难定位是哪个参数引起的。

第三,在测试环境先验证。生产环境的服务器不能直接做安全加固实验。先在测试服务器上完整走一遍配置流程,确认所有业务功能正常后,再推广到生产环境。

第四,注意SSH配置变更的风险。如果远程管理依赖SSH,一旦配置文件语法错误或参数设置不当导致SSH服务拒绝连接,可能需要通过物理控制台或者云厂商的VNC控制台才能恢复。建议先在一个新的终端窗口中测试SSH连接是否正常,确认无误后再关闭旧的终端。

第五,保持配置的可维护性。不要把加固配置写散在各个配置文件里,使用独立的安全加固配置文件,比如/etc/ssh/sshd_config.d/99-hardening.conf、/etc/sysctl.d/99-security-hardening.conf这样的命名方式,方便日后管理和回滚。

十、文章总结

openEuler作为国产操作系统的重要代表,在x86架构下已经具备了完善的安全增强能力。从SELinux强制访问控制、内核启动参数加固、firewalld防火墙、SSH加固、fail2ban防暴力破解到auditd审计服务,每一层都构成了纵深防御体系的一部分。

核心思想是"少即是多"——默认关闭不必要的服务和端口,最小化攻击面。同时"深度防御"的理念也非常重要:即使某一层防护被突破,后续层仍然可以提供保护。

实际操作中,建议按照先易后难的原则逐步推进。先做好SSH加固和防火墙配置这些见效快、风险低的配置,再逐步深入SELinux策略定制和内核参数优化。安全是一个持续的过程,不是一次性的配置任务。定期审查系统配置,关注安全公告,持续更新安全策略,才能让服务器长期保持安全稳定的运行状态。