ポリシー
プラットフォーム上でリソースベースのポリシーを作成し、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 コンソール にサインインし、次のいずれかを実行してください。
-
上部ナビゲーションのメガメニューから ポリシーと ガバナンス を選択し、ポリシー を選択します。
-
上部ナビゲーションのメガメニューから オートメーション と オペレーション を選択し、CloudFlow を選択します。CloudFlow のサイドバーで 関連機能 の ポリシー を選択します。
ポリシーを作成する
任意の DoiT 機能でポリシーを使用し始める前に、ポリシーを作成しておく必要があります。
-
ポリシー を開きます。
-
ポリシーを作成 を選択します。新しいポリシーを作成 ウィンドウが表示されます。
-
ポリシー名 に、そのポリシーの用途に合った名前を入力します(例:S3 Multipart Upload Cleanup Policy)。
-
(オプション)説明 に、ポリシーの説明を入力します。
-
(オプション)コラボレーター で、このポリシーを共有したいユーザーのメールアドレスを選択します。
-
Rego 言語を使用してポリシーを作成 に、ポ リシーのルールを定義する Rego コードを入力します。ポリシーは作成時にコンパイルされます。エラーが見つかった場合、ポリシーは保存されません。
-
作成 を選択します。
ポリシーを追加する
ポリシーを作成したら、そのポリシーを DoiT 機能で使用し始めることができます。
CloudFlow にポリシーを追加する
CloudFlow 内のノードとしてポリシーを追加し、そのポリシーに対してリソースを自動的にチェックできます。たとえば、すべての S3 bucket に、不完全なマルチパートアップロードをクリーンアップするための必要なライフサイクルポリシーが設定されていることを、定期的に確認する CloudFlow を作成できます。各 bucket について、フローはポリシーを適用して S3 bucket がルールに一致しているかを確認し、一致していない場合には確認・対応します。
ポリシーを編集する
ポリシーはいつでも編集できます。ポリシーの最新バージョンは、プラットフォーム内で参照されているすべての場所で自動的に使用されます。
-
ポリシー を開きます。
-
編集したいポリシーを選択します。ポリシーを編集 ウィンドウが表示されます。
-
ポリシーを更新し、変更を保存します。
ポリシーを削除する
ポリシーの所有者であるか、CloudFlow Manager 権限を持っている場合、そのポリシーを削除できます。
前提条件
プラットフォーム上のいずれかの機能で現在使用されているポリシーは削除できません。削除したいポリシーを参照しているすべての機能から、そのポリシーを削除する必要があります。
ポリシーを削除する
ポリシーがもはや使用されていないことを確認したら、次の操作を行ってください。
-
ポリシー を開きます。
-
削除したいポリシーの一番右端にあるケバブ メニュー(⋮)を選択し、削除 を選択します。