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