Ubuntu サーバー初期設定:新規インストール後の Ubuntu サーバーで始める9ステップ

テスト環境Debian系Ubuntu 24.04.5 LTSroot・一般ユーザーアカウント
Ubuntu サーバーの初期設定作業を確認

新しいサーバーを受け取ったら、サービスを載せる前に Ubuntu サーバーの初期設定を一度済ませます。DigitalOcean で作成した Ubuntu 24.04 サーバーに root で接続し、パッケージの更新から sudo ユーザー、鍵ログイン、ファイアウォール、タイムゾーン、自動セキュリティ更新、スワップまで順に設定し、再起動した後も設定がそのまま残ることまで確認しました。

下の結果ボックスは、コマンドをこの順番で実行した出力です。サーバー IP 203.0.113.10 は例の値で、新しく作る一般ユーザーの名前は deploy にしました。

🎯 要点
パッケージ更新と再起動要否の確認
sudo グループに入れた一般ユーザー deploy
deploy の鍵ログインを確認した後 root のログインを遮断
ufwで SSH、80、443 ポートだけを許可
タイムゾーン変更と自動セキュリティ更新の確認
2GB スワップファイルと再起動後の設定維持の確認
前提条件
先に読む記事ssh-keygenssh コマンド
接続rootで接続できる SSH 鍵と Ubuntu 24.04 サーバー

1️⃣ Ubuntu パッケージ更新

新しく作ったサーバーにも、インストールすべき更新がたまっています。パッケージ一覧を新しく取得した後、実際にインストールする前に何が変わるのかを確認します。

🔲 apt-get update

export DEBIAN_FRONTEND=noninteractive

下の apt-get コマンドは、この値を先に設定してから実行しました。この値を設定すると、パッケージのインストール中に設定を尋ねる画面が出ず、既定の答えが適用されます。

apt-get update
Hit:1 http://mirrors.digitalocean.com/ubuntu noble InRelease
Hit:2 http://mirrors.digitalocean.com/ubuntu noble-updates InRelease
Hit:3 http://mirrors.digitalocean.com/ubuntu noble-backports InRelease
Hit:4 https://repos-droplet.digitalocean.com/apt/droplet-agent main InRelease
Hit:5 http://security.ubuntu.com/ubuntu noble-security InRelease
Reading package lists...

🔲 apt-get -s upgrade

apt-get -s upgrade
Calculating upgrade...
The following upgrades have been deferred due to phasing:
  libsqlite3-0
The following packages will be upgraded:
  apt apt-transport-https apt-utils bind9-dnsutils bind9-host bind9-libs
  cloud-init distro-info-data gir1.2-glib-2.0 git git-man libapt-pkg6.0t64
  libbrotli1 libglib2.0-0t64 libglib2.0-bin libglib2.0-data liblzma5
  libmspack0t64 libpcre2-8-0 python3-jwt python3-twisted tmux
  ubuntu-pro-client ubuntu-pro-client-l10n xz-utils zlib1g
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

-s オプションは、インストールせずに結果だけを計算する模擬実行です。このサーバーでは26個がアップグレード対象で、libsqlite3-0 の一つは [deferred due to phasing] として今回のアップグレードから外れました。対象の数は、サーバーを作成した時期とイメージによってサーバーごとに異なります。

🔲 apt-get -y upgrade

apt-get -y upgrade
26 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
Need to get 15.4 MB of archives.
After this operation, 398 kB of additional disk space will be used.

インストールが終わると、続けて再起動したサービスの一覧が表示されます。

Running kernel seems to be up-to-date.

Restarting services...
 /etc/needrestart/restart.d/systemd-manager
 systemctl restart cron.service fwupd.service multipathd.service packagekit.service polkit.service ssh.service systemd-journald.service systemd-networkd.service systemd-resolved.service systemd-timesyncd.service systemd-udevd.service udisks2.service

Service restarts being deferred:
 systemctl restart ModemManager.service
 /etc/needrestart/restart.d/dbus.service
 systemctl restart systemd-logind.service
 systemctl restart unattended-upgrades.service

再起動が必要な更新が入ると、/var/run/reboot-required ファイルが作られます。今回は [Running kernel seems to be up-to-date.] が表示され、そのファイルも作られなかったため、再起動せずに次のステップへ進みました。

2️⃣ Ubuntu ユーザー追加と sudo 権限

普段の作業は一般ユーザーで行い、管理コマンドだけを sudo で実行します。sudo は root のパスワードの代わりに自分のパスワードで権限を上げるため、誰がどのコマンドを実行したかが記録に残ります。

🔲 adduser deploy

adduser deploy
info: Adding user `deploy' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `deploy' (1000) ...
info: Adding new user `deploy' (1000) with group `deploy (1000)' ...
info: Creating home directory `/home/deploy' ...
info: Copying files from `/etc/skel' ...
New password: 
Retype new password: 
passwd: password updated successfully
Changing the user information for deploy
Enter the new value, or press ENTER for the default
	Full Name []: 
	Room Number []: 
	Work Phone []: 
	Home Phone []: 
	Other []: 
Is the information correct? [Y/n] Y
info: Adding new user `deploy' to supplemental / extra groups `users' ...
info: Adding user `deploy' to group `users' ...

adduser は useraddをラップしたツールで、ホームフォルダーとグループを作った後、パスワードとユーザー情報を順に尋ねます。パスワードは入力しても画面に表示されず、名前や電話番号などの情報は Enter で空欄のままにします。

🔲 usermod -aG sudo deploy

usermod -aG sudo deploy
groups deploy
deploy : deploy sudo users

🔲 su

sudo グループに入ったユーザーは、sudo で管理コマンドを実行できます。su で deploy アカウントに切り替えて権限を確認します。

su - deploy
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
whoami
deploy
sudo whoami
[sudo] password for deploy: 
root
exit

sudo を付けると deploy のパスワードを尋ねられ、合っていればコマンドが root 権限で実行されます。

3️⃣ 新しいユーザーの SSH 鍵登録

最初は root にだけ SSH 鍵が登録されているため、deploy では鍵ログインができません。root の authorized_keys を deploy のホームフォルダーにコピーします。

🔲 install -o deploy -g deploy

install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keys
ls -la /home/deploy/.ssh
total 12
drwx------ 2 deploy deploy 4096 Nov  5 11:48 .
drwxr-x--- 3 deploy deploy 4096 Nov  5 11:48 ..
-rw------- 1 deploy deploy  100 Nov  5 11:48 authorized_keys

install はフォルダーの作成とコピー、所有者と権限の指定を一度に処理します。sshd はログインを受け付ける前にユーザーファイルの権限と所有者を検査するため(StrictModes)、.ssh フォルダーは 700、authorized_keys は 600 にします。

🔲 ssh deploy@203.0.113.10

今開いている root のウィンドウは閉じずに、新しいターミナルウィンドウで deploy として接続できるかを先に確認します。

ssh deploy@203.0.113.10
whoami
deploy
🧭 接続が締め出されない設定の順番
解説ダイアグラム
🧭 ステップ
🔑① 鍵をコピーroot の鍵を deploy へ
➜
🪟② 新しいウィンドウで確認root のウィンドウは開いたまま
➜
⛔③ root ログイン遮断PermitRootLogin no
➜
🪟④ 新しいウィンドウで確認deploy の接続はそのまま
✅⑤ SSH を許可ufw allow OpenSSH
➜
🧱⑥ ufw を有効化許可したポートだけが開く
➜
🪟⑦ 新しいウィンドウで確認接続はそのまま
root の authorized_keys を deploy のホームフォルダーにコピーします。
今開いている root のウィンドウは閉じずに、新しいターミナルウィンドウで deploy として鍵ログインできるかを確認します。
deploy の接続を確認してから root ログインを遮断します。新しいウィンドウで接続できなければ、開いたままのウィンドウで元に戻します。
SSH 設定を読み直した後、新しいウィンドウで deploy の接続がそのままできるかを確認します。
ファイアウォールを有効にする前に、SSH の許可ルールを先に追加します。
有効にした瞬間に許可していない接続は遮断されるため、SSH の許可ルールが先に入っている必要があります。
ファイアウォールを有効にした後、新しいウィンドウで deploy として再び接続できるかを確認します。

4️⃣ SSH の root ログイン遮断

Ubuntu 24.04 の sshd_config は、先頭の Include 行で /etc/ssh/sshd_config.d/ フォルダーのファイルを先に読み込み、同じ項目は先に読んだ値が適用されます。そのため設定を変える前に、今適用されている値とその値が入っているファイルを確認します。

/etc/ssh└─ sshd_config  先頭 Include /etc/ssh/sshd_config.d/*.conf   ├─ ① sshd_config.d/50-cloud-init.conf         PasswordAuthentication no   ├─ ② sshd_config.d/60-cloudimg-settings.conf  PasswordAuthentication no   └─ ③ sshd_config 42行                          PermitRootLogin yes → no

🔲 sshd -T

sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin yes
passwordauthentication no
sudo grep -rn 'PasswordAuthentication' /etc/ssh/sshd_config.d/
/etc/ssh/sshd_config.d/60-cloudimg-settings.conf:1:PasswordAuthentication no
/etc/ssh/sshd_config.d/50-cloud-init.conf:1:PasswordAuthentication no

パスワードログインは sshd_config.d 内の二つのファイルですでにオフになっており、変えるのは本体ファイルの root ログインの1行です。

🔲 sed -i PermitRootLogin

sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config
42:PermitRootLogin yes
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config
42:PermitRootLogin no

🔲 systemctl reload ssh

sudo sshd -t
sudo systemctl reload ssh
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin no
passwordauthentication no

sshd -t は設定の文法を検査し、何も表示されなければエラーはありません。読み直した後、新しいウィンドウで deploy の接続がそのままできることを確認し、root で接続して拒否されるかを見ます。

ssh root@203.0.113.10
root@203.0.113.10: Permission denied (publickey).

鍵が合っていても root では入れず、管理作業は deploy で接続して sudo で行います。

5️⃣ Ubuntu ファイアウォール ufw

ufw は Ubuntu の標準ファイアウォールツールですが、最初はオフになっています。有効にした瞬間に許可していない接続が遮断されるため、SSH の許可ルールを先に追加し、最後に有効にします。

sudo ufw status verbose
Status: inactive

🔲 ufw allow OpenSSH

sudo ufw app list
Available applications:
  OpenSSH
sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)
sudo ufw allow 80/tcp
Rules updated
Rules updated (v6)
sudo ufw allow 443/tcp
Rules updated
Rules updated (v6)
sudo ufw show added
Added user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp

OpenSSH は22番ポートを開くプロファイルで、80と443はウェブサーバーで使うポートです。ルールは IPv4 と IPv6 の両方に追加されます。

🔲 ufw enable

sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             

入ってくる接続は既定で遮断され、許可した三つのポートだけが開いた状態で、起動時にも有効になります。有効にした後、新しいウィンドウで deploy として再び接続し、ルール番号を確認します。

sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere                  
[ 2] 80/tcp                     ALLOW IN    Anywhere                  
[ 3] 443/tcp                    ALLOW IN    Anywhere                  
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)             
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)             
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)             

6️⃣ Ubuntu タイムゾーン設定

最初のタイムゾーンは Etc/UTC です。ログと予約ジョブの時刻をサーバーの地域に合わせるため、シンガポール地域に作ったこのサーバーは Asia/Singapore に設定しました。

timedatectl
               Local time: Thu 2026-11-05 12:00:31 UTC
           Universal time: Thu 2026-11-05 12:00:31 UTC
                 RTC time: Thu 2026-11-05 12:00:31
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

🔲 timedatectl list-timezones

timedatectl list-timezones | grep シンガポール
Asia/Singapore

🔲 timedatectl set-timezone

sudo timedatectl set-timezone Asia/Singapore
timedatectl
               Local time: Thu 2026-11-05 20:00:32 +08
           Universal time: Thu 2026-11-05 12:00:32 UTC
                 RTC time: Thu 2026-11-05 12:00:32
                Time zone: Asia/Singapore (+08, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

変わるのは Local time と Time zone の2行で、時刻同期(NTP)と UTC 時刻はそのままです。

7️⃣ unattended upgrades 自動セキュリティ更新

Ubuntu はセキュリティ更新を unattended-upgrades パッケージで自動インストールし、このパッケージは最初からインストールされて有効になっています。そのためこのステップでは、有効になっているかと、何を自動でインストールするかを確認します。

🔲 dpkg-query -W

dpkg-query -W unattended-upgrades
unattended-upgrades	2.9.1+nmu4ubuntu1
systemctl is-enabled unattended-upgrades apt-daily.timer apt-daily-upgrade.timer
enabled
enabled
enabled

🔲 cat 20auto-upgrades

cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

二つの値の1は1日に1回という意味で、0に変えると自動更新がオフになります。何をインストールするかは 50unattended-upgrades ファイルが決めます。

grep -vE '^[[:space:]]*(//|$)' /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
	"${distro_id}:${distro_codename}";
	"${distro_id}:${distro_codename}-security";
	"${distro_id}ESMApps:${distro_codename}-apps-security";
	"${distro_id}ESM:${distro_codename}-infra-security";
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::DevRelease "auto";

許可された配信元に -security はあり -updates はないため、通常の更新は自動でインストールされず、セキュリティ更新だけがインストールされます。通常の更新も自動で受け取るには、このファイルで -updates 行のコメントを外します。

🔲 unattended-upgrade

sudo unattended-upgrade --dry-run --debug
Starting unattended upgrades script
Allowed origins are: o=Ubuntu,a=noble, o=Ubuntu,a=noble-security, o=UbuntuESMApps,a=noble-apps-security, o=UbuntuESM,a=noble-infra-security

同じ実行の最後の2行です。

No packages found that can be upgraded unattended and no pending auto-removals
The list of kept packages can't be calculated in dry-run mode.

--dry-run はインストールせずに、自動更新がする作業だけを計算します。パッケージの更新を済ませた後なので、自動でインストールするパッケージはないと表示されました。実際の実行記録は /var/log/unattended-upgrades/ フォルダーに残ります。

sudo ls -l /var/log/unattended-upgrades/
total 32
-rw-r--r-- 1 root root     0 Nov  5 20:00 unattended-upgrades-dpkg.log
-rw-r--r-- 1 root root     0 Nov  5 17:34 unattended-upgrades-shutdown.log
-rw-r--r-- 1 root root 29093 Nov  5 20:04 unattended-upgrades.log

8️⃣ Ubuntu スワップメモリ設定

このサーバーはメモリが 1GB で、最初はスワップが0です。アプリを載せる前に 2GB のスワップファイルを作り、再起動後も有効になるように /etc/fstab に登録します。

free -h
               total        used        free      shared  buff/cache   available
Mem:           961Mi       328Mi       161Mi       4.0Mi       631Mi       633Mi
Swap:             0B          0B          0B
df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        24G  2.0G   22G   9% /

🔲 fallocate -l 2G /swapfile

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
ls -lh /swapfile
-rw------- 1 root root 2.0G Nov  5 20:04 /swapfile

🔲 mkswap /swapfile

sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=0b43ccd8-5b4a-4048-9b84-eee12667b387

🔲 swapon /swapfile

sudo swapon /swapfile
swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2
free -h
               total        used        free      shared  buff/cache   available
Mem:           961Mi       328Mi       160Mi       4.0Mi       632Mi       632Mi
Swap:          2.0Gi          0B       2.0Gi

🔲 tee -a /etc/fstab

swapon は今有効にするところまでで、再起動後も有効にするには fstab に1行追加します。

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
/swapfile none swap sw 0 0

9️⃣ Ubuntu サーバー初期設定の確認

設定が再起動後も残るかを確認すれば、Ubuntu の初期設定は完了です。

🔲 systemctl reboot

sudo systemctl reboot

🔲 uptime -p

再起動後、deploy で再び接続します。

uptime -p
up 2 minutes
swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) '
permitrootlogin no
passwordauthentication no
sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
80/tcp                     ALLOW IN    Anywhere                  
443/tcp                    ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
80/tcp (v6)                ALLOW IN    Anywhere (v6)             
443/tcp (v6)               ALLOW IN    Anywhere (v6)             
timedatectl | head -n 4
               Local time: Thu 2026-11-05 20:06:35 +08
           Universal time: Thu 2026-11-05 12:06:35 UTC
                 RTC time: Thu 2026-11-05 12:06:35
                Time zone: Asia/Singapore (+08, +0800)
systemctl is-active unattended-upgrades ssh.socket
active
active

スワップ、SSH 設定、ファイアウォール、タイムゾーン、自動更新がすべて再起動前と同じです。このサーバーには次に Node.js アプリを PM2 と Nginx で載せます。

🔢 FAQ & おすすめコンテンツ

そのままで問題ありません。[deferred due to phasing] で外れたパッケージは、段階的配信中の更新です。Ubuntu は一部の更新を最初は一部のサーバーにだけ配信し、問題がなければ対象を広げてすべてのサーバーに配信します。セキュリティ更新は段階的配信を行わず、外れたパッケージは配信対象が広がると次のアップグレードで一緒にインストールされます。

自動更新の作業は1日1回で、apt-daily.timer と apt-daily-upgrade.timer の二つのタイマーが決まった時刻からランダムに遅らせて実行します。このサーバーでは apt-daily-upgrade.timer の次の実行が翌日 06:27:59(+08)に設定されていました。サーバーが停止していて時刻を逃すと、次の起動時にすぐ実行されることがあるため、起動直後に apt の作業がしばらく待つこともあります。

既定の設定では再起動しません。50unattended-upgrades の Automatic-Reboot の既定値は false で、このサーバーの設定でもその行は有効になっていません。再起動が必要な更新がインストールされると /var/run/reboot-required ファイルが作られるため、そのファイルがあるときに自分で再起動します。

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 7   +   8   =