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

  • 1
    いいね
  • 0
    コメント

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

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

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

という仕組みです。ですので、秘密鍵はその名の通り秘密です。たとえ個人メールやDropboxなどでも、ネット上である限りあげるべきではないようです(参考)。

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

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

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

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

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

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

下記はUbuntuインスタンスで行う場合の手順です(こちらを参考にしました)。

手順

(0)前提

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

(1)端末2において、鍵を生成する

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

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

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

(2)公開鍵を端末1に送る

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

(3)端末1からAWSへ公開鍵を送る

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がコピーされます。

(4)端末1からAWSにアクセス

pc1~ $ ssh -i mykey.pem ubuntu@111.111.111.111

ここからはサーバー内の作業です。

(5)ユーザーを作成する

下記で、コマンドのはじめが $になっているのはユーザーの
立場での作業、#になっているのは管理者の立場での作業です。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

(6)公開鍵を、新しいユーザーに登録する

root@~ # su - tarou
tarou@~ $ mkdir .ssh
tarou@~ $ sudo mv /home/ubuntu/id_rsa_ec2.pub .ssh/authorized_keys
tarou@~ $ sudo chown test-user. .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側も同じ設定になっています)。

(7)端末2からアクセスできるか実験

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

pc2~ $ ssh -i .ssh/id_rsa_ec2 tarou@111.111.111.111

認証用の鍵に先ほど作ったものを使い、ログイン先をubuntuではなくtarouに変更しています。うまくいっていれば、これでログインできるはずです。

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

tarou@~ $ sudo su - ubuntu

備考

なお、ここまで勉強して最後に気づいたのは、別のユーザーを立てなくても、デフォルトユーザーであるubuntuの公開鍵に新しいものを追加してしまえば良いのではないかということです。実は、authorized_keysには複数の公開鍵を定義することができます(参考)。

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

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