Linuxサーバーのセキュリティ強化|中小企業でも実践できる10の対策

kento_morota 17分で読めます

「うちは小さい会社だから、サイバー攻撃の標的にはならないだろう」――この考えは非常に危険です。実際には、セキュリティが手薄な中小企業こそ攻撃者にとって格好のターゲットになっています。ランサムウェアやボットネットの攻撃は企業規模を問わず無差別に行われます。

本記事では、Linuxサーバーのセキュリティを強化するための10の具体的な対策を、中小企業のIT担当者やエンジニアがすぐに実践できる形で解説します。Linuxの基本についてはLinuxとは?の入門記事を、コマンド操作はLinuxコマンド実践ガイドをご参照ください。

対策1:OSとパッケージの自動更新を設定する

セキュリティ対策の最も基本かつ最も重要なステップは、OSとインストール済みパッケージを常に最新の状態に保つことです。既知の脆弱性を放置することは、玄関の鍵を開けっ放しにしているのと同じです。

手動でのアップデート

# Ubuntu/Debian系
sudo apt update && sudo apt upgrade -y

# CentOS/Rocky Linux系
sudo dnf update -y

自動セキュリティアップデートの設定

手動更新だけでは忘れる可能性があるため、セキュリティパッチの自動適用を設定しましょう。

# Ubuntu/Debian系:unattended-upgradesの設定
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

# 設定ファイルの確認
sudo cat /etc/apt/apt.conf.d/50unattended-upgrades
# CentOS/Rocky Linux系:dnf-automaticの設定
sudo dnf install -y dnf-automatic

# セキュリティアップデートのみ自動適用する設定
sudo vi /etc/dnf/automatic.conf
# [commands]
# upgrade_type = security
# apply_updates = yes

sudo systemctl enable --now dnf-automatic.timer

パッケージ管理の詳細はLinuxパッケージマネージャーガイドを参照してください。

対策2:SSH接続のセキュリティを強化する

SSHは、サーバーにリモートアクセスするための主要な手段です。そのため、最も攻撃を受けやすいサービスの一つでもあります。SSH接続の基本ガイドとあわせて、セキュリティを強化しましょう。

SSH鍵認証を導入し、パスワード認証を無効化する

# クライアント側でSSH鍵を生成
ssh-keygen -t ed25519 -C "your-email@example.com"

# 公開鍵をサーバーに転送
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server

# 鍵認証でログインできることを確認してからパスワード認証を無効化
sudo vi /etc/ssh/sshd_config

sshd_configで以下の設定を変更します。

# パスワード認証の無効化
PasswordAuthentication no

# rootログインの禁止
PermitRootLogin no

# 空パスワードの禁止
PermitEmptyPasswords no

# SSHプロトコルバージョン2のみ許可
Protocol 2

# ログイン試行回数の制限
MaxAuthTries 3

# ログインの猶予時間の制限
LoginGraceTime 30

# 接続を許可するユーザーを明示的に指定
AllowUsers deploy admin
# 設定の反映
sudo systemctl restart sshd

SSHポートの変更

デフォルトの22番ポートは自動攻撃の対象になりやすいため、変更することで無差別攻撃を大幅に減らせます。

# sshd_configでポートを変更
Port 2222

# ファイアウォールで新しいポートを許可してから再起動
sudo ufw allow 2222/tcp
sudo systemctl restart sshd

注意:ポート変更前に新しいポートをファイアウォールで許可し、別のターミナルで新ポートから接続できることを確認してから、旧ポートの許可を削除してください。

対策3:ファイアウォールを適切に設定する

ファイアウォールは、不要なネットワーク通信を遮断し、サーバーへのアクセスを制限する基本的な防御手段です。Linuxのファイアウォール設定で詳しく解説していますが、ここでは要点をまとめます。

UFW(Ubuntu/Debian系)の設定

# デフォルトポリシーを設定(すべて拒否が基本)
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 必要なサービスのみ許可
sudo ufw allow 2222/tcp   # SSH(変更後のポート)
sudo ufw allow 80/tcp     # HTTP
sudo ufw allow 443/tcp    # HTTPS

# 特定のIPからのみSSH接続を許可(より安全)
sudo ufw allow from 203.0.113.0/24 to any port 2222 proto tcp

# ファイアウォールを有効化
sudo ufw enable
sudo ufw status verbose

firewalld(CentOS/Rocky Linux系)の設定

# 有効なサービスの確認
sudo firewall-cmd --list-all

# 不要なサービスの削除
sudo firewall-cmd --permanent --remove-service=dhcpv6-client

# 必要なサービスの追加
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=2222/tcp

# 設定の反映
sudo firewall-cmd --reload

対策4:fail2banで不正アクセスを自動ブロックする

fail2banは、ログファイルを監視して不正なログイン試行を検知し、攻撃元のIPアドレスを自動的にファイアウォールでブロックするツールです。

fail2banのインストールと基本設定

# インストール
sudo apt install -y fail2ban   # Ubuntu/Debian系
sudo dnf install -y fail2ban   # CentOS/Rocky Linux系

# ローカル設定ファイルの作成
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local
# /etc/fail2ban/jail.local の設定例
[DEFAULT]
bantime = 3600        # BANの期間(秒):1時間
findtime = 600        # 監視期間(秒):10分
maxretry = 3          # この回数失敗したらBAN
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24  # 除外するIP

[sshd]
enabled = true
port = 2222           # SSH接続ポート
logpath = /var/log/auth.log
maxretry = 3

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
# fail2banの起動
sudo systemctl enable --now fail2ban

# BANされたIPの確認
sudo fail2ban-client status sshd

# 特定のIPのBAN解除
sudo fail2ban-client set sshd unbanip 203.0.113.100

対策5:不要なサービスを無効化する

サーバー上で不要なサービスが動作していると、そのサービスの脆弱性が攻撃の入口になる可能性があります。必要最小限のサービスだけを稼働させましょう。

# 現在動作中のサービスを確認
sudo systemctl list-units --type=service --state=running

# 不要なサービスの停止と自動起動の無効化
sudo systemctl stop cups          # 印刷サービス(サーバーでは不要なことが多い)
sudo systemctl disable cups
sudo systemctl stop avahi-daemon   # ローカルネットワーク検出
sudo systemctl disable avahi-daemon
sudo systemctl stop bluetooth      # Bluetooth(サーバーでは不要)
sudo systemctl disable bluetooth

# LISTENしているポートの確認
ss -tlnp

systemdによるサービス管理の詳細は、systemdとサービス管理ガイドを参照してください。

対策6:ユーザー管理とsudoの適切な運用

root権限の管理を適切に行うことは、セキュリティの基本です。Linuxのユーザー・グループ管理の知識が前提となります。

root直接ログインを避け、sudoを使う

# 管理用ユーザーの作成
sudo adduser admin-user

# sudo権限の付与
sudo usermod -aG sudo admin-user   # Ubuntu/Debian系
sudo usermod -aG wheel admin-user  # CentOS/Rocky Linux系

# sudo操作のログを確認
sudo grep "sudo" /var/log/auth.log

sudo権限を最小限にする

# /etc/sudoers の編集(visudoを使う)
sudo visudo

# 特定のコマンドのみ許可する例
# deploy-user ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart myapp

不要なユーザーアカウントの管理

# ログインシェルのないシステムアカウントを確認
awk -F: '($7 != "/usr/sbin/nologin" && $7 != "/bin/false") {print $1, $7}' /etc/passwd

# 退職者のアカウントをロック
sudo passwd -l former-employee

# 長期間ログインしていないユーザーの確認
sudo lastlog | grep -v "Never"

対策7:ファイルパーミッションとディレクトリ権限の見直し

不適切なファイルパーミッションは、情報漏洩や権限昇格の原因になります。ファイルパーミッションの基本を理解した上で、以下の点を確認しましょう。

重要ファイルのパーミッション確認

# パスワードファイルの確認
ls -la /etc/passwd /etc/shadow /etc/group
# /etc/passwd は 644(読み取り可)
# /etc/shadow は 640 または 600(rootのみ読み取り可)

# SSH設定と鍵ファイルの確認
ls -la /etc/ssh/
ls -la ~/.ssh/
# 秘密鍵は 600、公開鍵は 644、.sshディレクトリは 700

# SUID/SGID ビットが設定されたファイルの検索
sudo find / -perm /4000 -type f 2>/dev/null
sudo find / -perm /2000 -type f 2>/dev/null

ワールドライタブルなディレクトリの確認

# 誰でも書き込めるディレクトリの検索
sudo find / -type d -perm -0002 -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null

# 誰でも書き込めるファイルの検索
sudo find / -type f -perm -0002 -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null

対策8:ログの監視と異常検知

セキュリティインシデントの早期発見には、ログの定期的な監視が不可欠です。Linuxのログ管理ガイドもあわせて活用してください。

重要なログファイル

  • /var/log/auth.log(Ubuntu)または/var/log/secure(CentOS):認証関連のログ
  • /var/log/syslogまたは/var/log/messages:システムの一般的なログ
  • /var/log/nginx/access.log:Webサーバーのアクセスログ
  • /var/log/fail2ban.log:不正アクセスのブロックログ

不審なアクティビティの検知

# SSHログイン失敗の確認
sudo grep "Failed password" /var/log/auth.log | tail -20

# 不正なSSHログイン試行のIPアドレスを集計
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20

# rootへのsu試行を確認
sudo grep "su:" /var/log/auth.log | grep "FAILED"

# 最近のログインユーザーの確認
last | head -20

# 現在ログイン中のユーザーの確認
w

logwatchで日次サマリーレポートを受け取る

# logwatchのインストール
sudo apt install -y logwatch

# メールで日次レポートを受け取る設定
sudo logwatch --output mail --mailto admin@example.com --detail high --range yesterday

対策9:カーネルパラメータのセキュリティ強化

Linuxカーネルのパラメータを調整することで、ネットワーク攻撃への耐性を高められます。カーネルチューニングの基礎も参考にしてください。

# /etc/sysctl.conf に追加
# IPスプーフィング対策
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# SYN flood攻撃対策
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2

# ICMPリダイレクトの無効化
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# ソースルーティングの無効化
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# ブロードキャストICMPへの応答無効化(Smurf攻撃対策)
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 不正なICMPメッセージのログ記録
net.ipv4.icmp_ignore_bogus_error_responses = 1

# IPv6を使用しない場合は無効化
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# 設定の即時反映
sudo sysctl -p

対策10:定期的なセキュリティ監査を実施する

セキュリティ対策は一度設定したら終わりではありません。定期的な監査と見直しが重要です。

Lynis(セキュリティ監査ツール)の活用

# Lynisのインストール
sudo apt install -y lynis   # Ubuntu/Debian系

# セキュリティ監査の実行
sudo lynis audit system

# レポートの確認
sudo cat /var/log/lynis-report.dat

Lynisは、システムの設定をスキャンして脆弱性や改善点を一覧で表示してくれる便利なツールです。

ClamAV(ウイルススキャン)の導入

# ClamAVのインストール
sudo apt install -y clamav clamav-daemon

# ウイルス定義の更新
sudo freshclam

# ディレクトリのスキャン
sudo clamscan -r /var/www/ --infected --log=/var/log/clamav/scan.log

定期的なチェックリスト

以下の項目を定期的に確認しましょう。

  • 週次:auth.logの不審なアクティビティ確認、fail2banのBAN状況確認
  • 月次:ユーザーアカウントの棚卸し、不要なサービスの確認、パッケージの脆弱性確認
  • 四半期:Lynisによるセキュリティ監査、バックアップの復元テスト、SSH鍵の確認
  • 年次:セキュリティポリシーの見直し、SSL証明書の有効期限確認、DR訓練

まとめ:10の対策で堅牢なLinuxサーバーを構築しよう

本記事で解説した10の対策をまとめます。

  1. OS・パッケージの自動更新:既知の脆弱性を放置しない
  2. SSH接続のセキュリティ強化:鍵認証必須、rootログイン禁止
  3. ファイアウォールの適切な設定:必要なポートのみ開放
  4. fail2banによる不正アクセスブロック:自動防御の仕組み化
  5. 不要なサービスの無効化:攻撃対象面の最小化
  6. ユーザー管理とsudoの適切な運用:最小権限の原則
  7. ファイルパーミッションの見直し:不適切な権限設定の修正
  8. ログの監視と異常検知:インシデントの早期発見
  9. カーネルパラメータの強化:ネットワーク攻撃への耐性向上
  10. 定期的なセキュリティ監査:継続的な改善

すべてを一度に実施する必要はありません。まずは対策1(自動更新)、対策2(SSH強化)、対策3(ファイアウォール)の3つから着手し、段階的に対策を広げていきましょう。

データの保全についてはバックアップと復元ガイドを、サーバーの安定運用についてはパフォーマンス監視入門もあわせてお読みください。また、AIツールを活用した効率的な開発環境の構築については、Claude Codeセットアップガイドをご覧ください。

#Linux#セキュリティ#サーバー
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

AI活用のヒントをお探しですか?お気軽にご相談ください。

まずは話だけ聞いてもらう