Secrets Manager を使ってパスワードを入力せずに RDP してみた
パスワード管理めんどくさいです、那須です。
PrivateLink 経由で Secrets Manager が使えるようになったと AWS から発表がありました。 AWS Secrets Manager Now Supports AWS PrivateLink
これ読んで、そういえば Secrets Manager 全くやってなかったな。。。と思ったのでひとまずやってみました。 ただシークレット情報を取り出すだけだと他のブログでたくさん書かれているので、Windows Server に RDP するためのパスワードをシークレット情報として登録して、それを PowerShell から取り出して RDP できるかどうかをテストしてみます。
ドキュメント
ドキュメントは日本語でちゃんとあります。これまでの教訓を生かしながらも時間があまりないので、さっと読みます。 docs.aws.amazon.com
まずはシークレットの作成から
AWS管理コンソールで Secrets Manager の画面に行き、シークレット作成画面で他の種類のシークレットを選びます。その下にあるシークレットキー/値にそれぞれ入力します。今回は RDP 用のパスワードだけをいれます。
KMS の暗号化キーを選択して「次へ」を押します。CMK を使うこともできるようですが、今回はデフォルトのものを使います。
シークレット名と説明を書いて「次へ」を押します。
パスワード等の自動ローテーションができるようです。RDS とかだとすでにサポートされてるってドキュメントに書いてあった気がします。今回は無効にしたまま進みます。
確認画面で内容を確認します。
確認画面の下の方にサンプルコードがあります。いちいち自分で考えてコードを書かなくても済みますね。これは嬉しい(Powershellはないけど。。。
ここまで終われば、こんな感じでシークレットが作成されていると思います。
シークレット情報をとってくる PowerShell コマンド
まずはドキュメントでさっと確認します。CLI や SDK はこちらのドキュメントを。 docs.aws.amazon.com
PowerShell の場合はこちら。 docs.aws.amazon.com
まずは、シークレット情報をざっととってくるコマンドを試してみます。ARN とか 値 が返ってきますね。
> Get-SECSecretValue -SecretId test_pass -Region ap-northeast-1 ARN : arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:test_pass-XXXXXX CreatedDate : 2018/07/13 5:56:14 Name : test_pass SecretBinary : SecretString : {"password":"naisyonopasuwa-do"} VersionId : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx VersionStages : {AWSCURRENT}
内容が取れたのは嬉しいのですが不要な情報まで取れてるので、このままではスクリプトの中で使えません。 パスワードだけを取り出すために、結果を JSON に変換してその値だけを取り出すコマンドがこちらです。
> ((Get-SECSecretValue -SecretId test_pass -Region ap-northeast-1).SecretString|ConvertFrom-Json).password naisyonopasuwa-do
これでパスワードをテキストとして取り出すことができました。
いよいよ RDP を PowerShell から実行
↓のスクリプトを testrdp.ps1 ファイルにします。
echo "Connecting to xx.xx.xx.xx" $Server = "xx.xx.xx.xx" $User="Administrator" $Password = ((Get-SECSecretValue -SecretId test_pass -Region ap-northeast-1).SecretString|ConvertFrom-Json).password cmdkey /generic:TERMSRV/$Server /user:$User /pass:$Password mstsc /v:$Server
そして実行!
> .\testrdp.ps1 Connecting to xx.xx.xx.xx CMDKEY: 資格情報を正しく追加しました。
↑のような結果が返ってきた直後に、下のような RDP のプロンプトが出てきます。 ここまでくればいつものオペレーションですね。
はい!Windows Server にパスワードを入力することなく RDP 接続できました!
もうちょっと詳細調べて使いたい
Secrets Manager を使うと、シークレット名だけわかればいいので、
- パスワードを覚えなくてもい
- パスワードを関係者に周知しなくてもいい
- パスワードをローカルマシンに保存しなくてもいい
- パスワードを更新したとしても Secrets Manager で更新すればユーザはその変更を意識する必要がない
- パスワードと一緒に渡したい情報も書いておいて一緒に取れるようにできる
といいことばかりなので、皆さんもぜひ使ってみてください! 今回はパスワードを例にしてやってみましたが、ユーザ名でもいいしサーバ名でもいいし、なんにでも応用が利くと思います。
まあ今時は SSO とか MFA とかがあるのでもしかしたら「これを待ってた!」って人は少ないのかもしれませんが、コードを書いてる人だとクレデンシャル情報をどこに置くかは結構頭を悩ませる問題だったりするので、知っておいて損はないと思いますよ。