AWSのEC2インスタンスに複数の端末からアクセスする

Amazon web serviceのEC2へのアクセスには、公開鍵を使います。

公開鍵方式というのは細かいことはさておき、

- 公開鍵と秘密鍵の2種類の鍵のペアを作成し
- 公開鍵の方をアクセス先に登録しておき、秘密鍵は自分の端末に保管
- アクセス時には秘密鍵を用いて認証する

という仕組みです。ですので、秘密鍵はその名の通り秘密です。たとえ個人メールやDropboxなどでも、ネット上である限りあげるべきではないようです（[参考](http://qiita.com/dawn_628/items/d77aa9e9728973dd41a0)）。


AWSでEC2インスタンスを作るときには、この鍵のペアを1組作ります。このうちの公開鍵をサーバーに登録し、アクセスするときには秘密鍵を用います。

```bash
$ ssh -i <key-file-path> <ec2 public ip>
```

たとえばこんな風になります

```bash
$ ssh -i my-key.pem ubuntu@12.345.6.789
```

色々調べたのですが、各AWSのウェブサイトからは、鍵を１つしか設定できないようです。だとすると、別のユーザーがいたり、1人の作業だとしても複数のPCから使いたい場合にはどうすればいいでしょうか。１つだけしかない秘密鍵を共有するのでしょうか。


実は、ウェブ上で登録できる鍵は１つですが、それとは別にサーバー上で鍵を登録することが可能です。さらに、ユーザーを追加することも可能ですので、サーバー上で「ユーザー」を作成し、ユーザーに認証用の公開鍵を設定することもできます。すると、「このユーザーに対してログイン」することが可能になります。さらに、ユーザーに管理者権限を与えておけば、ユーザー名義でアクセスしたあとに他のユーザーに切り替えることも可能です。この方法をとれば、各端末で鍵を生成し、公開鍵をユーザーに登録することによって、複数の端末からのアクセスが可能になります。秘密鍵は各端末に固有のものになり、共有する必要はありません。


下記はUbuntuインスタンスで行う場合の手順です（[こちらを参考にしました](http://www.task-notes.com/entry/20150816/1439694000)）。

## 手順

### （０）前提

端末１からすでにSSHによるアクセスができており、端末２からもアクセスしたい、と仮定します

### （１）端末２において、鍵を生成する

`pc2~`というのは、端末２上での作業を意味します。`pc1~`は端末１です。

```bash
pc2~ $ ssh-keygen -t rsa -f ~/.ssh/id_rsa_ec2
``` 

`-t` はタイプ指定で、RSA暗号を指定していますが、つけなくてもよいようです。`-f` は鍵の名前を指定しています。このとき、passphraseを設定すると、鍵を用いてアクセスする際のパスワードとなります。私は面倒だけど一応設定することにしています。
上のコマンドにより、`~/.ssh/`フォルダ内に、`id_rsa_ec2` と `id_rsa_ec2.pub`という２つのファイルが作られます。".pub"は公開鍵、拡張子なしの方は秘密鍵です。

### （２）公開鍵を端末１に送る

`id_rsa_ec2.pub`を端末１に送ります。USBメモリを使ったり、メールに添付したり、クラウドサービスを介するなどして共有します。私はGoogle Driveを使いました。公開鍵なのでネット上に出てしまっても良いはずですが、何となく嫌なのですぐ消しました。


### （３）端末１からAWSへ公開鍵を送る

```bash
pc1~ $ scp -i mykey.pem id_rsa_ec2.pub ubuntu@111.111.111.111:~/
```

`mykey.pem`はもともと持っている秘密鍵ファイル、`111.111.111.111`の部分はインスタンスの公開IPに読み替えます。こうすることで、インスタンスのホームディレクトリ（/home/ubuntu/）に`id_rsa_ec2.pub`がコピーされます。


### （４）端末１からAWSにアクセス

```bash
pc1~ $ ssh -i mykey.pem ubuntu@111.111.111.111
```
ここからはサーバー内の作業です。

### （５）ユーザーを作成する

下記で、コマンドのはじめが `$`になっているのはユーザーの
立場での作業、`#`になっているのは管理者の立場での作業です。`su -`により、管理者にスイッチしています。

```
ubuntu@~ $ sudo su -
root@~ # adduser tarou
```
`tarou`は新しいユーザーの名前で、任意です。このとき、`tarou`のパスワードを聞かれると思いますので、設定します。パスワードを聞かれなかった場合は、

```
root@~ # passwd tarou
```
から設定します。このパスワードは、主にこのユーザーが管理者権限を必要とする処理（`sudo ...`）を行うときに使います。

つづいて、ユーザーに管理者権限を与えます。管理者権限がないと、別のユーザーへの切り替えができません。

```
root@~ # echo "tarou ALL=(ALL) ALL" > /etc/sudoers.d/tarou
root@~ # chmod 440 /etc/sudoers.d/tarou
```

### （６）公開鍵を、新しいユーザーに登録する

```
root@~ # su - tarou
tarou@~ $ mkdir .ssh
tarou@~ $ sudo mv /home/ubuntu/id_rsa_ec2.pub .ssh/authorized_keys
tarou@~ $ sudo chown tarou. .ssh/authorized_keys
tarou@~ $ sudo chmod 600 .ssh/authorized_keys
tarou@~ $ sudo chmod 700 .ssh/
```

`su - tarou`により、ユーザーを切り替えます。`tarou`の立場から、`.ssh`ディレクトリを作り、元のユーザー（`ubuntu`）のところにある公開鍵を`.ssh/authorized_keys`へ移動しています（`authorized_keys`はフォルダではなく公開鍵ファイルそのもの）。
つづいて、ファイルとフォルダのアクセス権限を設定しています。まずファイルのオーナーを`tarou`自身に設定しています。ファイルの権限には`600`、つまりオーナーのみが読み書き可能、フォルダには`700`には、オーナーのみの読み書き実行可能としています。
こうするもののようです（`ubuntu`側も同じ設定になっています）。


### （７）端末２からアクセスできるか実験

以上で設定は終わりです。端末２から`tarou`ユーザーにログインするコマンドは下記のようになります。

```
pc2~ $ ssh -i .ssh/id_rsa_ec2 tarou@111.111.111.111
```
認証用の鍵に先ほど作ったものを使い、ログイン先を`ubuntu`ではなく`tarou`に変更しています。うまくいっていれば、これでログインできるはずです。

`tarou`には管理者権限があるので、ユーザーを`ubuntu`に切り替えることが可能です。そうすると、通常の認証で入ったのと同じ状態になります。

```
tarou@~ $ sudo su - ubuntu
```

### 備考

なお、ここまで勉強して最後に気づいたのは、別のユーザーを立てなくても、デフォルトユーザーである`ubuntu`の公開鍵に新しいものを追加してしまえば良いのではないかということです。実は、`authorized_keys`には複数の公開鍵を定義することができます（[参考](https://www.cyberciti.biz/tips/linux-multiple-ssh-key-based-authentication.html)）。

```
ubuntu~ $ cat new-key.pub >> .ssh/authorized_keys
```

ですけど、何となくこちらをいじるのは気持ち悪いので、今後も別ユーザーを作成することにし、こちらの`autorized_keys`には公開鍵を複数持たせることにしています。