はじめに
AWS を触り始めたばかりの頃にやらかした初歩的なミスをまとめたアドベントカレンダー、題して「AWS初歩ミス図鑑」の 16 日目です。
今回は IAM ポリシーを見直してみたら既存アプリが一部動かなくなった話 を書いていきます。
やっていたこと
時系列的には、過去の記事と同じタイミングです。
突然ですが、弊社の STG 環境には 万能ロール と呼ばれるものがありました。
それは既に退職した社員さんが Lambda に紐づけることを目的として作成されたもので、Admin ほどの権限はないが、取り急ぎアプリ開発をするには十分な権限を持っているという不思議なロールでした。ですが、もちろんこんなよくわからないロールがいつまでも現役活躍しているのはまずいと誰もがうすうす思っており、セキュリティポリシーが見直されるタイミングでこのロールを無くそう(正しくは、適切なロールをそれぞれ作り直そう)ということになりました。
作成日が比較的新しいアプリはこちらのロールを作成していなかったため、実際に手を入れる必要があったのは二つ、三つほどです。そのうちのひとつに、以下のような構成のアプリがありました。
- S3 へアップロードされたコンテンツを Lambda で処理
- 処理結果を DyamoDB に保存
- 完了したら SNS で通知
こちらのアプリの権限を見直すにあたり、私は以下のサービスに関する権限を持つ Lambda 用ロールを新たに作成しました。
- S3 の読み取り
- Cloudwatch ログへの書き込み
- DynamoDB への書き込み
- SNS への送信
「使用しているサービスは全部網羅しているし、大丈夫なはず!」と思いましたし、実際 Lambda のテストイベントを動かしたときには問題なく SNS の送信まで確認できました。
本当に、テストで使用していた SNS は実際に動いているものではなく、自分のアドレスを指定した検証用トピックだったという点を除き、すべてが順調でした。
結果
ロールを切り替えてみたところ、SNS からの完了通知がまったく届かなくなりました。
こちらの経験からなにかおかしいことがおきたらまずログを見るを実践していたため、なにはともあれ確認してみると、以下のような表示になっていました。
AccessDenied: User is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:ap-northeast-1:.....
「kms…????」と、完全に想定外のところから殴りこまれて思考が停止しました。クラスの同窓会へ行ってみたら全く知らない人が三十人くらいいた、みたいな気分です。
冗談はさておいて、どこかで kms を使うような場面が…? と、もう一度リソースを確認してみたところ、DynamoDB も S3 も暗号化されていない(STG 環境の処理なので、それほどの要件がない)のに、なぜだか SNS だけが暗号化されていました。こちらを見落とし kms の権限を付与しなかったため、SNS の送信が行えなかったのです。検証時は別のトピックを使用していたため、気がつけませんでした…。
こちらに関しては「そもそも SNS だけが暗号化されているのが謎」ということになり、暗号化を無効にする対応をとることになりました。
何を考えていたのか
S3 や DynamoDB に関しては事前に暗号化されていないか確認をしたのですが、SNS も暗号化できるんだということを失念していたのに加え、データベース系が暗号化されていないのに SNS だけが暗号化されている環境なんてあるか?いや、ない。 という思い込みもありました。一言でまとめるとリサーチ不足です。
ポリシーの設定自体は合っていた…といっていいかは謎ですが、最終的には採用されたので、そこに成長の一端が…見えなくも………。
まとめ
今回の件で特に学んだのは、「リソースの設定は個別に確認する」 ということです。S3 や DynamoDB が暗号化されていないからといって、SNS も暗号化されていないとは限りません。CloudFormation 等で管理をされている場合は違うかもしれませんが、各々が手動で構築されている場合、各サービスにはそれぞれの設定履歴や要件があり、一貫性がない場合も多々あります。今回のアプリは特に作成日が古かったため、社内のだれも変更履歴を完全には把握していない状態でした。
あとは「思い込みを捨てる」も大切です。前任者の残したアプリは良い意味でも悪い意味でも常に我々を驚かせてくれます。という、翻訳した技術書の冒頭のような言葉でこちらの記事を終えたいと思います。
完走まで残り 9 記事! そろそろ記憶を振り絞ることにも限界を感じてきていますが、がんばって最後まで書いていきます!