Linux上のwpa_supplicantで有線LANの802.1X認証を設定:LANポートを強固に保護する

Network tutorial - IT technology blog
Network tutorial - IT technology blog

LANケーブルを挿すだけでコアネットワークに侵入可能?

先週、パートナー企業の担当者がプロジェクトの打ち合わせで弊社の会議室に来訪しました。プレゼンスライドを準備する間、先方のエンジニアがプリンターに接続されていたLANケーブルを抜き、自身の個人用ノートPCに何気なく接続したのです。わずか3秒後、ノートPCはDHCPサーバーから即座にIPアドレス 192.168.10.85 を取得し、社内のサーバー群すべてとpingが通る状態になりました。

弊社オフィスには社員が50名ほど在籍し、小規模なサーバークラスタも運用しています。この状況を目の当たりにして背筋が凍る思いがしました。悪意のない来客であれ故意の第三者であれ、目立たない壁のLANコンセントを見つけてしまえば、Nmapを実行して社内リソースを隅々までスキャンできてしまいます。オフィスの現場ではよく「Wi-FiにはWPA3 Enterpriseを導入しているから安心」と言われますが、皮肉なことに有線LANポートは完全に無防備なまま放置されていたのです。

なぜデフォルトのスイッチは全デバイスの接続を許可してしまうのか?

壁面のLANポートは、コンセントと全く同じように動作します。プラグを差し込めば電流が流れるのと同じ理屈です。一般的なレイヤー2スイッチは、NICからの電圧信号を検知するとポートを即座にForwarding(転送)ステートへと遷移させます。接続されたマシンが誰のものかを確認することなく、DHCP Discoverパケットをそのまま転送してしまうのです。

根本的な脆弱性は主に2点あります:

  • 物理ポートでの識別・認証の欠如: スイッチは、支給された社用ノートPCと社外から持ち込まれた見知らぬPCを区別できません。
  • 保護すべきレイヤーの不一致: Windowsのパスワードやフォルダのアクセス権限はレイヤー7での保護に過ぎません。同一のブロードキャストドメイン内に侵入を許してしまうと、攻撃者はARPスプーフィングで通信を盗聴したり、未修正のSMB脆弱性を容易に悪用できてしまいます。

LANポートのアクセス制御ソリューション比較

対策を決定するにあたり、システム管理者は通常、以下の3つのアプローチを検討します:

1. MACアドレスによるポート制限(Port Security)

スイッチ側に許可するMACアドレスのリストを登録しておきます。未登録のMACアドレスを持つデバイスが接続されると、ポートは即座に err-disable 状態へとシャットダウンされます。

  • メリット: スイッチ側の設定のみで素早く導入でき、端末側への変更が不要。
  • デメリット: MACスプーフィングが非常に容易。プリンター底面のラベルを見るか、tcpdump で数秒パケットをキャプチャするだけで簡単に偽装されてしまいます。

2. ゲストVLANの分離と未使用ポートのシャットダウン

会議室のLANポートをあらかじめ無効化しておくか、インターネット接続のみを許可するゲスト用VLANに固定で割り当てます。

  • メリット: リスクの高いエリアを素早く隔離できる。
  • デメリット: 社員の座席移動のたびに対応が必要となり、運用負荷が高い。また、社員のデスクトップPCからケーブルを抜いて流用された場合には無力です。

3. IEEE 802.1X規格によるアクセス制御

最も標準的かつ確実なソリューションです。ケーブル接続時、スイッチはポートを「Unauthorized(未認証)」状態にロックし、EAPOL(EAP over LAN)パケットのみを通過させます。クライアント端末は認証情報や電子証明書をRADIUSサーバーに送信して認証を受けます。RADIUSによる承認が完了して初めて、スイッチはデータ通信用にポートを開放します。

Linux環境でwpa_supplicantを用いた802.1Xの導入

wpa_supplicant はWi-Fi専用のツールだと思われがちですが、実際には wired ドライバーを使用することで有線LAN環境でも極めてスムーズに動作します。

ステップ 1: パッケージのインストール

主要なディストリビューションにパッケージをインストールします:

# Ubuntu / Debian の場合
sudo apt update && sudo apt install -y wpa_supplicant

# RHEL / Rocky Linux の場合
sudo dnf install -y wpasupplicant

有線LANインターフェースの名前を確認します:

ip -br link

ここでは、設定対象の有線LANポートを eth0(または enp3s0)と仮定します。

ステップ 2: 認証設定ファイルの作成

RADIUSサーバーの構成(FreeRADIUSまたはWindows NPS)に合わせて、以下の2つの方式から選択します。

方式 A: Active Directoryアカウントによる認証(PEAP/MSCHAPv2)

/etc/wpa_supplicant/8021x.conf に設定ファイルを作成します:

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=root
ap_scan=0

network={
    key_mgmt=IEEE8021X
    eap=PEAP
    identity="nv_nguyenvana"
    password="MatKhauBaoMat123@"
    phase2="auth=MSCHAPV2"
    ca_cert="/etc/ssl/certs/company-ca.pem"
}

技術的な注意点: ap_scan=0 のパラメータは有線LANにおいて必須です。この指定により、バックグラウンドでのWi-Fiスキャン処理を無効化します。

方式 B: クライアント証明書による認証(EAP-TLS)

EAP-TLSはパスワード漏洩のリスクを排除し、中間者攻撃(Man-in-the-Middle)を根本から防止します:

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=root
ap_scan=0

network={
    key_mgmt=IEEE8021X
    eap=TLS
    identity="workstation-dev-01"
    ca_cert="/etc/ssl/certs/company-ca.pem"
    client_cert="/etc/ssl/certs/client.crt"
    private_key="/etc/ssl/private/client.key"
    private_key_passwd="パスフレーズがある場合は指定"
}

設定ファイルの不正読み取りを防ぐため、パーミッションを厳格に制限します:

sudo chmod 600 /etc/wpa_supplicant/8021x.conf
sudo chown root:root /etc/wpa_supplicant/8021x.conf

ステップ 3: デバッグモードでの動作確認

いきなりバックグラウンドで動作させるのではなく、まずはコマンドラインから直接実行してEAPハンドシェイクの詳細を確認します:

sudo wpa_supplicant -i eth0 -D wired -c /etc/wpa_supplicant/8021x.conf -d

各オプションの意味:

  • -i eth0: 認証対象のネットワークインターフェース。
  • -D wired: Wi-Fi用ドライバー(nl80211)ではなく、有線LAN用ドライバーを強制指定。
  • -c ...: 作成した設定ファイルを指定。
  • -d: 詳細なデバッグログを出力。

コンソールに CTRL-EVENT-EAP-SUCCESS と表示されれば、スイッチによるアクセス許可は成功です。別のターミナルを開き、DHCPでIPアドレスを要求します:

sudo dhclient eth0

ステップ 4: systemdによる自動起動の設定

LANケーブル挿入時に自動で接続を確立できるよう、/etc/systemd/system/[email protected] にsystemdのテンプレートサービスを作成します:

[Unit]
Description=802.1X Wired Authentication for %I
After=network.target
Before=network-online.target

[Service]
ExecStart=/sbin/wpa_supplicant -c /etc/wpa_supplicant/8021x.conf -D wired -i %I
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

対象のインターフェースに対応するサービスを有効化して起動します:

sudo systemctl daemon-reload
sudo systemctl enable --now [email protected]

これで、LANケーブルを接続するたびにLinuxから自動的にEAPOLパケットが送信され、ポートが開くようになります。万が一ケーブルを抜いて不正なPCへ差し替えられたとしても、スイッチは即座にそのポートを隔離します。

Share: