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

スポンサーリンク
スポンサーリンク

シナリオ

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

  • RedHat Enterprise Linuxで FreeRadiusOpenLDAP のサービス2つを動作させる
  • L2認証スイッチでIEEE802.1x認証(PEAP)を設定し、OpenLDAPのユーザとそのLDAP属性値に応じて認証後の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の実装が可能となります。

スポンサーリンク
スポンサーリンク
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク