【図解】PPP/PPPoE の認証 (PAP/CHAP/MS-CHAPv2)とシーケンス, callin オプションについて

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

まず PAP と CHAP の違いは、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 等のプロトコル内のパスワード情報のハッシュ関数が一致しないと、パスワードの照合ができません

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

シェアする

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

フォローする