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"も付与しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
"KMSDecryptPolicy": { "Type": "AWS::IAM::Policy", "Properties": { "Roles": [ { "Ref": "XXXXXServerRole" } ], "PolicyName": "KMSDecryptPolicy", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt" ] } ] } } } |
パスワードの暗号化
暗号化権限を付与したインスタンスで、以下のコマンドで暗号化が可能となります。
1 2 |
$ aws kms encrypt --key-id alias/limia-sapmle-key --plaintext "password" --query "CiphertextBlob" --output text xxxxxxxxxxxxx/xxxxxxxxxxxxxxxx/xxxxxxxxxxx/xxxxxxxxxxxxxx |
検証のため、awscliで復号してみます。
1 2 |
$ aws kms decrypt --ciphertext-blob fileb://<(echo 'xxxxxxxxxxxxx/xxxxxxxxxxxxxxxx/xxxxxxxxxxx/xxxxxxxxxxxxxx' | base64 -d)|jq .Plaintext --raw-output|base64 -d password |
PHPでのパスワード取得
暗号化したパスワードをコードの中に埋め込み、実行時にKMSから取得した暗号化キーで復号して利用します。
暗号化された文字列なので、git repositoryに上げることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$KmsClient = new Aws\Kms\KmsClient([ 'profile' => 'default', 'version' => '2014-11-01', 'region' => 'ap-northeast-1' ]); $ciphertext = 'xxxxxxxxxxxxx/xxxxxxxxxxxxxxxx/xxxxxxxxxxx/xxxxxxxxxxxxxx'; try { $result = $KmsClient->decrypt([ 'CiphertextBlob' => $ciphertext, ]); $plaintext = $result['Plaintext']; var_dump($plaintext); } catch (AwsException $e) { // Output error message if fails echo $e->getMessage(); echo "\n"; } |
まとめ
KMSを使ってパスワードを安全に扱う方法を紹介しました。
簡単ですが困ることが多い要件ですので、お役に立てたのなら幸いです。