ネットワークの「門番」を極める:ポートセキュリティで不正端末を物理層から叩き落とす技術
ネットワークエンジニアとして現場に立っていると、どれだけ強固なファイアウォールや認証基盤を整えても、最後に泣きを見るのは「物理ポート」の無防備さだったりします。
「誰でもLANケーブルを挿せば通信できてしまう」環境は、セキュリティ上の致命的な穴です。特にオフィスフロアのスイッチングハブや、共用スペースの壁ポートは、悪意ある端末や設定ミスの持ち込み端末にとって最高の踏み台になります。
今回は、スイッチのL2レベルでこの脆弱性を封じ込める「ポートセキュリティ」について、実務の現場感覚を交えて深掘りしていきます。
—
ポートセキュリティが「L2の防波堤」である理由
イーサネットのスイッチ(L2スイッチ)は、フレームの送信元MACアドレスを学習し、CAMテーブル(Content Addressable Memory)に保持して転送先を決定します。この「学習」という受動的なプロセスを制御し、未知のMACアドレスや許可外のデバイスを排除するのがポートセキュリティの役割です。
RFC 802.1Qや802.3といった規格がスイッチの基礎を支えていますが、ポートセキュリティはベンダー独自の拡張機能として発展してきました。特にCisco IOS等の実装では、この機能が非常に強力かつ現場で好まれています。
違反時の3つのアクション:君ならどれを選ぶ?
ポートセキュリティで最も重要なのは、「違反が発生したときにどう振る舞うか」というポリシー設定です。実務では以下の3つを使い分けます。
1. shutdown(基本にして最強)
最も推奨される設定です。違反MACアドレスを検知した瞬間、ポートを err-disabled 状態へ叩き落とします。
- メリット: 物理的にリンクが切れるため、攻撃者や不正ユーザーは即座に排除されます。
- 運用上の注意: 管理者が手動で
no shutdownを打つか、自動復旧タイマーを設定しない限り復帰しません。アラート検知とセットで運用するのが鉄則です。
2. restrict(ログで追いかける)
不正なMACアドレスからのフレームだけを破棄し、SNMPトラップを投げます。
- メリット: ネットワーク接続を維持しつつ、誰が不正を働いているか(ログ)を確認したい場合に有効です。
- 使いどころ: 完全に遮断すると業務が止まってしまう可能性があるが、セキュリティ監視は厳密に行いたいケース。
3. protect(サイレント破棄)
最も控えめなモード。不正フレームを捨てるだけで、ログも残りません。
- 実務での印象: 正直、トラブルシューティングが困難になるため、あまり推奨しません。「なぜ繋がらないのか?」が特定できず、現場が混乱する原因になります。
—
実践:ポートセキュリティ設定の黄金律
Ciscoスイッチを例に、実務でそのまま使える構成例を見ていきましょう。
# 対象ポートを選択
interface GigabitEthernet0/1
switchport mode access
switchport port-security
# 最大学習数を1に制限(自分1台しか許可しない)
switchport port-security maximum 1
# 不正なMACアドレスが来たらポートをシャットダウン
switchport port-security violation shutdown
# 接続されたMACアドレスを自動的に学習し、設定ファイルに書き込む(Sticky)
switchport port-security mac-address sticky
なぜ sticky を使うのか?
sticky を使うと、最初に挿した端末のMACアドレスをスイッチが自動的に学習し、その値をコンフィグに書き込みます。一度設定してしまえば、以降は特定の端末以外は一切受け付けない「ロックされたポート」が完成します。
—
開発現場からの視点:APIでの監視と自動復旧
インフラエンジニアの運用負荷を下げるため、err-disabled 状態になったポートをPython等で自動検知・通知する仕組みを作るのは現代の標準です。
例えば、Netmikoライブラリを使って、特定のスイッチのポート状態を定期的にチェックするスクリプトのイメージは以下の通りです。
from netmiko import ConnectHandler
# スイッチへの接続情報
switch = {
'device_type': 'cisco_ios',
'host': '192.168.1.10',
'username': 'admin',
'password': 'password123'
}
def check_port_security():
with ConnectHandler(**switch) as net_connect:
# 状態を確認
output = net_connect.send_command("show interfaces status | include err-disabled")
if "err-disabled" in output:
print("警告: 不正ポートを検知しました!")
# ここにSlack/Teamsへの通知処理を追加する
# notify_to_ops(output)
check_port_security()
現場のトラブルシューティングTips
最後に、現場でよくある「ハマりポイント」を共有します。
- IP電話の裏側: PCとIP電話をデイジーチェーン接続しているポートで
maximum 1にすると、PCが通信できなくなります。この場合はmaximum 2に設定し、両方のMACを許可する必要があります。 - 自動復旧タイマー: 現場が遠隔地の場合、
errdisable recovery cause psecure-violationを設定しておくと、設定時間経過後にポートが自動でupに戻ります。ただし、セキュリティ的には「手動復旧」の方が健全です。
ポートセキュリティは、ネットワークの最初の防衛線です。ここを疎かにすると、後のファイアウォールやIDSがどれほど優秀でも、足元をすくわれることになります。ぜひ、今の環境の設定を一度 show port-security interface で確認してみてください。「誰がいつ接続したか」を把握することが、真のインフラ管理への第一歩です。
コメント