いろんなポリシーの種類と条件を理解して構築するData perimeters on AWS
こちらは Fusic Advent Calendar 2024 の23日目の記事です!
きっかけ
re:Invent2024で「Data perimeter challenge [REPEAT] 【SEC307-R2】」に参加しました。
こちらのワークショップ(ハンズオン)では、S3へのアクセス制御を行うためData perimeter(データ境界)を構築しました。
ポリシーによるアクセス制御・予防的統制を改めて学ぶことができたので、実際に構築する際に必要となる考え方のベース・参照すべきドキュメントをここにまとめたいと思います。
※この記事はセッションレポートではありません。
re:Inventではなくre:Inforce2024ですが、Data perimeterについてのセッション動画も見つけました。
当記事および参照ドキュメントにおいては、上記re:Inforce時点ではまだなかったRCP = Resource Control Policy(re:Invent2024直前の11/13に発表!)を使用しています。
この記事でできるようになること
S3等に保存しているデータに対して、「誰が」「どこから」アクセスできるかの制御 = データ境界 = Data perimetersを構築するための基礎知識を整理できる。
※ここでいう「組織」とはAWS Organizationsで管理されている範囲を指します。
ここで話すこと
データを保護するためにどのポリシータイプに何を書くか
話さないこと
各ポリシーそのものの深い説明や評価ロジックについて
Data perimeters on AWSとは
[参考]
組織のAWS環境内においてデータを保護するための境界として機能する許可ガードレールのセット。もっと噛み砕いて言うと、ポリシーのセットです。
アクセスできないものを制御するのではなく、 信頼されたアイデンティティのみが、期待されたネットワークから、信頼されたリソースにアクセスする ことを保証します。
既存のリソース単位ではなく、組織全体にSCP(Service Control Policy)・RCP(Resource Control Policy)・VPC endpoint policyを適用し、セキュリティの標準やベストプラクティスに準拠していることを保証します。
AWS Organizationsのポリシー
SCP(Service Control Policy)
IAMロールなど組織内のプリンシパルに付与される許可を制限するもの。
デフォルトでは全てのルートにFullAWSAccess
がアタッチされています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
このように明示的なAllowが適用された上で、制限したい部分(OU・アカウント)にさらにSCPを適用することで組織内のあらゆるアクションを制限します。
[例]
「東京リージョンかつ特定のロール」以外からのS3へのアクセスを全て禁止するSCP
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyS3AccessOutsideSpecifiedRegion",
"Effect": "Deny",
"Action": [
"s3:*"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:RequestedRegion": [
"ap-northeast-1"
]
},
"ArnNotLike": {
"aws:PrincipalARN": [
"arn:aws:iam::*:role/Role1AllowedToBypassThisSCP",
"arn:aws:iam::*:role/Role2AllowedToBypassThisSCP"
]
}
}
}
]
}
[その他の例]
RCP(Resource Control Policy)
組織内のリソースに対するアクセス許可を制限するもの。
2024年11月13日にリリースされました。
デフォルトではAWSリソースは外部プリンシパルからのアクセスを許可しません。
状況に応じて外部からのアクセスを明示的に許可します。この許可の付与をアプリケーション・システム等ごとに柔軟に設定することができます。(=★1)
これに対し、RCPを使用することで組織全体のリソースへのアクセス制御をコントロールできます。
つまり★1のような各アプリケーションごとの設定において適切でないアクセスが誤って許可されるのを防ぐことが可能となり、組織全体でのセキュリティ要件への準拠をコントロールできます。
[例]
リクエストが組織内のプリンシパルからでもなく、AWSサービスからでもない場合、S3 バケットに対するアクセスを禁止するRCP
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnforceOrgIdentities",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"StringNotEqualsIfExists": {
"aws:PrincipalOrgID": "{organizations ID}"
},
"BoolIfExists": {
"aws:PrincipalIsAWSService": "false"
}
}
}
]
}
SCPとRCPの違い
SCPはIAMプリンシパルに付与される許可を制限し、RCPはリソースに付与される許可を制限します。
またSCPは誰(何)がアクセスしているかを評価し、RCPはリソースに対する全てのアクセスを評価します。
制限するもの | いつ評価されるか | |
---|---|---|
SCP | IAMプリンシパルに付与される許可 | IAMプリンシパルによる何らかのアクション発生時 |
RCP | リソースに付与される許可 | リソースへの何らかのアクション発生時 |
共通点として、どちらも許可を付与するものではなくアタッチした組織のルート・OU・アカウントに対して制限を設け、予防的統制を構築します。
VPC endpoint policy
VPCエンドポイントポリシーはVPCエンドポイントにアタッチできるリソースベースのポリシーで、AWSサービス(例: S3やDynamoDB)へのアクセスを制御するために使用されるポリシーです。
特定のVPCエンドポイントを通じて発生するリクエストに基づいてアクセス制御を定義します。
またリクエストがVPCエンドポイントを通過する際に評価されます。
データ境界構築の考え方
概略
No | 信頼する対象 | 保護する対象 | 使うポリシータイプ | 具体例 |
---|---|---|---|---|
① | IAMアイデンティティ | リソース | RCP | S3バケットに対し特定のIAMロールのみPutObjectを許可する |
② | IAMアイデンティティ | ネットワーク | VPC endpoint policy | S3エンドポイントへのアクセスを特定のIAMロールに制限する |
③ | リソース | IAMアイデンティティ | SCP | IAMロールが特定のS3のみ操作できるよう制限する |
④ | リソース | ネットワーク | VPC endpoiny policy | VPCエンドポイント経由でのアクセスを特定のS3のみに制限する |
⑤ | ネットワーク | IAMアイデンティティ | SCP | 特定のVPC外のIAMロールがEC2インスタンスを起動することを禁止する |
⑥ | ネットワーク | リソース | RCP | 特定のVPCエンドポイントからのみRDSに接続を許可する |
上記はこちらのData perimeter control objectives and capabilitiesの表を参考にしています。
使用する条件キーはこちらのドキュメントを参照。
順番がずれますが、具体的なポリシーを以下に示します。
【RCP】①リソースに対するアクセス制限:信頼されたアイデンティティのみ許可
ポリシー内容
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:PrincipalArn": "arn:aws:iam::123456789012:role/TrustedRole"
}
}
}
]
}
使用する条件キーと評価について
aws:PrincipalArn
により、リクエストを実行したプリンシパルが特定のIAMロール (arn:aws:iam::123456789012:role/TrustedRole
)であるか評価。
このRCPがアタッチされた組織において、特定のIAMロール以外からのS3バケットへのPutObjectアクションを禁止する。
【RCP】⑥リソースに対するアクセス制限:信頼されたネットワークからのみ許可
ポリシー内容
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "rds:Connect",
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:SourceVpce": "vpce-1234abcd"
}
}
}
]
}
使用する条件キーと評価について
aws:SourceVpce
により、リクエストが特定のVPCエンドポイント (vpce-1234abcd
) 経由で発生したかを評価。
このRCPがアタッチされた組織において、特定のVPCエンドポイントを経由しないRDSへの接続を禁止する。
【SCP】③アイデンティティに対するアクセス制限:信頼されたリソースへのアクションのみ許可
ポリシー内容
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "s3:*",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:ResourceAccount": "123456789012"
}
}
}
]
}
使用する条件キーと評価について
aws:ResourceAccount
により、リクエスト対象のリソースが特定のAWSアカウント (123456789012
) に属しているかを評価。
このSCPがアタッチされた組織において、特定のアカウント内以外へのS3操作をすべて禁止する。
【SCP】⑤アイデンティティに対するアクセス制限:信頼されたネットワークのみ許可
ポリシー内容
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "*",
"Condition": {
"StringNotEquals": {
"aws:SourceVpc": "vpc-1234abcd"
}
}
}
]
}
使用する条件キーと評価について
aws:SourceVpc
により、リクエスト元のVPCが指定されたVPC (vpc-1234abcd
) と一致するかを評価。(※VPCエンドポイントではない)
このSCPがアタッチされた組織において、特定のVPC以外からのEC2インスタンスの起動を拒否する。
【VPC endpoint policy】②ネットワークに対するアクセス制限:信頼されたアイデンティティのみアクセスを許可
ポリシー内容
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/TrustedRole"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::example-bucket/*"
}
]
}
使用する条件キーと評価について
aws:PrincipalArn
により、アクセスを実行するアイデンティティが特定のIAMロール (arn:aws:iam::123456789012:role/TrustedRole
) と一致するかを評価。
このポリシーがアタッチされたVPCエンドポイントにおいて、あるS3に対して特定のIAMロール以外からのリクエストを拒否します。
【VPC endpoint policy】④ネットワークに対するアクセス制限:信頼されたリソースへのアクセスのみ許可
ポリシー内容
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::example-bucket/*",
"Condition": {
"StringEquals": {
"aws:ResourceAccount": "123456789012"
}
}
}
]
}
使用する条件キーと評価について
aws:ResourceAccount
により、アクセスするS3バケットが特定のAWSアカウント (123456789012
) に属しているかを評価。
このポリシーがアタッチされたVPCエンドポイントにおいて、特定のAWSアカウント内のS3バケットへのリクエストのみを許可します。
まとめ
re:Inventでのハンズオンセッション参加をきっかけに、改めてポリシーの種類と条件キーを整理することができました。
こういった厳密なアクセス制御は適切なポリシータイプの選択と条件の記述によって構築できます。
これは個人的な感想ですが、IAMにまつわるさまざまな概念を思考する際に言葉を的確に選んで表現することで厳密な定義を理解する楽しさだったり、それらを踏まえて評価ロジックを組み立ててTrue/False・Allow/Denyのはっきりした答えがあるところだったりがとてもおもしろいなーと感じました!
今後もまた現実世界のさまざまなユースケース・シナリオ視点でIAMを掘り下げて理解する試みをやってみようと思います。
Discussion