本文档介绍了什么是 CIS 基准、该基准与 Container-Optimized OS (COS) 的关系、如何审核实例中的合规性状态,以及在出现故障时如何进行问题排查。
概览
Center for Internet Security(CIS,互联网安全中心)针对各种平台发布了最佳实践安全建议的基准。Container-Optimized OS CIS 基准是一组关于配置使用 Container-Optimized OS 的实例以支持可靠的安全状况的建议。COS x86 和 ARM 映像均符合 CIS 标准。
访问基准
您可以通过 CIS 网站获取 Container-Optimized OS CIS 基准:
- 前往 CIS 基准下载页面。
- 搜索 CIS Google Container-Optimized OS 基准。
- 点击下载 PDF。
安全建议级别
CIS 为 Container-Optimized OS 定义了以下建议级别。
1 级
此级别的建议适用于大多数环境。此级别包括以下建议:
- 地址空间布局随机化已启用
/tmp
无法用于运行可执行二进制文件- 数据包重定向发送已停用
2 级
此级别的建议扩展了第 1 级的建议,从而生成更严格的安全环境。二级建议可能需要更改应用,因此不一定适用于所有情况。在应用 2 级建议之前,您应先评估这些建议是否适合您的环境。此级别包括以下建议:
- 所有开放端口都存在防火墙规则
- 不接受 ICMP 重定向和路由器通告
- 默认用户 shell 超时时间为 900 秒或更短
Container-Optimized OS 如何遵守 CIS 基准
从里程碑 97 开始,Container-Optimized OS 映像默认符合 CIS 1 级标准,并提供符合 CIS 2 级标准的选项。我们还提供了一个扫描器,您可以使用该扫描器根据 CIS 建议级别审核实例。
定义建议的 CIS 配置位于 /usr/share/google/security/cis-compliance/cis_config.textproto
。CIS 扫描器使用该配置来检查实例的合规性状态。每次运行 CIS 级合规性扫描器的结果都会写入 /var/lib/google/cis_scanner_scan_result.textproto
。每次运行 CIS 扫描器时,此文件都会被覆盖。如果任何 CIS 1 级或 2 级扫描失败,cis_scanner_scan_result.textproto
文件将包含所有失败的检查的列表。
检查实例的合规性状态
Container-Optimized OS 映像提供以下 systemd 服务,用于合规性检查和配置:
- cis-level1.service:默认处于启用状态,并在启动时启动。服务启动时,会检查实例是否符合 CIS Level 1。
- cis-level2.service:默认处于停用状态。此服务可让您配置实例以符合 CIS 2 级标准,并根据 1 级和 2 级标准检查合规性状态。
以下部分介绍了如何检查实例的合规性状态,以及如何自动执行审核流程。
检查 CIS Level 1 合规性状态
如需查看您的实例是否符合 CIS Level 1 标准,请检查 cis-level1.service
的状态:
systemctl status cis-level1
输出类似于以下内容:
Reading scan config from /usr/share/google/security/cis-compliance/cis_config.textproto
Running scan of 62 benchmarks
Scan status: SUCCEEDED
Found 0 non-compliant benchmarks
Writing scan results to /var/lib/google/cis_scanner_scan_result.textproto
如果发现任何不合规的检查,请参阅 CIS 合规性级别 1/级别 2 检查失败。
cis-level1.service
仅在实例启动时检查一次 CIS 1 级合规性。如需配置定期合规性检查,请参阅定期检查 CIS 合规性状态。
配置 CIS 2 级合规性并检查状态
您可以使用 cis-level2
服务将实例配置为符合 CIS Level 2 标准,并检查其是否符合 Level 1 和 Level 2 标准。systemd 服务支持所有 CIS Level 2 建议,但以下建议除外:
4.1.1.2 确保日志记录正在运行(ID:logging-service-running)
此建议默认处于选择停用状态,但可以通过从选择停用列表中删除相应 ID 来重新启用,该列表可在
/etc/cis-scanner/env_vars
文件中找到。此检查仅存在于里程碑 109 及更高版本中。在之前的里程碑中,自行启用日志记录功能可让您符合此建议。如果您撤消选择停用,运行cis-level2
服务会运行一个启动 fluent-bit 日志记录的脚本。如果您不想使用我们的默认日志记录,或者想使用自己的日志记录,请保持logging-service-running
处于选择停用状态。
对于以下建议,cis-level2
服务会配置实例,但不会验证合规性状态:
105 及更低版本:
- 3.3.1.1 确保 IPv6 默认拒绝防火墙政策
- 3.3.1.2 确保已配置 IPv6 环回流量
- 3.3.1.3 确保已配置 IPv6 出站连接和已建立的连接
- 3.3.1.4 确保所有开放端口都存在 IPv6 防火墙规则
- 3.3.2.1 确保默认拒绝防火墙政策
- 3.3.2.2 确保已配置环回流量
- 3.3.2.3 确保已配置出站连接和已建立的连接
109 及更高版本:
- 3.3.1.4 确保所有开放端口都存在 IPv6 防火墙规则
cis-level2
服务默认处于停用状态。如需启动服务,请运行以下命令:
systemctl start cis-level2.service
如需查看实例是否已成功配置并符合 CIS Level 2 建议,请检查 cis-level2.service
的状态:
systemctl status cis-level2
输出类似于以下内容:
Reading scan config from /usr/share/google/security/cis-compliance/cis_config.textproto
Running scan of 112 benchmarks
Scan status: SUCCEEDED
Found 0 non-compliant benchmarks
Writing scan results to /var/lib/google/cis_scanner_scan_result.textproto
如果实例配置失败或发现任何不合规的检查,请参阅问题排查。
cis-level2
服务仅配置实例并检查 CIS 2 级合规性一次。如需配置定期合规性检查,请参阅定期检查 CIS 合规性状态。
定期检查 CIS 合规性状态
Container-Optimized OS 映像包含以下服务,可定期检查 CIS 合规性:
- cis-compliance-scanner.service:根据
/etc/cis-scanner/env_vars
中定义的环境变量检查合规性状态。默认情况下,此服务会检查是否符合 CIS Level 1 标准,并且处于停用状态。 - cis-compliance-scanner.timer:定期运行
cis-compliance-scanner.service
。默认周期为每天一次。
配置扫描器服务
cis-compliance-scanner.service
负责根据 /etc/cis-scanner/env_vars
中定义的环境变量检查 CIS 合规性状态。默认情况下,此服务会检查是否符合 CIS Level 1 标准。
如需检查是否符合 CIS Level 2 标准,请在 /etc/cis-scanner/env_vars
中将 LEVEL 环境变量设置为 2。/etc/cis-scanner/env_vars
文件类似于以下内容:
# cis-compliance-scanner.service environment variables
# The config file defines which checks to perform by cis_scanner
CONFIG="/usr/share/google/security/cis-compliance/cis_config.textproto"
# Where to store the result of the scan
RESULT="/var/lib/google/cis_scanner_scan_result.textproto"
# Upto which level to scan. It can be 1 or 2
LEVEL="2"
# Extra options that can be passed to cis_scanner
# For valid options, see output of `cis_scanner -h`
EXTRA_OPTIONS=""
配置计时器
如需设置定期合规性扫描,请启动 cis-compliance-scanner.timer
单元:
systemctl start cis-compliance-scanner.timer
默认情况下,cis-compliance-scanner.timer
每天运行一次,时间为 cis-compliance-scanner.service
。如需更改扫描周期,请替换 cis-compliance-scanner.timer
单位的 OnUnitActiveSec 字段:
sudo mkdir /etc/systemd/system/cis-compliance-scanner.timer.d
sudo tee /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf <<EOF
[Unit]
Description=Run CIS Scanner once an hour
[Timer]
OnUnitActiveSec=1h
EOF
此示例将扫描器周期设置为每小时一次。
如需应用更改,请重新加载 systemd 单元:
systemctl daemon-reload
选择停用特定的 CIS 合规性检查
CIS 1 级和 2 级建议适用于大多数环境。不过,某些建议可能不适用于您的特定环境。如需选择停用特定建议,请在 /etc/cis-scanner/env_vars
中使用 EXTRA_OPTIONS 环境变量。
以下 env_vars
文件示例选择停用 etc-passwd-permissions
建议:
# cis-compliance-scanner.service environment variables
# The config file defines which checks to perform by cis_scanner
CONFIG="/usr/share/google/security/cis-compliance/cis_config.textproto"
# Where to store the result of the scan
RESULT="/var/lib/google/cis_scanner_scan_result.textproto"
# Upto which level to scan. It can be 1 or 2
LEVEL="1"
# Extra options that can be passed to cis_scanner
# For valid options:`cis_scanner -h`
EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"
自动启用和检查 CIS 合规性状态
您可以使用 cloud-init 或操作系统政策自动执行实例的合规性检查流程。以下示例展示了每种工具的一些使用情形:
- 示例 1:每天检查一次 CIS 1 级合规性。
- 示例 2:每小时检查一次 CIS 1 级合规性。
- 示例 3:每天检查一次 CIS 2 级合规性。
- 示例 4:选择不进行特定的 CIS 合规性检查。
使用 cloud-init
在尝试以下示例之前,请按照将 cloud-init 与 Cloud 配置格式一起使用中的说明,确保您熟悉如何使用 cloud-init 配置 COS 实例。
示例 1
以下示例配置会启动定期 CIS 1 级扫描,每天扫描一次。
#cloud-config runcmd: # Check the compliance status of the instance once a day. - systemctl start cis-compliance-scanner.timer
示例 2
以下示例配置了每小时进行一次的定期 CIS 1 级扫描。
#cloud-config # Override cis-compliance-scanner.timer with 1 hour frequency. write_files: - path: /etc/systemd/system/cis-compliance-scanner.timer.d/override.conf permissions: 0600 owner: root content: | [Unit] Description=Run CIS Scanner once an hour [Timer] OnUnitActiveSec=1h runcmd: # Reload systemd units. - systemctl daemon-reload # Check the compliance status of the instance once an hour. - systemctl start cis-compliance-scanner.timer
示例 3
以下示例配置定期 CIS 2 级扫描,每天扫描一次。
#cloud-config runcmd: # Configure the instance for CIS level 2. - systemctl start cis-level2.service # Change the scan level to CIS Level 2. - sed -i 's/^LEVEL=.*$/LEVEL="2"/' /etc/cis-scanner/env_vars # Check the compliance status of the instance once a day. - systemctl start cis-compliance-scanner.timer
示例 4
以下示例将扫描器配置为每天运行一次,并选择不采用特定的 CIS 建议。
#cloud-config runcmd: # Opt-out of the etc-passwd-permissions check. - sed -i 's/^EXTRA.*$/EXTRA_OPTIONS="--benchmark-opt-out-ids=etc-passwd-permissions"/' /etc/cis-scanner/env_vars # Check the compliance of the instance once a day. - systemctl start cis-compliance-scanner.timer
使用操作系统政策
您可以使用操作系统政策来配置 CIS 基准扫描。在开始之前,请确保您熟悉操作系统政策,包括以下内容:
此外,您还必须在以下示例中添加 instanceFilter
和 rollout
选项以进行部署。
示例 1
以下示例配置会启动定期 CIS 1 级扫描,每天扫描一次。
示例 2
以下示例配置了每小时进行一次的定期 CIS 1 级扫描。
示例 3
以下示例配置定期 CIS 2 级扫描,每天扫描一次。
示例 4
以下示例将扫描器配置为每天运行一次,并选择不采用特定的 CIS 建议。
问题排查
本部分介绍了如何解决与 CIS 基准扫描相关的问题。
配置实例以符合 CIS 2 级建议失败
cis-level2
服务首先配置实例以符合 CIS Level 2 建议,然后检查是否符合 CIS Level 1 和 Level 2。如果配置实例失败,cis-level2
服务会退出,并显示以下错误消息:
Job for cis-level2.service failed because the control process exited with error code.
See "systemctl status cis-level2.service" and "journalctl -xeu cis-level2.service" for details.
日志中会提及未能应用于实例并导致 cis-level2
systemd 服务失败的建议。
CIS 合规性级别 1 或级别 2 检查失败
每次运行 CIS 级合规性检查的扫描结果都会写入 /var/lib/google/cis_scanner_scan_result.textproto
。如果任何 CIS 1 级或 2 级扫描失败,textproto 文件将包含所有失败的检查的列表,如以下示例所示:
cat /var/lib/google/cis_scanner_scan_result.textproto
# Output
start_time: {
seconds: 1648241700
nanos: 763152171
}
end_time: {
seconds: 1648241700
nanos: 812992527
}
scanner_version: "1.1.4.3"
benchmark_version: "1.0.0"
status: {
status: SUCCEEDED
}
non_compliant_benchmarks: {
id: "etc-passwd-permissions"
compliance_occurrence: {
non_compliant_files: {
path: "/etc/passwd"
reason: "File permission is 0664, expected the following bits to be set: 0444 and the following bits to be clear: 0133"
}
}
}
compliant_benchmarks: {
id: "etc-passwd-permissions"
compliance_occurrence: {}
}
如需缓解检查失败问题,请使用 CIS 基准,并按照 Remediation
部分中针对失败检查的步骤操作,使实例符合要求。如需了解哪项建议对应于 CIS 基准中的失败检查,请在位于 /usr/share/google/security/cis-compliance/cis_config.textproto
的 CIS 扫描器配置文件中查找 non_compliant_benchmark's
ID。