Ubuntu 24.xでSSHの認証鍵を設定する方法
2024年 9月12日 Posted 野々瀨(フロントエンドエンジニア)
今回は、Ubuntu 24.xの環境でSSHの認証鍵を設定する方法をご紹介しようと思います。苦労したこともあったので、それについてもメモ程度に残しておこうと思います。
前提条件
ここでは次の環境を前提に説明しています。
- サーバー側のOSはUbuntuの24.04
- ローカル(クライアント)側のOSはWindows 11
ユーザーの追加
* ユーザーを追加する必要がなければ、この手順は不要です。
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」に変更されたようです。