sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

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 用のパスワードだけをいれます。 f:id:nasrinjp1:20180713162859p:plain

KMS の暗号化キーを選択して「次へ」を押します。CMK を使うこともできるようですが、今回はデフォルトのものを使います。 f:id:nasrinjp1:20180713162911p:plain

シークレット名と説明を書いて「次へ」を押します。 f:id:nasrinjp1:20180713162920p:plain

パスワード等の自動ローテーションができるようです。RDS とかだとすでにサポートされてるってドキュメントに書いてあった気がします。今回は無効にしたまま進みます。 f:id:nasrinjp1:20180713162931p:plain

確認画面で内容を確認します。 f:id:nasrinjp1:20180713162941p:plain

確認画面の下の方にサンプルコードがあります。いちいち自分で考えてコードを書かなくても済みますね。これは嬉しい(Powershellはないけど。。。 f:id:nasrinjp1:20180713162954p:plain

ここまで終われば、こんな感じでシークレットが作成されていると思います。 f:id:nasrinjp1:20180713164317p:plain

 

シークレット情報をとってくる PowerShell コマンド

まずはドキュメントでさっと確認します。CLISDK はこちらのドキュメントを。 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 のプロンプトが出てきます。 ここまでくればいつものオペレーションですね。 f:id:nasrinjp1:20180713163004p:plain

はい!Windows Server にパスワードを入力することなく RDP 接続できました! f:id:nasrinjp1:20180713163016p:plain

 

もうちょっと詳細調べて使いたい

Secrets Manager を使うと、シークレット名だけわかればいいので、

  • パスワードを覚えなくてもい
  • パスワードを関係者に周知しなくてもいい
  • パスワードをローカルマシンに保存しなくてもいい
  • パスワードを更新したとしても Secrets Manager で更新すればユーザはその変更を意識する必要がない
  • パスワードと一緒に渡したい情報も書いておいて一緒に取れるようにできる

といいことばかりなので、皆さんもぜひ使ってみてください! 今回はパスワードを例にしてやってみましたが、ユーザ名でもいいしサーバ名でもいいし、なんにでも応用が利くと思います。

まあ今時は SSO とか MFA とかがあるのでもしかしたら「これを待ってた!」って人は少ないのかもしれませんが、コードを書いてる人だとクレデンシャル情報をどこに置くかは結構頭を悩ませる問題だったりするので、知っておいて損はないと思いますよ。