Linuxサーバーを立ち上げたばかりのエンジニアから、こういう質問をよく受けます。
この記事では、Linuxサーバーを公開直後に必ず実施すべき初期セキュリティ設定を10項目のチェックリスト形式でまとめます。
RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS の実機で動作確認済みのコマンドをベースに、「なぜ必要か」の背景と「どう確認するか」の手順をセットで解説します。
この記事のポイント
・公開直後のLinuxサーバーに必須の10項目を網羅したチェックリスト
・SSH設定・firewalld・SELinux・sudoの4本柱が最重要
・「確認コマンド」と「設定コマンド」をセットで掲載
・1項目ずつ完了を確認しながら進める実践手順
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ初期セキュリティ設定が重要なのか
インターネットに公開されたサーバーへの攻撃は、公開後数分以内に始まります。実際に私がセミナーで使う検証サーバーをそのまま公開してアクセスログを確認すると、1時間以内にSSHへのブルートフォース攻撃が記録されていました。
「まだ本番じゃないから」「テスト環境だから」という考えは危険です。ボットは24時間365日、IPアドレスのレンジを総ナメしてポートスキャンを繰り返しています。
初期セキュリティ設定は「面倒な追加作業」ではなく、サーバー構築の最終工程です。これを終えて初めてサービスとして使える状態になります。
チェックリスト全10項目の一覧
まず全体像を確認してください。| # | 項目 | 優先度 | カテゴリ |
|---|---|---|---|
| 1 | OSとパッケージを最新化する | 最高 | パッチ管理 |
| 2 | rootの直接SSHログインを無効化する | 最高 | SSH |
| 3 | SSH鍵認証に切り替え、パスワード認証を無効化する | 最高 | SSH |
| 4 | SSHポートを変更する(任意だが推奨) | 中 | SSH |
| 5 | firewalldで不要なポートを閉じる | 最高 | ファイアウォール |
| 6 | SELinuxを有効のまま維持する | 高 | 強制アクセス制御 |
| 7 | 不要なサービスを無効化する | 高 | サービス管理 |
| 8 | sudo設定を最小権限にする | 高 | 権限管理 |
| 9 | パスワードポリシーを設定する | 中 | 認証 |
| 10 | ログ収集と監視設定を行う | 中 | ログ管理 |
1. OSとパッケージを最新化する
1. なぜ最初にアップデートが必要か
インストール直後のOSには、公開済みのCVE(脆弱性)が残っています。ミラーサーバーからダウンロードしたISOイメージの作成日と、今日の日付の間に発見されたすべての脆弱性が対象です。攻撃者は公開されたCVEを素早くスキャンに組み込みます。パッチを当てていないサーバーは格好の標的です。
2. アップデートコマンド(RHEL 9 / Rocky Linux 9)
# すべてのパッケージを最新化(カーネル含む) dnf update -y # アップデート後に再起動が必要か確認 needs-restarting -r echo "終了コード 1 = 再起動が必要"
3. アップデートコマンド(Ubuntu 24.04 LTS)
# パッケージリストを更新してから一括アップグレード apt update && apt upgrade -y # 再起動が必要なパッケージを確認 cat /var/run/reboot-required 2>/dev/null && echo "再起動が必要です"
2. rootの直接SSHログインを無効化する
1. root直接ログインが危険な理由
ブルートフォース攻撃は「root」アカウントを最初に狙います。root でのログインを許可していると、パスワードさえ破られれば即座に最高権限を奪われます。一般ユーザーでSSHログイン → sudo で権限昇格、という2段階にするだけで攻撃の難易度が大幅に上がります。
2. sshd_config の設定変更
# 設定ファイルを開く vi /etc/ssh/sshd_config # 以下の行を探して変更する # 変更前: #PermitRootLogin prohibit-password # 変更後: PermitRootLogin no
3. sshdを再起動して反映する
# 設定ファイルの構文チェック(必ず実行すること) sshd -t echo "エラーが出なければ安全に再起動できます" # sshdを再起動 systemctl restart sshd # 状態確認 systemctl status sshd
3. SSH鍵認証に切り替え、パスワード認証を無効化する
1. 鍵認証が必要な理由
パスワード認証はブルートフォースに対して根本的に脆弱です。SSH公開鍵認証に切り替えると、鍵ファイルを持つPCからしかログインできなくなり、総当たり攻撃を原理的に無効化できます。2. 鍵ペアを自分のPCで生成する
# 自分のPC(接続元)で実行 ssh-keygen -t ed25519 -C "server-login" # 生成されるファイル # ~/.ssh/id_ed25519 ← 秘密鍵(絶対に外部へ漏らさない) # ~/.ssh/id_ed25519.pub ← 公開鍵(サーバーへ登録する)
3. 公開鍵をサーバーへ登録する
# 自分のPCからサーバーへ公開鍵を転送 ssh-copy-id -i ~/.ssh/id_ed25519.pub username@サーバーIPアドレス # または手動で登録する場合 # サーバー側で実行: mkdir -p ~/.ssh chmod 700 ~/.ssh cat >> ~/.ssh/authorized_keys << 'EOF' # 自分のPCで cat ~/.ssh/id_ed25519.pub の出力を貼り付ける EOF chmod 600 ~/.ssh/authorized_keys
4. 鍵認証でログインできたことを確認してからパスワード認証を無効化する
# 鍵認証でログインできることを確認してから以下を実施すること # /etc/ssh/sshd_config を編集 PasswordAuthentication no ChallengeResponseAuthentication no # 設定反映 sshd -t && systemctl restart sshd
4. firewalldで不要なポートを閉じる
1. 開いているポートを確認する
# 現在のfirewalldの許可ルールを確認 firewall-cmd --list-all # 出力例(Rocky Linux 9 最小インストール直後) # public (active) # services: cockpit dhcpv6-client ssh # ports:
2. 不要なサービスを閉じる
# cockpit(Web管理UI)が不要なら閉じる firewall-cmd --permanent --remove-service=cockpit # dhcpv6-clientが不要なら閉じる(固定IPで運用する場合) firewall-cmd --permanent --remove-service=dhcpv6-client # 設定を即座に反映 firewall-cmd --reload # 最終確認 firewall-cmd --list-all
3. Webサーバーを公開する場合の例
# HTTP(80) と HTTPS(443) を開放する firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload # 確認(http, https, ssh のみが表示されれば正しい) firewall-cmd --list-services
# SSHポートを22から49022へ変更した場合の例 firewall-cmd --permanent --add-port=49022/tcp firewall-cmd --permanent --remove-service=ssh firewall-cmd --reload
5. SELinuxを有効のまま維持する
1. SELinuxを無効にしてはいけない理由
セミナーでよく「SELinuxが原因でApacheが動かないので disabled にしました」という声を聞きます。これは最悪の対処です。SELinuxはカーネルレベルで動作する強制アクセス制御(MAC)です。万が一Webアプリケーションに脆弱性があっても、SELinuxが有効であれば攻撃者のできることを大幅に制限できます。
2. SELinuxの状態を確認する
# SELinuxの状態を確認 getenforce # Enforcing ← 有効(推奨) # Permissive ← ログのみ取得(一時的な確認作業用) # Disabled ← 無効(非推奨) # 詳細情報を確認 sestatus
3. Enforcingへ変更する手順
# 一時的に Enforcing へ変更(再起動で元に戻る) setenforce 1 # 永続化する(再起動後も有効) # /etc/selinux/config を確認 grep SELINUX /etc/selinux/config # SELINUX=enforcing ← この状態が正しい
4. SELinuxで問題が出た時の対処
「SELinuxのせいでアプリが動かない」場合は、SELinuxを無効化するのではなく、適切なコンテキストやポリシーを設定するのが正しい対応です。# SELinuxによる拒否ログを確認 ausearch -m avc -ts recent # または journalctl -t audit | grep "avc: denied" # 自動的に許可ポリシーを生成(audit2allowコマンド) ausearch -m avc -ts recent | audit2allow -M mypolicy semodule -i mypolicy.pp
6. 不要なサービスを無効化する
1. 起動しているサービスを一覧表示する
# 起動(active)状態のサービス一覧 systemctl list-units --type=service --state=active # 自動起動(enabled)に設定されているサービス一覧 systemctl list-unit-files --type=service --state=enabled
2. 不要なサービスを停止・無効化する例
# cockpit(WebUI)を停止して自動起動も無効化 systemctl stop cockpit.socket systemctl disable cockpit.socket # postfix(メール送信デーモン)が不要な場合 systemctl stop postfix systemctl disable postfix # avahi-daemon(mDNSサービス)が不要な場合 systemctl stop avahi-daemon systemctl disable avahi-daemon
7. sudo設定を最小権限にする
1. sudo の基本設定を確認する
# sudoers ファイルを安全に編集する(必ず visudo を使う) visudo # sudo権限を持つユーザー・グループを確認 grep -E "^[^#]" /etc/sudoers grep -rE "^[^#]" /etc/sudoers.d/
2. 特定のコマンドのみ許可する(最小権限の原則)
# /etc/sudoers.d/webadmin というファイルを作成して # webadmin ユーザーに nginx の再起動だけを許可する例 visudo -f /etc/sudoers.d/webadmin # 以下の内容を記述 # webadmin ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx # 設定確認 sudo -l -U webadmin
3. sudo のログを確認する
# sudo実行ログをsecure(または auth.log)で確認 journalctl _COMM=sudo | tail -20 # または grep sudo /var/log/secure | tail -20
8. パスワードポリシーを設定する
1. pwqualityでパスワード強度を設定する
# パスワードポリシー設定ファイルを確認・編集 cat /etc/security/pwquality.conf # 以下の設定を推奨値に変更する # minlen = 12 ← 最小12文字 # dcredit = -1 ← 数字を1文字以上必須 # ucredit = -1 ← 大文字を1文字以上必須 # lcredit = -1 ← 小文字を1文字以上必須 # ocredit = -1 ← 特殊文字を1文字以上必須 # 設定後に確認 pwscore << 'EOF' TestPassword123! EOF
2. パスワード有効期限を設定する
# システムデフォルトの有効期限を設定(/etc/login.defs) grep PASS_MAX_DAYS /etc/login.defs # 特定ユーザーのパスワード有効期限を確認 chage -l username # 有効期限を90日に設定する例 chage -M 90 username
9. ログ収集と基本的な監視を設定する
1. journald のログ永続化を確認する
# journaldのストレージ設定を確認 grep Storage /etc/systemd/journald.conf # "persistent" に設定すると再起動後もログが残る # /etc/systemd/journald.conf を編集 # Storage=persistent # 設定反映 systemctl restart systemd-journald # ログが /var/log/journal/ に保存されているか確認 ls /var/log/journal/
2. SSHの認証失敗ログを確認する
# SSHへのブルートフォースアタック状況を確認 journalctl -u sshd | grep "Failed password" | tail -20 # 接続元IPアドレス別に集計 journalctl -u sshd | grep "Failed password" | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10
3. fail2banの導入(推奨)
# fail2banをインストール(RHEL/Rocky系の場合はEPEL必要) dnf install epel-release -y dnf install fail2ban -y # または Ubuntu の場合 # apt install fail2ban -y # 設定ファイルを作成(jail.conf は直接編集しない) cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # jail.local の [sshd] セクションを有効化 # [sshd] # enabled = true # maxretry = 5 # bantime = 3600 # 起動と自動起動設定 systemctl enable --now fail2ban # ブロック状況を確認 fail2ban-client status sshd
10. セキュリティ設定の最終確認
1. 公開ポートを確認する(設定漏れのチェック)
# LISTEN状態のポートを確認(意図しないサービスが起動していないか) ss -tlnp # 実際の出力例(Rocky Linux 9 で Webサーバーのみ公開している場合) # Netid State Recv-Q Send-Q Local Address:Port # tcp LISTEN 0 128 0.0.0.0:22 ... sshd # tcp LISTEN 0 511 0.0.0.0:80 ... httpd # tcp LISTEN 0 511 0.0.0.0:443 ... httpd # tcp LISTEN 0 128 [::]:22 ... sshd # tcp LISTEN 0 511 [::]:80 ... httpd # tcp LISTEN 0 511 [::]:443 ... httpd
2. SELinuxとfirewalldのダブルチェック
# SELinuxが Enforcing になっていることを確認 getenforce # Enforcing # firewalldの許可ルールが意図通りか確認 firewall-cmd --list-all
トラブルシュート|設定後に発生しやすい問題
1. 鍵認証に変更後、ログインできなくなった
原因の多くは authorized_keys のパーミッション不正です。# ~/.ssh ディレクトリのパーミッション確認 ls -la ~/.ssh/ # drwx------(700)が正しい # authorized_keys のパーミッション確認 ls -la ~/.ssh/authorized_keys # -rw-------(600)が正しい # 修正コマンド chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
2. firewalld を変更後にSSHに繋がらなくなった
# SSHサービスが許可されているか確認 firewall-cmd --list-services # SSHポートが許可されているか確認(ポート変更した場合) firewall-cmd --list-ports # ssh サービスを追加する(緊急時) firewall-cmd --permanent --add-service=ssh firewall-cmd --reload
3. SELinuxがアプリケーションの動作を妨げている
# SELinuxの拒否ログを確認 ausearch -m avc -ts recent 2>/dev/null | tail -20 # 一時的に Permissive にして問題を切り分ける(本番環境では使わない) setenforce 0 # アプリが動くようになれば SELinux の設定問題が原因 # ポリシーを修正後、Enforcing に戻す setenforce 1
本記事のまとめ
Linuxサーバーの初期セキュリティ設定10項目をまとめます。| 項目 | 確認コマンド | ポイント |
|---|---|---|
| OSアップデート | dnf update -y |
公開済みCVEへのパッチ適用が最優先 |
| root SSH無効化 | grep PermitRootLogin /etc/ssh/sshd_config |
PermitRootLogin no に設定 |
| 鍵認証へ切替 | grep PasswordAuthentication /etc/ssh/sshd_config |
PasswordAuthentication no に設定 |
| firewalld設定 | firewall-cmd --list-all |
必要なポートのみ開放 |
| SELinux確認 | getenforce |
Enforcing を維持する |
| 不要サービス停止 | systemctl list-units --type=service --state=active |
使わないサービスは停止・無効化 |
| sudo最小権限 | sudo -l -U username |
必要なコマンドのみ許可 |
| パスワードポリシー | cat /etc/security/pwquality.conf |
最小12文字、複雑性を要求 |
| ログ永続化 | grep Storage /etc/systemd/journald.conf |
persistent に設定 |
| 公開ポート確認 | ss -tlnp |
意図しないLISTENポートがないか確認 |
1項目ずつ確認しながら設定を進め、設定が終わったらもう一度 `ss -tlnp` と `firewall-cmd --list-all` と `getenforce` の3コマンドで最終チェックしてください。
サーバー構築の基礎からセキュリティ設定まで体系的に学びたい方は、Linux DNS 設定の基本など関連記事もあわせて読んでみてください。
サーバー公開後のセキュリティ不安を、体系的な知識で解消してください
初期セキュリティ設定は「一度やれば終わり」ではありません。OSアップデート・ログ監視・権限管理を継続して行うには、サーバー構築全体の「型」を身につけることが重要です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:Rocky Linuxサーバーを構築する手順|最小インストールから初期設定・Webサーバー公開まで
- 前のページへ:Linuxメール配送をPostfixで動かす最小構成|ローカル配送からテスト送信までの実践手順
- この記事の属するカテゴリ:Linuxtips・セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます