【図解】IEEE802.1x認証の仕組みとシーケンス 〜認証スイッチ+FreeRadius(+証明書)+OpenLDAPの例〜

シナリオ

以下のシナリオで L2 認証スイッチでの IEEE802.1x 認証 (PEAP) の動作例を示します。

  • RedHat Enterprise Linux で FreeRadiusOpenLDAP のサービス 2 つを動作させる
  • L2 認証スイッチで IEEE802.1x 認証 (PEAP)を設定し、OpenLDAP のユーザとその LDAP 属性値に応じて認証後の VLAN を決定する。(この仕組みを動的VLAN,もしくはダイナミックVLANと呼ぶ)

※Web 認証と異なり、端末は事前に IP を取得する必要がないため、初期 VLAN は不要です。 ただし、ActiveDirectory による PC ログインとのシングルサインオンを実装する場合は PC はドメインコントローラとの通信のために初期 VLAN の設定が必要になります。

Windows サーバでスイッチ認証を実装する場合、持ち込み PC に対して"デバイス CAL"、ユーザに対して"ユーザ CAL"の どちらかの Microsoft のライセンスが必要になる可能性があります。

FreeRadius と OpenLDAP でスイッチ認証を実装するメリットは、この Microsoft の CAL が不要になり、ユーザ数、デバイス数に制限が無くなることです。

注意点

1. LDAP サーバに格納されたパスワードの形式に制限がある

Windows クライアントでログインする場合、MS-CHAPv2 を利用する関係で、OpenLDAP 側ではパスワードはクリアテキストで 格納するか、smbPasswd 属性が必要 (=samba用のスキーマ拡張が必要) となることです。

MS-CHAPv2 では生パスワードを md4 ハッシュした情報を利用して Challenge-Response 方式で Radius に認証情報を送るため、 生パスワードを置いておくか、同じく md4 ハッシュの smbPasswd を置いておかないと、OpenLDAP 側で認証ができないためです。

2. サーバ証明書が必要

PC と Radius サーバ間で TLS セッションを確立するため、Radius サーバにサーバ証明書が必要になります。 (これは Windows サーバで Radius サーバを立てるときも同様です。)

サーバ証明書は自己署名でももちろん構いませんが、その場合、クライアント側の IEEE802.1x 設定で「サーバの証明書の検証を行う」のチェックを外す必要があります。

IEEE802.1x のシーケンス


EAP というプロトコルを PC と Radius サーバ間でやり取りしますが、PC ⇔ 認証スイッチ間は Ethernet 上で (EAPoL=EAP over LAN) 伝搬し、認証スイッチ ⇔ Radius サーバ間は Radius 上で (EAP over Radius) 伝搬します。

  • PC は EAP [Start] を L2 マルチキャスト (01:80:c2:00:00:03) します。
  • 認証スイッチは EAP [Request ID] を PC へ L2 ユニキャストします。
  • PC は EAP [Response ID] を Ethernet で L2 マルチキャストし、認証スイッチは EAP データを Radius [Access Request] に乗せ換えて Radius サーバへ L3 ユニキャストします。
  • Radius サーバは EAP [Request PEAP] を Radius [Access Challenge] で認証スイッチへ L3 ユニキャストし、認証スイッチは EAP データを Ethernet に乗せ換えて PC へ L2 ユニキャストします。
  • PC は EAP [TLS Client Hello] を L2 マルチキャストし、認証スイッチは EAP データを Radius [Access Request] に乗せ換えて Radius サーバへ L3 ユニキャストします。
  • Radius サーバは EAP [TLS Server Hello, Certificate, Certificate Request, Server Hello Done] を Radius [Access Challenge] で認証スイッチへ L3 ユニキャストし、認証スイッチは EAP データを Ethernet に乗せ換えて PC へ L2 ユニキャストします。
  • PC は EAP [TLS Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message] を L2 マルチキャストし、認証スイッチは EAP データを Radius [Access Request] に乗せ換えて Radius サーバへ L3 ユニキャストします。
  • Radius サーバは EAP [Change Cipher Spec, Encrypted Hnadshake Message] を Radius [Access Challenge] で認証スイッチへ L3 ユニキャストし、認証スイッチは EAP データを Ethernet に乗せ換えて PC へ L2 ユニキャストします。
  • PC は EAP [Response PEAP] を L2 マルチキャストし、認証スイッチは EAP データを Radius [Access Request] に乗せ換えて Radius サーバへ L3 ユニキャストします。この時点で PC と Radius サーバ間で EAP データの TLS による暗号化保護が可能になります
  • Radius サーバは TLS セッションで EAP [MS-CHAPv2 Challenge] を Radius [Access Challenge] で認証スイッチへ L3 ユニキャストし、認証スイッチは EAP データを Ethernet に乗せ換えて PC へ L2 ユニキャストします。
  • PC は TLS セッションで EAP [MS-CHAPv2 Response] を L2 マルチキャストし、認証スイッチは EAP データを Radius [Access request] に乗せ換えて Radius サーバへ L3 ユニキャストします。
  • Radius サーバは受信した EAP [MS-CHAPv2 Response] の認証情報を OpenLDAP へ照会し、認証が成功か否か、および成功の場合のユーザの LDAP 属性情報を受信します。
  • OpenLDAP から認証成功を受信した場合、Radius サーバは TLS セッションで EAP [Inner Method Successful] を Radius [Access Challenge] で認証スイッチへ L3 ユニキャストし、認証スイッチは EAP データを Ethernet に乗せ換えて PC へ L2 ユニキャストします。 失敗した場合は EAP [Inner Method Failed] を返信します。
  • PC は EAP [Ack Inner Method Successful/Failed] を L2 マルチキャストし、認証スイッチは EAP データを Radius [Access request] に乗せ換えて Radius サーバへ L3 ユニキャストします。
  • 認証成功の場合は Radius サーバから TLS セッションを使わず、認証成功したユーザに関する Radius 属性値を Radius [Access Accept] で認証スイッチへ L3 ユニキャスト送信します。Radius 属性値は Radius サーバに直に設定されたもの以外にも、OpenLDAP での認証成功時に一緒に受信した LDAP 属性情報を、Radius サーバの LDAP 属性マッピング設定 (例:/etc/raddb/ldap.attrmap) に従って Radius 属性に変換したものも利用できます。認証に失敗している場合は Radius [Access Reject] で認証スイッチへ認証失敗を伝えます。
  • 認証スイッチは Radius [Access Accept] であれば EAP [Success] を、Radius [Access Reject] であれば EAP [Failure] を PC へ L2 ユニキャストします。

RADIUS 属性と LDAP 属性のマッピングについて

属性値のマッピングについては例えば、OpenLDAP で ichiro.suzuki というアカウントが認証成功となり、FreeRadius へ BelongTo という LDAP 属性について"101"という属性値が返ってきたとします。

ldap.attrmap で

replyItem Tunnel-Private-Group-Id BelongTo

と設定されていれば、Radius 属性 "Tunnel-Private-Group-Id" の属性値を "101" にセットして認証スイッチへ応答することができます。

これにより、動的 VLAN の実装が可能となります。