【実務・中級編】 AWS Security Groupのインバウンドルールにおける0.0.0.0/0制限と自動監査 – 暗号理論・認証基盤 & エンドポイントセキュリティ防御ガイド

0.0.0.0/0 という「死の門」を閉ざせ:AWSインフラを自動防御する泥臭い実戦論

エンジニア諸君、現場の運用は順調か?
「とりあえず疎通確認のために0.0.0.0/0を開けておいた」――その一言が、数年後に悪夢のようなインシデントの引き金になる。私がこれまで見てきた侵入事件の8割は、こうした「一時的な開放」の放置から始まっている。

暗号技術がどれほど堅牢でも、玄関の鍵を開けっ放しにしては意味がない。今日は、AWSのセキュリティグループ(SG)における「0.0.0.0/0」という脆弱性の正体と、それを人間が監視するのではなく、コードでねじ伏せるための戦術を共有する。

—

1. なぜ「0.0.0.0/0」が全エンジニアの敵なのか

攻撃者は常にスキャンしている。nmapやmasscanといったツールを使えば、地球上の全IPアドレスのポート開放状態を数時間でなめ尽くすことは容易だ。

もし君たちのSSH(22番)やRDP(3389番)、あるいは未設定の管理画面がインターネットに晒されていれば、攻撃者は「ブルートフォース攻撃」を開始する。ここでRSAやECDSAといった公開鍵暗号の強度が試されることになるが、そもそも「攻撃者に認証の機会すら与えない」ことこそが、最強の防衛だ。

攻撃者の視点:PoCの一例

攻撃者はまず、ターゲットのIP範囲に対してTCP接続を試みる。

# 攻撃者がターゲットのポートをスキャンする様子
nmap -p 22,80,443,3306,6379 1.2.3.4/24 --open

もしここで、DBポート(3306)やRedis(6379)が公開されていれば、次は辞書攻撃や既知の脆弱性を突くスクリプトが自動で走り出す。0.0.0.0/0の開放は、自ら「ここに脆弱な扉がありますよ」と看板を掲げているのと同じだ。

—

2. 自動監査の要:AWS Configで「設定漏れ」を物理的に消す

人間はミスをする。だからこそ、仕組みで縛る。AWS Configの「マネージドルール」を使えば、セキュリティグループの違反を検知し、自動修復(Remediation)を走らせることが可能だ。

設定の勘所

AWS Configのルール restricted-common-ports を有効化し、以下のパラメータを適用する。

  • ルール名: restricted-common-ports
  • 対象ポート: 22, 3389, 27017, 6379(これらは絶対に外に晒してはならない)

しかし、これだけでは足りない。特定のアプリ用ポートなどは独自ルールが必要になる。そんな時は、AWS Lambdaを使ったカスタムRemediationが最強の武器になる。

—

3. 【実践】違反SGを自動で剥ぎ取るLambda関数(Python)

以下のコードは、AWS Configが「0.0.0.0/0を許可しているSG」を検知した瞬間に、対象のルールを削除(または拒否)するスクリプトだ。これをLambdaに載せれば、深夜のデプロイミスも即座に無効化できる。

import boto3

ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    # AWS Configからイベント情報を受け取る
    invoking_event = event['invokingEvent']
    configuration_item = event['configurationItem']
    sg_id = configuration_item['configuration']['groupId']
    
    # 0.0.0.0/0 を許可しているセキュリティグループを特定し、ルールを削除する
    # ※本番投入時は、特定のSG IDのみに絞るか、ホワイトリスト判定を入れること
    try:
        ec2.revoke_security_group_ingress(
            GroupId=sg_id,
            IpPermissions=[
                {
                    'IpProtocol': 'tcp',
                    'FromPort': 22,
                    'ToPort': 22,
                    'IpRanges': [{'CidrIp': '0.0.0.0/0'}]
                }
            ]
        )
        print(f"セキュリティ違反を検知: {sg_id} の 22番ポートを閉鎖しました。")
    except Exception as e:
        print(f"エラー発生: {e}")

運用上の注意点:
このスクリプトをいきなり本番環境で「自動削除モード」にするな。まずは「通知(SNS)」だけ飛ばすモードで運用し、安全を確認してから削除アクションを有効にすること。

—

4. 最後に:暗号理論と境界防御のバランス

RSAやECDSAを用いた公開鍵暗号は、通信の「中身」を守る。しかし、境界防御(SG設定)は「箱」そのものを守る。

  • Webアプリ開発者へ: 認証基盤には必ずJWT(JSON Web Token)やOAuth 2.0を導入し、暗号学的署名を検証すること。
  • インフラエンジニアへ: 「信頼できるIPのみを許可する」という原則を徹底し、どうしても外部アクセスが必要な場合は、AWS WAFやVPN(AWS Client VPN / Systems Manager Session Manager)を介在させ、直接的なポート開放を排除せよ。

0.0.0.0/0は、利便性と引き換えにセキュリティを投げ捨てる行為だ。その「利便性」を、SSM Session Managerのようなセキュアな手段に置き換えることこそ、プロのエンジニアの仕事だ。

現場からは以上だ。君たちのインフラが、鉄壁であることを願っている。

コメント

タイトルとURLをコピーしました