简介
在您的计算环境中(包括 Unix 和 Linux 系统)实施安全的配置,是一项关键的安全最佳实践,因为它可以缩小攻击面,并限制网络攻击可能造成的损害。事实上,系统加固是许多合规指令中的核心控制措施。
本指南将解释什么是配置加固,以及如何为您的 Linux 和 Unix 系统建立加固后的构建标准。
系统加固的基础
最安全的 Linux 服务器或其他计算机,是那些处于关机状态并且与网络断开连接的设备。但如果我们希望实际使用这台机器来提供 IT 服务,就必须在其启动并接入网络(甚至互联网)时,尽可能增强其安全防护能力。
这时就需要进行加固(hardening)。对系统进行加固,意味着为安全运行和数据保护优化其配置。可被利用的漏洞范围非常广,因此需要遵循三条主要规则:
- 移除不属于该计算机职责所需的功能。 例如,操作系统和其他应用程序通常以“快速启动(quick start)”状态交付,预先加载了实用工具和功能,便于满足用户可能需要的用途。然而,提供的功能越多,主机暴露的攻击面就越大。因此,请务必禁用不需要的功能,并尽可能避免添加不必要的功能。
- 及时打补丁并更新。 软件设计中的缺陷会形成攻击者可利用的漏洞。软件供应商会提供补丁或更新后的软件版本以修复这些问题,因此请确保包括操作系统在内的所有软件始终保持完全更新。
- 保持安全的配置设置。 至关重要的是,要启用并持续维护安全设置。
Linux 系统加固
毫不意外,Linux 安全加固本身就是一项专业流程,因为市面上存在种类繁多、细微差异各不相同的 Linux 发行版。尽管关于 Linux 服务器加固的最佳实践并不缺少各类指南、检查清单和建议——包括 Center for Internet Security (CIS) 基准以及 DISA STIGs——但本指南将提供需要采用的关键配置选项。
重要: 在应用加固设置之前,请确保已备份系统,并在重启后进行测试。很容易被锁定在外!
移除不需要的功能
首先移除所有不需要用来运行服务器的功能、实用工具和服务。卸载不必要的软件,并禁用不需要的系统服务。由于基础设施中的硬件同样可能存在可被利用的漏洞,请确保任何可访问的接口(例如 USB 端口)都已禁用,必要时甚至应从设备上进行物理移除。
该流程是先登录,然后获取已安装的软件包和服务的报告,再进行审查以识别哪些可以移除或禁用。对于保留的关键项,请检查是否有可用补丁,以修复可被利用(被攻击者利用)已知漏洞。
如何在 Linux/Unix 系统上列出软件
系统 | 使用的命令 |
|---|---|
|
Linux(例如:RedHat或CentOS) |
rpm -qa --qf '%{NAME} %{VERSION} %{VENDOR}\\n' |
|
Debian Linux(例如:Ubuntu) |
dpkg -l |
|
Fedora Linux |
|
|
从终端或PuTTY会话列出软件: service --status-all chkconfig --list systemctl -a |
|
|
停止服务: Service <Service-Name> stop Chkconfig <Service-Name> Systemctl stop <Service-Name> |
|
|
禁用服务: Systemctl disable <Service-Name> Chkconfig <Service-Name> off |
|
|
还要检查 /etc/init.d/ 路径下的任何服务控制脚本,并运行 ls /etc/init.d/ 来显示所有启动脚本;然后重命名或删除任何要禁用的脚本。 |
尽量减少开放端口和其他网络漏洞
基于网络的攻击是最常见的威胁之一。为降低风险,请识别所有对网络开放且可访问的端口,并移除任何不需要的、与之对应的进程。要在 Linux 上列出开放端口,请使用以下命令:
ss -tulpn | egrep “LISTEN” | awk ‘{print “IP-Port “ $4 “ PID/Name “ $7}’
此外:
- 确保 TCP Wrappers 服务处于启用状态。
- 同时定义一个 etc/hosts.allow 白名单以及一个 etc/hosts.deny 黑名单。
- 使用 iptables 或 Firewalld 服务,并为 IP V4 和 V6 流量都设置“拒绝全部”(Deny All)策略。即使你正在使用网络内的第三方 WAF 和防火墙保护,也要这样做。
- 阻止 ICMP 流量,以防止黑客工具用于设备发现的“ping 扫描”。
审查用户帐户和身份验证
检查本地用户帐户并删除任何不需要的帐户。对于保留的本地用户帐户,应配置强密码策略,涵盖密码复杂度、长度、过期时间、可复用性以及更改频率。此外,请确保对存储的密码使用强哈希算法。
用户帐户和身份验证应通过诸如 Active Directory 之类的集中式控制系统来进行管理;更理想的是使用现代的 privileged access management (PAM) 解决方案,它支持“Zero Standing Privilege(零常驻特权)”策略,从而抵消了传统用户帐户和永久分配特权所带来的许多问题。当然,切勿使用 root,并且始终确保仅在确有需要时才使用 sudo 提权。
如何为本地帐户配置密码策略
找到并编辑以下配置文件: /etc/security/pwquality.conf
要强制使用 14 个字符的密码:
minlen = 14
要对所有密码强制复杂性:
minclass = 14
或
dcredit = -1
ucredit = -1
ocredit = -1
lcredit = -1
要实施强密码锁定策略:
更新 /etc/pam.d/system-auth 和 /etc/pam.d/password-auth 文件,以设置以下选项:
auth required pam_faillock.so preauth silent deny=5 unlock_time=900
auth required pam_faillock.so authfail deny=5 unlock_time=900
要实施至少 5 个密码的密码历史策略:
在 /etc/pam.d/password-auth 中的 pam_pwhistory.so 和 pam_unix.so 行中添加记住记忆选项 remember=5:
password requisite pam_pwhistory.so try_first_pass local_users_only enforce-for-root retry=3 remember=5
password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok remember=5
要实施强密码哈希:
按如下方式更新 /etc/pam.d/system-auth 和 /etc/pam.d/password-auth 文件:
/etc/pam.d/password-auth:
password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok
/etc/pam.d/system-auth:
password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok remember=5
审查服务账户
应审查系统账户和服务账户,并移除任何不再需要的账户。
服务帐户之所以“加固”,是因为它们仅支持本地运行的进程操作,并且不提供用户 Shell,因此这些帐户绝不能通过用户登录来访问服务器。不过,加固的核心理念是最小化功能,因此仍应移除未使用的服务帐户。
Linux 与 Unix 的 SSH 加固
作为远程管理 Linux 系统的主要通道,SSH 需要特别关注。要加固 SSH 服务器的运行,需要在该设置文件中启用一些默认设置。/etc/ssh/sshd_config 文件中的相关选项。
SSH 用于所有 Linux 和 Unix 的访问,因此以下指南同样适用于 Unix 的加固。
启用 SSH 协议的 v2
例如,默认配置会启用已过时且安全性较低的 SSH 协议版本 1。CIS 加固指南建议启用版本 2 以增强安全性。为此,只需在配置文件(/etc/ssh/sshd_config)中通过删除 # 来取消对 Protocol 2 设置的注释,如下所示:
/etc/ssh/sshd_config 中的默认条目 /etc/ssh/sshd_config:
# The default requires explicit activation of protocol 1
# Protocol 2
更安全的配置:
# The default requires explicit activation of protocol 1
Protocol 2
进一步加固
此外,请将以下推荐的 CIS 加固设置应用到配置文件中:
LogLevel INFO
IgnoreRhosts yes
…
PermitEmptyPasswords no
…
LoginGraceTime 60
PermitRootLogin no
MaxAuthTries 4
HostbasedAuthentication no
…
X11Forwarding no…
PermitUserEnvironment no
…
ClientAliveInterval 300
ClientAliveCountMax 0
…
Banner /etc/issue.net
…
AllowUsers <Specify user names, separated by spaces, e.g. user1 user2>
补充说明:
/etc/issue.net 需要创建/编辑该文件,以包含合适的 Banner,例如:
警告! 未经授权访问本系统被禁止,并将依法追究责任。通过访问本系统,即表示您同意:如怀疑存在未经授权的使用行为,可能会对您的操作进行监控。
与 AllowUsers, AllowGroups 一起,也支持作为配置开关/关键字使用。
Apache Web 服务器加固
Linux 是托管基于互联网的 Web 应用程序的首选平台,Apache Tomcat 和 Apache HTTP Server(通常称为 Apache HTTPD)是提供 Web 内容时最受欢迎的两种选择。
Apache 配置加固的方法也是一样的:尽量减少功能,并在可用的情况下启用安全的配置设置。
确认仅启用了必要的 Apache 模块:
httpd -M
例如,mod_dav 和 mod_dav_fs 应始终禁用;而 log_config 模块应始终加载并启用。
确认 package.access 的定义仅包含以下允许的软件包:
package.access = sun.,org.apache.catalina.,org.apache.coyote.,
org.apache.tomcat.,org.apache.jasper.
配置 server.xml 文件:
位于 server.xml 的文件(在 CATALINA_HOME/conf 路径中)是 Web 服务器的核心配置存储。建议在 server.xml 中包含的设置如下:
- 禁用关闭端口:
Server port="-1" shutdown="SHUTDOWN">
- 移除未使用的连接器,包括默认 HTTPConnector 和 AJPConnector。要移除 HTTPConnector,请删除或注释掉此标签:
Connector className="org.apache.catalina.connector.http.HttpConnector"
...
connectionTimeout="60000"/>
移除默认的 presence-advertising 设置:
适用于 Tomcat:
将 xpoweredBy 属性设置为 false:
xpoweredBy="false" />
适用于 HTTP Server:
- 移除默认 index.html,并对以下来自 /etc/httpd/conf.d/welcome.conf 的内容逐行使用 # 或 ## 进行注释:
##<LocationMatch "^/+$">
## Options -Indexes
## ErrorDocument 403 /error/noindex.html
##</LocationMatch>
- 注释掉 Server-Status 部分:
##<Location /server-status>
## SetHandler server-status
## Order deny,allow
## Deny from all
## Allow from .example.com
##</Location>
- 注释掉 server-info 部分:
##<Location /server-info>
## SetHandler server-info
## Order deny,allow
## Deny from all
## Allow from .example.com
##</Location>
禁用诊断跟踪功能:
将每个 allowTrace 属性的值设置为 Connector 中的 false
禁用应用程序的自动部署,并禁用开机启动时的部署:
autoDeploy="false"
deployOnStartup="false"
进一步加固:
- 确保文件和文件夹权限足够严格,并使 Apache 服务使用非 shell 的服务帐户运行(即不能用于登录系统的帐户)。禁用目录列表和浏览。
$CATALINA_HOME
$CATALINA_BASE
面向 Linux 的内核加固
SELinux 会修改 Linux 内核以强制执行强制访问控制(MAC),从而限制 Linux 进程如何访问文件和程序。此额外的限制层提供了针对 root kit 恶意软件的基础防护机制。对于 Debian 发行版,AppArmor 提供了等效级别的 MAC。
SELinux 设置
在 CentOS/RHEL 上安装 SELinux:
dnf install libselinux
启用 SELinux:
默认情况下,SELinux 会被禁用。要在启动时启用 SELinux,请 edit/etc/default/grub 并删除这些默认设置:
selinux=0
enforcing=0
将 SELinux 配置设置为 enforcing
编辑 /etc/selinux/config 文件以包含以下内容:
SELINUX=enforcing
SELINUXTYPE=default
检查所有服务是否都以由 SELinux 控制的安全上下文运行:
下面的命令将列出从 init 进程启动的任何服务,这些服务可能需要为其分配非默认的安全上下文:
ps -eZ | egrep "initrc" | egrep -vw "tr|ps|egrep|bash|awk" | tr ':' ' ' | awk '{ print $NF }'
重新启动计算机,确保已加载所有设置。
AppArmor 设置
在 Ubuntu/Debian 上安装 AppArmor:
apt-get install apparmor apparmor-profiles apparmor-utils
在启动时启用 AppArmor:
编辑 /etc/default/grub 并添加以下设置:
GRUB_CMDLINE_LINUX="apparmor=1 security=apparmor"
确保所有 AppArmor 配置文件都处于 enforce 模式:
aa-enforce /etc/apparmor.d/*
嵌入式 Linux 加固
嵌入式 Linux 为嵌入式设备或嵌入式系统提供精简版的操作系统,例如智能手机、智能电视、机顶盒以及宽带互联网路由器。
当不需要通常由服务器级 Linux 设备所提供的全部功能范围,并且为节省制造成本而将存储、内存和 CPU 等硬件资源尽量缩减时,具有更小占用空间的简化操作系统就很有吸引力。 例如,谷歌开发的开源 Android 平台针对智能手机和电视进行了优化,而 OpenWrt 路由器固件则用于多种宽带路由器。
操作系统中包含的功能会因预期应用而差异很大。例如,Android 包含屏幕锁定、人脸识别、PIN 输入支持以及位置服务;这些功能在家用路由器的操作系统中并不需要,但会包含 VPN、访客 Wi‑Fi 和带宽限速等功能。 因此,安全加固(hardening)建议会专门与所使用的特定设备和平台绑定。
Android 加固要点
确保设备固件是最新版本:
转到 Settings | System | System Updates;选择 Check for Update 并安装所有可用的更新。
安装 Google Play 和安全更新:
转到 Settings | Security:
- 选择 Google Security Check-Up 并应用所有可用的更新。
- 选择 Google Play system update 并应用所有可用的更新。
启用通用设备安全:
- 转到 Settings | Security | Device Security,然后执行以下操作:
- 将 ‘Screen Lock’ 设置为 ‘Enabled’。
- 将 ‘Pattern Visible’ 设置为 ‘Disabled’。
- 将 ‘Automatically Lock’ 设置为 ‘Immediately’。
- 设置 ‘Power Button Instantly Locks’ 为 ‘On’。
- 设置设备管理员应用 ‘Find My Device’ 为 ‘Enabled’。
- 设置 ‘Allow remote lock and erase’ 为 ‘Enabled’。
2. 进入 Settings | System | Advanced ,然后执行以下操作:
- 设置 ‘Developer Options’ 为 ‘Off’。
3. 转到 Settings | Apps & Notifications | Advanced | Special App Access ,然后执行以下操作:
- 将 ‘Install Unknown Apps’ 设置为 ‘Not Allowed’。
4. 打开 Play Store | Menu 并执行以下操作:
- 选择 ‘My Apps & Games’ ,然后点击 ‘Update All’。
OpenWrt 加固要点
- 将管理员密码从默认值更改。
- 确保固件始终更新到最新版本。
Kali Linux 加固
Kali Linux 已针对成为渗透测试人员的首选平台进行了优化,因此包含广泛的安全审计和渗透测试工具。
由于 Kali Linux 是基于 Debian 的 Linux 发行版,你可以使用上面的 Linux 加固建议来解决 Kali Linux 系统中的安全弱点。
Linux Mint 安全加固
同样地,对于 Linux Mint,由于它是从 Ubuntu 派生的桌面 Linux 平台,应当采用用于 Debian-Linux 的相同加固流程。按前面的 Linux Hardening Checklist 步骤逐项操作,并将这些措施应用到你的 Linux Mint 系统中。
加固 Arch Linux
作为一款不直接源自 Debian 或 Fedora 的独立 Linux 发行版,Arch Linux 在加固措施方面属于个案情况,尽管关于如何以及加固什么的理念是相似的。Arch 代码被有意构建为精简的“no filler”Linux 发行版,因此在移除/禁用不必要服务方面通常需要更少的加固工作。
结语
即使是加固后的系统仍然可能被入侵,尤其是通过以下方式:
- 零日威胁——我们并不知情、因此也未加以防护的漏洞利用
- 勒索软件和其他恶意软件
- 内部威胁,包括使用被劫持凭据的黑客,以及滥用其访问权限的用户
因此,除了加固系统之外,还需要额外的防御措施。尤其重要的是监控系统和文件的完整性。任何非预期的变更都可能导致入侵或其他安全事件。Netwrix Change Tracker 可对所有非计划变更提供实时告警,并支持所有 Linux 和 Unix 平台。
分享到