EC2で動くPHPコードでKMSを使ってパスワードを暗号化

住まい暮らしメディアLIMIAで開発を担当している樋口(@mahiguch1)です。
LIMIAではWebサービスの一部をPHPを使って実装しています。
EC2で動くPHPコードでパスワードをKMSを使って安全に扱う実装を行なったため、それについて共有します。

暗号化キーの作成

AWS Key Management Service (KMS) は、データの暗号化に使用される暗号化キーの作成と管理を容易にするマネージド型サービスです。
AWS Consoleから簡単に暗号化キーを作成することができます。
まず、AWS ConsoleからKMS(Key Management Service)を開きます。
次に画面右上の"Create key"と書かれたオレンジ色のボタンを押下します。

次の画面で、aliasに分かりやすい名前を入力します。

次の画面で、必要ならTagを入力します。

次の画面で、自分をKey Administratorsに入れておきます。

次の画面は、何も入力しないでおきます。

Review画面でCloudFormationのTemplateが表示されるので、そのままFinishを押します。

すると、暗号化キーが作成されます。

EC2でKMSの復号を可能にする

復号を実施するEC2インスタンスのInstance ProfileにKMSの復号を可能とするActionである"kms:Decrypt"を追加します。
今回は動作検証の都合で、暗号化を可能とするActionである"kms:Encrypt"も付与しています。

パスワードの暗号化

暗号化権限を付与したインスタンスで、以下のコマンドで暗号化が可能となります。

検証のため、awscliで復号してみます。

PHPでのパスワード取得

暗号化したパスワードをコードの中に埋め込み、実行時にKMSから取得した暗号化キーで復号して利用します。
暗号化された文字列なので、git repositoryに上げることができます。

まとめ

KMSを使ってパスワードを安全に扱う方法を紹介しました。
簡単ですが困ることが多い要件ですので、お役に立てたのなら幸いです。