
答案:CentOS安全加固需从系统更新、用户权限、SSH配置、防火墙、SELinux、服务管理、日志审计等多方面入手,构建动态防御体系。默认安装注重通用性而非安全性,存在较多潜在风险,必须通过最小权限原则、密钥认证、关闭无用服务、启用防火墙默认拒绝策略、定期审计等措施持续加固,确保攻击面最小化,提升攻击成本。
CentOS系统安全加固,核心在于构建多层次防御体系,从系统基础配置、网络访问控制到服务与应用安全,持续审计与更新是其生命线。这不是一次性任务,而是一个动态且必须持续投入的过程,确保系统暴露面最小化,抵御潜在威胁。我个人觉得,与其追求所谓的“绝对安全”,不如踏踏实实地做好每一个环节,让潜在的攻击者付出的成本远高于他们可能获得的收益。
解决方案
谈到CentOS的安全加固,这事儿可大可小,但有些核心环节是无论如何都不能跳过的。我通常会从几个维度来考虑:
yum update或者
dnf update,定期执行,把所有已知的安全漏洞都堵上。我见过太多因为懒得更新而导致的问题,有些简直是低级错误。
pam_pwquality模块配置密码长度、复杂度要求,并且定期强制用户修改密码。
root权限,那简直是给自己挖坑。我个人习惯是,普通操作都用普通用户,需要特权时再
sudo。
guest、
lp、
sync这些系统默认但你根本用不着的账户,直接锁死或者删掉。
root直接登录,通过普通用户登录后再
sudo。
AllowUsers或
AllowGroups可以明确指定哪些用户或组可以登录SSH。
fail2ban。 这玩意儿能有效防止SSH暴力破解。
firewalld或
iptables,选一个你熟悉的,并且把它配置好。
enforcing模式。它能提供额外的强制访问控制,即使某个服务被攻破,也能限制其能造成的破坏。当然,配置起来确实有点门槛,需要耐心。
systemctl list-unit-files --state=enabled看看有哪些服务是开机自启的,用不着的就
systemctl disable --now关掉。
rsyslog。 确保所有重要的系统日志都被妥善记录,并且定期归档或发送到集中的日志服务器。
auditd。 如果对安全性要求极高,
auditd可以记录更详细的系统调用和文件访问事件,方便事后追溯。
root或特定用户才能读写。
aide或
tripwire这类工具可以帮助你监控系统关键文件的变化,一旦有文件被篡改,能及时发现。
这问题问得挺好,很多人会觉得,我安装的是官方镜像,系统本身应该就挺安全了吧?但事实往往并非如此。在我看来,常规的CentOS安装,它更注重的是通用性和易用性,而非极致的安全性。
首先,默认安装为了让系统能跑起来,并且能满足大多数用户的基本需求,会启用不少服务。比如SSH服务默认就允许密码登录,甚至默认端口22也是公开的。对于一个个人工作站来说可能没什么,但对于一台暴露在公网上的服务器,这简直就是给攻击者发邀请函。很多服务,你可能根本用不着,但它们却在后台默默运行,每一个运行的服务都可能是一个潜在的漏洞点,增加系统的“攻击面”。
其次,系统默认配置通常是通用型的,它不会针对你的具体业务场景和安全需求进行优化。比如,你可能只需要一个Web服务器,但默认安装却可能包含了FTP、邮件服务等。这些额外的服务不仅消耗资源,更重要的是增加了安全风险。
再者,安全是一个动态的过程。新的漏洞几乎每天都在被发现。系统安装那一刻是相对安全的,但随着时间的推移,新的漏洞会不断出现。所以,即使是默认安装,也需要持续的更新和加固来应对这些不断演进的
威胁。默认安装只是一个起点,它给你提供了一个能工作的环境,但如何让这个环境更健壮、更抗揍,那就得靠我们自己去细心打磨了。
管理用户账户和SSH权限,这可是服务器安全的重中之重,我个人觉得这部分工作做得好不好,直接决定了你的服务器会不会成为别人的“肉鸡”。
用户账户管理的核心思想就是“最小权限原则”和“永不信任”。
/etc/security/pwquality.conf配置密码的长度、包含字符类型、历史密码限制等。比如,我通常会要求密码至少12位,包含大小写字母、数字和特殊字符。
root账户。创建一个普通管理员账户,然后通过
sudo命令来执行需要
root权限的操作。这不仅能留下操作记录,还能避免因误操作带来的灾难性后果。在
/etc/ssh/sshd_config中设置
PermitRootLogin no。
lastlog、
faillog这些命令能帮你查看用户的登录情况。
sudo: 精心配置
/etc/sudoers文件,让普通用户只能执行特定的、必要的管理命令。这比直接给
root密码安全得多。
SSH远程访问权限的加固,主要集中在sshd_config
的配置上:
~/.ssh/authorized_keys文件里。然后在
/etc/ssh/sshd_config中设置
PasswordAuthentication no。这样,没有私钥,即使知道密码也无法登录。这是我个人最推荐的方式,虽然初期配置略显繁琐,但一劳永逸。
Port 22改成一个不常用的端口,比如
Port 2222。这能有效减少被自动化脚本扫描的几率。
AllowUsers user1 user2或
AllowGroups admin_group来明确指定哪些用户或用户组可以登录SSH。这比仅仅禁用
root更细致,能防止其他普通账户被攻破。
PermitEmptyPasswords no。
fail2ban: 这个工具通过监控日志文件(如
/var/log/secure),当发现有多次登录失败的IP地址时,会自动将其加入防火墙的黑名单,有效抵御暴力破解攻击。配置起来也相对简单。
ClientAliveInterval和
ClientAliveCountMax: 防止长时间不活动的SSH会话占用资源,或者被劫持。
这些措施结合起来,能大大提升SSH服务的安全性,让你的服务器没那么容易被“敲开大门”。
防火墙,在我看来,就是服务器的第一道门卫。它的哲学很简单:默认拒绝所有,只允许必要的通行。 CentOS系统现在默认使用
firewalld,它比传统的
iptables更容易理解和管理,但两者都能达到目的。关键在于,你得选择一个并把它用好。
选择与理解:
firewalld: 它是基于区域(zone)的概念来管理防火墙规则的。比如
public区域用于面向公网的服务,
internal区域用于内部网络。每个区域可以有不同的规则集。这对于理解和管理复杂的网络环境很有帮助。
iptables: 更底层,直接操作内核的包过滤规则。它更灵活、功能更强大,但学习曲线相对陡峭,对于不熟悉网络的人来说,很容易配置错误。
我个人建议,如果不是有特别复杂的需求,或者你对
iptables没有深入了解,就用
firewalld。它现在是CentOS的默认,也足够强大。
firewalld
最佳实践:
public:默认区域,通常用于面向外部网络的接口。安全性最高,默认只允许SSH和DHCP客户端。
internal:用于内部网络,信任级别更高,但也不代表可以随意开放。
public区域是最佳选择。
sudo firewall-cmd --get-active-zones # 查看当前活跃区域 sudo firewall-cmd --set-default-zone=public # 设置默认区域
firewalld预定义了很多服务(如
ssh、
http、
https),使用服务名比直接开放端口更语义化,也更容易管理。
sudo firewall-cmd --zone=public --add-service=ssh --permanent # 允许SSH服务 sudo firewall-cmd --zone=public --add-service=http --permanent # 允许HTTP服务 sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent # 允许TCP 8080端口 sudo firewall-cmd --reload # 重新加载配置使之生效
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent
这能让你的SSH服务只对特定IP段开放,大大提高安全性。
sudo firewall-cmd --list-all --zone=public # 查看public区域的所有规则
sudo firewall-cmd --zone=public --add-rich-rule='rule protocol value="icmp" drop' --permanent # 举例:丢弃ICMP包 sudo firewall-cmd --zone=public --add-rich-rule='rule protocol value="tcp" reject log prefix="DROP_TCP " limit value="1/s"' --permanent # 记录被拒绝的TCP连接 sudo firewall-cmd --reload
日志通常在
/var/log/messages或
/var/log/firewalld中。
iptables
最佳实践(如果你选择它):
iptables -F # 清空所有规则 iptables -X # 清空所有自定义链 iptables -Z # 清空所有链的计数器 iptables -P INPUT DROP # 默认拒绝所有入站连接 iptables -P FORWARD DROP # 默认拒绝所有转发连接 iptables -P OUTPUT ACCEPT # 默认允许所有出站连接 (根据需求可调整)
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许SSH iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTP
iptables规则默认是临时的,需要保存才能在重启后生效。
sudo service iptables save # 或根据系统版本使用 `iptables-save > /etc/sysconfig/iptables`
无论是
firewalld还是
iptables,在应用任何新规则之前,务必先在测试环境验证,或者至少确保你有一个备用访问通道(比如带外管理或KVM),以防把自己锁在外面。 这点非常重要,我见过太多因为防火墙配置错误导致服务器失联的案例。安全是重要的,但可访问性也同样重要。