6.4. カスタムポリシーの作成
デフォルトのポリシーを使用することに加えて、Red Hat Advanced Cluster Security for Kubernetes でカスタムポリシーを作成することもできます。
新しいポリシーを構築するには、既存のポリシーのクローンを作成するか、ゼロから新規ポリシーを作成します。
- RHACS ポータルの Risk ビューのフィルター条件をもとにポリシーを作成することもできます。
-
また、ポリシー条件に論理演算子ではなく
AND
、OR
およびNOT
を使用して高度なポリシーを作成することもできます。
6.4.1. システムポリシービューからのセキュリティーポリシーの作成
システムポリシービューから新しいセキュリティーポリシーを作成できます。
手順
-
RHACS ポータルで、Platform Configuration
Policy Management に移動します。 - Create policy をクリックします。
Policy details セクションに、ポリシーに関する以下の情報を入力します。
- ポリシーの Name を入力します。
オプション: Attach notifiers セクションの下にある利用可能な Notifier から選択して、通知機能 をポリシーに割り当てることもできます。
注記アラートを転送する前に、RHACS を Webhook、Jira、PagerDuty、Splunk などの通知プロバイダーと統合する必要があります。
-
このポリシーの 重大度 レベルを選択します (
Critical
、High
、Medium
、またはLow
のいずれか)。 - このポリシーに適用するポリシーの Categories を選択します。カテゴリーの作成に関する詳細は、このドキュメントの後半でポリシーカテゴリーの作成および管理を参照してください。
- Description フィールドに、ポリシーの詳細を入力します。
- Rationale フィールドにポリシーが存在する理由についての説明を入力します。
- Guidance フィールドでこのポリシーの違反を解決するための手順を入力します。
オプション: MITRE ATT&CK セクションで、ポリシーに指定する tactics and the techniques を選択します。
- Add tactic をクリックし、ドロップダウンリストから調整を選択します。
- Add technique をクリックして、選択した戦略の手法を追加します。戦略には、複数の手法を指定できます。
- Next をクリックします。
Policy behavior セクションで、次の手順を実行します。
ポリシーが適用される Lifecycle stages ( Build、Deploy、または Runtime )を選択します。複数のステージを選択できます。
- ビルド時ポリシーは、CVE や Dockerfile 手順などのイメージフィールドに適用されます。
- デプロイ時のポリシーにはすべてのビルドタイムポリシー条件を含めることができますが、特権モードで実行したり、Docker ソケットをマウントするなど、クラスター設定からのデータを含めることもできます。
- ランタイムポリシーには、すべてのビルド時およびデプロイ時のポリシー条件を含めることができますが、ランタイム時のプロセス実行に関するデータを含めることもできます。
オプション: Runtime lifecycle stage を選択した場合は、以下の Event sources のいずれかを選択します。
- Deployment: イベントソースにプロセスとネットワークアクティビティー、Pod 実行、および Pod ポート転送が含まれている場合に、RHACS はポリシー違反をトリガーします。
- イベントソースが Kubernetes 監査ログレコードと一致すると、RHACS はポリシー違反をトリガーします。
Response method には、次のいずれかのオプションを選択します。
- Inform: 違反の一覧に違反を追加する。
- inform および enforce: アクションを実施します。
オプション: Inform and enforce を選択した場合は、Configure enforcement behavior で、各ライフサイクルのトグルを使用してポリシーの適用動作を選択します。Lifecycle stages の設定時に選択したステージでのみ使用できます。適用の振る舞いは、ライフサイクルの各ステージで異なります。
- Build - イメージがポリシーの基準と一致すると、RHACS は継続的インテグレーション (CI) ビルドに失敗します。
- Deploy - RHACS は、ポリシーの条件に一致するデプロイメントの作成をブロックします。アドミッションコントローラーが適用されているクラスターでは、Kubernetes または OpenShift Container Platform サーバーがすべての非準拠のデプロイメントをブロックします。他のクラスターでは、RHACS は準拠していないデプロイメントを編集して、Pod がスケジュールされないようにします。
runtime - Pod のイベントがポリシーの基準と一致すると、RHACS はすべての Pod を削除します。
警告ポリシーの適用は、実行中のアプリケーションまたは開発プロセスに影響を与える可能性があります。適用オプションを有効にする前に、すべての利害関係者に通知し、自動適用アクションに対応する方法を計画してください。
- Next をクリックします。
Policy criteria セクションで、ポリシーをトリガーする属性を設定します。
Policy Section にポリシーフィールドをクリックしてドラッグし、基準を追加します。
注記利用可能なポリシーフィールドは、ポリシーに選択したライフサイクルステージによって異なります。たとえば、
Kubernetes access policies
またはNetworking
下の基準は、ランタイムライフサイクルのポリシーを作成するときに利用できますが、ビルドライフサイクルのポリシーを作成する場合は利用できません。基準と利用可能なライフサイクルフェーズに関する情報など、ポリシー基準の詳細は、関連情報セクションのポリシー基準を参照してください。-
オプション: Add condition をクリックして、ポリシーをトリガーする追加の基準を含むポリシーセクションを追加します (たとえば、古いイメージに対してトリガーするには、
image tag
がlatest
はないことやimage age
を設定し、イメージがビルドされてからの最小日数を指定できます)。
- Next をクリックします。
Policy scope セクションで、以下を設定します。
- Add inclusion scope をクリックして、Restrict by scope を使用し、特定のクラスター、namespace、またはラベルだけに、このポリシーを有効にします。複数のスコープを追加したり、namespaces とラベルの RE2 Syntax で正規表現を使用したりすることもできます。
- Add exclusion scope をクリックして Exclude by scope を使用し、指定するデプロイメント、クラスター、名前空間、およびラベルを除外します。ポリシーは、選択したエンティティーには適用されません。複数のスコープを追加したり、namespaces とラベルの RE2 Syntax で正規表現を使用したりすることもできます。ただし、デプロイメントの選択に正規表現を使用することはできません。
Excluded Images (Build Lifecycle only) の場合は、違反をトリガーしないすべてのイメージを選択します。
注記Excluded Images 設定は、build ライフサイクルステージで継続的インテグレーションシステムでイメージを確認する場合にのみ適用されます。このポリシーを使用して、実行中のデプロイメント (Deploy ライフサイクルステージ) またはランタイムアクティビティー (Runtime ライフサイクルステージ) をチェックする場合、効果はありません。
- Next をクリックします。
- Review policy セクションで、ポリシー違反をプレビューします。
- Save をクリックします。
関連情報
6.4.2. リスクビューからのセキュリティーポリシーの作成
リスク ビューで展開のリスクを評価しているときに、ローカルページフィルタリングを適用すると、使用しているフィルタリング条件をもとに新しいセキュリティーポリシーを作成できます。
手順
- RHACS ポータルに移動し、ナビゲーションメニューから Risk を選択します。
- ポリシーを作成するローカルページのフィルタリング条件を適用します。
- New Policy を選択し、必須フィールドに入力して新規ポリシーを作成します。
6.4.3. ポリシー条件
Policy criteria セクションで、ポリシーをトリガーするデータを設定できます。
以下の表に記載されている属性に基づいてポリシーを設定できます。
この表では、以下のようになります。
正規表現、AND、OR、および NOT 列は、特定の属性とともに正規表現およびその他の論理演算子を使用できるかどうかを示します。
-
Regex の
!
(正規表現) は、リストされたフィールドに正規表現のみを使用できることを示します。 -
AND の
!
、または OR は、属性に前述の論理演算子のみを使用できることを示します。 - 正規表現 の ✕ / NOT / AND、OR 列は、属性がこれらのいずれもサポートしていないことを示します (正規表現、否定、論理演算子)。
-
Regex の
- RHACS バージョン 列は、属性を使用する必要がある Red Hat Advanced Cluster Security for Kubernetes のバージョンを示します。
論理組み合わせ演算子の
AND
およびOR
は、以下の属性には使用できません。-
ブール値:
true
およびfalse
最小値セマンティクス。たとえば、以下のようになります。
- 最小 RBAC パーミッション
- イメージ作成からの日数
-
ブール値:
NOT
論理演算子は、以下の属性に使用できません。-
ブール値:
true
およびfalse
-
<
、>
、<=
、>=
演算子など、比較をすでに使用している数値。 複数の値を指定できる複合条件。たとえば、以下のようになります。
- Dockerfile 行。命令と引数の両方が含まれます。
- 環境変数。名前と値の両方で設定されます。
- Add Capabilities、Drop Capabilities、Days since image was created、Days since image was last scanned などの他の意味。
-
ブール値:
属性 | 説明 | JSON 属性 | 許可される値 | Regex、NOT、AND、OR | フェーズ |
---|---|---|---|---|---|
セクション: イメージレジストリー | |||||
Image Registry | イメージレジストリーの名前。 | Image Registry | String |
正規表現、 |
Build、 |
Image Name |
| Image Remote | String |
正規表現、 |
Build、 |
Image Tag | イメージの識別子。 | Image Tag | String |
正規表現、 |
Build、 |
Image Signature | イメージの署名を検証するために使用できる署名統合のリスト。署名がないか、提供された署名統合の少なくとも 1 つによって署名が検証できないイメージに関するアラートを作成します。 | Image Signature Verified By | すでに設定されているイメージ署名統合の有効な ID |
! |
Build、 |
セクション:イメージの内容 | |||||
イメージの経過時間 | イメージの作成日からの最小日数。 | イメージの経過時間 | Integer | ✕ |
Build、 |
イメージのスキャン期間 | イメージが最後にスキャンされた後の最小日数。 | イメージのスキャン期間 | Integer | ✕ |
Build、 |
Image User | Dockerfile の USER ディレクティブと一致します。詳細は、https://docs.docker.com/engine/reference/builder/#user を参照してください。 | Image User | String |
正規表現、 |
Build、 |
Dockerfile Line | 命令と引数の両方を含む、Dockerfile の特定の行。 | Dockerfile Line | LABEL、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD のいずれか |
!値 (AND、OR) の 正規表現 のみ |
Build、 |
イメージのスキャンステータス | イメージがスキャンされたかどうかを確認します。 | スキャンされていないイメージ | Boolean | ✕ |
Build、 |
CVSS |
Common Vulnerability Scoring System は、スコアが | CVSS |
<、>、<=、>=、または何もなし (等しいことを意味します)
例: | AND, OR |
Build、 |
重大度 | CVSS またはベンダーに基づく脆弱性の重大度。Low、Moderate、Important、Critical のいずれかです。 | 重大度 |
<、>、⇐、>=、または何もなし (等しいことを意味します)
例: | AND, OR |
Build、 |
Fixed By | イメージのフラグ付きの脆弱性を修正するパッケージのバージョン文字列。この基準は、CVE 基準などを使用して脆弱性を特定する他の基準に加えて使用される場合があります。 | Fixed By | String |
正規表現、 |
Build、 |
CVE | Common Vulnerabilities and Exposures。特定の CVE 番号で使用。 | CVE | String |
正規表現、 |
Build、 |
Image Component | イメージに存在する特定のソフトウェアコンポーネントの名前とバージョン番号。 | Image Component |
key=value
value はオプションです。 値が見つからない場合は、"key=" の形式にする必要があります。 |
正規表現、 |
Build、 |
Image OS |
イメージのベースオペレーティングシステムの名前およびバージョン番号。たとえば、 | Image OS | String |
正規表現、 |
Build、 |
イメージラベルが必要 |
Docker イメージラベルが存在することを確認します。このポリシーは、デプロイメントのイメージに指定されたラベルがない場合にトリガーされます。キーおよび値フィールドの両方に正規表現を使用して、ラベルを照合できます。 | Required Image Label |
key=value
value はオプションです。 値が見つからない場合は、"key=" の形式にする必要があります。 |
正規表現、 |
Build、 |
許可されていないイメージラベル | 特定の Docker イメージラベルが使用されていないことを確認します。このポリシーは、デプロイメントのイメージに指定されたラベルがある場合にトリガーされます。キーおよび値フィールドの両方に正規表現を使用して、ラベルを照合できます。Disallow Image Label ポリシー条件は、Docker レジストリーと統合する場合にのみ適用されます。Docker ラベルの詳細は、Docker のドキュメント(https://docs.docker.com/config/labels-custom-metadata/) を参照してください。 | Disallowed Image Label |
key=value
value はオプションです。 値が見つからない場合は、"key=" の形式にする必要があります。 |
正規表現、 |
Build、 |
セクション: コンテナー設定 | |||||
環境変数 | 名前または値で環境変数を確認します。 | 環境変数 |
RAW=key=value は、特定のキーと値を使用してデプロイメント設定で直接指定された環境変数と一致します。 環境変数が設定で直接定義されていない場合は、SOURCE=KEY 形式を使用できます。SOURCE は SECRET_KEY、CONFIG_MAP_KEY、FIELD、または RESOURCE_FIELD のいずれかです。この場合、基準はキーにのみ一致でき、値には一致できません。 |
!キーと値の正規表現 (RAW を使用している場合) |
Deploy、 |
Container CPU Request | 特定のリソース用に予約されているコア数を確認します。 | Container CPU Request |
<、>、⇐、>=、または何もなし (等しいことを意味します)
例: | AND, OR |
Deploy、 |
Container CPU Limit | リソースが使用できるコアの最大数を確認します。 | Container CPU Limit | (コンテナーの CPU 要求と同じ) | AND, OR |
Deploy、 |
Container Memory Request | 特定のリソース用に予約されているメモリー量を確認します。 | Container Memory Request | (コンテナーの CPU 要求と同じ) | AND, OR |
Deploy、 |
Container Memory Limit | リソースが使用できるメモリーの最大量を確認します。 | Container Memory Limit | (コンテナーの CPU 要求と同じ) | AND, OR |
Deploy、 |
Privileged container | 特権付きの実行デプロイメント。 | Privileged Container | Boolean | ✕ |
Deploy、 |
Root filesystem writeability | root ファイルシステムで読み取り専用として設定したコンテナー。 | Read-Only Root Filesystem | Boolean | ✕ |
Deploy、 |
Seccomp Profile Type | コンテナーに対して許可される seccomp プロファイルのタイプ。 | Seccomp Profile Type |
以下のいずれかになります。
UNCONFINED | ✕ |
Deploy、 |
Privilege escalation | コンテナープロセスで親プロセスよりも多くの権限を取得できるように設定された場合に、アラートを出します。 | Allow Privilege Escalation | Boolean | ✕ |
Deploy、 |
Drop Capabilities |
コンテナーからドロップする必要がある Linux 機能。たとえば、 |
Drop Capabilities |
以下のいずれかになります。
AUDIT_CONTROL | AND, OR |
Deploy、 |
Add Capabilities | Raw パケットを送信したり、ファイルパーミッションをオーバーライドする機能など、コンテナーには追加できない Linux 機能。 | Add Capabilities | (ドロップ機能と同じ) | AND, OR |
Deploy、 |
Container Name | コンテナーの名前。 | Container Name | String |
正規表現、 |
Deploy、 |
AppArmor プロファイル | コンテナーで使用されるアプリケーション Armor ("AppArmor")プロファイル。 | AppArmor プロファイル | String |
正規表現、 |
Deploy、 |
Liveness Probe | コンテナーが liveness プローブを定義するかどうか。 | Liveness Probe | Boolean | ✕ |
Deploy、 |
Readiness Probe | コンテナーが readiness プローブを定義するかどうか。 | Readiness Probe | Boolean | ✕ |
Deploy、 |
セクション: デプロイメントメタデータ | |||||
Disallowed Annotation | 指定された環境の Kubernetes リソースには存在できないアノテーション。 | Disallowed Annotation |
key=value
value はオプションです。 値が見つからない場合は、"key=" の形式にする必要があります。 |
正規表現、 |
Deploy、 |
Required Label | Kubernetes で必要なラベルが存在するかどうかを確認します。 | Required Label |
key=value
value はオプションです。 値が見つからない場合は、"key=" の形式にする必要があります。 |
正規表現、 |
Deploy、 |
Required Annotation | Kubernetes に必要なアノテーションの有無を確認します。 | Required Annotation |
key=value
value はオプションです。 値が見つからない場合は、"key=" の形式にする必要があります。 |
正規表現、 |
Deploy、 |
Runtime Class |
デプロイメントの | Runtime Class | String |
正規表現、 |
Deploy、 |
ホストネットワーク |
| ホストネットワーク | Boolean | ✕ |
Deploy、 |
ホスト PID | Process ID (PID) 名前空間がコンテナーとホスト間で分離されているかどうかを確認します。これにより、異なる PID 名前空間内のプロセスが同じ PID を持つことができます。 | ホスト PID | Boolean | ✕ |
Deploy、 |
ホスト IPC | ホスト上の IPC (POSIX/SysV IPC) 名前空間 (名前付き共有メモリーセグメント、セマフォ、メッセージキューを分離) がコンテナーと共有されているかどうかを確認します。 | ホスト IPC | Boolean | ✕ |
Deploy、 |
名前空間 | デプロイメントが属する名前空間の名前。 | 名前空間 | String |
正規表現、 |
Deploy、 |
Replicas | デプロイメントレプリカの数。 | Replicas |
<、>、⇐、>=、または何もなし (等しいことを意味します)
例: |
NOT、 |
Deploy、 |
セクション:ストレージ | |||||
Volume Name | ストレージの名前。 | Volume Name | String |
正規表現、 |
Deploy、 |
Volume Source |
ボリュームがプロビジョニングされるフォームを示します。たとえば、 | Volume Source | String |
正規表現、 |
Deploy、 |
Volume Destination | ボリュームがマウントされるパス。 | Volume Destination | String |
正規表現、 |
Deploy、 |
Volume Type | ボリュームの種別を設定します。 | Volume Type | String |
正規表現、 |
Deploy、 |
マウントされたボリュームの書き込み可能性 | 書き込み可能な状態でマウントされるボリューム。 | 書き込み可能なマウント済みボリューム | Boolean | ✕ |
Deploy、 |
マウントの伝播 |
コンテナーが | マウントの伝播 |
以下のいずれかになります。
NONE |
NOT、 |
Deploy、 |
ホストマウントの書き込み可能性 | リソースが、書き込みパーミッションのあるホストにパスをマウントしている。 | Writable Host Mount | Boolean | ✕ |
Deploy、 |
セクション: ネットワーク | |||||
プロトコル | 公開されるポートによって使用される TCP や UDP などのプロトコル。 | 公開ポートプロトコル | String |
正規表現、 |
Deploy、 |
ポート | デプロイメントによって公開されるポート番号。 | 公開されるポート |
<、>、⇐、>=、または何もなし (等しいことを意味します)
例: |
NOT、 |
Deploy、 |
Exposed Node Port | デプロイメントによって外部に公開されるポート番号。 | Exposed Node Port | (公開ポートと同じ) |
NOT、 |
Deploy、 |
Port Exposure | ロードバランサーやノードポートなど、サービスの公開方法。 | ポートの公開方法 |
以下のいずれかになります。
UNSET |
NOT、 |
Deploy、 |
検出された予期しないネットワークフロー | 検出されたネットワークトラフィックがデプロイメントのネットワークベースラインの一部であるかどうかを確認します。 | 検出された予期しないネットワークフロー | Boolean | ✕ | Runtime ONLY - Network |
Ingress Network Policy | イングレス Kubernetes ネットワークポリシーの有無を確認します。 | Ingress Network Policy がある | Boolean |
正規表現、 |
Deploy、 |
Egress Network Policy | エグレス Kubernetes ネットワークポリシーの有無を確認します。 | Egress Network Policy がある | Boolean |
正規表現、 |
Deploy、 |
セクション: プロセスアクティビティー | |||||
プロセス名 | デプロイメントで実行されるプロセスの名前。 | プロセス名 | String |
正規表現、 | Runtime のみ - プロセス |
Process Ancestor | デプロイメントで実行されるプロセスの親プロセスの名前。 | Process Ancestor | String |
正規表現、 | Runtime のみ - プロセス |
Process Arguments | デプロイメントで実行されるプロセスのコマンド引数。 | Process Arguments | String |
正規表現、 | Runtime のみ - プロセス |
Process UID | デプロイメントで実行されるプロセスの UNIX ユーザー ID。 | Process UID | Integer |
NOT、 | Runtime のみ - プロセス |
Unexpected Process Executed | デプロイメントにあるロックされたプロセスベースラインで、プロセス実行がリスト表示されていないデプロイメントを確認します。 | Unexpected Process Executed | Boolean | ✕ | Runtime のみ - プロセス |
セクション: Kubernetes アクセス | |||||
Service Account | サービスアカウントの名前 | Service Account | String |
正規表現、 |
Deploy、 |
Automount Service Account Token | デプロイメント設定がサービスアカウントトークンを自動的にマウントするかどうかを確認します。 | Automount Service Account Token | Boolean | ✕ |
Deploy、 |
Minimum RBAC Permissions |
デプロイメントの Kubernetes サービスアカウントに、指定のレベル以上 ( | Minimum RBAC Permissions |
以下のいずれかになります。
DEFAULT | NOT |
Deploy、 |
セクション: Kubernetes イベント | |||||
Kubernetes Action |
| Kubernetes Resource |
以下のいずれかになります。
PODS_EXEC |
! | Runtime ONLY - Kubernetes Events |
Kubernetes User Name | リソースにアクセスしたユーザーの名前。 | Kubernetes User Name | ハイフン(-)とコロン(:)のみを含む英数字 |
正規表現、 | Runtime ONLY - Kubernetes Events |
Kubernetes User Group | リソースにアクセスしたユーザーが属するグループの名前。 | Kubernetes User Groups | ハイフン(-)とコロン(:)のみを含む英数字 |
regex | Runtime ONLY - Kubernetes Events |
Kubernetes Resource |
| Kubernetes Resource |
以下のいずれかになります。
SECRETS |
! | Runtime ONLY - Audit Log |
Kubernetes API Verb |
| Kubernetes API Verb |
以下のいずれかになります。
CREATE |
! | Runtime ONLY - Audit Log |
Kubernetes Resource Name | アクセスされた Kubernetes リソースの名前。 | Kubernetes Resource Name | ハイフン(-)とコロン(:)のみを含む英数字 |
正規表現、 | Runtime ONLY - Audit Log |
User Agent |
ユーザーがリソースへのアクセスに使用したユーザーエージェント。例: | User Agent | String |
正規表現、 | Runtime ONLY - Audit Log |
Source IP Address | ユーザーがリソースにアクセスした IP アドレス。 | Source IP Address | IPV4 または IPV6 アドレス |
正規表現、 | Runtime ONLY - Audit Log |
Is Impersonated User | サービスアカウントまたは他のアカウントで権限を偽装ユーザーによって要求が行われたかどうかを確認します。 | Is Impersonated User | Boolean | ✕ | Runtime ONLY - Audit Log |
6.4.3.1. ポリシー条件への論理条件の追加
ドラッグアンドドロップポリシーフィールドパネルを使用して、ポリシー条件に論理条件を指定できます。
前提条件
- Red Hat Advanced Cluster Security for Kubernetes バージョン 3.0.45 以降を使用している。
手順
Policy criteria セクションで、Add a new condition を選択して、新しいポリシーセクションを追加します。
- Edit アイコンをクリックして、ポリシーセクションの名前を変更できます。
- Drag out a policy field セクションには、複数のカテゴリーで利用可能なポリシー条件がリスト表示されます。これらのカテゴリーを展開したり折りたたんだりして、ポリシー条件属性を表示できます。
- policy セクションの Drop a policy field エリアに属性をドラッグします。
選択する属性のタイプに応じて、選択した属性の条件を設定するオプションが異なります。以下に例を示します。
-
ブール値が
Read-Only Root Filesystem
の属性を選択すると、READ-ONLY
オプションおよびWRITABLE
オプションが表示されます。 環境変数
が複合値の属性を選択すると、Key
、Value
、およびValue From
フィールドの値を入力するオプションと、利用可能なオプションの他の値を追加するアイコンが表示されます。- 属性に複数の値を組み合わせるには、Add アイコンをクリックします。
-
ポリシーセクションでリスト表示されている論理演算子
AND
またはOR
をクリックして、AND
演算子とOR
演算子を切り替えることもできます。演算子間の切り替えは、ポリシーセクション内でのみ機能し、2 つの異なるポリシーセクション間では機能しません。
-
ブール値が
-
これらの手順を繰り返して、複数の
AND
およびOR
条件を指定できます。追加した属性の条件を設定したら、Next をクリックしてポリシーの作成を続行します。