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

ポリシー

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

注意

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

ポリシーとは、特定の種類のリソース(例:仮想マシンやストレージバケット)のコンプライアンスを検証するために設計された一連のルールです。単一のスタンドアロンルール(ストレージバケットは暗号化されていなければならない)にも、複数ルールの集合(ストレージバケットは暗号化され、特定のタグを持っていなければならない)にもできます。ポリシーは Rego で記述します。1 つのポリシーは複数の DoiT の機能で再利用でき、管理を簡素化し、1 つのポリシーの変更がそれを使用しているすべての DoiT の機能に自動的に適用されるようにします。

Rego

ポリシーは Rego v1 言語仕様 を使用して作成します。セキュリティと運用の整合性のため、当社プラットフォームは標準の 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 コンソール にサインインし、上部ナビゲーションのメガメニューから ポリシーと ガバナンス を選択し、ポリシー を選択します。

  2. ポリシーを作成 を選択します。新しいポリシーを作成 ウィンドウが表示されます。

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

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

  5. (任意)共同編集者 で、このポリシーを共有するユーザーのメールアドレスを選択します。

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

  7. 作成 を選択します。

ポリシーを追加

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

CloudFlow にポリシーを追加

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

ポリシーを編集

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

  1. DoiT コンソール にサインインし、上部ナビゲーションのメガメニューから ポリシーと ガバナンス を選択し、ポリシー を選択します。

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

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

ポリシーを削除

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

前提条件

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

ポリシーを削除

ポリシーが使用されていないことを確認したら:

  1. DoiT コンソール にサインインし、上部ナビゲーションのメガメニューから ポリシーと ガバナンス を選択し、ポリシー を選択します。

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