Ubuntu Server 初期設定のベストプラクティス
当社では運用サーバに Ubuntu Server を利用しています。
Ubuntu を選択している理由は、インターネット上に新しい知見が多いことや次のようなセキュリティ管理のシンプルさにメリットを感じているからです。
-root ユーザーがロックされている
-unattended-upgrade
による自動セキュリティアップデート
-ファイアウォール (ufw) の扱いがシンプル
近年では企業がサイバーテロにより業務を妨害されたり、ランサムウェアやワイパーによるデータ被害が急増しています。そのような攻撃に常に対抗するためには、社外のみならず社内ネットワークも危険という視点で脆弱性を防ぎ続かなければなりません。
しかし、常に手動でアップデートを続けるということは並大抵のことではありませんのでアップデートの管理コストを少しでも下げられるディストリビューションは非常に助かりますね!
ここでは、当社が行っている Ubuntu Server インストール後の最低限の設定について、共有していきます。
さらにセキュアでシンプルな設定があれば、ぜひコメントください!
前提 & 環境
Ubuntu Server は Minimal インストール済みで、インストールオプションで OpenSSH を同時インストールしているものとします。
IP アドレスは 192.168.1.10
、管理者ユーザーは hoge
としています。
$ 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) を利用します。
> ver
Microsoft Windows [Version 10.0.22000.1335]
> wsl -l -v
NAME STATE VERSION
* Ubuntu-22.04 Running 2
SSH の設定
サービス起動確認
Ubuntu Server のインストール時に OpenSSH を同時インストールしているので、SSH サービスは起動しているはずです。
$ 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
が良いでしょう。
$ 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 へコピーします。
$ 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 接続できるようになります。
$ 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
を編集して接続設定を追記します。
+Host ubuntu-server
+ HostName 192.168.1.10
+ IdentityFile ~/.ssh/id_ed25519
+ User hoge
SSH 接続確認
これで Windows からも SSH 接続可能になります。
> 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 の設定を変更します。
+PasswordAuthentication no
+ChallengeResponseAuthentication no
+PermitRootLogin no
+PermitEmptyPasswords no
-PasswordAuthentication yes
変更を有効にするために SSH サービスを再起動します。
$ sudo systemctl restart sshd
これでパスワード認証は無効化されました。
> ssh hoge@192.168.1.10
hoge@192.168.1.10: Permission denied (publickey).
ログ設定
/etc/ssh/sshd_config.d/50-cloud-init.conf
を編集して、SSH のアクセスログを有効にします。
+SyslogFacility AUTH
+LogLevel INFO
ファイアウォールの設定
UFW インストール
Minimal では UFW は初期インストールされていないため、インストールします。
$ sudo apt install ufw
ポート開放設定
UFW を有効化する前に SSH のポート開放を設定します。
$ sudo ufw allow ssh
Rules updated
Rules updated (v6)
有効化
UFW を有効化します。
$ 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 スキャン
$ 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 スキャン
$ 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 のアクセスログを有効にします。
$ sudo ufw logging medium
Logging enabled
自動アップデートの設定
Ubuntu では、セキュリティアップデートは通常のアップデートと異なるリポジトリで提供されており、unattended-upgrade
により自動アップデートが動作しています。
設定確認
$ cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1"; # apt update に相当
APT::Periodic::Unattended-Upgrade "1"; # apt upgrade に相当
動作確認
サービスの状態を確認します
$ systemctl is-active unattended-upgrades.service
active
$ systemctl is-enabled unattended-upgrades.service
enabled
Systemd でアップデートがスケジューリングされていることを確認します
$ 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
ログから動作していることを確認します
$ 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
を編集して自動再起動を設定します。
+Unattended-Upgrade::Automatic-Reboot "true";
-//Unattended-Upgrade::Automatic-Reboot "false";
+Unattended-Upgrade::Automatic-Reboot-Time "02:00";
-//Unattended-Upgrade::Automatic-Reboot-Time "02:00";
サービス再起動
設定を有効にするために、サービスを再起動します。
$ sudo systemctl restart unattended-upgrades.service
ログ管理
Rsyslog と Logrotate を使用して自動ログローテーション、自動削除などの機能を導入します。
Rsyslog インストール
Minimal では Rsyslog は初期インストールされていないため、インストールします。
$ sudo apt install rsyslog
設定はデフォルトで問題ないでしょう。
Logrotate インストール
Minimal では Logrotate は初期インストールされていないため、インストールします。
$ sudo apt install logrotate
Logrotate の設定
/etc/logrotate.conf
を編集して設定を変更します。
+rotate 48 # ログ保存期間を48週
-rotate 4
+dateext # ファイル名サフィックスにYYYYMMDD
-dateext
+compress # 非圧縮
-#compress
サービス再起動
Logrotate サービスを再起動して、設定を反映させます。
$ sudo systemctl restart logrotate.service
おわり
以上で Ubuntu Server に最低限のセキュリティを加えた設定を終えることができました。
セキュリティ強化には、アクセス制限はもちろん、どのようなことが起こっていたかのログ管理がとても重要です。
実際の運用ではこれらを応用していくことになりますが、それはまた別の機会に!
ご参考・謝辞
Discussion