7.8. Advanced Security Profiles オペレーターのタスク
高度なタスクを使用して、メトリックを有効にしたり、Webhook を設定したり、syscall を制限したりします。
7.8.1. seccomp プロファイルで許可されるシステムコールを制限する
Security Profiles Operator は、デフォルトでは、seccomp
プロファイルの syscall
を制限しません。spod
設定で、許可される syscalls
のリストを定義できます。
手順
allowedSyscalls
のリストを定義するには、次のコマンドを実行してspec
パラメーターを調整します。$ oc -n openshift-security-profiles patch spod spod --type merge \ -p '{"spec":{"allowedSyscalls": ["exit", "exit_group", "futex", "nanosleep"]}}'
Operator は、許可リストに定義された syscall
のサブセットを持つ seccomp
プロファイルのみをインストールします。このルールセットに準拠していないすべてのプロファイルは拒否されます。
許可された syscall
のリストが spod
設定で変更されると、Operator はすでにインストールされている非準拠のプロファイルを特定し、それらを自動的に削除します。
7.8.2. コンテナーランタイムの基本システムコール
baseProfileName
属性を使用して、特定のランタイムがコンテナーを開始するために最低限必要な syscall
を確立できます。
手順
SeccompProfile
kind オブジェクトを編集し、baseProfileName: runc-v1.0.0
をspec
フィールドに追加します。apiVersion: security-profiles-operator.x-k8s.io/v1beta1 kind: SeccompProfile metadata: namespace: my-namespace name: example-name spec: defaultAction: SCMP_ACT_ERRNO baseProfileName: runc-v1.0.0 syscalls: - action: SCMP_ACT_ALLOW names: - exit_group
7.8.3. spod デーモンでのメモリー最適化の有効化
プロファイルの記録が有効になっている場合、spod
デーモンプロセス内で実行されているコントローラーは、クラスター内の使用可能な Pod をすべて監視します。そこれにより、大規模なクラスターではメモリー使用量が非常に多くなり、その結果、spod
デーモンがメモリー不足になったり、クラッシュしたりする可能性があります。
クラッシュを防ぐために、プロファイル記録用にラベル付けされた Pod のみをキャッシュメモリーにロードするように spod
デーモンを設定できます。
デフォルトで SPO メモリーの最適化は有効になっていません。
手順
次のコマンドを実行してメモリー最適化を有効にします。
$ oc -n openshift-security-profiles patch spod spod --type=merge -p '{"spec":{"enableMemoryOptimization":true}}'
Pod のセキュリティープロファイルを記録するには、Pod に
spo.x-k8s.io/enable-recording: "true"
のラベルを付ける必要があります。apiVersion: v1 kind: Pod metadata: name: my-recording-pod labels: spo.x-k8s.io/enable-recording: "true" # ...
7.8.4. デーモンリソース要件のカスタマイズ
デーモンコンテナーのデフォルトのリソース要件は、spod
設定の daemonResourceRequirements
フィールドを使用して調整できます。
手順
デーモンコンテナーのメモリーと CPU の要求と制限を指定するには、次のコマンドを実行します。
$ oc -n openshift-security-profiles patch spod spod --type merge -p \ '{"spec":{"daemonResourceRequirements": { \ "requests": {"memory": "256Mi", "cpu": "250m"}, \ "limits": {"memory": "512Mi", "cpu": "500m"}}}}'
7.8.5. spod デーモン Pod のカスタム優先クラス名の設定
spod
デーモン Pod のデフォルトの優先クラス名は system-node-critical
に設定されます。カスタム優先クラス名は、spod
設定の priorityClassName
フィールドに値を入力して設定できます。
手順
次のコマンドを実行して、優先クラス名を設定します。
$ oc -n openshift-security-profiles patch spod spod --type=merge -p '{"spec":{"priorityClassName":"my-priority-class"}}'
出力例
securityprofilesoperatordaemon.openshift-security-profiles.x-k8s.io/spod patched
7.8.6. メトリクスの使用
openshift-security-profiles
namespace は、kube-rbac-proxy コンテナーによって保護されるメトリクスエンドポイントを提供します。すべてのメトリクスは、openshift-security-profiles
namespace 内の metrics
サービスによって公開されます。
Security Profiles Operator には、クラスター内からメトリックを取得するためのクラスターロールと、対応するバインディング spo-metrics-client
が含まれています。次の 2 つのメトリクスパスを使用できます。
-
metrics.openshift-security-profiles/metrics
: コントローラーのランタイムメトリック用 -
metrics.openshift-security-profiles/metrics-spod
: Operator デーモンメトリクス用
手順
メトリクスサービスのステータスを表示するには、次のコマンドを実行します。
$ oc get svc/metrics -n openshift-security-profiles
出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE metrics ClusterIP 10.0.0.228 <none> 443/TCP 43s
メトリクスを取得するには、次のコマンドを実行して、
openshift-security-profiles
namespace でデフォルトのServiceAccount
トークンを使用してサービスエンドポイントをクエリーします。$ oc run --rm -i --restart=Never --image=registry.fedoraproject.org/fedora-minimal:latest \ -n openshift-security-profiles metrics-test -- bash -c \ 'curl -ks -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://metrics.openshift-security-profiles/metrics-spod'
出力例
# HELP security_profiles_operator_seccomp_profile_total Counter about seccomp profile operations. # TYPE security_profiles_operator_seccomp_profile_total counter security_profiles_operator_seccomp_profile_total{operation="delete"} 1 security_profiles_operator_seccomp_profile_total{operation="update"} 2
別の namespace からメトリックを取得するには、次のコマンドを実行して
ServiceAccount
をspo-metrics-client
ClusterRoleBinding
にリンクします。$ oc get clusterrolebinding spo-metrics-client -o wide
出力例
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS spo-metrics-client ClusterRole/spo-metrics-client 35m openshift-security-profiles/default
7.8.6.1. コントローラーランタイムメトリクス
controller-runtime metrics
と DaemonSet エンドポイント metrics-spod
は、一連のデフォルトメトリクスを提供します。デーモンによって追加のメトリックが提供され、常に security_profiles_operator_
という接頭辞が付けられます。
メトリックキー | 可能なラベル | タイプ | 目的 |
---|---|---|---|
|
| カウンター | seccomp プロファイル操作の量。 |
|
| カウンター | seccomp プロファイル監査操作の量。ログエンリッチャーを有効にする必要があります。 |
|
| カウンター | seccomp プロファイル bpf 操作の量。bpf レコーダを有効にする必要があります。 |
|
| カウンター | seccomp プロファイルエラーの量。 |
|
| カウンター | SELinux プロファイル操作の量。 |
|
| カウンター | SELinux プロファイルの監査操作の量。ログエンリッチャーを有効にする必要があります。 |
|
| カウンター | SELinux プロファイルエラーの量。 |
7.8.7. ログエンリッチャーの使用
Security Profiles Operator にはログ強化機能が含まれており、デフォルトでは無効になっています。ログエンリッチャーコンテナーは、ローカルノードから監査ログを読み取るための privileged
権限で実行されます。ログエンリッチャーは、ホスト PID namespace hostPID
内で実行されます。
ログエンリッチャーには、ホストプロセスを読み取る権限が必要です。
手順
次のコマンドを実行して、
spod
設定にパッチを適用し、ログエンリッチャーを有効にします。$ oc -n openshift-security-profiles patch spod spod \ --type=merge -p '{"spec":{"enableLogEnricher":true}}'
出力例
securityprofilesoperatordaemon.security-profiles-operator.x-k8s.io/spod patched
注記Security Profiles Operator は、
spod
デーモンセットを自動的に再デプロイします。次のコマンドを実行して、監査ログを表示します。
$ oc -n openshift-security-profiles logs -f ds/spod log-enricher
出力例
I0623 12:51:04.257814 1854764 deleg.go:130] setup "msg"="starting component: log-enricher" "buildDate"="1980-01-01T00:00:00Z" "compiler"="gc" "gitCommit"="unknown" "gitTreeState"="clean" "goVersion"="go1.16.2" "platform"="linux/amd64" "version"="0.4.0-dev" I0623 12:51:04.257890 1854764 enricher.go:44] log-enricher "msg"="Starting log-enricher on node: 127.0.0.1" I0623 12:51:04.257898 1854764 enricher.go:46] log-enricher "msg"="Connecting to local GRPC server" I0623 12:51:04.258061 1854764 enricher.go:69] log-enricher "msg"="Reading from file /var/log/audit/audit.log" 2021/06/23 12:51:04 Seeked /var/log/audit/audit.log - &{Offset:0 Whence:2}
7.8.7.1. ログエンリッチャーを使用してアプリケーションをトレースする
Security Profiles Operator ログエンリッチャーを使用して、アプリケーションをトレースできます。
手順
アプリケーションをトレースするには、
SeccompProfile
ロギングプロファイルを作成します。apiVersion: security-profiles-operator.x-k8s.io/v1beta1 kind: SeccompProfile metadata: name: log namespace: default spec: defaultAction: SCMP_ACT_LOG
プロファイルを使用する Pod オブジェクトを作成します。
apiVersion: v1 kind: Pod metadata: name: log-pod spec: securityContext: runAsNonRoot: true seccompProfile: type: Localhost localhostProfile: operator/default/log.json containers: - name: log-container image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21 securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL]
次のコマンドを実行して、ログエンリッチャーの出力を調べます。
$ oc -n openshift-security-profiles logs -f ds/spod log-enricher
例7.1 出力例
… I0623 12:59:11.479869 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=3 "syscallName"="close" "timestamp"="1624453150.205:1061" "type"="seccomp" I0623 12:59:11.487323 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=157 "syscallName"="prctl" "timestamp"="1624453150.205:1062" "type"="seccomp" I0623 12:59:11.492157 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=157 "syscallName"="prctl" "timestamp"="1624453150.205:1063" "type"="seccomp" … I0623 12:59:20.258523 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=12 "syscallName"="brk" "timestamp"="1624453150.235:2873" "type"="seccomp" I0623 12:59:20.263349 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=21 "syscallName"="access" "timestamp"="1624453150.235:2874" "type"="seccomp" I0623 12:59:20.354091 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=257 "syscallName"="openat" "timestamp"="1624453150.235:2875" "type"="seccomp" I0623 12:59:20.358844 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=5 "syscallName"="fstat" "timestamp"="1624453150.235:2876" "type"="seccomp" I0623 12:59:20.363510 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=9 "syscallName"="mmap" "timestamp"="1624453150.235:2877" "type"="seccomp" I0623 12:59:20.454127 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=3 "syscallName"="close" "timestamp"="1624453150.235:2878" "type"="seccomp" I0623 12:59:20.458654 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=257 "syscallName"="openat" "timestamp"="1624453150.235:2879" "type"="seccomp" …
7.8.8. Webhook の設定
プロファイルバインディングおよびプロファイル記録オブジェクトは Webhook を使用できます。プロファイルバインディングおよび記録オブジェクトの設定は MutatingWebhookConfiguration
CR であり、Security Profiles Operator によって管理されます。
Webhook 設定を変更するために、spod
CR は、failurePolicy
、namespaceSelector
、および objectSelector
変数の変更を許可する webhookOptions
フィールドを公開します。これにより、Webhook を "ソフトフェイル" に設定したり、namespace のサブセットに制限したりして、Webhook が失敗した場合でも他の namespace やリソースに影響を与えないようにすることができます。
手順
次のパッチファイルを作成して、
recording.spo.io
Webhook 設定を設定し、spo-record=true
でラベル付けされた Pod のみを記録します。spec: webhookOptions: - name: recording.spo.io objectSelector: matchExpressions: - key: spo-record operator: In values: - "true"
次のコマンドを実行して、
spod/spod
インスタンスにパッチを適用します。$ oc -n openshift-security-profiles patch spod \ spod -p $(cat /tmp/spod-wh.patch) --type=merge
結果の
MutatingWebhookConfiguration
オブジェクトを表示するには、次のコマンドを実行します。$ oc get MutatingWebhookConfiguration \ spo-mutating-webhook-configuration -oyaml