Azureの仮想マシンとしてubuntuを構築したときに最初に設定すべき設定項目をまとめてみました。
最下部にコマンドのまとめを置いていますので、説明不要の方はそちらを見てください
初期構築時に実施すべき設定
今回は以下の環境で設定していきます。
- サイズ:Standard B2ms (2 vcpu 数、8 GiB メモリ)
- OS:Linux (ubuntu 22.04)
1.パッケージ更新
パッケージを最新化します。
# パッケージリストの更新
sudo apt-get update
# インストール済みパッケージの更新
sudo apt-get upgrade
2.rootユーザのパスワード設定
AzureではVM作成時に管理者アカウントを作成しますが、これはrootユーザではありません。
rootユーザのPW設定は未設定の状態となっているので、rootユーザのPWを設定しておきます。
# rootユーザに権限昇格
sudo su –
# パスワード変更
passwd
# ------
# # 出力結果
# New password:
# Retype new password:
# passwd: password updated successfully
# ------
これで、rootユーザでログインするとPWが求められるようになります。
3.ルートのログイン禁止
sshでのアクセス設定のファイル(sshd_config)を編集して、rootログインを禁止します。
※念のため作業時には設定変更の前に元のファイルのコピーも取得します。
configファイルの中では PermitRootLogin は “prohibit-password” が設定され、コメントアウトされているかと思いますので、明示的に設定値を no にします。
# configファイルのコピーを取得
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old_`date +%Y%m%d`
# configファイルの修正
sudo vi /etc/ssh/sshd_config
# ----変更点----
# # PermitRootLogin prohibit-password
# PermitRootLogin no
# -------------
# 設定反映のためサービスを再起動
sudo systemctl restart sshd.service
これで、rootユーザでログインができなくなります。
実際にrootユーザでPWを入力してみてもログインできないことが確認できるかと思います。
※構築時点のPermitRootLoginがコメントアウトされた状態でも、rootユーザでログインは不可でしたが、明示的にログイン不可にした方が良いかと思います。
4.タイムゾーン設定
タイムゾーンをJST(日本/東京)に設定します。
# タイムゾーンをAsia/Tokyoに設定
sudo timedatectl set-timezone Asia/Tokyo
# 設定変更後の確認
sudo timedatectl
# ------
# # 出力結果
# Local time: Thu 2025-02-13 23:10:54 JST
# Universal time: Thu 2025-02-13 14:10:54 UTC
# RTC time: Thu 2025-02-13 14:10:54
# Time zone: Asia/Tokyo (JST, +0900)
# System clock synchronized: yes
# NTP service: active
# RTC in local TZ: no
# ------
5.NTP設定(PTP設定)
基本的には、AzureVMではchronyがインストールされており、PTP(Precision Time Protocol)を利用した設定になっていることが多いかと思います。
# chrony による時刻同期状況を確認
chronyc sources
# -----
# ## 以下の出力になっていればPTPの設定がされている
# MS Name/IP address Stratum Poll Reach LastRx Last sample
# ===============================================================================
# #* PHC0 0 3 377 11 +27us[ +29us] +/- 17us
# -----
PHC は Precision Time Protocol Hardware Clock の略ですので上記の出力であればNTP設定としては既に設定済みの状態です。
ただし、以下のMicrosoftの公式ブログにも記載ある通り、AzureVMでのデフォルト設定は一律の設定になっているわけではなく、NTP設定されていないこともあるそうです。
その場合には、ブログに記載のある手順でPTPを設定してください。
また、そもそもchronyがインストールされていない場合は以下のようにインストールをして、上のコマンドを実行してください。
# chrony をインストール
sudo apt install chrony
# インストールされた chrony パッケージが表示されることを確認
sudo apt list --installed | grep chrony
6.SWAP設定の追加
以下の公式ドキュメントにある通り Cloud-init で設定されるように構成します。

# waagent側でSWAP設定が入っていないことを確認する
sudo cat /etc/waagent.conf
## 以下のようにgrepで絞って確認でもOK
sudo cat /etc/waagent.conf | grep Format
sudo cat /etc/waagent.conf | grep Swap
sudo cat /etc/waagent.conf | grep Mount
以下のような設定値になっていることを確認します。
# Format if unformatted. If 'n', resource disk will not be mounted.
ResourceDisk.Format=n
# Create and use SWAPfile on resource disk.
ResourceDisk.EnableSwap=n
#Mount point for the resource disk
ResourceDisk.MountPoint=/mnt
#Size of the swapfile.
ResourceDisk.SwapSizeMB=0
次にSWAP領域の設定を追加します。
# SWAP領域の確認
free -m
# ------
# # 出力結果
# total used free shared buff/cache available
# Mem: 7938 267 6700 3 969 7404
# Swap: 0 0 0
# ------
# /systemd/system.conf にCLOUD_CFG変数を作成(rootで実行しないとエラーになる可能性あり)
sudo echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
# cloud-initによるSwap構成を定義する設定ファイルを作成
cat > /etc/cloud/cloud.cfg.d/00-azure-swap.cfg << EOF
#cloud-config
disk_setup:
ephemeral0:
table_type: mbr
layout: [66, [33, 82]]
overwrite: True
fs_setup:
- device: ephemeral0.1
filesystem: ext4
- device: ephemeral0.2
filesystem: swap
mounts:
- ["ephemeral0.1", "/mnt"]
- ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
EOF
これでSWAP領域の追加設定は完了です。
あとはVMを一度停止して起動することでSWAP設定が反映されます。
7.VMの停止と起動
SWAP領域の設定を反映させるためにはVMをOS内から再起動ではなく、VM自体を停止して起動する必要があります。
今回はAzureCLIで実行します。
$rg_name = "RG-test" ##リソースグループ名
$vm_name = "VM-test" ##VM名
# VMの停止(割り当て解除)
az vm deallocate --resource-group $rg_name --name $vm_name
# VMの起動
az vm start --resource-group $rg_name --name $vm_name
これでSWAP領域の設定が完了しました。
再度OSの中でSWAP領域が設定されているかを確認します。
# SWAP設定後の確認
free -m
# ------
# # 出力結果
# total used free shared buff/cache available
# Mem: 7938 273 7388 3 275 7419
# Swap: 5568 0 5568
# ------
必要に応じて設定すべき設定
必須ではない気がしますが、セキュリティ向上の観点などから設定をしておいた方がいいかと思う内容です。
8.作業用ユーザの追加+sudoグループへの追加(任意)
上述した通り、AzureのVMでは初回のログインがrootユーザでないので、この作業は不要な気もしますが、備忘のため記載しておきます。
ユーザの作成は adduser コマンドを使用します。
このコマンドでユーザを作成すると、ユーザのホームディレクトリ(/home/ユーザ名)も作成されます。
また、作成したユーザで管理者権限の操作ができるようにsudoグループに所属させます。
# ユーザーの作成
adduser hogehoge
# sudoグループに追加
gpasswd -a hogehoge sudo
9.ロケール設定(日本語化)
ロケールを日本語に変更します。
# 設定前のの確認
localectl
# ------
# # 出力結果
# System Locale: LANG=C.UTF-8
# VC Keymap: n/a
# X11 Layout: us
# X11 Model: pc105
# ------
# 必要なパッケージをインストール
sudo apt install language-pack-ja language-pack-ja-base
# 日本語に変更
sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
# 変更内容の確認
localectl
# ------
# # 出力結果
# System Locale: LANG=ja_JP.UTF-8
# LANGUAGE=ja_JP:ja
# VC Keymap: n/a
# X11 Layout: us
# X11 Model: pc105
# ------
10.SSHのデフォルトポート変更
sshの22番ポートはウェルノウンポートなので攻撃の対象になりやすいです。
なので、sshd_config で定義されているsshのデフォルトポートである22番ポートを変更することで、セキュリティ向上につなげることができます。
# configファイルのコピーを取得
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old2_`date +%Y%m%d`
# configファイルの修正
sudo vi /etc/ssh/sshd_config
# ----変更点----
# # Port 22
# Port 1222
# -------------
# 設定反映のためサービスを再起動
sudo systemctl restart sshd.service
11.ufwの設定追加
Ubuntuでは初期設定でインストールされていますが、非アクティブ状態かと思います。
ルールの有効化をする前に追加の許可設定を入れて、最後に有効化(アクティブ化)します。
# ufwの状態を確認
sudo ufw status
# ----
# # 実行結果の例
# Status: inactive
# ----
# Inbound通信をデフォルトdenyにして、ブラックリスト形式に修正
ufw default deny
# 許可設定の追加
sudo ufw allow from 1.1.1.1/32 to any port 22
sudo ufw allow from 1.1.1.1/32 to any port 1222
sudo ufw allow from 10.0.0.0/8 to any port 1222
# 最後にufwの有効化
sudo ufw enable
# 有効化後の状態を確認
sudo ufw status
# ----
# # 実行結果の例
# Status: active
#
# To Action From
# -- ------ ----
# 22 ALLOW 1.1.1.1.32
# 1222 ALLOW 1.1.1.1.32
# 1222 ALLOW 10.0.0.0/8
# ----
また、既存で設定が存在する場合は一度すべて削除してから追加の許可設定を入れてください。
# 設定が存在する場合、numberedで各設定の番号を確認してdeleteで削除
sudo ufw numbered
sudo ufw delete 1
12.SSHのパスワードログイン禁止(公開鍵認証の設定)
パスワードログインを禁止することでもセキュリティ向上が望めます。
sshd_config を書き換えて設定しますが、設定を入れる前に公開鍵認証方式でログインできることを確認してから設定してください。
# configファイルのコピーを取得
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old3_`date +%Y%m%d`
# configファイルの修正
sudo vi /etc/ssh/sshd_config
# ----変更点----
# PubkeyAuthentication yes ### コメントアウトを外す
# PasswordAuthentication no ### 行追加
# -------------
# 設定反映のためサービスを再起動
sudo systemctl restart sshd.service
公開鍵認証の鍵の作成方法などは以下の記事などを参考にして作成します。

13.AppArmorの設定
AppArmorの設定は基本的には要らないのではないかと思っているので今時点では記載は割愛しますが、いつか検証して更新したいと思います。
13-1. SELinuxの状態を確認
ubuntuではおそらくデフォルトで無効となっていますが念のため確認しておきます。
# SELinuxが無効されていることの確認
getenforce
# ----
# # 実行結果として以下が返ってくればSELinux自体インストールされていない
# Command 'getenforce' not found, but can be installed with:
# sudo apt install selinux-utils
# ----
13-2. AppArmorの設定追加
今後更新予定
まとめ(コマンドのみ抜粋)
## 1.パッケージ更新
sudo apt-get update
sudo apt-get upgrade
## 2.rootユーザのPW変更
sudo su –
passwd
## 3.rootユーザのログイン不可
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old_`date +%Y%m%d`
sudo vi /etc/ssh/sshd_config ## PermitRootLogin no
sudo systemctl restart sshd.service
## 4.タイムゾーン設定
sudo timedatectl set-timezone Asia/Tokyo
sudo timedatectl
## 5.NTP設定
# chrony による時刻同期状況を確認
chronyc sources
## 6.SWAP設定の追加
sudo cat /etc/waagent.conf
free -m
sudo echo 'DefaultEnvironment="CLOUD_CFG=/etc/cloud/cloud.cfg.d/00-azure-swap.cfg"' >> /etc/systemd/system.conf
cat > /etc/cloud/cloud.cfg.d/00-azure-swap.cfg << EOF
#cloud-config
disk_setup:
ephemeral0:
table_type: mbr
layout: [66, [33, 82]]
overwrite: True
fs_setup:
- device: ephemeral0.1
filesystem: ext4
- device: ephemeral0.2
filesystem: swap
mounts:
- ["ephemeral0.1", "/mnt"]
- ["ephemeral0.2", "none", "swap", "sw,nofail,x-systemd.requires=cloud-init.service,x-systemd.device-timeout=2", "0", "0"]
EOF
## 7.VMの停止と起動
# SWAP設定反映のためにAzureVMの停止と起動を実施
#ーーーーーーーーーーーーーーーーーー
#### 以下、任意設定 ####
## 8.ユーザの作成とsudoグループ追加(任意)
adduser hogehoge
gpasswd -a hogehoge sudo
## 9.ロケール変更(日本語化)
sudo apt install language-pack-ja language-pack-ja-base
sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
sudo source /etc/default/locale
## 10.SSHのデフォルトポート変更
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old2_`date +%Y%m%d`
sudo vi /etc/ssh/sshd_config ## Port 1222
sudo systemctl restart sshd.service
## 11.ufwの設定
sudo ufw status
sudo ufw numbered
sudo ufw delete 1
ufw default deny
sudo ufw allow 1222 from 10,0.0.0/8
sudo ufw allow 1222 from 1.1.1.1/32
sudo ufw enable
sudo ufw status
## 12.公開鍵認証の作成とパスワードログイン不可設定
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old3_`date +%Y%m%d`
sudo vi /etc/ssh/sshd_config
# ----変更点----
# PubkeyAuthentication yes ### コメントアウトを外す
# PasswordAuthentication no ### 行追加
# -------------
sudo systemctl restart sshd.service