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-deploy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
SelinuxProfile
オブジェクトを作成して、特権のないワークロードで使用できるポリシーを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
selinuxd
がポリシーをインストールするのを待ちます。oc wait --for=condition=ready -n nginx-deploy selinuxprofile nginx-secure
$ oc wait --for=condition=ready -n nginx-deploy selinuxprofile nginx-secure
Copy 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 met
Copy 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/spod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、
cat
でファイルの内容を表示します。cat /etc/selinux.d/nginx-secure_nginx-deploy.cil
$ cat /etc/selinux.d/nginx-secure_nginx-deploy.cil
Copy 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-secure
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
nginx-secure_nginx-deploy
nginx-secure_nginx-deploy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.7.2. Pod への SELinux プロファイルの適用 リンクのコピーリンクがクリップボードにコピーされました!
Pod を作成して、作成したプロファイルの 1 つを適用します。
SELinux プロファイルの場合、namespace にラベルを付けて、特権 ワークロードを許可する必要があります。
手順
次のコマンドを実行して、
scc.podSecurityLabelSync=false
ラベルをnginx-deploy
namespace に適用します。oc label ns nginx-deploy security.openshift.io/scc.podSecurityLabelSync=false
$ oc label ns nginx-deploy security.openshift.io/scc.podSecurityLabelSync=false
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
privileged
ラベルをnginx-deploy
namespace に適用します。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=privileged
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、SELinux プロファイルの使用文字列を取得します。
oc get selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure -n nginx-deploy -ojsonpath='{.status.usage}'
$ oc get selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure -n nginx-deploy -ojsonpath='{.status.usage}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
nginx-secure_nginx-deploy.process
nginx-secure_nginx-deploy.process
Copy 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=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.seLinuxOptions.type}'
$ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seLinuxOptions.type}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
profile_nginx-binding.process
profile_nginx-binding.process
Copy 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-secure
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
RoleBinding
オブジェクトを作成して、SELinux ポリシーをnginx-secure
namespace で使用できるようにします。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-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 出力例
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-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 つの SELinux プロファイルを調整することを確認します。
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-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow selinuxprofile の出力例
NAME USAGE STATE test-recording-nginx test-recording-nginx_my-namespace.process Installed test-recording-redis test-recording-redis_my-namespace.process Installed
NAME USAGE STATE test-recording-nginx test-recording-nginx_my-namespace.process Installed test-recording-redis test-recording-redis_my-namespace.process Installed
Copy 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=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 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-namespace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow selinuxprofile の出力例
NAME USAGE STATE test-recording-nginx-record test-recording-nginx-record_my-namespace.process Installed
NAME USAGE STATE test-recording-nginx-record test-recording-nginx-record_my-namespace.process Installed
Copy 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 yaml
Copy 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
付きのラベルを付ける必要があります。