charset.c: Dropped debug message to level 6.
[Samba/gbeck.git] / docs / textdocs / ENCRYPTION.txt
blob82fe228926672dcec4cf87089a30e151ccbc7b2f
1                 LanManager / Samba Password Encryption.
2                 ---------------------------------------
4 With the development of LanManager and Windows NT compatible password 
5 encryption for Samba, it is now able to validate user connections in 
6 exactly the same way as a LanManager or Windows NT server.
8 This document describes how the SMB password encryption algorithm
9 works and what issues there are in choosing whether you want to use
10 it. You should read it carefully, especially the part about security
11 and the "PROS and CONS" section.
13 How does it work ?
14 ------------------
16         LanManager encryption is somewhat similar to UNIX password
17 encryption. The server uses a file containing a hashed value of a
18 users password.  This is created by taking the users paintext
19 password, capitalising it, and either truncating to 14 bytes (or
20 padding to 14 bytes with null bytes). This 14 byte value is used as
21 two 56 bit DES keys to encrypt a 'magic' eight byte value, forming a
22 16 byte value which is stored by the server and client. Let this value
23 be known as the *hashed password*.
25         Windows NT encryption is a higher quality mechanism, consisting
26 of doing an MD4 hash on a Unicode version of the users password. This
27 also produces a 16 byte hash value that is non-reversible.
29 When a client (LanManager, Windows for WorkGroups, Windows 95 or
30 Windows NT) wishes to mount a Samba drive (or use a Samba resource) it
31 first requests a connection and negotiates the protocol that the client
32 and server will use. In the reply to this request the Samba server
33 generates and appends an 8 byte, random value - this is stored in the
34 Samba server after the reply is sent and is known as the *challenge*.
36 The challenge is different for every client connection.
38 The client then uses the hashed password (16 byte values described
39 above), appended with 5 null bytes, as three 56 bit DES keys, each of
40 which is used to encrypt the challenge 8 byte value, forming a 24 byte
41 value known as the *response*.
43 In the SMB call SMBsessionsetupX (when user level security is
44 selected) or the call SMBtconX (when share level security is selected)
45 the 24 byte response is returned by the client to the Samba server.
46 For Windows NT protocol levels the above calculation is done on
47 both hashes of the users password and both responses are returned
48 in the SMB call, giving two 24 byte values.
50 The Samba server then reproduces the above calculation, using it's own
51 stored value of the 16 byte hashed password (read from the smbpasswd
52 file - described later) and the challenge value that it kept from the
53 negotiate protocol reply. It then checks to see if the 24 byte value it
54 calculates matches the 24 byte value returned to it from the client.
56 If these values match exactly, then the client knew the correct
57 password (or the 16 byte hashed value - see security note below) and
58 is this allowed access. If not then the client did not know the
59 correct password and is denied access.
61 Note that the Samba server never knows or stores the cleartext of the
62 users password - just the 16 byte hashed values derived from it. Also
63 note that the cleartext password or 16 byte hashed values are never
64 transmitted over the network - thus increasing security.
66 IMPORTANT NOTE ABOUT SECURITY
67 -----------------------------
69 The unix and SMB password encryption techniques seem similar on the
70 surface. This similarity is, however, only skin deep. The unix scheme
71 typically sends clear text passwords over the nextwork when logging
72 in. This is bad. The SMB encryption scheme never sends the cleartext
73 password over the network but it does store the 16 byte hashed values
74 on disk. This is also bad. Why? Because the 16 byte hashed values are a
75 "password equivalent". You cannot derive the users password from them,
76 but they could potentially be used in a modified client to gain access
77 to a server. This would require considerable technical knowledge on
78 behalf of the attacker but is perfectly possible. You should thus
79 treat the smbpasswd file as though it contained the cleartext
80 passwords of all your users. Its contents must be kept secret, and the
81 file should be protected accordingly.
83 Ideally we would like a password scheme which neither requires plain
84 text passwords on the net or on disk. Unfortunately this is not
85 available as Samba is stuck with being compatible with other SMB
86 systems (WinNT, WfWg, Win95 etc). 
89 PROS AND CONS
90 -------------
92 There are advantages and disadvantages to both schemes. 
94 Advantages of SMB Encryption:
95 -----------------------------
97 - plain text passwords are not passed across the network. Someone using
98 a network sniffer cannot just record passwords going to the SMB server.
100 - WinNT doesn't like talking to a server that isn't using SMB
101 encrypted passwords. It will refuse to browse the server if the server
102 is also in user level security mode. It will insist on promting the
103 user for the password on each connection, which is very annoying. The
104 only things you can do to stop this is to use SMB encryption.
106 Advantages of non-encrypted passwords:
107 --------------------------------------
109 - plain text passwords are not kept on disk. 
111 - uses same password file as other unix services such as login and
114 - you are probably already using other services (such as telnet and
115 ftp) which send plain text passwords over the net, so not sending them
116 for SMB isn't such a big deal.
118 The smbpasswd file.
119 -------------------
121         In order for Samba to participate in the above protocol it must
122 be able to look up the 16 byte hashed values given a user name.
123 Unfortunately, as the UNIX password value is also a one way hash
124 function (ie. it is impossible to retrieve the cleartext of the users
125 password given the UNIX hash of it) then a separate password file
126 containing this 16 byte value must be kept. To minimise problems with
127 these two password files, getting out of sync, the UNIX /etc/passwd and
128 the smbpasswd file, a utility, mksmbpasswd.sh, is provided to generate
129 a smbpasswd file from a UNIX /etc/passwd file.
131 To generate the smbpasswd file from your /etc/passwd file use the
132 following command :-
134 cat /etc/passwd | mksmbpasswd.sh >/usr/local/samba/private/smbpasswd
136 If you are running on a system that uses NIS, use
138 ypcat passwd | mksmbpasswd.sh >/usr/local/samba/private/smbpasswd
140 The mksmbpasswd.sh program is found in the Samba source directory. By
141 default, the smbpasswd file is stored in :-
143 /usr/local/samba/private/smbpasswd
145 The owner of the /usr/local/samba/private directory should be set to
146 root, and the permissions on it should be set to :-
148 r-x------
150 The command 
152 chmod 500 /usr/local/samba/private
154 will do the trick. Likewise, the smbpasswd file inside the private
155 directory should be owned by root and the permissions on is should be
156 set to
158 rw-------
160 by the command :-
162 chmod 600 smbpasswd.
164 The format of the smbpasswd file is
166 username:uid:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Long name:user home dir:user shell
168 Although only the username, uid, and XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
169 sections are significant and are looked at in the Samba code.
171 It is *VITALLY* important that there by 32 'X' characters between the
172 two ':' characters in the XXX sections - the smbpasswd and Samba code 
173 will fail to validate any entries that do not have 32 characters 
174 between ':' characters. The first XXX section is for the Lanman password
175 hash, the second is for the Windows NT version.
177 When the password file is created all users have password entries
178 consisting of 32 'X' characters. By default this disallows any access
179 as this user. When a user has a password set, the 'X' characters change
180 to 32 ascii hexadecimal digits (0-9, A-F). These are an ascii
181 representation of the 16 byte hashed value of a users password.
183 To set a user to have no password (not recommended), edit the file
184 using vi, and replace the first 11 characters with the asci text
186 NO PASSWORD
188 Eg. To clear the password for user bob, his smbpasswd file entry would
189 look like :
191 bob:100:NO PASSWORDXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Bob's full name:/bobhome:/bobshell
193 If you are allowing users to use the smbpasswd command to set their own
194 passwords, you may want to give users NO PASSWORD initially so they do
195 not have to enter a previous password when changing to their new
196 password (not recommended).
198 Note : This file should be protected very carefully. Anyone with
199 access to this file can (with enough knowledge of the protocols) gain
200 access to your SMB server. The file is thus more sensitive than a
201 normal unix /etc/passwd file.
203 The smbpasswd Command.
204 ----------------------
206         The smbpasswd command maintains the two 32 byte password fields in
207 the smbpasswd file. If you wish to make it similar to the unix passwd
208 or yppasswd programs, install it in /usr/local/samba/bin (or your main
209 Samba binary directory) and make it setuid root.
211 Note that if you do not do this then the root user will have to set all
212 users passwords.
214 To set up smbpasswd as setuid root, change to the Samba binary install
215 directory and then type (as root) :
217 chown root smbpasswd
218 chmod 4555 smbpasswd
220 If smbpasswd is installed as setuid root then you would use it as
221 follows.
223 smbpasswd
224 Old SMB password: <type old alue here - just hit return if there is NO PASSWORD>
225 New SMB Password: < type new value >
226 Repeat New SMB Password: < re-type new value >
228 If the old value does not match the current value stored for that user,
229 or the two new values do not match each other, then the password will
230 not be changed.
232 If invoked by an ordinary user it will only allow the user to change
233 his or her own Samba password.
235 If run by the root user smbpasswd may take an optional argument,
236 specifying the user name whose SMB password you wish to change.  Note
237 that when run as root smbpasswd does not prompt for or check the old
238 password value, thus allowing root to set passwords for users who have
239 forgotten their passwords.
241 smbpasswd is designed to work in the same way and be familiar to UNIX
242 users who use the passwd or yppasswd commands.
244 NOTE. As smbpasswd is designed to be installed as setuid root I would
245 appreciate it if everyone examined the source code to look for
246 potential security flaws. A setuid program, if not written properly can
247 be an open door to a system cracker. Please help make this program
248 secure by reporting all problems to me (the author, Jeremy Allison).
250 My email address is :-
252 jra@cygnus.com
254 Setting up Samba to support LanManager Encryption.
255 --------------------------------------------------
257 This is a very brief description on how to setup samba to support
258 password encryption. More complete instructions will probably be added
259 later.
261 1) get and compile the libdes libraries. the source is available from
262 ftp://samba.anu.edu.au/pub/libdes/
264 2) enable the encryption stuff in the Samba makefile, making sure you
265 point it to the libdes library and include file (it needs des.h)
266 The entries you need to uncomment are the four lines after the comment :-
268 # This is for SMB encrypted (lanman) passwords.
270 Note that you may have to change the variable DES_BASE to
271 point at the place where you installed the DES library.
273 3) compile and install samba as usual
275 4) f your system can't compile the module getsmbpass.c then remove the
276 -DSMBGETPASS define from the Makefile.
278 5) enable encrypted passwords in smb.conf by adding the line 
279 "encrypt passwords = yes" in the [global] section
281 6) create the initial smbpasswd password file in the place you
282 specified in the Makefile. A simple way to do this based on your
283 existing Makefile (assuming it is in a reasonably standard format) is
284 like this:
286 cat /etc/passwd | mksmbpasswd.sh > /usr/local/samba/private/smbpasswd
288 Change ownership of private and smbpasswd to root.
290 chown -R root /usr/local/samba/private
292 Set the correct permissions on /usr/local/samba/private
294 chmod 500 /usr/local/samba/private
296 Set the correct permissions on /usr/local/samba/private/smbpasswd
298 chmod 600 /usr/local/samba/private/smbpasswd
300 note that the mksmbpasswd.sh script is in the samba source directory.
302 If this fails then you will find that you will need entries that look
303 like this:
305 # SMB password file.
306 tridge:148:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:Andrew Tridgell:/home/tridge:/bin/tcsh
308 note that the uid and username fields must be right. Also, you must get
309 the number of X's right (there should be 32).
311 If you wish, install the smbpasswd program as suid root.
313 chown root /usr/local/samba/bin/smbpasswd
314 chmod 4555 /usr/local/samba/bin/smbpasswd
316 7) set the passwords for users using the smbpasswd command. For
317 example, as root you could do "smbpasswd tridge"
319 8) try it out!
321 Note that you can test things using smbclient, as it also now supports
322 encryption.
324 NOTE TO USA Sites that Mirror Samba
325 -----------------------------------
327 The DES library is considered a munition in the USA. Under US Law it is
328 illegal to export this software, or to put it in a freely available ftp
329 site.
331 Please do not mirror the libdes directory from the site on
332 samba.anu.edu.au
334 Thank you,
336 Jeremy Allison.