Ubuntu 24.xでSSHの認証鍵を設定する方法

2024年 9月12日 Posted 野々瀨(フロントエンドエンジニア)

今回は、Ubuntu 24.xの環境でSSHの認証鍵を設定する方法をご紹介しようと思います。苦労したこともあったので、それについてもメモ程度に残しておこうと思います。

前提条件

ここでは次の環境を前提に説明しています。

ユーザーの追加

* ユーザーを追加する必要がなければ、この手順は不要です。

sudo権限のあるユーザーでサーバーにログインします。

useraddコマンドで新しくユーザーを作成します。なお、-mオプションを付けることでホームディレクトリーを作成します。

構文(ホームディレクトリーなし):useradd ユーザー名構文(ホームディレクトリーあり):useradd -m ユーザー名

* 以降、例として表現されるユーザー名は「my_user」です。

sudo useradd -m my_user

passwdコマンドで新しく作成したユーザーのパスワードを設定します。コマンドを実行するとパスワードの入力を2回求められますので入力します。

構文:passwd ユーザー名

sudo passwd my_user

sudo権限を付与したい場合は、gpasswdコマンドでsudoのグループに所属させます。-aオプションでグループに追加します。通常sudo権限のあるグループ名は「wheel」ですが、Ubuntuでは、「sudo」がsudo権限のあるグループ名です。

構文:gpasswd -a ユーザー名 グループ名

sudo gpasswd -a my_user sudo

なお、usermodコマンドの-Gオプションでもグループを所属させることができます。

構文:usermod -G グループ名 ユーザー名

sudo usermod -G sudo my_user

認証鍵の作成

ローカル(クライアント)でコマンドラインツールを起動します(Windowsの場合コマンドプロンプトなど)。

ssh-keygenコマンドで認証鍵を作成します。 ssh-keygenコマンドを実行しますと、初期ではアルゴリズムが「RSA」で作成されます。しかし、Ubuntu 22以降ではOpen SSHが8.8となり、RSAが初期で無効化され、通常ではRSAの鍵は使用できなくなりました。そこで-tオプションを付けてアルゴリズムを指定します。

ssh-keygen -t ed25519

アルゴリズムは主に次の指定ができます。

アルゴリズム設定値
RSA rsa
DSA dsa
ECDSA ecdsa
Ed25519 ed25519

また、鍵の内容にコメントが設定されますが、初期ではコンピューター名が設定されます。任意にコメントを指定したい場合は、-Cオプションを付けます。

ssh-keygen -t ed25519 -C コメント

話を戻し、ssh-keygenコマンドを実行すると幾つかの質問が表示されます。

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\ユーザー名/.ssh/id_ed25519):

鍵を保存するファイル名を指定します。初期では丸括弧にあるように、先頭に「id_」を付けたアルゴリズム名で保存されます。変更がなければそのままEnterキーを押します。

Enter passphrase (empty for no passphrase):

パスフレーズを入力し、Enterキーを押します。設定しない場合はそのままEnterキーを押します。

Enter same passphrase again:

もう一度パスフレーズを入力し、Enterキーを押します。設定しない場合はそのままEnterキーを押します。

これで鍵がホームディレクトリーの「.ssh」ディレクトリーに保存されます。(「.ssh」ディレクトリーがホームディレクトリーになければ新規作成されます。)

今回のコマンド例では、秘密鍵が「id_ed25519」、公開鍵が「id_ed25519.pub」で保存されます。

なお、保存先を変更する場合は-fオプションをファイル名を含めたフルパスで指定します。

構文:ssh-keygen -f ファイルのフルパス

ssh-keygen -f D:/foo/ssh_xxx

ユーザーに公開鍵を設定

新しく公開鍵を設定する場合

サーバーに公開鍵を設定する対象のユーザーでログインします。

ホームディレクトリーに「.ssh」ディレクトリーがない場合は作成します。cdコマンドでホームディレクトリーへ移動します。

cd ~

mkdirコマンドで「.ssh」ディレクトリーを作成します。

mkdir .ssh

chmodコマンドでパーミッションを変更します。

chmod 700 .ssh

いったんローカル(クライアント)へ戻り、scpコマンドを使用して公開鍵のファイルをサーバーへ転送します。

scp 公開鍵のファイルパス ユーザー名@IPまたはホスト名:転送先ファイルパス
scp C:/Users/Taro/.ssh/id_ed25519.pub my_user@123.456.789.012:~/.ssh/authorized_keys

このコマンドではローカル(クライアント)のid_ed25519.pubという公開鍵のファイルをサーバーのホームディレクトリーにある.sshディレクトリーに、ファイル名「authorized_keys」として転送します。

転送した公開鍵のファイルのパーミッションを変更します。

chmod 600 ~/.ssh/authorized_keys

既に別の公開鍵を設定している場合

ローカル(クライアント)にあるid_ed25519.pubファイルを開き、中身をクリップボードにコピーします。

サーバーに公開鍵を設定する対象のユーザーでログインします。

ホームディレクトリーにある.ssh/authorized_keysファイルを編集します。

vi ~/.ssh/authorized_keys

先ほどコピーしたid_ed25519.pubの内容を行末に貼り付けます。

保存します。

SSHの設定変更

* 既に設定変更していれば、この手順は不要です。

SSHの設定を変更します。

cpコマンドを使用してSSHの設定ファイル「/etc/ssh/sshd_config」のバックアップをとります。

cp /etc/ssh/sshd_config /etc/ssh/sshd_config_bk

SSHの設定ファイルを編集します。

vi /etc/ssh/sshd_config

次の項目をコメントアウトを外し、設定値を変更します。

設定項目設定値(変更後)説明
PermitRootLogin no rootでのログインを許可するかどうかを設定します。セキュリティ上の理由によりnoにし無効化します。
PasswordAuthentication no パスワードによる認証にするかどうかを設定します。認証鍵のパスフレーズにするためnoにし無効化します。
PermitEmptyPasswords no 空パスワードを許可するかどうかを設定します。PasswordAuthenticationでnoにしていますが、念のためセキュリティ上の理由によりnoにし無効化します。

保存しSSHを再起動します。

/etc/init.d/ssh restart

SSHのポート番号変更

SSHのポートの既定値は「22」ですが、セキュリティ上の理由により変更します。

cpコマンドを使用してSSH Socketの設定ファイル「/etc/ssh/sshd_config」のバックアップをとります。

cp /lib/systemd/system/ssh.socket /lib/systemd/system/ssh_bk.socket

SSH Socketの設定ファイルを編集します。

vi /lib/systemd/system/ssh.socket

ListenStreamを複製し最初の行を空に、複製した行を任意の番号へ設定します。なお最初の行を空白にしたのは、既定値の22ポートのエントリーを削除するというものです。

ListenStream=
ListenStream=2222

保存しSSH Socketを再起動します。

systemctl restart ssh.socket

systemdを再起動します。

systemctl daemon-reload

ファイアウォールの設定

UbuntuのファイアウォールはUFW(Uncomplicated FireWall)によって管理します。ufwコマンドで設定します。

ufw statusコマンドで有効になっているかを確認します。

sudo ufw status

もし「Status: inactive」と表示されていたら無効になっていますので、ufw enableコマンドで有効にします。

sudo ufw enable

ufw allowコマンドで/lib/systemd/system/ssh.socketで設定したポートを解放します。

* 通常IPv4とIPv6両方が設定されます。

構文:ufw allow ポート番号

sudo ufw allow 2222

設定できたか確認します。

sudo ufw status

UFWを再起動します。

sudo ufw reload

設定の削除

もし解放中のポートを削除したい場合は、ufw deleteコマンドを使用します。ufw delete ルート番号コマンドとルート番号という行番号のようなもので指定します。ルート番号はufw status numberedコマンドで知ることができます。

sudo ufw status numbered

番号が分かったらufw deleteコマンドでルート番号を指定し実行します。対象の内容が表示され削除してよいか質問されますので、yと入力します。

sudo ufw delete 2

なお削除後、ルート番号が振り直されますのでご注意ください。

SSHの接続

SSHで接続できることを確認します。確認方法はなんでもよいですが、ここではsshコマンドで確認していきます。

構文:ssh -i 秘密鍵のファイルパス ユーザー名@IPまたはホスト名 -p ポート番号

-iオプションで秘密鍵のファイルをフルパスで、-pオプションでポート番号を指定します。

ssh -i C:/Users/Taro/.ssh/id_ed25519 my_user@123.456.789.012 -p 2222

パスフレーズを入力し、無事ログインできれば完了です。

つまずいたこと

対応している中で幾つかつまずいたことがありましたので、こちらも残しておこうと思います。

認証鍵のアルゴリズム

以前作成した鍵を使用しようと思い、RSAの認証鍵を設定しました。しかし、SSHで鍵を使用してログインしようとしてもログインすることができませんでした。

本記事でも書きましたが、Ubuntu 22以降ではOpen SSHが8.8となり、RSAが初期で無効化されていて、通常ではRSAの鍵は使用できなくなりました。

SSHのログファイル

LinuxのSSHのログは通常「/var/log/secure」ファイルに書き込まれます。しかし、Ubuntuでは「/var/log/auth.log」ファイルに書き込まれるようです。

SSHのポート番号変更

SSHのポート番号の設定は「/etc/ssh/sshd_config」ファイルにある「Port」で行うはずでした。しかしUbuntu 22.10からは「/lib/systemd/system/ssh.socket」に変更されたようです。