秘密鍵と公開鍵の鍵ペアを作って、認証を行う方法。
ローカル環境で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