7.7. SELinux プロファイルの管理
SELinux プロファイルを作成および管理し、それらをワークロードにバインドします。
Security Profiles Operator は、Red Hat Enterprise Linux CoreOS (RHCOS) ワーカーノードのみをサポートします。Red Hat Enterprise Linux (RHEL) ノードはサポートされていません。
7.7.1. SELinux プロファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
SelinuxProfile オブジェクトを使用してプロファイルを作成します。
SelinuxProfile オブジェクトには、セキュリティー強化と読みやすさを向上させるいくつかの機能があります。
-
継承するプロファイルを現在の namespace またはシステム全体のプロファイルに制限します。通常、システムには多くのプロファイルがインストールされていますが、クラスターワークロードではサブセットのみを使用する必要があるため、継承可能なシステムプロファイルは、
spec.selinuxOptions.allowedSystemProfilesのspodインスタンスにリストされています。 - 権限、クラス、およびラベルの基本的な検証を実行します。
-
ポリシーを使用するプロセスを説明する新しいキーワード
@selfを追加します。これにより、ポリシーの使用は名前と namespace に基づいているため、ワークロードと namespace の間でポリシーを簡単に再利用できます。 - SELinux CIL 言語で直接プロファイルを作成する場合と比較して、セキュリティーを強化し、読みやすくするための機能を追加します。
手順
次のコマンドを実行してプロジェクトを作成します。
oc new-project nginx-deploy
$ oc new-project nginx-deployCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
SelinuxProfileオブジェクトを作成して、特権のないワークロードで使用できるポリシーを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
selinuxdがポリシーをインストールするのを待ちます。oc wait --for=condition=ready selinuxprofile nginx-secure
$ oc wait --for=condition=ready selinuxprofile nginx-secureCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure condition met
selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure condition metCopy to Clipboard Copied! Toggle word wrap Toggle overflow ポリシーは、Security Profiles Operator が所有するコンテナー内の
emptyDirに配置されます。ポリシーは Common Intermediate Language (CIL) 形式で/etc/selinux.d/<name>_<namespace>.cilに保存されます。以下のコマンドを実行して Pod を作成します。
oc -n openshift-security-profiles rsh -c selinuxd ds/spod
$ oc -n openshift-security-profiles rsh -c selinuxd ds/spodCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、
catでファイルの内容を表示します。cat /etc/selinux.d/nginx-secure_.cil
$ cat /etc/selinux.d/nginx-secure_.cilCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ポリシーがインストールされていることを確認します。
semodule -l | grep nginx-secure
$ semodule -l | grep nginx-secureCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
nginx-secure_
nginx-secure_Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.2. Pod への SELinux プロファイルの適用 リンクのコピーリンクがクリップボードにコピーされました!
Pod を作成して、作成したプロファイルの 1 つを適用します。
SELinux プロファイルの場合、namespace にラベルを付けて、特権 ワークロードを許可する必要があります。
手順
次のコマンドを実行して、
scc.podSecurityLabelSync=falseラベルをnginx-deploynamespace に適用します。oc label ns nginx-deploy security.openshift.io/scc.podSecurityLabelSync=false
$ oc label ns nginx-deploy security.openshift.io/scc.podSecurityLabelSync=falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
privilegedラベルをnginx-deploynamespace に適用します。oc label ns nginx-deploy --overwrite=true pod-security.kubernetes.io/enforce=privileged
$ oc label ns nginx-deploy --overwrite=true pod-security.kubernetes.io/enforce=privilegedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、SELinux プロファイルの使用文字列を取得します。
oc get selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure -ojsonpath='{.status.usage}'$ oc get selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure -ojsonpath='{.status.usage}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
nginx-secure_.process
nginx-secure_.processCopy to Clipboard Copied! Toggle word wrap Toggle overflow ワークロードマニフェストの出力文字列を
.spec.containers[].securityContext.seLinuxOptions属性に適用します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要ワークロードを作成する前に、SELinux
typeが存在している必要があります。
7.7.2.1. SELinux ログポリシーの適用 リンクのコピーリンクがクリップボードにコピーされました!
ポリシー違反または AVC 拒否をログに記録するには、SElinuxProfile プロファイルを permissive に設定します。
この手順では、ロギングポリシーを定義します。施行ポリシーを設定しません。
手順
permissive: trueをSElinuxProfileに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.2.2. ProfileBindings を使用してワークロードをプロファイルにバインドする リンクのコピーリンクがクリップボードにコピーされました!
ProfileBinding リソースを使用して、セキュリティープロファイルをコンテナーの SecurityContext にバインドできます。
手順
quay.io/security-profiles-operator/test-nginx-unprivileged:1.21イメージを使用する Pod をサンプルのSelinuxProfileプロファイルにバインドするには、Pod とSelinuxProfileオブジェクトと同じ 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=trueCopy 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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Pod がすでに存在する場合、Pod を再作成しなければバインディングは適切に機能しません。
検証
次のコマンドを実行して、Pod が
ProfileBindingを継承していることを確認します。oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seLinuxOptions.type}'$ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seLinuxOptions.type}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
profile_.process
profile_.processCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.2.3. コントローラーと SecurityContextConstraints の複製 リンクのコピーリンクがクリップボードにコピーされました!
デプロイメントやデーモンセットなど、コントローラーをレプリケートするための SELinux ポリシーをデプロイする場合、コントローラーによって生成された Pod オブジェクトは、ワークロードを作成するユーザーの ID で実行されないことに注意してください。ServiceAccount が選択されていない場合、Pod は、カスタムセキュリティーポリシーの使用を許可しない、制限された SecurityContextConstraints (SCC) の使用に戻る可能性があります。
手順
次のコマンドを実行してプロジェクトを作成します。
oc new-project nginx-secure
$ oc new-project nginx-secureCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
RoleBindingオブジェクトを作成して、SELinux ポリシーをnginx-securenamespace で使用できるようにします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Roleオブジェクトを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ServiceAccountオブジェクトを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Deploymentオブジェクトを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- デプロイメントが作成される前に、
.seLinuxOptions.typeが存在している必要があります。
注記SELinux タイプはワークロードで指定されておらず、SCC によって処理されます。デプロイと
ReplicaSetによって Pod が作成されると、Pod は適切なプロファイルで実行されます。
SCC が、正しいサービスアカウントのみで使用できることを確認してください。詳細は、その他のリソース を参照してください。
7.7.3. ワークロードからのプロファイルの記録 リンクのコピーリンクがクリップボードにコピーされました!
Security Profiles Operator は、ProfileRecording オブジェクトを使用してシステムコールを記録できるため、アプリケーションのベースラインプロファイルを簡単に作成できます。
ログエンリッチャーを使用して SELinux プロファイルを記録する場合は、ログエンリッチャー機能が有効になっていることを確認します。詳細は、関連情報 を参照してください。
privileged: true のセキュリティーコンテキスト制限を持つコンテナーにより、ログベースの記録が防止されます。特権コンテナーは SELinux ポリシーの対象ではなく、ログベースの記録では特別な SELinux プロファイルを使用してイベントを記録します。
手順
次のコマンドを実行してプロジェクトを作成します。
oc new-project my-namespace
$ oc new-project my-namespaceCopy 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=trueCopy 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 podsCopy 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 18sCopy 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-enricherCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
I0517 13:55:36.383187 348295 enricher.go:376] log-enricher "msg"="audit" "container"="redis" "namespace"="my-namespace" "node"="ip-10-0-189-53.us-east-2.compute.internal" "perm"="name_bind" "pod"="my-pod" "profile"="test-recording_redis_6kmrb_1684331729" "scontext"="system_u:system_r:selinuxrecording.process:s0:c4,c27" "tclass"="tcp_socket" "tcontext"="system_u:object_r:redis_port_t:s0" "timestamp"="1684331735.105:273965" "type"="selinux"
I0517 13:55:36.383187 348295 enricher.go:376] log-enricher "msg"="audit" "container"="redis" "namespace"="my-namespace" "node"="ip-10-0-189-53.us-east-2.compute.internal" "perm"="name_bind" "pod"="my-pod" "profile"="test-recording_redis_6kmrb_1684331729" "scontext"="system_u:system_r:selinuxrecording.process:s0:c4,c27" "tclass"="tcp_socket" "tcontext"="system_u:object_r:redis_port_t:s0" "timestamp"="1684331735.105:273965" "type"="selinux"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
Pod を削除します。
oc -n my-namespace delete pod my-pod
$ oc -n my-namespace delete pod my-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow Security Profiles Operator が 2 つの SELinux プロファイルを調整することを確認します。
oc get selinuxprofiles -lspo.x-k8s.io/recording-id=test-recording
$ oc get selinuxprofiles -lspo.x-k8s.io/recording-id=test-recordingCopy to Clipboard Copied! Toggle word wrap Toggle overflow selinuxprofile の出力例
NAME USAGE STATE test-recording-nginx test-recording-nginx_.process Installed test-recording-redis test-recording-redis_.process Installed
NAME USAGE STATE test-recording-nginx test-recording-nginx_.process Installed test-recording-redis test-recording-redis_.process InstalledCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.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=trueCopy 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-namespaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow プロファイルをマージするには、次のコマンドを実行してプロファイルの記録を削除します。
oc delete profilerecording test-recording -n my-namespace
$ oc delete profilerecording test-recording -n my-namespaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow マージ操作を開始して結果プロファイルを生成するには、次のコマンドを実行します。
oc get selinuxprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespace
$ oc get selinuxprofiles -lspo.x-k8s.io/recording-id=test-recording -n my-namespaceCopy to Clipboard Copied! Toggle word wrap Toggle overflow selinuxprofiles の出力例
NAME USAGE STATE test-recording-nginx-record test-recording-nginx-record_.process Installed
NAME USAGE STATE test-recording-nginx-record test-recording-nginx-record_.process InstalledCopy to Clipboard Copied! Toggle word wrap Toggle overflow いずれかのコンテナーで使用されている権限を表示するには、次のコマンドを実行します。
oc get selinuxprofiles test-recording-nginx-record -o yaml
$ oc get selinuxprofiles test-recording-nginx-record -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.3.2. About seLinuxContext: RunAsAny リンクのコピーリンクがクリップボードにコピーされました!
SELinux ポリシーの記録は、記録される Pod に特別な SELinux タイプを挿入する Webhook で実装されます。SELinux タイプは、Pod を permissive モードで実行し、すべての AVC 拒否を audit.log に記録します。デフォルトでは、カスタム SELinux ポリシーを使用したワークロードの実行は許可されていませんが、自動生成されたタイプが使用されます。
ワークロードを記録するには、Webhook が許容された SELinux タイプを挿入できる SCC を使用する権限を持つサービスアカウントを使用する必要があります。privileged SCC には、seLinuxContext: RunAsAny が含まれています。
さらに、カスタム SELinux ポリシーの使用を許可するのは privileged の Pod Security Standard のみであるため、クラスターで Pod Security Admission が有効になっている場合は、namespace に pod-security.kubernetes.io/enforce: privileged 付きのラベルを付ける必要があります。