STUDY · NETWORK GUIDE

2-8 L2 セキュリティ機能

L2 における代表的なセキュリティ機能 Port-Security / DHCP Snooping / DAI / Storm Control の役割と、Port-Security による sticky MAC 学習を iosvl2 で実機確認する。第 2 章 L2 編の完走。

1. L2 セキュリティの位置づけ

ここまで第 2 章では、2-2 で CAM テーブルによるスイッチング、2-3 で VLAN による論理分割、2-4 で Trunk による複数 VLAN の収容、2-6 で STP によるループ回避、2-7 で EtherChannel による帯域集約と、LAN 内部を支える機能群を順に扱ってきた。いずれも「正しい設定が両端に入り、接続される端末も善意のものである」という運用上の前提に立つ仕組みである。

しかし現実の LAN には、設定誤りで意図しない機器が紛れ込むこと、社員の私物機器が無断接続されること、悪意ある端末が ARP やブロードキャストを偽装してフレームを覗き見ようとすること、といった事象が起こり得る。L3 のファイアウォールや IDS が見られるのはセグメント間の通信だけで、同一 VLAN 内で完結する攻撃は L2 で防がない限り通り抜ける。本節で扱う Port-Security / DHCP Snooping / Dynamic ARP Inspection / Storm Control は、まさにこの「LAN の内側で起きる事故・攻撃」を L2 のスイッチ自身が抑え込むための機能群である。

L2 セキュリティ検証トポロジ

検証トポロジは SW1 (iosvl2) に PC1 / PC2 が接続された素朴な構成である。PC1 → Gi0/1、PC2 → Gi0/2 がアクセス VLAN 10 で、Gi0/0 が管理用の外部接続である。この構成で本節は Port-Security と Storm Control を SW1 に設定して挙動を確認する。


2. Port-Security

Port-Security は、アクセスポートで学習する MAC アドレスの個数と種類 を制限する機能である。1 つのポートに繋がる端末は通常 1 台、IP 電話を経由する構成でも 2 台が上限になる。それを超える MAC が現れたら「想定外の機器が刺さった」と判断して即座に対処する、というのが基本発想である。

設定要素は主に 3 つに分かれる。

  • switchport port-security で機能を有効化する。
  • switchport port-security maximum N で、そのポートで学習を許す MAC 数の上限を指定する(既定 1)。
  • switchport port-security violation { shutdown | restrict | protect } で違反時の動作を選ぶ。
  • switchport port-security mac-address sticky で、学習した MAC を running-config に動的に書き込む。sticky を指定しないと再起動後に MAC が消えるので、運用では sticky か手動の静的指定を組み合わせるのが一般的である。

本ラボの day0 から Gi0/1 の Port-Security 部分を抜くと次のとおりである(Gi0/2 も同一)。

snippet
interface GigabitEthernet0/1
 description PC1
 switchport mode access
 switchport access vlan 10
 switchport port-security
 switchport port-security maximum 1
 switchport port-security violation shutdown
 switchport port-security mac-address sticky

maximum を 1 にしているので、最初に学習した 1 つの MAC だけがそのポートで通信を許される。違反時は shutdown を選んだので、別の MAC が刺さった瞬間にポートが errdisable に落ちる、という最も厳格な動作になる。


3. DHCP Snooping

DHCP Snooping は、スイッチが流れている DHCP メッセージの中身を覗き見て、偽の DHCP サーバから来た Offer / ACK を遮断する 機能である。ポートを trust(信頼)untrust(非信頼) の 2 種類に分け、正規の DHCP サーバが繋がっている方向のポートだけを trust にしておく。trust 以外のポートから DHCP Offer / DHCP ACK が流れてきたら破棄する、というのが核心である。

悪意ある端末がアクセスポートに繋がって「自分が DHCP サーバだ」と振る舞うと、近隣の端末は本物より早く反応したそちらから IP・デフォルトゲートウェイ・DNS の情報を受け取ってしまう。デフォルトゲートウェイを攻撃者の IP に書き換えれば、その後の通信は全部攻撃者を経由することになり、中間者攻撃の足場が完成する。DHCP Snooping はこの最初のステップを止める。

設定は概ね次のような形になる。

snippet
ip dhcp snooping
ip dhcp snooping vlan 10
!
interface GigabitEthernet0/24
 description Uplink to DHCP server
 ip dhcp snooping trust

VLAN 単位で機能を有効化し、正規 DHCP サーバへの上流ポートだけに ip dhcp snooping trust を入れる。アクセスポート側は untrust のままで構わず、明示的な設定は不要である。

untrust ポートで観測した DHCP Discover / Request からは、(IP, MAC, ポート, VLAN, リース時間) の対応関係が DHCP Snooping binding table に記録される。このテーブル自体が次節の DAI の入力になる、という縦の繋がりがある。


4. Dynamic ARP Inspection (DAI)

Dynamic ARP Inspection は、流れる ARP パケットの中身を DHCP Snooping binding table と突き合わせて検証する機能である。binding table には「この IP は、この MAC、このポート、この VLAN にいる」が記録されている。ARP 応答パケットがその対応関係と矛盾していたら破棄する。

ARP プロトコル自体には、応答の正当性を確かめる仕組みが組み込まれていない。攻撃者が「私が 192.168.10.1 です」と偽の ARP Reply を流せば、それを受け取った端末は素直にキャッシュを書き換え、以後のフレームを攻撃者宛に送り始める。これが ARP スプーフィングで、L2 で起きる最も典型的な中間者攻撃の準備動作である。

設定は VLAN 単位で有効化する。

snippet
ip arp inspection vlan 10

これだけで、untrust ポート(既定)から流れる ARP パケットは binding table 突合の対象になる。上流の信頼できるポート(ルータや L3 SVI、サーバ)は ip arp inspection trust を別途入れて検査対象から外す、という建て付けは DHCP Snooping と同じである。

DHCP Snooping → DAI という順序があるのが大事な点である。動的環境では DAI 単体では検査の元データが無いので、DHCP Snooping を先に動かして binding table を育てる、という構造になる。固定 IP 環境では ip arp inspection vlan ... と組合せて、手動の ARP ACL で許可エントリを書く運用になる。


5. Storm Control

Storm Control は、ポートで観測する ブロードキャスト / マルチキャスト / 未知ユニキャスト の流量がしきい値を超えたら、そのポートで該当トラフィックを抑制する機能である。

ループや誤設定や端末の暴走で、ブロードキャストが大量に発生することがある。これを放置すると、同一 VLAN の全ポートに複製されて流れるブロードキャストの宿命で、関係ない端末まで巻き込んで CPU が振り切れ、LAN 全体が機能不全に陥る(ブロードキャストストーム)。Storm Control はその発生源になりかけているポートを早期に切り落とすことで被害を局所化する。

しきい値の単位は 帯域比(%)pps(パケット毎秒) で指定し、超過時の action は 3 種類ある。

  • drop(既定): しきい値を超えた分のフレームを単純に捨てる。ポートはリンクアップのまま。
  • shutdown: ポートを errdisable に落とす。最も厳格。復旧は手動か errdisable recovery 経由。
  • trap: SNMP trap で通知だけ送る。フレームは流し続ける。

本ラボでは Gi0/1 / Gi0/2 にブロードキャスト 1.00% のしきい値で shutdown action を入れている。

snippet
interface range GigabitEthernet0/1 - 2
 storm-control broadcast level 1.00
 storm-control action shutdown

1.00% は 1 Gbps 換算で 10 Mbps 相当で、検証用としてはかなり攻撃的な値である。本番では 5 〜 30% を用途に応じて選ぶことが多い。


6. CML での検証

検証は CML(Cisco Modeling Labs)上の iosvl2 で行う。SW1 に PC1 / PC2 が VLAN 10 のアクセスポートで接続され、30 秒周期で peer に ping を打って MAC 学習を継続させた状態にしてある。Port-Security は maximum 1、violation shutdown、sticky 学習を有効化済みで、PC1 / PC2 の MAC アドレスがそれぞれ Gi0/1 / Gi0/2 に学習されている前提になる。

day0 で投入した SW1 側の Port-Security と Storm Control の設定は、2 節 / 5 節で示したとおりである。以降の節では、この設定状態でどの show コマンドが何を見せるかを 1 つずつ確認していく。


7. show port-security — sticky MAC 学習を確認(本節の山場)

検証の中心となるのが show port-security 系のコマンドである。まずポート単位の集約ビューから。

snippet
SW1#show port-security
Secure Port  MaxSecureAddr  CurrentAddr  SecurityViolation  Security Action
                (Count)       (Count)          (Count)
---------------------------------------------------------------------------
      Gi0/1              1            1                  0         Shutdown
      Gi0/2              1            1                  0         Shutdown
---------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port)     : 0
Max Addresses limit in System (excluding one mac per port) : 4096

Gi0/1 / Gi0/2 ともに MaxSecureAddr = 1CurrentAddr = 1SecurityViolation = 0Action = Shutdown である。設定上の上限は 1、現在の学習数も 1、これまでの違反回数 0、違反時のアクションは Shutdown、という意味になる。CurrentAddr が MaxSecureAddr に張り付いており、ここから 1 つでも MAC が増えれば即座に違反としてカウントされる、という状態である。

ポートごとの詳細を show port-security interface で見る。

snippet
SW1#show port-security interface GigabitEthernet0/1
Port Security              : Enabled
Port Status                : Secure-up
Violation Mode             : Shutdown
Aging Time                 : 0 mins
Aging Type                 : Absolute
SecureStatic Address Aging : Disabled
Maximum MAC Addresses      : 1
Total MAC Addresses        : 1
Configured MAC Addresses   : 0
Sticky MAC Addresses       : 1
Last Source Address:Vlan   : 5254.00e4.4813:10
Security Violation Count   : 0

注目すべき行を順に拾う。Port Status : Secure-up が「Port-Security が有効化された状態で、ポートが正常にアップしている」ことを示す。違反が起きると Secure-shutdown に切り替わる。Maximum MAC Addresses : 1Total MAC Addresses : 1 で、上限 1 に対して現在 1 個の MAC が学習されており、これ以上の新規 MAC は受け付けない状態であることが分かる。Configured MAC Addresses : 0 は手動で静的指定した MAC が 0 件、つまりすべての secure MAC が sticky 学習由来であることを意味する。

そして本節の核心が Sticky MAC Addresses : 1Last Source Address:Vlan : 5254.00e4.4813:10 の 2 行である。sticky で 1 個の MAC(PC1 の 5254.00e4.4813)が VLAN 10 で学習され、固定された状態にある。この時点で、もしこのポートに別の MAC を持つ端末を差し替えると、即座に violation shutdown が発動して Secure-shutdown に落ちる、という保証が成立している。

Gi0/2 も対称的に動いている。

snippet
SW1#show port-security interface GigabitEthernet0/2
Port Security              : Enabled
Port Status                : Secure-up
Violation Mode             : Shutdown
Aging Time                 : 0 mins
Aging Type                 : Absolute
SecureStatic Address Aging : Disabled
Maximum MAC Addresses      : 1
Total MAC Addresses        : 1
Configured MAC Addresses   : 0
Sticky MAC Addresses       : 1
Last Source Address:Vlan   : 5254.00bd.016b:10
Security Violation Count   : 0

Gi0/2 では PC2 の 5254.00bd.016b が VLAN 10 で sticky 学習されている。「アクセスポートに 1 台しか繋がない」というポリシーがスイッチ自身の機能として強制されている状態である。


8. show port-security address — Secure MAC Address Table

sticky で学習された MAC は、通常の MAC アドレステーブルとは別に Secure MAC Address Table で管理される。

snippet
SW1#show port-security address
               Secure Mac Address Table
-----------------------------------------------------------------------------
Vlan    Mac Address       Type                          Ports   Remaining Age
                                                                   (mins)    
----    -----------       ----                          -----   -------------
  10    5254.00e4.4813    SecureSticky                  Gi0/1        -
  10    5254.00bd.016b    SecureSticky                  Gi0/2        -
-----------------------------------------------------------------------------
Total Addresses in System (excluding one mac per port)     : 0
Max Addresses limit in System (excluding one mac per port) : 4096

Type 列が SecureSticky になっている。これが sticky 学習由来であることを示す。Remaining Age - は「エージング無効」を意味し、無通信時間が長くなっても自動削除されない。2-2 で見た通常の DYNAMIC エントリは 300 秒の aging-time で消えていたのと対照的な扱いである。

比較のため、同じスイッチで普通の MAC アドレステーブルも見ておく。

snippet
SW1#show mac address-table dynamic
          Mac Address Table
-------------------------------------------

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
   1    bc24.1127.cd21    DYNAMIC     Gi0/0
Total Mac Addresses for this criterion: 1

VLAN 1 の Gi0/0(管理用の外部接続ポート)で 1 件の DYNAMIC エントリが学習されているだけで、VLAN 10 で sticky 化された PC1 / PC2 の MAC は現れない。Secure MAC は別管理になっているからである。トラブルシュート時にこの違いを知らないと「PC1 が刺さっているはずなのに mac address-table に出てこない」と混乱しがちなので、Port-Security 有効時は必ず show port-security address の側を見る、と覚えておくのがよい。

sticky 学習されたエントリは、エージング無効であることに加えて、running-config に逐次書き込まれる という性質もある。実際、Gi0/1 の running-config を見ると次のとおりで、sticky 学習で発見した PC1 の MAC が mac-address sticky 5254.00e4.4813 として自動的に追加されている。

snippet
SW1#show running-config interface GigabitEthernet0/1
Building configuration...

Current configuration : 253 bytes
!
interface GigabitEthernet0/1
 description PC1
 switchport access vlan 10
 switchport mode access
 switchport port-security mac-address sticky
 switchport port-security mac-address sticky 5254.00e4.4813
 switchport port-security
 negotiation auto
end

switchport port-security mac-address sticky が 2 行並んでいる。1 行目は sticky 機能の有効化、2 行目が「sticky 学習結果として記録された具体的な MAC」である。あとは write memory で startup-config に保存すれば、再起動後もこの MAC が静的指定として残り、別の端末を刺すと即座に違反として検知される運用に入る。

ポートのリンク状態も確認しておく。

snippet
SW1#show interfaces status

Port      Name               Status       Vlan       Duplex  Speed Type 
Gi0/0                        connected    1          a-full   auto RJ45
Gi0/1     PC1                connected    10         a-full   auto RJ45
Gi0/2     PC2                connected    10         a-full   auto RJ45

Gi0/1 / Gi0/2 ともに VLAN 10 で connected、Auto-Negotiation で full-duplex、リンクは正常に上がっている。Port-Security が有効でもリンク自体は普通の access ポートとして使えており、内部で MAC 検査が走っているだけ、という状態である。


9. 落とし穴・補足

実運用で踏みやすい注意点を 5 点挙げておく。

  • Violation Mode の使い分け: shutdown はポートを errdisable に落とす最も厳格なモードで、復旧は手動 shutdown / no shutdownerrdisable recovery cause psecure-violation の自動復旧設定に頼る。restrict は違反フレームを破棄しつつ SNMP trap とログを残す中庸モード、protect は破棄するだけで通知すら出さない最弱モードである。本番では「気づける」モードである shutdown か restrict を選ぶのが基本で、protect は運用負荷が高い検証環境などでの限定利用に留めるのが無難である。
  • sticky の保存: 学習直後の sticky MAC は running-config に書き込まれているが、write memory(または copy running-config startup-config)を忘れると、再起動で sticky エントリ全消失 → 起動後に最初に来たフレームの MAC を新規 sticky として学習、という挙動になる。これは別の端末を刺し替えた直後に再起動すると「攻撃者の MAC が sticky として固定されてしまう」事故に繋がる。Port-Security を本格運用に乗せる時は、sticky 学習が完了したタイミングで write memory を打つフローを必ず入れる。
  • DHCP Snooping の信頼境界: 信頼境界を跨ぐ階層構成では、エッジスイッチがアクセスポートを untrust、コアスイッチへの uplink を trust、コアスイッチ側で DHCP relay と option-82 を扱う、というレイヤ分けになる。エッジ側にコア側でしか trust にしていないポートが残っていると、そこから流れる Offer / ACK が遮断されて正規 DHCP が機能しなくなる事故が起きる。設計時に各リンクの信頼方向を 1 枚の図に書き出すのが安全である。
  • DAI と Storm Control の併用: ARP storm(短時間に大量の ARP を流す攻撃や暴走)は、Storm Control で多すぎる側を ports 単位に抑え、流量が許容範囲内に収まったうえで内容の正当性を DAI が DHCP Snooping binding table と突き合わせて検証する、という二段構えになる。片方だけだと、量で潰されるか中身を信用するかのどちらかが甘くなる。
  • Storm Control の単位選び: しきい値は level が帯域比、level pps が pps の絶対値、level bps が bps の絶対値である。本ラボの level 1.00 は %(帯域比)の指定で、1 Gbps リンクなら 10 Mbps 相当という意味になる。10G / 25G リンクが混在する現代の LAN では、% 指定のままだと 10G ポートで 100 Mbps、25G ポートで 250 Mbps と「実効しきい値」が変わってしまうので、安全寄りに pps 指定で揃えるのも 1 つの選択である。

10. 第 2 章のまとめと次章の内容

第 2 章では、Ethernet とスイッチを軸に LAN 内部の動作原理と運用機能を 8 節にわたって体系的に扱ってきた。2-1 で Ethernet の歴史と速度系統を整理し、2-2 で CAM テーブルによる自動学習という出発点を押さえ、2-3 で 1 台のスイッチを複数の論理ネットワークに分ける VLAN を、2-4 で複数 VLAN を 1 リンクで運ぶ Trunk と 802.1Q タグを、2-5 でその VLAN 情報を複数スイッチ間で同期する VTP を、2-6 で物理的なループを論理的に断つ STP を、2-7 で複数の物理リンクを 1 本に束ねる EtherChannel を扱った。そして本節 2-8 では、それらの上に Port-Security / DHCP Snooping / DAI / Storm Control という防御層を重ね、CAM 自動学習の便利さの裏側にある「想定外の MAC」「偽 DHCP」「ARP スプーフィング」「ブロードキャスト暴走」をスイッチ自身が抑え込む仕組みを確認した。CAM の自動学習が出発点、Trunk と VTP が拡張の道具、STP と EtherChannel が冗長と帯域の解決策、L2 セキュリティが防御の上塗り、という積み重ねで現代の LAN は成り立っている。

続く第 3 章「L3 編」では視点を一段引き上げ、L3 ルーティングの世界に踏み込む。IP アドレッシングとサブネット、静的ルートと動的ルーティングプロトコル(RIP / EIGRP / OSPF / BGP)、ルーティングテーブルと FIB、再配送、FHRP(HSRP / VRRP / GLBP)、そして IPv6 まで全 12 節で網羅する。第 2 章で VLAN 単位に隔離した複数のネットワークを L3 で繋ぐ SVI / router-on-a-stick もここで扱うので、L2 と L3 の境界がどう接続されるか、自然に見えてくる構成にしてある。