paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

PPP CHAPをもう一回勉強する

事の始まり

先月の話になります。

今どきというとアレですけどお客さん環境の中にINS接続の機器がいるのですが、
PPPの認証方向(どっちのセンタ起動か)がバラバラでどっちの機器に何の設定がいるんだっけと
混乱してきました。

特にずっとciscoで構築してきたので
どうしてもciscoに寄った知識になってしまいます。

特にNW機器だと単方向認証だの双方向だのの項目があるので
たまにしかやらないと本当に混乱します。

そんなわけでCHAPの動きを理解するため今一度整理します。

CHAPで勘違いしていたこと

お互いCHAPのチャレンジ、レスポンスともにパスワードのlookup用にusernameが必要

Ciscoのppp系のサイトはお互いの機器がusernameを確認するという絵が描いてあるので
てっきり双方向の機器にお互いのユーザ名が要るものだと信じてしまいました。

そういえばCHAP認証はハッシュされた値の突合なのでユーザ名が必須かと言わればそうでもない気がしますよね。
Internet接続とかでも使うし。

認証側はもちろん必要ですが起動側は相手のユーザ名は登録しなくても良さそうです。
もちろん機器の使用によっては必要なものもあると思います。

  • 間違いのフロー図
起動側 受信側
call ->
Challenge受信 <- ユーザ名送信(Challenge)
ユーザ名lookup
パスワード+αをハッシュ化
自ユーザ名+ハッシュ値送信 -> ユーザ名+ハッシュ値受信
受信ユーザ名からパスワード検索
ハッシュ値計算
<- 認証OKを送信
  • きっとこうなんだ
起動側 受信側
call ->
Challenge受信 <- ユーザ名送信(Challenge)
パスワード+αをハッシュ化
自ユーザ名+ハッシュ値送信 -> ユーザ名+ハッシュ値受信
受信ユーザ名からパスワード検索
ハッシュ値計算
<- 認証OKを送信

RFC(1994)をみると「ユーザ名に紐づいたパスワードをハッシュすること」とは書いていません。
パケットのnameフィールドは必須ですが、lookup用に使わなくても大丈夫そうです。

https://www.ietf.org/rfc/rfc1994.txt

検証

PPP、CHAPの動きをログを見て確認しようと思います。
検証は自宅で行いますが、INSの環境が無いのでpppoeを使って確認します。

また、自宅にNW機器もないのでLinuxで立てます。
(NWエンジニアなのに無くてすみません…)

もはやINSでもなく、Ciscoでもないんで元の環境の原型が無くなってしまいましたが、まあいいでしょう。
動作は同じはずです。

環境

サブ機ノートPCの仮想マシンでクライアント、サーバ両方立てちゃいます。

構成はシンプルにこう。
pppoeの動き見るだけですからね。

f:id:paloma69:20191025232135p:plain

両サーバcentos7です。
ホスト名のとおりvagrantを使って構築しています。

[vagrant@ppp-server ~]$ cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)

[vagrant@ppp-client ~]$ cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)

iptables、firewlldは無効の状態です。

サーバ設定

PPPoEのインストール、設定等基本的な所はデフォルトにするので割愛します。

  • chap-secrets

clientは「client01」にしました。

[vagrant@ppp-server ~]$ sudo cat /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
client01        *       client01        *
その他検証用にやったところ

デバッグレベルのログまで見たいので追加で設定します。

  • pppoe-server-options

CHAPの確認なのでpapはコメントアウト。 require-chapを追加します。

デバッグレベル出力のためdebugを追加します。
ここの設定内容がpppdのオプションとして反映されるようです。

[vagrant@ppp-server ~]$ cat /etc/ppp/pppoe-server-options
# PPP options for the PPPoE server
# LIC: GPL
#require-pap
require-chap #追加
login
debug # 追加
lcp-echo-interval 10
lcp-echo-failure 2
  • rsyslog.conf

pppdのdebugログはdaemonファシリティでsyslogに吐かれるそうなので
rsyslog.confに追加します。

[vagrant@ppp-server ~]$ cat /etc/rsyslog.conf | grep daemon
daemon.*                                                /var/log/daemon

起動します。
vagrant boxのcentosはensじゃなくてethxになってますね。
aliasかな?

sudo pppoe-server -I eth1

クライアント設定

クライアント側の方法はいくつかありますが簡単にpppoe-setupを使います。
この手順は割愛。

sshが切れると困るのでppp0のデフォゲは無効にします。

[vagrant@ppp-client ~]$ sudo cat /etc/sysconfig/network-scripts/ifcfg-ppp0
USERCTL=yes
BOOTPROTO=dialup
NAME=DSLppp0
DEVICE=ppp0
TYPE=xDSL
ONBOOT=no
PIDFILE=/var/run/pppoe-adsl.pid
FIREWALL=NONE
PING=.
PPPOE_TIMEOUT=80
LCP_FAILURE=3
LCP_INTERVAL=20
CLAMPMSS=1412
CONNECT_POLL=6
CONNECT_TIMEOUT=60
DEFROUTE=no # yes -> noに変更
SYNCHRONOUS=no
ETH=eth1
PROVIDER=DSLppp0
USER=client01
PEERDNS=no
DEMAND=no

pppインターフェース起動

clientのpppインターフェースを起動。

[vagrant@ppp-client ~]$ sudo /sbin/ifup ppp0
[vagrant@ppp-client ~]$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:8a:fe:e6 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
       valid_lft 51192sec preferred_lft 51192sec
    inet6 fe80::5054:ff:fe8a:fee6/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:c2:6f:6b brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.10/24 brd 192.168.33.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fec2:6f6b/64 scope link
       valid_lft forever preferred_lft forever
6: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1492 qdisc pfifo_fast state UNKNOWN group default qlen 3
    link/ppp
    inet 10.67.15.3 peer 10.0.0.1/32 scope global ppp0
       valid_lft forever preferred_lft forever

ppp張れましたね。

※ eth0は昔ホストオンリーアダプターを作った時の設定が反映されて上がってしまったみたいです。
今回は特に使わないので無視します。

サーバ側のログ

Oct 24 15:00:44 ppp-server pppoe-server[4447]: Session 3 created for client 08:00:27:c2:6f:6b (10.67.15.3) on eth1 using Service-Name ''
Oct 24 15:00:44 ppp-server pppd[4447]: pppd 2.4.5 started by vagrant, uid 0
Oct 24 15:00:44 ppp-server pppd[4447]: using channel 3
Oct 24 15:00:44 ppp-server pppd[4447]: Using interface ppp0
Oct 24 15:00:44 ppp-server pppd[4447]: Connect: ppp0 <--> /dev/pts/1
Oct 24 15:00:44 ppp-server NetworkManager[4050]: <info>  [1571929244.9456] manager: (ppp0): new Ppp device (/org/freedesktop/NetworkManager/Devices/6)
Oct 24 15:00:45 ppp-server pppd[4447]: rcvd [LCP ConfReq id=0x1 <mru 1492> <magic 0x3771cff7>]
Oct 24 15:00:45 ppp-server pppd[4447]: sent [LCP ConfReq id=0x1 <mru 1492> <auth chap MD5> <magic 0x80db6786>]
Oct 24 15:00:45 ppp-server pppd[4447]: sent [LCP ConfAck id=0x1 <mru 1492> <magic 0x3771cff7>]
Oct 24 15:00:45 ppp-server pppd[4447]: rcvd [LCP ConfAck id=0x1 <mru 1492> <auth chap MD5> <magic 0x80db6786>]
Oct 24 15:00:45 ppp-server pppd[4447]: sent [LCP EchoReq id=0x0 magic=0x80db6786]
Oct 24 15:00:45 ppp-server pppd[4447]: sent [CHAP Challenge id=0xe8 <d2292ad3129e9b165723fedc864214d23b038cf98335>, name = "ppp-server"]
Oct 24 15:00:45 ppp-server pppd[4447]: rcvd [LCP EchoReq id=0x0 magic=0x3771cff7]
Oct 24 15:00:45 ppp-server pppd[4447]: sent [LCP EchoRep id=0x0 magic=0x80db6786]
Oct 24 15:00:45 ppp-server pppd[4447]: rcvd [LCP EchoRep id=0x0 magic=0x3771cff7]
Oct 24 15:00:45 ppp-server pppd[4447]: rcvd [CHAP Response id=0xe8 <651f68004248139f6bf3281d2cbfa215>, name = "client01"]
Oct 24 15:00:45 ppp-server pppd[4447]: sent [CHAP Success id=0xe8 "Access granted"]
Oct 24 15:00:45 ppp-server pppd[4447]: Initializing PAM (2) for user client01
Oct 24 15:00:45 ppp-server pppd[4447]: ---> PAM INIT Result = 0
Oct 24 15:00:45 ppp-server pppd[4447]: Attempting PAM account checks
Oct 24 15:00:46 ppp-server pppd[4447]: User unknown, ignoring PAM restrictions
Oct 24 15:00:46 ppp-server pppd[4447]: user client01 logged in on tty  intf ppp0
Oct 24 15:00:46 ppp-server pppd[4447]: BSD-Compress (15) compression enabled
Oct 24 15:00:46 ppp-server pppd[4447]: local  IP address 10.0.0.1
Oct 24 15:00:46 ppp-server pppd[4447]: remote IP address 10.67.15.3
Oct 24 15:00:46 ppp-server NetworkManager[4050]: <info>  [1571929246.0245] device (ppp0): state change: unmanaged -> unavailable (reason 'connection-assumed', sys-iface-state: 'external')
Oct 24 15:00:46 ppp-server NetworkManager[4050]: <info>  [1571929246.0276] device (ppp0): state change: unavailable -> disconnected (reason 'none', sys-iface-state: 'external')
Oct 24 15:01:02 ppp-server systemd: Created slice User Slice of root.
Oct 24 15:01:02 ppp-server systemd: Started Session 3 of user root.

着信受けてLCPフェーズ、CHAPと来てますね。
centos6系だとIPCPフェーズのログも見えるのですが、7系だと見えませんね。
NetworkManagerが何か悪さしてるんでしょうか。
ここの原因はわからないままです。

クライアントのログ

こっちのデバッグログの出力方法がわかりませんでした。
別パッケージだけどubuntuだったらできるのになー。

Oct 24 15:00:44 ppp-client pppd[4852]: pppd 2.4.5 started by vagrant, uid 0
Oct 24 15:00:44 ppp-client pppd[4852]: Using interface ppp0
Oct 24 15:00:44 ppp-client pppd[4852]: Connect: ppp0 <--> /dev/pts/1
Oct 24 15:00:44 ppp-client NetworkManager[3991]: <info>  [1571929244.9144] manager: (ppp0): new Ppp device (/org/freedesktop/NetworkManager/Devices/6)
Oct 24 15:00:44 ppp-client pppoe[4853]: PPP session is 3 (0x3)
Oct 24 15:00:45 ppp-client pppd[4852]: CHAP authentication succeeded: Access granted
Oct 24 15:00:45 ppp-client pppd[4852]: CHAP authentication succeeded
Oct 24 15:00:46 ppp-client pppd[4852]: BSD-Compress (15) compression enabled
Oct 24 15:00:46 ppp-client pppd[4852]: local  IP address 10.67.15.3
Oct 24 15:00:46 ppp-client pppd[4852]: remote IP address 10.0.0.1
Oct 24 15:00:46 ppp-client NetworkManager[3991]: <info>  [1571929246.0193] device (ppp0): state change: unmanaged -> unavailable (reason 'connection-assumed', sys-iface-state: 'external')
Oct 24 15:00:46 ppp-client NetworkManager[3991]: <info>  [1571929246.0224] device (ppp0): state change: unavailable -> disconnected (reason 'none', sys-iface-state: 'external')
Oct 24 15:01:02 ppp-client systemd: Created slice User Slice of root.
Oct 24 15:01:02 ppp-client systemd: Started Session 3 of user root.

本題の確認ポイント

今回クライアント側にもサーバのユーザ名が必要かどうかの確認をしたかったのですが
クライアント側には自分の情報(client01)しか設定していません。

Oct 24 15:00:45 ppp-server pppd[4447]: sent [CHAP Challenge id=0xe8 <d2292ad3129e9b165723fedc864214d23b038cf98335>, name = "ppp-server"]

サーバ側のログでは「ppp-server」というnameフィールドが付いたチャレンジを送っていますが、
client側にはそんな設定はしていません!

無視しているのかどうかはわかりませんが、なくても認証できるということは
クライアント側にはサーバのユーザ名はやっぱり要らなかったんだ!
たぶんciscoでも要らないに違いない!
(単方向認証のとき)

改めてフロー整理

ログを清書するとこうなります。

f:id:paloma69:20191025231157p:plain

いやー、すっきりすっきり!

まあいろんなサイトでこういう図が出てくるので、でって言う感じですが、
自分で動かして整理すると入りが違いますね。

もう一回勉強する!と言っておきながら大した検証はできていないかもしれませんが、
こういうのできるのがこの業界の面白い所ですね(^^)

参考サイト

Ubuntu Manpage: pppd - PPP (Point to Point Protocol) を処理するデーモン

pppoe-server - システム管理コマンドの説明 - Linux コマンド集 一覧表

CentOS7.4でPPPoE接続 rp-pppoe編 - Qiita