【図解】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 での設定]
(config)# username R2 secret hogehogeR2
!
(config)# interface s0/0
(config-if)# encapsulation ppp
(config-if)# ppp authentication pap
(config-if)# ppp pap sent-username R1 password hogehogeR1
!
[R2 での設定]
(config)# username R1 secret hogehogeR1
!
(config)# interface s0/0
(config-if)# encapsulation ppp
(config-if)# ppp authentication pap
(config)-if# ppp pap sent-username R2 password hogehogeR2
!

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

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

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

[R1での設定]
(config)# interface s0/0
(config-if)# encapsulation ppp
(config-if)# ppp authentication pap callin
(config-if)# ppp pap sent-username R1 password hogehogeR1
!
[R2での設定]
(config)# username R1 secret hogehogeR1
!
(config)# interface s0/0
(config-if)# encapsulation ppp
(config-if)# 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 での設定]
(config)# interface s0/0
(config-if)# encapsulation ppp
(config-if)# ppp authentication chap callin
(config-if)# ppp chap hostname Router1
(config-if)# ppp chap password hogehogeR1
!
[R2 での設定]
(config)# username Router1 secret hogehogeR1
!
(config)# interface s0/0
(config-if)# encapsulation ppp
(config-if)# ppp authentication chap
!
(config-if)# ppp chap hostname

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

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

IT/インフラエンジニアの地位とスキル向上のために

関連記事

IT 技術の進化はとどまることを知りません。矢継ぎ早に新たな技術が出てきたり、数年前の技術が時代遅れになったりと、IT エンジニアは勉強し続ける運命のようです。 それをどう思うかはあなた次第。 ビジネスの基本は『付加価値を与える[…]

IMG
関連記事

nesuke の考える NW エンジニアの2つの道 ネットワークエンジニアには 2 つの道があります。 1 つはネットワーク構築一筋で、L4 までをひたすらきっちりと構築していく道。 もう 1 つはネットワークを軸として深堀し[…]

IMG