PPP/PPPoE の認証の種類
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 等のプロトコル内のパスワード情報のハッシュ関数が一致しないと、パスワードの照合ができません。
今後、マイクロソフトがこの仕様をいつ変えてくるのか、注目です。
コメント