$ oc get -n openshift-compliance compliancecheckresults \
-l compliance.openshift.io/suite=workers-compliancesuite
每个ComplianceCheckResult
代表一个合规性规则检查的结果。如果该规则可以自动补救,则会创建一个与ComplianceCheckResult
同名、由其拥有的ComplianceRemediation
对象。除非请求,否则不会自动应用补救措施,这使OpenShift Container Platform管理员有机会审查补救措施的作用,并且只有在验证后才应用补救措施。
要完全满足联邦信息处理标准 (FIPS) 合规性,需要为集群启用 FIPS 模式。要启用 FIPS 模式,必须从配置为在 FIPS 模式下运行的 Red Hat Enterprise Linux (RHEL) 计算机运行安装程序。有关在 RHEL 上配置 FIPS 模式的更多信息,请参见在 FIPS 模式下安装系统。 FIPS模式支持以下架构
|
默认情况下,ComplianceCheckResult
对象使用多个有用的标签进行标记,这些标签允许您查询检查并在生成结果后确定后续步骤。
列出属于特定套件的检查
$ oc get -n openshift-compliance compliancecheckresults \
-l compliance.openshift.io/suite=workers-compliancesuite
列出属于特定扫描的检查
$ oc get -n openshift-compliance compliancecheckresults \
-l compliance.openshift.io/scan=workers-scan
并非所有ComplianceCheckResult
对象都会创建ComplianceRemediation
对象。只有可以自动补救的ComplianceCheckResult
对象才会创建。如果ComplianceCheckResult
对象标有compliance.openshift.io/automated-remediation
标签,则它具有相关的补救措施。补救措施的名称与检查的名称相同。
列出所有可以自动补救的失败检查
$ oc get -n openshift-compliance compliancecheckresults \
-l 'compliance.openshift.io/check-status=FAIL,compliance.openshift.io/automated-remediation'
列出按严重性排序的所有失败检查
$ oc get compliancecheckresults -n openshift-compliance \
-l 'compliance.openshift.io/check-status=FAIL,compliance.openshift.io/check-severity=high'
NAME STATUS SEVERITY
nist-moderate-modified-master-configure-crypto-policy FAIL high
nist-moderate-modified-master-coreos-pti-kernel-argument FAIL high
nist-moderate-modified-master-disable-ctrlaltdel-burstaction FAIL high
nist-moderate-modified-master-disable-ctrlaltdel-reboot FAIL high
nist-moderate-modified-master-enable-fips-mode FAIL high
nist-moderate-modified-master-no-empty-passwords FAIL high
nist-moderate-modified-master-selinux-state FAIL high
nist-moderate-modified-worker-configure-crypto-policy FAIL high
nist-moderate-modified-worker-coreos-pti-kernel-argument FAIL high
nist-moderate-modified-worker-disable-ctrlaltdel-burstaction FAIL high
nist-moderate-modified-worker-disable-ctrlaltdel-reboot FAIL high
nist-moderate-modified-worker-enable-fips-mode FAIL high
nist-moderate-modified-worker-no-empty-passwords FAIL high
nist-moderate-modified-worker-selinux-state FAIL high
ocp4-moderate-configure-network-policies-namespaces FAIL high
ocp4-moderate-fips-mode-enabled-on-all-nodes FAIL high
列出所有必须手动补救的失败检查
$ oc get -n openshift-compliance compliancecheckresults \
-l 'compliance.openshift.io/check-status=FAIL,!compliance.openshift.io/automated-remediation'
手动补救步骤通常存储在ComplianceCheckResult
对象的description
属性中。
ComplianceCheckResult状态 | 描述 |
---|---|
PASS |
合规性检查已完成并通过。 |
FAIL |
合规性检查已完成并失败。 |
INFO |
合规性检查已完成,但发现的内容不足以被视为错误。 |
MANUAL |
合规性检查无法自动评估成功或失败,必须手动检查。 |
INCONSISTENT |
合规性检查报告来自不同来源(通常是集群节点)的不同结果。 |
ERROR |
合规性检查已运行,但无法正常完成。 |
NOT-APPLICABLE |
合规性检查未运行,因为它不适用或未选中。 |
审查ComplianceRemediation
对象和拥有该补救措施的ComplianceCheckResult
对象。ComplianceCheckResult
对象包含对检查的作用和尝试防止的硬化的可读描述,以及其他metadata
,如严重性和相关的安全控制。ComplianceRemediation
对象表示解决ComplianceCheckResult
中描述的问题的一种方法。第一次扫描后,检查状态为MissingDependencies
的补救措施。
以下是一个名为sysctl-net-ipv4-conf-all-accept-redirects
的检查和补救措施的示例。此示例已删除,仅显示spec
和status
,并省略了metadata
spec:
apply: false
current:
object:
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
spec:
config:
ignition:
version: 3.2.0
storage:
files:
- path: /etc/sysctl.d/75-sysctl_net_ipv4_conf_all_accept_redirects.conf
mode: 0644
contents:
source: data:,net.ipv4.conf.all.accept_redirects%3D0
outdated: {}
status:
applicationState: NotApplied
修复负载存储在spec.current
属性中。负载可以是任何 Kubernetes 对象,但由于此修复是由节点扫描生成的,因此上述示例中的修复负载是MachineConfig
对象。对于平台扫描,修复负载通常是不同类型的对象(例如,ConfigMap
或Secret
对象),但通常情况下,应用该修复由管理员负责,因为否则合规性操作员将需要非常广泛的权限来操作任何通用的 Kubernetes 对象。本文稍后将提供一个修复平台检查的示例。
要查看应用修复后的确切操作,MachineConfig
对象的內容使用 Ignition 对象进行配置。有关格式的更多信息,请参阅Ignition 规范。在我们的示例中,spec.config.storage.files[0].path
属性指定此修复程序正在创建的文件(/etc/sysctl.d/75-sysctl_net_ipv4_conf_all_accept_redirects.conf
),而spec.config.storage.files[0].contents.source
属性指定该文件的內容。
文件的內容采用 URL 编码。 |
使用以下 Python 脚本来查看內容
$ echo "net.ipv4.conf.all.accept_redirects%3D0" | python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(''.join(sys.stdin.readlines())))"
net.ipv4.conf.all.accept_redirects=0
合规性操作员不会自动解决修复之间可能出现的依赖性问题。应用修复后,用户应执行重新扫描以确保结果准确。 |
创建自定义MachineConfigPool
时,请向MachineConfigPool
添加标签,以便KubeletConfig
中存在的machineConfigPoolSelector
可以将标签与MachineConfigPool
匹配。
请勿在 |
列出节点。
$ oc get nodes -n openshift-compliance
NAME STATUS ROLES AGE VERSION
ip-10-0-128-92.us-east-2.compute.internal Ready master 5h21m v1.30.3
ip-10-0-158-32.us-east-2.compute.internal Ready worker 5h17m v1.30.3
ip-10-0-166-81.us-east-2.compute.internal Ready worker 5h17m v1.30.3
ip-10-0-171-170.us-east-2.compute.internal Ready master 5h21m v1.30.3
ip-10-0-197-35.us-east-2.compute.internal Ready master 5h22m v1.30.3
向节点添加标签。
$ oc -n openshift-compliance \
label node ip-10-0-166-81.us-east-2.compute.internal \
node-role.kubernetes.io/<machine_config_pool_name>=
node/ip-10-0-166-81.us-east-2.compute.internal labeled
创建自定义MachineConfigPool
CR。
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfigPool
metadata:
name: <machine_config_pool_name>
labels:
pools.operator.machineconfiguration.openshift.io/<machine_config_pool_name>: '' (1)
spec:
machineConfigSelector:
matchExpressions:
- {key: machineconfiguration.openshift.io/role, operator: In, values: [worker,<machine_config_pool_name>]}
nodeSelector:
matchLabels:
node-role.kubernetes.io/<machine_config_pool_name>: ""
1 | labels 字段定义要为 Machine Config 池 (MCP) 添加的标签名称。 |
验证 MCP 是否已成功创建。
$ oc get mcp -w
OpenShift Container Platform 基础设施在运行时可能包含不完整的配置文件,并且节点会为缺少的配置选项采用默认配置值。某些配置选项可以作为命令行参数传递。因此,合规性操作员无法验证节点上的配置文件是否完整,因为它可能缺少规则检查中使用的选项。
为了防止默认配置值通过检查导致误报,合规性操作员使用 Node/Proxy API 获取节点池中每个节点的配置,然后将节点池中所有节点之间一致的所有配置选项存储在一个文件中,该文件表示该节点池中所有节点的配置。这提高了扫描结果的准确性。
对于默认的master
和worker
节点池配置,无需进行其他配置更改即可使用此功能。
合规性操作员不会维护每个节点池配置的副本。合规性操作员将单个节点池中所有节点的一致配置选项聚合到一个配置文件的副本中。然后,合规性操作员使用特定节点池的配置文件来根据该池中的节点评估规则。
将example
角色添加到将存储在ScanSettingBinding
CR中的ScanSetting
对象中。
apiVersion: compliance.openshift.io/v1alpha1
kind: ScanSetting
metadata:
name: default
namespace: openshift-compliance
rawResultStorage:
rotation: 3
size: 1Gi
roles:
- worker
- master
- example
scanTolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
operator: Exists
schedule: '0 1 * * *'
创建使用ScanSettingBinding
CR的扫描。
apiVersion: compliance.openshift.io/v1alpha1
kind: ScanSettingBinding
metadata:
name: cis
namespace: openshift-compliance
profiles:
- apiGroup: compliance.openshift.io/v1alpha1
kind: Profile
name: ocp4-cis
- apiGroup: compliance.openshift.io/v1alpha1
kind: Profile
name: ocp4-cis-node
settingsRef:
apiGroup: compliance.openshift.io/v1alpha1
kind: ScanSetting
name: default
平台 KubeletConfig 规则通过Node/Proxy
对象进行检查。您可以通过运行以下命令找到这些规则
$ oc get rules -o json | jq '.items[] | select(.checkType == "Platform") | select(.metadata.name | contains("ocp4-kubelet-")) | .metadata.name'
KubeletConfig
子池KubeletConfig
修复标签可以应用于MachineConfigPool
子池。
向子池MachineConfigPool
CR添加标签
$ oc label mcp <sub-pool-name> pools.operator.machineconfiguration.openshift.io/<sub-pool-name>=
布尔属性spec.apply
控制合规性操作员是否应应用修复。您可以通过将属性设置为true
来应用修复。
$ oc -n openshift-compliance \
patch complianceremediations/<scan-name>-sysctl-net-ipv4-conf-all-accept-redirects \
--patch '{"spec":{"apply":true}}' --type=merge
合规性操作员处理应用的修复后,status.ApplicationState
属性将更改为**已应用**,如果错误则更改为**错误**。应用机器配置修复后,该修复以及所有其他应用的修复将呈现到名为75-$scan-name-$suite-name
的MachineConfig
对象中。该MachineConfig
对象随后由 Machine Config 操作员呈现,最后由在每个节点上运行的机器控制守护程序实例应用于机器配置池中的所有节点。
请注意,当 Machine Config 操作员将新的MachineConfig
对象应用于池中的节点时,池中的所有节点都将重新引导。在应用多个修复程序时,这可能会很不方便,因为每个修复程序都会重新呈现组合的75-$scan-name-$suite-name
MachineConfig
对象。为了防止立即应用修复,您可以通过将MachineConfigPool
对象的.spec.paused
属性设置为true
来暂停机器配置池。
合规性操作员可以自动应用修复。在ScanSetting
顶级对象中设置autoApplyRemediations: true
。
仅应仔细考虑后才能自动应用修复。 |
合规性操作员不会自动解决修复之间可能出现的依赖性问题。应用修复后,用户应执行重新扫描以确保结果准确。 |
平台扫描的检查通常必须由管理员手动修复,原因有两个:
并非总是能够自动确定必须设置的值。其中一项检查要求提供允许的注册表列表,但扫描程序无法知道组织想要允许哪些注册表。
不同的检查修改不同的 API 对象,这需要自动修复来拥有root
或超级用户访问权限才能修改集群中的对象,这并不建议。
以下示例使用ocp4-ocp-allowed-registries-for-import
规则,该规则在默认的 OpenShift Container Platform 安装上将失败。检查规则oc get rule.compliance/ocp4-ocp-allowed-registries-for-import -oyaml
,该规则旨在通过设置allowedRegistriesForImport
属性来限制用户允许从中导入镜像的注册表。规则的警告属性还显示了检查的 API 对象,因此可以对其进行修改并修复问题。
$ oc edit image.config.openshift.io/cluster
apiVersion: config.openshift.io/v1
kind: Image
metadata:
annotations:
release.openshift.io/create-only: "true"
creationTimestamp: "2020-09-10T10:12:54Z"
generation: 2
name: cluster
resourceVersion: "363096"
selfLink: /apis/config.openshift.io/v1/images/cluster
uid: 2dcb614e-2f8a-4a23-ba9a-8e33cd0ff77e
spec:
allowedRegistriesForImport:
- domainName: registry.redhat.io
status:
externalRegistryHostnames:
- default-route-openshift-image-registry.apps.user-cluster-09-10-12-07.devcluster.openshift.com
internalRegistryHostname: image-registry.openshift-image-registry.svc:5000
重新运行扫描。
$ oc -n openshift-compliance \
annotate compliancescans/rhcos4-e8-worker compliance.openshift.io/rescan=
使用新版本的合规性内容时,它可能会提供与以前版本不同的新版本修复。合规性操作员将保留已应用的旧版本修复。OpenShift Container Platform 管理员还会收到新版本的通知,以便进行审核和应用。之前已应用但已更新的 ComplianceRemediation 对象会将其状态更改为**已过期**。已过期的对象已标记,以便可以轻松搜索它们。
先前应用的修复内容将存储在ComplianceRemediation
对象的spec.outdated
属性中,新的更新内容将存储在spec.current
属性中。更新内容到新版本后,管理员需要审核修复。只要spec.outdated
属性存在,它就会用于渲染生成的MachineConfig
对象。删除spec.outdated
属性后,Compliance Operator 会重新渲染生成的MachineConfig
对象,这会导致 Operator 将配置推送到节点。
搜索任何过时的修复
$ oc -n openshift-compliance get complianceremediations \
-l complianceoperator.openshift.io/outdated-remediation=
NAME STATE
workers-scan-no-empty-passwords Outdated
当前应用的修复存储在Outdated
属性中,新的未应用的修复存储在Current
属性中。如果您对新版本满意,请删除Outdated
字段。如果您想保留更新的内容,请删除Current
和Outdated
属性。
应用修复的新版本
$ oc -n openshift-compliance patch complianceremediations workers-scan-no-empty-passwords \
--type json -p '[{"op":"remove", "path":/spec/outdated}]'
修复状态将从Outdated
切换到Applied
$ oc get -n openshift-compliance complianceremediations workers-scan-no-empty-passwords
NAME STATE
workers-scan-no-empty-passwords Applied
节点将应用新的修复版本并重新启动。
合规性操作员不会自动解决修复之间可能出现的依赖性问题。应用修复后,用户应执行重新扫描以确保结果准确。 |
可能需要取消先前应用的修复。
将apply
标志设置为false
$ oc -n openshift-compliance \
patch complianceremediations/rhcos4-moderate-worker-sysctl-net-ipv4-conf-all-accept-redirects \
--patch '{"spec":{"apply":false}}' --type=merge
修复状态将更改为NotApplied
,并且组合的MachineConfig
对象将被重新渲染以不包含该修复。
所有应用了该修复的受影响节点都将重新启动。 |
合规性操作员不会自动解决修复之间可能出现的依赖性问题。应用修复后,用户应执行重新扫描以确保结果准确。 |
KubeletConfig
修复包含在节点级配置文件中。要删除KubeletConfig
修复,必须手动将其从KubeletConfig
对象中删除。此示例演示如何删除one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available
修复的合规性检查。
找到one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available
修复的scan-name
和合规性检查
$ oc -n openshift-compliance get remediation \ one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available -o yaml
apiVersion: compliance.openshift.io/v1alpha1
kind: ComplianceRemediation
metadata:
annotations:
compliance.openshift.io/xccdf-value-used: var-kubelet-evictionhard-imagefs-available
creationTimestamp: "2022-01-05T19:52:27Z"
generation: 1
labels:
compliance.openshift.io/scan-name: one-rule-tp-node-master (1)
compliance.openshift.io/suite: one-rule-ssb-node
name: one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available
namespace: openshift-compliance
ownerReferences:
- apiVersion: compliance.openshift.io/v1alpha1
blockOwnerDeletion: true
controller: true
kind: ComplianceCheckResult
name: one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available
uid: fe8e1577-9060-4c59-95b2-3e2c51709adc
resourceVersion: "84820"
uid: 5339d21a-24d7-40cb-84d2-7a2ebb015355
spec:
apply: true
current:
object:
apiVersion: machineconfiguration.openshift.io/v1
kind: KubeletConfig
spec:
kubeletConfig:
evictionHard:
imagefs.available: 10% (2)
outdated: {}
type: Configuration
status:
applicationState: Applied
1 | 修复的扫描名称。 |
2 | 已添加到KubeletConfig 对象的修复。 |
如果修复调用 |
删除修复
将修复对象的apply
设置为false
$ oc -n openshift-compliance patch \
complianceremediations/one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available \
-p '{"spec":{"apply":false}}' --type=merge
使用scan-name
查找应用了修复的KubeletConfig
对象
$ oc -n openshift-compliance get kubeletconfig \
--selector compliance.openshift.io/scan-name=one-rule-tp-node-master
NAME AGE
compliance-operator-kubelet-master 2m34s
手动从KubeletConfig
对象中删除修复imagefs.available: 10%
。
$ oc edit -n openshift-compliance KubeletConfig compliance-operator-kubelet-master
所有应用了该修复的受影响节点都将重新启动。 |
还必须从任何自定义配置文件中排除该规则,这些配置文件会自动应用该修复,否则,该修复将在下次计划扫描期间重新应用。 |
ScanSetting
对象列出了由ScanSetting
或ScanSettingBinding
对象生成的合规性扫描将扫描的节点角色。每个节点角色通常映射到一个机器配置池。
预期机器配置池中的所有机器都相同,并且来自池中节点的所有扫描结果都应相同。 |
如果某些结果与其他结果不同,则Compliance Operator 将标记一个ComplianceCheckResult
对象,其中一些节点将报告为INCONSISTENT
。所有ComplianceCheckResult
对象也标有compliance.openshift.io/inconsistent-check
。
由于池中的机器数量可能相当大,Compliance Operator 会尝试查找最常见的状态并列出与该常见状态不同的节点。最常见的状态存储在compliance.openshift.io/most-common-status
注释中,注释compliance.openshift.io/inconsistent-source
包含与最常见状态不同的检查状态的hostname:status
对。如果找不到常见状态,则所有hostname:status
对都将列在compliance.openshift.io/inconsistent-source
注释中。
如果可能,仍然会创建修复程序,以便集群可以收敛到合规状态。但是,这并非总是可能的,必须手动纠正节点之间的差异。必须使用compliance.openshift.io/rescan=
选项对扫描进行注释,以重新运行合规性扫描以获得一致的结果。
$ oc -n openshift-compliance \
annotate compliancescans/rhcos4-e8-worker compliance.openshift.io/rescan=
修改节点.