SSHの公開鍵認証の設定とrsyncの設定まとめ

SSHを利用する場合、パスワード認証と公開鍵認証の2つの認証方式が使用できます。公開鍵認証とは秘密鍵と公開鍵のペアで認証を行う方式のことです。ローカル環境で秘密鍵と公開鍵のペアを生成し、公開鍵をリモート環境に保存、ローカルの秘密鍵とリモートの公開鍵で認証を行うので、ネットワーク上にパスワードが流れることがなく、セキュリティリを高めることができます。秘密鍵は漏洩してはいけませんが、公開鍵は公開しても問題ありません。

設定方法

ローカル側での設定

ローカルで秘密鍵と公開鍵のペアを生成し公開鍵をリモートに保存します。リモートで鍵を生成し、秘密鍵をローカルに転送することも可能ですが、転送中に秘密鍵が漏れると、公開鍵認証の意味がなくなってしまうので、ローカル側で生成したものを使用するようにします。

# リモートのユーザー名 : hoge
# リモートのホスト名   : example.com
# リモートのディレクトリ名 : /home/hoge/
# リモートのSSHポート番号 : 20022
# ローカル側で秘密鍵と公開鍵のペアを生成
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #「Enter」を押す
Enter passphrase (empty for no passphrase): # 秘密鍵のパスフレーズを入力
Enter same passphrase again: # もう一度

# 他のユーザーに見られないようにパーミッションを変更
$ chmod 600 .ssh/id_rsa

# リモートに公開鍵を転送
$ scp -P 20022 .ssh/id_rsa.pub hoge@example.com:/home/hoge/.ssh/
hoge@example.com's password: # リモートのパスワードを入力

秘密鍵のパスフレーズは、もし秘密鍵が漏洩したときにパスフレーズを知らないと使用できないようにするための設定です。設定するとSSH接続するときに秘密鍵のパスフレーズを聞かれるようになります。もしrsync + cronで自動バックアップをする場合など、パスフレーズの入力があると自動化ができないので、その場合は、パスフレーズを未設定にする必要があります。

リモート側での設定

リモート側で公開鍵の設定。

# 他のユーザーに見られないようにパーミッションを変更(未設定の場合)
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys

# 転送されてきた公開鍵をリネーム
$ mv .ssh/id_rsa.pub .ssh/authorized_keys

# 既に他のホストの公開鍵が設定されている場合はリネームでなく追記する
$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys
$ rm .ssh/id_rsa.pub

sshd_conf

SSHは、デフォルトではパスワード認証が有効になっており、公開鍵認証を設定してもパスワード認証が有効だとセキュリティ的によろしくありませんので、パスワード認証は使用しないように設定したほうが良いでしょう。リモート側で、SSHの設定ファイルであるsshd_configを編集します。

$ sudo vi /etc/ssh/sshd_config
# 公開鍵認証を許可(ssh2のみ)
PubkeyAuthentication yes       
# 公開鍵の場所
AuthorizedKeysFile .ssh/authorized_keys
# パスワードでのログインを禁止
PasswordAuthentication no
# rootでのログインを禁止
PermitRootLogin no
# パスワードなしのログインを許可しない
PermiyEmptyPasswords no

# 再起動を忘れずに!
$ service sshd restart

rsyncを使う場合

ついでにrsyncを使う場合の方法も記しておきます。rsyncはファイルやディレクトリを転送するためのコマンドです。リモートのファイルやディレクトリをローカルに転送したり、ローカルのファイルやディレクトリをリモートに転送することができるので、バックアップ作業を行うときに活躍します。

# 書式 : rsync [オプション] 転送元 転送先
# ローカルのファイルをリモートに転送する場合
# ローカルのディレクトリ : /home/backup/backup.gzip
# リモートのユーザ名     : hoge
# リモートのホスト名     : example.com
# リモートの転送先ディレクトリ : /home/hoge/backup/
$ rsync -avz /home/backup/backup.gzip hoge@example.com:/home/hoge/backup/

# ポート番号が標準の22以外の場合
$ rsync -avze "ssh -p ポート番号" /home/backup/backup.gzip hoge@example.com:/home/hoge/backup/

rsyncのオプションはこちらが参考になりました。

冒頭でも書きましたが、もしrsync + cronで自動バックアップをする場合は、秘密鍵のパスフレーズが設定されていると自動化ができないので、パスフレーズを未設定にする必要があります。

  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。