5.11. 执行高级 Compliance Operator 任务
Compliance Operator 包含适用于高级用户的选项,用于调试或与现有工具集成。
5.11.1. 直接使用 ComplianceSuite 和 ComplianceScan 对象
虽然建议用户利用 ScanSetting
和 ScanSettingBinding
对象来定义套件和扫描,但也有直接定义 ComplianceSuite
对象的有效用例:
-
仅指定单个规则进行扫描。这可与
debug: true
属性一起用于调试,提高 OpenSCAP 扫描程序的详细程度,否则调试模式会变得非常冗长。将测试限制为一条规则有助于减少调试信息的数量。 - 提供自定义 nodeSelector。要使补救适用,nodeSelector 必须与一个池匹配。
- 使用定制文件将 Scan 指向定制配置映射。
- 不需要从捆绑包解析配置集的消耗成本时用于测试或开发。
以下示例显示仅使用一条规则扫描 worker 机器的 ComplianceSuite
:
apiVersion: compliance.openshift.io/v1alpha1 kind: ComplianceSuite metadata: name: workers-compliancesuite spec: scans: - name: workers-scan profile: xccdf_org.ssgproject.content_profile_moderate content: ssg-rhcos4-ds.xml contentImage: registry.redhat.io/compliance/openshift-compliance-content-rhel8@sha256:45dc... debug: true rule: xccdf_org.ssgproject.content_rule_no_direct_root_logins nodeSelector: node-role.kubernetes.io/worker: ""
上面提到的 ComplianceSuite
对象和 ComplianceScan
对象以 OpenSCAP 期望的格式指定多个属性。
要找到配置集、内容或规则值,您可以先从 ScanSetting
和 ScanSettingBinding
创建类似的 Suite 或检查从 ProfileBundle
对象中解析的对象,如规则或配置集。这些对象包含可以从 ComplianceSuite
中引用它们的 xccdf_org
标识符。
5.11.2. 为 ScanSetting
扫描设置 PriorityClass
在大规模环境中,默认的 PriorityClass
对象可能太低,以保证 Pod 在其上执行扫描。对于必须保持合规或保证自动扫描的集群,建议设置 PriorityClass
变量,以确保 Compliance Operator 始终在资源约束的情况下赋予优先级。
流程
设置
PriorityClass
变量:apiVersion: compliance.openshift.io/v1alpha1 strictNodeScan: true metadata: name: default namespace: openshift-compliance priorityClass: compliance-high-priority 1 kind: ScanSetting showNotApplicable: false rawResultStorage: nodeSelector: node-role.kubernetes.io/master: '' pvAccessModes: - ReadWriteOnce rotation: 3 size: 1Gi tolerations: - effect: NoSchedule key: node-role.kubernetes.io/master operator: Exists - effect: NoExecute key: node.kubernetes.io/not-ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io/unreachable operator: Exists tolerationSeconds: 300 - effect: NoSchedule key: node.kubernetes.io/memory-pressure operator: Exists schedule: 0 1 * * * roles: - master - worker scanTolerations: - operator: Exists
- 1
- 如果无法找到
ScanSetting
中引用的PriorityClass
,Operator 会将PriorityClass
留空,发出警告,并在没有PriorityClass
的情况下继续调度扫描。
5.11.3. 使用原始定制配置集
尽管 TailoredProfile
CR 支持最常见的定制操作,但 XCCDF 标准在定制 OpenSCAP 配置集方面具有更大的灵活性。此外,如果您的机构之前一直使用 OpenScap,则您可能有一个现有的 XCCDF 定制文件可重复使用。
ComplianceSuite
对象包含可指向自定义定制文件的可选 TailoringConfigMap
属性。TailoringConfigMap
属性的值是一个配置映射的名称,它必须包含名为 tailoring.xml
的键,这个键的值是定制内容。
流程
从一个文件创建
ConfigMap
对象:$ oc -n openshift-compliance \ create configmap nist-moderate-modified \ --from-file=tailoring.xml=/path/to/the/tailoringFile.xml
在属于 Suite 的 Scan 中引用定制文件:
apiVersion: compliance.openshift.io/v1alpha1 kind: ComplianceSuite metadata: name: workers-compliancesuite spec: debug: true scans: - name: workers-scan profile: xccdf_org.ssgproject.content_profile_moderate content: ssg-rhcos4-ds.xml contentImage: registry.redhat.io/compliance/openshift-compliance-content-rhel8@sha256:45dc... debug: true tailoringConfigMap: name: nist-moderate-modified nodeSelector: node-role.kubernetes.io/worker: ""
5.11.4. 执行重新扫描
通常,您希望按指定时间表重新运行扫描,如每周一或每天。在修复节点上的问题后,重新运行一次扫描也很有用。要执行单次扫描,可使用 compliance.openshift.io/rescan=
选项注解扫描:
$ oc -n openshift-compliance \ annotate compliancescans/rhcos4-e8-worker compliance.openshift.io/rescan=
一个重新扫描会为 rhcos-moderate
配置集生成四个额外的 mc
:
$ oc get mc
输出示例
75-worker-scan-chronyd-or-ntpd-specify-remote-server 75-worker-scan-configure-usbguard-auditbackend 75-worker-scan-service-usbguard-enabled 75-worker-scan-usbguard-allow-hid-and-hub
应用扫描设置 default-auto-apply
标签时,补救会自动应用并过时的补救更新。如果存在由于依赖项或已经过时的补救没有被应用的补救,重新扫描会应用补救,并可能会触发重启。只有使用 MachineConfig
对象触发器重启的补救。如果没有要应用的更新或依赖项,则不会重启。
5.11.5. 为结果设置自定义存储大小
虽然 ComplianceCheckResult
等自定义资源表示一次检查跨所有扫描节点的聚合结果,但审阅扫描程序生成的原始结果会很有用。原始结果以 ARF 格式生成,可能较大(每个节点几十兆字节),将其存储在由 etcd
键-值存储支持的 Kubernetes 资源中是不切实际的。相反,每次扫描都会创建一个默认为 1GB 大小的 PV。根据您的环境,您可能想要相应地增大 PV 大小。这可以使用在 ScanSetting
和 ComplianceScan
资源中公开的 rawResultStorage.size
属性完成。
相关的参数是 rawResultStorage.rotation
,它控制在旧的扫描被轮转前 PV 中保留的扫描次数。默认值为 3,将轮转策略设置为 0 可禁用轮转。根据默认轮转策略和每个原始 ARF 扫描报告 100MB 的估计大小,您可以计算出环境的正确 PV 大小。
5.11.5.1. 使用自定义结果存储值
由于 OpenShift Container Platform 可以在各种公有云或裸机中部署,因此 Compliance Operator 无法决定可用的存储配置。默认情况下,Compliance Operator 会尝试使用集群的默认存储类创建 PV 来存储结果,但可以使用 rawResultStorage.StorageClassName
属性配置自定义存储类。
如果您的集群没有指定默认存储类,则必须设置此属性。
将 ScanSetting
自定义资源配置为使用标准存储类,并创建大小为 10GB 的持久性卷,并保留最后 10 个结果:
ScanSetting
CR 示例
apiVersion: compliance.openshift.io/v1alpha1 kind: ScanSetting metadata: name: default namespace: openshift-compliance rawResultStorage: storageClassName: standard rotation: 10 size: 10Gi roles: - worker - master scanTolerations: - effect: NoSchedule key: node-role.kubernetes.io/master operator: Exists schedule: '0 1 * * *'
5.11.6. 应用套件扫描生成的补救
虽然您可以使用 ComplianceSuite
对象中的 autoApplyRemediations
布尔值参数但您可以使用 compliance.openshift.io/apply-remediations
为对象添加注解。这允许 Operator 应用所有创建的补救。
流程
-
运行以下命令应用
compliance.openshift.io/apply-remediations
注解:
$ oc -n openshift-compliance \ annotate compliancesuites/workers-compliancesuite compliance.openshift.io/apply-remediations=
5.11.7. 自动更新补救
在某些情况下带有较新内容的扫描可能会将补救标记为 OUTDATED
。作为管理员您可以应用 compliance.openshift.io/remove-outdated
注解来应用新的补救并删除过时的补救。
流程
-
应用
compliance.openshift.io/remove-outdated
注解:
$ oc -n openshift-compliance \ annotate compliancesuites/workers-compliancesuite compliance.openshift.io/remove-outdated=
或者在 ScanSetting
或 ComplianceSuite
对象中设置 autoUpdateRemediations 标志
以自动更新补救。
5.11.8. 为 Compliance Operator 创建自定义 SCC
在一些环境中,您必须创建一个自定义安全性上下文约束(SCC)文件,以确保 Compliance Operator api-resource-collector
使用正确的权限。
先决条件
-
您必须具有
admin
权限。
流程
在名为
restricted-adjusted-compliance.yaml
的 YAML 文件中定义 SCC:SecurityContextConstraints
对象定义allowHostDirVolumePlugin: false allowHostIPC: false allowHostNetwork: false allowHostPID: false allowHostPorts: false allowPrivilegeEscalation: true allowPrivilegedContainer: false allowedCapabilities: null apiVersion: security.openshift.io/v1 defaultAddCapabilities: null fsGroup: type: MustRunAs kind: SecurityContextConstraints metadata: name: restricted-adjusted-compliance priority: 30 1 readOnlyRootFilesystem: false requiredDropCapabilities: - KILL - SETUID - SETGID - MKNOD runAsUser: type: MustRunAsRange seLinuxContext: type: MustRunAs supplementalGroups: type: RunAsAny users: - system:serviceaccount:openshift-compliance:api-resource-collector 2 volumes: - configMap - downwardAPI - emptyDir - persistentVolumeClaim - projected - secret
创建 SCC:
$ oc create -n openshift-compliance -f restricted-adjusted-compliance.yaml
输出示例
securitycontextconstraints.security.openshift.io/restricted-adjusted-compliance created
验证
验证是否已创建 SCC:
$ oc get -n openshift-compliance scc restricted-adjusted-compliance
输出示例
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP PRIORITY READONLYROOTFS VOLUMES restricted-adjusted-compliance false <no value> MustRunAs MustRunAsRange MustRunAs RunAsAny 30 false ["configMap","downwardAPI","emptyDir","persistentVolumeClaim","projected","secret"]