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

ポリシー

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

注意

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

ポリシーは、特定の種類のリソース(例:仮想マシンやストレージ bucket)のコンプライアンスを検証するためのルールの集合です。単一の独立したルール(ストレージ bucket は暗号化されている必要がある)である場合もあれば、複数のルールの集合(ストレージ bucket は暗号化され、特定のタグを持っている必要がある)の場合もあります。ポリシーは 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 bucket に、不完全なマルチパートアップロードをクリーンアップするための必要なライフサイクルポリシーが設定されていることを、定期的に確認する CloudFlow を作成できます。各 bucket について、フローはポリシーを適用して S3 bucket がルールに一致しているかを確認し、一致していない場合には確認・対応します。

ポリシーを編集する

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

  1. ポリシー開きます。

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

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

ポリシーを削除する

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

前提条件

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

ポリシーを削除する

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

  1. ポリシー開きます。

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