メインコンテンツへスキップ

ポリシー

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

注意

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

ポリシーは、特定の種類のリソース(例: 仮想マシンやストレージバケット)のコンプライアンスを検証するために設計された一連のルールです。単一の独立したルール(ストレージバケットは暗号化されていなければならない)である場合もあれば、複数のルールをまとめたもの(ストレージバケットは暗号化されており、特定のタグを持っていなければならない)である場合もあります。ポリシーは Rego で記述します。1 つのポリシーは複数の DoiT 機能で再利用できるため、管理が簡素化され、1 つのポリシーを変更すると、それが使用されているすべての 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. 上部ナビゲーションのメガメニューから ポリシーと ガバナンス を選択し、ポリシー を選択します。

  2. 上部ナビゲーションのメガメニューから オートメーション と オペレーション を選択し、CloudFlow を選択します。CloudFlow のサイドバーで、関連機能ポリシー を選択します。

ポリシーの作成

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

  1. ポリシー開きます。

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

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

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

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

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

  7. 作成 を選択します。

ポリシーの追加

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

CloudFlow へのポリシー追加

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

ポリシーの編集

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

  1. ポリシー開きます。

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

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

ポリシーの削除

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

前提条件

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

ポリシーの削除

ポリシーが使用されていないことを確認したら、次の操作を行ってください。

  1. ポリシー開きます。

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