セキュリティ対策の基本 #7 【ファイアウォール】(覚え書き)

セキュリティ

現代のネットワーク環境では、さまざまな脅威から情報資産を守るために「多層防御」が欠かせません。この記事では、ファイアウォールの仕組みやその限界、不正プログラム(マルウェア)対策、そして不審なアクセスを見逃さないための 侵入検知システム(IDS)侵入防止システム(IPS) の基本を、分かりやすくポップに解説していきます。

ファイアウォールでネットワークを守ろう!

ファイアウォールって何?

ファイアウォールは、ネットワークの入り口に立つ守衛のようなもの。
パケットフィルタリングという技術を使い、TCP/IPのヘッダー情報をもとに「通していい通信」と「ブロックする通信」を判断します。
たとえば、以下のようなルールが設定されることが多いです。

  • 例:ファイアウォールの設定ルール
    • 任意のホストから 172.16.1.122/tcp(SSH)への接続を許可
    • 任意のホストから 172.16.1.280/tcp(Webサーバ)への接続を許可
    • 任意のホストから 172.16.1.925/tcp(メールサーバ)への接続を許可
    • 192.168.0.153/udp(DNSサーバ)から 172.16.1.0/24 ネットワーク内への通信を許可
    • それ以外の通信はすべて拒否

ただし、ファイアウォールは「通信内容の中身」まではチェックしないため、ウイルスが添付されたメールなど、内部の危険なコンテンツには気づかないことも…。

Pythonでシンプルなファイアウォールのシミュレーション

以下は、Python でルールに基づきパケットをチェックする簡単な例です。
このコードでは、ルールリストにマッチするかどうかをチェックし、許可または拒否の判断をシミュレートしています。

# シンプルなファイアウォールシミュレーション

# ファイアウォールルールの定義
rules = [
    {"action": "permit", "protocol": "tcp", "dst_ip": "172.16.1.1", "dst_port": 22},
    {"action": "permit", "protocol": "tcp", "dst_ip": "172.16.1.2", "dst_port": 80},
    {"action": "permit", "protocol": "tcp", "dst_ip": "172.16.1.9", "dst_port": 25},
    # UDPの例: 192.168.0.1からのDNS応答を許可(シンプル化のためチェックはdst_ipとdst_portのみ)
    {"action": "permit", "protocol": "udp", "src_ip": "192.168.0.1", "dst_network": "172.16.1.", "dst_port": 53},
]

def check_packet(packet):
    """
    packetは以下のような辞書とする例:
    {
        "protocol": "tcp",
        "src_ip": "10.0.0.5",
        "dst_ip": "172.16.1.2",
        "dst_port": 80
    }
    """
    for rule in rules:
        # プロトコルのチェック
        if packet["protocol"] != rule.get("protocol"):
            continue
        
        # TCPの場合:dst_ipとdst_portのチェック
        if packet["protocol"] == "tcp":
            if packet["dst_ip"] == rule.get("dst_ip") and packet["dst_port"] == rule.get("dst_port"):
                return rule["action"]
        # UDPの場合:送信元IP、宛先IPのネットワーク部分とポートをチェック
        elif packet["protocol"] == "udp":
            if ("src_ip" in rule and packet["src_ip"] == rule["src_ip"] and
                packet["dst_ip"].startswith(rule["dst_network"]) and packet["dst_port"] == rule["dst_port"]):
                return rule["action"]
    return "deny"  # ルールに一致しない場合は拒否

# テストパケット例
packet1 = {"protocol": "tcp", "src_ip": "203.0.113.5", "dst_ip": "172.16.1.2", "dst_port": 80}
packet2 = {"protocol": "tcp", "src_ip": "203.0.113.5", "dst_ip": "172.16.1.3", "dst_port": 80}

print("Packet1:", check_packet(packet1))  # permit が返るはず
print("Packet2:", check_packet(packet2))  # deny が返るはず

このように、ルールに沿った処理で「許可」や「拒否」を判断するロジックを作ることで、ファイアウォールの基本的な動きを理解できます。

不正プログラム対策 – マルウェアの世界を理解しよう!

マルウェアは、コンピュータに悪影響を与えるプログラム全般を指します。
代表的な種類は次のとおりです:

  • ウイルス
    プログラムに付加され、他のプログラムを介して感染する。
  • ワーム
    独立して動作し、ネットワーク経由で自己拡散する。
  • トロイの木馬
    無害に見せかけ、裏で不正プログラムをインストールする。
  • スパイウェア
    キー入力や画面情報を盗み出す。
  • アドウェア
    勝手に広告を表示してユーザを騙す。
  • ルートキット
    自身の存在を隠蔽し、システム内部に潜む。
  • ランサムウェア
    システムをロックして身代金を要求する。

定義パターンと異常検知のアプローチ

  • 定義パターンによる検知
    マルウェア固有の「シグネチャ(特徴コード)」を登録し、ファイルや通信内容と照合する手法。
    → 定期的なパターン更新が必要です。
  • 異常検知による検知
    通常の動作パターンと異なる挙動を検出して不正を判断する手法。
    → 正常パターンを学習しておく必要がありますが、誤検知のリスクも。

Pythonでマルウェア検知の簡単なシミュレーション

以下は、ファイルの先頭バイト列を元に「シグネチャ」をチェックするシンプルな例です。

# シンプルなマルウェア検知シミュレーション

# 既知のマルウェアシグネチャ(例:キーロガーの一部コード)
malware_signatures = {
    "keylogger": "A08FFFFEA9BFC00D7"  # 16進数表現(例)
}

def detect_malware(file_bytes):
    # 先頭から25~34バイトの部分を取り出す(ここでは簡略化)
    check_section = file_bytes[:8].hex().upper()  # 例として8バイトをチェック
    for name, signature in malware_signatures.items():
        if signature.startswith(check_section):
            return f"Detected potential {name}!"
    return "No malware detected."

# テスト:疑似ファイルバイト列(実際はファイルから読み出すバイト列)
import os
test_bytes = os.urandom(16)  # ランダムなバイト列
print(detect_malware(test_bytes))

このコードは非常にシンプルですが、実際のアンチウイルスソフトウェアも同様にシグネチャマッチングを利用してマルウェアを検出しています。

侵入検知システム(IDS)と侵入防止システム(IPS)で即時キャッチ!

IDS(Intrusion Detection System)とは?

IDSは、ネットワークやサーバ上の不正なアクセスや攻撃の兆候を検出し、ログに記録・通知するシステムです。

  • ネットワーク型IDS (NIDS): ネットワーク上の全パケットを監視
  • ホスト型IDS (HIDS): 各サーバやPCのログを監視

IPS(Intrusion Prevention System)とは?

IPSは、IDSの機能に加えて、不正な通信が検出されると自動的にそのパケットを遮断するシステム。
つまり、IDSが「警告」を出すだけなら、IPSは「ブロック」もしてしまうので、より即時性の高い対策が可能です。

Pythonで疑似IDSの動きを再現

以下は、パケットのログから不審なアクセスパターンを検出する簡単な例です。

# 疑似的なIDSシミュレーション

# 監視対象のパケットログ(例)
packet_logs = [
    {"src_ip": "192.0.2.10", "dst_ip": "172.16.1.1", "dst_port": 22, "status": "success"},
    {"src_ip": "198.51.100.5", "dst_ip": "172.16.1.1", "dst_port": 22, "status": "failed"},
    {"src_ip": "198.51.100.5", "dst_ip": "172.16.1.1", "dst_port": 22, "status": "failed"},
    {"src_ip": "198.51.100.5", "dst_ip": "172.16.1.1", "dst_port": 22, "status": "failed"},
]

def detect_bruteforce(logs, threshold=3):
    # 同一IPからの連続失敗がthreshold以上なら疑わしいとして検知
    count_dict = {}
    for entry in logs:
        if entry["status"] == "failed":
            count_dict[entry["src_ip"]] = count_dict.get(entry["src_ip"], 0) + 1
    alerts = [ip for ip, count in count_dict.items() if count >= threshold]
    return alerts

alerts = detect_bruteforce(packet_logs)
if alerts:
    print("疑わしいアクセスを検知しました!以下のIPをチェック:", alerts)
else:
    print("不審なアクセスはありません。")

この例では、同一送信元IPからの失敗が続いた場合に「ブルートフォース攻撃」の疑いを簡単に検知しています。実際の IDS/IPS では、これ以外にも複雑なパターンマッチングや異常検知が行われます。

統合セキュリティで守りを固める!

統合脅威管理(UTM)

複数のセキュリティ対策(ファイアウォール、アンチウィルス、IDS/IPSなど)を一台の機器で統合的に管理できるのが UTM (Unified Threat Management) です。
UTMは、導入・管理の手間を減らし、各対策の連携を強化する効果があります。

検疫ネットワーク

また、企業内部においては、接続するPCがセキュリティ基準を満たしているかチェックする「検疫ネットワーク」も導入されます。
たとえば、OSのパッチ状況やセキュリティソフトのバージョンを自動的に検査し、基準を満たさないPCは社内ネットワークに接続できないようにする仕組みです。

まとめ

今回の内容を簡単におさらいすると…

  • ファイアウォールは、ネットワークの入り口でパケットフィルタリングを行い、基本的なアクセス制御を実施するが、通信内容の詳細な検査はできない。
  • マルウェア対策では、シグネチャ(定義パターン)による検知と、異常検知のアプローチがあり、最新の攻撃に対応するためには定期的な更新が必須。
  • IDS/IPSは、ネットワークやホスト上の不審な動作を検知し、場合によっては自動的にブロックすることで、迅速な対策を実現する。
  • 最終的には、これらの対策を統合して運用することで、より堅牢なセキュリティ環境を構築できる。

セキュリティ対策は、一つの手法に依存せず、多層防御で脅威に備えることが重要です。皆さんも、ここで紹介したシンプルな Python コードを試しながら、セキュリティの基礎を楽しく学んでみてください!

コメント