メインコンテンツまでスキップ

ポリシー

DoiT プラットフォーム上でリソースベースのポリシーを作成し、CloudFlow などの他の DoiT 機能で利用できます。

注意

現在、ポリシーは CloudFlow でのみ使用できます。

ポリシーは、特定のタイプのリソース(例:仮想マシンやストレージバケット)のコンプライアンスを検証するために設計された一連のルールです。単体のシンプルなルール(ストレージバケットは暗号化されている必要がある)にも、複数のルールの集合(ストレージバケットは暗号化され、特定のタグが付与されている必要がある)にもできます。ポリシーは Rego で記述します。単一のポリシーは複数の DoiT 機能で再利用でき、管理を簡素化し、ポリシーの変更が使用先のすべての DoiT 機能に自動的に反映されます。

Rego

ポリシーは Rego v1 language specification を使用して作成します。セキュリティと運用の整合性のため、当社プラットフォームは標準の Rego 言語のすべての機能をサポートしているわけではありません。

非対応の機能

import ステートメントには対応していません。すべてのポリシーロジックはポリシーのコードブロック内に自己完結させる必要があります。これにより、ポリシーが単一の監査可能な単位として維持され、外部依存関係を防止します。

非対応のビルトイン関数

次のビルトイン関数には対応していません。

  • ■ ネットワークアクセス

    • http.send:ポリシーからの不正な HTTP リクエストを防ぎ、データ流出のリスクを軽減するために無効化されています。

    • net.lookup_ip_addr:情報漏えいに悪用される可能性のある DNS ルックアップを防ぐために無効化されています。

  • ■ 実行時情報へのアクセス

    • opa.runtime:機密データを含む可能性がある Open Policy Agent(OPA)のランタイム設定や環境変数へのアクセスを防ぐために無効化されています。
  • ■ デバッグ

    • print:コンソール出力への機密データの漏えいを防ぐために無効化されています。

    • trace:潜在的な情報漏えいを防ぐために無効化されています。

  • ■ 外部データアクセス

    • external_data:ポリシーが外部データプロバイダへクエリすることを防ぎ、明示的に提供されたデータのみに対して動作することを保証するために無効化されています。

EC2 セキュリティパッケージの例

以下は Rego で記述されたポリシーの例で、使用できるさまざまな構文とルール構造を示しています。このポリシーは、提案された変更が必須かつ高リスクのセキュリティ要件 3 つに違反する場合、Terraform のデプロイを拒否します。ポリシーは次を確認します。

  • 暗号化が有効になっていない単体の aws_ebs_volume リソースが作成されていないこと。

  • EC2 インスタンスに暗号化されていないルートブロックまたは EBS ブロックデバイスがないこと。

  • 高度に機密なポートをパブリックインターネットに公開するセキュリティグループがないこと。

package aws.security

# --- Configuration ---
# Admin ports to keep closed to the world
admin_ports := {22, 3389}

# --- Main Decision Rule ---
default allow := false

# Allow if all required conditions are met
allow if {
not exists_unencrypted_ebs_volume # 1) No standalone EBS volume is unencrypted
not exists_instance_with_unencrypted_blocks # 2) No EC2 instance has unencrypted root/ebs devices
not exists_sg_world_open_admin # 3) No SG exposes admin ports to 0.0.0.0/0
}

# --- Violation Predicates (positive existence checks) ---

# 1) There exists an unencrypted standalone EBS volume
exists_unencrypted_ebs_volume if {
some rc in input.resource_changes
startswith(rc.provider_name, "registry.terraform.io/hashicorp/aws")
rc.change.after != null
rc.type == "aws_ebs_volume"
not rc.change.after.encrypted
}

# 2a) There exists an EC2 instance with an unencrypted ROOT volume
exists_instance_with_unencrypted_blocks if {
some rc in input.resource_changes
startswith(rc.provider_name, "registry.terraform.io/hashicorp/aws")
rc.change.after != null
rc.type == "aws_instance"
a := rc.change.after
root_unencrypted(a)
}

# 2b) There exists an EC2 instance with any unencrypted ATTACHED EBS device
exists_instance_with_unencrypted_blocks if {
some rc in input.resource_changes
startswith(rc.provider_name, "registry.terraform.io/hashicorp/aws")
rc.change.after != null
rc.type == "aws_instance"
a := rc.change.after
attached_unencrypted(a)
}

# 3) There exists a security group exposing an admin port to 0.0.0.0/0
exists_sg_world_open_admin if {
some rc in input.resource_changes
startswith(rc.provider_name, "registry.terraform.io/hashicorp/aws")
rc.change.after != null
rc.type == "aws_security_group"
some ing in object.get(rc.change.after, "ingress", [])
some cidr in object.get(ing, "cidr_blocks", [])
cidr == "0.0.0.0/0"
p := object.get(ing, "from_port", null)
p == object.get(ing, "to_port", null)
p != null
p in admin_ports
}

# --- Helper Functions ---

# Root block device is present and NOT encrypted
root_unencrypted(a) if {
rb := object.get(a, "root_block_device", null)
rb != null
not rb.encrypted
}

# Any attached EBS block device is NOT encrypted
attached_unencrypted(a) if {
blks := object.get(a, "ebs_block_device", [])
some blk in blks
not blk.encrypted
}

必要な権限

  • ポリシーを作成するには、CloudFlow Editor または CloudFlow Manager の権限が必要です。

  • ポリシーを編集または削除するには、次のいずれかが必要です。

    • すべてのポリシーにアクセスできる CloudFlow Manager 権限を持っている。

    • ポリシーのオーナーであるか、共同編集者として割り当てられている。この場合、CloudFlow Editor 権限が必要です。

ポリシーを作成する

ポリシーは、DoiT のいずれの機能で使用を開始する前に作成しておく必要があります。

  1. DoiT コンソール にサインインし、上部のナビゲーションバーから Operate を選択し、Policies を選択します。

  2. Create policy を選択します。Create a new policy ウィンドウが表示されます。

  3. Policy name に、ポリシーの用途に合った名前(例:S3 Multipart Upload Cleanup Policy)を入力します。

  4. (任意)Description に、ポリシーの説明を入力します。

  5. (任意)Collaborators で、このポリシーを共有したいユーザーのメールアドレスを選択します。

  6. Create your policy using the Rego language に、ポリシーのルールを定義する Rego コードを入力します。ポリシーコードは、ポリシーの作成時にコンパイルされます。エラーが見つかった場合、ポリシーは保存されません。

  7. Create を選択します。

ポリシーを追加する

ポリシーを作成したら、DoiT の機能でそのポリシーを使用開始できます。

CloudFlow にポリシーを追加する

ポリシーを CloudFlow 内のノードとして追加 して、そのポリシーに対してリソースを自動的にチェックできます。たとえば、すべての S3 バケットに未完了のマルチパートアップロードをクリーンアップするための必要なライフサイクルポリシーが設定されているかを、定期的なスケジュールで確認する CloudFlow を構成できます。各バケットに対して、フローはポリシーを適用して S3 バケットがルールに一致しているかを確認し、一致しない場合はアクションを実行します。

ポリシーを編集する

ポリシーはいつでも編集できます。ポリシーの最新バージョンは、DoiT プラットフォーム内で参照されているすべての場所で自動的に使用されます。

  1. DoiT コンソール にサインインし、上部のナビゲーションバーから Operate を選択し、Policies を選択します。

  2. 編集したいポリシーを選択します。Edit policy ウィンドウが表示されます。

  3. ポリシーを更新し、変更を保存します。

ポリシーを削除する

ポリシーのオーナーであるか、CloudFlow Manager 権限を持っている場合、ポリシーを削除できます。

前提条件

ポリシーが現在プラットフォーム上のいずれかの機能で使用されている場合、そのポリシーは削除できません。削除したいポリシーを参照しているすべての機能から、そのポリシーを削除する必要があります。

ポリシーを削除する

ポリシーが使用されていないことを確認したら、次を実行します。

  1. DoiT コンソール にサインインし、上部のナビゲーションバーから Operate を選択し、Policies を選択します。

  2. 編集したいポリシーの最右端にあるケバブメニュー()を選択し、Delete を選択します。