sshの鍵ファイルの扱いについて、いつも分からなくなってしまうのでメモ。鍵ペアの作り方、設置場所、使い方など。
更新日:2011/12/02
sshでパスワード認証をせずに鍵ファイルを使ってログインするには、まず公開鍵・秘密鍵の鍵ペアを作る必要がある。この鍵ペアは、サーバ側でもクライアント側でも、あるいはよそのPCでも、どこで作っても構わない(つまり、実際にログインに使用されるマシンで作る必要は無い)。
実際に鍵ファイルを作るには、LinuxやMac OS Xではssh-keygenコマンド、WindowsではTeraTermを使うと良い。以下、それぞれについて説明する。
まず、ターミナルから以下のようにssh-keygenコマンドに -t rsa を付けて実行する。他に-t rsa1(Version 1用)と-t dsa(Version 2用)があるけど、これらはもうobsoleteなのでRSA決め打ちで良い。
[ozuma@macbook ~]$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/ozuma/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again:
コマンドを実行すると、まずキーペアの保存先を指定される(Enter file in which to save the key)。初めてならばデフォルトで良いだろうけど、既存の設定と別にしたい場合は適当な違う場所を指定しよう。
次に鍵ファイルを扱うためのパスフレーズを設定しておく。誤解されることが多いが、これはsshサーバとの認証に使うわけではないので通信路には流れない。鍵ファイルを使う際に「ほどく」ために必要なものなので、鍵ファイルが盗まれた際の保険である。(つまり、鍵が盗まれても十分長いパスフレーズが設定されていれば、盗んだ人が総当たりで鍵を破ろうとしても時間がかかる。その間に鍵ファイルを交換してしまえば被害は出ない。この時間稼ぎのため、である。だからこのパスフレーズはパスワードではなく、文章の形で良いので長いフレーズを用いよう。詩の一節などが良いかもしれない)
パスフレーズは必要無ければ空っぽにしておけば良いので、そのままEnterキーを押せば、パスフレーズが空のファイルが作られる。正直、お仕事で使うちゃんとしたものならパスフレーズ付けた方がいいけど、個人がプライベートで使うぶんには付けなくて良いんじゃないかなぁ。というのが実感。
上記の設定が終わると、以下のメッセージが表示されて鍵ペアファイルが生成される。
Your identification has been saved in /home/ozuma/.ssh/id_rsa. Your public key has been saved in /home/ozuma/.ssh/id_rsa.pub. The key fingerprint is: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX ozuma@macbook
これで ~/.ssh/id_rsa(秘密鍵)と、~/.ssh/id_rsa_pub(公開鍵)が出来ている。
まずTeraTermを起動し、以下のようにメニューから「設定(S)」→「SSH鍵生成(N)」を選択する。
鍵の種類とビット数は、RSAの2048ビットが適当だろう。あとは「生成」ボタンをクリックするだけ。
鍵生成が終わったら、必要ならばパスフレーズを設定する(空っぽでも構わない)。「公開鍵の保存」「秘密鍵の保存」をそれぞれクリックして、鍵ペアファイルを保存する。公開鍵がid_rsa.pub、秘密鍵がid_rsaというファイル名になる。
出来上がった公開鍵と秘密鍵を、正しい場所に設置する。混乱することが多いので下表参照。
ログインする側(クライアント) | ログインされる側(サーバ) |
---|---|
秘密鍵(id_rsa)ファイルを、~/.ssh/に設置 | 公開鍵(id_rsa.pub)の中身を、~/.ssh/authorized_keysファイルに記入 |
公開鍵は、中身はただのテキストファイルである。この中身を、ログインしたいサーバの
~/.ssh/authorized_keys
というファイルに追記する(ファイルが無い場合は作成する)。またこのauthorized_keysファイルは、他人から見られることのないようにパーミッションを600(本人のみ読み書き可能)にしておく必要がある。
と、説明文を見るとややこしいだろうけど、要するに以下のコマンドを叩けば良い。この場合は、サーバ側にいったんコピーした公開鍵ファイルが~/.sshにあるとしている。
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys rm ~/.ssh/id_rsa.pub
3行目で、いったんauthorized_keysに内容を書いてしまえば、公開鍵ファイル自体は要らなくなるので消しておく。
サーバ側に公開鍵が設置できたら、秘密鍵を用いてクライアント側からssh接続を行う。以下、WindowsでTeraTermを使う場合と、LinuxやMac OS Xでsshコマンドを使う場合。
メニューの「新しい接続」でsshを選択すると、SSH認証のウインドウが表示される。
このウィンドウで「RSA/DSA鍵を使う」を選択してユーザ名とパスフレーズ(あれば)を入力して、続いて「秘密鍵(K)」をクリックして作成した秘密鍵id_rsaを選んで接続すれば良い。
Macならば標準のターミナル.appを使って接続すれば良い。
秘密鍵(id_rsa)ファイルを、~/.ssh/に設置していればそれがデフォルトで読み込まれる。そのため、以下のように接続先の[ユーザ名@ホスト名]と指定してsshコマンドを叩けば、そのままパスワード無しでログインできる。
$ ssh account@hoge.example.org
sshにはプロトコルバージョン1とプロトコルバージョン2があるが、1は現在は非推奨なので2を使った方が良い。もっとも現在のsshコマンドはデフォルトが2が使われるので普通に使っていれば大丈夫だろう。
ググって見つかるWebの記述や、sshのmanもまだ結構バージョン1と2の表記が入り混じっているので気をつけないといけない。具体的には、鍵ファイルの名前を「identity」と書いている文書などはssh1である。
どっちでも構わない。が、ログインする側(クライアント)が鍵ペアを作って、公開鍵をログインされる側(サーバ)に「これ置いて」と依頼するやり方が一般的で普通。
全く関係ないPCで作って構わない。普通に鍵ファイルを作ると公開鍵ファイルの末尾に「ログイン名@ホスト名」というコメントが付くけど、このコメントのホスト名と実際に使うホスト名は違っていて問題ないので気にしなくて良い。
それはsshプロトコルバージョン1で使われていたものだ。現在のバージョン2では利用しない。おそらくその文書は記述が古いので参照しない方が良いだろう。
公開鍵の中身を記入するのに、この"2"付きのファイルに書けという記述があるものがある。
これは、sshプロトコルバージョン1とバージョン2が混在していたときのために用意されていた機構。今は統合されたので、まとめてauthorized_keysに書いてしまって良い。