Ubuntuで不要なポートを開けっぱなしにしていませんか。
サイバー攻撃者はネットワークスキャンなどの手法を使い、開いているポートを特定して攻撃の足掛かりにします。
サイバー攻撃の脅威が高まる現代、Ubuntu環境を安全に運用するためには、不要なポートを閉じる方法を理解し、適切な対策を講じることが欠かせません。不要なポートを閉じることで、攻撃者の侵入経路を減らし、システムの安全性を確保する第一歩となります。
そこで本記事では、Ubuntuで不要なポートを閉じる方法を、具体的なコマンドを使って解説します。さらに、攻撃者の視点で見たサーバーの状態についても、分かりやすく解説しています。
初心者から中級者まで役立つ情報満載ですので、ぜひご覧ください!
この記事で使用した検証環境
システム構成
Nmap実行マシン | ターゲットマシン | |
---|---|---|
OS | Kali Linux 2025.1 | Ubuntu Server 24.04.1 LTS |
IPアドレス | 192.168.10.11 | 192.168.21.102 |
ミドルウェア | Nmap 7.95 | ufw 0.36.2 |
Kali Linuxやポートスキャンについて、詳しく知りたい方は、下記の記事もあわせてご覧ください。
- Kali Linux
- ポートスキャン
本記事の検証では、ローカルマシンに構築した仮想ネットワーク内にて、ポートスキャンを実施しています。管理下にないサーバーへのポートスキャンは、法律に反する場合があります。倫理的な問題だけでなく、法的リスクを伴うため、正当な許可を得た環境内でのみ実施してください。
サイバー攻撃者が見る「開いているポート」とは?
サイバー攻撃者にとって、ネットワーク侵入の第一歩は開いているポートの調査です。この調査はポートスキャンと呼ばれ、攻撃の準備段階として非常に重要な工程です。ポートスキャンは、攻撃者がターゲットとするサーバーやネットワーク上で利用可能なサービスを特定するために行われます。
では何故、攻撃者にとって「開いているポート」が重要なのでしょうか?
それは、ポートが開いているということは、そのポートが関連付けられたアプリケーションやサービスが稼働している可能性を示すからです。例えば、22番ポートが開いていればSSHが利用可能であると推測され、80番ポートであればHTTPサービスが動作していると考えられます。これらの情報を得ることで、攻撃者はサーバーに侵入するための最適な攻撃手法を選択できるのです。
攻撃に利用されやすいポートの例
ポート番号 | プロトコル/サービス | 主なリスクと攻撃例 |
---|---|---|
21 | FTP | パスワードスニッフィング、ディレクトリトラバーサル |
22 | SSH | ブルートフォース攻撃 |
445 | SMB | ランサムウェア感染、EternalBlue攻撃 |
1433 | SQL Server | データベース漏洩、権限昇格攻撃 |
3389 | RDP | リモートデスクトップの不正アクセス |
あなたのサーバーは攻撃者にどう見えるのか?
Nmap実行マシンからターゲットマシンに対してポートスキャンを実施すると、以下のような実行結果が得られます。
$ nmap 192.168.21.102
〜 省略 〜
PORT STATE SERVICE
22/tcp open ssh
〜 省略 〜
上記の実行結果より、22番ポート(ssh)が稼働していることが分かります。
また、オプションを組み合わせることで、そのポートで稼働しているサービス名やバージョンなど、より詳細情報も得ることができます。
$ nmap -sV 192.168.21.102
〜 省略 〜
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.5 (Ubuntu Linux; protocol 2.0)
〜 省略 〜
稼働中のSSHのバージョンが攻撃者に知られることになり、既知の脆弱性が含まれていれば、攻撃の足掛かりとして利用される可能性があります。
Ubuntuで不要なポートを閉じる方法
Ubuntu標準のファイアウォールであるufw(Uncomplicated Firewall)を用いて、不要なポートを閉じます。
ufwの状態確認
ufwサービスの状態確認
systemctlコマンドで、ufwサービスが起動しているかを確認できます。
$ sudo systemctl status ufw
● ufw.service - Uncomplicated firewall
Loaded: loaded (/usr/lib/systemd/system/ufw.service; enabled; preset: enabled)
Active: active (exited) since Wed 2025-03-05 22:17:01 UTC; 8min ago
ufwサービスが起動している場合、Active: active (exited)
と表示されます。
- ufwサービスが起動している場合、Active: active (exited)
- ufwサービスが停止している場合、Active: inactive (dead)
Active: inactive (dead)と表示される場合、ufwサービスは起動していません。誤って停止させてしまったのか、理由があって停止しているのか、状況を正確に把握する必要があります。
ufwサービスはシステム起動時に設定を読み込むと、その後はバックグラウンドで必要な監視を行います。そのため、アクティブな処理が不要な場合、プロセスは終了状態("exited")となります。しかし、この状態であってもufwは正常に動作しており、外部からの不正アクセスを防いでいます。
ufwルールの状態確認
ufwルールが有効になっているかは、ufwコマンドで確認できます。
$ sudo ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
22 (v6) ALLOW Anywhere (v6)
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22 ALLOW IN Anywhere
22 (v6) ALLOW IN Anywhere (v6)
ufwルールが有効の場合、Status: active
となり、ルールも一緒に表示されます。ufwルールが無効の場合、Status: inactive
と表示されます。
- ufwルールが有効の場合、Status: active
- ufwルールが無効の場合、Status: inactive
ufwルールは、設定ファイルでも確認することができます。
IPv4の設定
$ sudo cat /etc/ufw/user.rules
〜 省略 〜
-A ufw-user-input -p tcp --dport 22 -j ACCEPT
-A ufw-user-input -p udp --dport 22 -j ACCEPT
〜 省略 〜
IPv6の設定
$ sudo cat /etc/ufw/user6.rules
〜 省略 〜
-A ufw6-user-input -p tcp --dport 22 -j ACCEPT
-A ufw6-user-input -p udp --dport 22 -j ACCEPT
〜 省略 〜
ポートを閉じる具体的なコマンド
許可ルールを削除する場合
$ sudo ufw delete allow 22
Rule deleted
Rule deleted (v6)
ufwは、外部から内部への受信トラフィック(incoming)をデフォルトで拒否する設定になっています。そのため、許可ルールを削除するだけで、該当する通信を遮断することができます。
また、下記のように、ルール番号を指定して、ルールを削除することもできます。
$ sudo ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN Anywhere
[ 2] 22 (v6) ALLOW IN Anywhere (v6)
$sudo ufw delete 1
Deleting:
allow 22
Proceed with operation (y|n)? y
Rule deleted
ufwコマンドにてルールを削除すると、設定ファイルに自動反映されます。
- /etc/ufw/user.rules
- /etc/ufw/user6.rules
拒否ルールを追加する場合
$ sudo ufw deny 22
Rule updated
Rule updated (v6)
拒否ルールに22番ポートを追加します。
設定ファイルを確認すると、22番ポートの許可ルールが削除され、拒否ルールが追加されたことが確認できます。
- /etc/ufw/user.rules
- 【削除】 -A ufw-user-input -p tcp --dport 22 -j ACCEPT
- 【削除】 -A ufw-user-input -p udp --dport 22 -j ACCEPT
- 【追加】 -A ufw-user-input -p tcp --dport 22 -j DROP
- 【追加】 -A ufw-user-input -p udp --dport 22 -j DROP
- /etc/ufw/user6.rules
- 【削除】 -A ufw6-user-input -p tcp --dport 22 -j ACCEPT
- 【削除】 -A ufw6-user-input -p udp --dport 22 -j ACCEPT
- 【追加】 -A ufw6-user-input -p tcp --dport 22 -j DROP
- 【追加】 -A ufw6-user-input -p udp --dport 22 -j DROP
SSH接続が利用できなくなることでメンテナンス作業に影響を及ぼす可能性があるため、22番ポートを閉じる対応が困難な場合もあります。その場合には、下記の対策を実施することでセキュリティリスクを軽減することができます。
- 特定のIPアドレスからの接続のみ許可する。
- sshの受付ポートを22番ポートから別ポートに変更する。
- パスワード認証から鍵認証に変更する。
- rootユーザーのログインを禁止する。
- Fail2banでブルートフォース攻撃を防止する。
ポートを閉じると攻撃者にはどう見えるのか?
$ nmap 192.168.21.102
〜 省略 〜
All 1000 scanned ports on 192.168.21.102 are in ignored states.
Not shown: 1000 filtered tcp ports (no-response)
〜 省略 〜
$ nmap -p 22 -sV 192.168.21.102
〜 省略 〜
PORT STATE SERVICE VERSION
22/tcp filtered ssh
〜 省略 〜
STATE(状態)がopen
からfiltered
に切り替わり、ポートスキャンをブロックしていることが分かります。バージョン情報も出力されなくなり、サイバー攻撃のリスクを軽減することができます。
不要なポートを閉じるだけでは不十分!総合的な対策が必要
不要なポートを閉じることはサーバーのセキュリティを強化する上で重要なステップですが、それだけでは万全とは言えません。他のセキュリティ対策と併用し、総合的な防御体制を築く必要があります。
定期的なポートスキャン
自分が管理するサーバーに対してポートスキャンを行うことで、予期せず開いてしまったポートや、不要なサービスが稼働していないかを確認できます。
- OSやアプリケーションのアップデートで新たに開放されたポート
- デバッグ用に一時的に開けたポート
- 試験的に稼働させたサービスのポートがそのまま放置されている
これらのポートを放置してしまうと、攻撃者に新たな侵入経路を提供してしまう危険性があります。
ICMPを無効にする
ICMP(Internet Control Message Protocol)は、ネットワークデバイス間の通信状態を確認するための重要なプロトコルです。ICMPエコーリクエスト(いわゆる「ping」)は、特にネットワークの疎通確認に使われますが、その特性を悪用され、攻撃の起点として利用されるリスクも存在します。そのため、不要な場合はICMPを無効にすることがセキュリティ向上につながります。
他のセキュリティサービスとの併用
ファイアウォール(ufwなど)の設定を最適化するだけでなく、侵入検知システム(IDS)や侵入防止システム(IPS)を導入することで、潜在的な攻撃を早期に検出できます。これにより、開いているポートやサービスを狙った攻撃が試みられた際に警告を受け取り、迅速に対応することが可能です。