Knowledge Center
技術情報などを公開しています
en ja zh

Ubuntu 22.04 LTS Webサーバー公開における初期セキュリティ設定ガイド

By Author
image

I. 序論

本稿では、公開Webサーバーとして運用する新しいUbuntu 22.04 LTSサーバーの初期セキュリティ設定において実施すべき重要な対策を解説します。公共のインターネットに接続されるサーバーは、絶えず様々な脅威に晒されるため、初期段階での堅牢化(ハードニング)が極めて重要です。

システムのアップデートと基本的なユーザー管理から始め、ファイアウォールの設定、SSHアクセスの保護、不要なサービスの無効化、そしてFail2Banやログ監視といった追加のセキュリティ対策に至るまで、包括的な手順を詳述します。これらの対策を講じることで、サーバーの攻撃対象領域を削減し、不正アクセスやデータ侵害のリスクを大幅に軽減することが期待できます。特に、ファイアウォールの適切な設定、不要なネットワークサービスの停止、そしてSSHアクセスの厳格な保護は、公開サーバーのセキュリティ基盤を確立する上で不可欠な要素です。

II. 初期サーバー準備

サーバーのセキュリティ堅牢化を開始する前に、いくつかの基本的な準備ステップを実行することが不可欠です。これには、システムの完全なアップデート、自動セキュリティアップデートの設定、そして管理者権限を持つ非rootユーザーの作成が含まれます。

A. システムの完全なアップデート

新しいサーバーをセットアップする際の最初の、そして最も重要なステップの一つは、システム全体を最新の状態に更新することです。これにより、既知の脆弱性に対する最新のセキュリティパッチやバグ修正が適用され、サーバーが潜在的な攻撃から保護されます。

アップデートプロセスは、以下のコマンドを順に実行します。

  1. パッケージリストの更新:
sudo apt update    

このコマンドは、設定されているリポジトリから利用可能なパッケージの最新情報を取得します。
2. インストール済みパッケージのアップグレード:

sudo apt upgrade -y    

このコマンドは、システムにインストールされている全てのパッケージを、パッケージリストに基づいて利用可能な最新バージョンにアップグレードします。-y オプションは、確認プロンプトを自動的に承認します。

これらのコマンドを定期的に実行することは、サーバーのセキュリティを維持する上で基本的な習慣となります。

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

手動でのアップデートに加えて、セキュリティアップデートを自動的に適用する仕組みを導入することは、継続的な保護を確保する上で非常に有効です。Ubuntuでは unattended-upgrades パッケージを利用してこれを実現できます。

  1. unattended-upgrades パッケージのインストール:
sudo apt install unattended-upgrades -y    
  1. 自動アップデートの設定:
    インストール後、対話的な設定ツールを使用して基本的な設定を行うことができます。
sudo dpkg-reconfigure --priority=low unattended-upgrades    

または

sudo dpkg-reconfigure -plow unattended-upgrades    

このコマンドを実行すると、自動アップデートを有効にするかどうかの確認が表示されます。「はい」を選択すると、基本的な設定が適用されます。
より詳細な設定のためには、以下の設定ファイルを編集します。

     Unattended-Upgrade::Allowed-Origins {      
             "${distro_id}:${distro_codename}-security";      
     };    
     APT::Periodic::Update-Package-Lists "1";      
     APT::Periodic::Download-Upgradeable-Packages "1";      
     APT::Periodic::AutocleanInterval "7";      
     APT::Periodic::Unattended-Upgrade "1";    

自動アップデートは非常に便利ですが、その動作ログ (/var/log/unattended-upgrades/) を定期的に確認し、アップデートが正しく適用されていること、また予期せぬ問題を引き起こしていないことを監視することが重要です。特に本番環境のWebサーバーでは、重要なアップデートがクリティカルなサービスに影響を与えないよう、ステージング環境で事前にテストした後に手動で適用する運用を選択する組織もあります。これは、迅速なパッチ適用とシステムの安定性との間のトレードオフを考慮した判断となります。

C. sudo権限を持つ非rootユーザーの作成

セキュリティのベストプラクティスとして、日常的な管理作業をrootユーザーで直接行うことは避けるべきです。代わりに、sudo権限を持つ一般ユーザーを作成し、必要な場合にのみ管理者権限を行使するようにします。これにより、誤操作によるシステムへの影響を最小限に抑え、操作の追跡可能性を高めることができます。

  1. 新しいユーザーの作成:
    <username> を希望するユーザー名に置き換えてください。
sudo adduser <username>    

このコマンドを実行すると、新しいユーザーのパスワード設定や、氏名などの付加情報の入力を求められます。

  1. ユーザーへのsudo権限の付与:
    作成したユーザーを sudo グループに追加することで、sudo コマンドを使用して管理者権限でコマンドを実行できるようになります。
sudo usermod -aG sudo <username>    

-aG オプションは、ユーザーを既存のグループに追加することを意味します。

  1. sudo権限のテスト:
    新しいユーザーでログインし直し(または su - <username> で切り替え)、sudo コマンドが正しく機能するかテストします。例えば、パッケージリストを更新してみます。
sudo apt update    

初めて sudo を使用する際には、そのユーザーのパスワードの入力を求められます。

rootアカウントを直接使用する代わりにsudo権限を持つ一般ユーザーを使用することは、「最小権限の原則」に従うものです。各管理操作が特定のユーザーに関連付けられるため、sudo を介したコマンド実行はログに記録され、監査証跡が強化されます。これは、共有されたrootアカウントアクセスよりもはるかに優れたセキュリティプラクティスです。

III. ファイアウォール設定 (UFW)

ファイアウォールは、サーバーへの不正なネットワークアクセスを制御し、許可されたトラフィックのみを通すための基本的なセキュリティコンポーネントです。Ubuntuでは、UFW (Uncomplicated Firewall) という使いやすいフロントエンドツールが提供されており、iptablesの複雑な設定を簡略化できます。

A. UFW (Uncomplicated Firewall) のインストール

UFWは通常、Ubuntuの標準インストールに含まれていますが、万が一インストールされていない場合は、以下のコマンドでインストールできます。

sudo apt install ufw -y    

B. デフォルトポリシーの設定

ファイアウォールの基本方針として、全ての着信接続をデフォルトで拒否し、全ての送信接続を許可する設定が推奨されます。これにより、明示的に許可されたサービス以外のポートは閉じられ、セキュリティが向上します。

  1. デフォルトの着信ポリシーを拒否に設定:
   sudo ufw default deny incoming    
  1. デフォルトの送信ポリシーを許可に設定:
   sudo ufw default allow outgoing    

この「デフォルトで拒否 (deny-by-default)」というアプローチは、基本的なセキュリティ原則であり、意図しないポートが外部に公開されるリスクを最小限に抑えます。

C. 必須サービスの許可

公開Webサーバーとして機能させるためには、特定のサービスへのアクセスを許可する必要があります。

  1. SSH接続の許可:
    サーバーへのリモート管理アクセスを確保するためにSSH接続を許可します。SSHがデフォルトポート (22) で動作している場合は、以下のコマンドを使用します。
   sudo ufw allow ssh    

SSHポートをカスタムポート(例: 2222)に変更している場合は、そのポート番号を明示的に指定します。

   sudo ufw allow 2222/tcp    

SSHポートを変更している場合、UFWを有効化する前にこのルールを追加することが極めて重要です。さもないと、サーバーからロックアウトされる可能性があります。

  1. HTTP接続の許可 (ポート80):
    WebサーバーがHTTPトラフィックを処理できるようにします。
   sudo ufw allow http    

または、ポート番号を直接指定します。

   sudo ufw allow 80/tcp    
  1. HTTPS接続の許可 (ポート443):
    セキュアなWeb通信 (SSL/TLS) のためにHTTPSトラフィックを許可します。
   sudo ufw allow https    

または、ポート番号を直接指定します。

   sudo ufw allow 443/tcp    

サーバーがIPv6アドレスも使用している場合、UFWの設定ファイル /etc/default/ufwIPV6=yes となっていることを確認することが推奨されます。これにより、設定したルールはIPv4とIPv6の両方に適用されます。

D. UFWの有効化と状態確認

必要なルールを設定した後、UFWを有効化します。

  1. UFWの有効化:
   sudo ufw enable    

このコマンドを実行すると、操作を続行するか確認を求められます。「y」を入力してEnterキーを押します。

  1. UFWの状態確認:
    UFWが有効であり、設定したルールが正しく適用されていることを確認します。
   sudo ufw status verbose    

このコマンドの出力には、ファイアウォールの状態(active/inactive)、デフォルトポリシー、および現在有効なルールの一覧が表示されます。

これらの手順により、UFWが設定され、サーバーのネットワークセキュリティが強化されます。

IV. SSHアクセスの保護

SSH (Secure Shell) はサーバーへのリモート管理アクセスに不可欠なプロトコルですが、同時に攻撃者にとって主要な標的ともなります。そのため、SSHアクセスを可能な限り安全に設定することが極めて重要です。

A. rootログインの無効化

rootユーザーによる直接のSSHログインを禁止することは、セキュリティの基本です。これにより、攻撃者がrootアカウントを直接狙うことを防ぎ、全ての管理操作がsudo権限を持つ一般ユーザー経由で行われることを強制します。

設定はSSHデーモンの設定ファイル /etc/ssh/sshd_config で行います。

sudo nano /etc/ssh/sshd_config    

ファイル内で PermitRootLogin という行を探し、以下のように変更または追加します。

PermitRootLogin no    

この設定は、rootユーザーがパスワードや鍵を使用してもSSH経由でログインできなくします。一部の設定例では PermitRootLogin prohibit-passwordPermitRootLogin without-password が見られますが、最も明確かつ安全な設定は PermitRootLogin no です。これに加えて、後述するパスワード認証の無効化 (PasswordAuthentication no) を組み合わせることで、SSHアクセスのセキュリティが大幅に向上します。

B. パスワード認証の無効化と鍵ベース認証の強制

パスワード認証はブルートフォース攻撃に対して脆弱であるため、より強力な認証方式である公開鍵認証の使用を強制することが強く推奨されます。

  1. SSHキーペアの生成 (クライアント側):
    クライアントマシン(サーバーに接続する側のマシン)でSSHキーペア(秘密鍵と公開鍵)を生成します。
   ssh-keygen -t rsa -b 4096    

または、より新しいアルゴリズムであるEd25519を使用することも推奨されます。

   ssh-keygen -t ed25519    

キー生成中にパスフレーズの設定を求められます。パスフレーズを設定すると、秘密鍵自体のセキュリティが向上します。

  1. 公開鍵のサーバーへのコピー:
    生成した公開鍵(通常は ~/.ssh/id_rsa.pub~/.ssh/id_ed25519.pub)の内容を、サーバー上の接続したいユーザーの ~/.ssh/authorized_keys ファイルに追記します。ssh-copy-id コマンドを使用すると、このプロセスを簡単かつ安全に行えます。
   ssh-copy-id <username>@<server_ip_address>    

<username> はサーバー上のユーザー名、<server_ip_address> はサーバーのIPアドレスまたはホスト名です。

  1. パスワード認証の無効化 (サーバー側):
    サーバーの /etc/ssh/sshd_config ファイルを編集し、PasswordAuthenticationno に設定します。
   PasswordAuthentication no    

また、関連する設定として ChallengeResponseAuthentication no も設定することが推奨される場合があります。

SSHキー認証を強制した後でも、サーバー上のユーザーアカウントが何らかの形で侵害された場合(例えば、Webアプリケーションの脆弱性を突かれた場合など)、そのユーザーの ~/.ssh/authorized_keys ファイルが改ざんされるリスクは残ります。これにより、攻撃者が自身の公開鍵を追加して不正アクセスを試みる可能性があります。したがって、SSH設定の堅牢化だけでなく、サーバー全体のセキュリティ対策(アプリケーションセキュリティ、定期的な監査など)が重要となります。また、ユーザーが組織を離れたり、アクセス権が不要になったりした場合には、速やかにそのユーザーの公開鍵を authorized_keys ファイルから削除する運用(デプロビジョニング)も不可欠です。

C. デフォルトSSHポートの変更

SSHのデフォルトポートである22番は、自動化されたボットによるブルートフォース攻撃の格好の標的となります。ポート番号を変更することで、これらの無差別な攻撃の多くを回避し、SSHログのノイズを大幅に削減できます。

  1. SSHポートの変更 (サーバー側):
    /etc/ssh/sshd_config ファイルを編集し、Port 22 の行をアンコメント(# を削除)して、希望するポート番号(例: Port 2222)に変更します。1024から65535の範囲で、他の既知のサービスと競合しないポートを選択します。
  2. ファイアウォール設定の更新:
    新しいSSHポートでの接続を許可するようにUFWのルールを更新します。
   sudo ufw allow 2222/tcp  # 2222を新しいポート番号に置き換える      
   sudo ufw delete allow ssh # デフォルトのSSHルールを削除(必要な場合)    

SSHポートの変更は、標的型攻撃を完全に防ぐものではありませんが、「セキュリティ・スルー・オブスキュリティ(隠蔽によるセキュリティ)」の一形態として機能します。その主な利点は、自動化されたスキャンや攻撃によるログの汚染を減らすことです。これにより、ログファイルがクリーンに保たれ、実際に疑わしい(標的型の)SSHアクセス試行があった場合に、それを検出しやすくなります。これは、後述するログ監視の効果を高める上で間接的に貢献します。

D. 特定ユーザー/グループへのSSHアクセス制限

サーバーへのSSHアクセスを、許可された特定のユーザーまたはグループのメンバーのみに制限することで、セキュリティをさらに強化できます。

/etc/ssh/sshd_config ファイルに以下のディレクティブを追加または変更します。

  AllowUsers user1 user2    
  AllowGroups sshusers    

この場合、事前に sshusers というグループを作成し、許可したいユーザーをそのグループに追加しておく必要があります (sudo addgroup sshuserssudo usermod -aG sshusers <username>)。複数のユーザーを管理する場合、AllowGroups を使用する方が運用が容易になることが多いです。

E. X11フォワーディングの無効化

サーバー上でGUIアプリケーションをSSH経由で使用する必要がない場合、X11フォワーディングを無効にすることで、攻撃対象領域をわずかに削減できます。

/etc/ssh/sshd_config ファイルで以下のように設定します。

X11Forwarding no    

F. SSHサービスの再起動

上記の設定変更を有効にするためには、SSHサービスを再起動する必要があります。

sudo systemctl restart sshd    

または

sudo systemctl restart ssh    

SSH設定ファイルを編集する際には、設定の順序が重要になる場合があります。特に、/etc/ssh/sshd_config ファイルの末尾近くに Include /etc/ssh/sshd_config.d/*.conf という行が存在することがあります。この Include ディレクティブより後に記述された設定が、.d ディレクトリ内のファイルの設定によって上書きされる可能性があるため注意が必要です。例えば、PasswordAuthentication no をメインファイルで設定しても、インクルードされるファイル内に PasswordAuthentication yes があれば、そちらが優先されることがあります。重要な設定は、Include 行より前に記述するか、関連する .d ディレクトリ内のファイルを直接編集することが確実です。

注意: SSH設定、特に認証方法やポート番号を変更した後は、現在のSSHセッションを閉じる前に、必ず別のターミナルから新しい設定でログインできることを確認してください。 確認を怠ると、サーバーからロックアウトされる危険性があります。

V. 不要なサービスの無効化

サーバー上で実行されているサービスは、それぞれが潜在的な攻撃対象となり得ます。公開Webサーバーの運用に直接必要ないサービスを特定し、無効化することは、攻撃対象領域 (attack surface) を削減し、システムリソースを節約するために重要なステップです。

A. 実行中のサービスの特定

まず、現在サーバー上でどのようなサービスが実行され、どのポートでリッスンしているかを把握する必要があります。

  1. 実行中のsystemdサービスユニットのリスト表示:
   sudo systemctl list-units --type=service --state=running    

このコマンドは、現在アクティブに実行されているサービスの一覧を表示します。
2. リッスンしているネットワークソケットの表示:

   sudo ss -tulnp    

このコマンドは、サーバーがリッスンしているTCPおよびUDPポートと、それらを使用しているプロセスを表示します。これにより、ネットワークに公開されているサービスを特定できます。古い netstat -tulnp コマンドも同様の目的で使用できますが、ss コマンドがより現代的で推奨されます。

B. Webサーバーに不要なサービスの特定

特定した実行中のサービスの中から、Webサーバーの運用に必須ではないものを見極めます。不要なサービスを無効化することで、セキュリティリスクが低減されるだけでなく、CPUやメモリといったシステムリソースが解放され、Webアプリケーション自体のパフォーマンス向上にも繋がります。また、管理対象となるソフトウェアが減ることで、アップデートやメンテナンスの負担も軽減されます。

以下は、一般的なUbuntuサーバー環境で見られるサービスと、公開Webサーバーにおけるその必要性についての考察です。無効化を検討する際には、そのサービスが他の重要なコンポーネントやWebアプリケーション自体に依存していないかを慎重に確認する必要があります。

サービス名 (Service Name) 主な機能 (Primary Function) Webサーバーにおける推奨 (Recommendation for Web Server) 備考・理由 (Notes/Justification)
apache2 / nginx Webサーバーソフトウェア 維持 (Keep) Webサイト提供に必須。通常はどちらか一方を使用。
sshd Secure Shellサービス 維持 (Keep) リモート管理に必須。IV章で説明したように堅牢化する。
ufw ファイアウォール 維持 (Keep) ネットワークセキュリティに必須。III章で説明したように設定する。
systemd-networkd / NetworkManager ネットワーク設定 維持 (Keep) ネットワーク接続に必須。通常はどちらか一方がアクティブ。
systemd-resolved ネットワーク名前解決 維持 (Keep) DNSルックアップに必須。
cron ジョブスケジューラ 維持 (Keep) システムタスク、バックアップスクリプト実行などに使用。
rsyslog / systemd-journald ロギング 維持 (Keep) 監視と監査に必須。ログ管理を設定する。
avahi-daemon Zeroconfネットワーキング (mDNS/DNS-SD) 無効化を検討 (Consider Disabling) 通常、公開サーバーには不要。ローカルネットワークサービス発見用。
cupsd (CUPS) 印刷サービス 無効化を検討 (Consider Disabling) サーバーがプリントサーバーとしても機能しない限り不要。
rpcbind RPCポートマッパー 無効化を検討 (Consider Disabling) NFSクライアント/サーバーなど特定のRPCサービスを使用しない場合は不要。
ModemManager モデム制御 無効化を検討 (Consider Disabling) ほとんどのサーバーには該当しない。
bluetooth.service Bluetoothサービス 無効化を検討 (Consider Disabling) ほとんどのサーバーには該当しない。
fail2ban 侵入防止ソフトウェア 維持 (Keep) SSHやWebサーバーログへのブルートフォース攻撃対策として強く推奨。VI.A章で設定。
unattended-upgrades 自動アップデート 維持 (Keep) セキュリティパッチの自動適用に推奨。II.B章で設定。
telnet.socket Telnetサービス 削除/無効化 (Remove/Disable) セキュアでないため絶対に使用しない。存在する場合は即座に削除。
snapd Snapパッケージ管理 状況による (Depends) Snapパッケージを使用しない場合は無効化を検討可能だが、Ubuntuでは広く利用されている。無効化するとSnap経由のアプリケーションが動作しなくなる。

不要なサービスを特定し無効化する過程は、システムアーキテクチャやサービス間の依存関係についての理解を深める良い機会ともなります。例えば、systemd-resolved を代替のDNSリゾルバなしに無効化すると、ネットワーク機能が損なわれる可能性があります。このような調査と判断は、将来のトラブルシューティングやシステム変更の際にも役立つ知識となります。

C. サービスの無効化と停止

不要と判断されたサービスは、現在実行中のプロセスを停止し、かつシステムの起動時に自動的に開始されないように設定します。

  1. サービスの即時停止:
   sudo systemctl stop <service_name>.service    
  1. 起動時の自動開始無効化:
   sudo systemctl disable <service_name>.service    
  1. 停止と無効化を同時に実行:
   sudo systemctl disable --now <service_name>.service    
  1. サービスを完全に実行不可能にする (より強力な方法):
    mask コマンドは、サービスユニットファイルを /dev/null にリンクすることで、手動での起動も含めてサービスが開始されるのを防ぎます。これは非常に強力な手段であり、元に戻すには unmask が必要です。慎重に使用してください。
   sudo systemctl mask <service_name>.service    

これらの手順を通じて、サーバーのセキュリティと効率性を高めることができます。

VI. 追加のセキュリティ対策の実装

基本的なファイアウォール設定、SSH保護、不要サービスの無効化に加えて、サーバーのセキュリティをさらに強化するための追加策を講じることが推奨されます。これには、ブルートフォース攻撃からの保護、ログ監視体制の確立、パスワードポリシーの強化、不要パッケージの削除などが含まれます。

A. Fail2Banのインストールと設定

Fail2Banは、サーバーのログファイル(特にSSHの認証ログやWebサーバーのエラーログなど)を監視し、ブルートフォース攻撃のような悪意のあるアクティビティを検出した場合に、攻撃元のIPアドレスを自動的にファイアウォールでブロックする侵入防止ソフトウェアです。

  1. インストール:
   sudo apt update      
   sudo apt install fail2ban -y    
  1. 設定:
    Fail2Banの設定は、主に /etc/fail2ban/ ディレクトリ内のファイルで行います。デフォルト設定ファイル (jail.conf) を直接編集するのではなく、ローカル設定ファイル (jail.local) を作成してカスタマイズするのが一般的です。これにより、パッケージのアップデート時にカスタム設定が上書きされるのを防ぎます。
   sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local    

または、/etc/fail2ban/jail.d/ ディレクトリ内にサービスごとの設定ファイル(例: sshd.local)を作成することもできます。
jail.local ファイル(または対応する .local ファイル)をテキストエディタで開き、SSH保護 ([sshd] セクション、またはグローバルな `` セクション) の設定を調整します。

  1. サービスの有効化と開始:
    設定後、Fail2Banサービスを有効化し、起動します。
   sudo systemctl enable fail2ban      
   sudo systemctl start fail2ban    
  1. 状態確認:
    Fail2Banが正しく動作しているか、また特定のjail(例: sshd)の状態やブロックされたIPアドレスを確認するには、以下のコマンドを使用します。
   sudo fail2ban-client status sshd    

Fail2Banは認証失敗後にIPをブロックするため、一見すると事後対応的なツールに見えます。しかし、その存在自体が、無差別な自動化攻撃を行う者に対する抑止力として機能する側面もあります。初期の探査的攻撃がすぐにブロックされることで、攻撃者はより防御の甘いターゲットへと移行する可能性があるためです。さらに、Fail2BanによってブロックされたIPアドレスのリストは、より広範な脅威インテリジェンスシステムへの情報提供源となり得ます。これにより、ローカルな防御ツールが、グローバルな脅威情報の収集と共有に貢献するという、より大きなセキュリティエコシステムへの繋がりが生まれます。

B. 基本的なログ監視と監査

システムログと監査ログを定期的に監視することは、不審なアクティビティ、潜在的なセキュリティ侵害の兆候、またはシステムエラーを早期に検出するために不可欠です。

  1. 主要なログ監視ツール:
    • journalctl: systemdによって収集されるジャーナルログを閲覧・分析するためのコマンドラインユーティリティです。特定のサービスユニット(例: sudo journalctl -u sshd)、時間範囲、優先度などでフィルタリング表示が可能です。
    • auditd (Linux Audit daemon): システムコールレベルでの詳細な監査証跡を記録します。これにより、ファイルアクセス、コマンド実行、システム設定の変更などを追跡できます。
      • インストール: sudo apt install auditd -y
      • 有効化と開始: sudo systemctl enable auditd && sudo systemctl start auditd
      • 基本的なルール設定例(コマンド実行の監査): sudo auditctl -a always,exit -F arch=b64 -S execve。このルールは非常に詳細なログを生成するため、ストレージ容量とシステムパフォーマンスへの影響を考慮し、必要な監査レベルに応じて調整する必要があります。
    • Logwatch: システムログを分析し、設定に基づいて日次レポートをメールで管理者に送信するツールです。
      • インストール: sudo apt install logwatch
      • レポート生成・送信例: sudo logwatch --detail high --mailto your-email@example.com --range today
  2. ログの場所と管理:
    主要なログは、伝統的に /var/log ディレクトリ(例: auth.log, syslog, apache2/access.log, apache2/error.log など)や、systemdジャーナルによって管理されます。セキュリティの観点からは、ログの改ざんや削除を防ぐために、ログを専用の集中ログサーバーに転送することが強く推奨されます。

効果的なログ監視は、単にログを収集するだけでは不十分です。公開Webサーバーは大量のアクセスログ、エラーログ、システムログを生成するため、その中から意味のある侵害の兆候(シグナル)をノイズから分離することが重要です。Logwatchのようなツールは概要把握に役立ちますが、トラフィックの多いサーバーでは、より高度なフィルタリングクエリや、SIEM (Security Information and Event Management) ソリューションの導入が必要になる場合もあります。例えば、auditd で全てのコマンド実行 (execve) を記録するとディスク容量を急速に消費する可能性があるため、監査ルールの継続的な見直しと調整、アラート閾値の最適化が、アラート疲れを防ぎ、重要なイベントを見逃さないために不可欠です。

C. パスワードポリシーの強化 (ローカルユーザーアカウントが存在する場合)

SSHアクセスは鍵ベース認証を主とすべきですが、コンソールからのログインや、他のローカルサービス(例: データベースアカウント)でパスワードが使用される場合に備え、強力なパスワードポリシーを適用しておくことが重要です。

  1. パスワード品質チェックライブラリのインストール:
    libpam-pwquality パッケージは、パスワードの複雑性要件を強制するのに役立ちます。
   sudo apt install libpam-pwquality -y    
  1. パスワードポリシーの設定:
    • /etc/login.defs: パスワードの最大有効期間 (PASS_MAX_DAYS)、最小有効期間 (PASS_MIN_DAYS)、警告期間 (PASS_WARN_AGE) などを設定します。
     PASS_MAX_DAYS   90      
     PASS_MIN_DAYS   10      
     PASS_WARN_AGE   7    

D. 不要なパッケージの削除

システムにインストールされているパッケージの中で、サーバーの運用目的(この場合はWebサーバー)に直接関係ないものは、攻撃対象領域をさらに最小化するために削除することを検討します。

例として、セキュアでない古いプロトコルのクライアントツールなどが挙げられます。

sudo apt remove telnet rsh-client rsh-redone-client -y    

その他、サーバーの用途に照らして不要と判断されるパッケージ(特定のゲーム、デスクトップ環境関連のアプリケーションなど)も削除対象となります。
これらの「追加の」セキュリティ対策は、それぞれが独立しているわけではなく、以前のステップで実施した堅牢化策を補強し、相互に依存しあっています。例えば、Fail2BanはSSHログを監視するため、SSHサービスが適切に設定され、ログが正しく出力されていることが前提となります。強力なパスワードポリシーは、万が一SSH鍵認証が何らかの理由でバイパスされた場合や、コンソールアクセス時の最後の砦となります。不要なパッケージを削除することで、監視すべきログの量が減り、Fail2Banが保護すべき潜在的なサービスも減少します。このように、各セキュリティ対策は連携して多層防御(defense-in-depth)戦略を形成します。

VII. 結論と継続的なセキュリティ

本稿では、Ubuntu 22.04 LTSを公開Webサーバーとして運用する際の初期セキュリティ設定について、段階的な手順と考慮事項を解説しました。これらの対策は、サーバーを堅牢化し、様々な脅威から保護するための強固な基盤を築くものです。

A. 主要な堅牢化ステップの要約

実施した主要な堅牢化ステップは以下の通りです。

  1. 初期サーバー準備: システムの完全なアップデート、自動セキュリティアップデートの設定、sudo権限を持つ非rootユーザーの作成。
  2. ファイアウォール設定 (UFW): デフォルトポリシーの「着信拒否・送信許可」設定、SSH・HTTP・HTTPSといった必須サービスの許可、UFWの有効化。
  3. SSHアクセスの保護: rootログインの無効化、パスワード認証の無効化と鍵ベース認証の強制、デフォルトSSHポートの変更、特定ユーザー/グループへのアクセス制限、X11フォワーディングの無効化。
  4. 不要なサービスの無効化: 実行中サービスの特定、Webサーバーに不要なサービスの選別と無効化・停止。
  5. 追加のセキュリティ対策: Fail2Banによるブルートフォース攻撃対策、journalctlauditdLogwatchを用いたログ監視と監査、パスワードポリシーの強化、不要パッケージの削除。

B. セキュリティは継続的なプロセスであることの強調

初期設定は非常に重要ですが、サーバーセキュリティは一度設定すれば完了というものではありません。脅威の状況は常に変化し、新たな脆弱性が日々発見されるため、セキュリティは継続的なプロセスとして捉える必要があります。

これらの堅牢化措置は技術的な側面に焦点を当てていますが、最も強固に設定されたサーバーでさえ、「人的要素」によって危険に晒される可能性があります。例えば、サーバー上で稼働するWebアプリケーションのパスワード管理の不備、管理者アカウントに対するフィッシング攻撃などがこれにあたります。したがって、継続的なセキュリティ意識の向上と、優れた運用慣行(セキュアコーディング、インシデント対応計画など)が、技術的な対策と同等に重要です。

また、予防的なセキュリティ対策ではありませんが、堅牢で定期的にテストされたバックアップ戦略は、セキュリティインシデント発生後の復旧において極めて重要な役割を果たします。ランサムウェア攻撃などによりサーバーが回復不可能な状態に陥った場合、クリーンで検証済みのバックアップが唯一の復旧手段となることがあります。

最後に、これらのセキュリティ対策を実施し維持するには、時間、リソース、場合によってはパフォーマンスへの影響といったコストが伴います。しかし、これらのコストは、セキュリティ侵害が発生した場合の潜在的なコスト(データ損失、風評被害、法的責任、業務停止など)と比較衡量されなければなりません。本稿で詳述した対策は、そのリスクを軽減するための投資と考えるべきです。

C. さらなる学習とリソース

本稿でカバーした内容は、Ubuntuサーバーセキュリティの基本的な側面に焦点を当てたものです。より深く学習を進めるためには、以下のリソースが役立ちます。

セキュリティは広範かつ奥深い分野であり、常に学び続ける姿勢が求められます。本稿が、読者の皆様のUbuntu 22.04 LTSサーバーをより安全に運用するための一助となれば幸いです。

おすすめの記事