Ubuntu ServerにSSHでログインする際に、ログインユーザのパスワードを使わずに秘密鍵と公開鍵を使うSSH公開鍵認証(SSH Public Key Authentication)のための設定手順です。公開鍵認証を使うことでパスワードを使わずにログインできるようになり、さらにUbuntu Serverのパスワード認証を禁止すればパスワード漏洩や総当たり攻撃への対策になります。
また、OpenSSH Authentication Agent (ssh-agent)に秘密鍵を登録して、SSHで接続する際のパスフレーズ入力を省略できるようにします。
秘密鍵と公開鍵の生成
MacやWindowsのターミナルを開いて、ssh-keygenコマンドで秘密鍵と公開鍵を作ります。これらの鍵はホームディレクトリ直下の.sshディレクトリに格納されます。
-tオプションでRSA暗号を使った鍵を生成します。-bオプションでは鍵のビット数を指定しています。省略すると3072ビットでssh-keygenのマニュアルにはこれでも十分と書かれていますが、GitHubのドキュメントには4096ビットで生成していますので、これに習います。
ssh-keygen -t rsa -b 4096
id_rsaとid_rsa.pub以外の名前で生成するときは-fオプションで指定することもできます。
ssh-keygen -t rsa -b 4096 -f 【id_rsa_hogehogeなどの秘密鍵のファイル名】
「Enter file in which to save the key」でEnterキーを押すと、id_rsaとid_rsa.pubというファイル名で秘密鍵と公開鍵が生成されます。「Enter passphrase」でパスフレーズを入力します。パスフレーズは確認のためにもう一度入力します。「Enter passphrase」でEnterキーのみ押した場合、パスフレーズなしの鍵が生成されます。
Generating public/private rsa key pair.
Enter file in which to save the key (【ホームディレクトリのパス】/.ssh/id_rsa):【Enterキーを押す】
Enter passphrase (empty for no passphrase): 【パスフレーズを入力する】
Enter same passphrase again: 【確認のため同じパスフレーズをもう一度入力する】
秘密鍵と公開鍵のファイル(末尾に.pubが付いている)はホームディレクトリ(~/)直下の.sshディレクトリに生成されます。
-rw------- 1 ローカルユーザ名 グループ名 3434 4 18 23:10 id_rsa
-rw-r--r-- 1 ローカルユーザ名 グループ名 743 4 18 23:10 id_rsa.pub
公開鍵の転送
Macの場合
Macでは、ssh-copy-idコマンドでUbuntu Serverに公開鍵を転送します。
ssh-copy-id -i ~/.ssh/id_rsa.pub 【ログインユーザ】@【UbuntuのIPアドレス】
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/・・・/.ssh/id_rsa.pub"
The authenticity of host '・・・' can't be established.
ED25519 key fingerprint is SHA256:・・・.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? 【もし尋ねられたらyesを入力する】
/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
【ログインユーザ】@【UbuntuのIPアドレス】's password: 【ログインユーザのパスワードを入力する】
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '【ログインユーザ】@【UbuntuのIPアドレス】'"
and check to make sure that only the key(s) you wanted were added.
Windowsの場合
Windowsではssh-copy-idコマンドが無いため、ターミナル(PowerShell)でcatコマンドとsshコマンドを使ってUbuntu Serverに公開鍵を転送します。
cat ~/.ssh/id_rsa.pub|ssh 【ログインユーザ】@【UbuntuのIPアドレス】 `
"mkdir -m 700 -p ~/.ssh; cat >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys"
The authenticity of host '・・・' can't be established.
ECDSA key fingerprint is SHA256:・・・.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 【もし尋ねられたらyesを入力する】
Warning: Permanently added '【UbuntuのIPアドレス】' (ECDSA) to the list of known hosts.
【ログインユーザ】@【UbuntuのIPアドレス】's password:【ログインユーザのパスワードを入力する】
公開鍵認証でのSSH接続
Ubuntu Serverにsshコマンドで接続すると、ログインユーザのパスワードではなく、秘密鍵と公開鍵を生成したときに入力したパスフレーズを入力するようになります。鍵の生成時にパスワード入力を省略していれば、SSHでログインする際のパスワード入力は省略されます。
$ ssh 【ログインユーザ】@【UbuntuのIPアドレス】
Enter passphrase for key '/【ホームディレクトリのパス】/.ssh/id_rsa':
$ ssh -i ~/.ssh/【秘密鍵のファイル名】 【ログインユーザ】@【UbuntuのIPアドレス】
Enter passphrase for key '/【ホームディレクトリのパス】/.ssh/秘密鍵のファイル名':
秘密鍵のファイル名がid_rsa以外の場合、~/.ssh/configというファイルを作れば「-i ~/.ssh/秘密鍵のファイル名」を省略できるようになります。
nano ~/.ssh/config
Host UbuntuのIPアドレス
IdentityFile ~/.ssh/秘密鍵のファイル名
Ubuntu Serverで~/.sshディレクトリの中を見ると、authorized_keysというファイルが出来ています。
ls -l ~/.ssh
total 4
-rw------- 1 ログインユーザ名 グループ名 743 4月 18 14:32 authorized_keys
もしauthorized_keysが600 (-rw——-) になっていない場合は以下のコマンドでファイルのパーミッションを変更します。
chmod 600 ~/.ssh/authorized_keys
Ubuntu Serverのパスワード認証を無効にする
Ubuntu ServerにSSH接続して、/etc/ssh/sshd_config.d/50-cloud-init.confの「PasswordAuthentication」を「no」にします。
この設定ファイルは/etc/ssh/sshd_configがインクルードしています。/etc/ssh/sshd_configで「PasswordAuthentication」を「no」に設定しても、Ubuntu Serverのパスワード認証は無効になりません。
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
PasswordAuthentication no
設定ファイルを保存したら、sshdを再起動します。
sudo systemctl restart sshd
認証エージェントへの秘密鍵の登録
認証エージェントを使うとSSH接続時のパスフレーズの入力を省略できます。
Macの場合
~/.ssh/configを編集して、キーチェーンに秘密鍵を登録するための設定を行います。
nano ~/.ssh/config
Host 【UbuntuのIPアドレス】
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/【秘密鍵のファイル名】
キーチェーンを使って認証エージェントに秘密鍵を登録します。
ssh-add --apple-use-keychain ~/.ssh/【秘密鍵のファイル名】
Enter passphrase for /【ホームディレクトリのパス】/.ssh/【秘密鍵のファイル名】: 【パスフレーズを入力する】
Identity added: /【ホームディレクトリのパス】/.ssh/【秘密鍵のファイル名】 (【Macのユーザ名】@【Macのコンピュータ名】)
Finderでアプリケーション→ユーティリティ→キーチェーンアクセスを起動してデフォルトキーチェーンの「iCloud」を選択すると、SSHのパスワードが保存されていることを確認できます。
この状態でsshコマンドを実行すると、秘密鍵のパスフレーズの入力は省略されるようになります。
Windowsの場合
Windowsのコントロールパネル→Windows ツール (あるいは管理ツール)→コンピュータの管理を開き、サービスとアプリケーション→サービスを選択して、「OpenSSH Authentication Agent」のスタートアップを「自動」に設定し、「開始」ボタンを押してサービスを起動します。
認証エージェントに秘密鍵を登録します。
# ~によるホームディレクトリの展開が動作しないので、代わりに$HOMEを使用
ssh-add $HOME\.ssh\【秘密鍵のファイル名】
Enter passphrase for 【ホームディレクトリのパス】\.ssh\【秘密鍵のファイル名】: 【パスフレーズを入力する】
Identity added: 【ホームディレクトリのパス】\.ssh\【秘密鍵のファイル名】 (【Windowsのユーザ名】@【Windowsのコンピュータ名】)