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
色々調べたのですが、各AWSのウェブサイトからは、鍵を1つしか設定できないようです。だとすると、別のユーザーがいたり、1人の作業だとしても複数のPCから使いたい場合にはどうすればいいでしょうか。1つだけしかない秘密鍵を共有するのでしょうか。
実は、ウェブ上で登録できる鍵は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_ec2
と id_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 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
側も同じ設定になっています)。
(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
には公開鍵を複数持たせることにしています。