晴耕雨読

working in the fields on fine days and reading books on rainy days

SSHで公開鍵認証 (~/.ssh/configの設定)

CentOS に ssh で公開鍵認証できるように設定する方法について説明します。

.ssh/config の設定

リモートへ接続するための ssh 接続の設定をします。 以下の設定をすることで ssh ユーザ名@ホスト名 の代わりに ssh centos のように、自分のつけた名前で ssh 接続できるようになります。

$ vim ~/.ssh/config

Host centos
  HostName 127.0.0.1
  User myname
  IdentityFile ~/.ssh/id_ed25519

秘密鍵と公開鍵を生成する

ssh-keygen コマンドで秘密鍵と公開鍵の生成します。 鍵の種類を楕円曲線暗号 ed25519 に変えると安全性が上がります。 古い環境でも使う必要がある場合は rsa を指定します。

$ ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

上記コマンドを実行すると、秘密鍵と公開鍵が以下のパスに作成されます。

  • 秘密鍵 : ~/.ssh/id_ed25519
  • 公開鍵 : ~/.ssh/id_ed25519.pub

サーバに公開鍵を登録する

サーバに公開鍵を登録する際は ssh-copy-id コマンドを使用します (ssh-copy-id がない場合は補足を参照)。 生成した公開鍵をリモートの ~/.ssh/authorized_keys に追加して、ディレクトリの作成や権限の設定なども行います 1

ssh-copy-idコマンド

ssh-copy-idコマンドでローカルにある秘密鍵を指定すると、 リモートへ公開鍵を送信し、~/.ssh/authorized_keys の作成や権限を適切に設定してくれます。 権限の設定は特に間違えやすいので、このコマンドを使うのがおすすめです。

$ ssh-copy-id -i ~/.ssh/id_ed25519 centos

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "~/.ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@127.0.0.1's password:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'centos'"
and check to make sure that only the key(s) you wanted were added.


パスワードを聞かれずにログインできることを確認する
$ ssh centos

以上です。


  1. ssh-copy-id コマンドがない場合は、以下を直打ちします。

    cat ~/.ssh/id_ed25519.pub | ssh ユーザ名@ホスト名 'mkdir -p ~/.ssh; chmod 700 ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys'
    

    上記を1行ずつ実行する場合は以下のようになります。

    cat ~/.ssh/id_ed25519.pub       # 出力はクリップボードにコピーしておく
    ssh ユーザ名@ホスト名
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    cat >> ~/.ssh/authorized_keys   # 貼り付けてCtrl+Cで抜ける
    chmod 600 ~/.ssh/authorized_keys
    

    最近のLinux環境であれば ssh-keygen と一緒に入っています。 ただし、Windowsの環境では ssh-copy-id は存在しないので、上記のコマンド群で対応するしかありません。