概要
- 特定のIAMでS3のオブジェクトをダウンロードしようとすると以下のエラーが出る
- The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.
- IAMユーザを使用できるIPアドレスを絞るためにIAMユーザのポリシーでConditionで「aws:SourceIp」を使っていることが原因
- Conditionに追加でNullの条件演算子の「"kms:ViaService": "true"」を指定することで解消
背景
以下を行った際、「The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.」というCMKに関連するエラーが発生しました。
エラー発生時の手順
- CloudTrailのログを暗号化し、S3へ保存
- S3に保存されたログをダウンロード
権限周りの設定を入れている箇所が複数あり、原因の特定に時間を要しました。
原因
解説
IAMへの接続元IPを制限したい場合、IAMポリシーへ以下のような「aws:SourceIp」を用いたCondition句を設定します。
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"111.222.333.444/32",
"555.666.777.888/32"
]
}
}
「aws:SourceIp」について、ドキュメントを見ると、こんな記載があります。
aws:SourceIp 条件キーをポリシーで使用して、プリンシパルが指定された IP 範囲内からのみリクエストを行うことを許可できます。ただし、AWS サービスがプリンシパルの代わりに呼び出しを行う場合、このポリシーはアクセスを拒否します。
分かりづらいですが、今回の場合「IAMユーザ(プリンシパル) → KMS → S3」という経路でアクセスがされているため、上記に引っかかってアクセス拒否されてしまうということだと思います。
解決策
- Condition句に「"Null": {"kms:ViaService": "true"}」を追加します。
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"Null": {
"kms:ViaService": "true"
},
"NotIpAddress": {
"aws:SourceIp": [
"111.222.333.444/32",
"555.666.777.888/32"
]
}
}
これによって、「KMSを経由している場合、アクセスを許可」という条件が追加されます。
(DenyとNullが組み合わさっていることによって、大変分かりづらいことになってますが、、、)
おわりに
「そんなん分からんわ!」という気持ちです。
AWSの権限周りはいつも沼にハマってます、、、