Skip to content

Instantly share code, notes, and snippets.

@altrive
Created December 25, 2013 11:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save altrive/8122525 to your computer and use it in GitHub Desktop.
Save altrive/8122525 to your computer and use it in GitHub Desktop.
AWS Toolkit for PowerShellの利用に関するメモ書きです。

AWS Toolkit for PowerShellの利用に関するメモ書きです。

  1. 初期セットアップ

以下、AWS Tools for Windows PowerShellのセットアップ手順について記載します。

1.1 AWS Tools for PowerShell のインストール

下記のURLからAWS Tools for Windowsをダウンロードしてインストールしてください。
http://aws.amazon.com/jp/powershell/

PowerShellで直接インストールする場合は下記URLを利用可能です。
http://sdk-for-net.amazonwebservices.com/latest/AWSToolsAndSDKForNet.msi

リリースノートはこちら。頻繁にアップデートされるので、要チェック。
http://aws.amazon.com/releasenotes/PowerShell

1.2 APIアクセス用のAccessKeyとSecretKeyの作成

AWSの管理コンソールからIAMのダッシュボードに移動し、管理用ユーザーを作成を作成します。
その後、作成したユーザーに対応するAPIアクセス用のキーを取得します。

また既定では権限が付与されていないので、操作に必要な権限を付与します。 今回はポリシーテンプレートから"Power User Access"権限を付与しておきます。

※認証キーの管理には気を付けましょう。下手にWebに公開してしまうと、
「AWSの認証キーを奪われて仮想通貨を採掘される攻撃が発覚」 みたいなことになります。

1.3 AWS for PowerShellの初期設定

既定で使用する認証情報、使用リージョンを設定します。

###利用可能なリージョン一覧の確認### 下記のコマンドで現在利用可能なリージョン一覧を取得できます。

Get-AWSRegion

現時点では8つのリージョンが用意されていることが確認できます。(GovCloud/Chinaリージョン除く)

###既定の認証情報/リージョンの設定### AWSのAPI呼び出しに使用するデフォルトのリージョン/認証情報を設定します。 明示的にコマンドレットにパラメータを指定しない場合は、ここで設定した情報が使用されることになります。

$params = @{
    Region = "ap-northeast-1" #東京リージョン
    AccessKey = "[アクセスキー]"
    SecretKey = "[シークレットキー]"
}
Initialize-AWSDefaults @params

###カスタム認証情報の設定### 既定の認証情報以外にも、複数の認証情報をAWSプロファイル中に格納することができます。 下記のコマンドを実行することにより、カスタムの認証情報をAWSプロファイルに格納できます。

$params = @{
    StoreAs = "Production"  #カスタム認証情報のキー
    AccessKey = "[アクセスキー]"
    SecretKey = "[シークレットキー]"
}
Set-AWSCredentials @params

###カスタム認証情報の確認### 現在格納されているカスタム認証情報の一覧を確認するには下記のコマンドレットを使用します。

Get-AWSCredentials -ListStoredCredentials

###既定の認証情報の一時的な変更### 下記のコマンドを使用することにより、一時的に既定の認証情報を切り替えることができます。

Set-AWSCredentials -StoredCredentials Production

###コマンドレットへの認証情報の指定### AWSの各種コマンドレットは認証情報を直接指定する代わりに
StoredCredentialsパラメータを指定することができます。
カスタムの認証情報を使用する場合は、このパラメータに認証情報のIDを指定します。

Get-EC2Instance -StoredCredentials Production

###各種設定の格納場所### ここで設定した各種設定情報はユーザーディレクトリ配下のパス
"%LocalAppData%\AWSToolkit\RegisteredAccounts.json" にJSON形式で保存され
AWSモジュールインポート時に自動的に読み込まれます。

1.4 キーペアの作成/管理

EC2のインスタンスを立ち上げる前に、事前に公開鍵/秘密鍵のキーペアを作成する必要があります。 ここで作成するキーは自動生成されるWindowsのAdministratorパスワードの暗号化/復号に使用することになります。

###キーペアの作成について### New-EC2KeyPairコマンドレットを使用することで、AWS側でキーペアを生成することができます。
ただ、公開鍵/秘密鍵のキーペアについては、自前で作成し
公開鍵のみをAWS側にインポートする運用が推奨されています。
キーペアを手元で作成する場合の利点は下記の通りです。

  • 秘密鍵をネットワーク上に流す必要がない。
  • 公開鍵が手元に残るので、別リージョンで同一の鍵を使用する場合の登録が楽になる。
  • RSAの鍵長を4096bitに変更可能(AWS側で作成する場合は2048bitのみ)

###キーペアの作成### 以下の手順で公開鍵/秘密鍵のキーペアを作成します。
Windows環境でOpenSSH形式のキーペアつくるのは面倒なので、
今回はPuttygen.exeを使用して作成することにします。

作成された鍵は下記の名前で保存します。
拡張子は任意ですがとりあえず下記のようにしておきます。

  • 公開鍵:[キー名].pub #OpenSSH key フォーマットで保存
  • 秘密鍵:[キー名].pem #OpenSSH key フォーマットで保存

作成したキーはパスワード等かけて安全な場所に置いときましょう。 キーをなくすとWindowsのインスタンスにログインできなくなるので、バックアップも忘れずに。

###キーペアのインポート###

作成した公開鍵をインポートするには下記のコマンドを実行します。

$params = @{
    KeyName = "[任意の鍵名]"
    PublicKeyMaterial = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes('[作成した公開鍵]'))
}
Import-EC2KeyPair @params

指定する公開鍵はOpenSSH authorized_keysファイル形式である必要があるようです(PuttyGen.exeの画面上部に表示される形式)。 また、APIの仕様により、BASE64で再エンコードしてやる必要があります。

###PEMファイルの格納先### 作成した秘密鍵(.pem)はAWSが自動生成したWindowsのパスワードの復号する際に必要になります。
このため、PEMファイルをどこか安全な場所に格納する必要があります。

AWSToolkitではPEM file Discovery?(正式名称不明) の機能が用意されており、 AppDateフォルダの特定階層に暗号化したキーを配置してことで、各EC2インスタンスに対応するキーを自動で使用してくれます。 キーを配置するパスは下記の通りです。

%AppData%\AWSToolkit\keypairs\[アクセスキー]\[リージョン名]\[キー名].pem.encrypted

###PEMファイルの暗号化### 下記の手順でPEMファイルを暗号化することができます。

#PEMファイル(秘密鍵)をロード
$pemFilePath =  Join-Path (Split-Path -Path $profile -Parent) "\AWSMasterKey.pem" -Resolve
$rawData = Get-Content -Path $pemFilePath -Raw

#秘密鍵をDPAPIで暗号化
$encryptedData = [Amazon.AWSToolkit.UserCrypto]::Encrypt($rawRsaKey) 

#DPAPIで暗号化した秘密鍵を指定のパスに配置
$accessKey = [Amazon.AWSToolkit.Persistence.PersistenceManager]::Instance.GetSettings("RegisteredAccounts").GetValueOrDefault("AWSAccessKey",$null) #TODO:RegisteredAccountsが複数の場合の対応
$baseDir = [Amazon.AWSToolkit.Persistence.PersistenceManager]::GetSettingsStoreFolder()
$encryptedKeyPath = "{0}\keypairs\{0}\{1}.pem.encrypted" -f $baseDir, $accessKey, $keypairName
[IO.File]::WriteAllText($encryptedKeyPath,$encryptedData,[Text.Encoding]::ASCII)

###Windowsパスワードの取得### Pem file AutoDiscover(?)を使用して、Windowsのパスワードを取得するには、 Get-EC2PasswordDataのパラメータに追加で-Decryptを指定します。

Get-EC2PasswordData -InstanceId $instanceId -Decrypt 

内部的な動作は下記の流れとなります。

  1. AWSより公開鍵で暗号化されたパスワードデータを取得
  2. AWSよりインスタンス情報を取得、KeyNameプロパティより、暗号化に使用されたキー名を取得
  3. AutoDiscoverによりAppDataフォルダから対応する秘密鍵(DAPIで暗号化)を取得
    DPAPIで復号し秘密鍵を取得
  4. 秘密鍵を使用し暗号化されたパスワードを復号
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment