はじめに
こんにちはAWS事業本部コンサルティング部のみなみです。
re:Inventが本日から始まり、アップデートも盛り沢山です!
今回紹介するアップデートですが、IAM Access Analyzerにて自動推論によるカスタムポリシーチェックが追加されました。
これによってポリシーの変更内容を検知し、意図しない権限の付与を防ぐことが出来ます。
https://aws.amazon.com/jp/about-aws/whats-new/2023/11/iam-access-analyzer-custom-policy-check/
忙しい人の為のまとめ
- IAM Access Analyzerに新たなAPI、CheckNoNewAccessとCheckAccessNotGrantedが追加されました。
- CheckNoNewAccess
- 既存のポリシードキュメントと新たなポリシードキュメントの比較を行います。既存のポリシーと比較して、新しい権限が付与されたかどうかを検知することが出来ます。
- CheckAccessNotGranted
- 特定の権限(アクション)が付与されているかを確認することが出来ます。
- 上記のAPIをCI/CDパイプライン・開発ライフサイクルに組み込むことで、IAMポリシーのセキュリティチェックの一つの方法として利用出来ます。
カスタムポリシーチェックとは?
カスタムポリシーチェックとは自動推論を利用したIAMポリシードキュメントに対してのチェックを行い、新たな権限が付与されたか?特定の権限が付与されていないか?を検知できるような機能です。
今回のアップデートでは2つのAPIが実装されました。
CheckNoNewAccess
既存のポリシーと比較して、更新されたポリシーに対して新しいアクセスが許可されているかどうかを確認することができるAPIです。
こちらの機能はポリシーエディターのチェックポリシーからも実行可能です。
AWS CLI
アイデンティティポリシーだけではなく、リソースポリシーに対しても実行可能です。
aws accessanalyzer check-no-new-access \
--new-policy-document <file://新ポリシードキュメント.json> \
--existing-policy-document <file://既存ポリシードキュメント.json> \
--policy-type <IDENTITY_POLICY | RESOURCE_POLICY>
CheckNoNewAccessの実行例
以下のような特定のS3バケット(my-sensitive-bucket)に対する一部操作が制限されているポリシーの場合を考えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": [
"s3:DeleteBucket",
"s3:PutBucketPolicy",
"s3:DeleteBucketPolicy",
"s3:PutBucketVersioning",
"s3:DeleteObject",
"s3:PutBucketAcl",
"s3:PutReplicationConfiguration",
"s3:PutBucketLogging"
],
"Resource": "arn:aws:s3:::my-sensitive-bucket"
}
]
}
チェックに合格したポリシーの例1
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:DeleteBucket",
"s3:DeleteBucketPolicy",
"s3:PutBucketPolicy"
],
"Resource": "arn:aws:s3:::my-not-sensitive-bucket"
}
]
}
出力結果
aws accessanalyzer check-no-new-access \
> --new-policy-document file://new-policy-document.json \
> --existing-policy-document file://existing-policy-document.json \
> --policy-type IDENTITY_POLICY
{
"result": "PASS",
"message": "The modified permissions grant less or equal access compared to your existing policy."
}
既存のポリシーと比較すると、my-sensitive-bucketの一部操作以外は全て許可されているポリシーから、my-not-sensitive-bucketの一部操作のみが許可されたポリシーとなっております。
結果として新たな権限は付与されていない為、CheckNoNewAccessはPASSを出力します。
チェックに合格したポリシーの例2
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": "*",
"Resource": "arn:aws:s3:::my-sensitive-bucket"
}
]
}
出力結果
aws accessanalyzer check-no-new-access \
> --new-policy-document file://new-policy-document.json \
> --existing-policy-document file://existing-policy-document.json \
> --policy-type IDENTITY_POLICY
{
"result": "PASS",
"message": "The modified permissions grant less or equal access compared to your existing policy."
}
既存のポリシーと比較すると、my-sensitive-bucketの一部操作以外は全て許可されているポリシーから、my-sensitive-bucketに対する全ての操作が禁止されたポリシーに変更されています。
結果的に既存のポリシーより厳しいポリシーとなっており、新たな権限は付与されていない為、CheckNoNewAccessはPASSを出力します。
チェックに失敗したポリシーの例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
},
{
"Effect": "Deny",
"Action": [
"s3:DeleteBucket",
"s3:PutBucketPolicy",
"s3:DeleteBucketPolicy",
"s3:PutBucketVersioning",
"s3:DeleteObject",
"s3:PutBucketAcl",
"s3:PutReplicationConfiguration",
"s3:PutBucketLogging"
],
"Resource": "arn:aws:s3:::my-sensitive-bucket",
"Condition": {
"StringNotLike": {
"aws:userid": "cm-minami-koki:*"
}
}
}
]
}
出力結果
aws accessanalyzer check-no-new-access --new-policy-document file://new-policy-document.json --existing-policy-document file://existing-policy-document.json --policy-type IDENTITY_POLICY
{
"result": "FAIL",
"message": "The modified permissions grant new access compared to your existing policy.",
"reasons": [
{
"description": "New access in the statement with index: 0.",
"statementIndex": 0
}
]
}
既存のポリシーと比較すると、my-sensitive-bucketに対する制限がcm-minami-kokiに対してのみ例外的に許可されました。
結果的に新たな権限が付与されていますのでCheckNoNewAccessはFAILを出力します。
CheckAccessNotGranted
IAMポリシードキュメントのチェックを行い、特定のアクセス許可(アクション)が含まれていないかを確認することが出来ます。
こちらの機能はマネジメントコンソールからは実行出来ません。
AWS CLI
check-access-not-granted \
--policy-document <file://ポリシードキュメント.json> \
--access <チェックしたいアクション> \
--policy-type <IDENTITY_POLICY | RESOURCE_POLICY>
CheckAccessNotGrantedの実行例
s3:DeleteObject、s3:DeleteObjectVersionが許可されていないか?をチェックする場合を考えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*Object*",
"Resource": ["*"]
}
]
}
実行結果
aws accessanalyzer check-access-not-granted --policy-document file://IamPolicyDocument.json --access actions=s3:DeleteObject,s3:DeleteObjectVersion --policy-type IDENTITY_POLICY
{
"result": "FAIL",
"message": "The policy document grants access to perform one or more of the listed actions.",
"reasons": [
{
"description": "One or more of the listed actions in the statement with index: 0.",
"statementIndex": 0
}
]
}
このようにワイルドカードで指定している場合でも特定のアクションが許可されていないか?を確認することが可能です。
料金
料金は以下の通りAPI1回当たり$0.0020となっています。
その為、月に500回でも$1程度ですね。
最後に
今回のアップデート以外にもIAM Access Analyzerのアップデートがありました!
IAM Access Analyzerがどんどん進化することで、最小権限の実装がよりやりやすくなりますね!
新しい機能を活用してセキュリティをどんどん高めていきましょう!