SSH公開鍵認証で安全にSSHを使う

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のコンピュータ名】)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメントの入力は終了しました。