検索

7.8. Advanced Security Profiles オペレーターのタスク

download PDF

高度なタスクを使用して、メトリックを有効にしたり、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.0spec フィールドに追加します。

    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 メモリーの最適化は有効になっていません。

手順

  1. 次のコマンドを実行してメモリー最適化を有効にします。

    $ oc -n openshift-security-profiles patch spod spod --type=merge -p '{"spec":{"enableMemoryOptimization":true}}'
  2. 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 デーモンメトリクス用

手順

  1. メトリクスサービスのステータスを表示するには、次のコマンドを実行します。

    $ 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

  2. メトリクスを取得するには、次のコマンドを実行して、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

  3. 別の namespace からメトリックを取得するには、次のコマンドを実行して ServiceAccountspo-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_ という接頭辞が付けられます。

表7.1 利用可能なコントローラーランタイムメトリクス
メトリックキー可能なラベルタイプ目的

seccomp_profile_total

operation={delete,update}

カウンター

seccomp プロファイル操作の量。

seccomp_profile_audit_total

nodenamespacepodcontainerexecutablesyscall

カウンター

seccomp プロファイル監査操作の量。ログエンリッチャーを有効にする必要があります。

seccomp_profile_bpf_total

nodemount_namespaceprofile

カウンター

seccomp プロファイル bpf 操作の量。bpf レコーダを有効にする必要があります。

seccomp_profile_error_total

reason={
SeccompNotSupportedOnNode,
InvalidSeccompProfile,
CannotSaveSeccompProfile,
CannotRemoveSeccompProfile,
CannotUpdateSeccompProfile,
CannotUpdateNodeStatus
}

カウンター

seccomp プロファイルエラーの量。

selinux_profile_total

operation={delete,update}

カウンター

SELinux プロファイル操作の量。

selinux_profile_audit_total

nodenamespacepodcontainerexecutablescontexttcontext

カウンター

SELinux プロファイルの監査操作の量。ログエンリッチャーを有効にする必要があります。

selinux_profile_error_total

reason={
CannotSaveSelinuxPolicy,
CannotUpdatePolicyStatus,
CannotRemoveSelinuxPolicy,
CannotContactSelinuxd,
CannotWritePolicyFile,
CannotGetPolicyStatus
}

カウンター

SELinux プロファイルエラーの量。

7.8.7. ログエンリッチャーの使用

Security Profiles Operator にはログ強化機能が含まれており、デフォルトでは無効になっています。ログエンリッチャーコンテナーは、ローカルノードから監査ログを読み取るための privileged 権限で実行されます。ログエンリッチャーは、ホスト PID namespace hostPID 内で実行されます。

重要

ログエンリッチャーには、ホストプロセスを読み取る権限が必要です。

手順

  1. 次のコマンドを実行して、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 デーモンセットを自動的に再デプロイします。

  2. 次のコマンドを実行して、監査ログを表示します。

    $ 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 ログエンリッチャーを使用して、アプリケーションをトレースできます。

手順

  1. アプリケーションをトレースするには、SeccompProfile ロギングプロファイルを作成します。

    apiVersion: security-profiles-operator.x-k8s.io/v1beta1
    kind: SeccompProfile
    metadata:
      name: log
      namespace: default
    spec:
      defaultAction: SCMP_ACT_LOG
  2. プロファイルを使用する 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]
  3. 次のコマンドを実行して、ログエンリッチャーの出力を調べます。

    $ 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 は、failurePolicynamespaceSelector、および objectSelector 変数の変更を許可する webhookOptions フィールドを公開します。これにより、Webhook を "ソフトフェイル" に設定したり、namespace のサブセットに制限したりして、Webhook が失敗した場合でも他の namespace やリソースに影響を与えないようにすることができます。

手順

  1. 次のパッチファイルを作成して、recording.spo.io Webhook 設定を設定し、spo-record=true でラベル付けされた Pod のみを記録します。

    spec:
      webhookOptions:
        - name: recording.spo.io
          objectSelector:
            matchExpressions:
              - key: spo-record
                operator: In
                values:
                  - "true"
  2. 次のコマンドを実行して、spod/spod インスタンスにパッチを適用します。

    $ oc -n openshift-security-profiles patch spod \
        spod -p $(cat /tmp/spod-wh.patch) --type=merge
  3. 結果の MutatingWebhookConfiguration オブジェクトを表示するには、次のコマンドを実行します。

    $ oc get MutatingWebhookConfiguration \
        spo-mutating-webhook-configuration -oyaml
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.