セキュリティーおよびコンプライアンス
AWS クラスターの Security Context Constraints の設定
概要
第1章 監査ログの表示
Red Hat OpenShift Service on AWS 監査は、システムに影響を与えた一連のアクティビティーを個別のユーザー、管理者、またはその他システムのコンポーネント別に記述したセキュリティー関連の時系列のレコードを提供します。
1.1. API の監査ログについて
監査は API サーバーレベルで実行され、サーバーに送られるすべての要求をログに記録します。それぞれの監査ログには、以下の情報が含まれます。
フィールド | 説明 |
---|---|
| イベントが生成された監査レベル。 |
| 要求ごとに生成される一意の監査 ID。 |
| このイベントインスタンスの生成時の要求処理のステージ。 |
| クライアントによってサーバーに送信される要求 URI。 |
| 要求に関連付けられる Kubernetes の動詞。リソース以外の要求の場合、これは小文字の HTTP メソッドになります。 |
| 認証されたユーザーの情報。 |
| オプション。偽装ユーザーの情報 (要求で別のユーザーを偽装する場合)。 |
| オプション。要求の送信元および中間プロキシーからのソース IP。 |
| オプション。クライアントが報告するユーザーエージェントの文字列。ユーザーエージェントはクライアントによって提供されており、信頼できないことに注意してください。 |
|
オプション。この要求のターゲットとなっているオブジェクト参照。これは、 |
|
オプション。 |
|
オプション。JSON 形式の要求からの API オブジェクト。 |
|
オプション。JSON 形式の応答で返される API オブジェクト。 |
| 要求が API サーバーに到達した時間。 |
| 要求が現在の監査ステージに達した時間。 |
|
オプション。監査イベントと共に保存される構造化されていないキーと値のマップ。これは、認証、認可、受付プラグインなど、要求提供チェーンで呼び出されるプラグインによって設定される可能性があります。これらのアノテーションは監査イベント用のもので、送信されたオブジェクトの |
Kubernetes API サーバーの出力例:
{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"ad209ce1-fec7-4130-8192-c4cc63f1d8cd","stage":"ResponseComplete","requestURI":"/api/v1/namespaces/openshift-kube-controller-manager/configmaps/cert-recovery-controller-lock?timeout=35s","verb":"update","user":{"username":"system:serviceaccount:openshift-kube-controller-manager:localhost-recovery-client","uid":"dd4997e3-d565-4e37-80f8-7fc122ccd785","groups":["system:serviceaccounts","system:serviceaccounts:openshift-kube-controller-manager","system:authenticated"]},"sourceIPs":["::1"],"userAgent":"cluster-kube-controller-manager-operator/v0.0.0 (linux/amd64) kubernetes/$Format","objectRef":{"resource":"configmaps","namespace":"openshift-kube-controller-manager","name":"cert-recovery-controller-lock","uid":"5c57190b-6993-425d-8101-8337e48c7548","apiVersion":"v1","resourceVersion":"574307"},"responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2020-04-02T08:27:20.200962Z","stageTimestamp":"2020-04-02T08:27:20.206710Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"system:openshift:operator:kube-controller-manager-recovery\" of ClusterRole \"cluster-admin\" to ServiceAccount \"localhost-recovery-client/openshift-kube-controller-manager\""}}
1.2. 監査ログの表示
それぞれのコントロールプレーンノードについて OpenShift API サーバー、Kubernetes API サーバー、OpenShift OAuth API サーバー、および OpenShift OAuth サーバーのログを表示できます。
手順
監査ログを表示するには、以下を実行します。
OpenShift API サーバーの監査ログを表示します。
各コントロールプレーンノードで利用可能な OpenShift API サーバー監査ログをリスト表示します。
$ oc adm node-logs --role=master --path=openshift-apiserver/
出力例
ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit-2021-03-09T00-12-19.834.log ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit.log ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit-2021-03-09T00-11-49.835.log ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit.log ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit-2021-03-09T00-13-00.128.log ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit.log
ノード名とログ名を指定して、特定の OpenShift API サーバー監査ログを表示します。
$ oc adm node-logs <node_name> --path=openshift-apiserver/<log_name>
以下に例を示します。
$ oc adm node-logs ci-ln-m0wpfjb-f76d1-vnb5x-master-0 --path=openshift-apiserver/audit-2021-03-09T00-12-19.834.log
出力例
{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"381acf6d-5f30-4c7d-8175-c9c317ae5893","stage":"ResponseComplete","requestURI":"/metrics","verb":"get","user":{"username":"system:serviceaccount:openshift-monitoring:prometheus-k8s","uid":"825b60a0-3976-4861-a342-3b2b561e8f82","groups":["system:serviceaccounts","system:serviceaccounts:openshift-monitoring","system:authenticated"]},"sourceIPs":["10.129.2.6"],"userAgent":"Prometheus/2.23.0","responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2021-03-08T18:02:04.086545Z","stageTimestamp":"2021-03-08T18:02:04.107102Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"prometheus-k8s\" of ClusterRole \"prometheus-k8s\" to ServiceAccount \"prometheus-k8s/openshift-monitoring\""}}
Kubernetes API サーバーの監査ログを表示します。
各コントロールプレーンノードで利用可能な Kubernetes API 監査サーバーログをリスト表示します。
$ oc adm node-logs --role=master --path=kube-apiserver/
出力例
ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit-2021-03-09T14-07-27.129.log ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit.log ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit-2021-03-09T19-24-22.620.log ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit.log ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit-2021-03-09T18-37-07.511.log ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit.log
ノード名とログ名を指定して、特定の Kubernetes API 監査サーバーログを表示します。
$ oc adm node-logs <node_name> --path=kube-apiserver/<log_name>
以下に例を示します。
$ oc adm node-logs ci-ln-m0wpfjb-f76d1-vnb5x-master-0 --path=kube-apiserver/audit-2021-03-09T14-07-27.129.log
出力例
{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"cfce8a0b-b5f5-4365-8c9f-79c1227d10f9","stage":"ResponseComplete","requestURI":"/api/v1/namespaces/openshift-kube-scheduler/serviceaccounts/openshift-kube-scheduler-sa","verb":"get","user":{"username":"system:serviceaccount:openshift-kube-scheduler-operator:openshift-kube-scheduler-operator","uid":"2574b041-f3c8-44e6-a057-baef7aa81516","groups":["system:serviceaccounts","system:serviceaccounts:openshift-kube-scheduler-operator","system:authenticated"]},"sourceIPs":["10.128.0.8"],"userAgent":"cluster-kube-scheduler-operator/v0.0.0 (linux/amd64) kubernetes/$Format","objectRef":{"resource":"serviceaccounts","namespace":"openshift-kube-scheduler","name":"openshift-kube-scheduler-sa","apiVersion":"v1"},"responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2021-03-08T18:06:42.512619Z","stageTimestamp":"2021-03-08T18:06:42.516145Z","annotations":{"authentication.k8s.io/legacy-token":"system:serviceaccount:openshift-kube-scheduler-operator:openshift-kube-scheduler-operator","authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"system:openshift:operator:cluster-kube-scheduler-operator\" of ClusterRole \"cluster-admin\" to ServiceAccount \"openshift-kube-scheduler-operator/openshift-kube-scheduler-operator\""}}
OpenShift OAuth API サーバーの監査ログを表示します。
各コントロールプレーンノードで利用可能な OpenShift OAuth API 監査サーバーログをリスト表示します。
$ oc adm node-logs --role=master --path=oauth-apiserver/
出力例
ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit-2021-03-09T13-06-26.128.log ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit.log ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit-2021-03-09T18-23-21.619.log ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit.log ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit-2021-03-09T17-36-06.510.log ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit.log
ノード名とログ名を指定して、特定の OpenShift OAuth API 監査サーバーログを表示します。
$ oc adm node-logs <node_name> --path=oauth-apiserver/<log_name>
以下に例を示します。
$ oc adm node-logs ci-ln-m0wpfjb-f76d1-vnb5x-master-0 --path=oauth-apiserver/audit-2021-03-09T13-06-26.128.log
出力例
{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"dd4c44e2-3ea1-4830-9ab7-c91a5f1388d6","stage":"ResponseComplete","requestURI":"/apis/user.openshift.io/v1/users/~","verb":"get","user":{"username":"system:serviceaccount:openshift-monitoring:prometheus-k8s","groups":["system:serviceaccounts","system:serviceaccounts:openshift-monitoring","system:authenticated"]},"sourceIPs":["10.0.32.4","10.128.0.1"],"userAgent":"dockerregistry/v0.0.0 (linux/amd64) kubernetes/$Format","objectRef":{"resource":"users","name":"~","apiGroup":"user.openshift.io","apiVersion":"v1"},"responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2021-03-08T17:47:43.653187Z","stageTimestamp":"2021-03-08T17:47:43.660187Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"basic-users\" of ClusterRole \"basic-user\" to Group \"system:authenticated\""}}
OpenShift OAuth サーバーの監査ログを表示します。
各コントロールプレーンノードで利用可能な OpenShift OAuth サーバーログをリスト表示します。
$ oc adm node-logs --role=master --path=oauth-server/
出力例
ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit-2022-05-11T18-57-32.395.log ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit.log ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit-2022-05-11T19-07-07.021.log ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit.log ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit-2022-05-11T19-06-51.844.log ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit.log
ノード名とログ名を指定して、特定の OpenShift OAuth サーバーログを表示します。
$ oc adm node-logs <node_name> --path=oauth-server/<log_name>
以下に例を示します。
$ oc adm node-logs ci-ln-m0wpfjb-f76d1-vnb5x-master-0 --path=oauth-server/audit-2022-05-11T18-57-32.395.log
出力例
{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"13c20345-f33b-4b7d-b3b6-e7793f805621","stage":"ResponseComplete","requestURI":"/login","verb":"post","user":{"username":"system:anonymous","groups":["system:unauthenticated"]},"sourceIPs":["10.128.2.6"],"userAgent":"Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0","responseStatus":{"metadata":{},"code":302},"requestReceivedTimestamp":"2022-05-11T17:31:16.280155Z","stageTimestamp":"2022-05-11T17:31:16.297083Z","annotations":{"authentication.openshift.io/decision":"error","authentication.openshift.io/username":"kubeadmin","authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":""}}
authentication.openshift.io/decision
アノテーションに使用できる値は、allow
、deny
、またはerror
です。
1.3. 監査ログのフィルター
jq
または別の JSON 解析ツールを使用して、API サーバー監査ログをフィルターできます。
API サーバー監査ログに記録する情報量は、設定される監査ログポリシーで制御できます。
以下の手順では、jq
を使用してコントロールプレーンノード node-1.example.com
で監査ログをフィルターする例を示します。jq
の使用に関する詳細は、jq Manual を参照してください。
前提条件
-
dedicated-admin
ロールを持つユーザーとしてクラスターにアクセスできる。 -
jq
がインストールされている。
手順
OpenShift API サーバー監査ログをユーザーでフィルターします。
$ oc adm node-logs node-1.example.com \ --path=openshift-apiserver/audit.log \ | jq 'select(.user.username == "myusername")'
OpenShift API サーバー監査ログをユーザーエージェントでフィルターします。
$ oc adm node-logs node-1.example.com \ --path=openshift-apiserver/audit.log \ | jq 'select(.userAgent == "cluster-version-operator/v0.0.0 (linux/amd64) kubernetes/$Format")'
Kubernetes API サーバー監査ログを特定の API バージョンでフィルターし、ユーザーエージェントのみを出力します。
$ oc adm node-logs node-1.example.com \ --path=kube-apiserver/audit.log \ | jq 'select(.requestURI | startswith("/apis/apiextensions.k8s.io/v1beta1")) | .userAgent'
動詞を除外して OpenShift OAuth API サーバー監査ログをフィルターします。
$ oc adm node-logs node-1.example.com \ --path=oauth-apiserver/audit.log \ | jq 'select(.verb != "get")'
ユーザー名を識別し、エラーで失敗したイベントで OpenShift OAuth サーバー監査ログをフィルタリングします。
$ oc adm node-logs node-1.example.com \ --path=oauth-server/audit.log \ | jq 'select(.annotations["authentication.openshift.io/username"] != null and .annotations["authentication.openshift.io/decision"] == "error")'
1.4. 監査ログの収集
must-gather ツールを使用して、クラスターをデバッグするための監査ログを収集できます。このログは、確認したり、Red Hat サポートに送信したりできます。
手順
-- /usr/bin/gather_audit_logs
を指定してoc adm must-gather
コマンドを実行します。$ oc adm must-gather -- /usr/bin/gather_audit_logs
作業ディレクトリーに作成された
must-gather
ディレクトリーから圧縮ファイルを作成します。たとえば、Linux オペレーティングシステムを使用するコンピューターで以下のコマンドを実行します。$ tar cvaf must-gather.tar.gz must-gather.local.472290403699006248 1
- 1
must-gather-local.472290403699006248
は、実際のディレクトリー名に置き換えます。
- Red Hat カスタマーポータルの カスタマーサポート ページ で、圧縮ファイルをサポートケースに添付します。
1.5. 関連情報
第2章 IP ベースの AWS ロールを引き受けるための追加制約を追加する
AWS アカウントに追加のセキュリティーレイヤーを実装して、許可リストに登録されていない IP アドレスからロールを引き受けないようにできます。
2.1. アイデンティティベースの IAM ポリシーを作成する
Red Hat が提供する IP 以外の IP アドレスから要求が発信された場合に、すべての AWS アクションへのアクセスを拒否する、アイデンティティベースの Identity and Access Management (IAM) ポリシーを作成できます。
前提条件
- IAM ポリシーの作成および変更に必要な権限を持ち、AWS Management Console にアクセスできる。
手順
- AWS アカウントの認証情報を使用して AWS マネジメントコンソールにサインインします。
- IAM サービスに移動します。
- IAM コンソールで、左側のナビゲーションメニューから Policies を選択します。
- Create policy をクリックします。
- JSON タブを選択して、JSON 形式を使用してポリシーを定義します。
JSON ポリシードキュメントに入力する必要がある IP アドレスを取得するには、次のコマンドを実行します。
$ ocm get /api/clusters_mgmt/v1/trusted_ip_addresses
注記これらの IP アドレスは永続的なものではなく、変更される可能性があります。API 出力を継続的に確認し、JSON ポリシードキュメントで必要な更新を行う必要があります。
次の
policy_document.json
ファイルをコピーし、エディターに貼り付けます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NotIpAddress": { "aws:SourceIp": [] }, "Bool": { "aws:ViaAWSService": "false" } } } ] }
-
手順 6 で取得したすべての IP アドレスをコピーし、
policy_document.json
ファイルの"aws:SourceIp": []
配列に貼り付けます。 - Review and create をクリックします。
- ポリシーの名前と説明を入力し、詳細が正確であることを確認します。
- Create policy をクリックしてポリシーを保存します。
最初の呼び出しに基づいて後続の呼び出しが成功するためには、条件キー aws:ViaAWSService
を false に設定する必要があります。たとえば、aws ec2 describe-instances
への初回呼び出し時に条件キー aws:ViaAWSService
が false に設定されていない場合は、ec2 インスタンスにアタッチされている EBS ボリュームに関する情報を取得するために AWS API サーバー内で実行される後続の呼び出しはすべて失敗します。後続の呼び出しは、AllowList に含まれない AWS IP アドレスから発信されるため、失敗します。
2.2. アイデンティティベースの IAM ポリシーのアタッチ
アイデンティティベースの IAM ポリシーを作成したら、それを AWS アカウント内の関連する IAM ユーザー、グループ、またはロールにアタッチして、これらのエンティティーが IP ベースのロールを引き受けないようにします。
手順
- AWS マネジメントコンソールの IAM コンソールに移動します。
ポリシーのアタッチ先となるデフォルトの IAM
ManagedOpenShift-Support-Role
ロールを選択します。注記デフォルトの IAM
ManagedOpenShift-Support-Role
ロールは変更できます。ロールの詳細は、Red Hat サポートのアクセス を参照してください。- Permissions タブで、Add Permissions ドロップダウンリストから Add Permissions または Create inline policy を選択します。
以下を実行して、作成したポリシーを検索します。
- ポリシー名を入力します。
- 適切なカテゴリーでフィルタリングします。
- ポリシーを選択し、Attach policy をクリックします。
IP ベースのロールの引き受けを効果的に防止するには、許可リストに登録された IP を最新の状態に保つ必要があります。これを行わないと、Red Hat Site Reliability Engineer (SRE) がアカウントにアクセスできなくなり、SLA に影響を与える可能性があります。さらにご質問がある場合、またはサポートが必要な場合は、サポートチームにお問い合わせください。
2.3. 関連情報
- ソース IP に基づきアクセスを拒否する方法の詳細は、AWS ドキュメントの AWS: Denies access to AWS based on the source IP を参照してください。
Legal Notice
Copyright © 2024 Red Hat, Inc.
OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).
Modified versions must remove all Red Hat trademarks.
Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.