安全指南
保护 RHEL 服务器和工作站的概念和技术
摘要
第 1 章 安全主题概述
/lib
目录中的文件进行了一些引用。使用 64 位系统时,提到的一些文件可能位于 /lib64
中。
1.1. 什么是计算机安全性?
1.1.1. 标准化安全
- 机密性 - 敏感信息必须只对一组预定义的个人可用。应限制未经授权的信息的传播和使用。例如,信息的机密性确保客户的个人或财务信息不会被未经授权的人出于恶意目的而获得,如身份失窃或信用欺诈。
- 完整性 - 不应以导致信息不完整或不正确的方式更改信息。应限制未经授权的用户修改或销毁敏感信息的能力。
- 可用性 - 被授权的用户可随时根据需要访问信息。可用性是一种保证,即可以按照商定的频率和及时性获得信息。这通常以百分比来衡量,并在网络服务提供商及其企业客户的服务级别协议(SLA)中正式约定。
1.1.2. 加密软件和认证
1.2. 安全控制
- 物理的
- 技术的
- 管理的
1.2.1. 物理控制
- 闭路监控摄像机
- 运动或热报警系统
- 安全保护
- 照片 ID
- 金属门锁定
- 生物统计学(包括指纹、声音、脸部、虹膜、笔迹和其他用于识别个人的自动方法)。
1.2.2. 技术控制
- 加密
- 智能卡
- 网络验证
- 访问控制
- 文件完整性审核软件
1.2.3. 管理控制
- 培训并认知
- 灾难和恢复计划
- 人员与隔离策略
- 人员注册和核算
1.3. 漏洞评估
- 负责配置、监控和维护技术的人员的专业技能.
- 能够快速高效地修补和更新服务及内核的能力。
- 负责人员对网络时刻保持警觉的能力。
1.3.1. 定义评估和测试
- 树立主动关注信息安全的意识。
- 在攻击这发现潜在的漏洞之前,发现潜在的漏洞。
- 使系统保持最新,并应用了补丁程序。
- 在开发专业人士方面促进增长和协助。
- 中止商业损失和负面的公共形象。
1.3.2. 为漏洞评估建立方法论
- https://www.owasp.org/ - 开放的 Web 应用程序安全项目
1.3.3. 漏洞评估工具
README
文件或手册页。此外,可以在互联网上查找更多信息,如文章、分步指南,甚至特定于工具的邮件列表。
1.3.3.1. 使用 Nmap 扫描主机
root
用户身份运行 yum install nmap 命令。
1.3.3.1.1. 使用 Nmap
IP
地址:
nmap <hostname>
foo.example.com
的机器,请在 shell 提示符下输入以下内容:
~]$ nmap foo.example.com
Interesting ports on foo.example.com: Not shown: 1710 filtered ports PORT STATE SERVICE 22/tcp open ssh 53/tcp open domain 80/tcp open http 113/tcp closed auth
1.3.3.2. Nessus
1.3.3.3. OpenVAS
1.3.3.4. Nikto
1.4. Security Threats
1.4.1. 网络安全隐患
不安全的构架
广播网络
集中式服务器
1.4.2. 服务器安全隐患
未使用的服务和开放端口
未修补的服务
管理
固有的 Insecure 服务
1.4.3. 工作站和家庭 PC 安全的威胁
错误密码
存在安全漏洞的客户端应用程序
1.5. Common Exploits 和 Attacks
漏洞 | 描述 | 备注 |
---|---|---|
空密码或默认密码 | 将管理密码置为空,或使用产品供应商设置的默认密码.这在路由器和防火墙等硬件中最常见,但一些在 Linux 上运行的服务也可以包含默认的管理员密码(虽然 Red Hat Enterprise Linux 7 不附带)。 |
通常与网络硬件(如路由器、防火墙、VPN 和网络附加存储(NAS)设备)相关。
在很多传统操作系统中很常见,尤其是那些捆绑了服务(如 UNIX 和 Windows)的操作系统。
管理员有时会匆忙创建特权用户帐户,并将密码置为空,从而为发现该帐户的恶意用户创建了一个完美的入口点。
|
默认共享密钥 | 出于开发或评估测试的目的,安全服务有时会打包默认的安全密钥。如果这些密钥保持不变,并放在互联网上的生产环境中,则拥有相同默认密钥的 所有 用户都可以访问该共享密钥的资源以及其包含的任何敏感信息。 |
最常在无线接入点和预配置的安全服务器设备中。
|
IP Spoofing | 远程计算机充当本地网络上的节点,找到您服务器的漏洞,并安装一个后门程序或特洛伊木马来控制您的网络资源。 |
欺骗比较困难,因为它涉及到攻击者预测 TCP/IP 序列号以协调到目标系统的连接,但有几个工具都可帮助攻击者执行此类攻击。
具体取决于目标系统运行的服务(如 rsh、telnet、FTP等),这些服务使用 基于源 的身份验证技术,与 ssh 或 SSL/TLS 中使用的其他形式的加密身份验证相比,不建议这样做。
|
窃听 | 通过窃听两个节点之间的连接,来收集网络上两个活动节点之间传递的数据。 |
这种类型的攻击主要适用于明文传输协议,如 Telnet、FTP 和 HTTP 传输。
远程攻击者必须能够访问局域网中一个被破坏的系统才能执行此类攻击;通常黑客使用主动攻击(如 IP 欺骗或中间人)来破坏局域网上的系统。
安全措施包括带有加密密钥交换、一次性密码或加密身份验证的服务,以防止密码嗅探;还建议在传输过程中进行强加密。
|
服务漏洞 | 攻击者发现在互联网上运行的服务有缺陷或漏洞;通过此漏洞,攻击者破坏整个系统以及其可能保存的任何数据,并可能破坏网络中的其他系统。 |
基于 HTTP 的服务(如 CGI)容易受到远程命令执行甚至交互式 shell 访问的攻击。即使 HTTP 服务以非特权用户(如"nobody")的身份运行,可以读取的配置文件和网络映射等信息,或者攻击者可以发起拒绝服务攻击,从而耗尽系统资源或使其对其他用户不可用。
服务有时可能会有在开发和测试过程中没有被注意到的漏洞;这些漏洞(如 缓冲区溢出 ,攻击者会使用填充应用内存缓冲区的任意值使服务崩溃,从而给攻击者一个交互式命令提示,他们可以从中执行任意命令)可以为攻击者提供完整的管理控制。
管理员应确保服务不以 root 用户身份运行,并应该对来自供应商或安全组织(如 CER T和 CVE)的应用程序补丁和勘误表更新保持警惕。
|
应用程序漏洞 | 攻击者在桌面和工作站应用程序(如电子邮件客户端)中发现错误,执行任意代码,植入特洛伊木马以备将来入侵,或使系统崩溃。如果被入侵的工作站对网络的其余部分具有管理特权,则可能会被进一步利用。 |
工作站和桌面更易被利用,因为工作者不具备防止或检测威胁的专业知识或经验;必须告知个人在安装未授权软件或打开未经请求的电子邮件附件时所承担的风险。
可以实施保护,如电子邮件客户端软件不自动打开或执行附件。此外,使用红帽网络自动更新工作站软件;或使用其他可以减轻多套安全部署负担的系统管理服务。
|
拒绝服务(DoS)攻击 | 攻击者或攻击者组通过向目标主机(服务器、路由器或工作站)发送未经授权的数据包,来针对组织的网络或服务器资源进行协调。这将迫使合法用户无法使用该资源。 |
美国报告的最新 DoS 问题单在 2000 年发生。几个高流量的商业和政府站点被协同的 ping 洪水攻击造成不可用,这些攻击使用了几个被破坏的系统,这些系统的高带宽连接被作为 僵尸,或重定向广播节点。
源数据包通常会被伪造(以及重播),从而使调查攻击的真正来源变得困难。
使用 iptables 和网络入侵检测系统(如 snort )进行入口过滤(IETF rfc2267)的进步有助于管理员跟踪并防止分布式 DoS 攻击。
|
第 2 章 安装的安全提示
2.1. 保护 BIOS
2.1.1. BIOS 密码
- 防止对 BIOS 设置的更改 - 如果入侵者可以访问 BIOS,他们可以将其设置为从 CD-ROM 或闪存驱动器引导。这使得他们能够进入救援模式或单用户模式,从而使他们可以在系统上启动任意进程或复制敏感数据。
- 防止系统引导 - 一些 BIOS 允许对引导过程进行密码保护。激活后,攻击者必须在 BIOS 启动引导加载程序前输入密码。
2.1.1.1. 保护基于非 BIOS 的系统
2.2. 对磁盘进行分区
/boot
、/
、/home
、/tmp
和 /var/tmp/
目录创建单独的分区。每种分区的原因不同,我们将解决每个分区。
/boot
- 这个分区是系统在启动过程中读取的第一个分区。用于将系统引导至 Red Hat Enterprise Linux 7 的引导装载程序和内核镜像存储在这个分区中。此分区不应加密。如果这个分区包含在 / 中,且该分区已加密或者不可用,则您的系统将无法引导。
/home
- 当用户数据(
/home
)存储在/
而不是独立分区中时,分区可能会填满,从而导致操作系统不稳定。另外,当将您的系统升级到 Red Hat Enterprise Linux 7 的下一版本时,当您可以将数据保存在/home
分区中时,在安装过程中不会覆盖它。如果 root 分区(/
)损坏,则您的数据将永久丢失。通过使用单独的分区,对数据丢失有稍微多一点的保护。您还可以将此分区作为频繁备份的目标。 /tmp
和/var/tmp/
。/tmp
和/var/tmp/
目录都是用来存储不需要长期存储的数据。但是,如果大量数据填充了其中一个目录,则它可能会消耗掉您的所有存储空间。如果发生这种情况,且这些目录存储在/
中,则您的系统可能会变得不稳定并崩溃。因此,将这些目录移到它们自己的分区中是一个不错的想法。
2.3. 安装最小软件包挂载
Minimal 安装
环境的更多信息,请参阅 Red Hat Enterprise Linux 7 安装指南中的 软件选择 章节。最少的安装也可以通过 Kickstart 文件使用 --nobase
选项执行。有关 Kickstart 安装的详情,请查看 Red Hat Enterprise Linux 7 安装指南中的软件包选择部分。http://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/sect-kickstart-syntax.html#sect-kickstart-packages
2.4. 在安装过程中限制网络连接
2.5. 安装后的步骤
- 更新您的系统。以 root 用户身份输入以下命令:
~]# yum update
- 尽管安装 Red Hat Enterprise Linux 后会自动启用防火墙服务
firewalld
,但在某些情况下,它可能会被明确禁用,例如在 kickstart 配置中。在这种情况下,建议考虑重新启用防火墙。要启动firewalld
,请以 root 用户身份输入以下命令:~]# systemctl start firewalld ~]# systemctl enable firewalld
- 要提高安全性,请禁用您不需要的服务。例如,如果您的计算机上没有安装打印机,使用以下命令禁用 cups 服务:
~]# systemctl disable cups
要查看活动状态的服务,请输入以下命令:~]$ systemctl list-units | grep service
2.6. 其它资源
第 3 章 使您的系统保持最新状态
3.1. 维护已安装的软件
3.1.1. 规划和配置安全更新
3.1.1.1. 使用 Yum 的安全功能
root
用户身份输入以下命令:
~]# yum check-update --security
Loaded plugins: langpacks, product-id, subscription-manager
rhel-7-workstation-rpms/x86_64 | 3.4 kB 00:00:00
No packages needed for security; 0 packages available
~]# yum update --security
命令 | 描述 | |
---|---|---|
公告 [公告] | 显示有关一个或多个公告的信息。使用 公告 号或数字替换公告。 | |
CVE | 显示与 CVE 相关的信息子集(常见漏洞和暴露)。 | |
Security 或 sec | 显示所有与安全相关的信息。 | |
[severity_level] 或 sev [severity_level] | 显示提供的 severity_level 的安全相关软件包的信息。 |
3.1.2. 更新和安装软件包
3.1.2.1. 验证签名的软件包
/etc/yum.conf
配置文件中将 gpgcheck
配置指令设置为 1
。
rpmkeys --checksig package_file.rpm
3.1.2.2. 安装签名软件包
yum install package_file.rpm
.rpm
软件包:
yum install *.rpm
3.1.3. 应用由安装更新引入的变化
- 应用程序
- 用户空间应用程序是用户可以启动的任何程序。通常,只有在用户、脚本或自动任务实用程序启动它们时,才会使用此类应用。更新这样的用户空间应用程序后,停止系统上的任何应用程序实例,然后再次启动程序以使用更新的版本。
- 内核
- 内核是 Red Hat Enterprise Linux 7 操作系统的核心软件组件。它管理对内存、处理器和外围设备的访问,并且调度所有任务。由于其中央角色,在没有重新启动计算机的情况下,无法重新启动内核。因此,在系统重启前,无法使用内核版本。
- KVM
- 更新 qemu-kvm 和 libvirt 软件包后,需要停止所有客户虚拟机,重新载入相关的虚拟化模块(或重启主机系统),并重新启动虚拟机。使用 lsmod 命令确定从以下哪些模块被加载:
kvm
、kvm-intel
或kvm-amd
。然后,使用 modprobe -r 命令删除并随后使用 modprobe -a 命令重新加载受影响的模块。fox 示例:~]# lsmod | grep kvm kvm_intel 143031 0 kvm 460181 1 kvm_intel ~]# modprobe -r kvm-intel ~]# modprobe -r kvm ~]# modprobe -a kvm kvm-intel
- 共享库
- 共享库是代码单元,如
glibc
,它们由多个应用程序和服务使用。使用共享库的应用程序通常会在应用程序初始化时加载共享代码,因此任何使用更新库的应用程序都必须停止并重新启动。要确定哪个应用程序针对特定库链接,请使用 lsof 命令:lsof library
例如,要确定哪些运行的应用程序链接到libwrap.so.0
库,请输入:~]# lsof /lib64/libwrap.so.0 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME pulseaudi 12363 test mem REG 253,0 42520 34121785 /usr/lib64/libwrap.so.0.7.6 gnome-set 12365 test mem REG 253,0 42520 34121785 /usr/lib64/libwrap.so.0.7.6 gnome-she 12454 test mem REG 253,0 42520 34121785 /usr/lib64/libwrap.so.0.7.6
此命令返回一个使用TCP
包装程序进行主机访问控制的所有运行程序的列表。因此,在更新 tcp_wrappers 软件包时,任何列出的程序都必须停止并重新启动。 - systemd 服务
- systemd 服务是通常在引导过程中启动的持久服务器程序。systemd 服务示例包括
sshd
或vsftpd
。因为只要机器正在运行,这些程序通常会在内存中保留,因此在升级其软件包后,每个更新的 systemd 服务都必须停止并重新启动。这可以以root
用户身份使用 systemctl 命令完成:systemctl restart service_name
使用您要重启的服务的名称替换 service_name,如sshd
。 - 其他软件
- 按照下方链接的资源概述的说明,正确更新以下应用程序。
- Red Hat Directory Server - 请参阅 中有关的 Red Hat Directory Server 版本的发行注记。https://access.redhat.com/documentation/zh-CN/Red_Hat_Directory_Server/
- Red Hat Enterprise Virtualization Manager - 请参阅有关的 Red Hat Enterprise Virtualization 版本的 安装指南,网址为 https://access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Virtualization/。
3.2. 使用红帽客户门户网站
3.2.1. 在客户门户网站中查看安全公告
3.2.3. 了解问题严重性分级
3.3. 其它资源
安装的文档
- yum(8) - Yum 软件包管理器的手册页提供了有关 Yum 可用来在您的系统上安装、更新和删除软件包的方式的信息。
- rpmkeys(8) - rpmkeys 实用程序的手册页描述了该程序可用于验证下载的软件包的真实性的方式。
在线文档
- Red Hat Enterprise Linux 7 系统管理员指南 - Red Hat Enterprise Linux 7 系统管理员指南 记录了在 Red Hat Enterprise Linux 7 系统上用于安装、更新和删除软件包的 Yum 和 rpm 命令。
- Red Hat Enterprise Linux 7 SELinux 用户和管理员指南 - Red Hat Enterprise Linux 7 的 SELinux 用户和管理员指南记录了 SELinux 强制访问控制机制 的配置。
红帽客户门户网站
- Red Hat Customer Portal, Security - 客户门户网站的安全部分包含到最重要的资源的链接,包括 Red Hat CVE 数据库,以及红帽产品安全联系。
- 红帽安全博客 - 有关红帽安全专家的最新与安全相关问题的文章。
另请参阅
- 第 2 章 安装的安全提示 描述如何从开始安全地配置您的系统,以便以后更轻松地实施其他安全设置。
- 第 4.9.2 节 “创建 GPG 密钥” 描述如何创建一组个人 GPG 密钥以验证您的通信。
第 4 章 使用工具和服务强化您的系统
4.1. 桌面安全性
4.1.1. 密码安全性
/etc/passwd
文件中,这样会使系统容易受到离线密码攻击。如果入侵者能够以普通用户身份获取对计算机的访问权限,他可将 /etc/passwd
文件复制到自己的计算机上,并对其运行任意数量的密码阻止程序。如果文件中有不安全的密码,则只需要在密码破解程序发现它之前的时间。
/etc/shadow
中消除此类攻击,这只对 root 用户可读。
4.1.1.1. 创建强密码
randomword1 randomword2 randomword3 randomword4
1!
"。请注意,此类修改 不会 显著增加密码短语的安全性。
/dev/urandom
拉取。您可以指定的最小位数为 56,它足以用于系统和服务的密码,其中 brute 强制攻击非常罕见。64 位对于攻击者无法直接访问密码哈希文件的应用程序来说是足够的。对于攻击者可能会获得对密码哈希的直接访问或者密码用作加密密钥的情况,应使用 80 到 128 位。如果您指定了无效数量的熵位,pwmake 将使用默认位。要创建 128 位的密码,请输入以下命令:
pwmake 128
- 使用单个字典词语,一个外部语言中的词语、一个 inverted 字词或仅数字。
- 使用少于 10 个字符的密码或密码短语。
- 使用键盘布局中的一系列键。
- 写出您的密码。
- 在密码中使用个人信息,如过期日期、年金、家庭成员名称或片断名称。
- 在多台机器上使用相同的密码短语或密码。
4.1.1.2. 强制密码
pam_pwquality.so
PAM 模块执行。
pam_pwquality
PAM 模块替换了 pam_cracklib
,它在 Red Hat Enterprise Linux 6 中使用它作为密码质量检查的默认模块。它使用与 pam_cracklib
相同的后端。
pam_pwquality
模块用于检查密码对一组规则的强度。其流程由两个步骤组成:首先它检查在字典中是否找到提供的密码。如果没有,它会继续执行很多额外的检查。pam_pwquality
与 /etc/pam.d/passwd
文件 的密码
组件中的其他 PAM 模块一同堆叠,在 /etc/security/pwquality.conf
配置文件中指定自定义规则集。有关这些检查的完整列表,请查看 pwquality.conf (8) 手册页。
例 4.1. 在 pwquality.conf
中配置密码强度检查
pam_quality
启用,请将以下行添加到 /etc/pam.d/passwd
文件中的 密码
堆栈中:
password required pam_pwquality.so retry=3
/etc/security/pwquality.conf
文件中添加以下行:
minlen = 8 minclass = 4
/etc/security/pwquality.conf
中:
maxsequence = 3 maxrepeat = 3
abcd
,以及 3 个相同的连续字符,如 1111
。
4.1.1.3. 配置密码过期
-
M 选项指定密码有效的最大天数。例如,要将用户的密码设置为在 90 天后过期,请使用以下命令:
chage -M 90
username
-M
选项后使用 -1
。
选项 | 描述 |
---|---|
-d days | 指定 1970 年 1 月 1 日之后的天数,密码已改变。 |
-E date | 指定帐户被锁定的日期,格式为 YYYY-MM-DD。也可以使用 1970 年 1 月 1 日之后的天数。 |
-I days | 指定在锁定帐户前密码过期的非活动天数。如果值为 0,则帐户在密码过期后不会被锁定。
|
-l | 列出当前帐户过期设置。 |
-m days | 指定用户必须更改密码的最小天数。如果值为 0, 则密码不会过期。 |
-M days | 指定密码有效的最大天数。当此选项指定的天数加上 -d 选项指定的天数小于当前日期的天数时,用户必须先更改密码。 |
-W days | 指定密码到期日期前的天数,以警告用户。 |
chage <username>
~]# chage juan Changing the aging information for juan Enter the new value, or press ENTER for the default Minimum Password Age [0]:10
Maximum Password Age [99999]:90
Last Password Change (YYYY-MM-DD) [2006-08-18]: Password Expiration Warning [7]: Password Inactive [-1]: Account Expiration Date (YYYY-MM-DD) [1969-12-31]:
- 设置初始密码。要分配默认密码,以
root
用户身份在 shell 提示符后输入以下命令:passwd username
警告passwd 实用程序具有设置 null 密码的选项。使用 null 密码是非常方便的做法,因为任何第三方都可以使用不安全的用户名登录并访问系统。尽可能避免使用 null 密码。如果无法实现,请始终确保用户已准备好登录,然后再使用 null 密码解锁帐户。 - 以
root
用户身份运行以下命令来强制立即密码过期:chage
-d
0
username此命令设置密码上次更改为 epoch (January 1, 1970)的日期的值。这个值会强制立即过期密码过期策略(如果有的话)。
4.1.2. 帐户锁定
pam_faillock
PAM 模块允许系统管理员在指定次数尝试失败后锁定用户帐户。限制用户登录尝试主要作为安全措施,旨在防止针对获取用户帐户密码的可能的暴力攻击。
pam_faillock
模块时,失败的登录尝试存储在 /var/run/faillock
目录中每个用户的独立文件中。
even_deny_ root
选项时包括 root
用户帐户。
- 要在 3 次失败后锁定任何非 root 用户,并在 10 分钟后解锁该用户,请将两行添加到 /
etc/pam.d/system-
文件的 auth 部分。编辑后,两个文件中的整个auth
和/
etc/pam.d/password-authauth
部分都应该类似如下:auth required pam_env.so auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600 auth sufficient pam_unix.so nullok try_first_pass auth [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600 auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so
添加了行号 2 和 4。 - 在上一步中指定的两个文件的
account
部分添加以下行:account required pam_faillock.so
- 要对 root 用户应用帐户锁定,请将
even_deny_root
选项添加到/etc/pam.d/system-auth
和/etc/pam.d/password-auth
文件中的pam_faillock
条目:auth required pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=600 auth sufficient pam_unix.so nullok try_first_pass auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=600 account required pam_faillock.so
john
在之前登录三次后尝试登录时,其帐户会在第四个尝试时被锁定:
~]$ su - john
Account locked due to 3 failed logins
su: incorrect password
/etc/pam.d/system-auth
和 /etc/pam.d/password-auth
中首次调用 pam_faillock
。另外,将 user1
、user2
和 user3
替换为实际用户名。
auth [success=1 default=ignore] pam_succeed_if.so user in user1:user2:user3
root
用户身份运行 :
~]$ faillock
john:
When Type Source Valid
2013-03-05 11:44:14 TTY pts/0 V
root
用户身份运行:
faillock --user <username> --reset
使用 authconfig 保留自定义设置
system-auth
和 password-auth
文件会被 authconfig 工具中的设置覆盖。这可以通过创建符号链接来代替配置文件,authconfig 识别且不会被覆盖。要在配置文件和 authconfig 中同时使用自定义设置,请按照以下步骤配置帐户锁定:
- 检查
system-auth
和password-auth
文件是否已指向system-auth-ac
和password-auth-ac
(这是系统默认设置):~]# ls -l /etc/pam.d/{password,system}-auth
如果输出类似如下,符号链接就就位,您可以跳过到第 3 步:lrwxrwxrwx. 1 root root 16 24. Feb 09.29 /etc/pam.d/password-auth -> password-auth-ac lrwxrwxrwx. 1 root root 28 24. Feb 09.29 /etc/pam.d/system-auth -> system-auth-ac
如果system-auth
和password-auth
文件不是符号链接,请继续下一步。 - 重命名配置文件:
~]# mv /etc/pam.d/system-auth /etc/pam.d/system-auth-ac ~]# mv /etc/pam.d/password-auth /etc/pam.d/password-auth-ac
- 使用自定义设置创建配置文件:
~]# vi /etc/pam.d/system-auth-local
/etc/pam.d/system-auth-local
文件应包含以下行:auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600 auth include system-auth-ac auth [default=die] pam_faillock.so authfail silent audit deny=3 unlock_time=600 account required pam_faillock.so account include system-auth-ac password include system-auth-ac session include system-auth-ac
~]# vi /etc/pam.d/password-auth-local
/etc/pam.d/password-auth-local
文件应包含以下行:auth required pam_faillock.so preauth silent audit deny=3 unlock_time=600 auth include password-auth-ac auth [default=die] pam_faillock.so authfail silent audit deny=3 unlock_time=600 account required pam_faillock.so account include password-auth-ac password include password-auth-ac session include password-auth-ac
- 创建以下符号链接:
~]# ln -sf /etc/pam.d/system-auth-local /etc/pam.d/system-auth ~]# ln -sf /etc/pam.d/password-auth-local /etc/pam.d/password-auth
pam_faillock
配置选项的更多信息,请参阅 pam_faillock(8) 手册页。
删除 nullok
选项
/etc/shadow
文件中的 password 字段为空,则 nullok
选项允许用户使用空白密码登录。要禁用 nullok
选项,请从 /etc/pam.d/
目录中的配置文件中删除 nullok
字符串,如 /etc/pam.d/system-auth
或 /etc/pam.d/password-auth
。
nullok
选项,允许用户在不输入密码的情况下登录?KCS 解决方案以了解更多信息。
4.1.3. 会话锁定
4.1.3.1. 使用 vlock 锁定虚拟控制台
~]# yum install kbd
vlock -a
-a
选项会阻止切换到其他虚拟控制台。
vlock (1)
手册页。
4.1.4. 强制只读挂载 Removable Media
udev
规则来检测可移动介质,并使用 blockdev 工具将它们配置为只读挂载。这足以强制物理介质的只读挂载。
使用 blockdev 强制只读挂载 Removable Media
/etc/ udev
/rules.d/
目录中创建一个名为 的 udev 配置文件,例如: 80-readonly-removables.rules
:
SUBSYSTEM=="block",ATTRS{removable}=="1",RUN{program}="/sbin/blockdev --setro %N"
udev
规则确保所有新连接的可移动块(存储)设备都使用 blockdev 工具自动配置为只读。
应用新的 udev 设置
udev
规则。udev
服务自动检测对其配置文件的更改,但新设置不会应用到已存在的设备。只有新连接的设备会受到新设置的影响。因此,您需要卸载并拔出所有连接的可移动介质,以确保在下一次插入时将新设置应用到它们。
udev
将所有规则重新应用到已存在的设备,请以 root
用户身份输入以下命令:
~#
udevadm trigger
udev
使用上述命令重新应用所有规则不会影响任何已经挂载的存储设备。
udev
重新加载所有规则(出于某种原因不会自动检测到新规则),请使用以下命令:
~#
udevadm control --reload
4.2. 控制根访问
root
用户身份执行一些任务,或者使用 setuid 程序(如 sudo 或 su )获取有效的 root
特权。setuid 程序是与程序的所有者的用户 ID (UID)而不是用户操作程序运行的用户 ID (UID)。这些程序由长格式列表的所有者部分的 s
表示,如下例所示:
~]$ ls -l /bin/su
-rwsr-xr-x. 1 root root 34904 Mar 10 2011 /bin/su
s
可能为大写或小写。如果显示为大写,这表示没有设置底层权限位。
pam_console.so
的 PAM 模块,通常只为 root 用户保留一些活动,如重新启动和挂载可移动介质,则允许物理控制台登录的第一个用户。但是,在没有管理特权的情况下,无法更改网络设置、配置新鼠标或挂载网络设备等其他重要的系统管理任务。因此,系统管理员必须决定应收到其网络上的用户数量。
4.2.1. 禁止 Root 访问
root
身份登录,或者出于其他原因,应保留了 root 密码,并且应保持 secret,并且应禁止访问运行级别一个或多个用户模式(有关此主题的更多信息,请参阅 第 4.2.5 节 “保护 Boot Loader” )。
root
登录的四个不同方法:
- 更改 root shell
- 为防止用户直接以
root
身份登录,系统管理员可以将root
帐户的 shell 设置为/etc/passwd
文件中的 /sbin/nologin。表 4.2. 禁用 Root Shell 影响 未受影响 阻止访问root
shell 并记录任何此类尝试。以下程序无法访问root
帐户:- login
- gdm
- kdm
- XDM
- su
- ssh
- scp
- sftp
不需要 shell 的程序,如 FTP 客户端、邮件客户端和许多 setuid 程序。以下程序 不会阻止 访问root
帐户:- sudo
- FTP 客户端
- 电子邮件客户端
- 使用任何控制台设备(tty)禁用 root 访问权限
- 要进一步限制对
root
帐户的访问,管理员可以通过编辑/etc/securetty
文件来禁用在控制台中的root
登录。此文件列出了允许root
用户登录的所有设备。如果文件根本不存在,root
用户可以通过系统上的任何通信设备(无论是通过控制台还是原始网络接口)登录。这很危险,因为用户可以使用 Telnet 以root
身份登录其计算机,这会通过网络以纯文本形式传输密码。默认情况下,Red Hat Enterprise Linux 7 的/etc/securetty
文件只允许root
用户在与机器物理连接的控制台中登录。要防止root
用户登录,请以root
用户身份在 shell 提示符下输入以下命令来删除此文件的内容:echo > /etc/securetty
要在 KDM、GDM 和 XDM 登录管理器中启用securetty
支持,请添加以下行:auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
以下列出的文件:/etc/pam.d/gdm
/etc/pam.d/gdm-autologin
/etc/pam.d/gdm-fingerprint
/etc/pam.d/gdm-password
/etc/pam.d/gdm-smartcard
/etc/pam.d/kdm
/etc/pam.d/kdm-np
/etc/pam.d/xdm
警告空白/etc/securetty
文件不会阻止root
用户使用 OpenSSH 工具套件进行远程登录,因为在身份验证后不会打开控制台。表 4.3. 禁用 root 登录 影响 未受影响 阻止使用控制台或网络访问root
帐户。以下程序无法访问root
帐户:- login
- gdm
- kdm
- XDM
- 打开 tty 的其他网络服务
不以root
身份登录但通过 setuid 或其他机制执行管理任务的程序。以下程序 不会阻止 访问root
帐户:- su
- sudo
- ssh
- scp
- sftp
- 禁用 root SSH 登录
- 要防止
root
通过 SSH 协议登录,请编辑 SSH 守护进程的配置文件/etc/ssh/sshd_config
,并更改如下行:#PermitRootLogin yes
如下所示:PermitRootLogin no
表 4.4. 禁用 root SSH 登录 影响 未受影响 使用 OpenSSH 工具套件进行root
访问。以下程序无法访问root
帐户:- ssh
- scp
- sftp
不属于 OpenSSH 工具套件的程序。 - 使用 PAM 限制对服务的 root 访问权限
- PAM 通过
/lib/security/pam_listfile.so
模块,在拒绝特定帐户时具有很大的灵活性。管理员可以使用此模块来引用不允许登录的用户列表。要限制对系统服务的root
访问权限,请编辑/etc/pam.d/
目录中目标服务的 文件,并确保验证需要pam_listfile.so
模块。以下是如何将模块用于/etc/pam.d/ vsftpd PAM 配置文件中的 vsftpd
FTP 服务器(如果指令位于一行中,则不需要在 第一行末尾的\
字符):auth required /lib/security/pam_listfile.so item=user \ sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
这指示 PAM 查阅/etc/vsftpd.ftpusers
文件,并拒绝访问任何列出用户的服务。管理员可以更改此文件的名称,并可为每个服务保留单独的列表,或使用一个中央列表拒绝对多个服务的访问。如果管理员希望拒绝对多个服务的访问,可以将类似的行添加到 PAM 配置文件,如/etc/pam.d/pop
和/etc/pam.d/imap
用于邮件客户端,或/etc/pam.d/ssh
用于 SSH 客户端。有关 PAM 的更多信息,请参阅 Linux-PAM 系统管理员指南,位于/usr/share/doc/pam-<version>/html/
目录中。表 4.5. 使用 PAM 禁用 Root 影响 未受影响 防止对 PAM 感知的网络服务的root
访问。以下服务无法访问root
帐户:- login
- gdm
- kdm
- XDM
- ssh
- scp
- sftp
- FTP 客户端
- 电子邮件客户端
- 任何 PAM 感知服务
不了解 PAM 的程序和服务.
4.2.2. 允许根访问
root
访问权限不是问题。用户允许 root
访问权限意味着,像添加设备或配置网络接口等小活动可由单个用户处理,让系统管理员可以自由处理网络安全性和其他重要问题。
root
访问权限可能会导致以下问题:
- Machine Misconfiguration - 具有
root
访问权限的用户可能会错误地配置其机器,并需要帮助解决问题。甚至更糟糕,它们可能会在不知情的情况下打开安全漏洞。 - 运行 Insecure Services - 具有
root
访问权限的用户可能会在其计算机上运行不安全的服务器,如 FTP 或 Telnet,可能会使用户名和密码面临风险。这些服务通过网络以纯文本形式传输此信息。 - 以 Root 身份运行 电子邮件附件 - 尽管存在影响 Linux 的电子邮件病毒。恶意计划由
root
用户运行时构成了最大的威胁。 - 保持审计跟踪不变 - 因为
root
帐户通常由多个用户共享,因此多个系统管理员可以维护系统,因此无法找出这些用户在给定时间是root
用户。使用单独的登录时,通过 登录帐户以及会话跟踪目的的唯一编号将置于任务结构中,由用户启动的每个进程继承。使用并发登录时,可以使用唯一数字来跟踪操作到特定登录。当某个操作生成审计事件时,它会与登录帐户以及与该唯一数字关联的会话记录。使用 aulast 命令查看这些登录和会话。aulast 命令的--
effective 选项可以建议一个特定的 ausearch 查询来隔离特定会话生成的可审计事件。有关审计系统的更多信息,请参阅 第 7 章 系统审计。
4.2.3. 限制根访问
root
用户的访问。有关 su 和 sudo 的更多信息,请参阅 Red Hat Enterprise Linux 7 系统管理员指南中的 获取特权 章节,以及 su (1)
和 sudo (8)
手册页。
4.2.4. 启用自动注销
root
身份登录时,无人值守登录会话可能会导致严重的安全风险。要降低这个风险,您可以将系统配置为在固定时间段内自动注销闲置用户。
- 以
root
用户身份,在/etc/profile
文件的开头添加以下行,以确保无法中断此文件的处理:trap "" 1 2 3 15
- 以
root
用户身份,将以下行插入到/etc/profile
文件中,以便在 120 秒后自动注销:export TMOUT=120 readonly TMOUT
如果指定秒数没有活动(上例中设为120
),则TMOUT
变量终止 shell。您可以根据特定安装的需求更改限制。
4.2.5. 保护 Boot Loader
- 防止访问单用户模式 - 如果攻击者可以将系统引导至单用户模式,则它们会自动以
root
身份登录,而不会提示输入root
密码。警告不建议通过编辑/etc/sysconfig/init
文件中的SINGLE
参数来保护对单用户模式的访问。攻击者可以通过在 GRUB 2 的内核命令行中指定自定义初始命令(使用init=
参数)来绕过密码。建议对 GRUB 2 引导装载程序进行密码保护,如 Red Hat Enterprise Linux 7 系统管理员指南中的 使用密码保护 GRUB 2 章节中所述。 - 防止访问 GRUB 2 控制台 - 如果机器使用 GRUB 2 作为其引导装载程序,攻击者可以使用 GRUB 2 编辑器界面更改其配置或使用 cat 命令来收集信息。
- 防止对 Insecure Operating Systems 的访问 - 如果它是一个双引导系统,攻击者可以在引导时选择操作系统,例如 DOS,它会忽略访问控制和文件权限。
4.2.5.1. 禁用交互式启动
root
用户身份在 /etc/sysconfig/init
文件中禁用 PROMPT
参数:
PROMPT=no
4.2.6. 保护硬链接和符号链接
- 用户拥有其链接的文件。
- 用户已对其链接的文件具有读写访问权限。
- 符号链接后面的进程是符号链接的所有者。
- 目录的所有者与符号链接的所有者相同。
/usr/lib/sysctl.d/50-default.conf
文件中的以下选项控制:
fs.protected_hardlinks = 1 fs.protected_symlinks = 1
/etc/sysctl.d/
目录中创建一个名为 51-no-protect-links.conf
的新配置文件,其内容如下:
fs.protected_hardlinks = 0 fs.protected_symlinks = 0
.conf
扩展名,且需要在默认系统 文件后 读取(文件以字典顺序读取,因此文件名开头的设置具有较高的数字)。
sysctl
机制在引导时配置内核参数的详情,请查看 sysctl.d(5) 手册页。
4.3. 保护服务
4.3.1. 对服务的风险
- 拒绝 Service Attacks (DoS) - 通过向服务填充请求,拒绝服务攻击可能会导致系统因为尝试记录并回答每个请求而不可用。
- Service Attack (DDoS)的分布式拒绝(DDoS) - 使用多个受损机器(通常以千计或更多个)对服务进行协调攻击,利用请求并无法使用它。
- 脚本漏洞攻击 - 如果服务器使用脚本来执行服务器端操作,作为 Web 服务器通常做的,攻击者可以将不正确的编写脚本作为目标。这些脚本漏洞攻击可能会导致缓冲区溢出状况,或者允许攻击者更改系统上的文件。
- buffer Overflow Attacks - 希望侦听端口 1 到 1023 的服务必须以管理特权启动,或者需要为它们设置
CAP_NET_BIND_SERVICE
功能。当进程绑定到端口并正在侦听它后,通常会丢弃特权或功能。如果没有丢弃特权或功能,且应用程序有可被利用的缓冲区溢出,攻击者可能会作为运行守护进程的用户访问系统。由于存在可利用的缓冲区溢出,因此攻击者使用自动化工具来识别具有漏洞的系统,一旦获得访问,它们使用自动化的 rootkits 来保持对系统的访问权限。
4.3.2. 识别和配置服务
- cups - Red Hat Enterprise Linux 7 的默认打印服务器。
- cups-lpd - 备用打印服务器。
- xinetd - 控制到一系列从属服务器(如 gssftp 和 telnet )连接的超级服务器。
- sshd - OpenSSH 服务器,这是 Telnet 的安全替换。
4.3.3. 不安全的服务
- 通过网络 Unencrypted - 很多较旧的协议(如 Telnet 和 FTP)传输 用户名和密码,不要加密身份验证会话,并应尽可能避免。
- 通过网络 Unencrypted 传输敏感数据 - 很多协议通过网络未加密的传输数据。这些协议包括 Telnet、FTP、HTTP 和 SMTP。许多网络文件系统(如 NFS 和 SMB )也通过网络未加密的传输信息。在使用这些协议来限制传输的数据类型时,用户的职责。
- auth
- nfs-server
- SMB 和 nbm (Samba)
- yppasswdd
- ypserv
- ypxfrd
4.3.4. 保护 rpcbind
4.3.4.1. 使用 TCP wrapper 保护 rpcbind
4.3.4.2. 使用 firewalld 保护 rpcbind
firewalld
规则添加到服务器,并限制对特定网络的访问。
firewalld
丰富的语言命令示例。第一个允许从 192.168.0.0/24 网络到端口 111 (由 rpcbind 服务使用)的 TCP 连接。第二个允许从 localhost 到同一端口的 TCP 连接。 所有其他数据包都将被丢弃。
~]# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop' ~]# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'
~]# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="udp" source address="192.168.0.0/24" invert="True" drop'
4.3.5. 保护 rpc.mountd
4.3.5.1. 使用 TCP Wrappers 保护 rpc.mountd
IP
地址。避免使用主机名,因为它们可以通过 DNS
poisoning 和其他方法进行伪造。
4.3.5.2. 使用 firewalld 保护 rpc.mountd
firewalld
丰富的语言规则并限制对特定网络的访问。
firewalld
丰富的语言命令示例。第一个允许从 192.168.0.0/24
网络挂载连接。第二个 允许
从本地主机挂载连接。所有其他数据包都将被丢弃。
~]# firewall-cmd --add-rich-rule 'rule family="ipv4" source NOT address="192.168.0.0/24" service name="mountd" drop' ~]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="127.0.0.1" service name="mountd" accept'
4.3.6. 保护 NIS
- /usr/sbin/rpc.yppasswdd - 也称为 yppasswdd 服务,此守护进程允许用户更改其 NIS 密码。
- /usr/sbin/rpc.ypxfrd - 还称 ypxfrd 服务,此守护进程负责 NIS 通过网络传输。
- /usr/sbin/ypserv - 这是 NIS 服务器守护进程。
4.3.6.1. 仔细规划网络
4.3.6.2. 使用类似密码的 NIS 域名和主机名
ypcat-d
<NIS_domain>-h
<DNS_hostname>passwd
ypcat-d
<NIS_domain>-h
<DNS_hostname>shadow
o7hfawtgmhwg.domain.com
。同样,创建不同的 随机 NIS 域名。这使得攻击者更难以访问 NIS 服务器。
4.3.6.3. 编辑 /var/yp/securenets
文件
/var/yp/securenets
文件为空或不存在(如默认安装后的情况),NIS 侦听所有网络。首先要做的事情之一是将子网掩码/网络对放在文件中,以便 ypserv 仅响应来自适当网络的请求。
/var/yp/securenets
文件中的示例条目:
255.255.255.0 192.168.0.0
/var/yp/securenets
文件的情况下,不要在第一次启动 NIS 服务器。
4.3.6.4. 分配静态端口和使用 Rich Language 规则
/etc/sysconfig/network
中添加以下行:
YPSERV_ARGS="-p 834" YPXFRD_ARGS="-p 835"
firewalld
规则可用于强制服务器侦听这些端口的网络:
~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" invert="True" port port="834-835" protocol="tcp" drop' ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" invert="True" port port="834-835" protocol="udp" drop'
192.168.0.0/24
网络,服务器仅允许连接到端口 834 和 835。第一个规则用于 TCP
,第二个规则用于 UDP
。
4.3.6.5. 使用 Kerberos 身份验证
/etc/shadow
映射中的密码哈希。如果入侵者获得了对 NIS 域的访问并嗅探网络流量,他们可以收集用户名和密码哈希。如果有足够的时间,攻击者可能会猜测弱密码,攻击者可以获得对网络上有效帐户的访问权限。
4.3.7. 保护 NFS
RPCSEC_GSS
内核模块的一部分,NFS 的所有版本都支持 Kerberos 用户和组身份验证。仍然包含 rpcbind 的信息,因为 Red Hat Enterprise Linux 7 支持使用 rpcbind 的 NFSv3。
4.3.7.1. 仔细规划网络
4.3.7.2. 保护 NFS 挂载选项
/etc/fstab
文件中介绍了使用 mount 命令,请参见 Red Hat Enterprise Linux 7 存储管理指南 中的" 使用 mount 命令 "章节。从安全管理的角度来看,值得注意,也可以在 /etc/nfsmount.conf
中指定 NFS 挂载选项,可用于设置自定义默认选项。
4.3.7.2.1. 查看 NFS 服务器
exports (5)
手册页中有关子树检查的部分)。
ro
选项将文件系统导出为只读文件系统,以减少用户可以写入挂载的文件系统的用户数量。仅在需要时使用 rw
选项。详情请查看 man exports (5)
页面。例如,允许写入访问会增加符号链接攻击的风险。这包括临时目录,如 /tmp
和 /usr/tmp
。
rw
选项挂载目录的位置,避免尽可能使目录全局可写,以降低风险。导出主目录也被视为风险,因为有些应用以明文或弱方式加密存储密码。随着应用程序代码被检查并改进,这个风险会降低。有些用户没有在 SSH 密钥上设置密码,因此这也意味着主目录会带来风险。强制使用密码或使用 Kerberos 可降低该风险。
secure
选项是用于将导出限制到 “保留端口” 的服务器端导出选项。默认情况下,服务器仅允许来自 “保留端口” 的客户端通信(编号小于 1024 的端口),因为传统客户端只有允许的 “可信” 代码(如内核 NFS 客户端)使用这些端口。但是,在很多网络上,任何人无法在某些客户端上成为 root 用户,因此,对于服务器来说,假设来自保留端口的通信都具有特权非常安全。因此,对保留端口的限制具有有限的值;最好根据 Kerberos、防火墙和对特定客户端的导出限制来决定。
4.3.7.2.2. 查看 NFS 客户端
nosuid
选项禁止使用 setuid 程序。nosuid
选项禁用 set-user-identifier
或 set-group-identifier
位。这可防止远程用户通过运行 setuid 程序获得更高的特权。在客户端和服务器端使用这个选项。
noexec
选项禁用客户端上的所有可执行文件。使用此选项来防止用户意外执行放在被共享的文件系统中的文件。nosuid
和 noexec
选项对于大多数都不是所有文件系统的标准选项。
nodev
选项防止 “device-files” 被客户端作为硬件设备处理。
resvport
选项是一个客户端挂载选项,而 secure
是对应的服务器端导出选项(请参阅上述说明)。它限制了与"保留端口"的通信。保留或"well known"端口为特权用户和进程保留,如 root 用户。设置此选项可让客户端使用保留源端口与服务器通信。
sec=krb5
。
krb5i
的 Kerberos 挂载,使用 krb5p
进行隐私保护。使用 sec=krb5
挂载时会使用它们,但需要在 NFS 服务器上进行配置。如需更多信息,请参阅 exports (man 5 导出
)的 man page。
man 5 nfs
)有一个 “SECURITY CONSIDERATIONS” 部分,它解释了 NFSv4 中的安全增强,并包含所有 NFS 特定的挂载选项。
4.3.7.3. 语法错误
/etc/exports
文件来确定要导出哪些主机以及要将这些目录导出到哪个文件系统。在编辑此文件时,请小心不要添加额外的空格。
/etc/exports
文件中的以下行将目录 /tmp/nfs/ 共享到主机 bob.example.com,其读/写权限。
/tmp/nfs/ bob.example.com(rw)
/etc/exports
文件中的以下行与主机 bob.example.com
共享同一目录,并具有只读权限,因为主机名后面有一个空格字符来与 全局 共享。
/tmp/nfs/ bob.example.com (rw)
showmount -e
<hostname>
4.3.7.4. 不要使用 no_root_squash 选项
4.3.7.5. NFS 防火墙配置
为 NFSv3 配置端口
rpcbind
服务动态分配,这可能会在创建防火墙规则时造成问题。要简化这个过程,请使用 /etc/sysconfig/nfs
文件指定要使用的端口:
MOUNTD_PORT
- mountd 的 TCP 和 UDP 端口(rpc.mountd)STATD_PORT
- status (rpc.statd)的 TCP 和 UDP 端口
/etc/modprobe.d/lockd.conf
文件中为 NFS 锁定管理器(nlockmgr)设置 TCP 和 UDP 端口:
nlm_tcpport
- nlockmgr (rpc.lockd)的 TCP 端口nlm_udpport
- UDP 端口 nlockmgr (rpc.lockd)
/etc/modprobe.d/lockd.conf
。
4.3.7.6. 使用红帽身份管理保护 NFS
4.3.8. 保护 HTTP 服务器
4.3.8.1. 保护 Apache HTTP 服务器
chown root
<directory_name>
chmod 755
<directory_name>
/etc/httpd/conf/httpd.conf
中配置)时,系统管理员应小心:
FollowSymLinks
- 默认情况下,这个指令是启用的,因此请务必在创建 Web 服务器文档根的符号链接时小心。例如,最好提供指向
/
的符号链接。 索引
- 这个指令默认为启用,但可能不需要。要防止 visitors 浏览服务器上的文件,请删除此指令。
UserDir
- 默认情况下,
UserDir
指令被禁用,因为它可以确认系统中存在用户帐户。要在服务器上启用用户目录浏览,请使用以下指令:UserDir enabled UserDir disabled root
这些指令激活用户目录浏览/root/
以外的所有用户目录。要将用户添加到禁用帐户列表中,请在UserDir disabled
行中添加以空格分隔的用户列表。 ServerTokens
ServerTokens
指令控制发送到客户端的服务器响应标头字段。它包括可使用以下参数自定义的各种信息:ServerTokens Full
(默认选项)- 提供所有可用信息(OS 类型和使用的模块),例如:Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
ServerTokens Prod
或ServerTokens ProductOnly
- 提供以下信息:Apache
ServerTokens Major
- 提供以下信息:Apache/2
ServerTokens Minor
- 提供以下信息:Apache/2.0
ServerTokens Min
或ServerTokens Minimal
- 提供以下信息:Apache/2.0.41
ServerTokens OS
- 提供以下信息:Apache/2.0.41 (Unix)
建议使用ServerTokens Prod
选项,以便可能的攻击者不会获取您系统的任何宝贵信息。
IncludesNoExec
指令。默认情况下,Server-Side Includes (SSI)模块无法执行命令。建议您不要更改此设置,除非绝对必要,因为它可能会使攻击者在系统中执行命令。
删除 httpd 模块
httpd
模块来限制 HTTP 服务器的功能是很有帮助的。为此,请编辑 /etc/httpd/conf.modules.d
目录中的配置文件。例如,要删除代理模块:
echo '# All proxy modules disabled' > /etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.d/
目录还包含用于加载模块的配置文件。
httpd 和 SELinux
4.3.8.2. 保护 NGINX
server
部分中执行以下所有配置更改。
禁用版本字符串
server_tokens off;
nginx
的影响:
$ curl -sI http://localhost | grep Server Server: nginx
包括其他与安全相关的标头
add_header X-Frame-Options SAMEORIGIN;
- 此选项拒绝域之外的任何页面来帧由 NGINX 提供的任何内容,从而有效地缓解了攻击。add_header X-Content-Type-Options nosniff;
- 这个选项在某些较旧的浏览器中防止 MIME 类型嗅探。add_header X-XSS-Protection "1; mode=block";
- 这个选项启用跨站点脚本过滤(XSS)过滤,这可以防止浏览器渲染由 NGINX 响应中包含的潜在的恶意内容。
禁用 Potentially Harmful HTTP 方法
# Allow GET, PUT, POST; return "405 Method Not Allowed" for all others. if ( $request_method !~ ^(GET|PUT|POST)$ ) { return 405; }
配置 SSL
4.3.9. 保护 FTP
- 红帽内容加速器 (tux)- 具有 FTP 功能的内核空间 Web 服务器。
- vsftpd - FTP 服务的独立、面向安全的实现。
4.3.9.1. FTP Greeting Banner
/etc/vsftpd/vsftpd.conf
文件中添加以下指令:
ftpd_banner=<insert_greeting_here>
/etc/banners/
的新目录中。本例中 FTP 连接的横幅文件是 /etc/banners/ftp.msg
。以下是此类文件的一个示例:
######### Hello, all activity on ftp.example.com is logged. #########
/etc/vsftpd/vsftpd.conf
文件中添加以下指令:
banner_file=/etc/banners/ftp.msg
4.3.9.2. Anonymous Access(匿名访问)
/var/ftp/
目录可激活匿名帐户。
vsftpd
软件包。这个软件包为匿名用户建立目录树,并为匿名用户将目录的权限配置为只读。
4.3.9.2.1. 匿名上传
/var/ftp/pub/
中创建只写目录。要做到这一点,请以 root 用户身份输入以下命令:
~]# mkdir /var/ftp/pub/upload
~]# chmod 730 /var/ftp/pub/upload
~]# ls -ld /var/ftp/pub/upload
drwx-wx---. 2 root ftp 4096 Nov 14 22:57 /var/ftp/pub/upload
/etc/vsftpd/vsftpd.conf
文件中添加以下行:
anon_upload_enable=YES
4.3.9.3. 用户帐户
/etc/vsftpd/vsftpd.conf
中添加以下指令:
local_enable=NO
4.3.9.3.1. 限制用户帐户
/etc/pam.d/vsftpd
。
/etc/vsftpd/ftpusers
4.3.9.4. 使用 TCP wrapper 控制访问
4.3.10. 保护 Postfix
4.3.10.1. 限制服务攻击
/etc/postfix/main.cf
文件中的指令限制来限制此类攻击的有效性。您可以更改已有指令的值,或者您可以使用以下格式所需的值添加所需指令:
<directive> = <value>.以下是可用于限制拒绝服务攻击的指令列表:
- smtpd_client_connection_rate_limit - 允许每个时间单位对这个服务进行的最大连接尝试次数(如下所述)。默认值为 0,这意味着客户端每次时间单位可以接收 Postfix 可以接受的连接数。默认情况下,可信网络中的客户端会被排除。
- anvil_rate_time_unit - 此时间单位用于速率限制计算。默认值为 60 秒。
- smtpd_client_event_limit_exceptions - 从连接和速率限制命令中排除的客户端。默认情况下,可信网络中的客户端会被排除。
- smtpd_client_message_rate_limit - 允许客户端按时间单位请求的最大消息数(无论 Postfix 是否实际接受这些消息)。
- default_process_limit - 提供给定服务的 Postfix 子进程的默认最大数量。对于
master.cf
文件中的特定服务,可以禁止这个限制。默认值为 100。 - queue_minfree - 接收邮件所需的队列文件系统中的最小可用空间量(以字节为单位)。Postfix SMTP 服务器目前使用此选项来确定它将接受任何邮件。默认情况下,当可用空间量小于 message_size_limit 的 1.5 倍时,Postfix SMTP 服务器会拒绝 MAIL FROM 命令。要指定较高的最小可用空间限制,请指定 message_size_limit 至少 1.5 倍的 queue_minfree 值。默认情况下,queue_minfree 值为 0。
- header_size_limit - 存储消息标头的最大内存量(以字节为单位)。如果标头更大,则丢弃过量。默认值为 102400。
- message_size_limit - 消息的最大大小(以字节为单位),包括信封信息。默认值为 10240000。
4.3.10.2. NFS 和 Postfix
/var/spool/postfix/
放置到 NFS 共享卷上。由于 NFSv2 和 NFSv3 不维护对用户和组 ID 的控制,因此两个或多个用户可以具有相同的 UID,并且接收和读取彼此的邮件。
SECRPC_GSS
内核模块不使用基于 UID 的身份验证。但是,最好不要将邮件假脱机 目录放在 NFS 共享卷上。
4.3.10.3. 仅邮件用户
/etc/passwd
文件中的所有用户 shell 都应设置为 /sbin/nologin (root 用户可能例外)。
4.3.10.4. 禁用 Postfix 网络列表
/etc/postfix/main.cf
来验证这一点。
/etc/postfix/main.cf
,以确保仅显示以下 inet_interfaces
行:
inet_interfaces = localhost
inet_interfaces = all
设置。
4.3.10.5. 将 Postfix 配置为使用 SASL
SASL
实现进行 SMTP 身份验证 (或 SMTP AUTH)。SMTP 身份验证是 简单邮件传输协议的扩展
。启用后,需要 SMTP
客户端使用服务器和客户端都支持并接受的身份验证方法向 SMTP
服务器进行身份验证。这部分论述了如何配置 Postfix 以使用 Dovecot SASL
实现。
POP
/IMAP
服务器,因此在您的系统中提供 Dovecot SASL
实现,以 root
用户身份运行以下命令:
~]# yum install dovecot
SMTP
服务器可以使用 UNIX-domain 套接字或 TCP 套接字 与 Dovecot SASL
实现通信。只有 Postfix 和 Dovecot 应用程序运行在单独的计算机上时,才需要后一种方法。本指南优先选择 UNIX 域套接字方法,其负担更好隐私。
SASL
实现,需要为这两个应用程序执行多个配置更改。按照以下步骤使这些更改生效。
设置 Dovecot
- 修改主 Dovecot 配置文件
/etc/dovecot/conf.d/10-master.conf
,使其包含以下行(已包含大多数相关部分,且只需要取消注释的行):service auth { unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix } }
上面的示例假定使用 UNIX-domain socket 进行 Postfix 和 Dovecot 之间的通信。它还假定 PostfixSMTP
服务器的默认设置,其中包括位于/var/spool/postfix/
目录中的邮件队列,以及在postfix
用户和组下运行的应用程序。这样,读取和写入权限仅限于postfix
用户和组。或者,您可以使用以下配置设置 Dovecot 以通过TCP
侦听 Postfix 验证请求:service auth { inet_listener { port = 12345 } }
在上例中,将12345
替换为您要使用的端口数。 - 编辑
/etc/dovecot/conf.d/10-auth.conf
配置文件,以指示 Dovecot 为 PostfixSMTP
服务器提供普通
和登录
身份验证机制:auth_mechanisms = plain login
设置 Postfix
/etc/postfix/main.cf
。添加或编辑以下配置指令:
- 在 Postfix SMTP 服务器中启用
SMTP
身份验证:smtpd_sasl_auth_enable = yes
- 指示 Postfix 将 Dovecot
SASL
实现用于 SMTP 身份验证:smtpd_sasl_type = dovecot
- 提供相对于 Postfix 队列目录的身份验证路径(请注意,无论 Postfix 服务器是否在 chroot 中运行,使用相对路径可确保配置可以正常工作):
smtpd_sasl_path = private/auth
此步骤假设您要使用 UNIX-domain socket 进行 Postfix 和 Dovecot 之间的通信。如果您使用TCP
套接字进行通信,要将 Postfix 配置为在不同机器上查找 Dovecot,请使用类似如下的配置值:smtpd_sasl_path = inet:127.0.0.1:12345
在上例中,127.0.0.1
需要替换为 Dovecot 机器的IP
地址,并使用 Dovecot 的/etc/dovecot/conf.d/10-master.conf
配置文件中指定的端口替换12345
。 - 指定 Postfix
SMTP
服务器为客户端提供的SASL
机制。请注意,可以为加密和未加密的会话指定不同的机制。smtpd_sasl_security_options = noanonymous, noplaintext smtpd_sasl_tls_security_options = noanonymous
上面的例子指定,在未加密的会话中,不允许匿名身份验证,且不会允许传输未加密的用户名或密码的机制。对于加密的会话(使用TLS
),只允许非匿名身份验证机制。有关限制允许SASL
机制的所有支持策略列表,请参阅 http://www.postfix.org/SASL_README.html#smtpd_sasl_security_options。
其它资源
SASL
配置 Postfix SMTP 身份验证的附加信息。
- http://wiki2.dovecot.org/HowTo/PostfixAndDovecotSASL - 包含有关如何设置 Postfix 以对 SMTP 身份验证使用 Dovecot
SASL
实现的信息。 - http://www.postfix.org/SASL_README.html#server_sasl - 包含有关如何将 Postfix 设置为对 SMTP 身份验证使用 Dovecot 或 Cyrus
SASL
实现的信息。
4.3.11. 保护 SSH
SSH
的传输会被加密和保护。有关 SSH
协议的常规信息以及 Red Hat Enterprise Linux 7 中的 SSH
服务的信息,请参阅 Red Hat Enterprise Linux 7 指南中的 OpenSSH 章节。
SSH
设置的最常见方法。否 意味着这个建议测量列表被视为详细或确定。有关修改 sshd
守护进程行为和 ssh (1) 的所有配置指令的说明,请参阅 sshd_config (5)。
4.3.11.1. 加密登录
SSH
支持使用加密密钥登录到计算机。这比仅使用密码更安全。如果您将此方法与其他身份验证方法相结合,则它被视为多因素身份验证。有关使用多个验证方法的详情,请参考 第 4.3.11.2 节 “多个身份验证方法”。
/etc/ssh/sshd_config
文件中的 PubkeyAuthentication
配置指令设置为 yes
。请注意,这是默认设置。将 PasswordAuthentication
指令设置为 no
,以禁用可能使用密码登录。
SSH
密钥。如果在没有附加参数的情况下调用,它会创建一个 2048 位 RSA 密钥集。默认情况下,密钥存储在 ~/.ssh/
目录中。您可以使用 -b
参数修改密钥的位级。使用 2048 位密钥通常就足够了。Red Hat Enterprise Linux 7 系统管理员指南中的 配置 OpenSSH 章节包含有关生成密钥对的详细信息。
~/.ssh/
目录中看到两个密钥。如果您在运行 ssh-keygen 命令时接受了默认值,则生成的文件分别命名为 id_rsa
和 id_rsa.pub
,并分别包含私钥和公钥。您应该始终通过使私钥对除文件所有者以外的任何人都不可读来保护私钥。但是,公钥需要传送到您要登录的系统。您可以使用 ssh-copy-id 命令将密钥传送到服务器:
~]$ ssh-copy-id -i [user@]server
~/.ssh/authorized_keys
文件中。当您尝试登录到服务器时,sshd
守护进程将检查此文件。
SSH
密钥。完成后,请确保从 authorized_keys
文件中删除任何未使用的密钥。
4.3.11.2. 多个身份验证方法
/etc/ssh/sshd_config
文件中的 AuthenticationMethods
配置指令来指定要使用哪些身份验证方法。请注意,可以使用这个指令定义多个所需的身份验证方法列表。如果是这种情况,用户必须至少以其中一个列表完成每个方法。列表需要用空白空格分开,列表中的独立 authentication-method 名称必须用逗号分开。例如:
AuthenticationMethods publickey,gssapi-with-mic publickey,keyboard-interactive
AuthenticationMethods
指令配置的 sshd
守护进程仅在尝试成功完成 公钥身份验证
时授予访问权限,后跟 gssapi-with-mic
或 键盘交互
身份验证。请注意,每个请求的身份验证方法都需要使用 /etc/ssh/sshd_config
文件中对应的配置指令(如 PubkeyAuthentication
)显式启用。有关可用身份验证方法的常规列表,请参阅 ssh (1) 的 AUTHENTICATION 部分。
4.3.11.3. 保护 SSH 的其他方法
协议版本
SSH
协议的实现仍然支持 SSH 客户端的 SSH-1 和 SSH-2 版本,但尽可能使用后者。SSH-2 版本包含有关较旧的 SSH-1 的改进,大多数高级配置选项仅在使用 SSH-2 时可用。
SSH
协议可保护使用它的身份验证和通信的扩展。可使用 /etc/ssh/ sshd
_config
文件中的 Protocol
配置指令来指定 sshd 守护进程支持的协议版本或版本。默认设置为 2
。请注意,SSH-2 版本是 Red Hat Enterprise Linux 7 SSH 服务器唯一支持的版本。
密钥类型
-t
选项,也可以指示生成 DSA 或 ECDSA 密钥。ECDSA (Elliptic Curve Digital Signature Algorithm)以相同的对称密钥长度提供更好的性能。它还会生成较短的密钥。
非默认端口
sshd
守护进程侦听 TCP 端口 22
。更改端口可降低系统因自动网络扫描而受到攻击的风险,从而通过模糊的方式提高安全性。可使用 /etc/ssh/sshd_config
配置文件中的 Port
指令来指定端口。另请注意,默认 SELinux 策略必须更改为允许使用非默认端口。您可以以 root
用户身份输入以下命令来修改 ssh_port_t
SELinux 类型来完成此操作:
~]# semanage -a -t ssh_port_t -p tcp port_number
Port
指令指定的新端口号。
没有根登录
root
用户身份登录,您应该考虑在 /etc/ssh/sshd_config
文件中将 PermitRootLogin
配置指令设置为 no
。通过禁止以 root
用户身份登录,管理员可以审核哪些用户在以普通用户身份登录后运行了哪些特权命令,然后获得 root
权限。
使用 X 安全扩展
/etc/ssh/ssh_config
文件中的 ForwardX11Trusted
选项被设置为 yes
,ssh -X remote_machine (不受信任的主机)和 ssh -Y remote_machine (可信主机)命令之间没有区别。
4.3.12. 保护 PostgreSQL
postgresql-server
软件包提供 PostgreSQL。如果没有安装,请以 root 用户身份输入以下命令来安装它:
~]# yum install postgresql-server
-D
选项表示。例如:
~]$ initdb -D /home/postgresql/db1
~]$ cat pg_hba.conf
# PostgreSQL Client Authentication Configuration File
# This file controls: which hosts are allowed to connect, how clients
# are authenticated, which PostgreSQL user names they can use, which
# databases they can access. Records take one of these forms:
#
# local DATABASE USER METHOD [OPTIONS]
# host DATABASE USER ADDRESS METHOD [OPTIONS]
# hostssl DATABASE USER ADDRESS METHOD [OPTIONS]
# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]
pg_hba.conf
文件中的以下行允许任何经过身份验证的用户使用其用户名访问任何数据库:
local all all trust
pg_hba.conf
文件中删除这一行。
4.3.13. 保护 Docker
4.3.14. 针对 DDoS Attacks 保护 memcached
Memcached 漏洞
强化 memcached
- 在 LAN 中配置防火墙。如果您的 memcached 服务器应该只可从本地网络访问,请不要允许 memcached 使用的端口的外部流量。例如,从允许的端口列表中删除默认情况下 memcached 使用的端口 11211:
~]# firewall-cmd --remove-port=11211/udp ~]# firewall-cmd --runtime-to-permanent
有关允许特定 IP 范围使用端口 11211 的firewalld
命令,请参阅 第 5.8 节 “使用区域管理流量取决于源”。 - 通过将
-U 0 -p 11211
值添加到/etc/sysconfig/memcached
文件中的OPTIONS
变量来禁用 UDP,除非您的客户端确实需要这个协议:OPTIONS="-U 0 -p 11211"
- 如果您在与应用程序相同的机器上只使用单个 memcached 服务器,请设置 memcached 以仅侦听 localhost 流量。将
-l 127.0.0.1,::1
值添加到/etc/sysconfig/memcached
中的OPTIONS
:OPTIONS="-l 127.0.0.1,::1"
- 如果可能更改身份验证,请启用 SASL (简单身份验证和安全层)身份验证:
- 在
/etc/sasl2/memcached.conf
文件中修改或添加:sasldb_path: /path.to/memcached.sasldb
- 在 SASL 数据库中添加帐户:
~]# saslpasswd2 -a memcached -c cacheuser -f /path.to/memcached.sasldb
- 确保 memcached 用户和组可以访问数据库。
~]# chown memcached:memcached /path.to/memcached.sasldb
- 通过将
-S
值添加到/etc/sysconfig/memcached
,在 memcached 中启用 SASL 支持:OPTIONS="-S"
- 重启 memcached 服务器以应用更改。
- 将 SASL 数据库中创建的用户名和密码添加到应用程序的 memcached 客户端配置中。
- 使用 stunnel 加密 memcached 客户端和服务器之间的通信。由于 memcached 不支持 TLS,因此临时解决方案是使用代理,如 stunnel,它在 memcached 协议之上提供 TLS。您可以将 stunnel 配置为使用 PSK (Pre Shared Keys),甚至最好使用用户证书。在使用证书时,只有经过身份验证的用户可以访问您的 memcached 服务器,且您的流量会被加密。重要如果您使用隧道访问 memcached,请确保该服务只侦听 localhost 或防火墙会阻止网络访问 memcached 端口。请参阅 第 4.8 节 “使用 stunnel” 了解更多信息。
4.4. 保护网络访问
4.4.1. 使用 TCP wrapper 和 xinetd 保护服务
4.4.1.1. TCP 包装器和连接标语
横幅
选项。
/etc/banners/vsftpd
,包含以下行:
220-Hello, %c 220-All activity on ftp.example.com is logged. 220-Inappropriate use will result in your access privileges being removed.
/etc/hosts.allow
文件中添加以下行:
vsftpd : ALL : banners /etc/banners/
4.4.1.2. TCP 封装器和攻击警告
/etc/hosts.deny
文件中,以拒绝来自该网络的任何连接尝试,并将尝试记录到特殊文件:
ALL : 206.182.68.0 : spawn /bin/echo `date` %c %d >> /var/log/intruder_alert
/etc/hosts.allow
文件中。
4.4.1.3. TCP wrapper 和 Enhanced Logging
/etc/hosts.deny
中添加以下行:
in.telnetd : ALL : severity emerg
4.4.2. 验证正在列出哪些端口
使用 netstat 进行开放端口扫描
root
用户身份输入以下命令,以确定哪些端口正在侦听来自网络的连接:
~]# netstat -pan -A inet,inet6 | grep -v ESTABLISHED
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 192.168.124.1:53 0.0.0.0:* LISTEN 1829/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1176/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1177/cupsd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 ::1:25 :::* LISTEN 1664/master
sctp 0.0.0.0:2500 LISTEN 20985/sctp_darn
udp 0 0 192.168.124.1:53 0.0.0.0:* 1829/dnsmasq
udp 0 0 0.0.0.0:67 0.0.0.0:* 977/dhclient
...
-l
选项仅显示侦听的服务器套接字:
~]# netstat -tlnw
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 192.168.124.1:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::111 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
raw6 0 0 :::58 :::* 7
使用 ss 进行开放端口扫描
~]# ss -tlw
etid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 :::ipv6-icmp :::*
tcp LISTEN 0 128 *:sunrpc *:*
tcp LISTEN 0 5 192.168.124.1:domain *:*
tcp LISTEN 0 128 *:ssh *:*
tcp LISTEN 0 128 127.0.0.1:ipp *:*
tcp LISTEN 0 100 127.0.0.1:smtp *:*
tcp LISTEN 0 128 :::sunrpc :::*
tcp LISTEN 0 128 :::ssh :::*
tcp LISTEN 0 128 ::1:ipp :::*
tcp LISTEN 0 100 ::1:smtp :::*
~]# ss -plno -A tcp,udp,sctp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 192.168.124.1:53 *:* users:(("dnsmasq",pid=1829,fd=5))
udp UNCONN 0 0 *%virbr0:67 *:* users:(("dnsmasq",pid=1829,fd=3))
udp UNCONN 0 0 *:68 *:* users:(("dhclient",pid=977,fd=6))
...
tcp LISTEN 0 5 192.168.124.1:53 *:* users:(("dnsmasq",pid=1829,fd=6))
tcp LISTEN 0 128 *:22 *:* users:(("sshd",pid=1176,fd=3))
tcp LISTEN 0 128 127.0.0.1:631 *:* users:(("cupsd",pid=1177,fd=12))
tcp LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=1664,fd=13))
...
sctp LISTEN 0 5 *:2500 *:* users:(("sctp_darn",pid=20985,fd=3))
UNCONN
状态显示 UDP 侦听模式的端口。
-6
选项扫描 IPv6 地址。
~]# nmap -sT -O 192.168.122.65
Starting Nmap 6.40 ( http://nmap.org ) at 2017-03-27 09:30 CEST
Nmap scan report for 192.168.122.65
Host is up (0.00032s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
111/tcp open rpcbind
Device type: general purpose
Running: Linux 3.X
OS CPE: cpe:/o:linux:linux_kernel:3
OS details: Linux 3.7 - 3.9
Network Distance: 0 hops
OS detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.79 seconds
(-sS)
不是选项时,TCP 连接扫描 (-sT)
是默认的 TCP 扫描类型。O
选项检测主机的操作系统。
使用 netstat 和 s 扫描 Open SCTP 端口
root
用户身份输入以下命令:
~]# netstat -plnS
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
sctp 127.0.0.1:250 LISTEN 4125/sctp_darn
sctp 0 0 127.0.0.1:260 127.0.0.1:250 CLOSE 4250/sctp_darn
sctp 0 0 127.0.0.1:250 127.0.0.1:260 LISTEN 4125/sctp_darn
~]# netstat -nl -A inet,inet6 | grep 2500
sctp 0.0.0.0:2500 LISTEN
~]# ss -an | grep 2500
sctp LISTEN 0 5 *:2500 *:*
4.4.3. 禁用源路由
accept_source_route
选项使网络接口接受设置了 Strict Source Routing (SSR)或 Loose Source Routing (LSR)选项的数据包。接收源路由数据包由 sysctl 设置控制。以 root 用户身份发出以下命令来丢弃设置了 SSR 或 LSR 选项的数据包:
~]# /sbin/sysctl -w net.ipv4.conf.all.accept_source_route=0
~]# /sbin/sysctl -w net.ipv4.conf.all.forwarding=0
~]# /sbin/sysctl -w net.ipv6.conf.all.forwarding=0
~]# /sbin/sysctl -w net.ipv4.conf.all.mc_forwarding=0
~]# /sbin/sysctl -w net.ipv6.conf.all.mc_forwarding=0
~]# /sbin/sysctl -w net.ipv4.conf.all.accept_redirects=0
~]# /sbin/sysctl -w net.ipv6.conf.all.accept_redirects=0
~]# /sbin/sysctl -w net.ipv4.conf.all.secure_redirects=0
~]# /sbin/sysctl -w net.ipv4.conf.all.send_redirects=0
0
值。要在添加新接口时自动禁用 ICMP 请求发送,请输入以下命令:
~]# /sbin/sysctl -w net.ipv4.conf.default.send_redirects=0
/etc/sysctl.conf
文件。例如,要禁用接受所有接口上所有 IPv4 ICMP 重定向数据包,请使用以 root
用户身份运行的编辑器打开 /etc/sysctl.conf
文件并添加以下行: net.ipv4.conf.all.send_redirects=0
sysctl (8)
。有关基于源的路由及其变体的相关互联网选项的说明,请参阅 RFC791。
4.4.3.1. 反向路径转发
IP
地址,并减少了 DDoS 攻击的机会。
-
rp_filter
- 通过
rp_filter
指令启用反向路径转发。sysctl 工具可用于更改正在运行的系统,并通过向/etc/sysctl.conf
文件中添加行来进行永久更改。rp_filter
选项用于指示内核从三种模式之一中进行选择。要进行临时的全局更改,请以root
用户身份输入以下命令:sysctl -w net.ipv4.conf.default.rp_filter=integer sysctl -w net.ipv4.conf.all.rp_filter=integer
其中 integer 是以下之一:0
- 没有源验证。1
- RFC 3704 中定义的严格模式。2
- RFC 3704 中定义的松散模式。
可使用 net.ipv4.conf.接口.rp_filter 命令覆盖每个网络接口的设置,如下所示:sysctl -w net.ipv4.conf.interface.rp_filter=integer
注意要使这些设置在重启后持久保留,请修改/etc/sysctl.conf
文件。例如,要更改所有接口的模式,请使用以root
用户身份运行的编辑器打开/etc/sysctl.conf
文件,并添加以下行:net.ipv4.conf.all.rp_filter=2
-
IPv6_rpfilter
- 如果
IPv6
协议,firewalld 守护进程默认适用于 Reverse 路径转发。可以在/etc/firewalld/firewalld.conf
文件中检查设置。您可以通过设置IPv6_rpfilter
选项来更改 firewalld 行为。如果您需要反向路径转发的自定义配置,您可以使用 ip6tables 命令 在不 firewalld 守护进程的情况下执行它:ip6tables -t raw -I PREROUTING -m rpfilter --invert -j DROP
此规则应插入原始/PREROUTING 链的开头,以便它应用到所有流量,特别是在有状态匹配规则之前。有关 iptables 和 ip6tables 服务的详情请参考 第 5.13 节 “使用iptables
设置和控制 IP 集”。
启用数据包转发
root
身份登录,并将 /etc/sysctl.conf
文件中显示为 net.ipv4.ip_forward = 0
的行改为以下内容:
net.ipv4.ip_forward = 1
/etc/sysctl.conf
文件中的更改,请输入以下命令:
/sbin/sysctl -p
root
身份运行以下命令:
/sbin/sysctl net.ipv4.ip_forward
1
,则启用 IP 转发。如果返回 0,您可以使用以下命令手动打开:
/sbin/sysctl -w net.ipv4.ip_forward=1
4.4.3.2. 其它资源
- 安装的文档
/usr/share/doc/kernel-doc-version/Documentation/networking/ip-sysctl.txt
- 此文件包含目录中可用文件和选项的完整列表。第一次访问内核文档前,以root
用户身份输入以下命令:~]# yum install kernel-doc
- 在线文档有关 Multihomed Networks 的 Ingress Filtering 的说明,请参阅 RFC 3704。
4.5. 使用 DNSSEC 保护 DNS 流量
4.5.1. DNSSEC 简介
DNS
客户端验证并检查来自 DNS
名称服务器的响应的完整性,以验证其原始卷,并确定它们是否在传输中被篡改。
4.5.2. 了解 DNSSEC
HTTPS
安全地连接。但是,在连接到 HTTPS
webserver 之前,必须执行 DNS
查找,除非您直接输入 IP 地址。这些 DNS
查找是不安全的完成的 ,受因为缺少身份验证的中间人攻击。换句话说,DNS
客户端不能确信来自给定 DNS
名称服务器的回复是真实的,且未被篡改。更重要的是,递归名称服务器无法确定它从其他名称服务器获得的记录是个例。DNS
协议没有为客户端提供了一种机制来确保它不受中间人攻击。引入 DNSSEC 以解决使用 DNS
解析域名时缺少身份验证和完整性检查。它没有解决保密性的问题。
DNS
资源记录,以及以这样一种方式分发公钥,从而使 DNS
解析器能够构建分层信任链。所有 DNS
资源记录的数字签名都会生成并添加到区域,作为数字签名资源记录(RRSIG)。区域的公钥被添加为 DNSKEY 资源记录。要构建分层链,DNSKEY 的哈希值在父区域中发布,以 委派签名 (DS)资源记录。为便于验证非一致性,则使用 NextSECure (NSEC)和 NSEC3 资源记录。在 DNSSEC 签名区域中,每个资源记录集 (RRset)都有对应的 RRSIG 资源记录。请注意,用于委托到子区域(NS 和 glue 记录)的记录没有签名;这些记录会出现在子区域中,并在那里签名。
.com
的 DS 记录。root 区域还为 .com
名称服务器提供 NS 和 glue 记录。解析器遵循此委托并查询 .com
的 DNSKEY 记录,使用这些委派的名称服务器。获得的 DNSKEY 记录的哈希值应与 root 区域中的 DS 记录匹配。如果是,解析器将信任 .com
获取的 DNSKEY。在 .com
区域中,RSIG 记录由 .com
DNSKEY 创建。对于 .com
中的委派,此过程的重复重复,如 redhat.com
。使用此方法时,只需要配置一个 root 密钥来验证 DNS
解析器只需要配置一个 root 密钥,同时它在正常操作期间从全球收集多个 DNSKEY。如果加密检查失败,解析器会将 SERVFAIL 返回到应用程序。
DNS
回答,仍会向应用程序返回 SERVFAIL 错误。DNSSEC 保护 DNS
服务器(权威和递归)之间数据的完整性,它不会在应用程序和解析器之间提供安全性。因此,务必要让应用程序为其解析器提供安全传输。完成的最简单方法是,在 localhost
上运行 DNSSEC 功能解析器,并在 /etc/resolv.conf
中使用 127.0.0.1
。或者可以使用到远程 DNS
服务器的 VPN 连接。
了解 Hotspot 问题
DNS
,以便将用户重定向到需要为其验证(或付费)进行 Wi-Fi 服务的页面。连接到 VPN 的用户通常需要使用 “内部” DNS
服务器来查找公司网络外不存在的资源。这要求软件进行额外的处理。例如,dnssec-trigger 可用于检测 Hotspot 是否劫持 DNS
查询,unbound
可以充当代理名称服务器来处理 DNSSEC 查询。
选择 DNSSEC Capable Recursive Resolver
unbound
。两者都默认启用 DNSSEC,并使用 DNSSEC root 密钥进行配置。要在服务器上启用 DNSSEC,但其中一个操作都将在移动设备(如笔记本)上首选使用 unbound
,因为它允许本地用户使用 dnssec-trigger 时动态重新配置 Hotspots 所需的 DNSSEC 覆盖,在使用 Libreswan 时,对于 VPN。unbound
守护进程进一步支持部署在 etc/unbound8:0:1::.d/
目录中列出的 DNSSEC 异常,它们对服务器和移动设备都很有用。
4.5.3. 了解 Dnssec-trigger
/etc/resolv.conf
中安装和配置 unbound
后,所有来自应用程序的 DNS
查询都会被 unbound
处理。DNSSEC-trigger 仅在触发 unbound
解析器时重新配置 unbound 解析器。这主要适用于连接到不同 Wi-Fi 网络的 roaming 客户端机器,如笔记本电脑。此过程如下:
- 当通过
DHCP
获取新的DNS
服务器时,NetworkManager “会触发” dnssec-trigger。 - 然后 DNSSEC -trigger 对服务器执行多个测试,并确定它是否正确支持 DNSSEC。
- 如果存在,则 dnssec-trigger 会重新配置
unbound
,以使用该DNS
服务器作为所有查询的转发器。 - 如果测试失败,dnssec-trigger 将忽略新的
DNS
服务器,并尝试一些可用的回退方法。 - 如果它确定有无限端口 53 (
UDP
和TCP
)可用,它将告知unbound
成为完整的递归DNS
服务器,而无需使用任何转发器。 - 如果这不可能,例如,因为防火墙阻止了端口 53,除了到达网络的
DNS
服务器本身外,它将尝试使用DNS
到端口 80,或者TLS
封装DNS
到端口 443。在端口 80 和 443 上运行的服务器可以在/etc/dnssec-trigger/dnssec-trigger.conf
中配置。默认配置文件中应提供了注释的示例。
- 如果这些回退方法也失败,dnssec-trigger 将提供不安全的操作,这将会完全绕过 DNSSEC,“或者只在缓存中” 运行,它不会尝试新的
DNS
查询,但会回答它在缓存中已有的所有内容。
dnssec-trigger
守护进程每 10 秒继续探测 DNSSEC 解析器。有关使用 dnssec-trigger 图形化工具的详情,请查看 第 4.5.8 节 “使用 Dnssec-trigger”。
4.5.4. VPN Supplied Domains 和 Name Servers
unbound
、dnssec-trigger 和 NetworkManager 的组合可以正确支持 VPN 软件提供的域和名称服务器。VPN 隧道启动后,会为接收的域名的所有条目清除本地 unbound
缓存,以便从使用 VPN 访问的内部名称服务器获取对域名中的名称的查询。当 VPN 隧道终止时,不会再次清除 unbound
缓存,以确保对域的任何查询都将返回公共 IP 地址,而不是之前获取的专用 IP 地址。请参阅 第 4.5.11 节 “为连接分割域配置 DNSSEC 验证”。
4.5.5. 推荐的命名实践
DNS
中用于机器 的完全限定域名 (FQDN)匹配,如 host.example.com
。
.yourcompany
)添加到公共寄存器中。因此,红帽强烈建议您不要使用没有委托给您的域名,即使在专用网络上,这可能会导致根据网络配置的不同解析域名。因此,网络资源可能会不可用。使用未委托给您的域名也使得 DNSSEC 更难以部署和维护,因为域名冲突需要手动配置来启用 DNSSEC 验证。有关此问题的更多信息,请参阅有关域名冲突的 ICANN 常见问题解答。
4.5.6. 了解信任 Anchors
DNS
名称和公钥(或公钥的哈希)组成。它表示为 base 64 编码密钥。它与一个证书类似,它是一种交换信息(包括公钥)的方法,可用于验证和验证 DNS
记录。RFC 4033 将信任定位符定义为 DNSKEY RR 的已配置 DNSKEY RR 或 DS RR 哈希。验证安全感知解析器使用此公钥或哈希作为起点,用于将身份验证链构建到签名的 DNS 响应中。通常,验证解析器必须通过一些安全或可信的方法在 DNS 协议之外获取其信任定位符的初始值。存在信任定位符还意味着解析器应该预期信任锚指向的区域。
4.5.7. 安装 DNSSEC
4.5.7.1. 安装 unbound
DNS
,需要安装 DNS
解析器 未绑定
(或 绑定
)。只需要在移动设备上安装 dnssec-trigger。对于服务器,unbound
应该足够了,但可能需要本地域的转发配置,具体取决于服务器所在的位置(LAN 或 Internet)。DNSSEC-trigger 目前只会对全局公共 DNS 区域提供帮助。NetworkManager、dhclient 和 VPN 应用程序通常会自动收集域列表(以及名称服务器列表),但不能自动收集 dnssec-trigger 或 unbound。
unbound
,请以 root
用户身份输入以下命令:
~]# yum install unbound
4.5.7.2. 检查 unbound 是否正在运行
unbound
守护进程是否正在运行,请输入以下命令:
~]$ systemctl status unbound
unbound.service - Unbound recursive Domain Name Server
Loaded: loaded (/usr/lib/systemd/system/unbound.service; disabled)
Active: active (running) since Wed 2013-03-13 01:19:30 CET; 6h ago
unbound
服务没有运行,systemctl status 命令将会报告 unbound
作为 Active: inactive (dead)
。
4.5.7.3. 启动 unbound
unbound
守护进程,请以 root
用户身份输入以下命令:
~]# systemctl start unbound
unbound
:
~]# systemctl enable unbound
unbound
守护进程允许使用以下目录配置本地数据或覆盖:
/etc/unbound/conf.d
目录用于为特定域名添加配置。这用于将对域名的查询重定向到特定的DNS
服务器。这通常用于只存在于企业 WAN 中的子域。/etc/unbound/keys.d
目录用于为特定域名添加信任定位符。当仅限内部名称被 DNSSEC 签名时,这是必需的,但没有公开现有的 DS 记录来构建信任路径。另一个用例是使用与公司 WAN 外部公开名称不同的 DNSKEY 进行签名。/etc/unbound/local.d
目录用于添加特定的DNS
数据作为本地覆盖。这可用于构建黑名单或创建手动覆盖。此数据将由unbound
返回到客户端,但不会标记为 DNSSEC 签名。
unbound.conf (5)
手册页。
4.5.7.4. 安装 Dnssec-trigger
dnssec-triggerd
。要安装 dnssec-trigger,请以 root
用户身份输入以下命令:
~]# yum install dnssec-trigger
4.5.7.5. 检查 Dnssec-trigger 守护进程是否正在运行
dnssec-triggerd
是否正在运行,请输入以下命令:
~]$ systemctl status dnssec-triggerd
systemctl status dnssec-triggerd.service
dnssec-triggerd.service - Reconfigure local DNS(SEC) resolver on network change
Loaded: loaded (/usr/lib/systemd/system/dnssec-triggerd.service; enabled)
Active: active (running) since Wed 2013-03-13 06:10:44 CET; 1h 41min ago
dnssec-triggerd
守护进程没有运行,systemctl status 命令将报告为 Active: inactive (dead)
。要为当前会话启动它,请以 root
用户身份输入以下命令:
~]# systemctl start dnssec-triggerd
dnssec-triggerd
每次系统引导时启动:
~]# systemctl enable dnssec-triggerd
4.5.8. 使用 Dnssec-trigger
resolv.conf
则指向 127.0.0.1
。当您单击 Hotspot Sign-On 面板中的 时,这已更改。DNS
服务器从 NetworkManager 查询并放入 resolv.conf
中。现在,您可以在 Hotspot 的登录页面上进行身份验证。anchor 图标显示一个大的红色感叹号,警告您以不安全的方式进行 DNS
查询。经过身份验证后,dnssec-trigger 应该自动检测此模式并切回到安全模式,但在某些情况下,用户必须选择 Reprobe 来手动执行此操作。
unbound
对 resolv.conf
文件的更改。
4.5.9. 使用带有 DNSSEC 的 dig
DNS
工具 nslookup 和 host 已被弃用,不应使用。
+dnssec
会添加到命令中,例如:
~]$ dig +dnssec whitehouse.gov
; <<>> DiG 9.9.3-rl.13207.22-P2-RedHat-9.9.3-4.P2.el7 <<>> +dnssec whitehouse.gov
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21388
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;whitehouse.gov. IN A
;; ANSWER SECTION:
whitehouse.gov. 20 IN A 72.246.36.110
whitehouse.gov. 20 IN RRSIG A 7 2 20 20130825124016 20130822114016 8399 whitehouse.gov. BB8VHWEkIaKpaLprt3hq1GkjDROvkmjYTBxiGhuki/BJn3PoIGyrftxR HH0377I0Lsybj/uZv5hL4UwWd/lw6Gn8GPikqhztAkgMxddMQ2IARP6p wbMOKbSUuV6NGUT1WWwpbi+LelFMqQcAq3Se66iyH0Jem7HtgPEUE1Zc 3oI=
;; Query time: 227 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Aug 22 22:01:52 EDT 2013
;; MSG SIZE rcvd: 233
除了 A 记录外,还会返回包含 DNSSEC 签名的 RRSIG 记录,以及签名的时间和过期时间。unbound
服务器表示数据经过 DNSSEC 验证,方法是返回顶部的 flags:
部分中的 ad
bit。
~]$ dig badsign-a.test.dnssec-tools.org
; <<>> DiG 9.9.3-rl.156.01-P1-RedHat-9.9.3-3.P1.el7 <<>> badsign-a.test.dnssec-tools.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 1010
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;badsign-a.test.dnssec-tools.org. IN A
;; Query time: 1284 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Aug 22 22:04:52 EDT 2013
;; MSG SIZE rcvd: 60]
+cd
选项来禁用 DNSSEC 检查:
~]$ dig +cd +dnssec badsign-a.test.dnssec-tools.org
; <<>> DiG 9.9.3-rl.156.01-P1-RedHat-9.9.3-3.P1.el7 <<>> +cd +dnssec badsign-a.test.dnssec-tools.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26065
;; flags: qr rd ra cd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;badsign-a.test.dnssec-tools.org. IN A
;; ANSWER SECTION:
badsign-a.test.dnssec-tools.org. 49 IN A 75.119.216.33
badsign-a.test.dnssec-tools.org. 49 IN RRSIG A 5 4 86400 20130919183720 20130820173720 19442 test.dnssec-tools.org. E572dLKMvYB4cgTRyAHIKKEvdOP7tockQb7hXFNZKVbfXbZJOIDREJrr zCgAfJ2hykfY0yJHAlnuQvM0s6xOnNBSvc2xLIybJdfTaN6kSR0YFdYZ n2NpPctn2kUBn5UR1BJRin3Gqy20LZlZx2KD7cZBtieMsU/IunyhCSc0 kYw=
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Aug 22 22:06:31 EDT 2013
;; MSG SIZE rcvd: 257
unbound
守护进程会将这些错误记录到 syslog 中,如下所示: Aug 22 22:04:52 laptop unbound: [3065:0] info: validation failure badsign-a.test.dnssec-tools.org. A IN
~]$ unbound-host -C /etc/unbound/unbound.conf -v whitehouse.gov
whitehouse.gov has address 184.25.196.110 (secure)
whitehouse.gov has IPv6 address 2600:1417:11:2:8800::fc4 (secure)
whitehouse.gov has IPv6 address 2600:1417:11:2:8000::fc4 (secure)
whitehouse.gov mail is handled by 105 mail1.eop.gov. (secure)
whitehouse.gov mail is handled by 110 mail5.eop.gov. (secure)
whitehouse.gov mail is handled by 105 mail4.eop.gov. (secure)
whitehouse.gov mail is handled by 110 mail6.eop.gov. (secure)
whitehouse.gov mail is handled by 105 mail2.eop.gov. (secure)
whitehouse.gov mail is handled by 105 mail3.eop.gov. (secure)
4.5.10. 为 Dnssec-trigger 设置 Hotspot 检测基础架构
- 在某些计算机上设置 Web 服务器,可在 Internet 上公开访问。请参阅 Red Hat Enterprise Linux 7 系统管理员指南中的 Web 服务器 章节。
- 服务器运行后,使用已知内容发布静态页面。该页面不需要是有效的 HTML 页面。例如,您可以使用名为
hotspot.txt
的纯文本文件,该文件仅包含字符串OK
。假设您的服务器位于example.com
,并且您在 Web 服务器document_root/static/
子目录中发布您的hotspot.txt
文件,那么静态 Web 页面的地址将是example.com/static/hotspot.txt
。请参阅 Red Hat Enterprise Linux 7 系统管理员指南中的 Web 服务器 一章中的 DocumentRoot 指令。 - 将以下行添加到
/etc/dnssec-trigger/dnssec-trigger.conf
文件中:url: "http://example.com/static/hotspot.txt OK"
此命令添加使用HTTP
(端口 80)探测到的 URL。第一部分是将要解析的 URL 以及将要下载的页面。命令的第二部分是下载的网页应包含的文本字符串。
dnssec-trigger.conf (8)
。
4.5.11. 为连接分割域配置 DNSSEC 验证
默认情况下,添加到 unbound
的所有转发区域都是 DNSSEC 验证的。
/etc/dnssec.conf
中的 validate_connection_provided_zones
变量。以 root
用户身份,打开并编辑行,如下所示: validate_connection_provided_zones=no不会对任何现有转发区进行更改,但只适用于将来的转发区。因此,如果您要为当前提供的域禁用 DNSSEC,则需要重新连接。
4.5.11.1. 为 Wi-Fi Supplied 域配置 DNSSEC 验证
/etc/dnssec.conf
中的 add_wifi_provided_zones
变量。以 root
用户身份,打开并编辑行,如下所示: add_wifi_provided_zones=yes不会对任何现有转发区进行更改,但只适用于将来的转发区。因此,如果要为当前的 Wi-Fi 提供的域启用 DNSSEC,则需要重新连接(重新启动) Wi-Fi 连接。
未绑定
可能会导致安全影响,例如:
- Wi-Fi 接入点可以有意通过
DHCP
为您提供域,其没有授权,并将所有DNS
查询路由到其DNS
服务器。 - 如果您的转发区的 DNSSEC 验证 关闭了,Wi-Fi 提供的
DNS
服务器可能会欺骗来自提供的域的域名的IP
地址,而无需知道它。
4.5.12. 其它资源
4.5.12.1. 安装的文档
DNSSEC-trigger (8)
手册页 - 描述dnssec-triggerd
、dnssec-trigger-control 和 dnssec-trigger-panel 的命令选项。DNSSEC-trigger.conf (8)
手册页 - 描述dnssec-triggerd
的配置选项。unbound (8)
手册页 - 描述unbound
的命令选项(DNS
验证解析器)。unbound.conf (5)
手册页 - 包含如何配置unbound
的信息。resolv.conf (5)
手册页 - 包含解析器例程读取的信息。
4.5.12.2. 在线文档
- http://tools.ietf.org/html/rfc4033
- RFC 4033 DNS 安全简介和要求.
- http://www.dnssec.net/
- 包含指向许多 DNSSEC 资源的网站。
- http://www.dnssec-deployment.org/
- DNSSEC 部署计划由部为家庭安全赞助,包含很多 DNSSEC 信息,并有用于讨论 DNSSEC 部署问题的邮件列表。
- http://www.internetsociety.org/deploy360/dnssec/community/
- 互联网 Society 的 “Deploy 360” 计划与协调 DNSSEC 部署是全球寻找社区和 DNSSEC 活动的良好资源。
- http://www.unbound.net/
- 本文档包含有关
unbound
DNS
服务的通用信息。 - http://www.nlnetlabs.nl/projects/dnssec-trigger/
- 本文档包含有关 dnssec-trigger 的一般信息。
4.6. 使用 Libreswan 保护虚拟专用网络(VPN)
IPsec
协议配置 虚拟专用网络 (VPN)。Libreswan 是 Openswan 应用程序的延续,Openswan 文档中的许多示例可以通过 Libreswan 交换。NetworkManager IPsec
插件称为 NetworkManager-libreswan。GNOME Shell 的用户应该安装 NetworkManager-libreswan-gnome 软件包,该软件包具有 NetworkManager-libreswan 作为依赖项。请注意,NetworkManager-libreswan-gnome 软件包只包括在 Optional 频道中。请参阅启用补充和可选存储库。
IPsec
协议本身使用 互联网密钥交换 (IKE)协议进行配置。术语 IPsec 和 IKE 可互换使用。IPsec VPN 也称为 IKE VPN、IKEv2 VPN、XAUTH VPN、Cisco VPN 或 IKE/IPsec VPN。IPsec VPN 变体,它使用 Level 2 Tunneling Protocol (L2TP),它通常被称为 L2TP/IPsec VPN,它需要 Optional 频道 xl2tpd 应用程序。
IKE
实现。IKE
版本 1 和 2 作为用户级别的守护进程实现。IKE 协议本身也加密。IPsec
协议由 Linux 内核实现,Libreswan 配置内核以添加和删除 VPN 隧道配置。
IKE
协议使用 UDP 端口 500 和 4500。IPsec
协议由两个不同的协议组成,即 Encapsulated Security Payload (ESP),其协议号为 50,以及协议号 51 的 Authenticated Header (AH)。不建议使用 AH
协议。建议 AH
用户迁移到使用 null 加密的 ESP
。
IPsec
协议有两种不同的操作模式,即 Tunnel 模式
(默认)和 传输模式
。可以使用没有 IKE 的 IPsec 配置内核。这称为 手动密钥
。可以使用 ip xfrm 命令手动配置密钥,但为了安全起见,强烈建议您这样做。Libreswan 使用 netlink 与 Linux 内核连接。在 Linux 内核中进行数据包加密和解密。
IKE
/IPsec
VPN 是 Red Hat Enterprise Linux 7 中推荐的唯一 VPN 技术。在不了解这样做风险的情况下不要使用任何其他 VPN 技术。
4.6.1. 安装 Libreswan
root
用户身份输入以下命令:
~]# yum install libreswan
~]$ yum info libreswan
~]# systemctl stop ipsec ~]# rm /etc/ipsec.d/*db
root
用户身份输入以下命令:
~]# ipsec initnss
Initializing NSS database
~]# certutil -N -d sql:/etc/ipsec.d
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.
Enter new password:
Re-enter password:
ipsec
守护进程,以 root
身份运行以下命令:
~]# systemctl start ipsec
~]$ systemctl status ipsec
* ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
Loaded: loaded (/usr/lib/systemd/system/ipsec.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2018-03-18 18:44:43 EDT; 3s ago
Docs: man:ipsec(8)
man:pluto(8)
man:ipsec.conf(5)
Process: 20358 ExecStopPost=/usr/sbin/ipsec --stopnflog (code=exited, status=0/SUCCESS)
Process: 20355 ExecStopPost=/sbin/ip xfrm state flush (code=exited, status=0/SUCCESS)
Process: 20352 ExecStopPost=/sbin/ip xfrm policy flush (code=exited, status=0/SUCCESS)
Process: 20347 ExecStop=/usr/libexec/ipsec/whack --shutdown (code=exited, status=0/SUCCESS)
Process: 20634 ExecStartPre=/usr/sbin/ipsec --checknflog (code=exited, status=0/SUCCESS)
Process: 20631 ExecStartPre=/usr/sbin/ipsec --checknss (code=exited, status=0/SUCCESS)
Process: 20369 ExecStartPre=/usr/libexec/ipsec/_stackmanager start (code=exited, status=0/SUCCESS)
Process: 20366 ExecStartPre=/usr/libexec/ipsec/addconn --config /etc/ipsec.conf --checkconfig (code=exited, status=0/SUCCESS)
Main PID: 20646 (pluto)
Status: "Startup completed."
CGroup: /system.slice/ipsec.service
└─20646 /usr/libexec/ipsec/pluto --leak-detective --config /etc/ipsec.conf --nofork
root
用户身份运行以下命令:
~]# systemctl enable ipsec
- 用于
互联网密钥交换
(IKE)协议的UDP
端口 500 和 4500 - 用于
封装安全负载
(ESP)IPsec
数据包的协议 50 - 协议 51 用于
Authenticated Header
(AH)IPsec
数据包(uncommon)
IPsec
VPN 的三个示例。第一个示例是将两个主机连接在一起,以便它们可以安全地通信。第二个示例将两个站点连接在一起以组成一个网络。第三个示例支持远程用户,在此上下文中称为 road warriors。
4.6.2. 使用 Libreswan 创建 VPN 配置
- 预共享密钥 (PSK)是最简单的验证方法。PSK 应该由随机字符组成,长度至少为 20 个字符。在 FIPS 模式中,PSK 需要根据所使用的完整性算法满足最低强度要求。建议您不要使用小于 64 个随机字符的 PSK。
- 原始 RSA 密钥通常用于静态主机到主机或子网到子网
IPsec
配置。主机使用其他的公共 RSA 密钥手动配置。当几十个或更多主机都需要相互设置IPsec
隧道时,此方法无法很好地扩展。 - X.509 证书通常用于大型部署,其中有很多主机需要连接到一个通用的
IPsec
网关。中央 证书颁发机构 (CA)用于为主机或用户签名 RSA 证书。此中央 CA 负责中继信任,包括单个主机或用户的撤销。 - NULL 身份验证用于在不进行身份验证的情况下获取网格加密。它可防止被动攻击,但不会防止主动攻击。但是,由于
IKEv2
允许非对称身份验证方法,因此 NULL 身份验证也可用于互联网扩展 Opportunistic IPsec,其中客户端验证服务器,但服务器不验证客户端。此模型与使用TLS
(也称为 https:// 网站)的安全网站类似。
4.6.3. 使用 Libreswan 创建主机到主机 VPN
IPsec
VPN,请在两个主机(左和右侧 )上以 root
身份输入以下命令来创建新的原始 RSA 密钥对:
~]# ipsec newhostkey --output /etc/ipsec.d/hostkey.secrets
Generated RSA key pair with CKAID 14936e48e756eb107fa1438e25a345b46d80433f was stored in the NSS database
root
用户添加到新主机密钥的主机上,使用 “newhostkey” 命令返回的 CKAID : “”
~]# ipsec showhostkey --left --ckaid 14936e48e756eb107fa1438e25a345b46d80433f
# rsakey AQPFKElpV
leftrsasigkey=0sAQPFKElpV2GdCF0Ux9Kqhcap53Kaa+uCgduoT2I3x6LkRK8N+GiVGkRH4Xg+WMrzRb94kDDD8m/BO/Md+A30u0NjDk724jWuUU215rnpwvbdAob8pxYc4ReSgjQ/DkqQvsemoeF4kimMU1OBPNU7lBw4hTBFzu+iVUYMELwQSXpremLXHBNIamUbe5R1+ibgxO19l/PAbZwxyGX/ueBMBvSQ+H0UqdGKbq7UgSEQTFa4/gqdYZDDzx55tpZk2Z3es+EWdURwJOgGiiiIFuBagasHFpeu9Teb1VzRyytnyNiJCBVhWVqsB4h6eaQ9RpAMmqBdBeNHfXwb6/hg+JIKJgjidXvGtgWBYNDpG40fEFh9USaFlSdiHO+dmGyZQ74Rg9sWLtiVdlH1YEBUtQb8f8FVry9wSn6AZqPlpGgUdtkTYUCaaifsYH4hoIA0nku4Fy/Ugej89ZdrSN7Lt+igns4FysMmBOl9Wi9+LWnfl+dm4Nc6UNgLE8kZc+8vMJGkLi4SYjk2/MFYgqGX/COxSCPBFUZFiNK7Wda0kWea/FqE1heem7rvKAPIiqMymjSmytZI9hhkCD16pCdgrO3fJXsfAUChYYSPyPQClkavvBL/wNK9zlaOwssTaKTj4Xn90SrZaxTEjpqUeQ==
~]# ipsec showhostkey --list
< 1 > RSA keyid: AQPFKElpV ckaid: 14936e48e756eb107fa1438e25a345b46d80433f
/etc/ipsec.d8:0:1::.db
中。
leftrsasigkey=
和 rightrsasigkey=
将添加到位于 /etc/ipsec.d/
目录中的自定义配置文件中。
root
用户身份运行的编辑器,以以下格式创建具有适当名称的文件:
/etc/ipsec.d/my_host-to-host.conf
conn mytunnel leftid=@west.example.com left=192.1.2.23 leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== rightid=@east.example.com right=192.1.2.45 rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== authby=rsasig # load and initiate automatically auto=start
IP
地址,那么在移动客户端上,移动客户端将使用 %defaultroute
作为其 IP
地址。这将自动获取动态 IP
地址。在接受来自传入移动主机的静态服务器主机上,使用 %any
指定其 IP
地址的移动主机。
leftrsasigkey
值 “从左侧” 主机获取,并且从右侧主机获取 “ right
rsasigkey” 值。使用 leftckaid
和 rightckaid
时也是如此。
ipsec
以确保它读取新配置,如果配置为在引导时启动,确认隧道已建立:
~]# systemctl restart ipsec
auto=start
选项时,应在几秒钟内建立 IPsec
隧道。您可以以 root
用户身份输入以下命令来手动加载和启动隧道:
~]# ipsec auto --add mytunnel ~]# ipsec auto --up mytunnel
4.6.3.1. 使用 Libreswan 验证主机到主机 VPN
IKE
协商在 UDP
端口 500 和 4500 上发生。IPsec
数据包显示为 封装安全 Payload
(ESP)数据包。ESP
协议没有端口。当 VPN 连接需要通过 NAT 路由器时,ESP
数据包会封装在端口 4500 的 UDP
数据包中。
root
用户身份以 root 用户身份运行以下命令:
~]# tcpdump -n -i interface esp or udp port 500 or udp port 4500
00:32:32.632165 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1a), length 132
00:32:32.632592 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1a), length 132
00:32:32.632592 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 7, length 64
00:32:33.632221 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1b), length 132
00:32:33.632731 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1b), length 132
00:32:33.632731 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 8, length 64
00:32:34.632183 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1c), length 132
00:32:34.632607 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1c), length 132
00:32:34.632607 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 9, length 64
00:32:35.632233 IP 192.1.2.45 > 192.1.2.23: ESP(spi=0x63ad7e17,seq=0x1d), length 132
00:32:35.632685 IP 192.1.2.23 > 192.1.2.45: ESP(spi=0x4841b647,seq=0x1d), length 132
00:32:35.632685 IP 192.0.2.254 > 192.0.1.254: ICMP echo reply, id 2489, seq 10, length 64
IPsec
意外交互。它只会看到传出的加密数据包,而不是传出的纯文本数据包。它确实会看到加密的传入数据包,以及解密的传入数据包。如果可能,在两台机器之间的路由器上运行 tcpdump,而不是在其中一个端点本身上运行。当使用虚拟 Tunnel 接口(VTI)时,物理接口的 tcpdump 会显示 ESP
数据包,而 VTI 接口上的 tcpdump 会显示明文流量。
root
用户身份输入以下命令:
~]# ipsec whack --trafficstatus
006 #2: "mytunnel", type=ESP, add_time=1234567890, inBytes=336, outBytes=336, id='@east'
4.6.4. 使用 Libreswan 配置站点到站点 VPN
IPsec
VPN,请将两个网络连接在一起,会在两个主机间创建一个 IPsec
隧道,该端点配置为允许来自一个或多个子网的流量来传递。因此,它们可以被视为网络远程部分的网关。站点到站点 VPN 的配置只能与主机到主机 VPN 不同,同时必须在配置文件中指定一个或多个网络或子网。
IPsec
VPN,首先配置主机到主机的 IPsec
VPN,如 第 4.6.3 节 “使用 Libreswan 创建主机到主机 VPN” 所述,然后将文件复制到具有适当名称的文件,如 /etc/ipsec.d/my_site-to-site.conf
。使用以 root
身份运行的编辑器,编辑自定义配置文件 /etc/ipsec.d/my_site-to-site.conf
,如下所示:
conn mysubnet also=mytunnel leftsubnet=192.0.1.0/24 rightsubnet=192.0.2.0/24 auto=start conn mysubnet6 also=mytunnel connaddrfamily=ipv6 leftsubnet=2001:db8:0:1::/64 rightsubnet=2001:db8:0:2::/64 auto=start conn mytunnel leftid=@west.example.com left=192.1.2.23 leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== rightid=@east.example.com right=192.1.2.45 rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== authby=rsasig
root
用户身份启动所有连接:
~]# ipsec auto --add mysubnet
~]# ipsec auto --add mysubnet6
~]# ipsec auto --up mysubnet
104 "mysubnet" #1: STATE_MAIN_I1: initiate
003 "mysubnet" #1: received Vendor ID payload [Dead Peer Detection]
003 "mytunnel" #1: received Vendor ID payload [FRAGMENTATION]
106 "mysubnet" #1: STATE_MAIN_I2: sent MI2, expecting MR2
108 "mysubnet" #1: STATE_MAIN_I3: sent MI3, expecting MR3
003 "mysubnet" #1: received Vendor ID payload [CAN-IKEv2]
004 "mysubnet" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG cipher=aes_128 prf=oakley_sha group=modp2048}
117 "mysubnet" #2: STATE_QUICK_I1: initiate
004 "mysubnet" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x9414a615 <0x1a8eb4ef xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none}
~]# ipsec auto --up mysubnet6
003 "mytunnel" #1: received Vendor ID payload [FRAGMENTATION]
117 "mysubnet" #2: STATE_QUICK_I1: initiate
004 "mysubnet" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0x06fe2099 <0x75eaa862 xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none}
4.6.4.1. 使用 Libreswan 验证站点到站点 VPN
4.6.5. 使用 Libreswan 配置站点到站点的单一 Tunnel VPN
IP
地址相互通信。这可以通过一个隧道来完成。如果左侧主机(主机名为 west
)具有内部 IP
地址 192.0.1.254
和正确的主机(主机名 east
)具有内部 IP
地址 192.0.2.254
,请使用单一隧道将以下配置存储在两个服务器上的 /etc/ipsec.d/myvpn.conf
文件中:
conn mysubnet leftid=@west.example.com leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== left=192.1.2.23 leftsourceip=192.0.1.254 leftsubnet=192.0.1.0/24 rightid=@east.example.com rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== right=192.1.2.45 rightsourceip=192.0.2.254 rightsubnet=192.0.2.0/24 auto=start authby=rsasig
4.6.6. 使用 Libreswan 配置子网扩展
IPsec
通常部署在 hub 和 spoke 架构中。每个叶节点都有一个 IP
范围,它是更大的范围。通过 hub 相互沟通。这称为 子网入侵。
例 4.2. 配置简单子网扩展设置
10.0.0.0/8
和两个使用更小 /24
子网的分支配置头办公室。
conn branch1 left=1.2.3.4 leftid=@headoffice leftsubnet=0.0.0.0/0 leftrsasigkey=0sA[...] # right=5.6.7.8 rightid=@branch1 rightsubnet=10.0.1.0/24 rightrsasigkey=0sAXXXX[...] # auto=start authby=rsasig conn branch2 left=1.2.3.4 leftid=@headoffice leftsubnet=0.0.0.0/0 leftrsasigkey=0sA[...] # right=10.11.12.13 rightid=@branch2 rightsubnet=10.0.2.0/24 rightrsasigkey=0sAYYYY[...] # auto=start authby=rsasig
conn branch1 left=1.2.3.4 leftid=@headoffice leftsubnet=0.0.0.0/0 leftrsasigkey=0sA[...] # right=10.11.12.13 rightid=@branch2 rightsubnet=10.0.1.0/24 rightrsasigkey=0sAYYYY[...] # auto=start authby=rsasig conn passthrough left=1.2.3.4 right=0.0.0.0 leftsubnet=10.0.1.0/24 rightsubnet=10.0.1.0/24 authby=never type=passthrough auto=route
4.6.7. 配置 IKEv2 远程访问 VPN Libreswan
IP
地址(如笔记本电脑)的移动客户端的旅行用户。它们使用证书进行身份验证。为了避免需要使用旧的 IKEv1 XAUTH 协议,在以下示例中使用 IKEv2:
conn roadwarriors ikev2=insist # Support (roaming) MOBIKE clients (RFC 4555) mobike=yes fragmentation=yes left=1.2.3.4 # if access to the LAN is given, enable this, otherwise use 0.0.0.0/0 # leftsubnet=10.10.0.0/16 leftsubnet=0.0.0.0/0 leftcert=vpn-server.example.com leftid=%fromcert leftxauthserver=yes leftmodecfgserver=yes right=%any # trust our own Certificate Agency rightca=%same # pick an IP address pool to assign to remote users # 100.64.0.0/16 prevents RFC1918 clashes when remote users are behind NAT rightaddresspool=100.64.13.100-100.64.13.254 # if you want remote clients to use some local DNS zones and servers modecfgdns="1.2.3.4, 5.6.7.8" modecfgdomains="internal.company.com, corp" rightxauthclient=yes rightmodecfgclient=yes authby=rsasig # optionally, run the client X.509 ID through pam to allow/deny client # pam-authorize=yes # load connection, don't initiate auto=add # kill vanished roadwarriors dpddelay=1m dpdtimeout=5m dpdaction=%clear
left=1.2.3.4
- 1.2.3.4 值指定服务器的实际 IP 地址或主机名。
leftcert=vpn-server.example.com
- 这个选项指定引用用于导入证书的友好名称或 nickname 的证书。通常,该名称作为 PKCSRG 证书捆绑包的一部分生成,格式为
.p12
文件。如需更多信息,请参阅pkcs12 (1)
和pk12util (1)
手册页。
conn to-vpn-server ikev2=insist # pick up our dynamic IP left=%defaultroute leftsubnet=0.0.0.0/0 leftcert=myname.example.com leftid=%fromcert leftmodecfgclient=yes # right can also be a DNS hostname right=1.2.3.4 # if access to the remote LAN is required, enable this, otherwise use 0.0.0.0/0 # rightsubnet=10.10.0.0/16 rightsubnet=0.0.0.0/0 # trust our own Certificate Agency rightca=%same authby=rsasig # allow narrowing to the server’s suggested assigned IP and remote subnet narrowing=yes # Support (roaming) MOBIKE clients (RFC 4555) mobike=yes # Initiate connection auto=start
auto=start
- 这个选项允许用户在
ipsec
系统服务启动时连接到 VPN。如果要稍后建立连接,请使用auto=add
替换它。
4.6.8. 使用 X.509 配置 IKEv1 远程访问 VPN Libreswan 和 XAUTH
IP
地址和 DNS 信息原生分配给 roaming VPN 客户端的方法,因为使用 XAUTH IPsec
扩展建立连接。可以使用 PSK 或 X.509 证书部署扩展身份验证(XAUTH)。使用 X.509 部署更安全。客户端证书可以通过证书撤销列表或 在线证书状态协议 (OCSP)吊销。使用 X.509 证书时,单个客户端无法模拟服务器。使用 PSK (也称为组密码)是理论上可能的。
xauthby=pam
- 这使用
/etc/pam.d/pluto
中的配置来验证用户。可插拔验证模块(PAM)可以自行配置为使用各种后端。它可以使用系统帐户 user-password 方案、LDAP 目录、RADIUS 服务器或自定义密码身份验证模块。如需更多信息,请参阅使用可插拔验证模块(PAM) 章节。 xauthby=file
- 这使用
/etc/ipsec.d/passwd
配置文件(不应与/etc/ipsec.d/nsspassword
文件混淆)。此文件的格式与 Apache.htpasswd
文件类似,可以使用 Apache htpasswd 命令在此文件中创建条目。但是,在用户名和密码后,使用使用的IPsec
连接名称需要第三列,例如使用conn remoteusers
来提供 VPN 来删除用户,密码文件条目应如下所示:user1:$apr1$MIwQ3DHb$1I69LzTnZhnCT2DPQmAOK.:remoteusers
注意在使用 htpasswd 命令时,必须在每行的 user:password 部分之后手动添加连接名称。 xauthby=alwaysok
- 服务器始终假定 XAUTH 用户和密码组合是正确的。客户端仍然需要指定用户名和密码,尽管服务器会忽略它们。只有在用户已经通过 X.509 证书标识时,或者测试 VPN 时,才应使用此选项,而无需 XAUTH 后端。
conn xauth-rsa ikev2=never auto=add authby=rsasig pfs=no rekey=no left=ServerIP leftcert=vpn.example.com #leftid=%fromcert leftid=vpn.example.com leftsendcert=always leftsubnet=0.0.0.0/0 rightaddresspool=10.234.123.2-10.234.123.254 right=%any rightrsasigkey=%cert modecfgdns="1.2.3.4,8.8.8.8" modecfgdomains=example.com modecfgbanner="Authorized access is allowed" leftxauthserver=yes rightxauthclient=yes leftmodecfgserver=yes rightmodecfgclient=yes modecfgpull=yes xauthby=pam dpddelay=30 dpdtimeout=120 dpdaction=clear ike_frag=yes # for walled-garden on xauth failure # xauthfail=soft # leftupdown=/custom/_updown
xauthfail
设置为 soft 时,而不是 hard,则忽略身份验证失败,且 VPN 会像正确验证一样设置。自定义 updown 脚本可用于检查环境变量 XAUTH_FAILED
。然后可以将此类用户重定向到一个 “walled garden”,例如,他们可以联系管理员或续订该服务的付费订阅。
modecfgdomain
值和 DNS 条目将对指定域的查询重定向到这些指定的名称服务器。这允许用户使用内部 DNS 名称访问内部资源。请注意,虽然 IKEv2 支持使用 modecfgdomains
和 modecfgdns
的域名和名称服务器 IP 地址的逗号分隔列表,但 IKEv1 协议只支持一个域名,libreswan 最多只支持两个名称服务器 IP 地址。另外,要将横幅文本发送到 VPN cliens,请使用 modecfgbanner
选项。
leftsubnet
不是 0.0.0.0/0
,则分割配置请求将自动发送到客户端。例如:在使用 leftsubnet=10.0.0.0/8
时,VPN 客户端只通过 VPN 为 10.0.0.0/8
发送流量。
xauthby=file
- 管理员生成密码并将其存储在
/etc/ipsec.d/passwd
文件中。 xauthby=pam
- 密码在
/etc/pam.d/pluto
文件的 PAM 配置中指定的位置获得。 xauthby=alwaysok
- 未检查密码,并且始终接受该密码。使用这个选项用于测试目的,或者要确保仅 xauth-only 客户端的兼容性。
其它资源
4.6.9. 对 Quantum 计算机使用保护
ppk=yes
。如需要 PPK,请添加 ppk=insist
。然后,可为每个客户端分配一个带有一个 secret 值的 PPK ID,其 secret 值会被传递到带外(最好是使用半字节安全)。PPK 的随机性应该非常强大,且不能基于字典的单词。PPK ID 和 PPK 数据本身存储在 ipsec.secrets
中,例如:
@west @east : PPKS "user1" "thestringismeanttobearandomstr"
PPKS
选项指的是静态 PPK。有一个实验性功能,可以使用基于一次性平板的 Dynamic PPK。在每个连接中,一次性平板的一个新部分用作 PPK。当使用时,文件中的该部分动态 PPK 被零覆盖,以防止重复使用。如果没有剩余一次性材料,连接会失败。详情请查看 ipsec.secrets(5)
手册页。
4.6.10. 其它资源
ipsec
守护进程的其他资源。
4.6.10.1. 安装的文档
IPsec (8)
手册页 - 描述ipsec
的命令选项。IPsec.conf (5)
手册页 - 包含配置ipsec
的信息。IPsec.secrets (5)
手册页 - 描述ipsec.secrets
文件的格式。ipsec_ auto (8)
手册页 - 描述使用自动命令行客户端来处理使用自动交换密钥建立的 LibreswanIPsec
连接。ipsec_rsasigkey (8)
手册页 - 描述用于生成 RSA 签名密钥的工具。/usr/share/doc/libreswan-version/
4.6.10.2. 在线文档
- https://libreswan.org
- 上游项目的网站。
- https://libreswan.org/wiki
- Libreswan Project Wiki。
- https://libreswan.org/man/
- 所有 Libreswan man page。
- NIST Special Publication 800-77: Guide to IPsec VPNs
- 在根据 IPsec 部署安全服务时为机构提供实际指导。
4.7. 使用 OpenSSL
~]$ openssl list-public-key-algorithms
4.7.1. 创建和管理加密密钥
~]$ openssl genpkey -algorithm
RSA -out
privkey.pem
rsa_keygen_bits:numbits
- 生成的密钥中的位数。如果没有指定1024
,则使用。rsa_keygen_pubexp:value
- RSA public exponent 值。如果前面带有0x
,则可以是大的十进制值,也可以是十六进制值。默认值为65537
。
3
作为公钥创建 2048 位 RSA 私钥,请运行以下命令:
~]$ openssl genpkey -algorithm
RSA -out
privkey.pem -pkeyopt
rsa_keygen_bits:2048 \ -pkeyopt
rsa_keygen_pubexp:3
~]$ openssl genpkey -algorithm
RSA -out
privkey.pem -aes-128-cbc
-pass
pass:hello
4.7.2. 生成证书
4.7.2.1. 创建证书签名请求
~]$ openssl req -new
-key
privkey.pem -out
cert.csr
cert.csr
的 X.509 证书。名称 PEM 派生自 RFC 1424 中描述的 “互联网 Electronic 邮件的隐私增强”。要以替代 DER 格式生成证书文件,请使用 -outform
DER 命令选项。
- 您国家有两个字母国家/地区代码
- 您州的全名或省
- City 或 Town
- 您的机构名称
- 机构中单元的名称
- 您的系统名称或主机名
- 您的电子邮件地址
/etc/pki/tls/openssl.cnf
文件中。如需更多信息,请参阅 man openssl.cnf (5)
。
4.7.2.2. 创建自签名证书
366
天有效,以以下格式发出命令:
~]$ openssl req -new
-x509
-key
privkey.pem -out
selfcert.pem -days
366
4.7.2.3. 使用 Makefile 创建证书
/etc/pki/tls/certs/
目录包含一个 Makefile
,可用于使用 make 命令创建证书。要查看使用说明,请运行以下命令:
~]$ make -f /etc/pki/tls/certs/Makefile
或者,切换到目录并发出 make 命令,如下所示:
~]$ cd /etc/pki/tls/certs/ ~]$ make
4.7.3. 验证证书
~]$ openssl verify cert1.pem cert2.pem
cert.pem
中,您不信任的中间证书必须在 untrusted.pem
中直接连接。可信 root CA 证书必须在 /etc/pki/tls/certs/ca-bundle.crt
或 cacert.pem
文件中列出的默认 CA 中。然后,要验证链,以以下格式发出命令:
~]$ openssl verify -untrusted
untrusted.pem -CAfile
cacert.pem cert.pem
4.7.4. 加密和解密文件
RSA
密钥用于执行加密和解密,而使用 enc,使用对称算法。
使用 RSA 密钥
纯文本
的文件,请按如下所示发出命令:
~]$ openssl pkeyutl -in
plaintext -out
cyphertext -inkey
privkey.pem
-keyform DER
选项指定 DER 密钥格式。
-engine
选项,如下所示:
~]$ openssl pkeyutl -in
plaintext -out
cyphertext -inkey
privkey.pem -engine id
~]$ openssl engine -t
~]$ openssl pkeyutl -sign
-in
plaintext -out
sigtext -inkey
privkey.pem
~]$ openssl pkeyutl -verifyrecover
-in
sig -inkey
key.pem
~]$ openssl pkeyutl -verify
-in
file -sigfile sig -inkey
key.pem
使用 Symmetric Algorithms
-l
:
~]$
openssl enc -l
aes-128-cbc
算法,请使用以下语法:
openssl enc -aes-128-cbc
aes-128-cbc
算法加密名为 plaintext
的文件,请输入以下命令:
~]$
openssl enc -aes-128-cbc -in plaintext -out plaintext.aes-128-cbc
-d
选项,如下例所示:
~]$
openssl enc -aes-128-cbc -d -in plaintext.aes-128-cbc -out plaintext
AEAD
密码,而 ecb
模式则被视为安全。为获得最佳结果,请不要使用 cbc
以外的其他模式、cfb
、b
或 ctr
。
4.7.5. 生成消息 Digests
openssl dgst algorithm-out
filename-sign
private-key
md5|md4|md2|sha1|sha|mdc2|ripemd160|dss1
之一。编写本文时,首选使用 SHA1 算法。如果您需要使用 DSA 签名或进行验证,则必须将 dss1
选项与包含 -rand
选项指定的随机数据的文件一起使用。
~]$ openssl dgst sha1 -out
digest-file
~]$ openssl dgst sha1 -out
digest-file -sign
privkey.pem
4.7.6. 生成密码散列
~]$ openssl passwd password
-crypt
算法。
1)
计算密码的哈希值,请运行以下命令:
~]$ openssl passwd -1
password
-apr1
选项指定 BSD 算法的 Apache 变体。
xx
,请运行以下命令:
~]$ openssl passwd -salt
xx
-in
password-file
-out
选项来指定输出文件。table
将生成包含其相应的明文密码的密码哈希表。
4.7.7. 生成随机数据
~]$ openssl rand -out
rand-file -rand
seed-file
:
来指定用于查找随机数据进程的多个文件,作为列表分隔符。
4.7.8. 基准测试您的系统
~]$ openssl speed algorithm
4.7.9. 配置 OpenSSL
/etc/pki/tls/openssl.cnf
,称为 master 配置文件,该文件由 OpenSSL 库读取。也可以为每个应用程序拥有单独的配置文件。配置文件包含多个部分,其部分名称如下: [ section_name ]
。注意文件的第一个部分,直到第一个 [ section_name ]
被指代为 default 部分。当 OpenSSL 在配置文件中搜索名称时,首先搜索指定部分的名称。所有 OpenSSL 命令都使用 master OpenSSL 配置文件,除非命令中使用了一个选项来指定替代的配置文件。配置文件在 config (5)
手册页中详细介绍。
4.8. 使用 stunnel
4.8.1. 安装 stunnel
root
身份输入以下命令安装 stunnel 软件包:
~]# yum install stunnel
4.8.2. 将 stunnel 配置为 TLS Wrapper
- 无论您使用哪个服务,您需要 stunnel 的有效证书。如果您没有合适的证书,您可以应用到 证书颁发机构 来获取一个证书,或者您可以创建自签名证书。警告始终将由证书颁发机构签名的证书用于生产环境中运行的服务器。自签名证书仅适用于测试目的或专用网络。有关证书颁发机构授予的证书的更多信息,请参阅 第 4.7.2.1 节 “创建证书签名请求”。另一方面,要为 stunnel 创建自签名证书,请输入
/etc/pki/tls/certs/
目录,并以root
用户身份运行以下命令:certs]# make stunnel.pem
回答所有问题以完成该过程。 - 当您有证书时,为 stunnel 创建配置文件。它是每行指定一个选项或服务定义开头的文本文件。您还可以在文件中保留注释和空行,以改进其法定性,其中注释以分号开头。stunnel RPM 软件包包含
/etc/stunnel/
目录,您可以在其中存储配置文件。虽然 stunnel 不需要文件名或其扩展名的任何特殊格式,请使用/etc/stunnel/stunnel.conf
。以下内容将 stunnel 配置为 TLS 包装器:cert = /etc/pki/tls/certs/stunnel.pem ; Allow only TLS, thus avoiding SSL sslVersion = TLSv1 chroot = /var/run/stunnel setuid = nobody setgid = nobody pid = /stunnel.pid socket = l:TCP_NODELAY=1 socket = r:TCP_NODELAY=1 [service_name] accept = port connect = port TIMEOUTclose = 0
或者,您可以通过使用以下行替换包含sslVersion = TLSv1
的行来避免 SSL:options = NO_SSLv2 options = NO_SSLv3
选项的目的如下:cert
- 证书的路径sslVersion
- SSL 的版本;请注意,您可以使用TLS
,即使 SSL 和 TLS 是两个独立的加密协议chroot
- 更改在其中运行 stunnel 进程的根目录,以便提高安全性setuid
,setgid
- stunnel 进程的用户和组作为运行;nobody
是一个受限系统帐户pid
- stunnel 文件保存其进程 ID,相对于chroot
socket
- 本地和远程套接字选项 ; 在这种情况下,禁用 Nagle 的算法 来提高网络延迟[service_name]
- 服务定义的开头;此行下面使用的选项仅适用于给定服务,而上述选项则全局影响 stunnelaccept
- 要侦听的端口connect
- 要连接到的端口;这必须是您要保护的服务的端口TIMEOUTclose
- 从客户端等待 close_notify 警报的秒数;0
指示 stunnel 不会被等待options
- OpenSSL 库选项
例 4.3. 保护 CUPS
要将 stunnel 配置为 CUPS 的 TLS 包装程序,请使用以下值:[cups] accept = 632 connect = 631
您可以使用您喜欢的任何空闲端口,而不是632
。631
是 CUPS 通常使用的端口。 - 创建
chroot
目录,并授予setuid
选项对其写入访问权限所指定的用户。要做到这一点,请以root
用户身份输入以下命令:~]# mkdir /var/run/stunnel ~]# chown nobody:nobody /var/run/stunnel
这允许 stunnel 创建 PID 文件。 - 如果您的系统使用不允许访问新端口的防火墙设置,请相应地更改它们。详情请查看 第 5.6.7 节 “使用 GUI 打开端口”。
- 当您创建配置文件和
chroot
目录后,当您确定指定的端口可以访问后,就可以开始使用 stunnel。
4.8.3. 启动、停止和重启 stunnel
root
用户身份输入以下命令:
~]# stunnel /etc/stunnel/stunnel.conf
/var/log/secure
来记录其输出。
root
用户身份运行以下命令终止进程:
~]# kill `cat /var/run/stunnel/stunnel.pid`
4.9. 加密
4.9.1. 使用 LUKS 磁盘加密
LUKS 概述
- LUKS 做什么
- LUKS 会加密整个块设备,因此非常适合保护移动设备的内容,如可移动介质或笔记本电脑磁盘驱动器。
- 加密块设备的底层内容是任意的。这使得加密 交换设备 非常有用。对于将特殊格式化块设备用于数据存储的某些数据库,这也很有用。
- LUKS 使用现有的设备映射器内核子系统。
- LUKS 增强了对字典攻击的保护。
- LUKS 设备包含多个密钥插槽,允许用户添加备份密钥或密码短语。
- LUKS 不 做什么:
- LUKS 不适用于需要许多(超过 8 个)用户对同一设备有不同的访问密钥的情况。
- LUKS 不适用于需要文件级加密的应用程序。
4.9.1.1. Red Hat Enterprise Linux 中的 LUKS 实施
- AES - 高级加密标准 - FIPS PUB 197
- Twofish(128 位块加密)
- Serpent
- cast5 - RFC 2144
- cast6 - RFC 2612
4.9.1.2. 手动加密目录
- 以 root 用户身份在 shell 提示符后输入以下内容进入运行级别 1:
telinit 1
- 卸载您现有的
/home
:umount /home
- 如果上一步中的命令失败,请使用 fuser 查找进程切换
/home
并终止它们:fuser -mvk /home
- 验证
/home
不再被挂载:grep home /proc/mounts
- 使用随机数据填充分区:
shred -v --iterations=1 /dev/VG00/LV_home
这个命令会按照设备的后续写入速度进行,可能需要一些时间才能完成。确保未加密数据保留在已用设备上的重要步骤,并且模糊处理包含加密数据的设备的部分,而不是只是随机数据。 - 初始化分区:
cryptsetup --verbose --verify-passphrase luksFormat /dev/VG00/LV_home
- 打开新加密设备:
cryptsetup luksOpen /dev/VG00/LV_home home
- 确保该设备存在:
ls -l /dev/mapper | grep home
- 创建文件系统:
mkfs.ext3 /dev/mapper/home
- 挂载文件系统:
mount /dev/mapper/home /home
- 确保文件系统可见:
df -h | grep home
- 将以下内容添加到
/etc/crypttab
文件中:home /dev/VG00/LV_home none
- 编辑
/etc/fstab
文件,删除/home
的旧条目并添加以下行:/dev/mapper/home /home ext3 defaults 1 2
- 恢复默认 SELinux 安全上下文:
/sbin/restorecon -v -R /home
- 重启机器:
shutdown -r now
/etc/crypttab
中的条目使您的计算机在引导时询问您的luks
密码短语。- 以 root 身份登录并恢复您的备份。
4.9.1.3. 向现有设备添加新密码
cryptsetup luksAddKey device
4.9.1.4. 从现有设备中删除密码
cryptsetup luksRemoveKey device
4.9.1.5. 在 Anaconda 中创建加密块设备
4.9.1.6. 其它资源
4.9.2. 创建 GPG 密钥
4.9.2.1. 在 GNOME 中创建 GPG 密钥
- 安装 Seahorse 工具,其使 GPG 密钥管理更容易:
~]# yum install seahorse
- 要创建密钥,请从 Seahorse。→ 菜单中选择 ,这将启动应用程序
- 从 PGP Key。然后单击 。菜单中,选择 ,然后选择
- 输入您的全名、电子邮件地址和可选注释,描述您是谁(例如:John C. Smith、
jsmith@example.com
、软件工程师)。点 。此时会显示一个对话框,要求输入密钥的密码短语。选择强大的密码短语,但易于记住。点 并创建密钥。
0x
添加到密钥 ID 前,如 0x6789ABCD
中。您应该备份您的私钥,并将它保存在某个地方安全。
4.9.2.2. 在 KDE 中创建 GPG 密钥
- 从主菜单中选择 KGpg 程序。如果您之前使用 KGpg,则程序将引导您完成创建自己的 GPG 密钥对的过程。→ 加密工具,从主菜单启动
- 此时会出现一个对话框,提示您创建新密钥对。输入您的名字、电子邮件地址和可选注释。您还可以为您的密钥选择过期时间,以及密钥强度(位数)和算法。
- 在下一个对话框中输入您的密码短语。此时,您的密钥会出现在主 KGpg 窗口中。
0x
添加到密钥 ID 前,如 0x6789ABCD
中。您应该备份您的私钥,并将它保存在某个地方安全。
4.9.2.3. 使用命令行创建 GPG 密钥
- 使用以下 shell 命令:
~]$ gpg2 --gen-key
此命令生成由公钥和私钥组成的密钥对。其他人使用您的公钥来验证和解密您的通信。尽可能广泛地分发您的公钥,特别是您所知道希望接收您的身份通信(如邮件列表)的人员。 - 一系列提示会指示您完成该过程。如果需要,按 Enter 键分配默认值。第一个提示要求您选择您喜欢的密钥类型:
Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection?
在几乎所有情况下,默认值都是正确的选择。RSA/RSA 密钥允许您仅签署通信,也允许您加密文件。 - 选择密钥大小:
RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048)
此外,默认的 2048 几乎对于所有用户来说都足够了,代表非常强大的安全性级别。 - 选择 键将过期的时间。最好选择过期日期,而不使用默认值,即无。
例如,如果密钥上的电子邮件地址无效,过期日期将提醒其他人停止使用该公钥。
Please specify how long the key should be valid. 0 = key does not expire d = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years key is valid for? (0)
例如,输入值 1y 使密钥在一年内有效。(如果您更改您的主意,您可以在生成密钥后更改此过期日期。) - 在 gpg2 应用程序请求签名信息前,会出现以下提示:
Is this correct (y/N)?
输入y
以完成该过程。 - 输入您的 GPG 密钥的名称和电子邮件地址。请记住,这个过程将作为真实个人进行身份验证。因此,请包含您的真实名称。如果您选择了一个虚假的电子邮件地址,则其他电子邮件地址将更难以查找您的公钥。这使得验证您的通信变得困难。如果您在邮件列表中将这个 GPG 密钥用于自我引入,例如,请输入您在该列表中使用的电子邮件地址。使用注释字段包含别名或其他信息。(某些人使用不同的密钥来满足不同的目的,并使用注释来标识每个键,如"Office"或"开源项目"。")
- 在确认提示下,输入字母
O
以继续所有条目(如果所有条目都正确),或者使用其他选项来修复任何问题。最后,为您的 secret 密钥输入密码短语。gpg2 程序要求您输入两次密码短语以确保您没有输入错误。 - 最后,gpg2 生成随机数据,使您的密钥尽可能唯一。在这一步中移动鼠标、类型随机密钥或在系统上执行其他任务以加快进程。完成此步骤后,您的密钥已完成并可使用:
pub 1024D/1B2AFA1C 2005-03-31 John Q. Doe <jqdoe@example.com> Key fingerprint = 117C FE83 22EA B843 3E86 6486 4320 545E 1B2A FA1C sub 1024g/CEA4B22E 2005-03-31 [expires: 2006-03-31]
- 密钥指纹是您的密钥的简写"signature"。它允许您确认他们已经收到了您的实际公钥,而无需篡改。您不需要将此指纹写出。要随时显示指纹,请使用这个命令替换您的电子邮件地址:
~]$ gpg2 --fingerprint jqdoe@example.com
您的"GPG 密钥 ID"由标识公钥的 8 个十六进制数组成。在上例中,GPG 密钥 ID 为1B2AFA1C
。在大多数情况下,如果您请求密钥 ID,请将0x
添加到密钥 ID 前,如0x6789ABCD
中。
4.9.2.4. 关于公钥加密
4.9.3. 对公共密钥加密使用 openCryptoki
4.9.3.1. 安装 openCryptoki 并启动服务
root
用户身份输入以下命令:
~]# yum install opencryptoki
pkcsslotd
守护进程。以 root
用户身份执行以下命令,启动当前会话的守护进程:
~]# systemctl start pkcsslotd
~]# systemctl enable pkcsslotd
4.9.3.2. 配置和使用 openCryptoki
pkcsslotd
守护进程会读取 /etc/opencryptoki/opencryptoki.conf
配置文件,该文件用于收集有关配置用于系统及其插槽的令牌信息。
pkcsslotd
守护进程的行为,请使用 pkcsconf 工具。此工具允许您显示和配置守护进程的状态,并列出和修改当前配置的插槽和令牌。例如,要显示令牌的相关信息,请发出以下命令(请注意,需要与 pkcsslotd
守护进程通信的所有非 root 用户都必须是 pkcs11
系统组群的一部分):
~]$ pkcsconf -t
pkcs11
组中只能分配完全可信用户,因为此组的所有成员都有阻止 openCryptoki 服务其他用户访问配置的 PKCS628 令牌的权利。这个组的所有成员都可以使用对 openCryptoki 的任何用户的权限执行任意代码。
4.9.4. 使用智能卡向 OpenSSH Supply 凭证
~/.ssh/authorized_keys
文件中。在客户端上安装由 opensc 软件包提供的 PKCS
efi 库。PKCS
vary 是一个公钥加密标准,它定义了一个应用程序编程接口(API)到名为令牌的加密设备。以 root
用户身份输入以下命令:
~]#
yum install opensc
4.9.4.1. 从卡检索公钥
-D
指令指定共享库(以下示例中的OpenSC)。
~]$
ssh-keygen -D /usr/lib64/pkcs11/opensc-pkcs11.so
ssh-rsa AAAAB3NzaC1yc[...]+g4Mb9
4.9.4.2. 在服务器上存储公钥
smartcard.pub
)并使用 ssh-copy-id 命令进行此操作:
~]$
ssh-copy-id -f -i smartcard.pub user@hostname
user@hostname's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh user@hostname"
and check to make sure that only the key(s) you wanted were added.
SSH_COPY_ID_LEGACY=1
环境变量或 -f
选项。
4.9.4.3. 使用智能卡中的密钥向服务器进行身份验证
[localhost ~]$
ssh -I /usr/lib64/pkcs11/opensc-pkcs11.so hostname Enter PIN for 'Test (UserPIN)':[hostname ~]$
~/.ssh/config
文件中:
Host hostname PKCS11Provider /usr/lib64/pkcs11/opensc-pkcs11.so
[localhost ~]$
ssh hostname Enter PIN for 'Test (UserPIN)':[hostname ~]$
4.9.4.4. 使用 ssh-agent 自动执行 PIN Logging In
~]$
ssh-add -l Could not open a connection to your authentication agent.~]$
eval `ssh-agent`
~]$
ssh-add -s /usr/lib64/pkcs11/opensc-pkcs11.so
Enter PIN for 'Test (UserPIN)':
Card added: /usr/lib64/pkcs11/opensc-pkcs11.so
~]$
ssh-add -e /usr/lib64/pkcs11/opensc-pkcs11.so
Card removed: /usr/lib64/pkcs11/opensc-pkcs11.so
/etc/opensc-x86_64.conf
中的 pin_cache_ignore_user_consent = true
之前删除 # 字符。
4.9.4.5. 其它资源
PKCS
facilities 安全令牌的更多信息,请参阅 pkcs11-tool (1)
手册页。
4.9.5. 可信和加密的密钥
RSA
密钥 密封密钥。
AES
加密,这使其比可信密钥更快。加密的密钥是使用内核生成的随机数字创建的,并在导入到用户空间 Blob 时由主密钥加密。此主密钥可以是可信密钥或用户密钥,它是其主要缺点 - 如果主密钥不是可信密钥,则加密的密钥仅与用于加密它的用户密钥的安全。
4.9.5.1. 使用密钥
- 对于带有
x86_64
架构的 RHEL 内核,TRUSTED_KEYS 和 ENCRYPTED_KEYS 代码作为核心内核代码的一部分构建。因此,x86_64
系统用户可以使用这些密钥,而无需加载 trusted 和 encrypted-keys 模块。 - 对于所有其他架构,需要先加载 trusted 和 encrypted-keys 内核模块,然后才能使用密钥执行任何操作。要载入内核模块,请执行以下命令:
~]# modprobe trusted encrypted-keys
tcsd
守护进程,它们是 TrouSers 套件的一部分,与 TPM 进行通信。
~]$ keyctl add trusted name "new keylength [options]" keyring
~]$ keyctl add trusted kmk "new 32" @u
642500861
kmk
的可信密钥,长度为 32 字节(256 位),并将其放置在用户密钥环中(@u
)。密钥长度为 32 到 128 字节(256 到 1024 位)。使用 show 子命令列出内核密钥环的当前结构:
~]$ keyctl show
Session Keyring
-3 --alswrv 500 500 keyring: _ses
97833714 --alswrv 500 -1 \_ keyring: _uid.1000
642500861 --alswrv 500 500 \_ trusted: kmk
~]$ keyctl pipe 642500861 > kmk.blob
~]$ keyctl add trusted kmk "load `cat kmk.blob`" @u
268728824
~]$ keyctl add encrypted name "new [format] key-type:master-key-name keylength" keyring
~]$ keyctl add encrypted encr-key "new trusted:kmk 32" @u
159771175
~]$ keyctl add user kmk-user "`dd if=/dev/urandom bs=1 count=32 2>/dev/null`" @u
427069434
~]$ keyctl add encrypted encr-key "new user:kmk-user 32" @u
1012412758
~]$ keyctl list @u
2 keys in keyring:
427069434: --alswrv 1000 1000 user: kmk-user
1012412758: --alswrv 1000 1000 encrypted: encr-key
4.9.5.2. 其它资源
安装的文档
- keyctl(1) - 描述 keyctl 工具及其子命令的使用。
在线文档
- Red Hat Enterprise Linux 7 SELinux 用户和管理员指南 - Red Hat Enterprise Linux 7 的 SELinux 用户和管理员指南 介绍了 SELinux 的基本原则,以及如何配置和使用各种服务的 SELinux,如 Apache HTTP 服务器。
- https://www.kernel.org/doc/Documentation/security/keys-trusted-encrypted.txt - 有关 Linux 内核可信和加密密钥功能的官方文档。
另请参阅
- 第 A.1.1 节 “高级加密标准 - AES” 提供有关
高级加密标准
的简明描述。 - 第 A.2 节 “公钥加密” 描述公钥加密方法及其使用的各种加密协议。
4.9.6. 使用随机数字生成器
rngd
守护进程是 rng-tools 软件包的一部分,能够同时使用环境 noise 和硬件随机数字生成器来提取熵。守护进程检查由随机性源提供的数据是否足够随机,然后将其存储在内核的随机的熵池中。它生成的随机数字可以通过 /dev/random
和 / dev/urandom 字符设备
提供。
/dev/random
和 /dev/urandom
之间的区别在于,前者是一个阻塞设备,这意味着它在确定熵的数量不足以生成正确的随机输出时停止提供数字。相反,/dev/urandom
是一个非阻塞源,它重复使用内核的熵池,因此可以提供不受限制的伪随机数字,带有较少的熵。因此,/dev/urandom
不应该用于创建长期加密密钥。
root
用户身份运行以下命令:
~]# yum install rng-tools
rngd
守护进程,请以 root
用户身份执行以下命令:
~]# systemctl start rngd
~]# systemctl status rngd
rngd
守护进程,请直接执行它。例如,要指定随机数字输入的替代源(除 /dev/hwrandom
),请使用以下命令:
~]# rngd --rng-device=/dev/hwrng
/dev/hwrng
作为读取随机数字的设备启动 rngd
守护进程。同样,您可以使用 -o
(或 --random-device
)选项为随机数字输出选择内核设备(不是默认的 /dev/random
)。有关所有可用选项的列表,请查看 rngd(8) 手册页。
root
用户身份执行以下命令:
~]# rngd -vf
Unable to open file: /dev/tpm0
Available entropy sources:
DRNG
-b、--background
选项(成为后台程序)。
~]$ cat /proc/cpuinfo | grep rdrand
/dev/random
输出的随机性级别,请使用 rngtest 工具,如下所示:
~]$ cat /dev/random | rngtest -c 1000
rngtest 5
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 998
rngtest: FIPS 140-2 failures: 2
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 0
rngtest: FIPS 140-2(2001-10-10) Long run: 2
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=1.171; avg=8.453; max=11.374)Mibits/s
rngtest: FIPS tests speed: (min=15.545; avg=143.126; max=157.632)Mibits/s
rngtest: Program run time: 2390520 microseconds
/dev/random
),QEMU 将使用 /dev/random
作为客户机请求的熵源。
图 4.1. virtio RNG 设备
[D]
4.10. 使用基于策略的解密配置加密卷的自动锁定
4.10.1. network-Bound Disk Encryption
图 4.2. 使用 Clevis 和 Tang 的 Network-Bound Disk Encryption
/tmp
、/var
和 /usr/local/
目录,其中包含建立网络连接前需要启动的文件系统,被视为是 root 卷。此外,在网络启动前运行的服务使用的所有挂载点,如 /var/log/
、var/log/audit/
或 /opt
,需要在切换到 root 设备后提前挂载。您还可以通过在 /etc/fstab
文件中没有 _netdev
选项来识别根卷。
4.10.2. 安装加密客户端 - Clevis
root
用户身份输入以下命令:
~]# yum install clevis
~]$ clevis decrypt < JWE > PLAINTEXT
~]$ clevis Usage: clevis COMMAND [OPTIONS] clevis decrypt Decrypts using the policy defined at encryption time clevis encrypt http Encrypts using a REST HTTP escrow server policy clevis encrypt sss Encrypts using a Shamir's Secret Sharing policy clevis encrypt tang Encrypts using a Tang binding server policy clevis encrypt tpm2 Encrypts using a TPM2.0 chip binding policy ~]$ clevis decrypt Usage: clevis decrypt < JWE > PLAINTEXT Decrypts using the policy defined at encryption time ~]$ clevis encrypt tang Usage: clevis encrypt tang CONFIG < PLAINTEXT > JWE Encrypts using a Tang binding server policy This command uses the following configuration properties: url: <string> The base URL of the Tang server (REQUIRED) thp: <string> The thumbprint of a trusted signing key adv: <string> A filename containing a trusted advertisement adv: <object> A trusted advertisement (raw JSON) Obtaining the thumbprint of a trusted signing key is easy. If you have access to the Tang server's database directory, simply do: $ jose jwk thp -i $DBDIR/$SIG.jwk Alternatively, if you have certainty that your network connection is not compromised (not likely), you can download the advertisement yourself using: $ curl -f $URL/adv > adv.jws
4.10.3. 在强制模式中使用 SELinux 部署 Tang 服务器
tangd_port_t
SELinux 类型,Tang 服务器可以在 SELinux enforcing 模式下部署为受限制的服务。
先决条件
- 已安装 policycoreutils-python-utils 软件包及其依赖项。
流程
- 要安装 tang 软件包及其依赖项,请以
root
用户身份输入以下命令:~]# yum install tang
- 选择一个未占用的端口,如 7500/tcp,并允许 tangd 服务绑定到该端口:
~]# semanage port -a -t tangd_port_t -p tcp 7500
请注意,一个端口一次只能由一个服务使用,因此尝试使用已经占用的端口意味着ValueError: Port already defined
错误消息。 - 在防火墙中打开端口:
~]# firewall-cmd --add-port=7500/tcp ~]# firewall-cmd --runtime-to-permanent
- 使用 systemd 启用
tangd
服务:~]# systemctl enable tangd.socket Created symlink from /etc/systemd/system/multi-user.target.wants/tangd.socket to /usr/lib/systemd/system/tangd.socket.
- 创建覆盖文件:
~]# systemctl edit tangd.socket
- 在以下编辑器屏幕中,其打开了位于
/etc/systemd/system/tangd.socket.d/
目录中的一个空override.conf
文件,通过添加以下行将 Tang 服务器的默认端口从 80 改为之前选择的端口号:[Socket] ListenStream= ListenStream=7500
保存文件并退出编辑器。 - 重新载入更改的配置并启动
tangd
服务:~]# systemctl daemon-reload
- 检查您的配置是否正常工作:
~]# systemctl show tangd.socket -p Listen Listen=[::]:7500 (Stream)
- 启动
tangd
服务:~]# systemctl start tangd.socket
tangd
使用了 systemd
套接字激活机制,因此服务器会在第一次连接进来时就立即启动。在第一次启动时会自动生成一组新的加密密钥。
jose (1)
手册页以了解更多信息。
例 4.4. 轮转 Tang 密钥
/var/db/tang
。例如,您可以使用以下命令创建新的签名和交换密钥:
~]# DB=/var/db/tang ~]# jose jwk gen -i '{"alg":"ES512"}' -o $DB/new_sig.jwk ~]# jose jwk gen -i '{"alg":"ECMR"}' -o $DB/new_exc.jwk
.
以将它们隐藏在广告中。请注意,以下示例中的文件名与密钥数据库目录中的实际和唯一的文件名不同。
~]# mv $DB/old_sig.jwk $DB/.old_sig.jwk ~]# mv $DB/old_exc.jwk $DB/.old_exc.jwk
4.10.3.1. 部署高可用性系统
- 客户端冗余(推荐)客户端应配置成能够绑定到多个 Tang 服务器。在此设置中,每个 Tang 服务器都有自己的密钥,客户端可以通过联系这些服务器的子集来进行解密。Clevis 已通过其
sss
插件支持此工作流。有关此设置的详情,请查看以下手册页:tang (8)
, 部分高可用性clevis (1)
, 第 Shamir 的 Secret 共享部分clevis-encrypt-sss(1)
红帽建议对高可用性部署使用这个方法。 - 密钥共享出于冗余的目的,可以部署多个 Tang 实例。要设置第二个或后续实例,请安装 tang 软件包,并使用 rsync 通过 SSH 将密钥目录复制到新主机。请注意,红帽不推荐此方法,因为共享密钥会增加密钥的风险,需要额外的自动化基础设施。
4.10.4. 为带有 Tang 的 NBDE 系统部署加密客户端
先决条件
- Clevis 框架已安装。请查看 第 4.10.2 节 “安装加密客户端 - Clevis”
- Tang 服务器或其下载的公告可用。请查看 第 4.10.3 节 “在强制模式中使用 SELinux 部署 Tang 服务器”
流程
~]$ clevis encrypt tang '{"url":"http://tang.srv"}' < PLAINTEXT > JWE
The advertisement contains the following signing keys:
_OsIk0T-E2l6qjfdDiwVmidoZjA
Do you wish to trust these keys? [ynYN] y
~]$ clevis decrypt < JWE > PLAINTEXT
clevis-encrypt-tang (1)
手册页或使用内置 CLI 帮助:
~]$ clevis Usage: clevis COMMAND [OPTIONS] clevis decrypt Decrypts using the policy defined at encryption time clevis encrypt http Encrypts using a REST HTTP escrow server policy clevis encrypt sss Encrypts using a Shamir's Secret Sharing policy clevis encrypt tang Encrypts using a Tang binding server policy clevis luks bind Binds a LUKSv1 device using the specified policy clevis luks unlock Unlocks a LUKSv1 volume ~]$ clevis decrypt Usage: clevis decrypt < JWE > PLAINTEXT Decrypts using the policy defined at encryption time ~]$ clevis encrypt tang Usage: clevis encrypt tang CONFIG < PLAINTEXT > JWE Encrypts using a Tang binding server policy This command uses the following configuration properties: url: <string> The base URL of the Tang server (REQUIRED) thp: <string> The thumbprint of a trusted signing key adv: <string> A filename containing a trusted advertisement adv: <object> A trusted advertisement (raw JSON) Obtaining the thumbprint of a trusted signing key is easy. If you have access to the Tang server's database directory, simply do: $ jose jwk thp -i $DBDIR/$SIG.jwk Alternatively, if you have certainty that your network connection is not compromised (not likely), you can download the advertisement yourself using: $ curl -f $URL/adv > adv.jws
4.10.5. 使用 TPM 2.0 策略部署加密客户端
~]$ clevis encrypt tpm2 '{}' < PLAINTEXT > JWE
~]$ clevis encrypt tpm2 '{"hash":"sha1","key":"rsa"}' < PLAINTEXT > JWE
~]$ clevis decrypt < JWE > PLAINTEXT
~]$ clevis encrypt tpm2 '{"pcr_bank":"sha1","pcr_ids":"0,1"}' < PLAINTEXT > JWE
clevis-encrypt-tpm2 (1)
手册页。
4.10.6. 配置根卷的手动注册
~]# yum install clevis-luks
~]# clevis luks bind -d /dev/sda tang '{"url":"http://tang.srv"}'
The advertisement contains the following signing keys:
_OsIk0T-E2l6qjfdDiwVmidoZjA
Do you wish to trust these keys? [ynYN] y
You are about to initialize a LUKS device for metadata storage.
Attempting to initialize it may result in data loss if data was
already written into the LUKS header gap in a different format.
A backup is advised before initialization is performed.
Do you wish to initialize /dev/sda? [yn] y
Enter existing LUKS password:
- 使用与 LUKS 主密钥相同的无序状态测量法创建新的密钥。
- 使用 Clevis 加密新密钥.
- 使用 LUKSMeta 将 Clevis JWE 对象存储在 LUKS 标头中。
- 启用与 LUKS 一起使用的新密钥。
clevis-luks-bind (1)
手册页。
~]# luksmeta show -d /dev/sda
0 active empty
1 active cb6e8904-81ff-40da-a84a-07ab9ab5715e
2 inactive empty
3 inactive empty
4 inactive empty
5 inactive empty
6 inactive empty
7 inactive empty
~]# yum install clevis-dracut ~]# dracut -f --regenerate-all
~]# dracut -f --regenerate-all --kernel-cmdline "ip=192.0.2.10 netmask=255.255.255.0 gateway=192.0.2.1 nameserver=192.0.2.45"
/etc/dracut.conf.d/
目录中创建 一个带有静态网络信息的.conf 文件。例如:
~]# cat /etc/dracut.conf.d/static_ip.conf
kernel_cmdline="ip=10.0.0.103 netmask=255.255.252.0 gateway=10.0.0.1 nameserver=10.0.0.1"
~]# dracut -f --regenerate-all
dracut.cmdline (7)
手册页。
4.10.7. 使用 Kickstart 配置自动注册
- 指示 Kickstart 对磁盘进行分区,以便使用临时密码为所有挂载点(除
/boot
)启用了 LUKS 加密。注册过程的这一步中的密码是临时密码。part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --grow --encrypted --passphrase=temppass
请注意,OSPP-complaint 系统需要更复杂的配置,例如:part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --size=2048 --encrypted --passphrase=temppass part /var --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass part /tmp --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass part /home --fstype="xfs" --ondisk=vda --size=2048 --grow --encrypted --passphrase=temppass part /var/log --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass part /var/log/audit --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass
- 通过在
%packages
部分中列出它们来安装相关的 Clevis 软件包:%packages clevis-dracut %end
- 在
%post
部分中调用 clevis luks bind 来执行绑定。之后,删除临时密码:%post clevis luks bind -f -k- -d /dev/vda2 \ tang '{"url":"http://tang.srv","thp":"_OsIk0T-E2l6qjfdDiwVmidoZjA"}' \ <<< "temppass" cryptsetup luksRemoveKey /dev/vda2 <<< "temppass" %end
在上例中,请注意,我们指定在 Tang 服务器上信任的 thumbprint 作为绑定配置的一部分,从而允许绑定完全非交互式。在使用 TPM 2.0 策略而不是 Tang 服务器时,您可以使用类似的流程。
4.10.8. 配置可移动存储设备的自动锁定
~]# yum install clevis-udisks2
~]# clevis luks bind -d /dev/sdb1 tang '{"url":"http://tang.srv"}'
~]# clevis luks unlock -d /dev/sdb1
4.10.9. 在引导时配置非 root 卷的自动锁定
- 安装 clevis-systemd 软件包:
~]# yum install clevis-systemd
- 启用 Clevis unlocker 服务:
~]# systemctl enable clevis-luks-askpass.path Created symlink from /etc/systemd/system/remote-fs.target.wants/clevis-luks-askpass.path to /usr/lib/systemd/system/clevis-luks-askpass.path.
- 使用 clevis luks bind 命令执行绑定步骤,如 第 4.10.6 节 “配置根卷的手动注册” 所述。
- 要在系统引导过程中设置加密块设备,请将带有
_netdev
选项的对应行添加到/etc/crypttab
配置文件中。详情请查看crypttab (5)
手册页。 - 将卷添加到
/etc/fstab
文件中可访问文件系统的列表。此配置文件中也使用_netdev
选项。详情请查看fstab (5)
手册页。
4.10.10. 在 NBDE 网络中部署虚拟机
4.10.11. 使用 NBDE 为云环境构建可自动注册的虚拟机镜像
4.10.12. 其它资源
tang(8)
clevis (1)
jose(1)
clevis-luks-unlockers(1)
tang-nagios(1)
4.11. 使用 AIDE检查完整性
4.11.1. 安装 AIDE
root
用户身份输入以下命令:
~]# yum install aide
root
用户身份输入以下命令:
~]# aide --init
AIDE, version 0.15.1
### AIDE database at /var/lib/aide/aide.db.new.gz initialized.
/etc/aide.conf
文件中定义的一组目录和文件。要在 AIDE 数据库中包含其他目录或文件,并更改其监视的参数,请相应地编辑 /etc/aide.conf
。
.new
子字符串:
~]# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
/etc/aide.conf
文件并修改 DBDIR
值。要获得额外的安全性,请将数据库、配置和 /usr/sbin/aide
二进制文件存储在安全的位置,如只读介质。
4.11.2. 执行完整性检查
root
用户身份输入以下命令:
~]# aide --check
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2017-03-30 14:12:56
Summary:
Total number of files: 147173
Added files: 1
Removed files: 0
Changed files: 2
...
/etc/crontab
:
05 4 * * * root /usr/sbin/aide --check
4.11.3. 更新 AIDE 数据库
~]# aide --update
/var/lib/aide/aide.db.new.gz
数据库文件。要开始使用它进行完整性检查,请从文件名中删除 .new
子字符串。
4.11.4. 其它资源
aide(1)
手册页aide.conf(5)
man page
4.12. 使用 USBGuard
- 带有进程间通信(IPC)接口的守护进程组件,用于动态交互和策略强制执行。
- 与正在运行的 USBGuard 实例交互的命令行界面。
- 编写 USB 设备授权策略的规则语言。
- 用于与共享库中实施的守护进程交互的 C++ API。
4.12.1. 安装 USBGuard
root
用户身份输入以下命令:
~]# yum install usbguard
root
用户身份输入以下命令:
~]# usbguard generate-policy > /etc/usbguard/rules.conf
/etc/usbguard/rules.conf
文件。详情请查看 usbguard-rules.conf (5)
手册页。另外,请参阅 第 4.12.3 节 “使用规则语言创建您自己的策略”。
root
用户身份输入以下命令:
~]# systemctl start usbguard.service ~]# systemctl status usbguard ● usbguard.service - USBGuard daemon Loaded: loaded (/usr/lib/systemd/system/usbguard.service; disabled; vendor preset: disabled) Active: active (running) since Tue 2017-06-06 13:29:31 CEST; 9s ago Docs: man:usbguard-daemon(8) Main PID: 4984 (usbguard-daemon) CGroup: /system.slice/usbguard.service └─4984 /usr/sbin/usbguard-daemon -k -c /etc/usbguard/usbguard-daem...
root
用户身份运行以下命令:
~]# systemctl enable usbguard.service
Created symlink from /etc/systemd/system/basic.target.wants/usbguard.service to /usr/lib/systemd/system/usbguard.service.
root
用户身份输入以下命令:
~]# usbguard list-devices
1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00
...
6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50
allow-device
选项:
~]# usbguard allow-device 6
reject-device
选项。要只取消授权设备,请使用带有 block-device
选项的 usbguard 命令:
~]# usbguard block-device 6
- block - 暂时不要与这个设备通信
- reject - 忽略这个设备,就像不存在一样
--help
指令输入它:
~]$ usbguard --help
4.12.2. 创建白名单列表和黑名单列表
usbguard-daemon.conf
文件由 usbguard
守护进程加载,在解析其命令行选项后,用于配置守护进程的运行时参数。要覆盖默认配置文件(/etc/usbguard/usbguard-daemon.conf
),请使用 -c
命令行选项。详情请查看 usbguard-daemon (8)
手册页。
usbguard-daemon.conf
文件并使用以下选项:
usbguard 配置文件
RuleFile=
<path>usbguard
守护进程使用此文件从中加载策略规则集,并编写通过 IPC 接口接收的新规则。IPCAllowedUsers=
<username> [<username> ...]- 守护进程将接受来自的 IPC 连接的用户名列表。
IPCAllowedGroups=
<groupname> [<groupname> ...]- 守护进程将接受来自的 IPC 连接的组名称列表。
IPCAccessControlFiles=
<path>- 保存 IPC 访问控制文件的目录的路径。
ImplicitPolicyTarget=
<target>- 如何对待策略中的任何规则都不匹配的设备。接受的值: allow、block、reject。
PresentDevicePolicy=
<policy>- 如何处理守护进程启动时已连接的设备:
- Allow - 授权每个存在的设备
- block - 取消授权每个存在的设备
- reject - 删除每个存在的设备
- keep - 只同步内部状态并保留它
- apply-policy - 评估每个存在设备的规则集
PresentControllerPolicy=
<policy>- 如何处理守护进程启动时已连接的 USB 控制器:
- Allow - 授权每个存在的设备
- block - 取消授权每个存在的设备
- reject - 删除每个存在的设备
- keep - 只同步内部状态并保留它
- apply-policy - 评估每个存在设备的规则集
例 4.5. usbguard 配置
usbguard
守护进程从 /etc/usbguard/rules.conf
文件中加载规则,它只允许 usbguard
组中的用户使用 IPC 接口:
RuleFile=/etc/usbguard/rules.conf IPCAccessControlFiles=/etc/usbguard/IPCAccessControl.d/
usbguard (1)
。在本例中,要允许 usbguard
组中的用户修改 USB 设备授权状态、列出 USB 设备、侦听异常事件以及列出 USB 授权策略,请以 root
用户身份输入以下命令:
~]# usbguard add-user -g usbguard --devices=modify,list,listen --policy=list --exceptions=listen
root
用户。考虑设置 IPCAccessControlFiles
选项(推荐)或 IPCAllowedUsers
和 IPCAllowedGroups
选项,来限制对 IPC 接口的访问。不要将 ACL 保留为未配置,因为这会向所有本地用户公开 IPC 接口,并允许他们操作 USB 设备的授权状态并修改 USBGuard 策略。
usbguard-daemon.conf (5)
手册页中的 IPC 访问控制部分。
4.12.3. 使用规则语言创建您自己的策略
usbguard
守护进程决定是否根据一组规则定义的策略授权 USB 设备。当 USB 设备插入系统时,守护进程会按顺序扫描现有规则,并在找到匹配规则时,根据规则目标授权(allows)、取消授权(阻止)或删除(拒绝)设备。如果没有找到匹配的规则,则决定基于隐式默认目标。这个隐式默认为阻止设备,直到用户做出决定。
rule ::= target device_id device_attributes conditions. target ::= "allow" | "block" | "reject". device_id ::= "*:*" | vendor_id ":*" | vendor_id ":" product_id. device_attributes ::= device_attributes | attribute. device_attributes ::= . conditions ::= conditions | condition. conditions ::= .
usbguard-rules.conf (5)
手册页。
例 4.6. usbguard 示例策略
- 允许 USB mass 存储设备以及阻止所有其他设备
- 这个策略会阻止任何不仅仅是一个大容量存储设备的设备。USB 闪存磁盘中带有隐藏键盘接口的设备被阻止。只有具有单个大容量存储接口的设备才能与操作系统交互。该策略由一个规则组成:
allow with-interface equals { 08:*:* }
阻塞是隐式的,因为没有块规则。隐式阻止对桌面用户很有用,因为侦听 USBGuard 事件的桌面小程序可以询问用户是否为设备选择了隐式目标。 - 允许通过特定端口连接特定的 Yubikey 设备
- 拒绝该端口上的所有其他操作。
allow 1050:0011 name "Yubico Yubikey II" serial "0001234567" via-port "1-2" hash "044b5e168d40ee0245478416caf3d998" reject via-port "1-2"
- 拒绝具有可疑接口组合的设备
- 实施键盘或网络接口的 USB 闪存磁盘非常可疑。以下一组规则形成了一个策略,它允许 USB 闪存磁盘,并使用额外的可疑接口明确拒绝设备。
allow with-interface equals { 08:*:* } reject with-interface all-of { 08:*:* 03:00:* } reject with-interface all-of { 08:*:* 03:01:* } reject with-interface all-of { 08:*:* e0:*:* } reject with-interface all-of { 08:*:* 02:*:* }
注意黑名单是错误的方法,您不应该只将一组设备列入黑名单,并允许其余设备。上面的策略假定阻止是隐式默认值。拒绝一组设备被视为"bad"是一种良好的方法,如何将系统暴露限制尽可能多。 - 允许只使用键盘的 USB 设备
- 只有已经允许使用键盘接口的 USB 设备时,以下规则才允许键盘 USB 设备。
allow with-interface one-of { 03:00:01 03:01:01 } if !allowed-matches(with-interface one-of { 03:00:01 03:01:01 })
/etc/usbguard/rules.conf
来自定义 USBGuard 策略规则。
~]$ usbguard generate-policy > rules.conf ~]$ vim rules.conf
~]# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
4.12.4. 其它资源
usbguard (1)
手册页usbguard-rules.conf(5)
man pageusbguard-daemon (8)
手册页usbguard-daemon.conf(5)
man page
4.13. 强化 TLS 配置
TLS
(传输层安全
)是用于保护网络通信的加密协议。当通过配置首选 密钥交换协议、身份验证方法 和 加密算法 来强化系统安全设置时,需要注意支持的客户端的范围越大,生成的安全性较低。相反,严格的安全设置会导致与客户端的兼容性受限,这可能导致某些用户被锁定在系统之外。请确保以最严格的可用配置为目标,并且仅在出于兼容性原因需要时才放宽配置。
TLS
实现尽可能使用安全算法,而不阻止来自或到旧客户端或服务器的连接。在满足严格的安全要求的环境中应用此部分中描述的强化设置,其中不支持安全算法或协议的旧客户端或服务器无法连接或允许连接。
4.13.1. 选择启用算法
协议版本
TLS
的最新版本提供最佳安全机制。除非有充分的理由包含对旧版本的 TLS
(甚至 SSL
)的支持,否则允许您的系统只使用最新版本的 TLS
来协商连接。
SSL
版本 2 或 3 协商。两个版本都有严重的安全漏洞。只允许使用 TLS
版本 1.0 或更高版本的协商。当前版本的 TLS
1.2 应始终是首选的。
TLS
扩展、特定密码(请参阅以下)和其他临时解决方案。所有 TLS
连接对等点都需要实施安全重新协商指示(RFC 5746),且必须对 CBC
-mode 密码(Lucky Thirteen 攻击)实施缓解时间攻击。TLS 1.0
客户端还需要额外实施记录分割(针对EAST 攻击的临时解决方案)。TLS 1.2
支持通过关联数据 (AEAD)模式密码进行身份验证加密,如 AES-GCM
、AES-CCM
或 Camellia-GCM
,它们没有已知的问题。所有上述缓解方案均在 Red Hat Enterprise Linux 中包含的加密库中实现。
协议版本 | 使用建议 |
---|---|
SSL v2 |
不要使用。具有严重的安全漏洞。
|
SSL v3 |
不要使用。具有严重的安全漏洞。
|
TLS 1.0 |
在需要时用于互操作性.已知的无法以保证互操作性的方式缓解的问题,因此不会默认启用缓解方案。不支持现代加密套件。
|
TLS 1.1 |
在需要时用于互操作性.没有已知问题,但依赖于 Red Hat Enterprise Linux 中的所有
TLS 实现中包含的协议修复。不支持现代加密套件。
|
TLS 1.2 |
推荐的版本。支持现代
AEAD 密码套件。
|
TLS 1.0
,即使它们支持 TLS 1.1
甚至 1.2
。这是尝试实现最高级别的互操作性和外部服务(可能不支持最新版本的 TLS
)的动机。根据您的互操作性要求,启用最高可用的 TLS
版本。
SSL v3
。但是,如果事实上,虽然它被视为不安全且不适合用于常规用途,但绝对必须保持 SSL v3
启用。有关如何使用 stunnel 安全地加密通信的说明,即使使用了不支持加密的服务,或者只能使用过时的、不安全的加密模式。第 4.8 节 “使用 stunnel”
密码套件
RC4
或 HMAC-MD5
的密码套件也应被禁用。这同样适用于所谓的 导出 密码套件,它们被有意较弱,因此很容易中断。
3DES
密码公告使用 168 位,但它们实际上提供了 112 位的安全性。
RSA
密钥交换,但允许使用 ECDHE
和 DHE
。在两者中,ECDHE
速度更快,因此首选。
CBC
-mode 密码之前优先使用 AEAD
密码,如 AES-GCM
,因为它们不会受到 padding oracle 攻击的影响。另外,在很多情况下,AES-GCM
比 CBC
模式的 AES
快,特别是在硬件具有 AES
加密加速器时。
ECDSA
证书的 ECDHE
密钥交换时,事务的速度甚至比纯 RSA
密钥交换要快。要支持旧客户端,您可以在服务器上安装两对证书和密钥:一对带有 ECDSA
密钥(用于新客户端),以及一个带有 RSA
密钥(用于旧密钥)。
公钥长度
RSA
密钥时,总是首选使用至少由 SHA-256 签名的 3072 位的密钥长度,对于真实的 128 位安全性来说,这个密钥长度足够大。
4.13.2. 使用 TLS 的实现
TLS
实现。本节描述了 OpenSSL 和 GnuTLS 的配置。有关如何在独立应用程序中配置 TLS
支持的说明,请参阅 第 4.13.3 节 “配置特定应用程序”。
TLS
实现支持各种 密码套件,用于定义建立和使用 TLS
-secured 通信时附带的所有元素。
TLS
实现或升级使用该实现的应用程序后检查您的设置。新版本可能会引入您不希望启用的新密码套件,并且当前配置没有禁用。
4.13.2.1. 在 OpenSSL 中使用 Cipher Suites
SSL
和 TLS
协议。在 Red Hat Enterprise Linux 7 中,配置文件在 /etc/pki/tls/openssl.cnf
中提供。这个配置文件的格式在 config(1) 中进行了描述。另请参阅 第 4.7.9 节 “配置 OpenSSL”。
~]$ openssl ciphers -v 'ALL:COMPLEMENTOFALL'
HIGH
组的套件,请使用以下命令:
~]$ openssl ciphers -v 'HIGH'
~]$ openssl ciphers -v 'kEECDH+aECDSA+AES:kEECDH+AES+aRSA:kEDH+aRSA+AES' | column -t
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384
ECDHE-ECDSA-AES256-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256
ECDHE-ECDSA-AES128-SHA SSLv3 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384
ECDHE-RSA-AES256-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256
ECDHE-RSA-AES128-SHA SSLv3 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(256) Mac=SHA256
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(128) Mac=SHA256
DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1
临时的 elliptic curve Diffie-Hellman
密钥交换和 ECDSA
密码,并省略 RSA
密钥交换(确保 完美的转发保密)。
4.13.2.2. 在 GnuTLS 中使用 Cipher Suites
SSL
和 TLS
协议和相关技术的通信库。
-l
(或 --list
)选项的 gnutls-cli 命令列出所有支持的密码套件:
~]$ gnutls-cli -l
-l
选项显示的密码套件列表,请将一个或多个参数(称为 GnuTLS 文档中的 优先级字符串 和 关键字 )传给 --priority
选项。有关所有可用优先级字符串的列表,请参阅 http://www.gnutls.org/manual/gnutls.html#Priority-Strings 中的 GnuTLS 文档。例如,运行以下命令来获取提供至少 128 位安全性的密码套件列表:
~]$ gnutls-cli --priority SECURE128 -l
~]$ gnutls-cli --priority SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC -l
Cipher suites for SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC
TLS_ECDHE_ECDSA_AES_256_GCM_SHA384 0xc0, 0x2c TLS1.2
TLS_ECDHE_ECDSA_AES_256_CBC_SHA384 0xc0, 0x24 TLS1.2
TLS_ECDHE_ECDSA_AES_256_CBC_SHA1 0xc0, 0x0a SSL3.0
TLS_ECDHE_ECDSA_AES_128_GCM_SHA256 0xc0, 0x2b TLS1.2
TLS_ECDHE_ECDSA_AES_128_CBC_SHA256 0xc0, 0x23 TLS1.2
TLS_ECDHE_ECDSA_AES_128_CBC_SHA1 0xc0, 0x09 SSL3.0
TLS_ECDHE_RSA_AES_256_GCM_SHA384 0xc0, 0x30 TLS1.2
TLS_ECDHE_RSA_AES_256_CBC_SHA1 0xc0, 0x14 SSL3.0
TLS_ECDHE_RSA_AES_128_GCM_SHA256 0xc0, 0x2f TLS1.2
TLS_ECDHE_RSA_AES_128_CBC_SHA256 0xc0, 0x27 TLS1.2
TLS_ECDHE_RSA_AES_128_CBC_SHA1 0xc0, 0x13 SSL3.0
TLS_DHE_RSA_AES_256_CBC_SHA256 0x00, 0x6b TLS1.2
TLS_DHE_RSA_AES_256_CBC_SHA1 0x00, 0x39 SSL3.0
TLS_DHE_RSA_AES_128_GCM_SHA256 0x00, 0x9e TLS1.2
TLS_DHE_RSA_AES_128_CBC_SHA256 0x00, 0x67 TLS1.2
TLS_DHE_RSA_AES_128_CBC_SHA1 0x00, 0x33 SSL3.0
Certificate types: CTYPE-X.509
Protocols: VERS-TLS1.2
Compression: COMP-NULL
Elliptic curves: CURVE-SECP384R1, CURVE-SECP521R1, CURVE-SECP256R1
PK-signatures: SIGN-RSA-SHA384, SIGN-ECDSA-SHA384, SIGN-RSA-SHA512, SIGN-ECDSA-SHA512, SIGN-RSA-SHA256, SIGN-DSA-SHA256, SIGN-ECDSA-SHA256
RSA
密钥交换和 DSS
身份验证。
4.13.3. 配置特定应用程序
TLS
提供自己的配置机制。本节介绍了最常用的服务器应用程序所使用的与 TLS
相关的配置文件,并提供典型配置示例。
4.13.3.1. 配置 Apache HTTP 服务器
TLS
的需求。根据您选择的 TLS
库,您需要安装 mod_ssl 或 mod_nss 模块(由 eponymous 软件包提供)。例如,要安装提供 OpenSSL mod_ssl 模块的软件包,请以 root 身份运行以下命令:
~]# yum install mod_ssl
/etc/httpd/conf.d/ssl.conf
配置文件,该文件可用于修改 Apache HTTP Server 的与 TLS
相关的设置。同样,mod_nss 软件包会安装 /etc/httpd/conf.d/nss.conf
配置文件。
TLS
配置。/etc/httpd/conf.d/ssl.conf
配置文件中的指令在 /usr/share/httpd/manual/mod_ssl.html
中进行了详细介绍。各种设置示例位于 /usr/share/httpd/manual/ssl/ssl_howto.html
。
/etc/httpd/conf.d/ssl.conf
配置文件中的设置时,请确保至少考虑以下三个指令:
-
SSLProtocol
- 使用这个指令指定您要允许的
TLS
版本(或SSL
)。 -
SSLCipherSuite
- 使用这个指令来指定您首选的密码套件或禁用您要禁止的密码套件。
-
SSLHonorCipherOrder
- 取消注释并将此指令设置为
on
,以确保连接的客户端遵循您指定的密码顺序。
SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite HIGH:!aNULL:!MD5 SSLHonorCipherOrder on
/etc/httpd/conf.d/nss.conf
配置文件。mod_nss 模块派生自 mod_ssl,因此它与它共享许多功能,而不用配置文件结构以及可用的指令共享。请注意,mod_nss 指令的前缀为 NSS
而不是 SSL
。有关 mod_nss 的信息的概述信息,包括不适用于 mod_nss 的 mod_ssl 配置指令列表。https://git.fedorahosted.org/cgit/mod_nss.git/plain/docs/mod_nss.html
4.13.3.2. 配置 Dovecot 邮件服务器
TLS
,请修改 /etc/dovecot/conf.d/10-ssl.conf
配置文件。您可以在 /usr/share/doc/dovecot-2.2.10/wiki/SSL.DovecotConfiguration.txt
中找到该文件中一些基本配置指令的说明(此帮助文件与 Dovecot的标准安装一起安装)。
/etc/dovecot/conf.d/10-ssl.conf
配置文件中的设置时,请确保至少考虑以下三个指令:
-
ssl_protocols
- 使用这个指令指定您要允许的
TLS
版本(或SSL
)。 -
ssl_cipher_list
- 使用这个指令指定您首选的密码套件或禁用您要禁止的密码套件。
-
ssl_prefer_server_ciphers
- 取消注释并将此指令设置为
yes
,以确保连接的客户端遵循您指定的密码顺序。
ssl_protocols = !SSLv2 !SSLv3 ssl_cipher_list = HIGH:!aNULL:!MD5 ssl_prefer_server_ciphers = yes
4.13.4. 其它信息
安装的文档
- config(1) - 描述
/etc/ssl/openssl.conf
配置文件的格式。 - ciphers(1) - 包含可用 OpenSSL 关键字和密码字符串的列表。
/usr/share/httpd/manual/mod_ssl.html
- 包含对 Apache HTTP 服务器 使用的 mod_ssl
模块使用的 /etc/httpd/conf.d/ ssl.conf 配置文件中提供的指令的详细描述。/usr/share/httpd/manual/ssl/ssl_howto.html
- 在 Apache HTTP 服务器的 mod_ssl
/conf.d/ ssl.conf 配置文件中包含实际设置的实际示例。/usr/share/doc/dovecot-2.2.10/wiki/SSL.DovecotConfiguration.txt
- 解释 Dovecot 邮件服务器使用的/etc/dovecot/conf.d/10-ssl.conf
配置文件中提供的一些基本配置指令。
在线文档
- Red Hat Enterprise Linux 7 SELinux 用户和管理员指南 - Red Hat Enterprise Linux 7 的 SELinux 用户和管理员指南 介绍了 SELinux 的基本原则,以及如何配置和使用各种服务的 SELinux,如 Apache HTTP 服务器。
另请参阅
- 第 4.7 节 “使用 OpenSSL” 除其他方面,如何使用 OpenSSL 创建和管理密钥、生成证书以及加密和解密文件。
4.15. 使用 MACsec
媒体访问控制安全性
(MACsec
、IEEE 802.1AE)使用 GCM-AES-128 算法加密并验证 LAN 中的所有流量。MACsec
不仅可以保护 IP
,还可以保护地址解析协议(ARP)、邻居发现(ND)或 DHCP
。虽然 IPsec
在网络层(层 3)和 SSL
或 TLS
上运行,但 MACsec 在应用程序层(层 7)上运行,但 MACsec
在数据链路层(层 2)中运行。将 MACsec
与其它网络层的安全协议相结合,以利用这些标准提供的不同安全功能。
4.16. 使用 清理安全地删除数据
~]# yum install scrub
-
字符或块设备
- 与整个磁盘对应的 特殊文件 会被清理,并销毁它上的所有数据。这是最有效的方法。
scrub [OPTIONS] special file
-
File
- 常规文件会被清理,且仅销毁文件中的数据。
scrub [OPTIONS] file
-
目录
- 使用
-X
选项时,会创建目录并填充文件,直到文件系统已满为止。然后,文件在文件模式中清理为。scrub
-X
[OPTIONS] directory
例 4.7. 清理原始设备
~]# scrub /dev/sdf1
scrub: using NNSA NAP-14.1-C patterns
scrub: please verify that device size below is correct!
scrub: scrubbing /dev/sdf1 1995650048 bytes (~1GB)
scrub: random |................................................|
scrub: random |................................................|
scrub: 0x00 |................................................|
scrub: verify |................................................|
例 4.8. 清理文件
- 创建一个 1MB 文件:
~]$ base64 /dev/urandom | head -c $[ 1024*1024 ] > file.txt
- 显示文件大小:
~]$ ls -lh total 1.0M -rw-rw-r--. 1 username username 1.0M Sep 8 15:23 file.txt
- 显示文件的内容:
~]$ head
-1
file.txt JnNpaTEveB/IYsbM9lhuJdw+0jKhwCIBUsxLXLAyB8uItotUlNHKKUeS/7bCRKDogEP+yJm8VQkL - 清理文件:
~]$ scrub file.txt scrub: using NNSA NAP-14.1-C patterns scrub: scrubbing file.txt 1048576 bytes (~1024KB) scrub: random |................................................| scrub: random |................................................| scrub: 0x00 |................................................| scrub: verify |................................................|
- 验证文件内容是否已清理:
~]$ cat file.txt SCRUBBED!
- 验证文件大小是否保持不变:
~]$ ls -lh total 1.0M -rw-rw-r--. 1 username username 1.0M Sep 8 15:24 file.txt
第 5 章 使用防火墙
5.1. firewalld
入门
firewalld
是一个防火墙服务守护进程,通过 D-Bus
接口提供动态可自定义的基于主机的防火墙。如果是动态的,它可在每次修改规则时启用、修改和删除规则,而不需要在每次修改规则时重启防火墙守护进程。
firewalld
使用 区域和服务 的概念来简化流量管理。zones 是预定义的规则集。网络接口和源可以分配给区。允许的流量取决于您计算机连接到的网络,并分配了这个网络的安全级别。防火墙服务是预定义的规则,覆盖了允许特定服务进入流量的所有必要设置,并在区中应用。
firewalld
会阻止未明确设置为打开的端口上的所有流量。一些区(如 可信 区)默认允许所有流量。
图 5.1. 防火墙堆栈
[D]
5.1.1. Zones
firewalld
来将网络划分为不同的区。一个连接只能是一个区的一部分,但一个区可以被用来进行很多网络连接。
firewalld
。您可以使用 firewall-config 工具或 firewall-cmd 命令行工具为 NetworkManager 分配区域。后两个只编辑适当的 NetworkManager 配置文件。如果您使用 firewall-cmd 或 firewall-config 更改接口区,则请求会转发到 NetworkManager,且不会由firewalld
处理。
/usr/lib/firewalld/zones/
目录中,并可立即应用到任何可用的网络接口。只有在修改后,这些文件才会被拷贝到 /etc/firewalld/zones/
目录中。下表描述了预定义区的默认设置:
block
- 任何传入的网络连接都会被拒绝,并显示
IPv4
的 icmp-host-prohibited 消息,对于IPv6
的 icmp6-adm-prohibited 消息。只有从系统启动的网络连接才能进行。 dmz
- 对于您的非企业化区里的计算机来说,这些计算机可以被公开访问,且有限访问您的内部网络。只接受所选的入站连接。
-
drop
- 所有传入的网络数据包都会丢失,没有任何通知。只有外发网络连接也是可行的。
external
- 适用于启用了伪装的外部网络,特别是路由器。您不信任网络中的其他计算机不会损害您的计算机。只接受所选的入站连接。
home
- 用于家用,因为您可以信任其他计算机。只接受所选的入站连接。
internal
- 当您主要信任网络中的其他计算机时,供内部网络使用。只接受所选的入站连接。
public
- 可用于您不信任网络中其他计算机的公共区域。只接受所选的入站连接。
trusted
- 所有网络连接都被接受。
work
- 可用于您主要信任网络中其他计算机的工作。只接受所选的入站连接。
firewalld
中的默认区被设为 public
区。默认区可以被修改。
5.1.2. 预定义的服务
firewalld.service (5)
手册页中进行了描述。服务通过单独的 XML 配置文件来指定,这些文件采用以下格式命名:service-name.xml
。协议名称优先于 firewalld
中的服务或应用程序名称。
5.1.3. 运行时和永久设置
firewalld
运行时应用。当 firewalld
重启时,设置会恢复到其 永久 值。
--permanent
选项再次应用它们。或者,若要在 firewalld
运行时保留更改,请使用 --runtime-to-permanent
firewall-cmd 选项。
firewalld
只使用 --permanent
选项运行时设置规则,则在重启 firewalld
前它们不会生效。但是,重启 firewalld
会关闭所有打开的端口,并停止网络流量。
5.1.4. 使用 CLI 修改运行时和永久配置中的设置
--permanent
选项。
~]# firewall-cmd --permanent <other options>
- 更改运行时设置,然后将其持久化,如下:
~]# firewall-cmd <other options> ~]# firewall-cmd --runtime-to-permanent
- 设置永久性设置并将设置重新载入运行时模式:
~]# firewall-cmd --permanent <other options> ~]# firewall-cmd --reload
--timeout
选项。在指定时间后,任何更改都会恢复到之前的状态。使用此选项排除 --permanent
选项。
SSH
服务添加 15 分钟:
~]# firewall-cmd --add-service=ssh --timeout 15m
5.2. 安装 firewall-config GUI 配置工具
root
用户身份安装 firewall-config 软件包:
~]# yum install firewall-config
Software
来启动 软件源 应用程序。在搜索框中输入 firewall
,在右上角选择搜索按钮后会出现。从搜索结果中选择 项,然后点 按钮。
firewall
,然后按 Enter。
5.3. 查看 firewalld
的当前状态和设置
5.3.1. 查看 firewalld
的当前状态
firewalld
会在系统上安装。使用 firewalld
CLI 接口来检查该服务是否正在运行。
~]# firewall-cmd --state
~]# systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor pr
Active: active (running) since Mon 2017-12-18 16:05:15 CET; 50min ago
Docs: man:firewalld(1)
Main PID: 705 (firewalld)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/firewalld.service
└─705 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid
firewalld
以及哪些规则被强制使用。要显示防火墙设置,请查看 第 5.3.2 节 “查看当前的 firewalld
设置”
5.3.2. 查看当前的 firewalld
设置
5.3.2.1. 使用 GUI 查看允许的服务
~]$ firewall-config
图 5.2. firewall-config 中的 Services 选项卡
[D]
5.3.2.2. 使用 CLI 查看 firewalld
设置
list-all
选项显示 firewalld
设置的完整概述。
Firewalld
使用区来管理流量。如果没有通过 --zone
选项指定区,则该命令在分配给活跃网络接口和连接的默认区中有效。
~]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
--zone=zone-name
参数,例如:
~]# firewall-cmd --list-all --zone=home
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh mdns samba-client dhcpv6-client
... [output truncated]
firewalld
手册页或获取选项列表:
~]# firewall-cmd --help
Usage: firewall-cmd [OPTIONS...]
General Options
-h, --help Prints a short help text and exists
-V, --version Print the version string of firewalld
-q, --quiet Do not print status messages
Status Options
--state Return and print firewalld state
--reload Reload firewall and keep state information
... [output truncated]
~]# firewall-cmd --list-services
ssh dhcpv6-client
SSH
服务,firewalld
为该服务打开所需的端口(22)。之后,如果您列出允许的服务,列表会显示 SSH
服务,但如果列出开放的端口,则不会显示任何内容。因此,建议您使用 --list-all
选项来确保您收到完整的信息。
5.4. 启动 firewalld
firewalld
,请以 root
用户身份输入以下命令:
~]# systemctl unmask firewalld ~]# systemctl start firewalld
firewalld
在系统启动时自动启动,请以 root
用户身份输入以下命令:
~]# systemctl enable firewalld
5.5. 停止 firewalld
firewalld
,请以 root
用户身份输入以下命令:
~]# systemctl stop firewalld
firewalld
在系统启动时自动启动,请以 root
用户身份输入以下命令:
~]# systemctl disable firewalld
D-Bus
接口以及其他服务需要 firewalld
来确保 firewalld
没有启动,请以 root
用户身份输入以下命令:
~]# systemctl mask firewalld
5.6. 控制流量
5.6.1. 预定义的服务
/etc/firewalld/services/
目录中的 XML 文件。如果用户没有添加或更改服务,则在 /etc/firewalld/services/
中找不到相应的 XML 文件。如果要添加或更改服务,则 /usr/lib/firewalld/services/
目录中的文件可用作模板。
5.6.2. 使用 CLI 禁用发生时的所有流量
~]# firewall-cmd --panic-on
~]# firewall-cmd --panic-off
~]# firewall-cmd --query-panic
5.6.3. 使用 CLI 使用预定义的服务控制流量
firewalld
中添加预定义的服务。这会打开所有必需的端口并根据 服务定义文件 修改其他设置。
- 检查该服务是否还未被允许:
~]# firewall-cmd --list-services ssh dhcpv6-client
- 列出所有预定义的服务:
~]# firewall-cmd --get-services RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ... [output truncated]
- 在允许的服务中添加服务:
~]# firewall-cmd --add-service=<service-name>
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
5.6.4. 使用 GUI 使用预定义服务控制流量
IPv4
或 IPv6
)。
5.6.5. 添加新服务
/etc/firewalld/services/
中的 XML 文件。如果用户没有添加或更改服务,那么 /etc/firewalld/services/
中没有相应的 XML 文件。如果要添加或更改服务,则可以使用 /usr/lib/firewalld/services/
文件作为模板。
firewalld
的情况下使用 firewall-cmd 或 firewall-offline-cmd。输入以下命令来添加新的和空服务:
~]$ firewall-cmd --new-service=service-name
~]$ firewall-cmd --new-service-from-file=service-name.xml
--name=service-name
选项来更改服务名称。
/etc/firewalld/services/
中。
root
用户,您可以输入以下命令来手动复制服务:
~]# cp /usr/lib/firewalld/services/service-name.xml /etc/firewalld/services/service-name.xml
firewalld
首先从 /usr/lib/firewalld/services
加载文件。如果文件放在 /etc/firewalld/services
中,并且有效,则这些文件将覆盖 /usr/lib/firewalld/services
中的匹配文件。在 /etc/firewalld/services
中的匹配文件已被删除,或者要求 firewalld
加载服务的默认值时,就会使用 /usr/lib/firewalld/services
中的 overriden 文件。这只适用于永久性环境。要在运行时环境中获取这些回退,则需要重新载入。
5.6.6. 使用 CLI 控制端口
httpd
守护进程监听 80 端口。但默认情况下,系统管理员会将守护进程配置为在不同端口上侦听以便增强安全性或出于其他原因。
打开端口
- 列出所有允许的端口:
~]# firewall-cmd --list-ports
- 在允许的端口中添加一个端口,以便为入站流量打开这个端口:
~]# firewall-cmd --add-port=port-number/port-type
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
tcp
、udp
、sctp
或 dccp
。这个类型必须与网络通信的类型匹配。
关闭端口
firewalld
中关闭此端口。强烈建议您尽快关闭所有不必要的端口,因为端口处于打开状态会存在安全隐患。
- 列出所有允许的端口:
~]# firewall-cmd --list-ports [WARNING] ==== This command will only give you a list of ports that have been opened as ports. You will not be able to see any open ports that have been opened as a service. Therefore, you should consider using the --list-all option instead of --list-ports. ====
- 从允许的端口中删除端口,以便对传入的流量关闭:
~]# firewall-cmd --remove-port=port-number/port-type
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
5.6.7. 使用 GUI 打开端口
5.6.8. 使用 GUI 控制协议的流量
5.6.9. 使用 GUI 打开源端口
5.7. 使用区域
5.7.1. 列出区域
~]# firewall-cmd --get-zones
~]# firewall-cmd --list-all-zones
~]# firewall-cmd --zone=zone-name --list-all
5.7.2. 为 Certain Zone 修改 firewalld
设置
--zone=zone-name
选项。例如,要允许在区 public 中使用 SSH
服务:
~]# firewall-cmd --add-service=ssh --zone=public
5.7.3. 更改默认区域
firewalld
服务后,firewalld
会加载默认区的设置,并使其处于活动状态。
- 显示当前的默认区:
~]# firewall-cmd --get-default-zone
- 设置新的默认区:
~]# firewall-cmd --set-default-zone zone-name
--permanent
选项。
5.7.4. 将网络接口分配给区
- 列出活跃区以及分配给它们的接口:
~]# firewall-cmd --get-active-zones
- 为不同的区分配接口:
~]# firewall-cmd --zone=zone-name --change-interface=<interface-name>
--permanent
选项在重启后保留设置。如果您设置了新的默认区,则设置将变为 permanent。
5.7.5. 将默认区域分配给网络连接
/etc/sysconfig/network-scripts/ifcfg-connection-name
文件,并添加一个将区分配给此连接的行:
ZONE=zone-name
5.7.6. 创建新区域
--permanent
选项,否则命令无法工作。
- 创建一个新区:
~]# firewall-cmd --permanent --new-zone=zone-name
- 重新载入新区:
~]# firewall-cmd --reload
- 检查是否在您的永久设置中添加了新的区:
~]# firewall-cmd --get-zones
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
5.7.7. 使用配置文件创建新区域
firewalld
区配置文件包含区的信息。这些区描述、服务、端口、协议、icmp-blocks、masquerade、forward-ports 和丰富的语言规则采用 XML 文件格式。文件名必须是 zone-name.xml
,其中 zone-name 的长度限制为 17 个字符。区域配置文件位于 /usr/lib/firewalld/zones/
和 /etc/firewalld/zones/
目录中。
TCP
和 UDP
协议的一个服务(SSH
)和一个端口范围的配置:
<?xml version="1.0" encoding="utf-8"?> <zone> <short>My zone</short> <description>Here you can describe the characteristic features of the zone.</description> <service name="ssh"/> <port port="1025-65535" protocol="tcp"/> <port port="1025-65535" protocol="udp"/> </zone>
firewalld.zone
手册页。
5.7.8. 使用区目标为 Incoming 流量设置默认行为
默认
、ACCEPT
、REJECT
和 DROP
。通过将目标设置为 ACCEPT
,您可以接受所有传入的数据包,除了特定规则禁用的那些数据包。如果将目标设置为 REJECT
或 DROP
,您将禁用所有传入的数据包,除了您在特定规则中允许的数据包。拒绝数据包时,会通知源机器,但丢弃数据包时不会发送任何信息。
- 列出特定区的信息以查看默认目标:
~]$ firewall-cmd --zone=zone-name --list-all
- 在区中设置一个新目标:
~]# firewall-cmd --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>
5.8. 使用区域管理流量取决于源
5.8.1. 添加源
- 在当前区中设置源:
~]# firewall-cmd --add-source=<source>
- 要为特定区设置源 IP 地址:
~]# firewall-cmd --zone=zone-name --add-source=<source>
受信任
区中 192.168.2.15 的所有传入的流量:
- 列出所有可用区:
~]# firewall-cmd --get-zones
- 将源 IP 添加到持久性模式的信任区中:
~]# firewall-cmd --zone=trusted --add-source=192.168.2.15
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
5.8.2. 删除源
- 列出所需区的允许源:
~]# firewall-cmd --zone=zone-name --list-sources
- 从区永久删除源:
~]# firewall-cmd --zone=zone-name --remove-source=<source>
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
5.8.3. 添加源端口
--add-source-port
选项指定源端口。您还可以将此与 --add-source
选项结合使用,将流量限制在特定的 IP 地址或 IP 范围。
~]# firewall-cmd --zone=zone-name --add-source-port=<port-name>/<tcp|udp|sctp|dccp>
5.8.4. 删除源端口
~]# firewall-cmd --zone=zone-name --remove-source-port=<port-name>/<tcp|udp|sctp|dccp>
5.8.5. 使用 Zones 和 Sources 只允许服务只用于特定域
192.0.2.0/24
网络的 HTTP 流量,而阻止其他任何流量。
192.0.2.0/24
的流量,所有网络连接都将被接受。
- 列出所有可用区:
~]# firewall-cmd --get-zones block dmz drop external home internal public trusted work
- 将 IP 范围添加到 internal 区,来将来自源的流量通过区:
~]# firewall-cmd --zone=internal --add-source=192.0.2.0/24
- 在 internal 区中添加 http 服务:
~]# firewall-cmd --zone=internal --add-service=http
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
- 检查 internal 区是否活跃,以及该区中服务是否被允许:
~]# firewall-cmd --zone=internal --list-all internal (active) target: default icmp-block-inversion: no interfaces: sources: 192.0.2.0/24 services: dhcpv6-client mdns samba-client ssh http ...
5.8.6. 配置基于区接受的流量
在区中添加协议
~]# firewall-cmd --zone=zone-name --add-protocol=port-name/tcp|udp|sctp|dccp|igmp
--add-protocol
选项的 igmp
值。
从区中删除协议
~]# firewall-cmd --zone=zone-name --remove-protocol=port-name/tcp|udp|sctp|dccp|igmp
5.9. 端口转发
firewalld
,您可以设置端口重定向,以便到达系统上某个端口的任何传入的流量都被传送到您选择的其他内部端口或另一台计算机上的外部端口。
5.9.1. 向重定向添加端口
~]# firewall-cmd --add-forward-port=port=port-number:proto=tcp|udp|sctp|dccp:toport=port-number
- 添加要转发的端口:
~]# firewall-cmd --add-forward-port=port=port-number:proto=tcp|udp:toport=port-number:toaddr=IP
- 启用伪装:
~]# firewall-cmd --add-masquerade
例 5.1. 将 TCP 端口 80 重定向到同一计算机上的端口 88
- 将端口 80 重定向到 TCP 流量的端口 88:
~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=88
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
- 检查是否重定向了端口:
~]# firewall-cmd --list-all
5.9.2. 删除重定向的端口
~]# firewall-cmd --remove-forward-port=port=port-number:proto=<tcp|udp>:toport=port-number:toaddr=<IP>
- 删除转发的端口:
~]# firewall-cmd --remove-forward-port=port=port-number:proto=<tcp|udp>:toport=port-number:toaddr=<IP>
- 禁用伪装:
~]# firewall-cmd --remove-masquerade
例 5.2. 删除在同一机器上将 TCP 端口 80 转发到端口 88
- 列出重定向的端口:
~]# firewall-cmd --list-forward-ports port=80:proto=tcp:toport=88:toaddr=
- 从防火墙中删除重定向的端口:
~]# firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=88:toaddr=
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
5.10. 配置 IP 地址伪装
external
区),以 root
用户身份输入以下命令:
~]# firewall-cmd --zone=external --query-masquerade
yes
,且退出状态为 0
。否则,将打印 no
,且退出状态为 1
。如果省略了 zone
,则将使用默认区。
root
用户身份输入以下命令:
~]# firewall-cmd --zone=external --add-masquerade
--permanent
选项的命令。
root
身份输入以下命令:
~]# firewall-cmd --zone=external --remove-masquerade
--permanent
选项的命令。
5.11. 管理 ICMP
请求
Internet 控制消息协议
(ICMP
)是一种支持协议,供各种网络设备用来发送错误消息和表示连接问题的操作信息,例如,请求的服务不可用。ICMP
与 TCP 和 UDP 等传输协议不同,因为它不用于在系统之间交换数据。
ICMP
消息(特别是 echo-request
和 echo-reply
)来揭示关于您网络的信息,并将这些信息滥用于各种欺诈活动。因此,firewalld
允许阻止 ICMP
请求,来保护您的网络信息。
5.11.1. 列出 ICMP
请求
ICMP
请求在 /usr/lib/firewalld/icmptypes/
目录中的单个 XML 文件中进行了描述。您可以阅读这些文件来查看请求的描述。firewall-cmd 命令控制 ICMP
请求操作。
ICMP
类型:
~]# firewall-cmd --get-icmptypes
ICMP
请求。要查看使用 ICMP
请求的协议:
~]# firewall-cmd --info-icmptype=<icmptype>
ICMP
请求显示 yes
或如果请求没被阻止,则显示 no
。要查看 ICMP
请求当前是否被阻止:
~]# firewall-cmd --query-icmp-block=<icmptype>
5.11.2. 阻止或取消阻止 ICMP
请求
ICMP
请求时,它不会提供通常应该提供的信息。但这并不意味着根本不给出任何信息。客户端会收到特定 ICMP
请求被阻止(拒绝)的信息。应仔细考虑阻止 ICMP
请求,因为它可能会造成通信问题,特别是 IPv6 流量。
ICMP
请求当前是否被阻止:
~]# firewall-cmd --query-icmp-block=<icmptype>
ICMP
请求:
~]# firewall-cmd --add-icmp-block=<icmptype>
ICMP
请求的块:
~]# firewall-cmd --remove-icmp-block=<icmptype>
5.11.3. 在没有任何信息的情况下阻止 ICMP
请求
ICMP
请求,客户端会知道您正在阻止它。这样潜在的攻击者仍然可以看到您的 IP 地址在线。要完全隐藏此信息,您必须丢弃所有 ICMP
请求。
ICMP
请求:
- 将区的目标设为
DROP
:~]# firewall-cmd --set-target=DROP
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
ICMP
请求)都将被丢弃,除了您明确允许的流量外。
ICMP
请求,而允许其他请求:
- 将区的目标设为
DROP
:~]# firewall-cmd --set-target=DROP
- 添加 ICMP 块反转以一次性阻止所有
ICMP
请求:~]# firewall-cmd --add-icmp-block-inversion
- 为这些您要允许的
ICMP
请求添加 ICMP 块:~]# firewall-cmd --add-icmp-block=<icmptype>
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
ICMP
请求块的设置,因此所有之前没有被阻止的请求都会被阻止。被阻止的那些不会被阻止。这意味着,如果您需要取消阻塞请求,则必须使用 blocking 命令。
- 将区的目标设为
default
或ACCEPT
:~]# firewall-cmd --set-target=default
- 删除
ICMP
请求的所有添加的块:~]# firewall-cmd --remove-icmp-block=<icmptype>
- 删除
ICMP
块反转:~]# firewall-cmd --remove-icmp-block-inversion
- 使新设置具有持久性:
~]# firewall-cmd --runtime-to-permanent
5.11.4. 使用 GUI 配置 ICMP
过滤器
ICMP
过滤器,请启动 firewall-config 工具,并选择其信息要被过滤的网络区。选择 ICMP Filter 选项卡,然后选中您要过滤的每种 ICMP
消息类型的复选框。清除复选框以禁用过滤器。这个设置按方向设置,默认允许所有操作。
ICMP
类型,所有其他类型都被拒绝。在使用 DROP 目标的区域里它们会被丢弃。
5.12. 使用 firewalld
设置和控制 IP 集
firewalld
所支持的 IP 集设置类型列表,请以 root 用户身份输入以下命令。
~]# firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net
5.12.1. 使用命令行客户端配置 IP 设置选项
firewalld
区中用作源,也可以用作富规则中的源。在 Red Hat Enterprise Linux 7 中,首选的方法是使用在直接规则中使用 firewalld
创建的 IP 集。
firewalld
已知的 IP 集,请以 root
用户身份运行以下命令:
~]# firewall-cmd --permanent --get-ipsets
root
用户身份使用 permanent 环境来运行以下命令:
~]# firewall-cmd --permanent --new-ipset=test --type=hash:net
success
IPv4
创建了一个名为 test 和 hash:net
类型的新 IP 集。要创建用于 IPv6
的 IP 集,请添加 --option=family=inet6
选项。要使新设置在运行时环境中有效,请重新加载 firewalld
。以 root
身份使用以下命令列出新 IP 集:
~]# firewall-cmd --permanent --get-ipsets
test
root
身份运行以下命令:
~]# firewall-cmd --permanent --info-ipset=test
test
type: hash:net
options:
entries:
root
身份运行以下命令:
~]# firewall-cmd --permanent --ipset=test --add-entry=192.168.0.1 success
root
身份运行以下命令:
~]# firewall-cmd --permanent --ipset=test --get-entries
192.168.0.1
~]# cat > iplist.txt <<EOL
192.168.0.2
192.168.0.3
192.168.1.0/24
192.168.2.254
EOL
root
身份运行以下命令:
~]# firewall-cmd --permanent --ipset=test --add-entries-from-file=iplist.txt success
root
身份运行以下命令:
~]# firewall-cmd --permanent --ipset=test --get-entries 192.168.0.1 192.168.0.2 192.168.0.3 192.168.1.0/24 192.168.2.254
root
身份运行以下命令:
~]# firewall-cmd --permanent --ipset=test --remove-entries-from-file=iplist.txt
success
~]# firewall-cmd --permanent --ipset=test --get-entries
192.168.0.1
root
身份运行以下命令:
~]# firewall-cmd --permanent --zone=drop --add-source=ipset:test
success
ipset:
前缀向 firewalld
表示,源是一个 IP 集,而不是一个 IP 地址或一个地址范围。
--permanent
选项。
5.12.2. 为 IP 集配置自定义服务
firewalld
启动前创建和加载 IP 设置结构:
- 以
root
用户身份运行的编辑器,按如下所示创建一个文件:~]# vi /etc/systemd/system/ipset_name.service [Unit] Description=ipset_name Before=firewalld.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/ipset_name.sh start ExecStop=/usr/local/bin/ipset_name.sh stop [Install] WantedBy=basic.target
- 在 firewalld 中永久使用设置的 IP:
~]# vi /etc/firewalld/direct.xml <?xml version="1.0" encoding="utf-8"?> <direct> <rule ipv="ipv4" table="filter" chain="INPUT" priority="0">-m set --match-set <replaceable>ipset_name</replaceable> src -j DROP</rule> </direct>
- 需要
firewalld
重新加载才能激活更改:~]# firewall-cmd --reload
这会重新加载防火墙,而不丢失状态信息(TCP 会话不会终止),但在重新加载期间可能会中断服务。
firewalld
管理的 IP 集。要使用这样的 IP 组,需要一个永久直接规则来引用集合,且必须添加自定义服务来创建这些 IP 组件。这个服务需要在 firewalld 启动前启动,否则 firewalld
无法使用这些集合添加直接规则。您可以使用 /etc/firewalld/direct.xml
文件来添加永久的直接规则。
5.13. 使用 iptables
设置和控制 IP 集
firewalld
和 iptables (和 ip6tables)服务之间的基本区别是:
- iptables 服务将 配置存储在
/etc/sysconfig/iptables
和/etc/sysconfig/ip6tables
中,而firewalld
将其存储在/usr/lib/firewalld/
和 /etc/firewalld/ 的不同
XML 文件中。请注意,/etc/sysconfig/iptables
文件不存在,因为默认情况下在 Red Hat Enterprise Linux 中安装firewalld
。 - 使用 iptables 服务 时,每个更改都意味着清除所有旧规则,并从
/etc/sysconfig/iptables
读取所有新规则,而firewalld
不会重新创建所有规则。仅应用不同之处。因此,firewalld
可以在运行时更改设置,而不会丢失现有连接。
iptables
和 ip6tables
服务而不是 firewalld
,首先以 root
用户身份运行以下命令来禁用 firewalld
:
~]# systemctl disable firewalld ~]# systemctl stop firewalld
root
用户身份输入以下命令安装 iptables-services 软件包:
~]# yum install iptables-services
iptables-services 软件包包含 iptables
服务和 ip6tables
服务。
iptables
和 ip6tables
服务,请以 root
用户身份输入以下命令:
~]# systemctl start iptables ~]# systemctl start ip6tables要启用服务在每次系统启动时启动,请输入以下命令:
~]# systemctl enable iptables ~]# systemctl enable ip6tables
~]# iptables -A INPUT -s 10.0.0.0/8 -j DROP ~]# iptables -A INPUT -s 172.16.0.0/12 -j DROP ~]# iptables -A INPUT -s 192.168.0.0/16 -j DROP该集合创建如下:
~]# ipset create my-block-set hash:net ~]# ipset add my-block-set 10.0.0.0/8 ~]# ipset add my-block-set 172.16.0.0/12 ~]# ipset add my-block-set 192.168.0.0/16然后,在 iptables 命令中引用该集合,如下所示:
~]# iptables -A INPUT -m set --set my-block-set src -j DROP
如果设置被多次使用,则进行保存配置时间。如果集合包含多个在处理时间保存的条目。
5.14. 使用直接接口
--direct
选项与 firewall-cmd 工具一起使用,可以在运行时添加和删除链。这里提供了几个示例。详情请查看 firewall-cmd (1)
手册页。
--permanent
--direct 命令或修改 /etc/firewalld/direct.xml
添加 --permanent 选项,使规则永久生效。有关 /etc/firewalld/direct.xml
文件的信息,请参阅 man firewalld.direct (5)
。
5.14.1. 使用直接接口添加规则
root
用户身份输入以下命令:
~]# firewall-cmd --direct --add-rule ipv4 filter IN_public_allow \ 0 -m tcp -p tcp --dport 666 -j ACCEPT
--permanent
选项,使设置持久。
5.14.2. 使用直接接口删除规则
root
用户身份输入以下命令:
~]# firewall-cmd --direct --remove-rule ipv4 filter IN_public_allow \ 0 -m tcp -p tcp --dport 666 -j ACCEPT
--permanent
选项,使设置持久。
5.14.3. 使用直接接口列出规则
root
用户身份输入以下命令:
~]# firewall-cmd --direct --get-rules ipv4 filter IN_public_allow
--get-rules
选项)只列出之前使用 --add-rule
选项添加的规则。它不会列出其他方法添加的现有 iptables 规则。
5.15. 使用"Rich Language"语法配置复杂防火墙规则
5.15.1. Rich Language 命令的格式
root
用户身份运行。添加规则的命令格式如下:
firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=timeval]
s
(秒)、m
(分钟)或 h
(小时)来指定时间单位。默认值为 秒。
firewall-cmd [--zone=zone] --remove-rich-rule='rule'
firewall-cmd [--zone=zone] --query-rich-rule='rule'
yes
,且退出状态为 0
。否则,将打印 no
,且退出状态为 1
。如果省略了区,则使用默认区。
5.15.2. 了解 Rich Rule 结构
rule [family="rule family"] [ source [NOT] [address="address"] [mac="mac-address"] [ipset="ipset"] ] [ destination [NOT] address="address" ] [ element ] [ log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"] ] [ audit ] [ action ]
NOT
关键字来反转源地址命令的含义,但命令行使用 invert
="true" 选项。
5.15.3. 了解 Rich Rule 命令选项
系列
- 如果提供了规则系列,可以是
ipv4
或ipv6
,它将规则分别限制为IPv4
或IPv6
。如果没有提供规则系列,则会为IPv4
和IPv6
添加该规则。如果在规则中使用源或目标地址,则需要提供规则系列。端口转发也是端口转发的情况。
源和目标地址
source
- 通过指定源地址,连接尝试的来源可以限制为源地址。源地址或地址范围是 IP 地址或网络 IP 地址,其掩码为
IPv4
或IPv6
。对于IPv4
,掩码可以是网络掩码或纯文本。对于IPv6
,掩码是纯数字。不支持使用主机名。通过添加NOT
关键字;除提供的地址匹配,可以反转源 address 命令的意义。如果该规则没有指定系列
,则可以为IPv4
和IPv6
添加类型为 的 MAC 地址和 IP 集。其他 IP 集需要与规则的family
设置匹配。 目的地
- 通过指定目标地址,目标可以限制为目标地址。目标地址使用与 IP 地址或地址范围的源地址相同的语法。源和目标地址的使用是可选的,所有元素都不能使用目标地址。这取决于目标地址的使用,例如在服务条目中。您可以组合
目的地和操作
。
元素
service
,port
,protocol
,masquerade
,icmp-block
,forward-port
, 和 source-port
。
service
service
元素是 firewalld 提供的服务之一。要获取预定义服务列表,请输入以下命令:~]$ firewall-cmd --get-services
如果服务提供目标地址,它将与规则中的目标地址冲突,并会导致错误。在内部使用目标地址的服务主要是使用多播的服务。该命令采用以下格式:service name=service_name
port
port
元素可以是单个端口号或端口范围,例如5060-5062
,后跟协议,可以是tcp
或udp
。该命令采用以下格式:port port=number_or_range protocol=protocol
protocol
protocol
值可以是协议 ID 号或协议名称。有关允许的协议
条目,请参阅/etc/protocols
。该命令采用以下格式:protocol value=protocol_name_or_ID
icmp-block
- 使用此命令阻止一个或多个
ICMP
类型。ICMP
类型是 firewalld 支持的ICMP
类型之一。要获取支持的ICMP
类型列表,请输入以下命令:~]$ firewall-cmd --get-icmptypes
此处不允许指定操作。ICMP-block 在内部使用操作拒绝
。该命令采用以下格式:icmp-block name=icmptype_name
masquerade
- 在规则中打开 IP 伪装。可以提供源地址以限制伪装到此区域,但不能提供目标地址。此处不允许指定操作。
forward-port
- 使用指定为
tcp
或udp
的协议从本地端口转发数据包到本地的其它端口,或转发到另一台计算机上的其他端口。port
和to-port
可以是单个端口号或端口范围。目标地址是一个简单的 IP 地址。此处不允许指定操作。forward-port 命令使用操作在内部接受
。该命令采用以下格式:forward-port port=number_or_range protocol=protocol / to-port=number_or_range to-addr=address
source-port
- 匹配数据包的源端口 - 连接尝试的源端口。要匹配当前计算机上的端口,请使用
port
元素。source-port
元素可以是单个端口号或端口范围(例如 5060-5062),后跟协议为tcp
或udp
。该命令采用以下格式:source-port port=number_or_range protocol=protocol
日志记录
log
- 使用内核日志记录记录新连接尝试规则,例如在 syslog 中。您可以定义将作为前缀添加到日志消息中的前缀文本。日志级别可以是
emerg
、alert
、crit
、error
、warning
、notice
、info
或debug
之一。使用日志是可选的。可以按如下所示限制日志记录:log [prefix=prefix text] [level=log level] limit value=rate/duration
速率是一个自然正数 [1, ..],持续时间为s
,m
,h
,d
。s
表示秒,m
表示分钟,h
表示小时和d
天。最大限制值为1/d
,这表示每天最多一个日志条目。 audit
- Audit 提供了使用发送到 service
auditd
的审计记录的日志的替代方法。audit 类型可以是ACCEPT
、REJECT
或DROP
之一,但在命令 审计 后未指定,因为审计类型将从规则操作中自动收集。审计没有自己的参数,但可以选择性地添加限制。审计的使用是可选的。
操作
accept|reject|drop|mark
- 一个操作可以是
接受
之一、拒绝
、丢弃
或标记
。该规则只能包含元素或源。如果规则包含一个元素,则与该元素匹配的新连接将使用该操作进行处理。如果规则包含源,则来自源地址的所有内容都将使用指定的操作进行处理。accept | reject [type=reject type] | drop | mark set="mark[/mask]"
使用接受
时,将授予所有新的连接尝试。如果拒绝
,则它们的源将被拒绝,并且其源将收到拒绝消息。reject 类型可以设置为使用另一个值。使用drop
时,所有数据包将立即丢弃,且不会向源发送任何信息。使用标记
所有数据包时,将使用给定的 标记和可选 掩码 标记。
5.15.4. 使用 Rich Rule Log 命令
拒绝
链之前进行处理,以便正确排序。根据规则的操作,它们的规则或部分放置在单独的链中,如下所示:
zone_log zone_deny zone_allow
拒绝
和丢弃
规则将放置在 “区域_deny” 链中,这些规则将在日志链后解析。所有 接受
规则将放置在 “区域_allow” 链中,这将在 拒绝
链后解析。如果规则包含 日志
以及 拒绝或允许
操作,则指定这些操作的规则部分放置在匹配的链中。
5.15.4.1. 使用 Rich Rule Log 命令示例 1
AH
启用新的 IPv4
和 IPv6
连接:
rule protocol value="ah" accept
5.15.4.2. 使用 Rich Rule Log Command Example 2
FTP
的新 IPv4
和 IPv6
连接,并使用审计每分钟记录 1 个:
rule service name="ftp" log limit value="1/m" audit accept
5.15.4.3. 使用 Rich Rule Log 命令示例 3
TFTP
允许从地址 192.168.0.0/24
进行新的 IPv4
连接,并使用 syslog 每分钟记录 1 个:
rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept
5.15.4.4. 使用 Rich Rule Log Command Example 4
1:2:3:4:6::
用于协议 RADIUS
的新 IPv6
连接都会被拒绝,并记录每分钟的 3 个速率。可接受来自其他源的新 IPv6
连接:
rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject rule family="ipv6" service name="radius" accept
5.15.4.5. 使用 Rich Rule Log 命令示例 5
1:2:3:4:6::
接收的 IPv6
数据包转发到端口 4012 上的 1::2:3:4:7
。
rule family="ipv6" source address="1:2:3:4:6::" forward-port to-addr="1::2:3:4:7" to-port="4012" protocol="tcp" port="4011"
5.15.4.6. 使用 Rich Rule Log Command Example 6
rule family="ipv4" source address="192.168.2.2" accept
firewalld.richlanguage (5)
手册页。
5.16. 配置防火墙锁定
root
身份运行(例如 libvirt),则可以更改防火墙配置。使用这个特性,管理员可以锁定防火墙配置,从而达到没有应用程序或只有添加到锁定白名单中的应用程序可以请求防火墙更改的目的。锁定设置默认会被禁用。如果启用,用户就可以确定,防火墙没有被本地的应用程序或服务进行了不必要的配置更改。
5.16.1. 使用命令行客户端配置锁定
root
身份运行以下命令:
~]# firewall-cmd --query-lockdown
如果启用了锁定,该命令会打印 yes
,且退出状态为 0
。否则,将打印 no
,且退出状态为 1
。
root
身份输入以下命令:
~]# firewall-cmd --lockdown-on
root
身份使用以下命令:
~]# firewall-cmd --lockdown-off
5.16.2. 使用命令行客户端配置锁定白名单选项
~]$ ps -e --context
该命令返回所有正在运行的应用程序。通过 grep 工具将结果进行管道输出以获取感兴趣的应用程序。例如:
~]$ ps -e --context | grep example_program
root
用户身份输入以下命令:
~]# firewall-cmd --list-lockdown-whitelist-commands
root
用户身份输入以下命令:
~]# firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
root
用户身份输入以下命令:
~]# firewall-cmd --remove-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
root
用户身份输入以下命令:
~]# firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python -Es /usr/bin/command'
如果为 true,命令会打印 yes
,且退出状态为 0
。否则,将打印 no
,且退出状态为 1
。
root
用户身份输入以下命令:
~]# firewall-cmd --list-lockdown-whitelist-contexts
root
用户身份输入以下命令:
~]# firewall-cmd --add-lockdown-whitelist-context=context
root
身份输入以下命令:
~]# firewall-cmd --remove-lockdown-whitelist-context=context
root
用户身份输入以下命令:
~]# firewall-cmd --query-lockdown-whitelist-context=context
如果为 true,则打印 yes
,退出状态为 0
,否则打印 no
,退出状态为 1
。
root
用户身份输入以下命令:
~]# firewall-cmd --list-lockdown-whitelist-uids
root
用户身份输入以下命令:
~]# firewall-cmd --add-lockdown-whitelist-uid=uid
root
用户身份输入以下命令:
~]# firewall-cmd --remove-lockdown-whitelist-uid=uid
~]$ firewall-cmd --query-lockdown-whitelist-uid=uid
如果为 true,则打印 yes
,退出状态为 0
,否则打印 no
,退出状态为 1
。
root
用户身份输入以下命令:
~]# firewall-cmd --list-lockdown-whitelist-users
root
用户身份输入以下命令:
~]# firewall-cmd --add-lockdown-whitelist-user=user
root
用户身份输入以下命令:
~]# firewall-cmd --remove-lockdown-whitelist-user=user
~]$ firewall-cmd --query-lockdown-whitelist-user=user
如果为 true,则打印 yes
,退出状态为 0
,否则打印 no
,退出状态为 1
。
5.16.3. 使用配置文件配置锁定白名单选项
<?xml version="1.0" encoding="utf-8"?> <whitelist> <selinux context="system_u:system_r:NetworkManager_t:s0"/> <selinux context="system_u:system_r:virtd_t:s0-s0:c0.c1023"/> <user id="0"/> </whitelist>
815
:
<?xml version="1.0" encoding="utf-8"?> <whitelist> <command name="/usr/bin/python -Es /bin/firewall-cmd*"/> <selinux context="system_u:system_r:NetworkManager_t:s0"/> <user id="815"/> <user name="user"/> </whitelist>此示例展示了
user id
和 user name
,但只需要其中一个选项。Python 是程序解释器,它位于命令行的前面。您还可以使用特定的命令,例如: /usr/bin/python /bin/firewall-cmd --lockdown-on
。在这个示例中,只允许 --lockdown-on 命令。
/usr/bin/
目录中,/bin/
目录被符号链接到 /usr/bin/
目录。换句话说,虽然以 root
用户身份运行 firewall-cmd 的路径可能会解析为 /bin/firewall-cmd,但现在可以使用/usr/bin/firewall-cmd。所有新脚本都应该使用新位置。但请注意,如果以 root
身份运行的脚本已被写为使用 /bin/firewall-cmd 路径,那么除了通常为非root
用户使用的 /usr/bin/firewall-cmd 路径外,还必须将该命令路径列入白名单。
5.17. 为 Denied Packets 配置日志记录
firewalld
中的 LogDenied
选项,可以为拒绝的数据包添加一个简单的日志记录机制。这些是被拒绝或丢弃的数据包。要更改日志的设置,请编辑 /etc/firewalld/firewalld.conf
文件,或者使用命令行或 GUI 配置工具。
LogDenied
,则会在 INPUT、FORWARD 和 OUTPUT 链中的 reject 和 drop 规则之前添加日志规则,以及区域中的最终拒绝和丢弃规则。此设置可能的值有: all
、unicast
、broadcast
、multicast
和 off
。默认设置为 off
。使用 单播
、广播
和多播
设置时,pkttype
匹配用于匹配链路层数据包类型。使用 所有
时,所有数据包都会记录。
LogDenied
设置,请以 root
用户身份运行以下命令:
~]# firewall-cmd --get-log-denied
off
LogDenied
设置,请以 root
用户身份运行以下命令:
~]# firewall-cmd --set-log-denied=all
success
firewalld
GUI 配置工具更改 LogDenied
设置,请启动 firewall-config,点 Options 菜单并选择 。此时会出现 LogDenied
窗口。从菜单中选择新的 LogDenied
设置,然后单击 OK。
5.18. 其它资源
firewalld
的其他资源。
5.18.1. 安装的文档
firewalld (1)
手册页 - 描述firewalld
的命令选项。firewalld.conf (5)
手册页 - 包含用于配置firewalld
的信息。firewall-cmd (1)
手册页 - 描述firewalld
命令行客户端的命令行选项。firewall-config (1)
手册页 - 描述 firewall-config 工具的设置。firewall-offline-cmd (1)
手册页 - 描述firewalld
离线命令行客户端的命令选项。firewalld.icmptype (5)
手册页 - 描述用于ICMP
过滤的 XML 配置文件。firewalld.ipset (5)
手册页 - 描述firewalld
IP
集的 XML 配置文件。firewalld.service (5)
手册页 - 描述 firewalld 服务的 XML 配置文件。firewalld.zone (5)
手册页 - 描述firewalld
区配置的 XML 配置文件。firewalld.direct (5)
手册页 - 描述firewalld
直接接口配置文件。firewalld.lockdown-whitelist (5)
手册页 - 描述firewalld
锁定白名单配置文件。firewalld.richlanguage (5)
手册页 - 描述firewalld
丰富的语言规则语法。firewalld.zones (5)
手册页 - 哪些区的一般描述以及如何配置它们。firewalld.dbus (5)
手册页 - 描述firewalld
的D-Bus
接口。
5.18.2. 在线文档
- http://www.firewalld.org/ -
firewalld
主页。
第 6 章 nftables 入门
nftables
框架提供数据包分类工具,它是 iptables
、ip6tables
、arptables
、ebtables
和 ipset
工具的指定成功者。与之前的数据包过滤工具相比,它在方便、特性和性能方面提供了大量改进,最重要的是:
- 内置查找表而不是线性处理
IPv4
和IPv6
协议的单一框架- 规则会以一个整体被应用,而不是分为抓取、更新和存储完整的规则集的步骤
- 支持在规则集(
nftrace
)和监控追踪事件(nft
)中调试和追踪 - 更加一致和压缩的语法,没有特定协议的扩展
- 用于第三方应用程序的 Netlink API
iptables
类似,nftables
使用表来存储链。链包含执行动作的独立规则。nft
工具替换了之前数据包过滤框架中的所有工具。libnftnl
库可用于通过 libmnl
库与 nftables
Netlink API 进行低级交互。
nftables
规则集,请注意 nftables
规则集操作(如 nft flush ruleset 命令)可能会影响使用之前独立的旧命令安装的规则集。
何时使用 firewalld 或 nftables
firewalld
:将firewalld
工具用于简单的防火墙
用例。此工具易于使用,并涵盖了这些场景的典型用例。nftables
:使用nftables
工具来设置复杂和性能关键的防火墙,如用于整个网络。
6.1. 编写和执行 nftables 脚本
nftables
框架提供了一个原生脚本环境,它比使用 shell 脚本维护 防火墙规则
提供了主要优势:执行脚本是原子的。这意味着,系统会应用整个脚本,或者在出现错误时防止执行。这样可保证防火墙始终处于一致状态。
nftables
脚本环境使管理员能够:
- 添加评论
- 定义变量
- 包含其他规则集文件
nftables
脚本。
/etc/nftables/
目录中自动创建 If nft
脚本。这些脚本包含为不同目的创建表和空链的命令。
6.1.1. 支持的 nftables 脚本格式
nftables
脚本环境支持以下格式的脚本:
- 您可以以与 nft list ruleset 命令相同的格式编写脚本,显示规则集:
#!/usr/sbin/nft -f # Flush the rule set flush ruleset table inet example_table { chain example_chain { # Chain for incoming packets that drops all packets that # are not explicitly allowed by any rule in this chain type filter hook input priority 0; policy drop; # Accept connections to port 22 (ssh) tcp dport ssh accept } }
- 您可以使用与
nft
命令相同的语法:#!/usr/sbin/nft -f # Flush the rule set flush ruleset # Create a table add table inet example_table # Create a chain for incoming packets that drops all packets # that are not explicitly allowed by any rule in this chain add chain inet example_table example_chain { type filter hook input priority 0 ; policy drop ; } # Add a rule that accepts connections to port 22 (ssh) add rule inet example_table example_chain tcp dport ssh accept
6.1.2. 运行 nftables 脚本
nft
工具或直接执行脚本来运行 nftables
脚本。
先决条件
- 本节的流程假设您在
/etc/
文件中存储了一个 nftables 脚本。nftables
/example_firewall.nft
过程 6.1. 使用 nft
工具运行 nftables 脚本
- 要通过将其传给
nft
工具来运行nftables
脚本,请输入:# nft -f /etc/nftables/example_firewall.nft
过程 6.2. 直接运行 nftables
脚本:
- 只需要执行一次的步骤:
- 确保脚本以以下 shebang 序列开头:
#!/usr/sbin/nft -f
重要如果省略-f
参数,nft
工具不会读取脚本,并显示 Error: syntax error, unexpected newline, expecting string。 - 可选:将脚本的所有者设置为
root
:# chown root /etc/nftables/example_firewall.nft
- 使脚本可以被其所有者执行:
# chmod u+x /etc/nftables/example_firewall.nft
- 运行脚本:
# /etc/nftables/example_firewall.nft
如果没有输出结果,系统将成功执行该脚本。
nft
成功地执行了脚本,在脚本中错误放置的规则、缺失的参数或其他问题都可能会导致防火墙的行为不符合预期。
其他资源
- 有关设置文件所有者的详情,请查看
chown (1)
手册页。 - 有关设置文件权限的详情,请查看
chmod (1)
手册页。 - 有关使用系统引导载入
nftables
规则的更多信息,请参阅 第 6.1.6 节 “系统引导时自动载入 nftables 规则”
6.1.3. 使用 nftables 脚本中的注释
nftables
脚本环境将 #
字符右侧的所有内容解释为注释。
例 6.1. nftables 脚本中的注释
... # Flush the rule set flush ruleset add table inet example_table # Create a table ...
6.1.4. 使用 nftables 脚本中的变量
nftables
脚本中定义一个变量,请使用 define
关键字。您可以在变量中存储单个值和匿名集合。对于更复杂的场景,请使用命名集或 verdict 映射。
只有一个值的变量
INET_DEV
的变量,其值为 enp1s0 :
define INET_DEV = enp1s0
$
符号后跟变量名称来在脚本中使用变量:
...
add rule inet example_table example_chain iifname $INET_DEV
tcp dport ssh accept
...
包含匿名集合的变量
define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }
$
符号后跟变量名称来在脚本中使用变量:
add rule inet example_table example_chain ip daddr $DNS_SERVERS
accept
其他资源
- 有关集合的详情请参考 第 6.4 节 “使用 nftables 命令中的设置”。
- 有关验证映射的详情,请参考 第 6.5 节 “在 nftables 命令中使用 verdict 映射”。
6.1.5. 在 nftables 脚本中包含文件
nftables
脚本环境可让管理员使用 include
语句包含其他脚本。
nftables
将包含默认搜索路径中的文件,在 Red Hat Enterprise Linux 上,该路径设为 /etc
。
例 6.2. 包含默认搜索目录中的文件
include "example.nft"
例 6.3. 包括一个 目录中的所有 Ifnft
文件
/etc/nftables/rulesets/
目录中以 If nft
结尾的所有文件:
include "/etc/nftables/rulesets/*.nft"
include
语句不匹配以点开头的文件。
其他资源
- 详情请查看
nft (8)
手册页中的Include files
部分。
6.1.6. 系统引导时自动载入 nftables 规则
nftables
systemd 服务加载包含在 /etc/sysconfig/nftables.conf
文件中的防火墙脚本。这部分论述了如何在系统引导时载入防火墙规则。
先决条件
nftables
脚本存储在/etc/nftables/
目录中。
过程 6.3. 系统引导时自动载入 nftables 规则
- 编辑
/etc/sysconfig/nftables.conf
文件。- 如果您在安装 nftables 软件包时增强了在
/etc/nftables/
中创建的 Ifnft
脚本,请取消对这些脚本的 include 语句的注释。 - 如果您从头编写脚本,请添加 include 语句来包括这些脚本。例如,要在
nftables
服务启动时载入/etc/nftables/example.nft
脚本,请添加:include "/etc/nftables/example.nft"
- (可选)启动
nftables
服务来加载防火墙规则,而不重启系统:# systemctl start nftables
- 启用 nftables 服务。
# systemctl enable nftables
其他资源
- 如需更多信息,请参阅 第 6.1.1 节 “支持的 nftables 脚本格式”。
6.2. 创建和管理 nftables 表、链和规则
nftables
规则集以及如何管理它。
6.2.1. 显示 nftables 规则集
nftables
的规则集包含表、链和规则。本节介绍如何显示此规则集。
# nft list ruleset table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport http accept tcp dport ssh accept } }
nftables
不预先创建表。因此,在没有表的情况下显示主机上设置的规则,nft list ruleset 命令不会显示任何输出。
6.2.2. 创建 nftables 表
nftables
中的表是包含链、规则、集合和其他对象集合的名字空间。本节介绍如何创建表。
ip
:仅匹配 IPv4 数据包。如果没有指定地址系列,这是默认设置。ip6
: 仅匹配 IPv6 数据包。inet
: 匹配 IPv4 和 IPv6 数据包。arp
: 匹配 IPv4 地址解析协议(ARP)数据包。网桥
:匹配遍历网桥设备的数据包。netdev
:匹配来自 ingress 的数据包。
过程 6.4. 创建 nftables 表
- 使用 nft add table 命令来创建新表。例如,要创建一个名为 example_table 的表,用于处理
IPv4
和IPv6
数据包:# nft add table inet example_table
- 另外,还可列出规则集中的所有表:
# nft list tables table inet example_table
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在表中运行的其他操作的详情,请查看
nft (8)
手册页中的Tables
部分。
6.2.3. 创建 nftables 链
- 基本链:您可以使用基础链作为来自网络堆栈的数据包的入口点。
- 常规链:您可以使用常规链作为
跳过
目标,并更好地组织规则。
先决条件
- 已存在您要添加新链的表。
过程 6.5. 创建 nftables 链
- 使用 nft add chain 命令来创建新链。例如,要在 example_table 中创建一个名为 example_chain 的链:
# nft add chain inet example_table example_chain '{ type filter hook input priority 0 ; policy accept ; }'
重要要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。此外,一些 shell 也解译大括号,因此请使用 ticks (1)将大括号和它们内的任何内容引用。这个链过滤传入的数据包。priority
参数指定nftables
进程处理具有相同 hook 值的链的顺序。较低优先级的值优先于优先级更高的值。policy
参数为此链中的规则设置默认操作。请注意,如果您远程登录到服务器,并将默认策略设置为drop
,如果没有其他规则允许远程访问,则会立即断开连接。 - 另外,还可以显示所有链:
# nft list chains table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; } }
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在链上运行的其他操作的详情,请查看
nft (8)
手册页中的链
部分。
6.2.4. 将规则附加到 nftables 链的末尾
先决条件
- 您要添加该规则的链已存在。
过程 6.6. 将规则附加到 nftables 链的末尾
- 要添加新规则,请使用 nft add rule 命令。例如,要在 example_table 中的 example_chain 中添加一条规则,以允许端口 22 上的 TCP 流量:
# nft add rule inet example_table example_chain tcp dport 22 accept
您还可以指定服务名称而不是端口号。在示例中,您可以使用ssh
而不是端口号22
。请注意,服务名称根据/etc/services
文件中的条目解析为端口号。 - 另外,还可在 example_table 中显示所有链及其规则:
# nft list table inet example_table table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; ... tcp dport ssh accept } }
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在链中运行的其他操作的详情,请查看
nft (8)
手册页中的Rules
部分。
6.2.5. 在 nftables 链的开头插入一条规则
nftables
链的开头插入规则。
先决条件
- 您要添加该规则的链已存在。
过程 6.7. 在 nftables 链的开头插入一条规则
- 要插入新规则,请使用 nft insert rule 命令。例如,要在 example_table 中的 example_chain 插入一条规则,以允许端口
22
上的 TCP 流量:# nft insert rule inet example_table example_chain tcp dport 22 accept
您还可以指定服务名称而不是端口号。在示例中,您可以使用ssh
而不是端口号22
。请注意,服务名称根据/etc/services
文件中的条目解析为端口号。 - 另外,还可在 example_table 中显示所有链及其规则:
# nft list table inet example_table table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport ssh accept ... } }
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在链中运行的其他操作的详情,请查看
nft (8)
手册页中的Rules
部分。
6.2.6. 在 nftables 链的特定位置插入一条规则
nftables
链中的现有规则前后插入规则。这样,您可以将新规则放在正确的位置上。
先决条件
- 您要添加该规则的链已存在。
过程 6.8. 在 nftables 链的特定位置插入一条规则
- 使用 nft -a list ruleset 命令显示 example_table 中的所有链及其规则,包括其句柄:
# nft -a list table inet example_table table inet example_table { # handle 1 chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 443 accept # handle 3 tcp dport 389 accept # handle 4 } }
使用-a
显示句柄。您需要此信息才能在后续步骤中定位新规则。 - 将新规则插入到 example_table 中的 example_chain 链中:
- 要在句柄 3 前插入一条允许端口 636 上 TCP 流量的规则,请输入:
# nft insert rule inet example_table example_chain position 3 tcp dport 636 accept
- 要添加一条规则,在句柄 3 后允许端口 80 上的 TCP 流量,请输入:
# nft add rule inet example_table example_chain position 3 tcp dport 80 accept
- 另外,还可在 example_table 中显示所有链及其规则:
# nft -a list table inet example_table table inet example_table { # handle 1 chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 636 accept # handle 5 tcp dport 443 accept # handle 3 tcp dport 80 accept # handle 6 tcp dport 389 accept # handle 4 } }
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在链中运行的其他操作的详情,请查看
nft (8)
手册页中的Rules
部分。
6.3. 使用 nftables 配置 NAT
nftables
,您可以配置以下网络地址转换(NAT
)类型:
- 伪装
- 源 NAT (
SNAT
) - 目标 NAT (
DNAT
) - 重定向
6.3.1. 不同的 NAT 类型: masquerading、source NAT、destination NAT 和 redirect
NAT
)类型:
伪装和源 NAT(SNAT)
NAT
类型之一更改数据包的源 IP 地址。例如,互联网服务提供商不路由私有 IP 范围,如 10.0.0.0/8
。如果您在网络中使用私有 IP 范围,并且用户应该能够访问 Internet 上的服务器,请将这些范围内的数据包的源 IP 地址映射到公共 IP 地址。
SNAT
非常相似。不同之处是:
- 伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。
SNAT
将数据包的源 IP 地址设置为指定 IP,且不会动态查找传出接口的 IP 地址。因此,SSNAT
比伪装更快。如果传出接口使用了固定 IP 地址,则使用SNAT
。
目标 NAT(DNAT)
NAT
类型将传入的流量路由到不同主机。例如,如果您的 web 服务器使用保留 IP 范围内的 IP 地址,因此无法直接从互联网访问,您可以在路由器上设置 DNAT
规则,以将传入的流量重定向到这个服务器。
重定向
6.3.2. 使用 nftables 配置伪装
nftables
会在替换源 IP 时自动使用新的 IP。
ens3
接口离开主机的数据包的源 IP 替换为 ens3
上设置的 IP。
过程 6.9. 使用 nftables 配置伪装
- 创建一个表:
# nft add table nat
- 向表中添加
prerouting
和postrouting
链:# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
重要即使您没有向prerouting
链中添加规则,nftables
框架也会要求此链与传入的数据包回复匹配。请注意,您必须将--
选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向
postrouting
链中添加一条规则,来匹配ens3
接口上传出的数据包:# nft add rule nat postrouting oifname "ens3" masquerade
6.3.3. 使用 nftables 配置源 NAT
SNAT
)允许您将通过接口发送的数据包 IP 更改为特定的 IP 地址。
ens3
接口离开路由器到达192.0.2.1
。
过程 6.10. 使用 nftables 配置源 NAT
- 创建一个表:
# nft add table nat
- 向表中添加
prerouting
和postrouting
链:# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
重要即使您没有向prerouting
链添加规则,nftables
框架也要求此链与传出数据包回复匹配。请注意,您必须将--
选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向
postrouting
链中添加一条规则,该规则将使用192.0.2.1
替换通过ens3
的传出数据包的源 IP :# nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1
其他资源
- 如需更多信息,请参阅 第 6.6.2 节 “将特定本地端口上传入的数据包转发到不同主机”。
6.3.4. 使用 nftables 配置目标 NAT
NAT
可让您将路由器上的流量重定向到无法直接从互联网访问的主机。
80
和 443
的传入流量重定向到 IP 地址为 192.0.2.1
的主机。
过程 6.11. 使用 nftables 配置目标 NAT
- 创建一个表:
# nft add table nat
- 向表中添加
prerouting
和postrouting
链:# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
重要即使您没有向 postrouting 链添加规则,nftables
框架也要求此链与传出数据包回复匹配。请注意,您必须将--
选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向 prerouting 链中添加一条规则,将发送到端口 80 和 443 的
ens3
接口上的传入流量重定向到 IP 为 192.0.2.1 的主机:# nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1
- 根据您的环境,添加 SNAT 或伪装规则以更改源地址:
- 如果
ens3
接口使用动态 IP 地址,请添加一条伪装规则:# nft add rule nat postrouting oifname "ens3" masquerade
- 如果
ens3
接口使用静态 IP 地址,请添加SNAT
规则。例如,如果ens3
使用 198.51.100.1 IP 地址:# nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
其他资源
6.3.5. 使用 nftables 配置重定向
重定向
功能是目标网络地址转换(DNAT)的一种特殊情况,它根据链 hook 将数据包重定向到本地计算机。
过程 6.12. 使用 nftables 配置重定向
- 创建一个表:
# nft add table nat
- 在表中添加 prerouting 链:
# nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
请注意,您必须将--
选项传递给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向 prerouting 链中添加一条规则,其将端口 22 上的传入流量重定向到端口 2222 :
# nft add rule nat prerouting tcp dport 22 redirect to 2222
其他资源
6.4. 使用 nftables 命令中的设置
nftables
框架原生支持集合。您可以使用一个集合,例如,规则匹配多个 IP 地址、端口号、接口或其他匹配标准。
6.4.1. 在 nftables 中使用匿名集合
{ 22, 80, 443 }
,您直接在规则中使用。您还可以将匿名集合用于 IP 地址或其他匹配标准。
先决条件
inet
系列中的 example_chain 链和 example_table 表存在。
过程 6.13. 在 nftables 中使用匿名集合
- 例如,要向 example_table 中的 example_chain 添加一条规则,其允许传入流量到端口
22
、80
和443
:# nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } accept
- 另外,还可在 example_table 中显示所有链及其规则:
# nft list table inet example_table table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport { ssh, http, https } accept } }
6.4.2. 在 nftables 中使用命名集
nftables
框架支持可变命名集合。命名集是一个列表或一组元素,您可以在表中的多个规则中使用。匿名集合的另外一个好处在于,您可以更新命名的集合而不必替换使用集合的规则。
- 包含 IPv4 地址或范围的集合的
ipv4_addr
,如192.0.2.1
或192.0.2.0/24
。 - 包含
IPv6
地址或范围的集合的ipv6_addr
,如2001:db8:1::1
或2001:db8:1::1/64
。 - 包含介质访问控制(
MAC
)地址列表的集合的ether_addr
,如52:54:00:6b:66:42
。 - 包含互联网协议类型列表的集合的
inet_proto
,如tcp
。 - 包含互联网服务列表的集合的
inet_service
,如ssh
。 - 包含数据包标记列表的集合的
mark
。数据包标记可以是任意正 32 位整数值(0
到2147483647
)。
先决条件
- example_chain 链和 example_table 表存在。
过程 6.14. 在 nftables 中使用命名集
创建一个空集。以下示例为
IPv4
地址创建一个集合:- 要创建可存储多个独立
IPv4
地址的集合:# nft add set inet example_table example_set { type ipv4_addr \; }
- 要创建可存储
IPv4
地址范围的集合:# nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
重要要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。- 另外,还可创建使用该集合的规则。例如,以下命令向 example_table 中的 example_chain 添加一条规则,该规则将丢弃 example_set 中来自
IPv4
地址的所有数据包。# nft add rule inet example_table example_chain ip saddr @example_set drop
由于 example_set 仍为空,所以该规则目前不起作用。 向 example_set 中添加 IPv4 地址:
- 如果您创建存储单个
IPv4
地址的集合,请输入:# nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }
- 如果您创建存储
IPv4
范围的集合,请输入:# nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }
当您指定 IP 地址范围时,您也可以使用无类别域间路由(CIDR)标记,如上例中的192.0.2.0/24
。
6.4.3. 相关信息
nft (8)
手册页中的 Sets
部分。
6.5. 在 nftables 命令中使用 verdict 映射
nft
能够通过将匹配条件映射到某个操作来根据数据包信息执行操作。
6.5.1. 在 nftables 中使用匿名映射
{ match_criteria : action }
语句。这个语句可以包含多个用逗号分开的映射。
过程 6.15. 在 nftables 中使用匿名映射
- 创建 example_table :
# nft add table inet example_table
- 在 example_table 中创建
tcp_packets
链:# nft add chain inet example_table tcp_packets
- 向统计此链中流量的
tcp_packets
中添加一条规则:# nft add rule inet example_table tcp_packets counter
- 在 example_table 中创建
udp_packets
链:# nft add chain inet example_table udp_packets
- 向统计此链中流量的
udp_packets
中添加一条规则:# nft add rule inet example_table udp_packets counter
- 为传入的流量创建一个链。例如,要在过滤传入的流量的 example_table 中创建一个名为
incoming_traffic
的链:# nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }
- 添加一条带有到
incoming_traffic
匿名映射的规则 :# nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }
匿名映射区分数据包,并根据它们的协议将它们发送到不同的计数链。 - 要列出流量计数器,请显示 example_table :
# nft list table inet example_table table inet example_table { chain tcp_packets { counter packets 36379 bytes 2103816 } chain udp_packets { counter packets 10 bytes 1559 } chain incoming_traffic { type filter hook input priority filter; policy accept; ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets } } }
tcp_packets
和udp_packets
链中的计数器显示两者接收的数据包和字节数。
6.5.2. 在 nftables 中使用命名映射
nftables
框架支持命名映射。您可以在表中的多个规则中使用这些映射。匿名映射的另一个好处在于,您可以更新命名映射而不比替换使用它的规则。
- 匹配部分包含
IPv4
地址的映射的ipv4_addr
,如192.0.2.1
。 - 匹配部分包含
IPv6
地址的映射的ipv6_addr
,如2001:db8:1::1
。 - 匹配部分包含介质访问控制(
MAC
)地址的映射的ether_addr
,如52:54:00:6b:66:42
。 - 匹配部分包含互联网协议类型的映射的
inet_proto
,如tcp
。 - 匹配部分包含互联网服务名称端口号的映射的
inet_service
,如ssh
或22
。 - 匹配部分包含数据包的映射的
mark
。数据包标记可以是任意正 32 位整数值(0
到2147483647
)。 - 匹配部分包含计数器值的映射的
counter
。计数器值可以是任意正 64 位整数值。 - 匹配部分包含配额值的映射的
quota
。配额值可以是任意正 64 位整数值。
过程 6.16. 在 nftables 中使用命名映射
- 创建表。例如,要创建一个名为 example_table 的表来处理
IPv4
数据包:# nft add table ip example_table
- 创建链。例如,要在 example_table 中创建一个名为 example_chain 的链:
# nft add chain ip example_table example_chain { type filter hook input priority 0 \; }
重要要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。 - 创建一个空的映射。例如,要为
IPv4
地址创建映射:# nft add map ip example_table example_map { type ipv4_addr : verdict \; }
- 创建使用该映射的规则。例如,以下命令向 example_table 中的 example_chain 添加一条规则,该规则将操作应用到 example_map 中定义的
IPv4
地址:# nft add rule example_table example_chain ip saddr vmap @example_map
- 向 example_map 添加
IPv4
地址和对应操作:# nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }
这个示例定义了IPv4
地址到操作的映射。与以上创建的规则相结合,防火墙接受来自192.0.2.1
的数据包,丢弃来自192.0.2.2
的数据包。 - 另外,还可添加另一个 IP 地址和 action 语句来增强映射:
# nft add element ip example_table example_map { 192.0.2.3 : accept }
- (可选)从映射中删除条目:
# nft delete element ip example_table example_map { 192.0.2.1 }
- 另外,还可显示规则集:
# nft list ruleset table ip example_table { map example_map { type ipv4_addr : verdict elements = { 192.0.2.2 : drop, 192.0.2.3 : accept } } chain example_chain { type filter hook input priority filter; policy accept; ip saddr vmap @example_map } }
6.5.3. 相关信息
nft (8)
手册页中的 Maps
部分。
6.6. 使用 nftables 配置端口转发
80
和 443
上的传入数据包转发到 web 服务器。使用这个防火墙规则,互联网中的用户可以使用防火墙的 IP 或主机名访问网页服务器。
6.6.1. 将传入的数据包转发到不同的本地端口
8022
上的传入 IPv4 数据包转发到本地系统的端口 22
。
过程 6.17. 将传入的数据包转发到不同的本地端口
- 使用 ip 地址系列创建一个名为
nat
的表:# nft add table ip nat
- 向表中添加
prerouting
和postrouting
链:# nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
注意将--
选项传给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向
prerouting
链中添加一条规则,将端口8022
上的传入数据包重定向到本地端口22
:# nft add rule ip nat prerouting tcp dport 8022 redirect to :22
6.6.2. 将特定本地端口上传入的数据包转发到不同主机
443
上的传入 IPv4 数据包转发到 IP 地址为 192.0.2.1
的远程系统上的同一端口。
前提条件
- 您以
root
用户身份登录应该转发数据包的系统上。
过程 6.18. 将特定本地端口上传入的数据包转发到不同主机
- 使用 ip 地址系列创建一个名为
nat
的表:# nft add table ip nat
- 向表中添加
prerouting
和postrouting
链:# nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; } # nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
注意将--
选项传给 nft 命令,以避免 shell 将负优先级值解析为 nft 命令的选项。 - 向
prerouting
链添加一条规则,该规则将端口443
上的传入数据包重定向到192.0.2.1
上的同一端口:# nft add rule ip nat prerouting tcp dport 443 dnat to 192.0.2.1
- 向
postrouting
链中添加一条规则来伪装出站流量:# nft add rule ip nat postrouting ip daddr 192.0.2.1 masquerade
- 启用数据包转发:
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
6.7. 使用 nftables 来限制连接数量
nftables
来限制连接数或限制到建立给定数量连接的块 IP 地址,以防止它们使用太多的系统资源。
6.7.1. 使用 nftables 限制连接数量
nft
工具的 ct count
参数可让管理员限制连接数量。这个步骤描述了如何限制进入的连接的基本示例。
先决条件
- example_table 中的基础example_chain 存在。
过程 6.19. 使用 nftables 限制连接数量
- 添加一条规则,仅允许从 IPv4 地址同时连接到
SSH
端口(22
),并从同一 IP 拒绝所有进一步连接:# nft add rule ip example_table example_chain tcp dport ssh meter example_meter { ip saddr ct count over 2 } counter reject
- 另外,还可以显示上一步中创建的 meter:
# nft list meter ip example_table example_meter table ip example_table { meter example_meter { type ipv4_addr size 65535 elements = { 192.0.2.1 : ct count over 2 , 192.0.2.2 : ct count over 2 } } }
elements
条目显示当前与该规则匹配的地址。在这个示例中,elements
列出已活跃连接到 SSH 端口的 IP 地址。请注意,输出不会显示活跃连接的数量,或者连接是否被拒绝。
6.7.2. 在一分钟内尝试超过十个进入的 TCP 连接的 IP 地址
nftables
框架可让管理员动态更新集合。本节解释了如何使用这个功能临时阻止在一分钟内建立十个 IPv4 TCP 连接的主机。五分钟后,nftables
会自动从拒绝列表中删除 IP 地址。
过程 6.20. 在一分钟内尝试超过十个进入的 TCP 连接的 IP 地址
- 使用 ip 地址系列创建 filter 表:
# nft add table ip filter
- 在 filter 表中添加输入链:
# nft add chain ip filter input { type filter hook input priority 0 \; }
- 在 filter 表中添加名为 denylist 的集合:
# nft add set ip filter denylist { type ipv4_addr \; flags dynamic, timeout \; timeout 5m \; }
这个命令为 IPv4 地址创建动态设置。timeout 5m
参数定义nftables
在 5 分钟后自动删除集合中的条目。 - 添加一条规则,该规则会在一分钟内尝试建立十个新的 TCP 连接的主机源 IP 地址添加到
denylist
集:# nft add rule ip filter input ip protocol tcp ct state new, untracked limit rate over 10/minute add @denylist { ip saddr }
- 添加一条规则,该规则丢弃来自
denylist
集合中 IP 地址的所有连接:# nft add rule ip filter input ip saddr @denylist drop
6.7.3. 其他资源
- 如需更多信息,请参阅 第 6.4.2 节 “在 nftables 中使用命名集”。
6.8. 调试 nftables 规则
nftables
框架为管理员提供了不同的选项来调试规则,以及数据包是否匹配。本节描述了这些选项。
6.8.1. 创建带有计数器的规则
先决条件
- 您要添加该规则的链已存在。
过程 6.21. 创建带有计数器的规则
- 在链中添加带有
counter
参数的新规则。以下示例添加了一个带有计数器的规则,允许端口 22 上的 TCP 流量,并统计与此规则匹配的数据包和流量:# nft add rule inet example_table example_chain tcp dport 22 counter accept
- 显示计数器值:
# nft list ruleset table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport ssh counter packets 6872 bytes 105448565 accept } }
6.8.2. 在现有规则中添加计数器
先决条件
- 您要添加计数器的规则已存在。
过程 6.22. 在现有规则中添加计数器
- 在链中显示规则及其句柄:
# nft --handle list chain inet example_table example_chain table inet example_table { chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport ssh accept # handle 4 } }
- 通过将规则替换为
counter
参数来添加计数器。以下示例替换了上一步中显示的规则并添加计数器:# nft replace rule inet example_table example_chain handle 4 tcp dport 22 counter accept
- 显示计数器值:
# nft list ruleset table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport ssh counter packets 6872 bytes 105448565 accept } }
6.8.3. 监控与现有规则匹配的数据包
nftables
中的追踪功能与 nft monitor 命令相结合,使管理员能够显示与某一规则匹配的数据包。该流程描述了如何为规则启用追踪以及与本规则匹配的监控数据包。
先决条件
- 您要添加计数器的规则已存在。
过程 6.23. 监控与现有规则匹配的数据包
- 在链中显示规则及其句柄:
# nft --handle list chain inet example_table example_chain table inet example_table { chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport ssh accept # handle 4 } }
- 通过使用
meta
nftrace
set
参数替换规则来添加追踪功能。1
以下示例替换了上一步中显示的规则并启用追踪:# nft replace rule inet example_table example_chain handle 4 tcp dport 22 meta nftrace set 1 accept
- 使用 nft monitor 命令来显示追踪。以下示例过滤了命令的输出,来只显示包含
inet example_table example_chain
的条目:# nft monitor | grep "inet example_table example_chain" trace id 3c5eb15e inet example_table example_chain packet: iif "enp1s0" ether saddr 52:54:00:17:ff:e4 ether daddr 52:54:00:72:2f:6e ip saddr 192.0.2.1 ip daddr 192.0.2.2 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 49710 ip protocol tcp ip length 60 tcp sport 56728 tcp dport ssh tcp flags == syn tcp window 64240 trace id 3c5eb15e inet example_table example_chain rule tcp dport ssh nftrace set 1 accept (verdict accept) ...
警告根据启用了追踪的规则数量以及匹配流量的数量,nft monitor 命令可以显示很多输出。使用 grep 或其他工具来过滤输出。
第 7 章 系统审计
- 事件的日期、时间、类型和结果.
- 主题和对象的敏感度标签。
- 事件与触发事件的用户身份的关联。
- 对审计配置的所有修改,以及对访问审计日志文件的尝试。
- 所有身份验证机制的使用,如 SSH 和 Kerberos 等。
- 对任何受信任数据库的修改,如
/etc/passwd
。 - 尝试将信息导入系统或从系统导出。
- 根据用户身份、主题和对象标签以及其他属性包含或排除事件。
- 受控访问保护配置文件(CAPP)
- 标记的安全保护配置文件(LSPP)
- 规则集基本访问控制(RSBAC)
- 国家工业安全计划操作手册(NISPOM)
- 联邦信息安全管理法案(FISMA)
- 支付卡行业 - 数据安全标准(PCI-DSS)
- 安全技术实施指南(STIG)
- 由国家信息保障合作伙伴(NIAP)和最佳安全行业(BSI)评估。
- Red Hat Enterprise Linux 5 上的 LSPP/CAPP/RSBAC/EAL4+ 认证.
- Red Hat Enterprise Linux 6 上的操作系统保护配置文件/评估保障级别 4+(OSPP/EAL4+)认证.
使用案例
- 监视文件访问
- 审计可以跟踪文件或目录是否已被访问、修改、执行或者文件的属性是否已改变。例如,这有助于检测对重要文件的访问,并在其中一个文件损坏时提供审计跟踪。
- 监控系统调用
- 可将审计配置为在每次使用特定系统调用时生成日志条目。例如,这可用于通过监控
settimeofday
、clock_adjtime
和其他与时间相关的系统调用来跟踪对系统时间的修改。 - 记录用户运行的命令
- 审计可以跟踪文件是否已被执行,因此可以定义一个规则以记录每次特定命令的执行。例如,可以对
/bin
目录中的每个可执行文件定义一个规则。然后,可以按用户 ID 搜索生成的日志条目,以生成每个用户所执行的命令的审计跟踪。 - 记录系统路径名称的执行
- 除了观察在规则调用时将路径转换为 inode 的文件访问之外,审计现在还可以观察路径的执行,即使路径在规则调用中不存在,或者在规则调用后文件被替换了。这允许规则在升级程序可执行文件后或甚至在其安装之前继续运行。
- 记录安全事件
pam_faillock
认证模块能够记录失败的登录尝试。也可以将审计设置为记录失败的登录尝试,并提供有关试图登录的用户的附加信息。- 搜索事件
- 审计提供了 ausearch 工具,可用于过滤日志条目,并根据多个条件提供完整的审计跟踪。
- 运行总结报告
- aureport 实用程序可用于生成记录事件的日常报告等。然后,系统管理员可以分析这些报告,并进一步调查可疑的活动。
- 监控网络访问
- iptables 和 ebtables 工具可以配置为触发审计事件,允许系统管理员监控网络访问。
7.1. 审计系统架构
- audisp - Audit 分配程序守护进程与 Audit 守护进程交互,并将事件发送到其他应用程序,以便进一步处理。此守护进程的目的是提供插件机制,以便实时分析程序可以与审计事件交互。
- auditctl - 审计控制实用程序与内核审计组件交互,以管理规则并控制事件生成进程的多个设置和参数。
- 其余的审计工具会将审计日志文件的内容作为输入,并根据用户的要求生成输出。例如,aureport 工具生成所有记录的事件的报告。
7.2. 安装 audit 软件包
~]# yum install audit
7.3. 配置 审计
服务
/etc/audit/auditd.conf
文件中配置。此文件由修改审计守护进程行为的配置参数组成。哈希符号(#
)后面的空行和文本将被忽略。详情请查看 auditd.conf(5) man page。
7.3.1. 为安全环境配置 auditd
auditd
配置应该适合于大多数环境。但是,如果您的环境必须满足严格的安全策略,建议对 /etc/audit/auditd.conf
文件中的审计守护进程配置进行以下设置:
- log_file
- 包含审计日志文件的目录(通常为
/var/log/audit/
)应位于单独的挂载点上。这可以防止其他进程消耗此目录的空间,并为审计守护进程提供准确的剩余空间检测。 - max_log_file
- 指定单个审计日志文件的最大大小,必须设置为充分利用保存审计日志文件的分区上的可用空间。
max_log_file
参数指定最大文件大小(以 MB 为单位)。给出的值必须是数字。 - max_log_file_action
- 在达到
max_log_file
中设置的限制后,决定要采取什么操作,应设置为keep_logs
以防止审计日志文件被覆盖。 - space_left
- 指定磁盘上剩余的可用空间量,该磁盘中触发
space_left_action
参数中设置的操作。必须设置一个数字,让管理员有足够的时间来响应,并释放磁盘空间。space_left
值取决于生成审计日志文件的速率。如果space_left
的值指定为整数,它将解释为绝对大小(MiB)。如果该值指定为 1 到 99 之间的数字,后跟一个百分比符号(例如 5%),则审计守护进程会根据包含log_file
的文件系统的大小计算绝对大小(以 MB 为单位)。 - space_left_action
- 建议您使用适当的通知方法将
space_left_action
参数设置为email
或exec
。 - admin_space_left
- 指定触发
admin_space_left_action
参数中设置的操作的绝对最小可用空间量,必须将其设置为一个值,以便有足够的空间来记录管理员执行的操作。此参数的数字值应小于space_left
的数字值。您还可以在数字后面附加一个百分比符号(例如 1%),以便审计守护进程根据磁盘分区计算数值。 - admin_space_left_action
- 应设置为
single
来将系统置于单用户模式,并允许管理员释放一些磁盘空间。 - disk_full_action
- 指定当保存审计日志文件的分区上没有可用空间时触发的操作,必须设置为
halt
或single
。当审计无法记录事件时,这可确保系统关闭或以单用户模式运行。 - disk_error_action
- 指定当在包含审计日志文件的分区上检测到错误时触发的操作,必须设置为
syslog
、single
或halt
,具体取决于您处理硬件故障的本地安全策略。 - flush
- 应设置为
incremental_async
。它与freq
参数结合使用,该参数决定了在强制与硬盘进行硬盘同步前可以将多少条记录发送到磁盘。freq
参数应设置为100
。这些参数可确保审计事件数据与磁盘上的日志文件同步,同时保持良好的活动性能。
7.4. 启动 审计
服务
auditd
后,启动服务以收集审计信息并将其存储在日志文件中。以 root 用户身份运行以下命令来启动 auditd
:
~]# service auditd start
auditd
守护进程正确交互的唯一方法。您需要使用 service 命令,以便正确记录 auid
值。您只将 systemctl 命令用于两个操作: enable 和 status。
auditd
配置为在引导时启动:
~]# systemctl enable auditd
auditd
执行许多其他操作,其中 action 可以是以下之一:
- stop
- 停止
auditd
。 - restart
- 重新启动
auditd
。 - reload 或 force-reload
- 重新加载
/etc/audit/auditd.conf
文件中 auditd 的配置。 - rotate
- 轮转
/var/log/audit/
目录中的日志文件。 - resume
- 在其之前被暂停后重新恢复审计事件记录,例如,当保存审计日志文件的磁盘分区中没有足够的可用空间时。
- condrestart 或 try-restart
- 只有当 auditd 运行时才重新启动它。
- status
- 显示 auditd 的运行状态。
7.5. 定义审计规则
- 控制规则
- 允许修改 Audit 系统的行为及其某些配置。
- 文件系统规则
- 也称为文件监视,允许审核对特定文件或目录的访问。
- 系统调用规则
- 允许记录任何指定程序进行的系统调用。
- 在命令行中使用 auditctl 工具。请注意,这些规则在重启后不会保留。详情请查看 第 7.5.1 节 “使用 auditctl定义审计规则”
- 在
/etc/audit/audit.rules
文件中。详情请查看 第 7.5.3 节 “在/etc/audit/audit.rules
文件中定义持久性审计规则和控制”
7.5.1. 使用 auditctl定义审计规则
CAP_AUDIT_CONTROL
功能来设置审计服务,以及记录用户消息所需的 CAP_AUDIT_WRITE
功能。
定义控制规则
-b
- 在内核中设置现有审计缓冲区的最大数量,例如:
~]# auditctl -b 8192
-f
- 设置在检测到关键错误时执行的操作,例如:
~]# auditctl -f 2
以上配置会在出现严重错误时触发内核 panic。 -e
- 启用和禁用审计系统或锁定其配置,例如:
~]# auditctl -e 2
以上命令锁定 Audit 配置。 -r
- 设置每秒生成的消息率,例如:
~]# auditctl -r 0
以上配置对生成的消息没有设置速率限制。 -s
- 报告审计系统状态,例如:
~]# auditctl -s AUDIT_STATUS: enabled=1 flag=2 pid=0 rate_limit=0 backlog_limit=8192 lost=259 backlog=0
-l
- 列出所有当前载入的审计规则,例如:
~]# auditctl -l -w /etc/passwd -p wa -k passwd_changes -w /etc/selinux -p wa -k selinux_changes -w /sbin/insmod -p x -k module_insertion ⋮
-D
- 删除所有当前载入的审计规则,例如:
~]# auditctl -D No rules
定义文件系统规则
auditctl -w path_to_file -p permissions -k key_name
- path_to_file 是审计的文件或目录。
- 权限 是日志记录的权限:
r
- 对文件或目录的读访问权限。w
- 对文件或目录的写入访问权限。X
- 执行对文件或目录的访问。- A - 更改文件或目录的属性。
- key_name 是一个可选字符串,可帮助您识别哪个规则或一组规则生成特定的日志条目。
例 7.1. 文件系统规则
/etc/passwd
文件的每个属性,请执行以下命令:
~]# auditctl -w /etc/passwd -p wa -k passwd_changes
-k
选项后面的字符串是任意字符串。
/etc/selinux/
目录中的所有文件,请执行以下命令:
~]# auditctl -w /etc/selinux/ -p wa -k selinux_changes
~]# auditctl -w /sbin/insmod -p x -k module_insertion
定义系统调用规则
auditctl -a action,filter -S system_call -F field=value -k key_name
- action 和 filter 指定何时记录特定事件。操作 可以是
always
或never
。filter 指定将哪个内核规则匹配过滤器应用到事件。rule-matching 过滤器可以是以下之一:任务
、退出
、用户
,以及排除
。有关这些过滤器的详情请参考开始 第 7.1 节 “审计系统架构”。 - system_call 按名称指定系统调用。所有系统调用的列表可在
/usr/include/asm/unistd_64.h
文件中找到。多个系统调用可以分组到一个规则中,每个规则都在其自身-S
选项后指定。 - field=value 指定附加选项,进一步根据指定的架构、组 ID、进程 ID 等进一步修改规则来匹配事件。有关所有可用字段类型及其值的完整列表,请查看 auditctl(8) man page。
- key_name 是一个可选字符串,可帮助您识别哪个规则或一组规则生成特定的日志条目。
例 7.2. 系统调用规则
adjtimex
或 settimeofday
系统调用时创建日志条目,系统会使用 64 位架构,请使用以下命令:
~]# auditctl -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change
~]# auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
-F auid!=4294967295
选项用于排除未设置登录 UID 的用户。
-w /etc/shadow -p wa
文件系统规则的规则:
~]# auditctl -a always,exit -F path=/etc/shadow -F perm=wa
7.5.2. 定义可执行文件规则
auditctl -a action,filter [ -F arch=cpu -S system_call] -F exe=path_to_executable_file -k key_name
- action 和 filter 指定何时记录特定事件。操作 可以是
always
或never
。filter 指定将哪个内核规则匹配过滤器应用到事件。rule-matching 过滤器可以是以下之一:任务
、退出
、用户
,以及排除
。有关这些过滤器的详情请参考开始 第 7.1 节 “审计系统架构”。 - system_call 按名称指定系统调用。所有系统调用的列表可在
/usr/include/asm/unistd_64.h
文件中找到。多个系统调用可以分组到一个规则中,每个规则都在其自身-S
选项后指定。 - path_to_executable_file 是审计的可执行文件的绝对路径。
- key_name 是一个可选字符串,可帮助您识别哪个规则或一组规则生成特定的日志条目。
例 7.3. 可执行文件规则
/bin/id
程序的执行,请执行以下命令:
~]# auditctl -a always,exit -F exe=/bin/id -F arch=b64 -S execve -k execution_bin_id
7.5.3. 在 /etc/audit/audit.rules
文件中定义持久性审计规则和控制
/etc/audit/audit.rules
文件中,或使用 augenrules 程序读取位于 /etc/audit/rules.d/
目录中的规则。/etc/audit/audit.rules
文件使用相同的 auditctl 命令行语法来指定规则。哈希符号(#
)后面的空行和文本将被忽略。
-R
选项从指定的文件中读取规则,例如:
~]# auditctl -R /usr/share/doc/audit/rules/30-stig.rules
定义控制规则
-b
、-D
、-e
、-f
、--r
、--loginuid-immutable
和 --backlog_wait_time
。有关这些选项的详情请参考 “定义控制规则”一节。
例 7.4. audit.rules
中的控制规则
# Delete all previous rules -D # Set buffer size -b 8192 # Make the configuration immutable -- reboot is required to change audit rules -e 2 # Panic when a failure occurs -f 2 # Generate at most 100 audit messages per second -r 100 # Make login UID immutable once it is set (may break containers) --loginuid-immutable 1
定义文件系统和系统调用规则
例 7.5. audit.rules
中的文件系统和系统调用规则
-w /etc/passwd -p wa -k passwd_changes -w /etc/selinux/ -p wa -k selinux_changes -w /sbin/insmod -p x -k module_insertion -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
预配置的规则文件
/usr/share/doc/audit/rules/
目录中,audit 软件包会根据各种认证标准提供一组预配置的规则文件:
30-NISPOM.rules
- 满足国家工业安全计划操作手册中信息系统安全章节中指定的要求的审计规则配置。30-PCI-dss-v31.rules
- 满足支付卡行业数据安全标准(PCI DSS) v3.1 要求的审计规则配置。30-STIG.rules
- 满足安全技术实施指南(STIG)设置的要求的审计规则配置。
/etc/audit/audit.rules
文件的备份,并在 /etc/audit/audit.rules
文件中复制您选择的配置文件:
~]# cp /etc/audit/audit.rules /etc/audit/audit.rules_backup ~]# cp /usr/share/doc/audit/rules/30-stig.rules /etc/audit/audit.rules
/usr/share/doc/audit/rules/README-rules
文件。
使用 augenrules 定义持久性规则
/etc/audit/rules.d/
目录下的规则,并将它们编译成audit.rures
文件。此脚本会根据它们的自然排序顺序,以特定顺序处理以 .rules
结尾的所有文件。这个目录中的文件被组织成组,其含义如下:
- 10 - 内核和 auditctl 配置
- 20 - 可与常规规则匹配但您希望不同匹配的规则
- 30 - 主规则
- 40 - 可选规则
- 50 - 特定于服务器的规则
- 70 - 系统本地规则
- 90 - 定稿(不可变)
/etc/audit/rules.d/
。例如,要在 STIG 配置中设置系统,请复制规则 10-base-config、30-stig、31-privileged 和 99-finalize。
/etc/audit/rules.d/
目录中有了规则之后,运行带有 --load
参数的 augenrules 脚本来加载它们:
~]# augenrules --load
augenrules --load No rules
enabled 1
failure 1
pid 634
rate_limit 0
backlog_limit 8192
lost 0
backlog 0
enabled 1
failure 1
pid 634
rate_limit 0
backlog_limit 8192
lost 0
backlog 1
audit.rules (8)
和 augenrules (8)
手册页。
7.6. 了解审计日志文件
/var/log/audit/audit.log
文件中;如果启用了日志轮转,则轮转的 audit.log
文件也在存储同一个目录中。
/etc/ssh/sshd_config
文件:
-w /etc/ssh/sshd_config -p warx -k sshd_config
auditd
守护进程正在运行,使用以下命令在审计日志文件中创建新事件,例如:
~]$ cat /etc/ssh/sshd_config
audit.log
文件中的该事件如下。
type=SYSCALL msg=audit(1364481363.243:24287): arch=c000003e syscall=2 success=no exit=-13 a0=7fffd19c5592 a1=0 a2=7fffd19c4b50 a3=a items=1 ppid=2686 pid=3538 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="cat" exe="/bin/cat" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="sshd_config" type=CWD msg=audit(1364481363.243:24287): cwd="/home/shadowman" type=PATH msg=audit(1364481363.243:24287): item=0 name="/etc/ssh/sshd_config" inode=409248 dev=fd:00 mode=0100600 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0 objtype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 type=PROCTITLE msg=audit(1364481363.243:24287) : proctitle=636174002F6574632F7373682F737368645F636F6E666967
type=
关键字开头。每个记录由多个 name=value
对组成,它们之间由空格或逗号分开。对上述事件的详细分析如下:
第一条记录
type=SYSCALL
type
字段包含记录的类型。在本例中,SYSCALL
值指定此记录是由对内核的系统调用触发的。有关所有可能类型值及其解释的列表,请参阅 审计记录类型。msg=audit(1364481363.243:24287):
msg
字段记录:- 记录的时间戳和唯一 ID,格式为
audit(time_stamp:ID)
。如果多个记录是作为同一审计事件的一部分而产生的,则它们共享相同的时间戳和 ID。时间戳使用 Unix 时间格式 - 自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。 - 各种特定于事件的
name= 由内核或用户空间应用程序提供的值对
。
arch=c000003e
arch
字段包含系统的 CPU 架构信息。该值c000003e
以十六进制表示法编码。当使用 ausearch 命令搜索审计记录时,请使用-i
或--interpret
选项来自动将十六进制值转换成人类可读的等效值。c000003e
值被解释为x86_64
。syscall=2
syscall
字段记录了发送到内核的系统调用的类型。值2
可以与/usr/include/asm/unistd_64.h
文件中人类可读的等效值匹配。在本例中,2
是打开
系统调用。请注意,ausyscall 工具允许您将系统调用号转换为人类可读的等效值。使用 ausyscall --dump 命令显示所有系统调用及其编号的列表。如需更多信息,请参阅 ausyscall(8) man page。success=no
success
字段记录了该特定事件中记录的系统调用是成功还是失败。在这种情况下,调用不成功。exit=-13
exit
字段包含一个值,指定系统调用返回的退出码。这个值因不同的系统调用而异。您可以使用以下命令将值解释成人类可读的等效值:~]# ausearch --interpret --exit -13
请注意,上例假定您的审计日志包含一个失败的事件,其退出码为-13
。a0=7fffd19c5592
,a1=0
,a2=7fffd19c5592
,a3=a
a0
至a3
字段记录了该事件中系统调用的前四个参数,用十六进制符号编码。这些参数取决于使用的系统调用,可以通过 ausearch 工具来解释它们。items=1
items
字段包含系统调用记录后面的 PATH 辅助记录的数量。ppid=2686
ppid
字段记录了父进程ID(PPID)。在这种情况下,2686
是父进程(如bash
)的 PPID 。pid=3538
pid
字段记录了进程 ID(PID)。在本例中,3538
是cat
进程的 PID。auid=1000
auid
字段记录了审计用户 ID,即loginuid。此 ID 在登录时分配给用户,并被每个进程继承,即使用户的身份有变化,例如,使用 su - john 命令切换用户帐户。uid=1000
uid
字段记录了启动分析过程的用户的用户 ID。使用以下命令可以将用户 ID 解释成用户名:ausearch -i --uid UID。gid=1000
gid
字段记录了启动分析过程的用户的组 ID。euid=1000
euid
字段记录了启动分析过程的用户的有效用户 ID。suid=1000
suid
字段记录了启动分析过程的用户的设置用户 ID。fsuid=1000
fsuid
字段记录了启动分析进程的用户的文件系统用户 ID。egid=1000
egid
字段记录了启动分析过程的用户的有效组 ID。sgid=1000
sgid
字段记录了启动分析过程的用户的组 ID。fsgid=1000
fsgid
字段记录了启动分析进程的用户的文件系统组 ID。tty=pts0
tty
字段记录了分析过程被调用的终端。ses=1
ses
字段记录了分析过程被调用的会话的会话 ID。comm="cat"
comm
字段记录了用于调用分析过程的命令行名称。在本例中,cat 命令用于触发此审计事件。exe="/bin/cat"
exe
字段记录了用于调用分析过程的可执行文件的路径。subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
subj
字段记录了被分析的进程在执行时被标记的 SELinux 上下文。key="sshd_config"
key
记录了与在审计日志中生成该事件的规则相关联的管理员定义的字符串。
第二条记录
type=CWD
- 在第二条记录中,
type
字段值为CWD
- 当前工作目录。此类型用于记录从中调用第一条记录中指定的系统调用的进程的工作目录。此记录的目的是记录当前进程的位置,以防在关联的 PATH 记录中捕获相对路径。这样,就可以重建绝对路径。 msg=audit(1364481363.243:24287)
msg
字段持有与第一条记录中的值相同的时间戳和 ID 值。时间戳使用 Unix 时间格式 - 自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。cwd="/home/user_name"
cwd
字段包含系统调用所在目录的路径。
第三条记录
type=PATH
- 在第三条记录中,
type
字段值为PATH
。审计事件包含作为参数传递给系统调用的每个路径的PATH
类型记录。在这个审计事件中,只有一个路径(/etc/ssh/sshd_config
) 被用作参数。 msg=audit(1364481363.243:24287):
msg
字段拥有与第一和第二条记录中的值相同的时间戳和 ID 值。item=0
item
字段表示在SYSCALL
类型记录所引用的项目总数中,当前记录是哪个项目。这个数是以零为基础的;值为0
表示它是第一项。name="/etc/ssh/sshd_config"
name
字段记录了作为参数传递给系统调用的文件或目录的路径。在本例中,它是/etc/ssh/sshd_config
文件。inode=409248
inode
字段包含与该事件中记录的文件或目录相关联的 inode 号。以下命令显示与409248
inode 号相关联的文件或目录:~]# find / -inum 409248 -print /etc/ssh/sshd_config
dev=fd:00
dev
字段指定了包含该事件中记录的文件或目录的设备的次要和主要 ID。在本例中,值表示/dev/fd/0
设备。mode=0100600
mode
字段记录文件或目录权限,由数字标记。它是st_mode
字段中的 stat 命令返回。如需更多信息,请参阅stat(2)
手册页。在这种情况下,0100600
可以解释为-rw-------
,这意味着只有 root 用户对/etc/ssh/sshd_config
文件具有读和写的权限。ouid=0
ouid
字段记录了对象所有者的用户 ID。ogid=0
ogid
字段记录了对象所有者的组 ID。rdev=00:00
rdev
字段包含一个记录的设备标识符,仅用于特殊文件。在这种情况下,不会使用它,因为记录的文件是一个常规文件。obj=system_u:object_r:etc_t:s0
obj
字段记录了 SELinux 上下文,在执行时,记录的文件或目录被贴上了标签。objtype=NORMAL
objtype
字段记录了给定系统调用的上下文中每个路径记录操作的意图。cap_fp=none
cap_fp
字段记录了与设置文件或目录对象的基于文件系统的允许能力有关的数据。cap_fi=none
cap_fi
字段记录了与文件或目录对象的基于继承文件系统的能力设置有关的数据。cap_fe=0
cap_fe
字段记录了文件或目录对象基于文件系统能力的有效位的设置。cap_fver=0
cap_fver
字段记录了文件或目录对象基于文件系统能力的版本。
第四条记录
type=PROCTITLE
type
字段包含记录的类型。在本例中,PROCTITLE
值指定此记录提供触发此审计事件的完整命令行,该事件是由对内核的系统调用触发的。proctitle=636174002F6574632F7373682F737368645F636F6E666967
proctitle
字段记录了用于调用分析过程的命令的完整命令行。该字段采用十六进制表示法编码,不允许用户影响审计日志解析器。对触发此审计事件的命令进行文本解码。当使用 ausearch 命令搜索审计记录时,请使用-i
或--interpret
选项来自动将十六进制值转换成人类可读的等效值。636174002F6574632F7373682F737368645F636F6E666967
值解释为cat /etc/ssh/sshd_config
。
例 7.6. 其他 audit.log
事件
auditd
守护进程。ver
字段显示启动的审计守护进程的版本。
type=DAEMON_START msg=audit(1363713609.192:5426): auditd start, ver=2.2 format=raw kernel=2.6.32-358.2.1.el6.x86_64 auid=1000 pid=4979 subj=unconfined_u:system_r:auditd_t:s0 res=success
type=USER_AUTH msg=audit(1364475353.159:24270): user pid=3280 uid=1000 auid=1000 ses=1 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:authentication acct="root" exe="/bin/su" hostname=? addr=? terminal=pts/0 res=failed'
7.7. 搜索审计日志文件
/var/log/audit/audit.log
文件。您可以使用 ausearch options -if file_name 命令指定不同的文件。在一个 ausearch 命令中提供多个选项等同于在字段类型和相同字段类型的多个实例间使用 AND 运算符。
例 7.7. 使用 ausearch 搜索审计日志文件
/var/log/audit/audit.log
文件以失败的登录尝试,请使用以下命令:
~]# ausearch --message USER_LOGIN --success no --interpret
~]# ausearch -m ADD_USER -m DEL_USER -m ADD_GROUP -m USER_CHAUTHTOK -m DEL_GROUP -m CHGRP_ID -m ROLE_ASSIGN -m ROLE_REMOVE -i
~]# ausearch -ua 1000 -i
~]# ausearch --start yesterday --end now -m SYSCALL -sv no -i
7.8. 创建审计报告
/var/log/audit/
目录中的所有 audit.log
文件来创建报告。您可以使用 aureport options -if file_name 命令指定要针对运行报告的不同文件。
例 7.8. 使用 aureport 生成审计报告
~]# aureport --start 04/08/2013 00:00:00 --end 04/11/2013 00:00:00
~]# aureport -x
~]# aureport -x --summary
~]# aureport -u --failed --summary -i
~]# aureport --login --summary -i
1000
的所有文件访问事件,请使用以下命令:
~]# ausearch --start today --loginuid 1000 --raw | aureport -f --summary
~]# aureport -t
7.9. 其它资源
在线源
- RHEL Audit 系统 Refence: https://access.redhat.com/articles/4409591.
- Linux Audit 文档项目页面: https://github.com/linux-audit/audit-documentation/wiki
安装的文档
/usr/share/doc/audit/
目录中找到。
手册页
- audispd.conf(5)
- auditd.conf(5)
- ausearch-expression(5)
- audit.rules(7)
- audispd(8)
- auditctl(8)
- auditd(8)
- aulast(8)
- aulastlog(8)
- aureport(8)
- ausearch(8)
- ausyscall(8)
- autrace(8)
- auvirt(8)
第 8 章 扫描系统以了解配置合规和漏洞
8.1. RHEL 中的配置合规工具
- SCAP Workbench - scap-workbench 图形工具旨在对单个本地或远程系统执行配置和漏洞扫描。您还可以根据这些扫描和评估,使用它来生成安全报告。
- OpenSCAP - OpenSCAP 库以及附带的 oscap 命令行工具,旨在对本地系统执行配置和漏洞扫描,验证配置合规性内容,并根据这些扫描和评估生成报告和指南。
- SCAP 安全指南(SSG) - scap-security-guide 软件包为 Linux 系统提供最新的安全策略集合。该指南包括一个实用强化建议目录,在适用的情况下与政府的要求相关联。该项目弥补了一般性政策要求和具体实施指南间的差距。
- 脚本检查引擎(SCE) - SCE 是 SCAP 协议的扩展,可供管理员使用脚本语言(如 Bash、Python 和 Ruby)编写安全内容。SCE 扩展在 openscap-engine-sce 软件包中提供。SCE 本身不是 SCAP 环境的一部分。
其它资源
oscap (8)
- oscap 命令行工具的手册页提供了可用选项及其用法的完整列表。- 红帽安全演示:创建自定义安全策略内容以自动化安全合规 - 一个动手实验室,使用 Red Hat Enterprise Linux 中包含的工具来获取自动化安全合规的初始经验,以符合行业标准安全策略和自定义安全策略。如果您希望为您的团队提供培训或访问这些实验室练习,请联系您的红帽客户团队以了解更多详细信息。
- 红帽安全演示:使用 RHEL 安全技术保护自己 - 一个动手实验室,了解如何使用 Red Hat Enterprise Linux 中可用的关键安全技术(包括 OpenSCAP)在所有 RHEL 系统级别实施安全性。如果您希望为您的团队提供培训或访问这些实验室练习,请联系您的红帽客户团队以了解更多详细信息。
scap-workbench (8)
- SCAP Workbench 应用的手册页提供了有关应用程序的基本信息,以及 SCAP 内容潜在来源的链接。scap-security-guide (8)
- scap-security-guide 项目的手册页提供了更多有关各种可用的 SCAP 安全配置集的文档。它还包含使用 OpenSCAP 工具提供的基准的示例。- 管理 Red Hat Satellite 指南中的安全合规管理提供了有关将 OpenSCAP 与 Red Hat Satellite 搭配使用的更多详情。
8.2. 漏洞扫描
8.2.1. 红帽安全公告 OVAL Feed
8.2.2. 扫描系统是否存在漏洞
流程
- 安装 openscap-scanner 和 bzip2 软件包:
~]#
yum install openscap-scanner bzip2 - 下载系统的最新 RHSA OVAL 定义,例如:
~]#
wget -O - https://www.redhat.com/security/data/oval/v2/RHEL7/rhel-7.oval.xml.bz2 | bzip2 --decompress > rhel-7.oval.xml - 扫描系统漏洞并将结果保存到 vulnerability.html 文件中:
~]#
oscap oval eval --report vulnerability.html rhel-7.oval.xml
验证
- 在您选择的浏览器中检查结果,例如:
~]$
firefox vulnerability.html &
其它资源
oscap (8)
手册页。- Red Hat OVAL 定义 列表。
8.2.3. 扫描远程系统中的漏洞
oscap-ssh
工具,使用 OpenSCAP 扫描程序来检查远程系统的漏洞。
先决条件
- openscap-scanner 软件包安装在远程系统上。
- SSH 服务器在远程系统上运行。
流程
- 安装 openscap-utils 和 bzip2 软件包:
~]#
yum install openscap-utils bzip2 - 下载系统的最新 RHSA OVAL 定义:
~]#
wget -O - https://www.redhat.com/security/data/oval/v2/RHEL7/rhel-7.oval.xml.bz2 | bzip2 --decompress > rhel-7.oval.xml - 扫描 SSH 在端口 22 上运行、用户名为 joesec、主机名为 machine1 的远程系统上的漏洞,并将结果保存到 remote-vulnerability.html 文件中:
~]#
oscap-ssh joesec@machine1 22 oval eval --report remote-vulnerability.html rhel-7.oval.xml
其它资源
oscap-ssh (8)
手册页。- Red Hat OVAL 定义 列表。
8.3. 配置合规性扫描
8.3.1. RHEL 7 中的配置合规性
合规性扫描资源的结构
Data stream ├── xccdf | ├── benchmark | ├── profile | ├──rule | ├── xccdf | ├── oval reference ├── oval ├── ocil reference ├── ocil ├── cpe reference └── cpe └── remediation
8.3.2. OpenSCAP 扫描的可能结果
结果 | 介绍 |
---|---|
Pass | 扫描没有发现与此规则有任何冲突。 |
Fail | 扫描发现与此规则有冲突。 |
Not checked | OpenSCAP 对此规则不执行自动评估。手动检查您的系统是否符合此规则。 |
Not applicable | 此规则不适用于当前配置。 |
Not selected | 此规则不是配置文件的一部分。OpenSCAP 不评估此规则,也不会在结果中显示这些规则。 |
Error | 扫描遇到了错误。如需更多信息,您可以输入带有-verbose DEVEL 选项的 oscap-scanner 命令。考虑打开 bug 报告。 |
Unknown | 扫描遇到了意外情况。如需更多信息,您可以输入带有-verbose DEVEL 选项的 oscap-scanner 命令。考虑打开 bug 报告。 |
8.3.3. 查看配置合规性的配置集
先决条件
- 已安装 openscap-scanner 和 scap-security-guide 软件包。
流程
- 列出 SCAP 安全指南项目提供的带有配置合规配置文件的所有可用文件:
~]$
ls /usr/share/xml/scap/ssg/content/ ssg-firefox-cpe-dictionary.xml ssg-rhel6-ocil.xml ssg-firefox-cpe-oval.xml ssg-rhel6-oval.xml ... ssg-rhel6-ds-1.2.xml ssg-rhel8-xccdf.xml ssg-rhel6-ds.xml ... - 使用 oscap info 子命令显示关于所选数据流的详细信息。包含数据流的 XML 文件由其名称中的
-ds
字符串表示。在Profiles
部分,您可以找到可用的配置文件及其 ID 列表:~]$
oscap info /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml ... Profiles: Title: PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 7 Id: xccdf_org.ssgproject.content_profile_pci-dss Title: OSPP - Protection Profile for General Purpose Operating Systems v. 4.2.1 Id: xccdf_org.ssgproject.content_profile_ospp ... - 从数据流文件中选择一个配置文件,并显示所选配置文件的更多详情。为此,请使用带有
--profile
选项的 oscap info,后跟上一命令输出中显示的 ID 的后缀。例如,PCI-DSS 配置集的 ID 为:xccdf_org.ssgproject.content_profile_pci-dss
,--profile
选项的值可以是_pci-dss
:~]$
oscap info --profile _pci-dss /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml ... Profile Title: PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 7 Id: xccdf_org.ssgproject.content_profile_pci-dss Description: Ensures PCI-DSS v3.2.1 related security configuration settings are applied. ... - 另外,在使用 GUI 时,安装 scap-security-guide-doc 软件包并在网页浏览器中打开
file:///usr/share/doc/scap-security-guide-doc-0.1.46/ssg-rhel7-guide-index.html
文件。在 指南的右上方选择 Red Hat Enterprise Linux 7 安全配置 文档中的所需配置文件,您可以为后续评估在相关命令中看到已包含的 ID。
其它资源
scap-security-guide (8)
手册页还包含配置集列表。
8.3.4. 使用特定 Baseline 评估配置合规
先决条件
- 已安装 openscap-scanner 和 scap-security-guide 软件包。
- 您知道系统应遵守的基准中的配置文件的 ID。要查找 ID,请参阅 第 8.3.3 节 “查看配置合规性的配置集”。
流程
- 使用所选配置文件评估系统的合规性,并将扫描结果保存在 report.html HTML 文件中,例如:
~]$
sudo oscap xccdf eval --report report.html --profile ospp /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml - 可选:扫描带有 machine1 主机名、在端口 22 上运行的 SSH 的远程系统,以及 joesec 用户名中的漏洞,并将结果保存到 remote-report.html 文件中:
~]$
oscap-ssh joesec@machine1 22 xccdf eval --report remote_report.html --profile ospp /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml
其它资源
scap-security-guide(8)
man pageSCAP 安全指南
文档安装在file:///usr/share/doc/scap-security-guide-doc-0.1.46/
目录中。- 安装了 scap-security-guide-doc 软件包的 Red Hat Enterprise Linux 7 安全配置指南。
8.4. 使用特定基本线将系统修复到 Align
Remediate
选项的情况下运行系统评估可能会导致系统无法正常工作。红帽不提供任何自动的方法来恢复由安全强化补救所做的更改。默认配置的 RHEL 系统支持自动安全补救功能。如果在安装后更改了您的系统,运行补救可能无法使其与所需安全配置兼容。
先决条件
- scap-security-guide 软件包安装在 RHEL 7 系统中。
流程
- 使用带有
--remediate
选项的oscap
命令:~]$
sudo oscap xccdf eval --profile ospp --remediate /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml - 重启您的系统。
验证
- 使用 OSPP 配置集评估系统的合规性,并将扫描结果保存到
ospp_report.html
文件中:~]$
oscap xccdf eval --report ospp_report.html --profile ospp /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml
其它资源
scap-security-guide(8)
和oscap(8)
手册页
8.5. 使用 SSG Ansible Playbook 修复系统以使用特定基础行 Align
SCAP 安全指南项目中的 Ansible playbook 文件,使用此流程使用特定基准修复您的系统
。这个示例使用保护配置文件进行通用目的操作系统(OSPP)。
Remediate
选项的情况下运行系统评估可能会导致系统无法正常工作。红帽不提供任何自动的方法来恢复由安全强化补救所做的更改。默认配置的 RHEL 系统支持自动安全补救功能。如果在安装后更改了您的系统,运行补救可能无法使其与所需安全配置兼容。
先决条件
- scap-security-guide 软件包安装在 RHEL 7 系统中。
- 已安装 ansible 软件包。如需更多信息,请参阅 Ansible 安装指南。
流程
- 使用 Ansible 修复您的系统,使其与 OSPP 一致:
~]#
ansible-playbook -i localhost, -c local /usr/share/scap-security-guide/ansible/ssg-rhel7-role-ospp.yml - 重新启动系统。
验证
- 使用 OSPP 配置集评估系统的合规性,并将扫描结果保存到
ospp_report.html
文件中:~]#
oscap xccdf eval --profile ospp --report ospp_report.html /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml
其它资源
scap-security-guide(8)
和oscap(8)
手册页
8.6. 创建修复 Ansible Playbook 以选择具有特定基础的系统
先决条件
- scap-security-guide 软件包安装在您的系统中。
流程
- 扫描系统并保存结果:
~]#
oscap xccdf eval --profile ospp --results ospp-results.xml /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml - 根据上一步中生成的文件生成一个 Ansible playbook:
~]#
oscap xccdf generate fix --fix-type ansible --profile ospp --output ospp-remediations.yml ospp-results.xml ospp-remediations.yml
文件包含对在第 1 步中执行扫描过程中失败的规则的 Ansible 修复。查看生成的文件后,您可以使用 ansible-playbook ospp-remediations.yml 命令应用该文件。
验证
- 在您选择的文本编辑器中,检查
ospp-remediations.yml
文件是否包含在第 1 步中执行的扫描中失败的规则。
其它资源
scap-security-guide(8)
和oscap(8)
手册页
8.7. 使用 SCAP Workbench 使用自定义配置文件扫描系统
8.7.1. 使用 SCAP Workbench 扫描和补救系统
先决条件
- scap-workbench 软件包安装在您的系统中。
流程
- 要从 GNOME Classic 桌面环境运行 SCAP Workbench,请按
Super
键进入Activities Overview
,输入 scap-workbench,然后按 Enter。或者,使用:~]$
scap-workbench & - 使用以下任一选项选择安全策略:
- 开始窗口中的
Load Content
按钮 打开 SCAP 安全指南中的内容
- 在
File
中打开Other Content
,搜索相关的 XCCDF、SCAP RPM 或数据流文件。
- 您可以选择 SCAP Workbench 会尝试根据策略所应用的安全规则来修改系统配置。这个过程会尝试修复系统扫描过程中失败的相关检查。复选框来启用系统配置自动修正。启用此选项后,警告如果不小心使用,在启用了
Remediate
选项的情况下运行系统评估可能会导致系统无法正常工作。红帽不提供任何自动的方法来恢复由安全强化补救所做的更改。默认配置的 RHEL 系统支持自动安全补救功能。如果在安装后更改了您的系统,运行补救可能无法使其与所需安全配置兼容。 - 单击按钮,使用所选配置文件扫描您的系统。
- 要以 XCCDF、ARF 或 HTML 文件的形式保存扫描结果,请点击组合框。选择
HTML Report
选项,以人类可读的格式生成扫描报告。XCCDF 和 ARF(数据流)格式适合进一步自动处理。您可以重复选择所有三个选项。 - 要将基于结果的补救导出到文件,请使用弹出菜单。
8.7.2. 使用 SCAP Workbench 自定义安全配置文件
流程
- 运行 SCAP Workbench,然后使用
Open content from SCAP Security Guide
或Open Other Content
in theFile
菜单中选择您要自定义的配置集。 - 要根据您的需要调整所选的安全配置文件,请点击按钮。这会打开新的 Customization 窗口,允许您在不更改原始 XCCDF 文件的情况下修改当前选择的 XCCDF 配置集。选择新的配置文件 ID。
- 使用将规则组织成逻辑组的树结构或
Search
字段查找要修改的规则。 - 使用树结构中的复选框来包含或排除规则,或者在适用情况下修改规则中的值。
- 点击按钮以确认修改。
- 要永久存储您的修改,请使用以下选项之一:
- 使用
File
菜单中的Save Customization Only
分别保存自定义文件。 - 使用
File
菜单中的Save All
一次保存所有安全内容。如果您选择了Into a directory
选项,SCAP Workbench 会将 XCCDF 或数据流文件以及自定义文件保存到指定位置。您可以使用它作为备份解决方案。通过选择As RPM
选项,您可以指示 SCAP Workbench 创建包含数据流文件和自定义文件的 RPM 软件包。这对于将安全内容分发到无法远程扫描的系统以及交付内容以供进一步处理非常有用。
8.8. 在安装后使用安全配置文件 Immediately 部署 Are Compliant 的系统
8.8.1. 使用图形安装部署 Baseline-Compliant RHEL 系统
先决条件
- 您已引导到
图形化
安装程序。请注意,OSCAP Anaconda 附加组件 不支持纯文本安装。 - 您已访问
安装概述
窗口。
流程
- 在
安装概述
窗口中点击软件选择
。此时会打开软件选择
窗口。 - 在
Base Environment
窗格中选择服务器
环境。您只能选择一个基本环境。 - 点击
完成
应用设置并返回安装概述
窗口。 - 点击
安全策略
。此时会打开Security Policy
窗口。 - 要在系统中启用安全策略,将
Apply security policy
切换为ON
。 - 从配置集栏中选择
Protection Profile for General Purpose Operating Systems
. - 点
Select Profile
来确认选择。 - 确认在窗口底部显示
Changes that were done or need to be done
。完成所有剩余的手动更改。 - 因为 OSPP 有必须满足的严格的分区要求,所以可以为
/boot
、/home
、/var
、/var/log
、/var/tmp
和/var/log/audit
创建单独的分区。 - 完成图形安装过程。注意图形安装程序在安装成功后自动创建对应的 Kickstart 文件。您可以使用
/root/anaconda-ks.cfg
文件自动安装兼容 OSPP 的系统。
验证
- 要在安装完成后检查系统当前的状态,请重启系统并启动新的扫描:
~]#
oscap xccdf eval --profile ospp --report eval_postinstall_report.html /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml
其它资源
- 有关分区的详情,请参阅 配置手动分区。
8.8.2. 使用 Kickstart 部署 Baseline-Compliant RHEL 系统
先决条件
- scap-security-guide 软件包安装在您的系统中。
流程
- 在您选择的编辑器中打开
/usr/share/scap-security-guide/kickstart/ssg-rhel7-ospp-ks.cfg
Kickstart 文件。 - 更新分区方案以符合您的配置要求。对于 OSPP 合规性,必须保留
/boot
、/home
、
、/var/log、/var
/log/var/tmp
和/var/log/audit
的独立分区,但您可以更改这些分区的大小。警告 - 按照 使用 Kickstart 执行自动安装 中所述来开始 Kickstart 安装。
验证
- 要在安装完成后检查系统当前的状态,请重启系统并启动新的扫描:
~]#
oscap xccdf eval --profile ospp --report eval_postinstall_report.html /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml
其它资源
- 详情请查看 OSCAP Anaconda Add-on 项目页面。
8.9. 扫描容器和容器镜像中的漏洞
8.9.1. 使用 oscap-docker扫描容器镜像和容器中的漏洞
先决条件
- 已安装 openscap-containers 软件包。
流程
- 查找容器或容器镜像的 ID,例如:
~]#
docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi7/ubi latest 096cae65a207 7 weeks ago 239 MB - 扫描容器或容器镜像的漏洞,并将结果保存到 vulnerability.html 文件中:
~]#
oscap-docker image-cve 096cae65a207 --report vulnerability.html重要要扫描容器,请将image-cve
参数替换为container-cve
。
验证
- 在您选择的浏览器中检查结果,例如:
~]$
firefox vulnerability.html &
其它资源
- 如需更多信息,请参阅
oscap-docker (8)
和oscap (8)
手册页。
8.9.2. 使用 原子扫描扫描容器镜像和容器中的漏洞
~]#
atomic scan[OPTIONS]
[ID]
使用案例
- 要扫描所有容器镜像,请使用
--images
指令。 - 要扫描所有容器,请使用
--containers
指令。 - 要扫描这两种类型,请使用
--all
指令。 - 若要列出所有可用的命令行选项,可使用 atomic scan
--help
命令。
先决条件
- 您已使用 atomic install rhel7/openscap 命令,从 红帽容器目录(RHCC) 下载并安装 OpenSCAP 容器镜像。
流程
- 验证您是否具有最新的 OpenSCAP 容器镜像,以确保定义是最新的:
~]#
atomic help registry.access.redhat.com/rhel7/openscap| grep
version - 扫描带有几个已知的安全漏洞的 RHEL 7.2 容器镜像:
~]#
atomic scan registry.access.redhat.com/rhel7:7.2 docker run -t --rm -v /etc/localtime:/etc/localtime -v /run/atomic/2017-11-01-14-49-36-614281:/scanin -v /var/lib/atomic/openscap/2017-11-01-14-49-36-614281:/scanout:rw,Z -v /etc/oscapd:/etc/oscapd:ro registry.access.redhat.com/rhel7/openscap oscapd-evaluate scan --no-standard-compliance --targets chroots-in-dir:///scanin --output /scanout registry.access.redhat.com/rhel7:7.2 (98a88a8b722a718) The following issues were found: RHSA-2017:2832: nss security update (Important) Severity: Important RHSA URL: https://access.redhat.com/errata/RHSA-2017:2832 RHSA ID: RHSA-2017:2832-01 Associated CVEs: CVE ID: CVE-2017-7805 CVE URL: https://access.redhat.com/security/cve/CVE-2017-7805 ...
其它资源
- Red Hat Enterprise Linux Atomic Host 产品文档包含 atomic 命令用法和容器的详细描述。
- 红帽客户门户提供了 Atomic 命令行界面(CLI)的指南。
8.10. 评估容器或带有特定基本行的容器镜像的配置合规性
先决条件
- 已安装 openscap-utils 和 scap-security-guide 软件包。
流程
- 查找容器或容器镜像的 ID,例如:
~]#
docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi7/ubi latest 096cae65a207 7 weeks ago 239 MB - 使用 OSPP 配置集评估容器镜像的合规性,并将扫描结果保存到 report.html HTML 文件中。
~]$
sudo oscap-docker 096cae65a207 xccdf eval --report report.html --profile ospp /usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml如果您评估配置符合 PCI-DSS 基准,请将 096cae65a207 替换为您的容器镜像 ID,将 ospp 值替换为 pci-dss。
验证
- 在您选择的浏览器中检查结果,例如:
~]$
firefox report.html &
其它资源
- 如需更多信息,请参阅
oscap-docker (8)
和scap-security-guide (8)
手册页。 SCAP 安全指南
文档安装在file:///usr/share/doc/scap-security-guide-doc-0.1.46/
目录中。
8.11. 使用 原子扫描扫描对容器镜像和容器进行扫描和补救配置合规性
8.11.1. 使用 原子扫描扫描来扫描容器镜像和容器的配置合规性
先决条件
- 您已使用 atomic install rhel7/openscap 命令,从 红帽容器目录(RHCC) 下载并安装 OpenSCAP 容器镜像。
流程
- 列出 OpenSCAP 镜像为 configuration_compliance 扫描提供的 SCAP 内容:
~]#
atomic help registry.access.redhat.com/rhel7/openscap使用 Defense Information Systems Agency Security Technical Implementation Guide (DISA STIG)策略验证最新 Red Hat Enterprise Linux 7 容器镜像合规性,并从扫描中生成 HTML 报告:~]#
atomic scan--scan_type
configuration_compliance--scanner_args
xccdf-id=
scap_org.open-scap_cref_ssg-rhel7-xccdf-1.2.xml,profile=
xccdf_org.ssgproject.content_profile_stig-rhel7-disa,report
registry.access.redhat.com/rhel7:latest以上命令的输出包含有关末尾扫描关联的文件的信息:............ Files associated with this scan are in /var/lib/atomic/openscap/2017-11-03-13-35-34-296606.
~]#
tree /var/lib/atomic/openscap/2017-11-03-13-35-34-296606 /var/lib/atomic/openscap/2017-11-03-13-35-34-296606 ├── db7a70a0414e589d7c8c162712b329d4fc670fa47ddde721250fb9fcdbed9cc2 │ ├── arf.xml │ ├── fix.sh │ ├── json │ └── report.html └── environment.json 1 directory, 5 filesatomic 扫描生成含有所有结果的子目录,并从 /var/lib/atomic/openscap/ 目录中的扫描报告。每次扫描配置合规性时都会生成带有结果的 arf.xml 文件。要生成人类可读的 HTML 报告文件,请将报告
子选项添加到--scanner_args
选项。 - 可选: 要生成由 DISA STIG Viewer 读取的 XCCDF 结果,请将
stig-viewer
子选项添加到--scanner_args
选项中。结果放置在 stig.xml 中。
--scanner_args
选项的 xccdf-id
子选项时,扫描程序会在所选数据流文件的第一个 XCCDF 组件中搜索配置集。有关数据流文件的详情,请参考 第 8.3.1 节 “RHEL 7 中的配置合规性”。
8.11.2. 使用 原子扫描修复容器镜像和容器的配置合规性
先决条件
- 您已使用 atomic install rhel7/openscap 命令,从 红帽容器目录(RHCC) 下载并安装 OpenSCAP 容器镜像。
流程
- 列出 OpenSCAP 镜像为 configuration_compliance 扫描提供的 SCAP 内容:
~]#
atomic help registry.access.redhat.com/rhel7/openscap - 要将容器镜像修复到指定的策略中,请在扫描配置合规性时将
--remediate
选项添加到 atomic scan 命令中。以下命令构建与 Red Hat Enterprise Linux 7 容器镜像中的 DISA STIG 策略兼容的新修复的容器镜像:~]#
atomic scan--remediate
--scan_type
configuration_compliance--scanner_args
profile=
xccdf_org.ssgproject.content_profile_stig-rhel7-disa,report
registry.access.redhat.com/rhel7:latest registry.access.redhat.com/rhel7:latest (db7a70a0414e589) The following issues were found: ............ Configure Time Service Maxpoll Interval Severity: Low XCCDF result: fail Configure LDAP Client to Use TLS For All Transactions Severity: Moderate XCCDF result: fail ............ Remediating rule 43/44: 'xccdf_org.ssgproject.content_rule_chronyd_or_ntpd_set_maxpoll' Remediating rule 44/44: 'xccdf_org.ssgproject.content_rule_ldap_client_start_tls' Successfully built 9bbc7083760e Successfully built remediated image 9bbc7083760e from db7a70a0414e589d7c8c162712b329d4fc670fa47ddde721250fb9fcdbed9cc2. Files associated with this scan are in /var/lib/atomic/openscap/2017-11-06-13-01-42-785000. - 可选: atomic scan 命令的输出报告修复的镜像 ID。要方便记住镜像,请使用一些名称进行标记,例如:
~]#
dockertag
9bbc7083760e rhel7_disa_stig
8.12. RHEL 7 支持的 SCAP 安全指南配置文件
配置文件名称 | 配置文件 ID | 策略版本 |
---|---|---|
第 2 级 CIS Red Hat Enterprise Linux 7 基准 - 服务器 | xccdf_org.ssgproject.content_profile_ cis |
RHEL 7.9.9 及更早版本:2.2.0
RHEL 7.9.10 到 RHEL 7.9.29:3.1.1
RHEL 7.9.30 及更新版本:4.0.0
|
第 1 级 CIS Red Hat Enterprise Linux 7 基准 - 服务器 | xccdf_org.ssgproject.content_profile_ cis_server_l1 |
RHEL 7.9.10 到 RHEL 7.9.29:3.1.1
RHEL 7.9.30 及更新版本:4.0.0
|
第 1 级 CIS Red Hat Enterprise Linux 7 基准 - 工作站 | xccdf_org.ssgproject.content_profile_ cis_workstation_l1 |
RHEL 7.9.10 到 RHEL 7.9.29:3.1.1
RHEL 7.9.30 及更新版本:4.0.0
|
第 2 级 CIS Red Hat Enterprise Linux 7 基准 - 工作站 | xccdf_org.ssgproject.content_profile_ cis_workstation_l2 |
RHEL 7.9.10 到 RHEL 7.9.29:3.1.1
RHEL 7.9.30 及更新版本:4.0.0
|
法国信息系统安全局(ANSSI)BP-028 增强级 | xccdf_org.ssgproject.content_profile_ anssi_nt28_enhanced |
RHEL 7.9.4 及更早版本:draft
RHEL 7.9.5 到 RHEL 7.9.24:1.2
RHEL 7.9.25 及更新版本:2.0
|
法国信息系统安全部(ANSSI)BP-028 高级别 | xccdf_org.ssgproject.content_profile_ anssi_nt28_high |
RHEL 7.9.6 及更早版本:draft
RHEL 7.9.7 到 RHEL 7.9.24:1.2
RHEL 7.9.25 及更新版本:2.0
|
法国信息系统安全局(ANSSI)BP-028 中级 | xccdf_org.ssgproject.content_profile_ anssi_nt28_intermediary |
RHEL 7.9.4 及更早版本:草案
RHEL 7.9.5 到 RHEL 7.9.24:1.2
RHEL 7.9.25 及更新版本:2.0
|
法国信息系统安全局(ANSSI)BP-028 最低级 | xccdf_org.ssgproject.content_profile_ anssi_nt28_minimal |
RHEL 7.9.4 及更早版本:draft
RHEL 7.9.5 到 RHEL 7.9.24:1.2
RHEL 7.9.25 及更新版本:2.0
|
C2S for Red Hat Enterprise Linux 7 | xccdf_org.ssgproject.content_profile_ C2S | 未版本化 |
criminal Justice Information Services (CJIS)安全策略 | xccdf_org.ssgproject.content_profile_ cjis | 5.4 |
非联邦信息系统和组织中的非保密信息(NIST 800-171) | xccdf_org.ssgproject.content_profile_ cui | r1 |
Australian Cyber Security Centre (ACSC) Essential Eight | xccdf_org.ssgproject.content_profile_ e8 | 未版本化 |
健康保险可移植性和责任法案(HIPAA) | xccdf_org.ssgproject.content_profile_ hipaa | 未版本化 |
NIST 国家检查计划安全指南 | xccdf_org.ssgproject.content_profile_ ncp | 未版本化 |
OSPP - 常规目的操作系统 v4.2.1 的保护配置文件 | xccdf_org.ssgproject.content_profile_ ospp | 4.2.1 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3.2.1 控制基准 | xccdf_org.ssgproject.content_profile_ pci-dss_centric |
RHEL 7.9.12 及更早版本: 3.2.1
在 7.9.13 及更新的版本中删除。如需更多信息,请参阅 RHBZ#2038165
|
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3.2.1 控制基准 | xccdf_org.ssgproject.content_profile_ pci-dss |
RHEL 7.9.0 到 RHEL 7.9.29:3.2.1
RHEL 7.9.30 及更新版本:4.0
|
[DRAFT] DISA STIG for Red Hat Enterprise Linux Virtualization Host (RHELH) | xccdf_org.ssgproject.content_profile_ rhelh-stig | 草案 |
VPP - 虚拟化 v 的保护配置文件.1.0 for Red Hat Enterprise Linux Hypervisor (RHELH) | xccdf_org.ssgproject.content_profile_ rhelh-vpp | 1.0 |
Red Hat Corporate Profile for Certified Cloud Providers (RH CCP) | xccdf_org.ssgproject.content_profile_ rht-ccp | 未版本化 |
Red Hat Enterprise Linux 7 的标准系统安全配置文件 | xccdf_org.ssgproject.content_profile_ standard | 未版本化 |
Red Hat Enterprise Linux 7 的 DISA STIG | xccdf_org.ssgproject.content_profile_ stig |
RHEL 7.9.0 和 7.9.1: 1.4
RHEL 7.9.2 到 7.9.4: V3R1
RHEL 7.9.5 和 7.9.6:V3R2
RHEL 7.9.7 到 RHEL 7.9.9:V3R3
RHEL 7.9.10 和 RHEL 7.9.11:V3R5
RHEL 7.9.12 和 RHEL 7.9.13:V3R6
RHEL 7.9.14 到 RHEL 7.9.16:V3R7
RHEL 7.9.17 到 RHEL 7.9.20:V3R8
RHEL 7.9.21 到 RHEL 7.9.24:V3R10
RHEL 7.9.25 到 RHEL 7.9.29:V3R12
RHEL 7.9.30 及更新版本:V3R14
|
Red Hat Enterprise Linux 7 的 DISA STIG with GUI | xccdf_org.ssgproject.content_profile_ stig_gui |
RHEL 7.9.7 到 RHEL 7.9.9:V3R3
RHEL 7.9.10 和 RHEL 7.9.11:V3R5
RHEL 7.9.12 和 RHEL 7.9.13:V3R6
RHEL 7.9.14 到 RHEL 7.9.16:V3R7
RHEL 7.9.17 到 RHEL 7.9.20:V3R8
RHEL 7.9.21 到 RHEL 7.9.24:V3R10
RHEL 7.9.25 到 RHEL 7.9.29:V3R12
RHEL 7.9.30 及更新版本:V3R14
|
配置文件名称 | 配置文件 ID | 策略版本 |
---|---|---|
DRAFT - ANSSI DAT-NT28 (enhanced) | xccdf_org.ssgproject.content_profile_ anssi_nt28_enhanced | 草案 |
DRAFT - ANSSI DAT-NT28 (high) | xccdf_org.ssgproject.content_profile_ anssi_nt28_high | 草案 |
DRAFT - ANSSI DAT-NT28 (intermediary) | xccdf_org.ssgproject.content_profile_ anssi_nt28_intermediary | 草案 |
DRAFT - ANSSI DAT-NT28 (minimal) | xccdf_org.ssgproject.content_profile_ anssi_nt28_minimal | 草案 |
C2S for Red Hat Enterprise Linux 7 | xccdf_org.ssgproject.content_profile_ C2S | 未版本化 |
criminal Justice Information Services (CJIS)安全策略 | xccdf_org.ssgproject.content_profile_ cjis | 5.4 |
非联邦信息系统和组织中的非保密信息(NIST 800-171) | xccdf_org.ssgproject.content_profile_ cui | r1 |
Australian Cyber Security Centre (ACSC) Essential Eight | xccdf_org.ssgproject.content_profile_ e8 | 未版本化 |
健康保险可移植性和责任法案(HIPAA) | xccdf_org.ssgproject.content_profile_ hipaa | 未版本化 |
NIST 国家检查计划安全指南 | xccdf_org.ssgproject.content_profile_ ncp | 未版本化 |
OSPP - 常规目的操作系统 v4.2.1 的保护配置文件 | xccdf_org.ssgproject.content_profile_ ospp | 4.2.1 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3.2.1 控制基准 | xccdf_org.ssgproject.content_profile_ pci-dss_centric | 3.2.1 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3.2.1 控制基准 | xccdf_org.ssgproject.content_profile_ pci-dss | 3.2.1 |
[DRAFT] DISA STIG for Red Hat Enterprise Linux Virtualization Host (RHELH) | xccdf_org.ssgproject.content_profile_ rhelh-stig | 草案 |
VPP - 虚拟化 v 的保护配置文件.1.0 for Red Hat Enterprise Linux Hypervisor (RHELH) | xccdf_org.ssgproject.content_profile_ rhelh-vpp | 1.0 |
Red Hat Corporate Profile for Certified Cloud Providers (RH CCP) | xccdf_org.ssgproject.content_profile_ rht-ccp | 未版本化 |
Red Hat Enterprise Linux 7 的标准系统安全配置文件 | xccdf_org.ssgproject.content_profile_ standard | 未版本化 |
Red Hat Enterprise Linux 7 的 DISA STIG | xccdf_org.ssgproject.content_profile_ stig | 1.4 |
配置文件名称 | 配置文件 ID | 策略版本 |
---|---|---|
C2S for Red Hat Enterprise Linux 7 | xccdf_org.ssgproject.content_profile_ C2S | 未版本化 |
criminal Justice Information Services (CJIS)安全策略 | xccdf_org.ssgproject.content_profile_ cjis | 5.4 |
健康保险可移植性和责任法案(HIPAA) | xccdf_org.ssgproject.content_profile_ hipaa | 未版本化 |
非联邦信息系统和组织中的非保密信息(NIST 800-171) | xccdf_org.ssgproject.content_profile_ nist-800-171-cui | r1 |
OSPP - 常规目的操作系统 v 的保护配置文件。4.2 | xccdf_org.ssgproject.content_profile_ ospp42 | 4.2 |
美国政府配置基线 | xccdf_org.ssgproject.content_profile_ ospp | 3.9 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3.2.1 控制基准 | xccdf_org.ssgproject.content_profile_ pci-dss_centric | 3.2.1 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3.2.1 控制基准 | xccdf_org.ssgproject.content_profile_ pci-dss | 3.2.1 |
VPP - 虚拟化 v 的保护配置文件.1.0 for Red Hat Enterprise Linux Hypervisor (RHELH) | xccdf_org.ssgproject.content_profile_ rhelh-vpp | 1.0 |
Red Hat Corporate Profile for Certified Cloud Providers (RH CCP) | xccdf_org.ssgproject.content_profile_ rht-ccp | 未版本化 |
Red Hat Enterprise Linux 7 的标准系统安全配置文件 | xccdf_org.ssgproject.content_profile_ standard | 未版本化 |
Red Hat Enterprise Linux 7 的 DISA STIG | xccdf_org.ssgproject.content_profile_ stig-rhel7-disa | 1.4 |
配置文件名称 | 配置文件 ID | 策略版本 |
---|---|---|
C2S for Red Hat Enterprise Linux 7 | xccdf_org.ssgproject.content_profile_C2S | 未版本化 |
criminal Justice Information Services (CJIS)安全策略 | xccdf_org.ssgproject.content_profile_ cjis | 5.4 |
健康保险可移植性和责任法案(HIPAA) | xccdf_org.ssgproject.content_profile_ hipaa | 未版本化 |
非联邦信息系统和组织中的非保密信息(NIST 800-171) | xccdf_org.ssgproject.content_profile_ nist-800-171-cui | r1 |
OSPP - 常规目的操作系统 v 的保护配置文件。4.2 | xccdf_org.ssgproject.content_profile_ ospp42 | 4.2 |
美国政府配置基线 | xccdf_org.ssgproject.content_profile_ ospp | 3.9 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3 Control Baseline | xccdf_org.ssgproject.content_profile_ pci-dss_centric | 3.1 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3 Control Baseline | xccdf_org.ssgproject.content_profile_ pci-dss | 3.1 |
Red Hat Corporate Profile for Certified Cloud Providers (RH CCP) | xccdf_org.ssgproject.content_profile_ rht-ccp | 未版本化 |
Red Hat Enterprise Linux 7 的标准系统安全配置文件 | xccdf_org.ssgproject.content_profile_ standard | 未版本化 |
Red Hat Enterprise Linux 7 的 DISA STIG | xccdf_org.ssgproject.content_profile_ stig-rhel7-disa | 1.4 |
配置文件名称 | 配置文件 ID | 策略版本 |
---|---|---|
C2S for Red Hat Enterprise Linux | xccdf_org.ssgproject.content_profile_ C2S | 未版本化 |
criminal Justice Information Services (CJIS)安全策略 | xccdf_org.ssgproject.content_profile_ cjis-rhel7-server | 5.4 |
General-Purpose 系统的通用配置文件 | xccdf_org.ssgproject.content_profile_ common | 未版本化 |
标准 Docker 主机安全配置文件 | xccdf_org.ssgproject.content_profile_ docker-host | 未版本化 |
非联邦信息系统和组织中的非保密信息(NIST 800-171) | xccdf_org.ssgproject.content_profile_ nist-800-171-cui | r1 |
United States Government Configuration Baseline (USGCB / STIG)- DRAFT | xccdf_org.ssgproject.content_profile_ ospp-rhel7 | 3.9 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3 Control Baseline | xccdf_org.ssgproject.content_profile_ pci-dss_centric | 3.1 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3 Control Baseline | xccdf_org.ssgproject.content_profile_ pci-dss | 3.1 |
Red Hat Corporate Profile for Certified Cloud Providers (RH CCP) | xccdf_org.ssgproject.content_profile_ rht-ccp | 未版本化 |
标准系统安全配置文件 | xccdf_org.ssgproject.content_profile_ standard | 未版本化 |
Red Hat Enterprise Linux 7 的 DISA STIG | xccdf_org.ssgproject.content_profile_ stig-rhel7-disa | 1.4 |
STIG for Red Hat Virtualization Hypervisor | xccdf_org.ssgproject.content_profile_ stig-rhevh-upstream | 1.4 |
配置文件名称 | 配置文件 ID | 策略版本 |
---|---|---|
C2S for Red Hat Enterprise Linux 7 | xccdf_org.ssgproject.content_profile_ C2S | 未版本化 |
criminal Justice Information Services (CJIS)安全策略 | xccdf_org.ssgproject.content_profile_ cjis-rhel7-server | 5.4 |
General-Purpose 系统的通用配置文件 | xccdf_org.ssgproject.content_profile_ common | 未版本化 |
标准 Docker 主机安全配置文件 | xccdf_org.ssgproject.content_profile_ docker-host | 未版本化 |
非联邦信息系统和组织中的非保密信息(NIST 800-171) | xccdf_org.ssgproject.content_profile_ nist-800-171-cui | r1 |
United States Government Configuration Baseline (USGCB / STIG)- DRAFT | xccdf_org.ssgproject.content_profile_ ospp-rhel7 | 3.9 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3 Control Baseline | xccdf_org.ssgproject.content_profile_ pci-dss_centric | 3.1 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3 Control Baseline | xccdf_org.ssgproject.content_profile_ pci-dss | 3.1 |
Red Hat Corporate Profile for Certified Cloud Providers (RH CCP) | xccdf_org.ssgproject.content_profile_ rht-ccp | 未版本化 |
标准系统安全配置文件 | xccdf_org.ssgproject.content_profile_ standard | 未版本化 |
Red Hat Enterprise Linux 7 的 DISA STIG | xccdf_org.ssgproject.content_profile_ stig-rhel7-disa | 1.4 |
STIG for Red Hat Virtualization Hypervisor | xccdf_org.ssgproject.content_profile_ stig-rhevh-upstream |
配置文件名称 | 配置文件 ID | 策略版本 |
---|---|---|
C2S for Red Hat Enterprise Linux 7 | xccdf_org.ssgproject.content_profile_ C2S | 未版本化 |
criminal Justice Information Services (CJIS)安全策略 | xccdf_org.ssgproject.content_profile_ cjis-rhel7-server | 5.4 |
General-Purpose 系统的通用配置文件 | xccdf_org.ssgproject.content_profile_ common | 未版本化 |
CNSSI 1253 Low/Low/Low Control Baseline for Red Hat Enterprise Linux 7 | xccdf_org.ssgproject.content_profile_ nist-cl-il-al | 未版本化 |
美国政府配置基线(USGCB / STIG) | xccdf_org.ssgproject.content_profile_ ospp-rhel7-server | 未版本化 |
适用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3 Control Baseline | xccdf_org.ssgproject.content_profile_ pci-dss | 3.1 |
Red Hat Corporate Profile for Certified Cloud Providers (RH CCP) | xccdf_org.ssgproject.content_profile_ rht-ccp | 未版本化 |
标准系统安全配置文件 | xccdf_org.ssgproject.content_profile_ standard | 未版本化 |
STIG for Red Hat Enterprise Linux 7 Server Running GUIs | xccdf_org.ssgproject.content_profile_ stig-rhel7-server-gui-upstream | 1.4 |
STIG for Red Hat Enterprise Linux 7 Server | xccdf_org.ssgproject.content_profile_ stig-rhel7-server-upstream | 1.4 |
STIG for Red Hat Enterprise Linux 7 Workstation | xccdf_org.ssgproject.content_profile_ stig-rhel7-workstation-upstream | 1.4 |
配置文件名称 | 配置文件 ID | 策略版本 |
---|---|---|
General-Purpose 系统的通用配置文件 | xccdf_org.ssgproject.content_profile_ common | 未版本化 |
草案用于 Red Hat Enterprise Linux 7 的 PCI-DSS v3 Control Baseline | xccdf_org.ssgproject.content_profile_ pci-dss | 草案 |
Red Hat Corporate Profile for Certified Cloud Providers (RH CCP) | xccdf_org.ssgproject.content_profile_ rht-ccp | 未版本化 |
标准系统安全配置文件 | xccdf_org.ssgproject.content_profile_ standard | 未版本化 |
Red Hat Enterprise Linux 7 Server 的预发布 Draft STIG | xccdf_org.ssgproject.content_profile_ stig-rhel7-server-upstream | 草案 |
配置文件名称 | 配置文件 ID | 策略版本 |
---|---|---|
Red Hat Corporate Profile for Certified Cloud Providers (RH CCP) | xccdf_org.ssgproject.content_profile_ rht-ccp | 未版本化 |
其它资源
- 有关 RHEL 8 中配置集的详情,请参考 RHEL 8 支持的 SCAP 安全指南配置集
第 9 章 联邦标准和 Regulations
9.1. 联邦信息处理标准(FIPS)
9.1.1. 启用 FIPS 模式
在系统安装过程中
fips=1
内核选项添加到内核命令行中。使用此选项时,所有密钥的生成都是使用 FIPS 批准的算法和持续监控测试进行的。安装后,系统被配置为自动引导至 FIPS 模式。
系统安装后
- 安装 dracut-fips 软件包:
~]# yum install dracut-fips
对于带有 AES 新指令(AES-NI)支持的 CPU,还要安装 dracut-fips-aesni 软件包:~]# yum install dracut-fips-aesni
- 重新生成
initramfs
文件:~]# dracut -v -f
要启用模块完整性验证,且内核启动过程中存在所有必需的模块,必须重新生成initramfs
文件。警告此操作将覆盖现有的initramfs
文件。 - 修改引导装载程序配置。要引导至 FIPS 模式,请在引导装载程序的内核命令行中添加
fips=1
选项。如果您的/boot
分区位于独立分区中,请将boot= <partition>
; (其中 <partition > 代表/boot
)参数添加到内核命令行中。要识别引导分区,请输入以下命令:~]$ df /boot Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 495844 53780 416464 12% /boot
为确保boot=
配置选项即使引导之间的设备命名更改也可以正常工作,请运行以下命令来识别分区的通用唯一识别符(UUID):~]$ blkid /dev/sda1 /dev/sda1: UUID="05c000f1-f899-467b-a4d9-d5ca4424c797" TYPE="ext4"
在内核命令行中附加 UUID:boot=UUID=05c000f1-f899-467b-a4d9-d5ca4424c797
根据您的引导装载程序,进行以下更改:- GRUB 2将
/boot> 选项的
添加到fips=1
和 boot=<partition/etc/default/grub
文件中的GRUB_CMDLINE_LINUX
键中。要将更改应用到/etc/default/grub
,请重新构建grub.cfg
文件,如下所示:- 在基于 BIOS 的机器上,以
root
用户身份输入以下命令:~]# grub2-mkconfig -o /etc/grub2.cfg
- 在基于 UEFI 的机器上,以
root
用户身份输入以下命令:~]# grub2-mkconfig -o /etc/grub2-efi.cfg
- zipl (仅适用于 IBM Z 系统架构)将
/boot> 选项的
添加到fips=1
和 boot=<partition/etc/zipl.conf
中,输入以下内容来应用更改:~]# zipl
- 确保禁用预链接。要正确操作模块完整性验证,必须禁用对库和二进制文件的预链接。预链接由 prelink 软件包完成,该软件包默认不会安装。除非已安装 prelink,否则不需要这一步。要禁用预链接,请在
/etc/sysconfig/prelink
配置文件中设置PRELINKING=no
选项。要禁用所有系统文件的现有预链接,请使用 prelink -u -a 命令。 - 重启您的系统。
在容器中启用 FIPS 模式
- dracut-fips 软件包安装在容器中。
/etc/system-fips
文件从主机挂载到容器上。
9.2. 国家工业安全计划操作手册(NISPOM)
9.3. 支付卡行业数据安全标准(PCI DSS)
9.4. 安全技术实施指南
附录 A. 加密标准
A.1. 同步加密
A.1.1. 高级加密标准 - AES
A.1.1.1. AES History
A.1.2. 数据加密标准 - DES
A.1.2.1. DES History
A.2. 公钥加密
A.2.1. Diffie-Hellman
A.2.1.1. Diffie-Hellman History
A.2.2. RSA
A.2.3. DSA
A.2.4. SSL/TLS
A.2.5. Cramer-Shoup Cryptosystem
A.2.6. ElGamal Encryption
附录 B. 修订历史记录
修订历史 | |||
---|---|---|---|
修订 1-43 | Fri Feb 7 2020 | ||
| |||
修订 1-42 | Fri Aug 9 2019 | ||
| |||
修订 1-41 | Sat Oct 20 2018 | ||
| |||
修订 1-32 | Wed Apr 4 2018 | ||
| |||
修订 1-30 | Thu Jul 27 2017 | ||
| |||
修订 1-24 | Mon Feb 6 2017 | ||
| |||
修订 1-23 | Tue Nov 1 2016 | ||
| |||
修订 1-19 | Mon Jul 18 2016 | ||
| |||
修订 1-18 | Mon Jun 27 2016 | ||
| |||
修订 1-17 | Fri Jun 3 2016 | ||
| |||
修订 1-16 | Tue Jan 5 2016 | ||
| |||
修订 1-15 | Tue Nov 10 2015 | ||
| |||
修订 1-14.18 | Mon Nov 09 2015 | ||
| |||
修订 1-14.17 | Wed Feb 18 2015 | ||
| |||
修订 1-14.15 | Fri Dec 06 2014 | ||
| |||
修订 1-14.13 | Thu Nov 27 2014 | ||
| |||
修订 1-14.12 | Tue Jun 03 2014 | ||
|