Linuxサーバーの初期セキュリティ設定チェックリスト|公開直後にやるべき10項目を実機で解説

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, セキュリティ > Linuxサーバーの初期セキュリティ設定チェックリスト|公開直後にやるべき10項目を実機で解説
「サーバーを公開したはいいけど、セキュリティ設定を何からやればいいかわからない」
Linuxサーバーを立ち上げたばかりのエンジニアから、こういう質問をよく受けます。

この記事では、Linuxサーバーを公開直後に必ず実施すべき初期セキュリティ設定を10項目のチェックリスト形式でまとめます。
RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS の実機で動作確認済みのコマンドをベースに、「なぜ必要か」の背景と「どう確認するか」の手順をセットで解説します。

この記事のポイント

・公開直後のLinuxサーバーに必須の10項目を網羅したチェックリスト
・SSH設定・firewalld・SELinux・sudoの4本柱が最重要
・「確認コマンド」と「設定コマンド」をセットで掲載
・1項目ずつ完了を確認しながら進める実践手順


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜ初期セキュリティ設定が重要なのか

インターネットに公開されたサーバーへの攻撃は、公開後数分以内に始まります。
実際に私がセミナーで使う検証サーバーをそのまま公開してアクセスログを確認すると、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

注意: sshd再起動前に別のターミナルでSSH接続を1本開いておくと、設定ミスでもロックアウトを防げます。

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ポートを変更した場合」は、変更後のポートを忘れずに開放してください。

# 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

どのサービスが不要かはサーバーの役割によります。Webサーバーであれば、nginx または apache2 / httpd 以外のサービスで不審なものは調べてから判断してください。

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

SSH・HTTP・HTTPS 以外に不審なポートがListenしていないか確認してください。詳細なポート確認の方法はLinux ポート確認の全コマンドもあわせて参照してください。

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ポートがないか確認
サーバーの役割(WebサーバーなのかMailサーバーなのか)によって必要な設定は変わりますが、この10項目はすべてのLinuxサーバーに共通して必要な基本設定です。

1項目ずつ確認しながら設定を進め、設定が終わったらもう一度 `ss -tlnp` と `firewall-cmd --list-all` と `getenforce` の3コマンドで最終チェックしてください。

サーバー構築の基礎からセキュリティ設定まで体系的に学びたい方は、Linux DNS 設定の基本など関連記事もあわせて読んでみてください。

サーバー公開後のセキュリティ不安を、体系的な知識で解消してください

初期セキュリティ設定は「一度やれば終わり」ではありません。OSアップデート・ログ監視・権限管理を継続して行うには、サーバー構築全体の「型」を身につけることが重要です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。