背景
今回はあるWebアプリケーションを作っている際にテキストを暗号化する
APIを作った時の備忘録です。
KMSを使うのが初めてで、おそらく初心者っぽいミスをしてしまったかなと
思ったのでメモを残しておきます。
APIの構成
アプリケーション全体の構成は少し複雑ですが、API自体は
とてもシンプルな構成です。
APIGatewayを経由して対象のLambdaを呼び出し、結果を返します。
(実際はAuthorizerを経由しているが、この説明からは割愛)
実装の内容
今回は初めてということもあり、効率的な実装ができていたかはわかりません。
とりあえず、下記のような手順で進めてみました。
1.AWSコンソールでカスタムキーを作ってみる。
2.boto3を使ってencryptとdecryptをするクラスを作ってみる。
3.APIのリクエストを処理するメイン処理を実装してみる。
4.IAMロールを作成してAPIの動作確認をしてみる。
1.AWSコンソールでカスタムキーを作ってみる。
最初に鍵を作ってみました。
正直鍵をコンソールで作ることは簡単すぎてあまり手順を覚えていないですw
まずキーを選びます。
- 対称キー
- 非対称キー
その後はエイリアスを決め、キーの管理者、キーの利用権限を
設定し、終了。
5つくらいのステップでした。
2.boto3を使ってencryptとdecryptをするクラスを作ってみる。
AWSのサイトにもサンプルコードが公開されています。
https://docs.aws.amazon.com/ja_jp/code-samples/latest/catalog/python-kms-key_encryption.py.html
しかし、自分は下記の方を最初に参考にしました。
任意のテキストを暗号化したいだけの用途としてAPIを作成していたので、
一番似たような用途かなと思ったため。
https://gist.github.com/hajimeni/2d5eb87a1cfd55f0ebb2077d8621772f
最終的にはAWSのサイトにあるようなものを使ってブラッシュアップしていきました。
3.APIのリクエストを処理するメイン処理を実装してみる。
これは上で作ったクラスを呼んで、実際に来たリクエストを暗号化して返してあげるという処理をしています。
上のAPI構成図では割愛した部分ですが、Authorizerのチェックが通った場合にこの処理にリクエストが
流れてくるという仕様です。
4.IAMロールを作成してAPIの動作確認をしてみる。
今回ハマってしまったのはこの部分なのですが、
APIの処理を担うLambdaに必要なIAMロールを付けて
実際にAPIを叩いてみます。
テストの段階ではうまく行き、なんとか実装できていたと安心していました。
ハマったところ
上にも記載がありますが、IAMロールの権限付与の部分で少しハマってしまいました。
結論から言うと、KMSのカスタムキーを使ってアプリケーション内の暗号化をする場合は
キーポリシー、キーユーザーの登録を行わないといけないということです!
手順のところでも書きましたが、キーを作成した時に何をしたのかという記憶が薄くなっており、
最後に行ったIAMロールのアタッチのところでトンチンカンなことをしていたというわけです。
何をしていたかというと下記のようなことをしておりました。
まず、仮実装・テストの段階では仮に作ったIAMロールをアタッチしておりました。
キーを作成した際にこのテスト用のIAMロールをキーポリシー、キーユーザーに登録していました。
テストが終わり、本番用のIAMロールを作成しようとして勘違いな行動をしました。
必要なロール、今回はKMSを使うのでKMSのサービスにアクセスするためのポリシーを
アタッチしたロールを作り、IAMロールをアタッチし直して、APIにリクエストを投げてみました。
すると案の定動きません。
色々なポリシーをアタッチし直し、試しますが一向に動きません。
キーポリシー、キーユーザーにロールを登録していないからです!
最終的にはテスト用のIAMロールと同じ設定にして確認するまでしましたが、
当たり前ですが、動きませんでした。
そもそも、テスト用のIAMロールにKMS関連のポリシーがアタッチされていないのに
動いていたことに気づいておらず、そこに気づくまでにだいぶ遠回りをしてしまいました…。
まとめ
・KMSのカスタムキーをアプリケーション内の暗号化/復号で使える。
・Lambdaで使用する際はIAMロールをKMSで作ったキーのキーポリシー、キーユーザーに登録する。
・カスタムキーを使ってencypt/dectyptのAPIを呼び出すなどのポリシーはキーポリシーに記載する。
・KMS関連のAWS管理ポリシーはキーの利用権限などとは関係ない。
今回のことで自身が学んだこととしてはこんなことかなと思います。
初心者だとおもいもよらぬところで躓いてしまいますが、メモとして残しておきます!