事の始まり
先月の話になります。
今どきというとアレですけどお客さん環境の中に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の動き見るだけですからね。
両サーバ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でも要らないに違いない!
(単方向認証のとき)
改めてフロー整理
ログを清書するとこうなります。
いやー、すっきりすっきり!
まあいろんなサイトでこういう図が出てくるので、でって言う感じですが、
自分で動かして整理すると入りが違いますね。
もう一回勉強する!と言っておきながら大した検証はできていないかもしれませんが、
こういうのできるのがこの業界の面白い所ですね(^^)
参考サイト
Ubuntu Manpage: pppd - PPP (Point to Point Protocol) を処理するデーモン