秘密鍵と公開鍵の鍵ペアを作って、認証を行う方法。
ローカル環境でssh-keygenを実行する。
$ ssh-keygen
ssh-keygenを実行すると、次の項目を設定することになる。
- 鍵の保存先。特に何も指定しなければ
/home/username/.ssh/id_rsaに保存される。 - パスフレーズ
パスフレーズとは、万が一秘密鍵が漏洩した場合などに備えて、秘密鍵に設定するパスワードである。
鍵の保存先とパスフレーズを決めると、鍵の保存先として指定したディレクトリに秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が生成されている。
ここで生成した公開鍵(id_rsa.pub)を認証を通したいサーバに公開鍵を配置する。認証を通したいサーバに公開鍵を配置するには、認証を通したいサーバの管理者等に問い合わせて配置してもらうといった必要がある。
公開鍵を配置するサーバの管理者は、公開鍵を認証を通したいユーザーのホームディレクトリ化の.sshディレクトリに受け取った公開鍵をauthorized_keysという名前で保存すると、公開鍵として設定できる。
公開鍵を配置したら、サーバの管理者は.sshディレクトリの所有権の変更(chown)とパーミッションの変更(chmod)を行う。
$ sudo chown -R username:username ~username/.ssh
$ sudo chmod 700 ~username/.ssh
$ sudo chmod 600 ~username/.ssh/authorized_keys
サーバに公開鍵を配置してもらったユーザーは、sshコマンドを実行して、ssh-keygenを実行した時に設定したパスフレーズを入力すると、認証を通したいサーバへログインできる。
例えば、usernameというユーザー名で、接続先サーバーのIPアドレスが192.168.11.14のときは、
$ ssh username@192.168.11.14
とすればよい。
sshを実行すると、パスワードの入力を求められるので、設定したパスフレーズを入力するとログインできる。
定期処理でscpを使いたいとき
パスフレーズを指定せずに秘密鍵を生成すると、自動的に鍵認証できる。
これを利用して、cronjobで登録したジョブに対して、鍵認証を必要とする処理を実行させることができる。
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yourname/.ssh/id_rsa): /home/yourname/.ssh/newkey
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
以上は、ssh-keygenコマンド実行後、パスフレーズ無しで鍵ペアをそれぞれnewkey, newkey.pubで生成する場合の例である。
Enter passphraseでパスフレーズの入力を求められるが、この時に何も入力せずにEnterを入力すると、パスフレーズ無しで秘密鍵を生成できる。
次に、生成した公開鍵をサーバ上に配置する。配置先のサーバに既に公開鍵が設定されている場合は、以下のように>>を利用して、既存の公開鍵に、新しい公開鍵を追加する。
$ scp ~/.ssh/newkey.pub username@192.168.11.14:/tmp/
$ ssh username@192.168.11.14
$ cat /tmp/newkey.pub >> ~/.ssh/authorized_keys
追加した公開鍵の行の先頭に、公開鍵で実行させたいコマンドを追記する。
command="実行させたいコマンド"
glrjn0239tjeroemgoirjipgj3ngu23tu1-grnov9ahuy5rg
xcvklmwoig40bnboaejrh02tjgfj2t-afogpdfjlasdnlxvl
...
実行させたいコマンドでscpを実行するしたいときは、ダウンロードする場合とアップロードする場合で、それぞれ-f,-tオプションを付ける。
command="scp -f /var/log/apache2/access.log" (ファイルをダウンロードしたいとき)
command="scp -t /home/username/Documents/doc.txt" (ファイルをアップロードしたいとき)
ローカルからコマンドを実行して、サーバ上の公開鍵に登録しておいたコマンドを実行する際は、サーバ上へ追加した公開鍵に対応する秘密鍵のパスを-iオプションを使って、指定してあげる必要がある。
指定する方法は、-iに続けて秘密鍵のファイル名を指定すればよい。
$ scp -i ~/.ssh/newkey username@192.168.11.14:/var/log/apache2/access.log /tmp/local/access.log