nova get-password コマンドを活用する

みなさんは "nova get-password" コマンドを知っていますでしょうか。

僕は OpenStack 初心者なので、先日はじめて知りました。 公式のドキュメントを見ると、下記のように書かれています。

usage: nova get-password [<private-key>]

Get the admin password for a server.

なるほど、ユーザーパスワードを知ることが出来るのか! そう思って作成したインスタンスに "nova get-password" コマンドを使っても何も表示されません。

ということで詳しく調べてみました。

nova get-password の実行前に...

nova get-password は実は下記のような順序で動作をします。

  1. 対象のインスタンスの metadata からパスワードを取得
  2. コマンドにインスタンスのキーペアの秘密鍵が指定されていれば、平文で表示。そうでなければ暗号のまま表示

1 の metadata からパスワードを取得するためには、"nova get-password" の実行前に下記のようなアクションを起こす必要があります。

  1. インスタンス内部にて metadata から SSH 公開鍵を取得
  2. インスタンス内部から metadata の password へ 1.で取得した公開鍵を利用して暗号化したパスワードを HTTP POST する

... そもそも、metadata ってなんぞや。

metadata

OpenStack には至る所に Meta なデータが登場しますが、ここでの "metadata" とは nova のインスタンスの metadata です。

nova ではインスタンス内部で利用できる情報を metadata として提供します。例えば、以下の様な情報をインスタンス内部から取得できるのです。

このような仕組みは AWS でもあるみたいですね!(当たり前ですね!)

では、どうやってインスタンス内部から metadata を取得するのでしょうか。 方法としては簡単です。下記のように特定の URL にアクセスするだけです。

curl http://169.254.169.254/latest/meta-data

f:id:ryouta768:20160618210451p:plain

パスワードを POST する

ということで、実際にインスタンス内部から metadata を利用してパスワードを POST するのが以下のスクリプトです。 Script for setting an encrypted password on bootを fork して一部変更しました。

Script for setting an encrypted password on boot

nova get-password!

先ほどのスクリプトインスタンス内部で実行後, "nova get-password" を試します。

# 秘密鍵指定なし
$ nova get-password test
n6T7b1oKzBFP/qI/zAo6GollVrwP4HCYa9eRqGl7e7L5zo4W6gjFB+hxXGBPW7xqy54lM+3HIjYZ+heYaP0sDkDKFpn+h/S79ABeSeHYABXM972w8MJGeG7offzlicJPDxzQFnnt6r220GCaclsb/cwhHyU+Ff8M1uNyfo2W57aVWKqB5NzWda7X8OOrbaz1wa/ef6HtI8HWkRb0vgBbGQHlH7x2pj2oj5vKiD5Xx7vk7y+Nwauq0ViiLOxAc2LY0D5GU9oE1SBLz2ICcyYOqcmvDNB2WhV4Z8mqqZ+hokyCN/HB/r2H8F+STepVvfXKwytSTVl9/2rNiQxzQZvMzQ==
# 秘密鍵指定あり
$ nova get-password test test.pem
X2zNqigFoAScqT1N

やったぜ!

参考にした URL