0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

古いLIFEBOOKをUbuntu開発機にする【2. OpenSSH Server導入編】

0
Last updated at Posted at 2026-09-09

目次


はじめに

メインPCのDELLでフリーズやWSL切断などの不調が発生し、原因調査や修理中も開発を止めないため、以前使っていた古いLIFEBOOKをUbuntu開発機として再利用することにしました。

第1回では、LIFEBOOKへ Ubuntu 24.04.4 LTS Desktop をインストールしました。

今回の第2回では、メインPCのWindowsから家庭内LAN経由でLIFEBOOKを操作できるように、OpenSSH Serverを導入し、公開鍵認証・SSHのセキュリティ強化・UFW設定まで行います。

最終的には、Windows側から次のように接続できる状態を目指します。

WindowsメインPC
    │
    │ 家庭内LAN
    │ SSH公開鍵認証
    ▼
LIFEBOOK
Ubuntu 24.04.4 LTS Desktop
    ├─ OpenSSH Server
    ├─ Git
    ├─ Docker Engine
    └─ Laravel / Sail

今回のSSHは家庭内LAN専用です。ルーターでTCP/22をインターネットへポート開放する運用にはしません。

次回以降、WindowsのVS Codeから Remote - SSH でLIFEBOOKへ接続し、LIFEBOOK側のDocker上でLaravel等を動かす予定です。

そのため今回は、OpenSSHの導入だけで終わらせず、公開鍵認証とファイアウォールまで設定します。


今回の導入環境

項目 内容
PC 富士通 LIFEBOOK AH52/C
型名 FMVA52CBJ
CPU Intel Pentium P6200 2.13GHz
メモリ 8GB
ストレージ 256GB SSD
OS Ubuntu 24.04.4 LTS Desktop
アーキテクチャ x86_64
Ubuntuユーザー honta
接続元 Windows / PowerShell 7
Windows側IPv4 192.168.11.2
LIFEBOOK側IPv4 192.168.11.9/24
家庭内LAN 192.168.11.0/24
接続方式 家庭内Wi-Fi / LAN
OpenSSH Server導入時バージョン 1:9.6p1-3ubuntu13.18

192.168.11.9 は今回の環境でDHCPにより取得したIPv4アドレスです。

別環境ではアドレスやサブネットが異なります。この記事の値をそのままコピーせず、必ず自分の環境で ip コマンド等を使って確認してください。


今回作る構成

SSHの認証・ファイアウォールは最終的に次の構成にしました。

Windows
  │
  │ ssh lifebook
  │ Ed25519公開鍵認証
  ▼
UFW
  │
  │ 192.168.11.0/24 → TCP/22 のみ許可
  ▼
OpenSSH Server
  ├─ PubkeyAuthentication yes
  ├─ PasswordAuthentication no
  ├─ KbdInteractiveAuthentication no
  ├─ PermitRootLogin no
  └─ AllowTcpForwarding yes

AllowTcpForwarding yes は、後続のVS Code Remote - SSHでSSHトンネルを利用するため維持しています。


1. Ubuntuの状態を確認する

いきなりOpenSSH Serverをインストールせず、まずUbuntu実機の状態を確認しました。

lsb_release -a
uname -m
ip -4 -br address
dpkg -l openssh-server 2>/dev/null
sudo ufw status verbose

今回の主な結果は次のとおりでした。

Description: Ubuntu 24.04.4 LTS
Release:     24.04
Codename:    noble

x86_64

ネットワークは、

lo               UNKNOWN        127.0.0.1/8
wlp16s0          UP             192.168.11.9/24

openssh-server は未導入でした。

un  openssh-server <なし> <なし>

UFWもこの時点では無効でした。

状態: 非アクティブ

2. Ubuntuを最新状態へ更新する

OpenSSH導入前にパッケージ情報を更新しました。

sudo apt update
apt list --upgradable
sudo apt autoremove --dry-run

この時点では88個のアップグレード候補がありました。

そのため、

sudo apt upgrade

を実行しました。

更新後、

apt list --upgradable

は空になりました。

また、再起動要求を確認すると、

test -f /var/run/reboot-required \
  && cat /var/run/reboot-required \
  || echo "再起動要求なし"

次の表示になりました。

*** システムの再起動が必要です ***

そこで一度再起動します。

sudo reboot

再起動後に、

uname -r
ip -4 -br address
apt list --upgradable
systemctl --failed --no-pager
sudo apt autoremove --dry-run

を確認しました。

今回の結果は、

7.0.0-30-generic

wlp16s0 UP 192.168.11.9/24

0 loaded units listed.

となり、更新残りやfailed serviceはありませんでした。

apt autoremove --dry-run では、更新後に libfwupd2 だけが削除候補になりました。

今回はOpenSSH構築を優先し、不要パッケージの実削除は行いませんでした。


3. OpenSSH Serverをインストールする

Ubuntu公式では、OpenSSH Serverのインストール方法として次のコマンドが案内されています。

To install the OpenSSH server application ... use this command

sudo apt install openssh-server

今回もこの方法でインストールしました。

sudo apt install openssh-server

追加で次のパッケージが導入されました。

ncurses-term
openssh-server
openssh-sftp-server
ssh-import-id

インストール後に確認します。

dpkg -l openssh-server | grep '^ii'

今回の結果です。

ii  openssh-server 1:9.6p1-3ubuntu13.18 amd64

4. OpenSSHの待受状態を確認する

続けて、systemdとTCP/22の状態を確認しました。

systemctl is-active ssh.socket
systemctl is-active ssh.service
sudo ss -ltnp | grep ':22'

最初の結果は、

ssh.socket  → active
ssh.service → inactive

でした。

しかしTCP/22は、

LISTEN ... 0.0.0.0:22 ... users:(("systemd",pid=1,...))
LISTEN ... [::]:22      ... users:(("systemd",pid=1,...))

と待ち受けています。

Ubuntu 24.04ではsocket activationが使われる

Ubuntu 24.04 LTSの公式リリースノートには、openssh-server がsystemd socket activationを使用することが記載されています。

openssh-server is configured to use systemd socket activation by default.

そのため、今回のように、

ssh.socket  → active
ssh.service → inactive
TCP/22      → systemdがLISTEN

という状態だけを見て「SSH Serverが起動していない」と判断しないよう注意が必要です。

この記事はUbuntu 24.04.4 LTSで確認した結果です。

OpenSSHとsystemdの構成はUbuntuのバージョンによって変わる可能性があるため、別バージョンでは公式リリースノートや実機の状態を確認してください。


5. Windowsから初回SSH接続する

5.1 TCP/22への疎通確認

まずWindows PowerShellからTCP/22へ到達できるか確認しました。

Test-NetConnection 192.168.11.9 -Port 22

結果は、

ComputerName     : 192.168.11.9
RemoteAddress    : 192.168.11.9
RemotePort       : 22
InterfaceAlias   : Wi-Fi
SourceAddress    : 192.168.11.2
TcpTestSucceeded : True

となりました。

5.2 サーバーのホスト鍵を確認する

初回接続では、接続先が本当に意図したLIFEBOOKか確認するため、Ubuntu側でEd25519ホスト鍵のフィンガープリントを確認しました。

ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub -E sha256

その後、Windowsから接続します。

ssh honta@192.168.11.9

初回は次のような確認が表示されます。

The authenticity of host '192.168.11.9 (...)' can't be established.
ED25519 key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Ubuntu実機で確認したSHA-256フィンガープリントと完全一致することを確認してから

yes

を入力しました。

続いてUbuntuユーザーのパスワードを入力し、

honta@lifebook-ubuntu:~$

まで入れれば初回SSH接続成功です。

ホスト鍵のフィンガープリントを確認せず、機械的に yes を入力するのは避けた方が安全です。

特に初回接続では、意図した接続先であることを確認する材料になります。


6. Ed25519の公開鍵認証を設定する

パスワード認証のまま運用せず、Windows側にLIFEBOOK専用のSSH鍵を作成しました。

6.1 既存鍵の有無を確認する

Get-ChildItem $HOME\.ssh -Force -ErrorAction SilentlyContinue |
    Select-Object Name, Length, LastWriteTime

この時点ではユーザー認証用の秘密鍵はありませんでした。

6.2 LIFEBOOK専用Ed25519鍵を作成する

ssh-keygen -t ed25519 `
    -f "$HOME\.ssh\id_ed25519_lifebook" `
    -C "lifebook-ubuntu"

秘密鍵にはパスフレーズを設定しました。

生成されたファイルは、

C:\Users\honta\.ssh\id_ed25519_lifebook
C:\Users\honta\.ssh\id_ed25519_lifebook.pub

です。

秘密鍵 id_ed25519_lifebook は接続元Windowsで管理します。

サーバーへコピーするのは .pub の公開鍵だけです。秘密鍵をサーバーやGitリポジトリへコピーしないよう注意します。

6.3 公開鍵を一時領域へ転送する

まだパスワード認証を無効化していない段階で、公開鍵だけLIFEBOOKへ転送しました。

scp "$HOME\.ssh\id_ed25519_lifebook.pub" `
    honta@192.168.11.9:/tmp/id_ed25519_lifebook.pub

6.4 authorized_keys へ登録する

umask 077
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys

grep -qxF "$(cat /tmp/id_ed25519_lifebook.pub)" ~/.ssh/authorized_keys \
  || cat /tmp/id_ed25519_lifebook.pub >> ~/.ssh/authorized_keys

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

確認します。

ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys
wc -l ~/.ssh/authorized_keys

今回の結果は、

drwx------ ... /home/honta/.ssh
-rw------- ... /home/honta/.ssh/authorized_keys
1 /home/honta/.ssh/authorized_keys

となりました。

登録と確認が終わったら、一時的に転送した公開鍵ファイルを削除します。

rm -f /tmp/id_ed25519_lifebook.pub

6.5 公開鍵認証をテストする

ssh -i "$HOME\.ssh\id_ed25519_lifebook" honta@192.168.11.9

秘密鍵のパスフレーズを入力して、

honta@lifebook-ubuntu:~$

まで入れれば公開鍵認証成功です。

公開鍵認証で実際に新しいSSHセッションを開けることを確認するまで、パスワード認証を無効化しません。

鍵の登録ミスなどで自分自身をサーバーから締め出すことを避けるためです。


7. Windowsのssh-agentを有効化する

秘密鍵にパスフレーズを設定したため、Windowsの ssh-agent に鍵を登録しました。

7.1 現在状態を確認する

管理者PowerShellで、

Get-Service ssh-agent |
    Select-Object Name, Status, StartType

今回の初期状態は、

ssh-agent Stopped Disabled

でした。

7.2 自動起動を有効化する

Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent

Get-Service ssh-agent |
    Select-Object Name, Status, StartType

結果は、

ssh-agent Running Automatic

となりました。

7.3 秘密鍵を登録する

通常のPowerShellで、

ssh-add "$HOME\.ssh\id_ed25519_lifebook"
ssh-add -l

を実行します。

この状態でもう一度SSH接続すると、秘密鍵のパスフレーズを再入力せず接続できました。


8. SSH configで接続を短縮する

Windows側のSSH configを作成します。

C:\Users\honta\.ssh\config

内容は次のようにしました。

Host lifebook
    HostName 192.168.11.9
    User honta
    IdentityFile ~/.ssh/id_ed25519_lifebook
    IdentitiesOnly yes

OpenSSHが想定どおり解釈しているか確認します。

ssh -G lifebook |
    Select-String '^(hostname|user|port|identityfile|identitiesonly) '

今回の結果は、

user honta
hostname 192.168.11.9
port 22
identitiesonly yes
identityfile ~/.ssh/id_ed25519_lifebook

でした。

以後は、

ssh lifebook

だけで接続できます。

この Host lifebook は、次回扱うVS Code Remote - SSHの接続先としてもそのまま利用できます。


9. OpenSSHをセキュリティ強化する

公開鍵認証が成功したので、ここからパスワード認証とroot直接ログインを禁止します。

9.1 まず実効設定を確認する

sudo sshd -T | grep -E \
'^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin|allowtcpforwarding) '

今回、変更前は次の状態でした。

permitrootlogin without-password
pubkeyauthentication yes
passwordauthentication yes
kbdinteractiveauthentication no
allowtcpforwarding yes

9.2 sshd_config.d にローカル設定を分離する

Ubuntu公式では、/etc/ssh/sshd_config を直接変更する方法に加え、/etc/ssh/sshd_config.d/ のsnippetを使う方法が案内されています。

また、Ubuntu公式は多くのディレクティブで最初に設定された値が使われると説明しています。

今回は、

/etc/ssh/sshd_config.d/00-local-hardening.conf

を作成しました。

変更前にバックアップします。

sudo cp -a /etc/ssh/sshd_config \
  "/etc/ssh/sshd_config.backup-$(date +%Y%m%d-%H%M%S)"

snippetを作成します。

sudo tee /etc/ssh/sshd_config.d/00-local-hardening.conf >/dev/null <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
EOF

9.3 構文と実効値を確認する

sudo sshd -t

今回、何も表示されず終了したため構文エラーはありませんでした。

続いて、

sudo sshd -T | grep -E \
'^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin|allowtcpforwarding) '

結果です。

permitrootlogin no
pubkeyauthentication yes
passwordauthentication no
kbdinteractiveauthentication no
allowtcpforwarding yes

Ubuntu公式も、SSH設定ミスによってサーバーへ到達できなくなる可能性を警告しています。

現在開いているSSHセッションを残したまま設定を反映し、別のPowerShellから新規接続できることを確認してから、古いセッションを閉じます。

また、反映前に sudo sshd -t で構文を検査します。

9.4 設定を反映する

sudo systemctl restart ssh.service

状態を確認します。

systemctl is-active ssh.socket
systemctl is-active ssh.service
sudo ss -ltnp | grep ':22'

今回、

ssh.socket  → active
ssh.service → active

となり、TCP/22もLISTENしていました。

9.5 公開鍵認証が引き続き使えるか確認する

Windowsの別PowerShellから、

ssh lifebook

を実行し、公開鍵認証で正常に入れることを確認しました。

9.6 パスワード認証が本当に拒否されるか確認する

ssh -o PubkeyAuthentication=no `
    -o PreferredAuthentications=password `
    -o PasswordAuthentication=yes `
    lifebook

結果は、

honta@192.168.11.9: Permission denied (publickey).

でした。

これで、実際にパスワード認証が無効になっていることまで確認できました。


10. UFWで家庭内LANからのSSHだけを許可する

10.1 ネットワークとUFWの状態を確認する

ip -4 -br address
ip route
sudo ufw status verbose

今回のネットワークは、

wlp16s0 UP 192.168.11.9/24

default via 192.168.11.1 ...
192.168.11.0/24 dev wlp16s0 ...

でした。

デフォルトポリシーも確認しました。

grep -E \
'^(DEFAULT_INPUT_POLICY|DEFAULT_OUTPUT_POLICY|DEFAULT_FORWARD_POLICY)=' \
/etc/default/ufw

今回の結果です。

DEFAULT_INPUT_POLICY="DROP"
DEFAULT_OUTPUT_POLICY="ACCEPT"
DEFAULT_FORWARD_POLICY="DROP"

10.2 dry-runでSSH許可ルールを確認する

今回は家庭内LAN 192.168.11.0/24 からSSHを許可します。

sudo ufw --dry-run allow proto tcp \
  from 192.168.11.0/24 \
  to any port 22

生成された主要ルールは、

-A ufw-user-input -p tcp --dport 22 -s 192.168.11.0/24 -j ACCEPT

でした。

192.168.11.0/24 は今回の家庭内LANです。

別のネットワークでは必ず自分のサブネットを確認してください。

10.3 SSH許可ルールを先に登録する

sudo ufw enable を先に実行しません。

SSH接続中にファイアウォールを有効化する場合、先に現在の家庭内LANからTCP/22を許可してからUFWを有効化します。

現在のSSHセッションも、別セッションから再接続確認が終わるまで閉じません。

sudo ufw allow proto tcp \
  from 192.168.11.0/24 \
  to any port 22

確認します。

sudo ufw show added

結果です。

ufw allow from 192.168.11.0/24 to any port 22 proto tcp

10.4 UFWを有効化する

sudo ufw enable

今回の表示は、

ファイアウォールはアクティブかつシステムの起動時に有効化されます。

でした。

sudo ufw status verbose
sudo ufw status numbered

今回の最終状態です。

状態: アクティブ
ロギング: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    192.168.11.0/24

11. 最終確認

UFW有効化後、Windowsからもう一度確認します。

Test-NetConnection 192.168.11.9 -Port 22

結果は、

TcpTestSucceeded : True

でした。

続いて、

ssh lifebook

を実行し、

honta@lifebook-ubuntu:~$

まで正常に接続できました。


今回躓いたポイント

LIFEBOOKが自動サスペンドしてSSHがタイムアウトした

後続のRemote - SSH確認中、

ssh: connect to host 192.168.11.9 port 22: Connection timed out

となりました。

最初はOpenSSHやVS Code側を疑いましたが、実際の原因はLIFEBOOK本体が自動サスペンドしていたことでした。

Connection timed out だけではOpenSSHの設定ミスとは断定できません。

まず、

  • PC本体が起動しているか
  • サスペンドしていないか
  • Wi-Fi / LANが接続されているか
  • TCP/22へ到達できるか
  • ssh.socket / ssh.service の状態

を切り分けるのが有効でした。

内蔵Wi-Fiが不安定だった

このLIFEBOOKはUbuntu化する前のWindows 10時代から、最近Wi-Fiが不安定でした。

そのため、UbuntuでSSHが一時的に不安定になったからといって、Ubuntu固有の問題とは判断していません。

開発サーバーとして長時間利用する場合は、可能なら有線LANを優先した方が安定しそうだと判断しました。

Windows修復で .ssh が消えた

OpenSSH構築後、メインPCのWindowsを修復したところ、

C:\Users\honta\.ssh

の内容が消え、

ssh lifebook

が使えなくなりました。

LIFEBOOK側ではすでに、

PasswordAuthentication no

としていたため、Windows側の秘密鍵がない状態ではSSHログインできません。

ただしLIFEBOOK本体には直接ログインできたため、新しい鍵ペアを作成し、公開鍵を差し替えて復旧しました。

秘密鍵を失った場合、対応する秘密鍵を authorized_keys から逆算して復元することはできません。

サーバー本体へ直接ログインできるなど別の管理経路がある場合は、新しい鍵ペアを作成して公開鍵を差し替えます。


切り分けの時系列

Ubuntu 24.04.4 LTSの状態確認
  ↓
apt update / upgrade
  ↓
再起動
  ↓
OpenSSH Serverインストール
  ↓
ssh.socket / TCP/22を確認
  ↓
WindowsからTest-NetConnection
  ↓
ホスト鍵フィンガープリントを照合
  ↓
パスワード認証で初回SSH接続
  ↓
WindowsでEd25519鍵を作成
  ↓
公開鍵をauthorized_keysへ登録
  ↓
別セッションで公開鍵認証を確認
  ↓
Windows ssh-agentを有効化
  ↓
SSH configへHost lifebookを登録
  ↓
ssh lifebookで接続成功
  ↓
sshdの実効設定を確認
  ↓
sshd_config.dへhardening設定
  ↓
sshd -tで構文検査
  ↓
別セッションで公開鍵認証を再確認
  ↓
パスワード認証が拒否されることを確認
  ↓
UFWルールをdry-run
  ↓
家庭内LAN → TCP/22許可を先に登録
  ↓
UFW有効化
  ↓
WindowsからTCP/22とSSHを再確認
  ↓
OpenSSH構築完了

補足:Windows修復でSSH秘密鍵を失ったとき

今回、後日Windows修復によって .ssh ディレクトリが消えたため、鍵を再発行しました。

今回はLIFEBOOK本体へ直接ログインでき、UFWでも家庭内LAN 192.168.11.0/24 からのSSHだけを許可していたため、一時的にパスワード認証を有効化して復旧しました。

インターネットへ公開されたSSHサーバーで、安易にパスワード認証を有効化する手順として一般化しないでください。

新しい鍵を作る

New-Item -ItemType Directory -Path "$HOME\.ssh" -Force
ssh-keygen -t ed25519 `
    -f "$HOME\.ssh\id_ed25519_lifebook" `
    -C "lifebook-ubuntu"

復旧後のhardeningを再確認する

復旧作業中だけパスワード認証を一時的に有効化しましたが、新しい鍵で接続できたことを確認した直後に無効へ戻しました。

sudo sshd -T | grep -E \
'^(pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '

最終状態:

permitrootlogin no
pubkeyauthentication yes
passwordauthentication no
kbdinteractiveauthentication no

Windows側でも ssh-agent とSSH configを再構築し、

ssh lifebook

で再び接続できるところまで確認しました。


まとめ

今回は、Ubuntu 24.04.4 LTSをインストールした古いLIFEBOOKへOpenSSH Serverを導入し、Windowsから家庭内LAN経由でSSH接続できるようにしました。

単にOpenSSH Serverを入れるだけでなく、

  • Ubuntu 24.04のsystemd socket activationを確認
  • WindowsからTCP/22の疎通確認
  • サーバーホスト鍵のフィンガープリント照合
  • Ed25519公開鍵認証
  • Windows ssh-agent
  • SSH configによる ssh lifebook
  • PasswordAuthentication no
  • KbdInteractiveAuthentication no
  • PermitRootLogin no
  • UFWで家庭内LAN 192.168.11.0/24 からTCP/22だけ許可
  • UFW有効化後の再接続確認

まで行いました。

特に重要だったのは、公開鍵認証が実際に成功することを確認してからパスワード認証を無効化したことです。

SSH設定はセキュリティを強くするほど、設定ミスによって自分自身を締め出すリスクもあります。

そのため今回は、

現在状態を確認
  ↓
設定変更
  ↓
sshd -t
  ↓
既存SSHセッションを残す
  ↓
別セッションで接続確認
  ↓
成功してから次へ進む

という順番を徹底しました。

次回は VS Code Remote - SSH接続編として、WindowsのVS CodeからこのLIFEBOOKへ接続し、実機Ubuntuを開発環境として操作できるようにしていきます。


参考資料

Ubuntu公式:OpenSSH server

確認内容:

  • openssh-server のインストール方法
  • /etc/ssh/sshd_config.d/ によるsnippet設定
  • 多くのディレクティブで最初に設定された値が使用されること
  • sudo sshd -t による設定検査
  • sudo systemctl restart ssh.service による設定反映
  • SSH設定ミスによる締め出しへの注意

Ubuntu公式:Ubuntu 24.04 LTS release notes

確認内容:

  • Ubuntu 24.04 LTSのOpenSSH
  • systemd socket activation
  • sshd_config / sshd_config.dssh.socket の関係

Ubuntu公式:Firewall

確認内容:

  • UFWの有効化
  • ufw --dry-run
  • TCP/22の許可
  • 特定ホスト・サブネットからSSHを許可する方法
  • ufw status verbose
  • ufw status numbered

Ubuntu公式:sshd_config(5) - Noble

確認内容:

  • sshd_config の各ディレクティブ
  • sshd_config.d/*.conf
  • 設定値の評価順

Visual Studio Code公式:Remote Development using SSH

確認内容:

  • Remote - SSHの前提としてSSH Serverが必要であること
  • 公開鍵認証が推奨されていること
  • SSH configを利用した接続
  • SSHトンネル / ポートフォワーディング

関連記事

このシリーズ

あわせて読みたい

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?