はじめに
エンドポイントのハードニングは、あらゆるコンピュータシステムを保護するための重要なプロセスです。これは、システムの「攻撃対象領域」を削減し、セキュリティ脅威に対する脆弱性を低減することを伴います。Linux システムのハードニングにおける 2 つの基本的な側面は、実行中のサービスの管理とファイアウォールの実装です。
この実験では、これらの不可欠なセキュリティプラクティスを実践的に体験します。以下の方法を学びます。
- システムの機能に不可欠ではないサービスを特定し、無効化する方法。
- Linux のネットワークフィルタリングルールを管理するためのユーザーフレンドリーなインターフェイスである Uncomplicated Firewall (UFW) をインストールおよび設定する方法。
この実験の終わりまでに、Linux エンドポイントに基本的なハードニング技術を適用する方法についての実践的な理解を得ることができます。
不要なサービスの特定と無効化
このステップでは、Linux システムでアクティブなサービスを特定し、不要なサービスを無効化する方法を学びます。実行中のサービス数を減らすことは、各サービスが潜在的に脆弱性を持つ可能性があるため、攻撃対象領域を最小限に抑えます。
まず、すべてのアクティブなサービスを一覧表示しましょう。一部の Linux 環境、特にコンテナでは systemctl コマンドが利用できない場合があります。代替として service コマンドを使用できます。
すべてのサービスのステータスを確認するには、ターミナルで次のコマンドを実行します。
service --status-all
サービスのリストが表示されます。サービス名の横にある [ + ] は実行中であることを示し、[ - ] は停止していることを示します。
[ - ] acpid
[ - ] apparmor
[ + ] apache2
[ - ] atop
[ - ] atopacct
[ + ] cron
...
ウェブサーバーである apache2 が実行されていることに注意してください。ウェブサイトをホストする必要のない汎用的なエンドポイントの場合、このサービスは不要であり、無効化する必要があります。
apache2 サービスを停止するには、stop を付けて service コマンドを使用します。システムサービスを管理するには sudo 権限が必要です。
sudo service apache2 stop
次に、ステータスを再度確認して、サービスが停止したことを確認します。
service apache2 status
出力により、Apache2 サービスが実行されなくなったことが確認されます。
○ apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2025-08-05 14:44:53 CST; 2s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 5892 ExecStop=/usr/sbin/apachectl graceful-stop (code=exited, status=0/SUCCESS)
Main PID: 4800 (code=exited, status=0/SUCCESS)
CPU: 50ms
不要なサービスを無効化することで、システムをハードニングするためのシンプルかつ効果的な一歩を踏み出しました。
Uncomplicated Firewall (UFW) のインストールと設定
このステップでは、Uncomplicated Firewall (UFW) をインストールします。UFW は、強力ですが複雑な iptables ファイアウォールのユーザーフレンドリーなフロントエンドです。一般的なファイアウォールルールを設定するための合理化された方法を提供します。
まず、パッケージリストを更新し、ufw パッケージをインストールします。
sudo apt-get update && sudo apt-get install -y ufw
インストールが完了すると、UFW はインストールされますが、まだアクティブではありません。以下のコマンドでステータスを確認できます。
sudo ufw status
出力は、ファイアウォールが非アクティブであることを示します。
Status: inactive
ファイアウォールをアクティブにするには、有効化する必要があります。このコマンドはファイアウォールを起動し、システム起動時に自動的に起動するように設定します。
注記: リモートサーバーでファイアウォールを有効にする際は、SSH アクセスを許可するルールが設定されていることを確認する必要があります。そうしないと、システムにアクセスできなくなる可能性があります。この Lab 環境では、そのまま進めても安全です。
今すぐ UFW を有効にします。
sudo ufw enable
操作の確認を求められます。このコマンドはファイアウォールを有効にし、既存の接続を中断する可能性があります。
Firewall is active and enabled on system startup
詳細(デフォルトポリシーを含む)を確認するために、verbose オプションを使用して再度ステータスを確認してみましょう。
sudo ufw status verbose
出力は、ファイアウォールがアクティブであり、デフォルトポリシーがリストされていることを示します。デフォルトでは、UFW はすべての着信トラフィックを拒否し、すべての発信トラフィックを許可します。これは安全な開始点です。
Status: active
Logging: off
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
ファイアウォールがアクティブになり、デフォルトですべての着信接続がブロックされるようになったため、リモートでシステム管理を継続できるように、SSH アクセスを許可する必要があります。
SSH 接続を許可するルールを追加します。
sudo ufw allow ssh
ルールが追加されたことの確認が表示されます。
Rule added
Rule added (v6)
これにより、ファイアウォールがアクティブな間も SSH アクセスが利用可能であることが保証されます。
基本的なファイアウォールルールの作成とテスト
UFW がアクティブになったので、ネットワークトラフィックを制御するためのルールを作成する方法を学びます。デフォルトですべてをブロックしながら、必要な特定のサービスを許可するルールを追加します。
まず、デフォルトポリシーが正しく設定されていることを確認しましょう。明示的に定義することは良い習慣です。
sudo ufw default deny incoming
sudo ufw default allow outgoing
前のステップで SSH アクセスが既に設定されているため、カスタムアプリケーション用のルールを追加しましょう。ポート 8080 でカスタム Web アプリケーションを実行していると仮定します。この特定のポートへのトラフィックを許可するルールを作成する必要があります。
sudo ufw allow 8080/tcp
このコマンドは、TCP ポート 8080 への着信トラフィックを具体的に許可します。
Rule added
Rule added (v6)
現在のルールのリストを表示するには、numbered オプションを付けて ufw status を使用できます。これにより、後でルールを管理または削除しやすくなります。
sudo ufw status numbered
出力には、各ルールの横に番号が付いた新しいルールが表示されます。
Status: active
To Action From
-- ------ ----
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 8080/tcp ALLOW IN Anywhere
[ 3] 22/tcp (v6) ALLOW IN Anywhere (v6)
[ 4] 8080/tcp (v6) ALLOW IN Anywhere (v6)
これで、必要なトラフィックのみを許可するようにファイアウォールが設定され、システムのセキュリティが大幅に向上しました。
ファイアウォールアクティビティのシステムログを確認する
このステップでは、UFW(Uncomplicated Firewall)のロギングを有効にし、そのログを確認する方法を学習します。ログは、ネットワークトラフィックの監視、潜在的なセキュリティ脅威の特定、接続問題のトラブルシューティングに不可欠です。
UFW のロギングはデフォルトでは有効になっていません。簡単なコマンドで有効にできます。
sudo ufw logging on
ロギングが有効になったことを示す確認メッセージが表示されます。
Logging enabled
UFW のログは /var/log/ufw.log ファイルに書き込まれます。ログを有効にした直後にはログファイルが存在しない場合があることに注意してください。最初のログエントリが書き込まれると、自動的に作成されます。
tail コマンドに -f (follow) フラグを付けて使用すると、ログファイルをリアルタイムで表示できます。ファイルがまだ存在しない場合、コマンドはそのファイルが作成されるまで待機します。
sudo tail -f /var/log/ufw.log
このコマンドはログの最後の数行を表示し、新しいエントリを待ち受けます。ライブ環境では、ファイアウォールが接続をブロックまたは許可するたびにログエントリが表示されます。この実験(Lab)環境では外部トラフィックがアクセスを試みていないため、新しいエントリが表示されない可能性があります。ログの追跡を停止するには Ctrl+C を押してください。
パケットがブロックされた場合の典型的なログエントリは次のようになります。
Sep 10 12:00:00 ubuntu kernel: [UFW BLOCK] IN=eth0 OUT= MAC=01:02:03:04:05:06:07:08:09:0a:0b:0c SRC=192.168.1.10 DST=192.168.1.20 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=12345 PROTO=TCP SPT=54321 DPT=23 WINDOW=0 RES=0x00 SYN URGP=0
重要なフィールドの簡単な内訳は次のとおりです。
[UFW BLOCK]: ファイアウォールによって実行されたアクションを示します。SRC: パケットの送信元 IP アドレス。DST: 宛先 IP アドレス。PROTO: ネットワークプロトコル(例:TCP、UDP)。DPT: 宛先ポート。
grep を使用してログファイルを検索し、特定のイベントを探すこともできます。たとえば、ブロックされたすべての接続試行を検索するには、次のように実行します。
sudo grep "UFW BLOCK" /var/log/ufw.log
ログファイルがまだ存在しないか空の場合、このコマンドは結果を返しませんが、これは正常です。ファイアウォールのアクティビティが発生するとログエントリが書き込まれ、検索できるようになります。このコマンドはログをフィルタリングし、「UFW BLOCK」という文字列を含む行のみを表示するため、疑わしいアクティビティのパターンを特定するのに非常に役立ちます。
まとめ
おめでとうございます!この Linux エンドポイントの強化に関する実験を無事に完了しました。
この実験では、基本的なセキュリティタスクの実践的な経験を積みました。以下の方法を学びました。
serviceコマンドを使用して Linux システムで実行中のサービスを特定する方法。- 不要なサービスを停止および無効にして、システムの攻撃対象領域を削減する方法。
- Uncomplicated Firewall (UFW) をインストール、有効化、および設定する方法。
- SSH やカスタムアプリケーションなどの必須サービスに対して特定の
allowルールを作成する方法。 - UFW ログを有効化および確認して、ファイアウォールアクティビティを監視し、潜在的な脅威を検出する方法。
これらは、セキュアで堅牢な Linux 環境の維持を担当するシステム管理者または開発者にとっての基本的なスキルです。これらのテクニックを適用することで、システムのセキュリティ体制を大幅に向上させることができます。



