サーバーハードニング(初期セキュリティ設定)
『サーバーハードニング』とは、新規に立ち上げたサーバーに対して初期セキュリティ設定を施し、攻撃される可能性を最小限に抑える作業です。不要なサービスの停止・SSH 鍵認証への切り替え・ファイアウォールの有効化・自動セキュリティ更新の設定などを順番に実施します。クラウドや VPS でサーバーを立ち上げたら、アプリケーションをデプロイする前に必ずこのチェックリストを済ませてください。
構文
# ===============================================================
# サーバーハードニング 初期設定の全体フロー
# ===============================================================
# -----------------------------------------------
# [1] 一般ユーザーの作成
# -----------------------------------------------
# root で直接作業しないために一般ユーザー(例: webmaster)を作成します
# useradd -m -s /bin/bash {ユーザー名}
# -m: ホームディレクトリを作成します
# -s: ログインシェルを指定します
# -----------------------------------------------
# [2] sudo 権限の付与
# -----------------------------------------------
# 作成したユーザーを sudo グループ(Debian/Ubuntu 系)または
# wheel グループ(RHEL/AlmaLinux 系)に追加します
# usermod -aG sudo {ユーザー名} # Debian/Ubuntu 系
# usermod -aG wheel {ユーザー名} # RHEL/AlmaLinux 系
# -----------------------------------------------
# [3] SSH 公開鍵の登録
# -----------------------------------------------
# クライアント側で鍵ペアを生成し、公開鍵をサーバーへ転送します
# ssh-keygen -t ed25519 -C "webmaster@example.com" # クライアント側で実行
# ssh-copy-id {ユーザー名}@{サーバーIP} # 公開鍵をサーバーへコピー
# -----------------------------------------------
# [4] SSH 設定の強化 (/etc/ssh/sshd_config)
# -----------------------------------------------
# 以下の設定を変更してパスワード認証・root ログインを禁止します
# Port 22022 # デフォルトポート (22) から変更(任意)
# PermitRootLogin no # root の直接ログインを禁止します
# PasswordAuthentication no # パスワード認証を無効化します
# PubkeyAuthentication yes # 公開鍵認証を有効化します
# AllowUsers webmaster deploy # ログインを許可するユーザーを限定します
# -----------------------------------------------
# [5] ファイアウォールの有効化
# -----------------------------------------------
# UFW(Debian/Ubuntu 系)または firewalld(RHEL 系)を有効化します
# ssh ポートを開けてからファイアウォールを有効にする順序が重要です
# ufw allow 22022/tcp # 変更した SSH ポートを先に許可します
# ufw enable # ファイアウォールを有効化します
# -----------------------------------------------
# [6] 不要なサービスの停止
# -----------------------------------------------
# 使っていないサービスは起動しないようにします
# systemctl disable --now {サービス名}
# 例: sudo systemctl disable --now cups # 印刷サービス(不要な場合)
# 例: sudo systemctl disable --now avahi-daemon
# -----------------------------------------------
# [7] 自動セキュリティ更新の設定
# -----------------------------------------------
# セキュリティパッチを自動適用します
# apt install unattended-upgrades # Debian/Ubuntu 系
# dpkg-reconfigure --priority=low unattended-upgrades
構文一覧
| 設定項目 | 説明 |
|---|---|
| 一般ユーザーの作成 | root で常用作業をしないために専用ユーザーを作成します。useradd -m -s /bin/bash {ユーザー名} でホームディレクトリとシェルを指定して作成します。 |
| sudo / wheel グループへの追加 | 作成したユーザーに管理者権限を委譲します。Ubuntu 系は sudo グループ、RHEL 系は wheel グループに追加します。 |
| SSH 鍵認証の設定 | パスワード認証より安全な公開鍵認証を使用します。ssh-keygen で鍵ペアを生成し、ssh-copy-id で公開鍵をサーバーへ転送します。 |
| PasswordAuthentication no | /etc/ssh/sshd_config でパスワード認証を無効化します。鍵認証が確認できてから設定してください。設定後は sshd を再起動します。 |
| PermitRootLogin no | root アカウントへの直接 SSH ログインを禁止します。root は sudo 経由でのみ操作するポリシーにします。 |
| SSH ポートの変更 | デフォルトの 22 番ポートを変更し、自動化された総当たり攻撃を減らします。変更後はファイアウォールで新ポートを開けてから sshd を再起動します。 |
| AllowUsers による制限 | SSH ログインを許可するユーザーを明示的に列挙します。リストにないユーザーはログインできません。 |
| ファイアウォールの有効化 | UFW(Ubuntu 系)または firewalld(RHEL 系)を有効化し、必要なポートのみを開放します。SSH ポートを必ず許可してから有効化します。 |
| 不要サービスの停止 | systemctl disable --now で不要なサービスを停止・自動起動無効化します。攻撃面(アタックサーフェス)を最小化できます。 |
| fail2ban のインストール | SSH への総当たり攻撃を検知して一定回数失敗した IP を自動 BAN します。apt install fail2ban でインストールします。 |
| 自動セキュリティ更新 | unattended-upgrades(Ubuntu 系)でセキュリティパッチを自動適用します。カーネル更新などは手動で行うのが無難です。 |
| 不要パッケージの削除 | 使っていないパッケージを apt purge / dnf remove で削除します。脆弱性の対象が減ります。 |
使用例
新規サーバーの初期セキュリティ設定スクリプト
# =============================================================== # 新規 Ubuntu サーバー ハードニング手順(完全版) # 例: VPS に webmaster でログインする環境を想定 # =============================================================== # ----------------------------------------------- # [1] root でログインしたら最初にパッケージを最新化します # ----------------------------------------------- apt update && apt full-upgrade -y # ----------------------------------------------- # [2] 一般ユーザー「webmaster」を作成して sudo 権限を付与します # ----------------------------------------------- # ユーザーを作成します(-m: ホームディレクトリ作成, -s: シェル指定) useradd -m -s /bin/bash webmaster # パスワードを設定します(鍵認証の前に一時的に使用します) passwd webmaster # sudo グループに追加します usermod -aG sudo webmaster # ----------------------------------------------- # [3] クライアント PC で SSH 鍵ペアを生成します # ※ この手順はサーバーではなくクライアント側で実行します # ----------------------------------------------- # ed25519 形式で鍵を生成します(RSA より安全・短い鍵長) # ssh-keygen -t ed25519 -C "webmaster@example.com" # 公開鍵をサーバーの webmaster ユーザーへ転送します # ssh-copy-id -i ~/.ssh/id_ed25519.pub webmaster@<サーバーIP> # ----------------------------------------------- # [4] webmaster でログインできることを確認してから SSH 設定を変更します # ※ 以降の操作は webmaster ユーザーで sudo を使って行います # ----------------------------------------------- # sshd_config のバックアップを取ってから編集します sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak sudo nano /etc/ssh/sshd_config # --- sshd_config に設定する内容 --- # Port 22022 # ポートを変更します(任意) # PermitRootLogin no # root ログインを禁止します # PasswordAuthentication no # PubkeyAuthentication yes # AllowUsers webmaster deploy # ログイン許可ユーザーを明示します # ---------------------------------- # 設定ファイルの文法チェックをしてから再起動します sudo sshd -t && sudo systemctl restart sshd # ----------------------------------------------- # [5] UFW ファイアウォールを設定します # ----------------------------------------------- # 変更した SSH ポートを先に許可します(忘れるとログインできなくなります) sudo ufw allow 22022/tcp comment 'SSH' # Web サーバーを使う場合は HTTP/HTTPS も開けます sudo ufw allow 80/tcp comment 'HTTP' sudo ufw allow 443/tcp comment 'HTTPS' # デフォルトポリシーを設定します(インバウンド拒否・アウトバウンド許可) sudo ufw default deny incoming sudo ufw default allow outgoing # ファイアウォールを有効化します sudo ufw enable # ルールを確認します sudo ufw status numbered # ----------------------------------------------- # [6] 不要サービスを停止します # ----------------------------------------------- # 印刷サービス(Web サーバーには不要です) sudo systemctl disable --now cups 2>/dev/null || true # Avahi デーモン(mDNS。ローカル LAN 以外では不要です) sudo systemctl disable --now avahi-daemon 2>/dev/null || true # ----------------------------------------------- # [7] fail2ban をインストールして SSH への総当たり攻撃を防ぎます # ----------------------------------------------- sudo apt install -y fail2ban # jail.local を作成して SSH の設定を上書きします sudo tee /etc/fail2ban/jail.local <<'EOF' [sshd] enabled = true port = 22022 maxretry = 5 bantime = 3600 findtime = 600 EOF sudo systemctl enable --now fail2ban # ----------------------------------------------- # [8] 自動セキュリティ更新を設定します # ----------------------------------------------- sudo apt install -y unattended-upgrades # 対話形式で自動更新を有効化します(「Yes」を選択します) sudo dpkg-reconfigure --priority=low unattended-upgrades # 設定を確認します cat /etc/apt/apt.conf.d/20auto-upgrades
実行するコマンドは次の通りです。
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22022/tcp ALLOW IN Anywhere # SSH
[ 2] 80/tcp ALLOW IN Anywhere # HTTP
[ 3] 443/tcp ALLOW IN Anywhere # HTTPS
[ 4] 22022/tcp (v6) ALLOW IN Anywhere (v6) # SSH
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6) # HTTP
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6) # HTTPS
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| |- Total failed: 47
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 3
`- Banned IP list: 203.0.113.42
$ cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
概要
『サーバーハードニング』は「攻撃される可能性を下げる」ための一連の初期設定作業です。一般ユーザーの作成と sudo 権限付与・SSH 鍵認証への切り替え・パスワード認証の無効化、の 3 ステップが最優先事項です。SSH 設定の詳細(ポート・AllowUsers・接続タイムアウトなど)は sshd_config のページを、ファイアウォールのルール管理は ufw のページを参照してください。SSH への総当たり攻撃を自動 BAN する仕組みは fail2ban のページで詳しく説明しています。なお、ファイアウォールを有効化する前に必ず SSH ポートを許可する ことと、パスワード認証を無効化する前に鍵認証でログインできることを確認する ことが、誤ってサーバーへの入口を閉じてしまわないための鉄則です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。