7.6. seccomp プロファイルの管理
seccomp プロファイルを作成および管理し、それらをワークロードにバインドします。
Security Profiles Operator は、Red Hat Enterprise Linux CoreOS (RHCOS) ワーカーノードのみをサポートします。Red Hat Enterprise Linux (RHEL) ノードはサポートされていません。
7.6.1. seccomp プロファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
プロファイルを作成するには、SeccompProfile
オブジェクトを使用します。
SeccompProfile
オブジェクトは、コンテナー内のシステムコールを制限して、アプリケーションのアクセスを制限できます。
手順
次のコマンドを実行してプロジェクトを作成します。
oc new-project my-namespace
$ oc new-project my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow SeccompProfile
オブジェクトを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
seccomp プロファイルは /var/lib/kubelet/seccomp/operator/<namespace>/<name>.json
に保存されます。
init
コンテナーは Security Profiles Operator のルートディレクトリーを作成し、root
グループまたはユーザー ID 権限なしで Operator を実行します。ルートレスプロファイルストレージ /var/lib/openshift-security-profiles
から、kubelet root /var/lib/kubelet/seccomp/operator
内のデフォルトの seccomp
root パスへのシンボリックリンクが作成されます。
7.6.2. Pod への seccomp プロファイルの適用 リンクのコピーリンクがクリップボードにコピーされました!
Pod を作成して、作成したプロファイルの 1 つを適用します。
手順
securityContext
を定義する Pod オブジェクトを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
seccompProfile.localhostProfile
属性のプロファイルパスを表示します。oc -n my-namespace get seccompprofile profile1 --output wide
$ oc -n my-namespace get seccompprofile profile1 --output wide
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Installed 14s operator/my-namespace/profile1.json
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Installed 14s operator/my-namespace/profile1.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、localhost プロファイルへのパスを表示します。
oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'
$ oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
operator/my-namespace/profile1.json
operator/my-namespace/profile1.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow localhostProfile
の出力をパッチファイルに適用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、プロファイルを他のワークロード (
Deployment
オブジェクトなど) に適用します。oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=merge
$ oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
deployment.apps/myapp patched
deployment.apps/myapp patched
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、プロファイルが正しく適用されたことを確認します。
oc -n my-namespace get deployment myapp --output=jsonpath='{.spec.template.spec.securityContext}' | jq .
$ oc -n my-namespace get deployment myapp --output=jsonpath='{.spec.template.spec.securityContext}' | jq .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.2.1. ProfileBindings を使用してワークロードをプロファイルにバインドする リンクのコピーリンクがクリップボードにコピーされました!
ProfileBinding
リソースを使用して、セキュリティープロファイルをコンテナーの SecurityContext
にバインドできます。
手順
quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
イメージを使用する Pod をサンプルのSeccompProfile
プロファイルにバインドするには、Pod とSeccompProfile
オブジェクトと同じ namespace にProfileBinding
オブジェクトを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要image: "*"
ワイルドカード属性を使用すると、すべての新しい Pod が、指定された namespace 内のデフォルトのセキュリティープロファイルにバインドされます。次のコマンドを実行して、namespace に
enable-binding=true
のラベルを付けます。oc label ns my-namespace spo.x-k8s.io/enable-binding=true
$ oc label ns my-namespace spo.x-k8s.io/enable-binding=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow test-pod.yaml
という名前の Pod を定義します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pod を作成します。
oc create -f test-pod.yaml
$ oc create -f test-pod.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Pod がすでに存在する場合、Pod を再作成しなければバインディングは適切に機能しません。
検証
次のコマンドを実行して、Pod が
ProfileBinding
を継承していることを確認します。oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'
$ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
{"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}
{"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.3. ワークロードからのプロファイルの記録 リンクのコピーリンクがクリップボードにコピーされました!
Security Profiles Operator は、ProfileRecording
オブジェクトを使用してシステムコールを記録できるため、アプリケーションのベースラインプロファイルを簡単に作成できます。
ログエンリッチャーを使用して seccomp プロファイルを記録する場合は、ログエンリッチャー機能が有効になっていることを確認します。詳細は、関連情報 を参照してください。
privileged: true
のセキュリティーコンテキスト制限を持つコンテナーにより、ログベースの記録が防止されます。特権コンテナーは seccomp ポリシーの対象ではなく、ログベースの記録では特別な seccomp プロファイルを使用してイベントを記録します。
手順
次のコマンドを実行してプロジェクトを作成します。
oc new-project my-namespace
$ oc new-project my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、namespace に
enable-recording=true
のラベルを付けます。oc label ns my-namespace spo.x-k8s.io/enable-recording=true
$ oc label ns my-namespace spo.x-k8s.io/enable-recording=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow recorder: logs
変数を含むProfileRecording
オブジェクトを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 記録するワークロードを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを入力して、Pod が
Running
状態であることを確認します。oc -n my-namespace get pods
$ oc -n my-namespace get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 0 18s
NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 0 18s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow エンリッチャーがそれらのコンテナーの監査ログを受信することを示していることを確認します。
oc -n openshift-security-profiles logs --since=1m --selector name=spod -c log-enricher
$ oc -n openshift-security-profiles logs --since=1m --selector name=spod -c log-enricher
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
I0523 14:19:08.747313 430694 enricher.go:445] log-enricher "msg"="audit" "container"="redis" "executable"="/usr/local/bin/redis-server" "namespace"="my-namespace" "node"="xiyuan-23-5g2q9-worker-eastus2-6rpgf" "pid"=656802 "pod"="my-pod" "syscallID"=0 "syscallName"="read" "timestamp"="1684851548.745:207179" "type"="seccomp"
I0523 14:19:08.747313 430694 enricher.go:445] log-enricher "msg"="audit" "container"="redis" "executable"="/usr/local/bin/redis-server" "namespace"="my-namespace" "node"="xiyuan-23-5g2q9-worker-eastus2-6rpgf" "pid"=656802 "pod"="my-pod" "syscallID"=0 "syscallName"="read" "timestamp"="1684851548.745:207179" "type"="seccomp"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
Pod を削除します。
oc -n my-namepace delete pod my-pod
$ oc -n my-namepace delete pod my-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Security Profiles Operator が 2 つの seccomp プロファイルを調整することを確認します。
oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
$ oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow seccompprofile の出力例
NAME STATUS AGE test-recording-nginx Installed 2m48s test-recording-redis Installed 2m48s
NAME STATUS AGE test-recording-nginx Installed 2m48s test-recording-redis Installed 2m48s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.3.1. コンテナーごとのプロファイルインスタンスのマージ リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、各コンテナーインスタンスは個別のプロファイルに記録されます。Security Profiles Operator は、コンテナーごとのプロファイルを 1 つのプロファイルにマージできます。プロファイルのマージは、ReplicaSet
または Deployment
オブジェクトを使用してアプリケーションをデプロイメントするときに役立ちます。
手順
ProfileRecording
オブジェクトを編集して、mergeStrategy: containers
変数を含めます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して namespace にラベルを付けます。
oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite=true
$ oc label ns my-namespace security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の YAML を使用してワークロードを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 個々のプロファイルを記録するには、次のコマンドを実行してデプロイメントを削除します。
oc delete deployment nginx-deploy -n my-namespace
$ oc delete deployment nginx-deploy -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow プロファイルをマージするには、次のコマンドを実行してプロファイルの記録を削除します。
oc delete profilerecording test-recording -n my-namespace
$ oc delete profilerecording test-recording -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow マージ操作を開始して結果プロファイルを生成するには、次のコマンドを実行します。
oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
$ oc get seccompprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow seccompprofiles の出力例
NAME STATUS AGE test-recording-nginx-record Installed 55s
NAME STATUS AGE test-recording-nginx-record Installed 55s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow いずれかのコンテナーで使用されている権限を表示するには、次のコマンドを実行します。
oc get seccompprofiles test-recording-nginx-record -o yaml
$ oc get seccompprofiles test-recording-nginx-record -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow