😺

Ubuntu Server 初期設定のベストプラクティス

2023/05/18に公開

当社では運用サーバに Ubuntu Server を利用しています。
Ubuntu を選択している理由は、インターネット上に新しい知見が多いことや次のようなセキュリティ管理のシンプルさにメリットを感じているからです。
-root ユーザーがロックされている
-unattended-upgrade による自動セキュリティアップデート
-ファイアウォール (ufw) の扱いがシンプル

近年では企業がサイバーテロにより業務を妨害されたり、ランサムウェアやワイパーによるデータ被害が急増しています。そのような攻撃に常に対抗するためには、社外のみならず社内ネットワークも危険という視点で脆弱性を防ぎ続かなければなりません。
しかし、常に手動でアップデートを続けるということは並大抵のことではありませんのでアップデートの管理コストを少しでも下げられるディストリビューションは非常に助かりますね!

ここでは、当社が行っている Ubuntu Server インストール後の最低限の設定について、共有していきます。
さらにセキュアでシンプルな設定があれば、ぜひコメントください!

前提 & 環境

Ubuntu Server は Minimal インストール済みで、インストールオプションで OpenSSH を同時インストールしているものとします。
IP アドレスは 192.168.1.10 、管理者ユーザーは hoge としています。

Ubuntu Server bash
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy

クライアントは Windows 11 と WSL2 (Ubuntu) を利用します。

Windows cmd
> ver
Microsoft Windows [Version 10.0.22000.1335]
> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-22.04           Running         2

SSH の設定

サービス起動確認

Ubuntu Server のインストール時に OpenSSH を同時インストールしているので、SSH サービスは起動しているはずです。

Ubuntu Server bash
$ systemctl status sshd.service
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
     Active: active (running)
     ...

active (running) と表示されていれば有効化されています。

公開鍵認証の導入

セキュリティ強化のため、公開鍵認証を導入します。

鍵ペアの作成

クライアントの WSL で鍵ペアを作成します。
現状では鍵アルゴリズムは ed25519 が良いでしょう。

WSL bash
$ ssh-keygen -t ed25519 -C ""
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_ed25519):  # 何も入力せず Enter
Enter passphrase (empty for no passphrase):  # 何も入力せず Enter
Enter same passphrase again:  # 何も入力せず Enter
Your identification has been saved in /home/hoge/.ssh/id_ed25519
Your public key has been saved in /home/hoge/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:8rW9RFRliLuG5lL1fOnTyxKHEo1hMclYxTsT+GeRwbM
The key's randomart image is:
+--[ED25519 256]--+
|          ++*oo+=|
|         . *o+.* |
|          . *.o +|
|           +o* E |
|      . S .oo+* .|
|       o .+=oooo.|
|        .+..+ +..|
|        . .. o.o.|
|         .  . .oo|
+----[SHA256]-----+

秘密鍵 ~/.ssh/id_ed25519、公開鍵 ~/.ssh/id_ed25519.pub の鍵ペアが作成されました。

公開鍵を Ubuntu Server へコピー

作成した公開鍵を クライアントの WSL から Ubuntu Server へコピーします。

WSL bash
$ ssh-copy-id -i .ssh/id_ed25519.pub hoge@192.168.1.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_ed25519.pub"
/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
hoge@192.168.1.10's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'hoge@192.168.1.10'"
and check to make sure that only the key(s) you wanted were added.

これで WSL から秘密鍵を使って Ubuntu Server に SSH 接続できるようになります。

WSL bash
$ ssh -i .ssh/id_ed25519 hoge@192.168.1.10
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-72-generic x86_64)

Windows から SSH 接続

Windows からも Ubuntu Server へ SSH 接続できるようにします。

秘密鍵を移動

WSL の秘密鍵 ~/.ssh/id_ed25519 を Windows の ~/.ssh に移動またはコピーして、セキュリティ強化のため現ログインユーザーと System 以外のアクセス権を削除します。

続けて、Windows クライアント の ~/.ssh/config を編集して接続設定を追記します。

Windows ~/.ssh/config
+Host ubuntu-server
+    HostName 192.168.1.10
+    IdentityFile ~/.ssh/id_ed25519
+    User hoge
SSH 接続確認

これで Windows からも SSH 接続可能になります。

Windows cmd
> ssh ubuntu-server # ← config の Host で指定した名称
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-72-generic x86_64)

パスワード認証の無効化

公開鍵認証で SSH ログインできるようになったので、セキュリティ強化のためパスワード認証を無効化します。
/etc/ssh/sshd_config.d/50-cloud-init.conf を編集して SSH の設定を変更します。

Ubuntu Server /etc/ssh/sshd_config.d/50-cloud-init.conf
+PasswordAuthentication no
+ChallengeResponseAuthentication no
+PermitRootLogin no
+PermitEmptyPasswords no
-PasswordAuthentication yes

変更を有効にするために SSH サービスを再起動します。

Ubuntu Server bash
$ sudo systemctl restart sshd

これでパスワード認証は無効化されました。

Windows cmd
> ssh hoge@192.168.1.10
hoge@192.168.1.10: Permission denied (publickey).

ログ設定

/etc/ssh/sshd_config.d/50-cloud-init.conf を編集して、SSH のアクセスログを有効にします。

Ubuntu Server /etc/ssh/sshd_config.d/50-cloud-init.conf
+SyslogFacility AUTH
+LogLevel INFO

ファイアウォールの設定

UFW インストール

Minimal では UFW は初期インストールされていないため、インストールします。

Ubuntu Server bash
$ sudo apt install ufw

ポート開放設定

UFW を有効化する前に SSH のポート開放を設定します。

Ubuntu Server bash
$ sudo ufw allow ssh
Rules updated
Rules updated (v6)

有効化

UFW を有効化します。

Ubuntu Server bash
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

ポートチェック

WSL から nmap を使用して、ポート開放が想定通りかチェックします。

TCP スキャン
WSL bash
$ sudo nmap -sS 192.168.1.10
Starting Nmap 7.80 ( https://nmap.org ) at 2023-05-18 08:57 JST
Nmap scan report for 192.168.1.10
Host is up (0.0021s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 6.04 seconds

22/tcp open ssh と SSH ポートのみ開放されています。

UDP スキャン
WSL bash
$ sudo nmap -sU 192.168.1.10
Starting Nmap 7.80 ( https://nmap.org ) at 2023-05-18 08:47 JST
Nmap scan report for 192.168.1.10
Host is up (0.0012s latency).
All 1000 scanned ports on 192.168.1.10 are open|filtered

Nmap done: 1 IP address (1 host up) scanned in 22.43 seconds

応答がなければ open|filtered とみなされるので、開放ポートがないことが確認できます。

ログ設定

UFW のアクセスログを有効にします。

Ubuntu Server bash
$ sudo ufw logging medium
Logging enabled

自動アップデートの設定

Ubuntu では、セキュリティアップデートは通常のアップデートと異なるリポジトリで提供されており、unattended-upgrade により自動アップデートが動作しています。

設定確認

bash
$ cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";  # apt update に相当
APT::Periodic::Unattended-Upgrade "1";    # apt upgrade に相当

動作確認

サービスの状態を確認します
bash
$ systemctl is-active unattended-upgrades.service
active
$ systemctl is-enabled unattended-upgrades.service
enabled
Systemd でアップデートがスケジューリングされていることを確認します
bash
$ systemctl list-timers --all
NEXT                        LEFT     LAST                         PASSED       UNIT                     ACTIVATES
Thu 2023-05-18 06:30:14 UTC 6h left  Wed 2023-05-17 06:12:34 UTC  18h ago      apt-daily-upgrade.timer  apt-daily-upgrade.service
Thu 2023-05-18 08:47:41 UTC 8h left  Wed 2023-05-17 21:12:48 UTC  3h 6min ago  apt-daily.timer          apt-daily.service
ログから動作していることを確認します
bash
$ cat /var/log/apt/history.log
Start-Date: 2023-05-17  03:20:26
Commandline: /usr/bin/unattended-upgrades -v
Upgrade: tzdata:amd64 (2022g-0ubuntu0.22.04.1, 2023c-0ubuntu0.22.04.0)
End-Date: 2023-05-17  03:20:27

自動再起動の設定

サーバによってはアップデート後に自動再起動するような設定をします。

設定追加

/etc/apt/apt.conf.d/50unattended-upgrades を編集して自動再起動を設定します。

Ubuntu Server /etc/apt/apt.conf.d/50unattended-upgrades
+Unattended-Upgrade::Automatic-Reboot "true";
-//Unattended-Upgrade::Automatic-Reboot "false";
+Unattended-Upgrade::Automatic-Reboot-Time "02:00";
-//Unattended-Upgrade::Automatic-Reboot-Time "02:00";
サービス再起動

設定を有効にするために、サービスを再起動します。

bash
$ sudo systemctl restart unattended-upgrades.service

ログ管理

Rsyslog と Logrotate を使用して自動ログローテーション、自動削除などの機能を導入します。

Rsyslog インストール

Minimal では Rsyslog は初期インストールされていないため、インストールします。

bash
$ sudo apt install rsyslog

設定はデフォルトで問題ないでしょう。

Logrotate インストール

Minimal では Logrotate は初期インストールされていないため、インストールします。

bash
$ sudo apt install logrotate

Logrotate の設定

/etc/logrotate.conf を編集して設定を変更します。

Ubuntu Server /etc/logrotate.conf
+rotate 48    # ログ保存期間を48週
-rotate 4
+dateext      # ファイル名サフィックスにYYYYMMDD
-dateext
+compress     # 非圧縮
-#compress

サービス再起動

Logrotate サービスを再起動して、設定を反映させます。

Ubuntu Server bash
$ sudo systemctl restart logrotate.service

おわり

以上で Ubuntu Server に最低限のセキュリティを加えた設定を終えることができました。
セキュリティ強化には、アクセス制限はもちろん、どのようなことが起こっていたかのログ管理がとても重要です。
実際の運用ではこれらを応用していくことになりますが、それはまた別の機会に!

ご参考・謝辞

https://zenn.dev/uchidaryo/books/ubuntu-2204-server-book/

GitHubで編集を提案

Discussion