PPP / PPPoE の認証(PAP/CHAP)、MS-CHAPv2について

PPP および PPPoE の認証方式にはいくつか種類があります。この記事ではCiscoで実装している認証方式であるPAPとCHAP、そして Microsoft が作った MS-CHAPv2 を紹介します。

この2つの違いは、PAPはパスワードを平文でやり取りするのに対し、CHAPはハッシュパスワードをさらに隠蔽(ハッシュを盗聴されたらパスワードが分からなくても認証されてしまうため)してやり取りするため、CHAPのセキュリティはPAPと比べてとても高いのです。

処理の負荷は当然CHAPのほうが高いのが、認証はそんなに頻繁に行うものでもありませんし、今の時代では処理不可の差等は微々たるものです。なので、PAPとCHAP、どっちがいいかというと、断然CHAPがいいのです。

MS-CHAPv2には脆弱性が見つかりましたが、CHAPの脆弱性は特に見つかってません。(PAPは脆弱性うんぬんを言うほど強くない=メチャメチャ弱いので論外)

PAP

PAPとは Password Authentication Protocol の略で、RFC1334で定義されています。PAPは平文での認証を行います。以下にPAPのフレームフォーマットを示します。

CiscoでのPAP認証(双方向認証)の設定

例えばルータ#1(ホスト名R1)とルータ#2(ホスト名R2)をシリアルで接続し、PAP認証するケースを考えます。

R1---R2

R1とR2でお互いに認証をかけたいときは、以下のように設定します。

[R1での設定]

username R2 secret hogehogeR2
!
interface s0/0
encapsulation ppp
ppp authentication pap
ppp pap sent-username R1 password hogehogeR1
!

[R2での設定]

username R1 secret hogehogeR1
!
interface s0/0
encapsulation ppp
ppp authentication pap
ppp pap sent-username R2 password hogehogeR2
!

スポンサーリンク

相手の認証情報(ホスト名/パスワード)を username コマンドで登録しておきます。(Radiusサーバを使うやり方もあります)

CiscoでのPAP認証(単方向認証)の設定

R2のみがR1の認証をする場合は以下のように設定します。

[R1での設定]

interface s0/0
encapsulation ppp
ppp authentication pap callin
ppp pap sent-username R1 password hogehogeR1
!

[R2での設定]

username R1 secret hogehogeR1
!
interface s0/0
encapsulation ppp
ppp authentication pap
!

ppp authentication pap コマンドによりPAP認証を送受信ともに有効にできます。単方向認証は callin オプションを付けることで実現できます。

(config-if)# ppp authentication pap callin

この callin の意味は、「相手方からかかってきたときは認証しますよ」という意味です。つまり、R2が最初に認証情報(Authenticate-Requestパケット)を投げてきたら、R1はR2の認証を実行しますが、R1が先に認証情報を投げて認証に成功すればR2から認証情報が来なくてもPPPのLine ProtocolをUpし、通信できる状態にします

なおこの設定例では、R2には認証を投げる設定(ppp pap sent-user ~)が入っていませんので、R2が認証情報を投げることはありません。

スポンサーリンク

CHAP

CHAPとは Challenge Handshake Authentication Protocol の略で、MD5ハッシュをベースとしたパスワードハッシュによる認証を行います。さらに「チャレンジ」という乱数によって、毎回パスワードハッシュを変形させるため、リプレイ攻撃への耐性もあります。

以下にCHAPのフレームフォーマットを示します。

例えばR2がR1をCHAP認証する場合のCHAP認証シーケンスは以下の通りになります。

スポンサーリンク

まずR2はR1に対して乱数(Challenge)を送信します。

R1は受信したチャレンジと、自身のホスト名、自身のパスワードを使い、MD5ハッシュを生成します(ここではその結果を「MD5ハッシュ①」とします)。

R1はChallengeに対するResponseとして、「MD5ハッシュ①」と「自身のホスト名」をR2へ送ります。

R2はR1のパスワード情報をローカルに保有しているため、同様にMD5ハッシュを生成します(ここではその結果を「MD5ハッシュ②」とします)。

R2はMDハッシュ①と②を比較し、一致すれば認証成功とみなします。

CiscoでのCHAP認証(単方向認証)の設定

先の例のように、R2のみがR1の認証をする場合は以下のように設定します。

[R1での設定]

interface s0/0
encapsulation ppp
ppp authentication chap callin
ppp chap hostname Router1
ppp chap password hogehogeR1
!

[R2での設定]

username Router1 secret hogehogeR1
!
interface s0/0
encapsulation ppp
ppp authentication chap
!

(config-if)# ppp chap hostname

ではCHAPで利用するName(ホスト名)を指定できます。ここで指定しない場合は

(config)# hostname ~~

でのホスト名が利用されます。

callinについてはPAPのときと全く同じです。

MS-CHAPについて

マイクロソフトではCHAPを元に独自拡張を行ったMS-CHAPv2というプロトコルが使われています。

CHAPが元とは言いつつ、実はハッシュ関数としてはMD5よりも弱い『MD4』を使っています。

MS-CHAPv2は2012年に脆弱性が見つかりましたが、IEEE802.1x認証では未だに使われ続けています。これは、IEEE802.1x認証がこのMS-CHAPv2のシーケンスをTLSで暗号化しており、そちらのセキュリティで担保されているためです。

なぜMD4を使うのか、という疑問については、元を辿ればActiveDirectoryというソリューションにあるLDAPに格納されている、各ユーザアカウントのパスワード(NTLMパスワード)のハッシュがMD4ハッシュ関数を使っていることに起因します。

ハッシュは一方向なので、LDAP等のパスワード管理サーバ上のパスワードハッシュ関数と、そのサーバに照会を掛けに行くMS-CHAPv2等のプロトコル内のパスワード情報のハッシュ関数が一致しないと、パスワードの照合ができません

今後、マイクロソフトがこの仕様をいつ変えてくるのか、注目です。

シェアする

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

フォローする