blob: 2c3172ab77f535c099892493f01d602de5c00a31 [file] [log] [blame]
lh9ed821d2023-04-07 01:36:19 -07001PPP Support for Microsoft's CHAP-80
2===================================
3
4Eric Rosenquist rosenqui@strataware.com
5(updated by Paul Mackerras)
6(updated by Al Longyear)
7(updated by Farrell Woods)
8(updated by Frank Cusack)
9
10INTRODUCTION
11
12Microsoft has introduced an extension to the Challenge/Handshake
13Authentication Protocol (CHAP) which avoids storing cleartext
14passwords on a server. (Unfortunately, this is not as secure as it
15sounds, because the encrypted password stored on a server can be used
16by a bogus client to gain access to the server just as easily as if
17the password were stored in cleartext.) The details of the Microsoft
18extensions can be found in the document:
19
20 <http://www.ietf.org/rfc/rfc2433.txt>
21
22In short, MS-CHAP is identified as <auth chap 80> since the hex value
23of 80 is used to designate Microsoft's scheme. Standard PPP CHAP uses
24a value of 5. If you enable PPP debugging with the "debug" option and
25see something like the following in your logs, the remote server is
26requesting MS-CHAP:
27
28 rcvd [LCP ConfReq id=0x2 <asyncmap 0x0> <auth MS> <magic 0x46a3>]
29 ^^^^^^^
30
31MS-CHAP is enabled by default under Linux in pppd/Makefile.linux by
32the line "CHAPMS=y".
33
34
35CONFIGURATION
36
37If you've never used PPPD with CHAP before, read the man page (type
38"man pppd") and read the description in there. Basically, you need to
39edit the "chap-secrets" file typically named /etc/ppp/chap-secrets.
40This should contain the following two lines for each system with which
41you use CHAP (with no leading blanks):
42
43 RemoteHost Account Secret
44 Account RemoteHost Secret
45
46Note that you need both lines and that item 1 and 2 are swapped in the
47second line. I'm not sure why you need it twice, but it works and I didn't
48have time to look into it further. The "RemoteHost" is a somewhat
49arbitrary name for the remote Windows NT system you're dialing. It doesn't
50have to match the NT system's name, but it *does* have to match what you
51use with the "remotename" parameter. The "Account" is the Windows NT
52account name you have been told to use when dialing, and the "Secret" is
53the password for that account. For example, if your service provider calls
54their machine "DialupNT" and tells you your account and password are
55"customer47" and "foobar", add the following to your chap-secrets file:
56
57 DialupNT customer47 foobar
58 customer47 DialupNT foobar
59
60The only other thing you need to do for MS-CHAP (compared to normal CHAP)
61is to always use the "remotename" option, either on the command line or in
62your "options" file (see the pppd man page for details). In the case of
63the above example, you would need to use the following command line:
64
65 pppd name customer47 remotename DialupNT <other options>
66
67or add:
68
69 name customer47
70 remotename DialupNT
71
72to your PPPD "options" file.
73
74The "remotename" option is required for MS-CHAP since Microsoft PPP servers
75don't send their system name in the CHAP challenge packet.
76
77
78E=691 (AUTHENTICATION_FAILURE) ERRORS WHEN YOU HAVE THE VALID SECRET (PASSWORD)
79
80If your RAS server is not the domain controller and is not a 'stand-alone'
81server then it must make a query to the domain controller for your domain.
82
83You need to specify the domain name with the user name when you attempt to
84use this type of a configuration. The domain name is specified with the
85local name in the chap-secrets file and with the option for the 'name'
86parameter.
87
88For example, the previous example would become:
89
90 DialupNT domain\\customer47 foobar
91 domain\\customer47 DialupNT foobar
92
93and
94
95 pppd name 'domain\\customer47' remotename DialupNT <other options>
96
97or add:
98
99 name domain\\customer47
100 remotename DialupNT
101
102when the Windows NT domain name is simply called 'domain'.
103
104
105TROUBLESHOOTING
106
107Assuming that everything else has been configured correctly for PPP and
108CHAP, the MS-CHAP-specific problems you're likely to encounter are mostly
109related to your Windows NT account and its settings. A Microsoft server
110returns error codes in its CHAP response. The following are extracted from
111RFC 2433:
112
113 646 ERROR_RESTRICTED_LOGON_HOURS
114 647 ERROR_ACCT_DISABLED
115 648 ERROR_PASSWD_EXPIRED
116 649 ERROR_NO_DIALIN_PERMISSION
117 691 ERROR_AUTHENTICATION_FAILURE
118 709 ERROR_CHANGING_PASSWORD
119
120You'll see these in your pppd log as a line similar to:
121
122 Remote message: E=649 R=0
123
124The "E=" is the error number from the table above, and the "R=" flag
125indicates whether the error is transient and the client should retry. If
126you consistently get error 691, then either you're using the wrong account
127name/password, or the DES library or MD4 hashing (in md4.c) aren't working
128properly. Verify your account name and password (use a Windows NT or
129Windows 95 system to dial-in if you have one available). If that checks
130out, test the DES library with the "destest" program included with the DES
131library. If DES checks out, the md4.c routines are probably failing
132(system byte ordering may be a problem) or my code is screwing up. I've
133only got access to a Linux system, so you're on your own for anything else.
134
135Another thing that might cause problems is that some RAS servers won't
136respond at all to LCP config requests without seeing the word "CLIENT"
137from the other end. If you see pppd sending out LCP config requests
138without getting any reply, try putting something in your chat script
139to send the word CLIENT after the modem has connected.
140
141STILL TO DO
142
143A site using only MS-CHAP to authenticate has no need to store cleartext
144passwords in the "chap-secrets" file. A utility that spits out the ASCII
145hex MD4 hash of a given password would be nice, and would allow that hash
146to be used in chap-secrets in place of the password. The code to do this
147could quite easily be lifted from chap_ms.c (you have to convert the
148password to Unicode before hashing it). The chap_ms.c file would also have
149to be changed to recognize a password hash (16 binary bytes == 32 ASCII hex
150characters) and skip the hashing stage. This would have no real security
151value as the hash is plaintext-equivalent.