Ubuntu サーバー初期設定:新規インストール後の Ubuntu サーバーで始める9ステップ
新しいサーバーを受け取ったら、サービスを載せる前に Ubuntu サーバーの初期設定を一度済ませます。DigitalOcean で作成した Ubuntu 24.04 サーバーに root で接続し、パッケージの更新から sudo ユーザー、鍵ログイン、ファイアウォール、タイムゾーン、自動セキュリティ更新、スワップまで順に設定し、再起動した後も設定がそのまま残ることまで確認しました。
下の結果ボックスは、コマンドをこの順番で実行した出力です。サーバー IP 203.0.113.10 は例の値で、新しく作る一般ユーザーの名前は deploy にしました。
1️⃣ Ubuntu パッケージ更新
新しく作ったサーバーにも、インストールすべき更新がたまっています。パッケージ一覧を新しく取得した後、実際にインストールする前に何が変わるのかを確認します。
🔲 apt-get update
export DEBIAN_FRONTEND=noninteractive下の apt-get コマンドは、この値を先に設定してから実行しました。この値を設定すると、パッケージのインストール中に設定を尋ねる画面が出ず、既定の答えが適用されます。
apt-get updateHit: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 upgradeCalculating 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 upgrade26 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 deployinfo: 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 deploygroups deploydeploy : deploy sudo users🔲 su
sudo グループに入ったユーザーは、sudo で管理コマンドを実行できます。su で deploy アカウントに切り替えて権限を確認します。
su - deployTo run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.whoamideploysudo whoami[sudo] password for deploy:
rootexitsudo を付けると 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/.sshinstall -m 600 -o deploy -g deploy /root/.ssh/authorized_keys /home/deploy/.ssh/authorized_keysls -la /home/deploy/.sshtotal 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_keysinstall はフォルダーの作成とコピー、所有者と権限の指定を一度に処理します。sshd はログインを受け付ける前にユーザーファイルの権限と所有者を検査するため(StrictModes)、.ssh フォルダーは 700、authorized_keys は 600 にします。
🔲 ssh deploy@203.0.113.10
今開いている root のウィンドウは閉じずに、新しいターミナルウィンドウで deploy として接続できるかを先に確認します。
ssh deploy@203.0.113.10whoamideploy4️⃣ 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 nosudo 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_config42:PermitRootLogin yessudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_configsudo grep -n '^PermitRootLogin' /etc/ssh/sshd_config42:PermitRootLogin no🔲 systemctl reload ssh
sudo sshd -tsudo systemctl reload sshsudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin no
passwordauthentication nosshd -t は設定の文法を検査し、何も表示されなければエラーはありません。読み直した後、新しいウィンドウで deploy の接続がそのままできることを確認し、root で接続して拒否されるかを見ます。
ssh root@203.0.113.10root@203.0.113.10: Permission denied (publickey).鍵が合っていても root では入れず、管理作業は deploy で接続して sudo で行います。
5️⃣ Ubuntu ファイアウォール ufw
ufw は Ubuntu の標準ファイアウォールツールですが、最初はオフになっています。有効にした瞬間に許可していない接続が遮断されるため、SSH の許可ルールを先に追加し、最後に有効にします。
sudo ufw status verboseStatus: inactive🔲 ufw allow OpenSSH
sudo ufw app listAvailable applications:
OpenSSHsudo ufw allow OpenSSHRules updated
Rules updated (v6)sudo ufw allow 80/tcpRules updated
Rules updated (v6)sudo ufw allow 443/tcpRules updated
Rules updated (v6)sudo ufw show addedAdded user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcpOpenSSH は22番ポートを開くプロファイルで、80と443はウェブサーバーで使うポートです。ルールは IPv4 と IPv6 の両方に追加されます。
🔲 ufw enable
sudo ufw enableCommand may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupsudo ufw status verboseStatus: 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 numberedStatus: 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/Singaporetimedatectl 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-upgradesunattended-upgrades 2.9.1+nmu4ubuntu1systemctl is-enabled unattended-upgrades apt-daily.timer apt-daily-upgrade.timerenabled
enabled
enabled🔲 cat 20auto-upgrades
cat /etc/apt/apt.conf.d/20auto-upgradesAPT::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-upgradesUnattended-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 --debugStarting 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.log8️⃣ 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 0Bdf -h /Filesystem Size Used Avail Use% Mounted on
/dev/vda1 24G 2.0G 22G 9% /🔲 fallocate -l 2G /swapfile
sudo fallocate -l 2G /swapfilesudo chmod 600 /swapfilels -lh /swapfile-rw------- 1 root root 2.0G Nov 5 20:04 /swapfile🔲 mkswap /swapfile
sudo mkswap /swapfileSetting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=0b43ccd8-5b4a-4048-9b84-eee12667b387🔲 swapon /swapfile
sudo swapon /swapfileswapon --showNAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2free -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 09️⃣ Ubuntu サーバー初期設定の確認
設定が再起動後も残るかを確認すれば、Ubuntu の初期設定は完了です。
🔲 systemctl reboot
sudo systemctl reboot🔲 uptime -p
再起動後、deploy で再び接続します。
uptime -pup 2 minutesswapon --showNAME TYPE SIZE USED PRIO
/swapfile file 2G 0B -2sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication) 'permitrootlogin no
passwordauthentication nosudo ufw status verboseStatus: 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.socketactive
activeスワップ、SSH 設定、ファイアウォール、タイムゾーン、自動更新がすべて再起動前と同じです。このサーバーには次に Node.js アプリを PM2 と Nginx で載せます。
🔢 FAQ & おすすめコンテンツ
SSH 設定
SSH 設定 - /etc/ssh/sshd_config ファイルの機能と設定
PermitRootLogin 以外にも sshd_config でよく変える項目とその意味を扱った記事です。
スワップ
スワップメモリ(Swap Memory)設定:パーティション&ファイルの2つの方法
スワップファイルではなくパーティションでスワップを作る方法と、swapon、mkswap コマンドを扱った記事です。
パッケージ
[Ubuntu] aptコマンド | apt-getコマンドの使い方と違い
apt と apt-get の違いと、パッケージのインストール、削除のコマンドを扱った記事です。
ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。