OpsWorksを使ってEC2へのSSHログインアカウントを管理する

最近であればEC2にはログインしない、そもそもEC2を使わずLambdaやAPI Gatewayを使うという話もありますが、とはいえ現場ではEC2を使いますし、SSHログインすることもあります。。。

で、SSHログインするユーザーをインスタンスを追加する場合、公開鍵を作ってもらって対象のインスタンスにログインして配置して。。。みたいな作業が必要で面倒です。しかもそれが複数台ある場合、より面倒です。

fabricとか使えばさっとできますが、そもそもOpsWokrsのPermissionの機能を使えばGUIから上記のようなSSHログイン管理を出来るみたいでやってみたのでメモ。

# 結論

+ OpsWorksを使うことでEC2へのSSHログイン(公開鍵認証）のユーザー管理ができる
+ IAMで作成したユーザーとの対応付けができる
+ スタック毎にアクセス可否の設定ができる
+ sudoのありなしの設定もできる

# OpsWorksの準備

OpsWorksで以下を実施します。

+ スタックの作成
+ レイヤーの作成。作成するレイヤーはCustomレイヤーとします。（なんでもよいですが、一番カスタムレイヤーがビルトインクックブックが少ない）
+ 上記カスタムレイヤーに所属するEC2を一台起動する

今回は上記レイヤーに所属するインスタンスへのログイン管理を行います。

# 接続元インスタンスで公開鍵・秘密鍵を作成する

接続する際の公開鍵を作成します。

```bash
$ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
32:ce:97:06:01:1b:b5:75:48:9b:4a:55:43:10:82:72 ec2-user@ip-172-31-21-15
The key's randomart image is:
+--[ RSA 2048]----+
|    ooo.**=      |
|  . E+ =.+ .     |
|   o. + o        |
|     . o         |
|      = S        |
|     o + .       |
|      o +        |
|       o         |
|                 |
+-----------------+
```

上記により~/.ssh/id_rsa及び~/.ssh/id_rsa.pubができているかと思いますので確認しておきます。

また、公開鍵(~/.ssh/id_rsa.pub)の内容をエディタなどにメモしておきます。

# IAMでユーザーを作成

IAMでsshログインしたいユーザーを作成します。
アクセスキーは不要なので、 **Generate an access key for each user** のチェックは外します。

今回は **TestUser** という名前のユーザーを作成しました。

# IAMユーザーのインポート

OpsWorksで先ほど作成したIAMユーザーのインポートを行います。

+ Stack選択後、画面右上のUsersを選択
+ Import IAM Userを選択
+ 先ほど作成したTestUserを選択し、Import To Opsworksボタンを選択

![Screen Shot 2015-10-01 at 7.44.00 AM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/328195c6-29de-09ec-0937-d843697c032e.png)


インポート後、TestUserを選択し、Editで内容を編集します。

+ 先ほどメモしておいた公開鍵の内容を Public SSH Keyという欄にペーストします。
+ 対象のスタックのSSH/RDPの欄のチェックをONにしてSSHログインを有効化します。

![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/20193/5021c88b-2836-a782-96ce-7e0982fc862e.png)


すると上記変更をトリガにしてChefのレシピがインスタンス群に実行されます。
具体的にはssh_usersというレシピを実行しています。
このレシピの実行によって追加したユーザー情報を登録しています。

# SSHログインしてみる

秘密鍵を配置したインスタンスからsshログインできるか確認してみます。
レイヤーに紐付くインスタンスのPublicDNS名を確認します。(OpsWorks上で確認できます）そして、以下の様なコマンドでSSHログインします。（DNS名は適宜置き換えてください)
なお、ユーザー名は「TestUser」ではなく「testuser」と小文字になっているので注意して下さい。

```bash
$ ssh -i ~/.ssh/id_rsa testuser@ec2-xxxx.xxxx.xxxx.xxx.ap-northeast-1.compute.amazonaws.com
```

上記で無事ログインすることができます。

なお、別途ec2-userなどsudo出来るユーザーでログインするとChef実行時に利用する属性情報が取得できます。先ほどのGUIでのユーザー情報追加により、属性情報が変更され、レシピではその情報を元にユーザーを作っていることが分かります。

```bash
$sudo opsworks-agent-cli get_json
{
  "deploy": {
  },
  "ssh_users": {
    "2002": {
      "name": "testuser",
      "public_key": "ssh-rsa ・・・・・",
      "sudoer": false
    }
  },
```

# sudoの許可を行う

先ほどのユーザーではsudoが出来ませんでしたが、sudo出来るように設定してみます。

TestUserの編集画面で今度はsudo/aminとなっている部分のチェックをONにすればOKです。

![hoi.png](https://qiita-image-store.s3.amazonaws.com/0/20193/6851fe26-a2ea-bbd8-c922-fee493d35467.png)


上記を変更すると先ほど同様にssh_usersレシピが実行されます。このレシピで/etc/sudoersファイルの変更を行う処理を行っています。

上記レシピ実行後、再度対象インスタンスにsshログインするとtestuserでsudoができるようになっています。

また、併せて内部の属性情報が変わっていることも確認できます。具体的にはsudoerの部分がfalseからtrueに変更されていることが確認できます。

```bash
$sudo $opsworks-agent-cli get_json
{
  "deploy": {
  },
  "ssh_users": {
    "2002": {
      "name": "testuser",
      "public_key": "ssh-rsa ・・・・・",
      "sudoer": true
    }
  },
```

対応するレシピは以下のssh_usersディレクトリ配下のレシピなどを見ると内容がわかるかと思います。

[aws/opsworks-cookbooks](https://github.com/aws/opsworks-cookbooks)