セキュアなSSHサーバの構築と運用ガイド(Ubuntu上)
【概要】Ubuntu上でのセキュアなSSHサーバ構築はsshd_config設定と公開鍵認証で行う。ufwとFail2Banで防御し、パスワード認証は無効にする。Ubuntu 24.04ではsshd.socket再起動が必要である。ログ確認やデバッグ、緊急復旧の方法がある。
SSH サーバの設定(SSH サーバは Ubuntu マシン)
1. OpenSSHのインストール
SSH接続を行うクライアント機能と、接続を受け付けるサーバ機能の両方をインストールする。サーバ機自身が他のSSHサーバへ接続する可能性も考慮し、クライアントもインストールしておくと便利である。
1.1. パッケージリストの更新
# パッケージリストの情報を更新
sudo apt update
1.2. OpenSSH クライアントのインストール
sudo apt -y install openssh-client
1.3. OpenSSH サーバのインストール
sudo apt -y install openssh-server
2. SSHサーバ設定ファイル(/etc/ssh/sshd_config)の編集
SSHサーバの挙動を制御する主要な設定ファイル /etc/ssh/sshd_config を編集する。編集後はSSHサーバの再起動が必要である。この操作は、接続先(SSH サーバ側)のマシンで、システム管理者が実施する必要がある。
基本的なセキュリティ設定
- PermitRootLogin
- 推奨値 no(より安全)または prohibit-password
- 説明 rootユーザーによるSSHログインを制御する。no はrootログインを完全に禁止する(推奨)。prohibit-password はパスワード認証によるrootログインのみを禁止し、公開鍵認証など他の方法では許可するが、可能な限り no を選択すべきである。
- PermitEmptyPasswords
- 推奨値 no
- 説明 空のパスワードを持つアカウントのログインを禁止する。セキュリティ上、必須の設定である。
- MaxAuthTries
- 推奨値 3から6程度の小さな値(例:MaxAuthTries 3)
- 説明 1接続あたりの最大認証試行回数を制限する。ブルートフォース攻撃(パスワード総当たり攻撃)のリスクを低減する。
- HostKey
- 推奨値(例)
HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key
- 説明 サーバ認証に使用するホスト秘密鍵ファイルを指定する。複数の形式(RSA、ECDSA、Ed25519)を指定することで、多様なクライアントとの互換性を保つ。Ed25519は旧来のRSA鍵と比較して短いキーサイズながら同等以上のセキュリティを提供し、生成と検証が高速であるため、Ubuntu 24.04を含む最新環境で推奨される。デフォルトで有効になっていることが多いが、コメントアウト(行頭の #)されていないことを確認する必要がある。
- 推奨値(例)
ログ設定
- Subsystem sftp
- 推奨値 /usr/lib/openssh/sftp-server -l INFO
Subsystem sftp /usr/lib/openssh/sftp-server -l INFO
- 説明 SFTP(SSH File Transfer Protocol)機能の有効化と、ログレベルの設定を行う。-l INFO を指定することで、ファイル転送に関するログが /var/log/auth.log など(Syslog設定による)に出力されるようになる。
- 推奨値 /usr/lib/openssh/sftp-server -l INFO
(オプション)ポート番号の変更
- Port
- 設定例 Port 2222
- 説明 SSHサーバが待ち受けるポート番号を変更する(デフォルトは22番)。ポートスキャンによる自動攻撃をわずかに避けやすくするが、これ自体は本質的なセキュリティ対策ではない。変更する場合は、ファイアウォールの設定も合わせて変更する必要がある。SSH接続のセキュリティを強化するには、デフォルトの22番ポートから変更し、/etc/ssh/sshd_configでPort 2222などに設定することも有効である。
アクセス制御
- AllowUsers / AllowGroups
- 設定例
AllowUsers alice bob@192.168.1.100 charlie@10.0.0.0/16 AllowGroups sshusers admin
- 説明 SSHログインを許可するユーザー名やグループ名を指定する。AllowUsers ディレクティブでは、ユーザー名@IPアドレス/CIDR の形式で接続元IPアドレスによる制限も可能である。AllowGroups を使用する場合は、指定したグループに属するユーザーのみが許可される(/etc/group でグループ設定が必要)。これらを設定すると、リストにないユーザー/グループからのログインはすべて拒否されるため、アクセスを厳密に管理できる(ホワイトリスト方式)。
- ユーザーごとの詳細設定(例:X11Forwardingの有効化など)は、Match ブロックを使用して行う。例えば、Match User を使うと、指定したユーザーに対してのみ特定のオプションを適用できる。
- 例(Match User を含む設定)
AllowGroups wheel AllowUsers hoge1 hoge2 Match User hoge1 X11Forwarding yes AllowTcpForwarding yes Match User hoge2 X11Forwarding yes AllowTcpForwarding yes Match User hoge3 X11Forwarding yes AllowTcpForwarding yes
/etc/group の設定を忘れないこと。
例:AllowGroups wheel や AllowUsers hoge1 hoge2 のように設定した場合、/etc/group の wheel の行に、ログインさせたいユーザ hoge1、hoge2 が含まれるように設定する必要がある。
- 設定例
- ユーザ名とIPアドレスによるアクセス制限
- 設定例
AllowUsers you@192.168.0.0/16
- 設定例
3. 公開鍵認証の有効化
パスワード認証よりも安全な公開鍵認証を有効にする。
以下の操作は、接続先(SSH サーバ側)のマシンで、システム管理者が実施する。
/etc/ssh/sshd_config を編集する。
- PubkeyAuthentication
- 推奨値 yes
- 説明 公開鍵認証を有効にする。この設定が yes になっていない、またはコメントアウトされている場合は、yes に設定(またはコメント解除)する必要がある。
PubkeyAuthentication yes
- HostKey
- 確認 前述の「2. SSHサーバ設定ファイル(/etc/ssh/sshd_config)の編集」セクションで確認・設定した HostKey ディレクティブが有効(コメントアウトされていない)であることを再確認する必要がある。特に、利用したい鍵タイプ(例:ssh_host_ed25519_key)の行が有効になっているか確認する。
HostKey /etc/ssh/ssh_host_ed25519_key
設定変更後、SSHサーバを再起動して設定を反映させる。
# systemd を使用する最近の Ubuntu の場合(推奨)
# Ubuntu 24.04 LTS ではソケットアクティベーションを使用しているため、ssh.socketを再起動する
sudo systemctl restart ssh.socket
4. 接続ログの確認
SSHサーバへの接続試行や認証の成功・失敗に関するログは、通常 /var/log/auth.log に記録される。不審なアクセスがないか、設定が正しく反映されているかを確認するために、定期的にログを確認することが重要である。ログには、成功/失敗したログイン試行、使用された認証方法、接続元IPアドレスなどの情報が含まれる。
SSHログは/var/log/auth.logでモニタリング可能であり、tail -f /var/log/auth.logで不正アクセスの試みをリアルタイムで監視できる。
# ログ全体を表示
cat /var/log/auth.log
# "ssh" を含む行をフィルタリングして表示(より関連性の高いログのみ)
grep sshd /var/log/auth.log
# リアルタイムでログを監視
tail -f /var/log/auth.log
SSH サーバの再起動(Ubuntu の場合)
Ubuntu では、次のコマンドで SSH サーバを再起動する。設定ファイルの書き換えを行った場合には、再起動の後の動作確認を忘れないこと。Ubuntu 24.04 LTSではOpenSSHはデフォルトでsystemdソケットアクティベーションを使用しており、接続要求があるまでsshdが起動しないため、メモリ使用量を節約できる。設定変更後、sudo systemctl restart ssh.socketコマンドで変更を適用する必要がある。
# systemd を使用する最近の Ubuntu の場合(推奨)
sudo systemctl restart ssh.socket
5. TCP Wrapper による IP アドレス制限(注意点あり)
注意 TCP Wrapper(/etc/hosts.allow、/etc/hosts.deny)は、SSHサーバへのアクセス元 IP アドレスを制限する古典的な方法である。しかし、Ubuntu 24.04 LTSのOpenSSHではTCP Wrapperのサポートが廃止されたため、この手順は無効である。代わりにufwなどのファイアウォールでアクセス制御を行う必要がある。可能な限り、後述するファイアウォール(ufw など)を使用して IP アドレス制限を行うことを強く推奨する。
もし、利用している環境がUbuntu 24.04 LTS以前など、システムが TCP Wrapper をサポートしており、これを使用する場合は、以下の設定を行う。(システム管理者権限で実施)
- /etc/hosts.allow アクセスを許可するルールを記述する。
# 例:ローカルネットワーク(192.168.0.x)と特定の外部ネットワーク(1.2.3.x)からの sshd へのアクセスを許可 sshd: 192.168.0. sshd: 1.2.3.
(注意:記述形式(例:末尾のドット)は環境によって異なる場合がある)
例えば、192.168.0.0/255.255.0.0 からの ssh アクセスを許可するときは、/etc/hosts.allow を次のように設定する。
設定例
sshd: 192.168.0.0/255.255.0.0
範囲が複数あるときは、次のように複数行を書く。
sshd: 192.168.0.0/255.255.0.0 sshd: 1.2.3.0/255.255.255.0
- /etc/hosts.deny アクセスを拒否するルールを記述する。
/etc/hosts.allow で明示的に許可されていない全ての sshd へのアクセスを拒否するように設定する。
# 例:hosts.allow で明示的に許可されていない全ての sshd へのアクセスを拒否 sshd: ALL
設定ファイル編集後は、通常サービスの再起動は不要である。反映されない場合は試してみる。
6. ファイアウォール(ufw)によるアクセス制御
ufw(Uncomplicated Firewall)は、Ubuntu で標準的に利用可能なファイアウォール管理ツールである。不要なポートを閉じ、SSH アクセスを許可するポート(デフォルトは 22 番)のみを開けることで、セキュリティを強化する。
Ubuntu 24.04ではufwの設定でsudo ufw allow sshとsudo ufw enableを実行することで、SSHポートのみを許可するシンプルなファイアウォール設定が可能である。
基本的な設定手順(システム管理者権限で実施)
- ufw の有効化
sudo ufw enable
(有効化すると、既存の接続が切断される可能性があるため注意が必要である)
- デフォルトポリシーの設定(重要)
- 受信(Incoming)をすべて拒否
sudo ufw default deny incoming
- 送信(Outgoing)をすべて許可(一般的)
sudo ufw default allow outgoing
(デフォルトで受信を拒否することで、許可した通信以外はすべて遮断される)
- 受信(Incoming)をすべて拒否
- SSH ポートの許可
- デフォルトの SSH ポート(22)を許可
sudo ufw allow ssh
(これは sudo ufw allow 22/tcp と同等である)
- もし sshd_config でポート番号を変更した場合(例:2222)
sudo ufw allow 2222/tcp
- デフォルトの SSH ポート(22)を許可
- (オプション)他に必要なポートの許可
- Web サーバを運用している場合など
sudo ufw allow http # ポート 80 sudo ufw allow https # ポート 443
- Web サーバを運用している場合など
- (推奨)SSH ブルートフォース攻撃対策
sudo ufw limit ssh
- 説明 短時間に多数の接続試行があった場合に、その送信元からの接続を一時的に拒否する。sudo ufw allow ssh の代わりに、または追加で設定することで、パスワード総当たり攻撃などを緩和できる。UFWでSSHポートを制限する際にはsudo ufw limit sshコマンドを使用すると、ブルートフォース攻撃を効果的に防止できる。
- 設定状態の確認
sudo ufw status verbose
これらの設定により、許可されたポート以外へのアクセスは拒否され、SSH ポートへの不正アクセス試行も制限される。
7. Fail2Ban による不正アクセス試行の自動検知・防御
Fail2Ban は、サーバのログファイル(例:/var/log/auth.log)を監視し、不正アクセス試行(例:パスワード総当たり攻撃)を検知すると、その送信元 IP アドレスからのアクセスを一定期間自動的にファイアウォールでブロックするツールである。Fail2banはSSHに対するブルートフォース攻撃を自動検知・ブロックする強力なツールで、Ubuntu 24.04でもsudo apt install fail2banで簡単に導入できる。
以下の操作は、接続先(SSH サーバ側)のマシンで、システム管理者が実施する。
インストールと設定(システム管理者権限で実施)
- Fail2Ban のインストール
# パッケージリストの情報を更新 sudo apt update sudo apt -y install fail2ban
(インストール後、デフォルトで sshd 用の監視(jail)が有効になることが多い)
- sshd 監視状況の確認
sudo fail2ban-client status sshd
(sshd jail が有効になっていれば、基本的な設定は完了している)
- (オプション)カスタム ブラックリストフィルタの導入
- 記事で紹介されている方法は、公開されているブラックリストルールを導入する高度な設定である。
- 注意 GitHub の master ブランチから直接ファイルをダウンロードする方法は、将来的に内容が変更される可能性がある。安定した運用のためには、リリースタグなどを確認するか、プロジェクトのドキュメントに従うことを推奨する。
元の記事にある公開情報:https://github.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning
- 手順(記事記載の例)
# フィルタ定義ファイルのダウンロード sudo wget https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/filter.d/blacklist.conf -O /etc/fail2ban/filter.d/blacklist.conf # アクション定義ファイルのダウンロード sudo wget https://raw.githubusercontent.com/mitchellkrogza/Fail2Ban-Blacklist-JAIL-for-Repeat-Offenders-with-Perma-Extended-Banning/master/action.d/blacklist.conf -O /etc/fail2ban/action.d/blacklist.conf
- (オプション)カスタム jail の設定(jail.local)
- jail.conf を直接編集せず、設定の上書きや追加は /etc/fail2ban/jail.local に記述する。ファイルが存在しない場合は新規作成する。
- SSH不正ログイン対策の推奨設定
[DEFAULT] # デフォルトのBAN期間を設定(全jailに適用) bantime = 1h findtime = 10m maxretry = 5 [sshd] enabled = true port = ssh logpath = /var/log/auth.log maxretry = 3 bantime = 24h findtime = 10m
- 設定の説明
- bantime:BAN期間(1h=1時間、24h=24時間、-1=永久)
- findtime:試行回数をカウントする期間(10m=10分)
- maxretry:findtime内に許容する最大失敗回数
- logpath:監視するログファイル(SSHの場合は /var/log/auth.log)
- (オプション)より厳格な設定
セキュリティをさらに強化する場合は、以下の設定も検討できる。
[sshd] enabled = true port = ssh logpath = /var/log/auth.log maxretry = 2 bantime = 1w findtime = 5m [sshd-ddos] enabled = true port = ssh logpath = /var/log/auth.log maxretry = 10 bantime = 1h findtime = 1m
- sshd:通常の認証失敗を監視(2回失敗で1週間BAN)
- sshd-ddos:短時間の大量接続を監視(1分間に10回接続で1時間BAN)
- Fail2Ban サービスのリロード/再起動
- 設定ファイルを再読み込み
sudo fail2ban-client reload
- サービスを再起動(設定変更が大きい場合)
sudo systemctl restart fail2ban
- (必要であれば)SSH サービスも再起動
sudo systemctl restart ssh.socket # Ubuntu 24.04 LTS の場合 sudo systemctl restart ssh # それ以外の systemd 環境の場合
- 設定ファイルを再読み込み
- ログとブロック状況の確認
# Fail2Ban のログを確認 sudo cat /var/log/fail2ban.log # 現在 BAN されている IP を確認(sshd jail の場合) sudo fail2ban-client status sshd # (カスタム設定の場合)ブラックリストファイルの内容を確認 # cat /etc/fail2ban/ip.blacklist
II. クライアント側の設定:公開鍵認証の準備
パスワード認証の代わりに、より安全な公開鍵認証を利用するための設定をクライアントマシン(接続元の PC)で行う。
8. 公開鍵認証の仕組みとキーペア
公開鍵認証では、「秘密鍵」と「公開鍵」のペアを使用する。
- 秘密鍵(Private Key) あなただけが保持し、絶対に他人に知られてはいけない鍵である。クライアントマシンに保存する。
- 公開鍵(Public Key) 秘密鍵と対になる鍵である。接続先の SSH サーバに登録する。
ログイン時、サーバは公開鍵を使ってクライアントに「チャレンジ」を送り、クライアントは秘密鍵を使ってそれに正しく応答することで認証が行われる。パスワードのようにネットワーク上を流れないため、盗聴のリスクが低く、ブルートフォース攻撃も困難である。
このセクションでは、キーペアを生成し、公開鍵をサーバへ登録する手順を説明する。
9. キーペアの生成(クライアントマシンでの操作)
安全で高速な Ed25519 形式のキーペアを生成することを推奨する(強度が高く、処理速度も速いため)。Ubuntu 24.04でもEd25519鍵が推奨されており、ssh-keygen -t ed25519 -C "your_email@example.com"コマンドでより安全な鍵を生成できる。
以下の操作は、接続元(ユーザマシン)で、各ユーザが行う。SSHキーは個人単位で発行し、共有せず、定期的なローテーション(年に1回程度)を行うことがベストプラクティスである。
9.1. Windows の場合(MobaXterm を使用)
- MobaXterm のインストール
【サイト内の関連ページ】
- Windows での MobaXterm のインストール:別ページ »で説明
- Windows でのリモート接続、ファイル転送ソフト MobaXterm Personal 版のインストール(winget を使用しない)と利用:別ページ »で説明
Windows マシン の場合は、MobaXTermをインストールし、それに内蔵の ssh-keygen、ssh を使うのが便利である。
- MobaXterm の起動とターミナル操作
MobaXterm を起動し、ローカルターミナルを開く。(通常、ユーザのプロファイル内に鍵を保存するため管理者権限は不要である。環境によっては管理者権限が必要な場合もある。)
Windows のコマンドプロンプトを管理者として実行するには、検索窓で「cmd」と入れたあと、右クリックメニューで「管理者として実行」を選ぶのが簡単である。
- キーペア生成コマンドの実行
「ssh-keygen」を使う。公開鍵は、接続先(SSH サーバ側)の所定のファイルに追加して使う。
ターミナルで次を実行する。
ssh-keygen -t ed25519 -C "your_email@example.com"
- -t ed25519:キータイプとして Ed25519 を指定する。
- -C "コメント":鍵の識別用コメント。通常はメールアドレスなどを入れるが、空でも構わない(-C '')。
- 保存場所の指定
Enter file in which to save the key (/home/mobaxterm/.ssh/id_ed25519):
通常は Enter キーを押してデフォルトの場所(%USERPROFILE%\Documents\MobaXterm\home\.ssh\id_ed25519 など)に保存する。
- パスフレーズの設定(重要)
Enter passphrase (empty for no passphrase):
秘密鍵を保護するためのパスフレーズを入力する。パスフレーズを設定することを強く推奨する。 これにより、万が一秘密鍵ファイルが盗まれても、パスフレーズがなければ悪用できない。確認のため、同じパスフレーズを再入力する。入力中、画面には表示されない。
- 生成ファイルの確認
デフォルトの場所に id_ed25519(秘密鍵)と id_ed25519.pub(公開鍵)の2つのファイルが生成されたことを確認する。
cd /d c:%HOMEPATH%\Documents\MobaXterm\home\.ssh dir /w
- (参考)MobaXterm のデフォルト設定について
「キーペアのファイルを MobaXterm の配下にコピーする」手順は、ssh-keygen を MobaXterm 外で実行した場合や、特定の場所に鍵を置きたい場合の手順である。MobaXterm 内のローカルターミナルで生成した場合、通常は適切な場所(上記デフォルトの場所)に直接保存されるため、このコピー手順は不要である。
<Documents のフォルダ>\MobaXterm\home\.ssh に id_ed25519、id_ed25519.pub をコピーする
- (参考)FileZilla での利用
FileZillaなどの PuTTY ベースのツールを使うときは、生成した秘密鍵ファイル(id_ed25519)を設定する必要がある。FileZilla は PuTTY 形式の鍵(.ppk)を要求するため、初回設定時に OpenSSH 形式の秘密鍵を .ppk 形式に変換するかどうか尋ねられる。「はい」を選択すると変換が行われる。
SFTP、「鍵ファイル」、鍵ファイルとして先ほど生成した id_ed25519 を設定する。
設定すると、「対応していません。ファイルを変換しますか」のように表示される。ここで、「はい」を選ぶ。ppk ファイルへの変換が自動で行われ、次のように表示される。
9.2. Ubuntu(または他の Linux/macOS)の場合
- ターミナルを開く
- キーペア生成コマンドの実行
「ssh-keygen」を使う。公開鍵は、接続先(SSH サーバ側)の所定のファイルに追加して使う。
ssh-keygen -t ed25519 -C "your_email@example.com"
- 保存場所の指定
Enter file in which to save the key (/home/your_username/.ssh/id_ed25519):
通常は Enter キーを押してデフォルトの場所($HOME/.ssh/id_ed25519)に保存する。
- パスフレーズの設定(重要)
Windows の場合と同様に、秘密鍵を保護するためのパスフレーズを設定することを強く推奨する。確認のため、同じパスフレーズを再入力する。入力中、画面には表示されない。
- 生成ファイルの確認
$HOME/.ssh/ ディレクトリに id_ed25519(秘密鍵)と id_ed25519.pub(公開鍵)が生成されたことを確認する。
cd $HOME/.ssh ls
10. 公開鍵のサーバへの登録(クライアントマシンから操作)
生成した公開鍵(id_ed25519.pub)の内容を、接続先 SSH サーバの ~/.ssh/authorized_keys ファイルに追記する必要がある。
10.1. 推奨方法:ssh-copy-id コマンド(利用可能な場合)
ssh-copy-id は公開鍵をサーバに簡単かつ安全にコピーするための専用コマンドである。Linux、macOS、MobaXterm、Git Bash などで利用可能である。
ssh-copy-id -i ~/.ssh/id_ed25519.pub ユーザー名@接続先サーバアドレス
- -i ~/.ssh/id_ed25519.pub:使用する公開鍵ファイルを指定する(省略するとデフォルトを探す)。Windows(MobaXterm)の場合は -i /home/mobaxterm/.ssh/id_ed25519.pub のようになる場合がある。
- ユーザー名@接続先サーバアドレス:サーバのユーザー名とホスト名または IP アドレス。
実行すると、サーバのパスワード(まだパスワード認証が無効になっていない場合)または既存の鍵のパスフレーズを求められる。認証に成功すると、公開鍵がサーバの ~/.ssh/authorized_keys に適切に追加される。
10.2. 代替方法:手動コピー
ssh-copy-id が使えない場合、手動で公開鍵の内容をコピーする。
Windows(MobaXterm/コマンドプロンプト)
「mkdir -p ~/.ssh」は .ssh ディレクトリを作るためのもの(存在しない場合)。パーミッション設定も同時に行う。
:: 公開鍵の内容をクリップボードにコピーするか、以下のコマンドでパイプする
type %USERPROFILE%\Documents\MobaXterm\home\.ssh\id_ed25519.pub | ssh ユーザー名@接続先サーバアドレス "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
:: 実行後、接続先サーバのパスワードを求められる
Ubuntu(または他の Linux/macOS)
「mkdir -p ~/.ssh」は .ssh ディレクトリを作るためのもの(存在しない場合)。パーミッション設定も同時に行う。
# 公開鍵の内容をサーバに追記するコマンド
cat ~/.ssh/id_ed25519.pub | ssh ユーザー名@接続先サーバアドレス "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# 実行後、接続先サーバのパスワードを求められる
- これらのコマンドは、サーバ上で ~/.ssh ディレクトリを作成(存在しない場合)し、適切なパーミッション(ディレクトリに 700)を設定し、公開鍵の内容を authorized_keys ファイルに追記し、そのファイルにも適切なパーミッション(600)を設定する。
- 実行時にサーバのパスワード(または既存の鍵のパスフレーズ)を求められる。
11. 公開鍵認証でのログイン試行
公開鍵をサーバに登録したら、実際にログインできるか試す。
ssh ユーザー名@接続先サーバアドレス
今度はサーバのパスワードではなく、キーペア生成時に設定したパスフレーズを求められるはずである(Enter passphrase for key ...)。正しくパスフレーズを入力してログインできれば、公開鍵認証の設定は成功である。
(MobaXterm や他の GUI クライアントを使用している場合は、接続設定で秘密鍵ファイル(例:id_ed25519)を指定する必要があるかもしれない。)
(FileZilla など PuTTY ベースのツールで SFTP 接続する場合、Ed25519 秘密鍵を PuTTY 形式(.ppk)に変換する必要がある場合がある。ツールの指示に従う。)
(補足)SSHエージェントの利用
秘密鍵にパスフレーズを設定した場合、接続ごとにパスフレーズの入力が必要となる。これを省略するためには、SSHエージェントを利用する方法がある。SSHエージェントを活用することで、セキュリティを維持しながら再入力の手間を省くことができる。
SSHエージェントは秘密鍵をメモリ上に保持し、認証時に自動でパスフレーズを入力する。多くのSSHクライアントに付属しており、一度秘密鍵をエージェントに登録すれば、ターミナルを閉じたりシステムを再起動するまでパスフレーズの入力が不要となる。MobaXtermや標準的なLinux/macOS環境でも利用可能である。
(秘密鍵のパスフレーズを変更するにはssh-keygen -p -f ~/.ssh/id_ed25519コマンドを使用する)
III. 最終的なセキュリティ強化
12. パスワード認証の無効化(重要)
公開鍵認証でのログインが確実に機能することを確認したら、セキュリティを最大限に高めるために、従来のパスワード認証を無効にする。これにより、パスワードを知っていても SSH ログインはできなくなり、ブルートフォース攻撃のリスクが大幅に減少する。
警告 この設定を行う前に、必ず公開鍵認証でログインできることをテストする必要がある。 もし公開鍵認証に失敗していてパスワード認証を無効にすると、SSH でサーバにログインできなくなる可能性がある。パスワード認証を完全に無効化するのがベストプラクティスである。
以下の操作は、接続先(SSH サーバ側)のマシンで、システム管理者が実施する。
- /etc/ssh/sshd_config を編集する。
PasswordAuthentication no
- この行がコメントアウトされているか yes になっている場合は、no に変更する。
- SSH サーバを再起動して設定を反映させる。
# systemd を使用する最近の Ubuntu の場合(推奨) # Ubuntu 24.04 LTS ではソケットアクティベーションを使用しているため、ssh.socketを再起動する必要がある。 sudo systemctl restart ssh.socket
Ubuntu 24.04ではOpenSSHはデフォルトでsystemdソケットアクティベーションを使用しており、接続要求があるまでsshdが起動しないため、メモリ使用量を節約できる。設定変更後、sudo systemctl restart ssh.socketコマンドで変更を適用する必要がある。
これ以降、パスワードによる SSH ログインは拒否され、有効な秘密鍵を持つクライアントのみが(パスフレーズ入力後に)ログインできるようになる。
IV. トラブルシューティング
SSH 接続で問題が発生した場合の基本的な切り分け手順である。
13. サーバ側でのデバッグ
SSH サーバの動作状況を詳細に確認するには、現在動作中の SSH サービスを停止し、デバッグモードで手動起動する。
(SSH接続の詳細ログを取得するには、/etc/ssh/sshd_configでLogLevel VERBOSEまたはLogLevel DEBUGに設定する方法もある)
- 既存の SSH サービスを停止
sudo systemctl stop ssh.socket # Ubuntu 24.04 LTS の場合 sudo systemctl stop ssh # それ以外の systemd 環境の場合
- デバッグモードで SSH サーバを起動
sudo /usr/sbin/sshd -d -p <ポート番号>
- -d:デバッグモードを有効にする。接続試行の詳細なログがコンソールに出力される。
- -p <ポート番号>:SSH サーバが待ち受けるポート番号を指定する。デフォルト(22)以外を使用している場合は指定が必要である。
(このプロセスはフォアグラウンドで実行されるため、Ctrl+C で停止できる。確認が終わったら、sudo systemctl start ssh.socket または sudo systemctl start ssh などでサービスを再開する必要がある)
サーバ側でのSSHデバッグモードはsudo sshd -d -p ポート番号で実行できることを覚えておく。
14. クライアント側でのデバッグ
接続元クライアントから接続を試みる際に、詳細な情報を表示させることで問題の原因特定に役立つ。
ssh -v ユーザー名@接続先サーバアドレス
- -v:Verbose モード。接続のネゴシエーション過程や認証試行の詳細を表示する。
- -vv や -vvv のように v を増やすと、さらに詳細な情報が表示される。
SSHのデバッグに ssh -v または -vv、-vvv オプションを使用すると、接続問題のトラブルシューティングに役立つ。
サーバ側とクライアント側のデバッグ情報を組み合わせることで、設定ミス、鍵の不一致、パーミッションの問題、ファイアウォールによるブロックなど、多くの問題の原因を特定できる。
(補足)緊急時のSSH接続復旧
ファイアウォール設定ミスやsshd_configの誤りなどにより、SSH接続が完全にできなくなった場合、以下の方法で復旧を試みる。
- ローカルコンソールからのログイン サーバーが物理的に操作可能な場所にある場合、モニター、キーボード、マウスを接続して直接ログインし、設定ファイルを修正するか、SSHサービスを再起動する。
- リカバリモードからの起動 サーバーがリモートにあり、物理操作が困難な場合、クラウドサービスの場合は管理コンソールからリカバリモードで起動し、問題のある設定ファイルを修正後、通常起動に戻す。自身で設置したサーバーの場合は、インストールメディアなどから起動してファイルシステムをマウントし、設定ファイルを修正する。
- 管理用の別ネットワークやポートの利用 可能であれば、通常のSSHとは別のポートや、帯域外管理(IPMI/iLO/iDRACなど)を利用したコンソール接続手段を準備しておくことが推奨される。
【サイト内の関連ページ】