1919 lines
		
	
	
		
			67 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1919 lines
		
	
	
		
			67 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| [ Note: the installation instructions in this document are somewhat
 | ||
|   out of date - the package now uses GNU autoconf and is configured
 | ||
|   just like most GNU packages: run ./configure then make.  --marekm ]
 | ||
| 
 | ||
|   Linux Shadow Password HOWTO
 | ||
|   Michael H. Jackson, mhjack@tscnet.com
 | ||
|   v1.3, 3 April 1996
 | ||
| 
 | ||
|   This document aims to describe how to obtain, install, and configure
 | ||
|   the Linux password Shadow Suite. It also discusses obtaining, and
 | ||
|   reinstalling other software and network daemons that require access to
 | ||
|   user passwords.  This other software is not actually part of the
 | ||
|   Shadow Suite, but these programs will need to be recompiled to support
 | ||
|   the Shadow Suite.  This document also contains a programming example
 | ||
|   for adding shadow support to a program.  Answers to some of the more
 | ||
|   frequently asked questions are included near the end of this document.
 | ||
| 
 | ||
|   1.  Introduction.
 | ||
| 
 | ||
|   This is the Linux Shadow-Password-HOWTO.  This document describes why
 | ||
|   and how to add shadow password support on a Linux system.  Some
 | ||
|   examples of how to use some of the Shadow Suite's features is also
 | ||
|   included.
 | ||
| 
 | ||
|   When installing the Shadow Suite and when using many of the utility
 | ||
|   programs, you must be logged in as root.  When installing the Shadow
 | ||
|   Suite you will be making changes to system software, and it is highly
 | ||
|   recommended that you make backup copies of programs as indicated.  I
 | ||
|   also recommend that you read and understand all the instructions
 | ||
|   before you begin.
 | ||
| 
 | ||
|   1.1.  Changes from the previous release.
 | ||
| 
 | ||
|   Additions:
 | ||
|           Added a sub-section on why you might not want to install shadow
 | ||
|           Added a sub-section on updating the xdm program
 | ||
|           Added a section on how to put Shadow Suite features to work
 | ||
|           Added a section containing frequently asked questions
 | ||
| 
 | ||
|   Corrections/Updates:
 | ||
|           Corrected html references on Sunsite
 | ||
|           Corrected section on wu-ftp to reflect adding -lshadow to the Makefile
 | ||
|           Corrected minor spelling and verbiage errors
 | ||
|           Changed section on wu-ftpd to support ELF
 | ||
|           Updated to reflect security problems in various login programs
 | ||
|           Updated to recommend the Linux Shadow Suite by Marek Michalkiewicz
 | ||
| 
 | ||
|   1.2.  New versions of this document.
 | ||
| 
 | ||
|   The latest released version of this document can always be retrieved
 | ||
|   by anonymous FTP from:
 | ||
| 
 | ||
|   sunsite.unc.edu
 | ||
| 
 | ||
|   /pub/Linux/docs/HOWTO/Shadow-Password-HOWTO
 | ||
| 
 | ||
|   or:
 | ||
| 
 | ||
|   /pub/Linux/docs/HOWTO/other-formats/Shadow-Password-HOWTO{-html.tar,ps,dvi}.gz
 | ||
| 
 | ||
|   or via the World Wide Web from the Linux Documentation Project Web
 | ||
|   Server <http://sunsite.unc.edu/mdw/linux.html>, at page: Shadow-
 | ||
|   Password-HOWTO <http://sunsite.unc.edu/linux/HOWTO/Shadow-Password-
 | ||
|   HOWTO.html> or directly from me, <mhjack@tscnet.com>. It will also be
 | ||
|   posted to the newsgroup: comp.os.linux.answers
 | ||
| 
 | ||
|   This document is now packaged with the Shadow-YYDDMM packages.
 | ||
| 
 | ||
|   1.3.  Feedback.
 | ||
| 
 | ||
|   Please send any comments, updates, or suggestions to me: Michael H.
 | ||
|   Jackson <mhjack@tscnet.com>  The sooner I get feedback, the sooner I
 | ||
|   can update and correct this document.  If you find any problems with
 | ||
|   it, please mail me directly as I very rarely stay up-to-date on the
 | ||
|   newsgroups.
 | ||
| 
 | ||
|   2.  Why shadow your passwd file?
 | ||
| 
 | ||
|   By default, most current Linux distributions do not contain the Shadow
 | ||
|   Suite installed.  This includes Slackware 2.3, Slackware 3.0, and
 | ||
|   other popular distributions.  One of the reasons for this is that the
 | ||
|   copyright notices in the original Shadow Suite were not clear on
 | ||
|   redistribution if a fee was charged.  Linux uses a GNU Copyright
 | ||
|   (sometimes refereed to as a Copyleft) that allows people to package it
 | ||
|   into a convenient package (like a CD-ROM distribution) and charge a
 | ||
|   fee for it.
 | ||
| 
 | ||
|   The current maintainer of the Shadow Suite, Marek Michalkiewicz
 | ||
|   <marekm@i17linuxb.ists.pwr.wroc.pl> received the source code from the
 | ||
|   original author under a BSD style copyright that allowed
 | ||
|   redistribution.   Now that the copyright issues are resolved, it is
 | ||
|   expected that future distributions will contain password shadowing by
 | ||
|   default.  Until then, you will need to install it yourself.
 | ||
| 
 | ||
|   If you installed your distribution from a CD-ROM, you may find that,
 | ||
|   even though the distribution did not have the Shadow Suite installed,
 | ||
|   some of the files you need to install the Shadow Suite may be on the
 | ||
|   CD-ROM.
 | ||
| 
 | ||
|   However, Shadow Suite versions 3.3.1, 3.3.1-2, and shadow-mk all have
 | ||
|   security problems with their login program and several other suid root
 | ||
|   programs that came with them, and should no longer be used.
 | ||
| 
 | ||
|   All of the necessary files may be obtained via anonymous FTP or
 | ||
|   through the World Wide Web.
 | ||
| 
 | ||
|   On a Linux system without the Shadow Suite installed, user information
 | ||
|   including passwords is stored in the /etc/passwd file.  The password
 | ||
|   is stored in an encrypted format.  If you ask a cryptography expert,
 | ||
|   however, he or she will tell you that the password is actually in an
 | ||
|   encoded rather than encrypted format because when using crypt(3), the
 | ||
|   text is set to null and the password is the key.  Therefore, from here
 | ||
|   on, I will use the term encoded in this document.
 | ||
| 
 | ||
|   The algorithm used to encode the password field is technically
 | ||
|   referred to as a one way hash function.  This is an algorithm that is
 | ||
|   easy to compute in one direction, but very difficult to calculate in
 | ||
|   the reverse direction.  More about the actual algorithm used can be
 | ||
|   found in section 2.4 or your crypt(3) manual page.
 | ||
| 
 | ||
|   When a user picks or is assigned a password, it is encoded with a
 | ||
|   randomly generated value called the salt.  This means that any
 | ||
|   particular password could be stored in 4096 different ways.  The salt
 | ||
|   value is then stored with the encoded password.
 | ||
| 
 | ||
|   When a user logs in and supplies a password, the salt is first
 | ||
|   retrieved from the stored encoded password.  Then the supplied
 | ||
|   password is encoded with the salt value, and then compared with the
 | ||
|   encoded password.  If there is a match, then the user is
 | ||
|   authenticated.
 | ||
| 
 | ||
|   It is computationally difficult (but not impossible) to take a
 | ||
|   randomly encoded password and recover the original password.  However,
 | ||
|   on any system with more than just a few users, at least some of the
 | ||
|   passwords will be common words (or simple variations of common words).
 | ||
| 
 | ||
|   System crackers know all this, and will simply encrypt a dictionary of
 | ||
|   words and common passwords using all possible 4096 salt values.  Then
 | ||
|   they will compare the encoded passwords in your /etc/passwd file with
 | ||
|   their database.  Once they have found a match, they have the password
 | ||
|   for another account.  This is referred to as a dictionary attack, and
 | ||
|   is one of the most common methods for gaining or expanding
 | ||
|   unauthorized access to a system.
 | ||
| 
 | ||
|   If you think about it, an 8 character password encodes to 4096 * 13
 | ||
|   character strings.  So a dictionary of say 400,000 common words,
 | ||
|   names, passwords, and simple variations would easily fit on a 4GB hard
 | ||
|   drive.  The attacker need only sort them, and then check for matches.
 | ||
|   Since a 4GB hard drive can be had for under $1000.00, this is well
 | ||
|   within the means of most system crackers.
 | ||
| 
 | ||
|   Also, if a cracker obtains your /etc/passwd file first, they only need
 | ||
|   to encode the dictionary with the salt values actually contained in
 | ||
|   your /etc/passwd file.  This method is usable by your average teenager
 | ||
|   with a couple of hundred spare Megabytes and a 486 class computer.
 | ||
| 
 | ||
|   Even without lots of drive space, utilities like crack(1) can usually
 | ||
|   break at least a couple of passwords on a system with enough users
 | ||
|   (assuming the users of the system are allowed to pick their own
 | ||
|   passwords).
 | ||
| 
 | ||
|   The /etc/passwd file also contains information like user ID's and
 | ||
|   group ID's that are used by many system programs.  Therefore, the
 | ||
|   /etc/passwd file must remain world readable.  If you were to change
 | ||
|   the /etc/passwd file so that nobody can read it, the first thing that
 | ||
|   you would notice is that the ls -l command now displays user ID's
 | ||
|   instead of names!
 | ||
| 
 | ||
|   The Shadow Suite solves the problem by relocating the passwords to
 | ||
|   another file (usually /etc/shadow).  The /etc/shadow file is set so
 | ||
|   that it cannot be read by just anyone.  Only root will be able to read
 | ||
|   and write to the /etc/shadow file.  Some programs (like xlock) don't
 | ||
|   need to be able to change passwords, they only need to be able to
 | ||
|   verify them.  These programs can either be run suid root or you can
 | ||
|   set up a group shadow that is allowed read only access to the
 | ||
|   /etc/shadow file.  Then the program can be run sgid shadow.
 | ||
| 
 | ||
|   By moving the passwords to the /etc/shadow file, we are effectively
 | ||
|   keeping the attacker from having access to the encoded passwords with
 | ||
|   which to perform a dictionary attack.
 | ||
| 
 | ||
|   Additionally, the Shadow Suite adds lots of other nice features:
 | ||
| 
 | ||
|   <20>  A configuration file to set login defaults (/etc/login.defs)
 | ||
| 
 | ||
|   <20>  Utilities for adding, modifying, and deleting user accounts and
 | ||
|      groups
 | ||
| 
 | ||
|   <20>  Password aging and expiration
 | ||
| 
 | ||
|   <20>  Account expiration and locking
 | ||
| 
 | ||
|   <20>  Shadowed group passwords (optional)
 | ||
| 
 | ||
|   <20>  Double length passwords (16 character passwords) NOT RECOMMENDED
 | ||
| 
 | ||
|   <20>  Better control over user's password selection
 | ||
| 
 | ||
|   <20>  Dial-up passwords
 | ||
| 
 | ||
|   <20>  Secondary authentication programs NOT RECOMMENDED
 | ||
| 
 | ||
|   Installing the Shadow Suite contributes toward a more secure system,
 | ||
|   but there are many other things that can also be done to improve the
 | ||
|   security of a Linux system, and there will eventually be a series of
 | ||
|   Linux Security HOWTO's that will discuss other security measures and
 | ||
|   related issues.
 | ||
| 
 | ||
|   For current information on other Linux security issues, including
 | ||
|   warnings on known vulnerabilities see the Linux Security home page.
 | ||
|   <http://bach.cis.temple.edu/linux/linux-security/>
 | ||
| 
 | ||
|   2.1.  Why you might NOT want to shadow your passwd file.
 | ||
| 
 | ||
|   There are a few circumstances and configurations in which installing
 | ||
|   the Shadow Suite would NOT be a good idea:
 | ||
| 
 | ||
|   <20>  The machine does not contain user accounts.
 | ||
| 
 | ||
|   <20>  Your machine is running on a LAN and is using NIS (Network
 | ||
|      Information Services) to get or supply user names and passwords to
 | ||
|      other machines on the network.  (This can actually be done, but is
 | ||
|      beyond the scope of this document, and really won't increase
 | ||
|      security much anyway)
 | ||
| 
 | ||
|   <20>  Your machine is being used by terminal servers to verify users via
 | ||
|      NFS (Network File System), NIS, or some other method.
 | ||
| 
 | ||
|   <20>  Your machine runs other software that validates users, and there is
 | ||
|      no shadow version available, and you don't have the source code.
 | ||
| 
 | ||
|   2.2.  Format of the /etc/passwd file
 | ||
| 
 | ||
|   A non-shadowed /etc/passwd file has the following format:
 | ||
| 
 | ||
|        username:passwd:UID:GID:full_name:directory:shell
 | ||
| 
 | ||
|   Where:
 | ||
| 
 | ||
|      username
 | ||
|         The user (login) name
 | ||
| 
 | ||
|      passwd
 | ||
|         The encoded password
 | ||
| 
 | ||
|      UID
 | ||
|         Numerical user ID
 | ||
| 
 | ||
|      GID
 | ||
|         Numerical default group ID
 | ||
| 
 | ||
|      full_name
 | ||
|         The user's full name - Actually this field is called the GECOS
 | ||
|         (General Electric Comprehensive Operating System) field and can
 | ||
|         store information other than just the full name.  The Shadow
 | ||
|         commands and manual pages refer to this field as the comment
 | ||
|         field.
 | ||
| 
 | ||
|      directory
 | ||
|         User's home directory (Full pathname)
 | ||
| 
 | ||
|      shell
 | ||
|         User's login shell (Full Pathname)
 | ||
| 
 | ||
|   For example:
 | ||
| 
 | ||
|        username:Npge08pfz4wuk:503:100:Full Name:/home/username:/bin/sh
 | ||
| 
 | ||
|   Where Np is the salt and ge08pfz4wuk is the encoded password.  The
 | ||
|   encoded salt/password could just as easily have been kbeMVnZM0oL7I and
 | ||
|   the two are exactly the same password.  There are 4096 possible encod<6F>
 | ||
|   ings for the same password.  (The example password in this case is
 | ||
|   'password', a really bad password).
 | ||
| 
 | ||
|   Once the shadow suite is installed, the /etc/passwd file would instead
 | ||
|   contain:
 | ||
| 
 | ||
|        username:x:503:100:Full Name:/home/username:/bin/sh
 | ||
| 
 | ||
|   The x in the second field in this case is now just a place holder.
 | ||
|   The format of the /etc/passwd file really didn't change, it just no
 | ||
|   longer contains the encoded password.  This means that any program
 | ||
|   that reads the /etc/passwd file but does not actually need to verify
 | ||
|   passwords will still operate correctly.
 | ||
| 
 | ||
|   The passwords are now relocated to the shadow file (usually
 | ||
|   /etc/shadow file).
 | ||
| 
 | ||
|   2.3.  Format of the shadow file
 | ||
| 
 | ||
|   The /etc/shadow file contains the following information:
 | ||
| 
 | ||
|        username:passwd:last:may:must:warn:expire:disable:reserved
 | ||
| 
 | ||
|   Where:
 | ||
| 
 | ||
|      username
 | ||
|         The User Name
 | ||
| 
 | ||
|      passwd
 | ||
|         The Encoded password
 | ||
|      last
 | ||
|         Days since Jan 1, 1970 that password was last changed
 | ||
| 
 | ||
|      may
 | ||
|         Days before password may be changed
 | ||
| 
 | ||
|      must
 | ||
|         Days after which password must be changed
 | ||
| 
 | ||
|      warn
 | ||
|         Days before password is to expire that user is warned
 | ||
| 
 | ||
|      expire
 | ||
|         Days after password expires that account is disabled
 | ||
| 
 | ||
|      disable
 | ||
|         Days since Jan 1, 1970 that account is disabled
 | ||
| 
 | ||
|      reserved
 | ||
|         A reserved field
 | ||
| 
 | ||
|   The previous example might then be:
 | ||
| 
 | ||
|        username:Npge08pfz4wuk:9479:0:10000::::
 | ||
| 
 | ||
|   2.4.  Review of crypt(3).
 | ||
| 
 | ||
|   From the crypt(3) manual page:
 | ||
| 
 | ||
|   "crypt is the password encryption function.  It is based on the Data
 | ||
|   Encryption Standard algorithm with variations intended (among other
 | ||
|   things) to discourage use of hardware implementations of a key search.
 | ||
| 
 | ||
|   The key is a user's typed password.  The encoded string is all NULLs
 | ||
| 
 | ||
|   The salt is a two-character string chosen from the set a-zA-Z0-9./.
 | ||
|   This string is used to perturb the algorithm in one of 4096 different
 | ||
|   ways.
 | ||
| 
 | ||
|   By taking the lowest 7 bits of each character of the key, a 56-bit key
 | ||
|   is obtained.  This 56-bit key is used to encrypt repeatedly a constant
 | ||
|   string (usually a string consisting of all zeros).  The returned value
 | ||
|   points to the encrypted password, a series of 13 printable ASCII
 | ||
|   characters (the first two characters represent the salt itself).  The
 | ||
|   return value points to static data whose content is overwritten by
 | ||
|   each call.
 | ||
| 
 | ||
|   Warning: The key space consists of 2**56 equal 7.2e16 possible values.
 | ||
|   Exhaustive searches of this key space are possible using massively
 | ||
|   parallel computers.  Software, such as crack(1), is available which
 | ||
|   will search the portion of this key space that is generally used by
 | ||
|   humans for passwords.  Hence, password selection should, at minimum,
 | ||
|   avoid common words and names.  The use of a passwd(1) program that
 | ||
|   checks for crackable passwords during the selection process is
 | ||
|   recommended.
 | ||
| 
 | ||
|   The DES algorithm itself has a few quirks which make the use of the
 | ||
|   crypt(3) interface a very poor choice for anything other than password
 | ||
|   authentication.  If you are planning on using the crypt(3) interface
 | ||
|   for a cryptography project, don't do it: get a good book on encryption
 | ||
|   and one of the widely available DES libraries."
 | ||
| 
 | ||
|   Most Shadow Suites contain code for doubling the length of the
 | ||
|   password to 16 characters.  Experts in des recommend against this, as
 | ||
|   the encoding is simply applied first to the left half and then to the
 | ||
|   right half of the longer password.  Because of the way crypt works,
 | ||
|   this may make for a less secure encoded password then if double length
 | ||
|   passwords were not used in the first place.  Additionally, it is less
 | ||
|   likely that a user will be able to remember a 16 character password.
 | ||
| 
 | ||
|   There is development work under way that would allow the
 | ||
|   authentication algorithm to be replaced with something more secure and
 | ||
|   with support for longer passwords (specifically the MD5 algorithm) and
 | ||
|   retain compatibility with the crypt method.
 | ||
| 
 | ||
|   If you are looking for a good book on encryption, I recommend:
 | ||
| 
 | ||
|           "Applied Cryptography: Protocols, Algorithms, and Source Code in C"
 | ||
|           by Bruce Schneier <schneier@chinet.com>
 | ||
|           ISBN: 0-471-59756-2
 | ||
| 
 | ||
|   3.  Getting the Shadow Suite.
 | ||
| 
 | ||
|   3.1.  History of the Shadow Suite for Linux
 | ||
| 
 | ||
|   DO NOT USE THE PACKAGES IN THIS SECTION, THEY HAVE SECURITY PROBLEMS
 | ||
| 
 | ||
|   The original Shadow Suite was written by Julianne F. Haugh
 | ||
| 
 | ||
|   There are several versions that have been used on Linux systems:
 | ||
| 
 | ||
|   <20>  shadow-3.3.1 is the original.
 | ||
| 
 | ||
|   <20>  shadow-3.3.1-2 is Linux specific patch made by Florian La Roche
 | ||
|      <flla@stud.uni-sb.de> and contains some further enhancements.
 | ||
| 
 | ||
|   <20>  shadow-mk was specifically packaged for Linux.
 | ||
| 
 | ||
|   The shadow-mk package contains the shadow-3.3.1 package distributed by
 | ||
|   Julianne F. Haugh with the shadow-3.3.1-2 patch installed, a few fixes
 | ||
|   made by Mohan Kokal <magnus@texas.net> that make installation a lot
 | ||
|   easier, a patch by Joseph R.M. Zbiciak for login1.c (login.secure)
 | ||
|   that eliminates the -f, -h security holes in /bin/login, and some
 | ||
|   other miscellaneous patches.
 | ||
| 
 | ||
|   The shadow.mk package was the previously recommended package, but
 | ||
|   should be replaced due to a security problem with the login program.
 | ||
| 
 | ||
|   There are security problems with Shadow versions 3.3.1, 3.3.1-2, and
 | ||
|   shadow-mk involving the login program.  This login bug involves not
 | ||
|   checking the length of a login name.  This causes the buffer to
 | ||
|   overflow causing crashes or worse.  It has been rumored that this
 | ||
|   buffer overflow can allow someone with an account on the system to use
 | ||
|   this bug and the shared libraries to gain root access.  I won't
 | ||
|   discuss exactly how this is possible because there are a lot of Linux
 | ||
|   systems that are affected, but systems with these Shadow Suites
 | ||
|   installed, and most pre-ELF distributions without the Shadow Suite are
 | ||
|   vulnerable!
 | ||
| 
 | ||
|   For more information on this and other Linux security issues, see the
 | ||
|   Linux Security home page (Shared Libraries and login Program
 | ||
|   Vulnerability) <http://bach.cis.temple.edu/linux/linux-security/Linux-
 | ||
|   Security-FAQ/Linux-telnetd.html>
 | ||
| 
 | ||
|   3.2.  Where to get the Shadow Suite.
 | ||
| 
 | ||
|   The only recommended Shadow Suite is still in BETA testing, however
 | ||
|   the latest versions are safe in a production environment and don't
 | ||
|   contain a vulnerable login program.
 | ||
| 
 | ||
|   The package uses the following naming convention:
 | ||
| 
 | ||
|        shadow-YYMMDD.tar.gz
 | ||
| 
 | ||
|   where YYMMDD is the issue date of the Suite.
 | ||
| 
 | ||
|   This version will eventually be Version 3.3.3 when it is released from
 | ||
|   Beta testing, and is maintained by Marek Michalkiewicz
 | ||
|   <marekm@i17linuxb.ists.pwr.wroc.pl>.  It's available as: shadow-
 | ||
|   current.tar.gz
 | ||
|   <ftp://i17linuxb.ists.pwr.wroc.pl/pub/linux/shadow/shadow-
 | ||
|   current.tar.gz>.
 | ||
| 
 | ||
|   The following mirror sites have also been established:
 | ||
| 
 | ||
|   <20>  ftp://ftp.icm.edu.pl/pub/Linux/shadow/shadow-current.tar.gz
 | ||
| 
 | ||
|   <20>  ftp://iguana.hut.fi/pub/linux/shadow/shadow-current.tar.gz
 | ||
| 
 | ||
|   <20>  ftp://ftp.cin.net/usr/ggallag/shadow/shadow-current.tar.gz
 | ||
| 
 | ||
|   <20>  ftp://ftp.netural.com/pub/linux/shadow/shadow-current.tar.gz
 | ||
| 
 | ||
|   You should use the currently available version.
 | ||
| 
 | ||
|   You should NOT use a version older than shadow-960129 as they also
 | ||
|   have the login security problem discussed above.
 | ||
| 
 | ||
|   When this document refers to the Shadow Suite I am referring to the
 | ||
|   this package.  It is assumed that this is the package that you are
 | ||
|   using.
 | ||
| 
 | ||
|   For reference, I used shadow-960129 to make these installation
 | ||
|   instructions.
 | ||
| 
 | ||
|   If you were previously using shadow-mk, you should upgrade to this
 | ||
|   version and rebuild everything that you originally compiled.
 | ||
| 
 | ||
|   3.3.  What is included with the Shadow Suite.
 | ||
| 
 | ||
|   The Shadow Suite contains replacement programs for:
 | ||
| 
 | ||
|   su, login, passwd, newgrp, chfn, chsh, and id
 | ||
| 
 | ||
|   The package also contains the new programs:
 | ||
| 
 | ||
|   chage, newusers, dpasswd, gpasswd, useradd, userdel, usermod,
 | ||
|   groupadd, groupdel, groupmod, groups, pwck, grpck, lastlog, pwconv,
 | ||
|   and pwunconv
 | ||
| 
 | ||
|   Additionally, the library: libshadow.a is included for writing and/or
 | ||
|   compiling programs that need to access user passwords.
 | ||
| 
 | ||
|   Also, manual pages for the programs are also included.
 | ||
| 
 | ||
|   There is also a configuration file for the login program which will be
 | ||
|   installed as /etc/login.defs.
 | ||
| 
 | ||
|   4.  Compiling the programs.
 | ||
| 
 | ||
|   4.1.  Unpacking the archive.
 | ||
| 
 | ||
|   The first step after retrieving the package is unpacking it.  The
 | ||
|   package is in the tar (tape archive) format and compressed using gzip,
 | ||
|   so first move it to /usr/src, then type:
 | ||
| 
 | ||
|        tar -xzvf shadow-current.tar.gz
 | ||
| 
 | ||
|   This will unpack it into the directory: /usr/src/shadow-YYMMDD
 | ||
| 
 | ||
|   4.2.  Configuring with the config.h file
 | ||
| 
 | ||
|   The first thing that you need to do is to copy over the Makefile and
 | ||
|   the config.h file:
 | ||
| 
 | ||
|        cd /usr/src/shadow-YYMMDD
 | ||
|        cp Makefile.linux Makefile
 | ||
|        cp config.h.linux config.h
 | ||
| 
 | ||
|   You should then take a look at the config.h file.  This file contains
 | ||
|   definitions for some of the configuration options.  If you are using
 | ||
|   the recommended package, I recommend that you disable group shadow
 | ||
|   support for your first time around.
 | ||
| 
 | ||
|   By default shadowed group passwords are enabled.  To disable these
 | ||
|   edit the config.h file, and change the #define SHADOWGRP to #undef
 | ||
|   SHADOWGRP. I recommend that you disable them to start with, and then
 | ||
|   if you really want group passwords and group administrators that you
 | ||
|   enable it later and recompile.  If you leave it enabled, you must
 | ||
|   create the file /etc/gshadow.
 | ||
| 
 | ||
|   Enabling the long passwords option is NOT recommended as discussed
 | ||
|   above.
 | ||
| 
 | ||
|   Do NOT change the setting: #undef AUTOSHADOW
 | ||
| 
 | ||
|   The AUTOSHADOW option was originally designed so that programs that
 | ||
|   were shadow ignorant would still function.  This sounds good in
 | ||
|   theory, but does not work correctly.  If you enable this option, and
 | ||
|   the program runs as root, it may call getpwnam() as root, and later
 | ||
|   write the modified entry back to the /etc/passwd file (with the no-
 | ||
|   longer-shadowed password).  Such programs include chfn and chsh.  (You
 | ||
|   can't get around this by swapping real and effective uid before
 | ||
|   calling getpwnam() because root may use chfn and chsh too.)
 | ||
| 
 | ||
|   The same warning is also valid if you are building libc, it has a
 | ||
|   SHADOW_COMPAT option which does the same thing.  It should NOT be
 | ||
|   used!  If you start getting encoded passwords back in your /etc/passwd
 | ||
|   file, this is the problem.
 | ||
| 
 | ||
|   If you are using a libc version prior to 4.6.27, you will need to make
 | ||
|   a couple more changes to config.h and the Makefile.  To config.h edit
 | ||
|   and change:
 | ||
| 
 | ||
|        #define HAVE_BASENAME
 | ||
| 
 | ||
|   to:
 | ||
| 
 | ||
|        #undef HAVE_BASENAME
 | ||
| 
 | ||
|   And then in the Makefile, change:
 | ||
| 
 | ||
|        SOBJS = smain.o env.o entry.o susetup.o shell.o \
 | ||
|                sub.o mail.o motd.o sulog.o age.o tz.o hushed.o
 | ||
| 
 | ||
|        SSRCS = smain.c env.c entry.c setup.c shell.c \
 | ||
|                pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \
 | ||
|                tz.c hushed.c
 | ||
| 
 | ||
|        SOBJS = smain.o env.o entry.o susetup.o shell.o \
 | ||
|                sub.o mail.o motd.o sulog.o age.o tz.o hushed.o basename.o
 | ||
| 
 | ||
|        SSRCS = smain.c env.c entry.c setup.c shell.c \
 | ||
|                pwent.c sub.c mail.c motd.c sulog.c shadow.c age.c pwpack.c rad64.c \
 | ||
|                tz.c hushed.c basename.c
 | ||
| 
 | ||
|   These changes add the code contained in basename.c which is contained
 | ||
|   in libc 4.6.27 and later.
 | ||
| 
 | ||
|   4.3.  Making backup copies of your original programs.
 | ||
| 
 | ||
|   It would also be a good idea to track down and make backup copies of
 | ||
|   the programs that the shadow suite will replace.  On a Slackware 3.0
 | ||
|   system these are:
 | ||
| 
 | ||
|   <20>  /bin/su
 | ||
| 
 | ||
|   <20>  /bin/login
 | ||
| 
 | ||
|   <20>  /usr/bin/passwd
 | ||
| 
 | ||
|   <20>  /usr/bin/newgrp
 | ||
| 
 | ||
|   <20>  /usr/bin/chfn
 | ||
| 
 | ||
|   <20>  /usr/bin/chsh
 | ||
| 
 | ||
|   <20>  /usr/bin/id
 | ||
| 
 | ||
|   The BETA package has a save target in the Makefile, but it's commented
 | ||
|   out because different distributions place the programs in different
 | ||
|   places.
 | ||
| 
 | ||
|   You should also make a backup copy of your /etc/passwd file, but be
 | ||
|   careful to name it something else if you place it in the same
 | ||
|   directory so you don't overwrite the passwd command.
 | ||
| 
 | ||
|   4.4.  Running make
 | ||
| 
 | ||
|   You need to be logged as root to do most of the installation.
 | ||
| 
 | ||
|   Run make to compile the executables in the package:
 | ||
| 
 | ||
|        make all
 | ||
| 
 | ||
|   You may see the warning: rcsid defined but not used.  This is fine, it
 | ||
|   just happens because the author is using a version control package.
 | ||
| 
 | ||
|   5.  Installing
 | ||
| 
 | ||
|   5.1.  Have a boot disk handy in case you break anything.
 | ||
| 
 | ||
|   If something goes terribly wrong, it would be handy to have a boot
 | ||
|   disk.  If you have a boot/root combination from your installation,
 | ||
|   that will work, otherwise see the Bootdisk-HOWTO
 | ||
|   <http://sunsite.unc.edu/mdw/HOWTO/Bootdisk-HOWTO.html>, which
 | ||
|   describes how to make a bootable disk.
 | ||
| 
 | ||
|   5.2.  Removing duplicate man pages
 | ||
| 
 | ||
|   You should also move the manual pages that are about to be replaced.
 | ||
|   Even if you are brave enough install the Shadow Suite without making
 | ||
|   backups, you will still want to remove the old manual pages.  The new
 | ||
|   manual pages won't normally overwrite the old ones because the old
 | ||
|   ones are probably compressed.
 | ||
| 
 | ||
|   You can use a combination of: man -aW command and locate command to
 | ||
|   locate the manual pages that need to be (re)moved.  It's generally
 | ||
|   easier to figure out which are the older pages before you run make
 | ||
|   install.
 | ||
| 
 | ||
|   If you are using the Slackware 3.0 distribution, then the manual pages
 | ||
|   you want to remove are:
 | ||
| 
 | ||
|   <20>  /usr/man/man1/chfn.1.gz
 | ||
| 
 | ||
|   <20>  /usr/man/man1/chsh.1.gz
 | ||
| 
 | ||
|   <20>  /usr/man/man1/id.1.gz
 | ||
| 
 | ||
|   <20>  /usr/man/man1/login.1.gz
 | ||
| 
 | ||
|   <20>  /usr/man/man1/passwd.1.gz
 | ||
| 
 | ||
|   <20>  /usr/man/man1/su.1.gz
 | ||
| 
 | ||
|   <20>  /usr/man/man5/passwd.5.gz
 | ||
| 
 | ||
|   There may also be man pages of the same name in the /var/man/cat[1-9]
 | ||
|   subdirectories that should also be deleted.
 | ||
| 
 | ||
|   5.3.  Running make install
 | ||
| 
 | ||
|   You are now ready to type: (do this as root)
 | ||
| 
 | ||
|        make install
 | ||
| 
 | ||
|   This will install the new and replacement programs and fix-up the file
 | ||
|   permissions.  It will also install the man pages.
 | ||
| 
 | ||
|   This also takes care of installing the Shadow Suite include files in
 | ||
|   the correct places in /usr/include/shadow.
 | ||
| 
 | ||
|   Using the BETA package you must manually copy the file login.defs to
 | ||
|   the /etc subdirectory and make sure that only root can make changes to
 | ||
|   it.
 | ||
| 
 | ||
|        cp login.defs /etc
 | ||
|        chmod 700 /etc/login.defs
 | ||
| 
 | ||
|   This file is the configuration file for the login program.  You should
 | ||
|   review and make changes to this file for your particular system.  This
 | ||
|   is where you decide which tty's root can login from, and set other
 | ||
|   security policy settings (like password expiration defaults).
 | ||
| 
 | ||
|   5.4.  Running pwconv
 | ||
| 
 | ||
|   The next step is to run pwconv.  This must also be done as root, and
 | ||
|   is best done from the /etc subdirectory:
 | ||
| 
 | ||
|        cd /etc
 | ||
|        /usr/sbin/pwconv
 | ||
| 
 | ||
|   pwconv takes your /etc/passwd file and strips out the fields to create
 | ||
|   two files: /etc/npasswd and /etc/nshadow.
 | ||
| 
 | ||
|   A pwunconv program is also provided if you need to make a normal
 | ||
|   /etc/passwd file out of an /etc/passwd and /etc/shadow combination.
 | ||
| 
 | ||
|   5.5.  Renaming npasswd and nshadow
 | ||
| 
 | ||
|   Now that you have run pwconv you have created the files /etc/npasswd
 | ||
|   and /etc/nshadow.  These need to be copied over to /etc/passwd and
 | ||
|   /etc/shadow.  We also want to make a backup copy of the original
 | ||
|   /etc/passwd file, and make sure only root can read it.  We'll put the
 | ||
|   backup in root's home directory:
 | ||
| 
 | ||
|        cd /etc
 | ||
|        cp passwd ~passwd
 | ||
|        chmod 600 ~passwd
 | ||
|        mv npasswd passwd
 | ||
|        mv nshadow shadow
 | ||
| 
 | ||
|   You should also ensure that the file ownerships and permissions are
 | ||
|   correct.  If you are going to be using X-Windows, the xlock and xdm
 | ||
|   programs need to be able to read the shadow file (but not write it).
 | ||
| 
 | ||
|   There are two ways that this can be done.  You can set xlock to suid
 | ||
|   root (xdm is usually run as root anyway).  Or you can make the shadow
 | ||
|   file owned by root with a group of shadow, but before you do this,
 | ||
|   make sure that you have a shadow group (look in /etc/group).  None of
 | ||
|   the users on the system should actually be in the shadow group.
 | ||
| 
 | ||
|        chown root.root passwd
 | ||
|        chown root.shadow shadow
 | ||
|        chmod 0644 passwd
 | ||
|        chmod 0640 shadow
 | ||
| 
 | ||
|   Your system now has the password file shadowed.  You should now pop
 | ||
|   over to another virtual terminal and verify that you can login.
 | ||
| 
 | ||
|   Really, do this now!
 | ||
| 
 | ||
|   If you can't, then something is wrong!  To get back to a non-shadowed
 | ||
|   state, do the following the following:
 | ||
| 
 | ||
|        cd /etc
 | ||
|        cp ~passwd passwd
 | ||
|        chmod 644 passwd
 | ||
| 
 | ||
|   You would then restore the files that you saved earlier to their
 | ||
|   proper locations.
 | ||
| 
 | ||
|   6.  Other programs you may need to upgrade or patch
 | ||
| 
 | ||
|   Even though the shadow suite contains replacement programs for most
 | ||
|   programs that need to access passwords, there are a few additional
 | ||
|   programs on most systems that require access to passwords.
 | ||
| 
 | ||
|   If you are running a Debian Distribution (or even if you are not), you
 | ||
|   can obtain Debian sources for the programs that need to be rebuild
 | ||
|   from: ftp://ftp.debian.org/debian/stable/source/
 | ||
| 
 | ||
|   The remainder of this section discusses how to upgrade adduser,
 | ||
|   wu_ftpd, ftpd, pop3d, xlock, xdm and sudo so that they support the
 | ||
|   shadow suite.
 | ||
| 
 | ||
|   See the section ``Adding Shadow Support to a C program'' for a
 | ||
|   discussion on how to put shadow support into any other program that
 | ||
|   needs it (although the program must then be run SUID root or SGID
 | ||
|   shadow to be able to actually access the shadow file).
 | ||
| 
 | ||
|   6.1.  Slackware adduser program
 | ||
| 
 | ||
|   Slackware distributions (and possibly some others) contain a
 | ||
|   interactive program for adding users called /sbin/adduser.  A shadow
 | ||
|   version of this program can be obtained from
 | ||
|   ftp://sunsite.unc.edu/pub/Linux/
 | ||
|   system/Admin/accounts/adduser.shadow-1.4.tar.gz.
 | ||
| 
 | ||
|   I would encourage you to use the programs that are supplied with the
 | ||
|   Shadow Suite (useradd, usermod, and userdel) instead of the slackware
 | ||
|   adduser program.  They take a little time to learn how to use, but
 | ||
|   it's well worth the effort because you have much more control and they
 | ||
|   perform proper file locking on the /etc/passwd and /etc/shadow file
 | ||
|   (adduser doesn't).
 | ||
| 
 | ||
|   See the section on ``Putting the Shadow Suite to use'' for more
 | ||
|   information.
 | ||
| 
 | ||
|   But if you gotta have it, here is what you do:
 | ||
| 
 | ||
|        tar -xzvf adduser.shadow-1.4.tar.gz
 | ||
|        cd adduser
 | ||
|        make clean
 | ||
|        make adduser
 | ||
|        chmod 700 adduser
 | ||
|        cp adduser /sbin
 | ||
| 
 | ||
|   6.2.  The wu_ftpd Server
 | ||
| 
 | ||
|   Most Linux systems some with the wu_ftpd server.  If your distribution
 | ||
|   does not come with shadow installed, then your wu_ftpd will not be
 | ||
|   compiled for shadow.  wu_ftpd is launched from inetd/tcpd as a root
 | ||
|   process.  If you are running an old wu_ftpd daemon, you will want to
 | ||
|   upgrade it anyway because older ones had a bug that would allow the
 | ||
|   root account to be compromised (For more info see the Linux security
 | ||
|   home page <http://bach.cis.temple.edu/linux/linux-security/Linux-
 | ||
|   Security-FAQ/Linux-wu.ftpd-2.4-Update.html>).
 | ||
| 
 | ||
|   Fortunately, you only need to get the source code and recompile it
 | ||
|   with shadow enabled.
 | ||
| 
 | ||
|   If you are not running an ELF system, The wu_ftp server can be found
 | ||
|   on Sunsite as wu-ftp-2.4-fixed.tar.gz
 | ||
|   <ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/wu-
 | ||
|   ftpd-2.4-fixed.tar.gz>
 | ||
| 
 | ||
|   Once you retrieve the server, put it in /usr/src, then type:
 | ||
| 
 | ||
|   cd /usr/src
 | ||
|   tar -xzvf wu-ftpd-2.4-fixed.tar.gz
 | ||
|   cd wu-ftpd-2.4-fixed
 | ||
|   cp ./src/config/config.lnx.shadow ./src/config/config.lnx
 | ||
| 
 | ||
|   Then edit ./src/makefiles/Makefile.lnx, and change the line:
 | ||
| 
 | ||
|        LIBES    = -lbsd -support
 | ||
| 
 | ||
|   to:
 | ||
| 
 | ||
|        LIBES    = -lbsd -support -lshadow
 | ||
| 
 | ||
|   Now you are ready to run the build script and install:
 | ||
| 
 | ||
|        cd /usr/src/wu-ftpd-2.4-fixed
 | ||
|        /usr/src/wu-ftp-2.4.fixed/build lnx
 | ||
|        cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old
 | ||
|        cp ./bin/ftpd /usr/sbin/wu.ftpd
 | ||
| 
 | ||
|   This uses the Linux shadow configuration file, compiles and installs
 | ||
|   the server.
 | ||
| 
 | ||
|   On my Slackware 2.3 system I also had to do the following before
 | ||
|   running build:
 | ||
| 
 | ||
|        cd /usr/include/netinet
 | ||
|        ln -s in_systm.h in_system.h
 | ||
|        cd -
 | ||
| 
 | ||
|   Problems have been reported compiling this package under ELF systems,
 | ||
|   but the Beta version of the next release works fine.  It can be found
 | ||
|   as wu-ftp-2.4.2-beta-10.tar.gz
 | ||
|   <ftp://tscnet.com/pub/linux/network/ftp/wu-ftpd-2.4.2-beta-10.tar.gz>
 | ||
| 
 | ||
|   Once you retrieve the server, put it in /usr/src, then type:
 | ||
| 
 | ||
|        cd /usr/src
 | ||
|        tar -xzvf wu-ftpd-2.4.2-beta-9.tar.gz
 | ||
|        cd wu-ftpd-beta-9
 | ||
|        cd ./src/config
 | ||
| 
 | ||
|   Then edit config.lnx, and change:
 | ||
| 
 | ||
|        #undef SHADOW.PASSWORD
 | ||
| 
 | ||
|   to:
 | ||
| 
 | ||
|        #define SHADOW.PASSWORD
 | ||
| 
 | ||
|   Then,
 | ||
| 
 | ||
|        cd ../Makefiles
 | ||
| 
 | ||
|   and edit the file Makefile.lnx and change:
 | ||
| 
 | ||
|        LIBES = -lsupport -lbsd # -lshadow
 | ||
| 
 | ||
|   to:
 | ||
| 
 | ||
|        LIBES = -lsupport -lbsd -lshadow
 | ||
| 
 | ||
|   Then build and install:
 | ||
| 
 | ||
|        cd ..
 | ||
|        build lnx
 | ||
|        cp /usr/sbin/wu.ftpd /usr/sbin/wu.ftpd.old
 | ||
|        cp ./bin/ftpd /usr/sbin/wu.ftpd
 | ||
| 
 | ||
|   Note that you should check your /etc/inetd.conf file to make sure that
 | ||
|   this is where your wu.ftpd server really lives.  It has been reported
 | ||
|   that some distributions place the server daemons in different places,
 | ||
|   and then wu.ftpd in particular may be named something else.
 | ||
| 
 | ||
|   6.3.  Standard ftpd
 | ||
| 
 | ||
|   If you are running the standard ftpd server, I would recommend that
 | ||
|   you upgrade to the wu_ftpd server.  Aside from the known bug discussed
 | ||
|   above, it's generally thought to be more secure.
 | ||
| 
 | ||
|   If you insist on the standard one, or you need NIS support, Sunsite
 | ||
|   has ftpd-shadow-nis.tgz
 | ||
|   <ftp://sunsite.unc.edu/pub/Linux/system/Network/file-transfer/ftpd-
 | ||
|   shadow-nis.tgz>
 | ||
| 
 | ||
|   6.4.  pop3d (Post Office Protocol 3)
 | ||
| 
 | ||
|   If you need to support the third Post Office Protocol (POP3), you will
 | ||
|   need to recompile a pop3d program.  pop3d is normally run by
 | ||
|   inetd/tcpd as root.
 | ||
| 
 | ||
|   There are two versions available from Sunsite:
 | ||
|   pop3d-1.00.4.linux.shadow.tar.gz
 | ||
|   <ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/pop3d-1.00.4.linux.shadow.tar.gz>
 | ||
|   and pop3d+shadow+elf.tar.gz
 | ||
|   <ftp://sunsite.unc.edu/pub/Linux/system/Mail/pop/pop3d+shadow+elf.tar.gz>
 | ||
| 
 | ||
|   Both of these are fairly straight forward to install.
 | ||
| 
 | ||
|   6.5.  xlock
 | ||
| 
 | ||
|   If you install the shadow suite, and then run X Windows System and
 | ||
|   lock the screen without upgrading your xlock, you will have to use
 | ||
|   CNTL-ALT-Fx to switch to another tty, login, and kill the xlock
 | ||
|   process (or use CNTL-ALT-BS to kill the X server).  Fortunately it's
 | ||
|   fairly easy to upgrade your xlock program.
 | ||
| 
 | ||
|   If you are running XFree86 Versions 3.x.x, you are probably using
 | ||
|   xlockmore (which is a great screen-saver in addition to a lock).  This
 | ||
|   package supports shadow with a recompile.  If you have an older xlock,
 | ||
|   I recommend that you upgrade to this one.
 | ||
| 
 | ||
|   xlockmore-3.5.tgz is available at:
 | ||
|   <ftp://sunsite.unc.edu/pub/Linux/X11/xutils/screensavers/xlockmore-3.7.tgz>
 | ||
| 
 | ||
|   Basically, this is what you need to do:
 | ||
| 
 | ||
|   Get the xlockmore-3.7.tgz file and put it in /usr/src unpack it:
 | ||
| 
 | ||
|        tar -xzvf xlockmore-3.7.tgz
 | ||
| 
 | ||
|   Edit the file: /usr/X11R6/lib/X11/config/linux.cf, and change the
 | ||
|   line:
 | ||
| 
 | ||
|        #define HasShadowPasswd    NO
 | ||
| 
 | ||
|        to
 | ||
| 
 | ||
|        #define HasShadowPasswd    YES
 | ||
| 
 | ||
|   Then build the executables:
 | ||
| 
 | ||
|        cd /usr/src/xlockmore
 | ||
|        xmkmf
 | ||
|        make depend
 | ||
|        make
 | ||
| 
 | ||
|   Then move everything into place and update file ownerships and
 | ||
|   permissions:
 | ||
| 
 | ||
|        cp xlock /usr/X11R6/bin/
 | ||
|        cp XLock /var/X11R6/lib/app-defaults/
 | ||
|        chown root.shadow /usr/X11R6/bin/xlock
 | ||
|        chmod 2755 /usr/X11R6/bin/xlock
 | ||
|        chown root.shadow /etc/shadow
 | ||
|        chmod 640 /etc/shadow
 | ||
| 
 | ||
|   Your xlock will now work correctly.
 | ||
| 
 | ||
|   6.6.  xdm
 | ||
| 
 | ||
|   xdm is a program that presents a login screen for X-Windows.  Some
 | ||
|   systems start xdm when the system is told to goto a specified run
 | ||
|   level (see /etc/inittab.
 | ||
| 
 | ||
|   With the Shadow Suite install, xdm will need to be updated.
 | ||
|   Fortunately it's fairly easy to upgrade your xdm program.
 | ||
| 
 | ||
|   xdm.tar.gz is available at:
 | ||
|   <ftp://sunsite.unc.edu/pub/Linux/X11/xutils/xdm.tar.gz>
 | ||
| 
 | ||
|   Get the xdm.tar.gz file and put it in /usr/src, then to unpack it:
 | ||
| 
 | ||
|        tar -xzvf xdm.tar.gz
 | ||
| 
 | ||
|   Edit the file: /usr/X11R6/lib/X11/config/linux.cf, and change the
 | ||
|   line:
 | ||
| 
 | ||
|        #define HasShadowPasswd    NO
 | ||
| 
 | ||
|        to
 | ||
| 
 | ||
|        #define HasShadowPasswd    YES
 | ||
| 
 | ||
|   Then build the executables:
 | ||
| 
 | ||
|        cd /usr/src/xdm
 | ||
|        xmkmf
 | ||
|        make depend
 | ||
|        make
 | ||
| 
 | ||
|   Then move everything into place:
 | ||
| 
 | ||
|   cp xdm /usr/X11R6/bin/
 | ||
| 
 | ||
|   xdm is run as root so you don't need to change it file permissions.
 | ||
| 
 | ||
|   6.7.  sudo
 | ||
| 
 | ||
|   The program sudo allows a system administrator to let users run
 | ||
|   programs that would normally require root access.  This is handy
 | ||
|   because it lets the administrator limit access to the root account
 | ||
|   itself while still allowing users to do things like mounting drives.
 | ||
| 
 | ||
|   sudo needs to read passwords because it verifies the users password
 | ||
|   when it's invoked.  sudo already runs SUID root, so accessing the
 | ||
|   /etc/shadow file is not a problem.
 | ||
| 
 | ||
|   sudo for the shadow suite, is available as at:
 | ||
|   <ftp://sunsite.unc.edu/pub/Linux/system/Admin/sudo-1.2-shadow.tgz>
 | ||
| 
 | ||
|   Warning: When you install sudo your /etc/sudoers file will be replaced
 | ||
|   with a default one, so you need to make a backup of it if you have
 | ||
|   added anything to the default one.  (you could also edit the Makefile
 | ||
|   and remove the line that copies the default file to /etc).
 | ||
| 
 | ||
|   The package is already setup for shadow, so all that's required is to
 | ||
|   recompile the package (put it in /usr/src):
 | ||
| 
 | ||
|        cd /usr/src
 | ||
|        tar -xzvf sudo-1.2-shadow.tgz
 | ||
|        cd sudo-1.2-shadow
 | ||
|        make all
 | ||
|        make install
 | ||
| 
 | ||
|   6.8.  imapd (E-Mail pine package)
 | ||
| 
 | ||
|   imapd is an e-mail server similar to pop3d.  imapd comes with the Pine
 | ||
|   E-mail package.  The documentation that comes with the package states
 | ||
|   that the default for Linux systems is to include support for shadow.
 | ||
|   However, I have found that this is not true.  Furthermore, the build
 | ||
|   script / Makefile combination on this package is makes it very
 | ||
|   difficult to add the libshadow.a library at compile time, so I was
 | ||
|   unable to add shadow support for imapd.
 | ||
| 
 | ||
|   If anyone has this figured out, please E-mail me, and I'll include the
 | ||
|   solution here.
 | ||
| 
 | ||
|   6.9.  pppd (Point-to-Point Protocol Server)
 | ||
| 
 | ||
|   The pppd server can be setup to use several types of authentication:
 | ||
|   Password Authentication Protocol (PAP) and Cryptographic Handshake
 | ||
|   Authentication Protocol (CHAP).  The pppd server usually reads the
 | ||
|   password strings that it uses from /etc/ppp/chap-secrets and/or
 | ||
|   /etc/ppp/pap-secrets.  If you are using this default behavior of pppd,
 | ||
|   it is not necessary to reinstall pppd.
 | ||
| 
 | ||
|   pppd also allows you to use the login parameter (either on the command
 | ||
|   line, or in the configuration or options file).  If the login option
 | ||
|   is given, then pppd will use the /etc/passwd file for the username and
 | ||
|   passwords for the PAP.  This, of course, will no longer work now that
 | ||
|   our password file is shadowed.  For pppd-1.2.1d this requires adding
 | ||
|   code for shadow support.
 | ||
| 
 | ||
|   The example given in the next section is adding shadow support to
 | ||
|   pppd-1.2.1d (an older version of pppd).
 | ||
| 
 | ||
|   pppd-2.2.0 already contains shadow support.
 | ||
| 
 | ||
|   7.  Putting the Shadow Suite to use.
 | ||
| 
 | ||
|   This section discusses some of the things that you will want to know
 | ||
|   now that you have the Shadow Suite installed on your system.  More
 | ||
|   information is contained in the manual pages for each command.
 | ||
| 
 | ||
|   7.1.  Adding, Modifying, and deleting users
 | ||
| 
 | ||
|   The Shadow Suite added the following command line oriented commands
 | ||
|   for adding, modifying, and deleting users.  You may also have
 | ||
|   installed the adduser program.
 | ||
| 
 | ||
|   7.1.1.  useradd
 | ||
| 
 | ||
|   The useradd command can be used to add users to the system.  You also
 | ||
|   invoke this command to change the default settings.
 | ||
| 
 | ||
|   The first thing that you should do is to examine the default settings
 | ||
|   and make changes specific to your system:
 | ||
| 
 | ||
|        useradd -D
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   GROUP=1
 | ||
|   HOME=/home
 | ||
|   INACTIVE=0
 | ||
|   EXPIRE=0
 | ||
|   SHELL=
 | ||
|   SKEL=/etc/skel
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   The defaults are probably not what you want, so if you started adding
 | ||
|   users now you would have to specify all the information for each user.
 | ||
|   However, we can and should change the default values.
 | ||
| 
 | ||
|   On my system:
 | ||
| 
 | ||
|   <20>  I want the default group to be 100
 | ||
| 
 | ||
|   <20>  I want passwords to expire every 60 days
 | ||
| 
 | ||
|   <20>  I don't want to lock an account because the password is expired
 | ||
| 
 | ||
|   <20>  I want to default shell to be /bin/bash
 | ||
| 
 | ||
|      To make these changes I would use:
 | ||
| 
 | ||
|        useradd -D -g100 -e60 -f0 -s/bin/bash
 | ||
| 
 | ||
|   Now running useradd -D will give:
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   GROUP=100
 | ||
|   HOME=/home
 | ||
|   INACTIVE=0
 | ||
|   EXPIRE=60
 | ||
|   SHELL=/bin/bash
 | ||
|   SKEL=/etc/skel
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   Just in case you wanted to know, these defaults are stored in the file
 | ||
|   /etc/default/useradd.
 | ||
| 
 | ||
|   Now you can use useradd to add users to the system.  For example, to
 | ||
|   add the user fred, using the defaults, you would use the following:
 | ||
| 
 | ||
|        useradd -m -c "Fred Flintstone" fred
 | ||
| 
 | ||
|   This will create the following entry in the /etc/passwd file:
 | ||
| 
 | ||
|        fred:*:505:100:Fred Flintstone:/home/fred:/bin/bash
 | ||
| 
 | ||
|   And the following entry in the /etc/shadow file:
 | ||
| 
 | ||
|        fred:!:0:0:60:0:0:0:0
 | ||
| 
 | ||
|   fred's home directory will be created and the contents of /etc/skel
 | ||
|   will be copied there because of the -m switch.
 | ||
| 
 | ||
|   Also, since we did not specify a UID, the next available one was used.
 | ||
| 
 | ||
|   fred's account is created, but fred still won't be able to login until
 | ||
|   we unlock the account.  We do this by changing the password.
 | ||
| 
 | ||
|        passwd fred
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   Changing password for fred
 | ||
|   Enter the new password (minimum of 5 characters)
 | ||
|   Please use a combination of upper and lower case letters and numbers.
 | ||
|   New Password: *******
 | ||
|   Re-enter new password: *******
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   Now the /etc/shadow will contain:
 | ||
| 
 | ||
|        fred:J0C.WDR1amIt6:9559:0:60:0:0:0:0
 | ||
| 
 | ||
|   And fred will now be able to login and use the system.  The nice thing
 | ||
|   about useradd and the other programs that come with the Shadow Suite
 | ||
|   is that they make changes to the /etc/passwd and /etc/shadow files
 | ||
|   atomically.  So if you are adding a user, and another user is changing
 | ||
|   their password at the same time, both operations will be performed
 | ||
|   correctly.
 | ||
| 
 | ||
|   You should use the supplied commands rather than directly editing
 | ||
|   /etc/passwd and /etc/shadow.  If you were editing the /etc/shadow
 | ||
|   file, and a user were to change his password while you are editing,
 | ||
|   and then you were to save the file you were editing, the user's
 | ||
|   password change would be lost.
 | ||
| 
 | ||
|   Here is a small interactive script that adds users using useradd and
 | ||
|   passwd:
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   #!/bin/bash
 | ||
|   #
 | ||
|   # /sbin/newuser - A script to add users to the system using the Shadow
 | ||
|   #                 Suite's useradd and passwd commands.
 | ||
|   #
 | ||
|   # Written my Mike Jackson <mhjack@tscnet.com> as an example for the Linux
 | ||
|   # Shadow Password Howto.  Permission to use and modify is expressly granted.
 | ||
|   #
 | ||
|   # This could be modified to show the defaults and allow modification similar
 | ||
|   # to the Slackware Adduser program.  It could also be modified to disallow
 | ||
|   # stupid entries.  (i.e. better error checking).
 | ||
|   #
 | ||
|   ##
 | ||
|   #  Defaults for the useradd command
 | ||
|   ##
 | ||
|   GROUP=100        # Default Group
 | ||
|   HOME=/home       # Home directory location (/home/username)
 | ||
|   SKEL=/etc/skel   # Skeleton Directory
 | ||
|   INACTIVE=0       # Days after password expires to disable account (0=never)
 | ||
|   EXPIRE=60        # Days that a passwords lasts
 | ||
|   SHELL=/bin/bash  # Default Shell (full path)
 | ||
|   ##
 | ||
|   #  Defaults for the passwd command
 | ||
|   ##
 | ||
|   PASSMIN=0        # Days between password changes
 | ||
|   PASSWARN=14      # Days before password expires that a warning is given
 | ||
|   ##
 | ||
|   #  Ensure that root is running the script.
 | ||
|   ##
 | ||
|   WHOAMI=`/usr/bin/whoami`
 | ||
|   if [ $WHOAMI != "root" ]; then
 | ||
|           echo "You must be root to add news users!"
 | ||
|           exit 1
 | ||
|   fi
 | ||
|   ##
 | ||
|   #  Ask for username and fullname.
 | ||
|   ##
 | ||
|   echo ""
 | ||
|   echo -n "Username: "
 | ||
|   read USERNAME
 | ||
|   echo -n "Full name: "
 | ||
|   read FULLNAME
 | ||
|   #
 | ||
|   echo "Adding user: $USERNAME."
 | ||
|   #
 | ||
|   # Note that the "" around $FULLNAME is required because this field is
 | ||
|   # almost always going to contain at least on space, and without the "'s
 | ||
|   # the useradd command would think that you we moving on to the next
 | ||
|   # parameter when it reached the SPACE character.
 | ||
|   #
 | ||
|   /usr/sbin/useradd -c"$FULLNAME" -d$HOME/$USERNAME -e$EXPIRE \
 | ||
|           -f$INACTIVE -g$GROUP -m -k$SKEL -s$SHELL $USERNAME
 | ||
|   ##
 | ||
|   #  Set password defaults
 | ||
|   ##
 | ||
|   /bin/passwd -n $PASSMIN -w $PASSWARN $USERNAME >/dev/null 2>&1
 | ||
|   ##
 | ||
|   #  Let the passwd command actually ask for password (twice)
 | ||
|   ##
 | ||
|   /bin/passwd $USERNAME
 | ||
|   ##
 | ||
|   #  Show what was done.
 | ||
|   ##
 | ||
|   echo ""
 | ||
|   echo "Entry from /etc/passwd:"
 | ||
|   echo -n "   "
 | ||
|   grep "$USERNAME:" /etc/passwd
 | ||
|   echo "Entry from /etc/shadow:"
 | ||
|   echo -n "   "
 | ||
|   grep "$USERNAME:" /etc/shadow
 | ||
|   echo "Summary output of the passwd command:"
 | ||
|   echo -n "   "
 | ||
|   passwd -S $USERNAME
 | ||
|   echo ""
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   Using a script to add new users is really much more preferable than
 | ||
|   editing the /etc/passwd or /etc/shadow files directly or using a
 | ||
|   program like the Slackware adduser program.  Feel free to use and
 | ||
|   modify this script for your particular system.
 | ||
| 
 | ||
|   For more information on the useradd see the online manual page.
 | ||
| 
 | ||
|   7.1.2.  usermod
 | ||
| 
 | ||
|   The usermod program is used to modify the information on a user.  The
 | ||
|   switches are similar to the useradd program.
 | ||
| 
 | ||
|   Let's say that you want to change fred's shell, you would do the
 | ||
|   following:
 | ||
| 
 | ||
|        usermod -s /bin/tcsh fred
 | ||
| 
 | ||
|   Now fred's /etc/passwd file entry would be change to this:
 | ||
| 
 | ||
|        fred:*:505:100:Fred Flintstone:/home/fred:/bin/tcsh
 | ||
| 
 | ||
|   Let's make fred's account expire on 09/15/97:
 | ||
| 
 | ||
|        usermod -e 09/15/97 fred
 | ||
| 
 | ||
|   Now fred's entry in /etc/shadow becomes:
 | ||
| 
 | ||
|        fred:J0C.WDR1amIt6:9559:0:60:0:0:10119:0
 | ||
| 
 | ||
|   For more information on the usermod command see the online manual
 | ||
|   page.
 | ||
| 
 | ||
|   7.1.3.  userdel
 | ||
| 
 | ||
|   userdel does just what you would expect, it deletes the user's
 | ||
|   account.  You simply use:
 | ||
| 
 | ||
|        userdel -r username
 | ||
| 
 | ||
|   The -r causes all files in the user's home directory to be removed
 | ||
|   along with the home directory itself.  Files located in other file
 | ||
|   system will have to be searched for and deleted manually.
 | ||
| 
 | ||
|   If you want to simply lock the account rather than delete it, use the
 | ||
|   passwd command instead.
 | ||
| 
 | ||
|   7.2.  The passwd command and passwd aging.
 | ||
| 
 | ||
|   The passwd command has the obvious use of changing passwords.
 | ||
|   Additionally, it is used by the root user to:
 | ||
| 
 | ||
|   <20>  Lock and unlock accounts (-l and -u)
 | ||
| 
 | ||
|   <20>  Set the maximum number of days that a password remains valid (-x)
 | ||
| 
 | ||
|   <20>  Set the minimum days between password changes (-n)
 | ||
| 
 | ||
|   <20>  Sets the number of days of warning that a password is about to
 | ||
|      expire (-w)
 | ||
| 
 | ||
|   <20>  Sets the number of days after the password expires before the
 | ||
|      account is locked (-i)
 | ||
| 
 | ||
|   <20>  Allow viewing of account information in a clearer format (-S)
 | ||
| 
 | ||
|   For example, let look again at fred
 | ||
| 
 | ||
|        passwd -S fred
 | ||
|        fred P 03/04/96 0 60 0 0
 | ||
| 
 | ||
|   This means that fred's password is valid, it was last changed on
 | ||
|   03/04/96, it can be changed at any time, it expires after 60 days,
 | ||
|   fred will not be warned, and and the account won't be disabled when
 | ||
|   the password expires.
 | ||
| 
 | ||
|   This simply means that if fred logs in after the password expires, he
 | ||
|   will be prompted for a new password at login.
 | ||
| 
 | ||
|   If we decide that we want to warn fred 14 days before his password
 | ||
|   expires and make his account inactive 14 days after he lets it expire,
 | ||
|   we would need to do the following:
 | ||
| 
 | ||
|        passwd -w14 -i14 fred
 | ||
| 
 | ||
|   Now fred is changed to:
 | ||
|        fred P 03/04/96 0 60 14 14
 | ||
| 
 | ||
|   For more information on the passwd command see the online manual page.
 | ||
| 
 | ||
|   7.3.  The login.defs file.
 | ||
| 
 | ||
|   The file /etc/login is the configuration file for the login program
 | ||
|   and also for the Shadow Suite as a whole.
 | ||
| 
 | ||
|   /etc/login contains settings from what the prompts will look like to
 | ||
|   what the default expiration will be when a user changes his password.
 | ||
| 
 | ||
|   The /etc/login.defs file is quite well documented just by the comments
 | ||
|   that are contained within it.  However, there are a few things to
 | ||
|   note:
 | ||
| 
 | ||
|   <20>  It contains flags that can be turned on or off that determine the
 | ||
|      amount of logging that takes place.
 | ||
| 
 | ||
|   <20>  It contains pointers to other configuration files.
 | ||
| 
 | ||
|   <20>  It contains defaults assignments for things like password aging.
 | ||
| 
 | ||
|   From the above list you can see that this is a rather important file,
 | ||
|   and you should make sure that it is present, and that the settings are
 | ||
|   what you desire for your system.
 | ||
| 
 | ||
|   7.4.  Group passwords.
 | ||
| 
 | ||
|   The /etc/groups file may contain passwords that permit a user to
 | ||
|   become a member of a particular group.  This function is enabled if
 | ||
|   you define the constant SHADOWGRP in the /usr/src/shadow-
 | ||
|   YYMMDD/config.h file.
 | ||
| 
 | ||
|   If you define this constant and then compile, you must create an
 | ||
|   /etc/gshadow file to hold the group passwords and the group
 | ||
|   administrator information.
 | ||
| 
 | ||
|   When you created the /etc/shadow, you used a program called pwconv,
 | ||
|   there no equivalent program to create the /etc/gshadow file, but it
 | ||
|   really doesn't matter, it takes care of itself.
 | ||
| 
 | ||
|   To create the initial /etc/gshadow file do the following:
 | ||
| 
 | ||
|        touch /etc/gshadow
 | ||
|        chown root.root /etc/gshadow
 | ||
|        chmod 700 /etc/gshadow
 | ||
| 
 | ||
|   Once you create new groups, they will be added to the /etc/group and
 | ||
|   the /etc/gshadow files.  If you modify a group by adding or removing
 | ||
|   users or changing the group password, the /etc/gshadow file will be
 | ||
|   changed.
 | ||
| 
 | ||
|   The programs groups, groupadd, groupmod, and groupdel are provided as
 | ||
|   part of the Shadow Suite to modify groups.
 | ||
| 
 | ||
|   The format of the /etc/group file is as follows:
 | ||
| 
 | ||
|        groupname:!:GID:member,member,...
 | ||
| 
 | ||
|   Where:
 | ||
| 
 | ||
|      groupname
 | ||
|         The name of the group
 | ||
| 
 | ||
|      !  The field that normally holds the password, but that is now
 | ||
|         relocated to the /etc/gshadow file.
 | ||
| 
 | ||
|      GID
 | ||
|         The numerical group ID number
 | ||
| 
 | ||
|      member
 | ||
|         List of group members
 | ||
| 
 | ||
|   The format of the /etc/gshadow file is as follows:
 | ||
| 
 | ||
|        groupname:password:admin,admin,...:member,member,...
 | ||
| 
 | ||
|   Where:
 | ||
| 
 | ||
|      groupname
 | ||
|         The name of the group
 | ||
| 
 | ||
|      password
 | ||
|         The encoded group password.
 | ||
| 
 | ||
|      admin
 | ||
|         List of group administrators
 | ||
| 
 | ||
|      member
 | ||
|         List of group members
 | ||
| 
 | ||
|   The command gpasswd is used only for adding or removing administrators
 | ||
|   and members to or from a group.  root or someone in the list of
 | ||
|   administrators may add or remove group members.
 | ||
| 
 | ||
|   The groups password can be changed using the passwd command by root or
 | ||
|   anyone listed as an administrator for the group.
 | ||
| 
 | ||
|   Despite the fact that there is not currently a manual page for
 | ||
|   gpasswd, typing gpasswd without any parameters gives a listing of
 | ||
|   options.  It's fairly easy to grasp how it all works once you
 | ||
|   understand the file formats and the concepts.
 | ||
| 
 | ||
|   7.5.  Consistency checking programs
 | ||
| 
 | ||
|   7.5.1.  pwck
 | ||
| 
 | ||
|   The program pwck is provided to provide a consistency check on the
 | ||
|   /etc/passwd and /etc/shadow files.  It will check each username and
 | ||
|   verify that it has the following:
 | ||
| 
 | ||
|   <20>  the correct number of fields
 | ||
| 
 | ||
|   <20>  unique user name
 | ||
| 
 | ||
|   <20>  valid user and group identifier
 | ||
| 
 | ||
|   <20>  valid primary group
 | ||
| 
 | ||
|   <20>  valid home directory
 | ||
| 
 | ||
|   <20>  valid login shell
 | ||
| 
 | ||
|   It will also warn of any account that has no password.
 | ||
| 
 | ||
|   It's a good idea to run pwck after installing the Shadow Suite.  It's
 | ||
|   also a good idea to run it periodically, perhaps weekly or monthly.
 | ||
|   If you use the -r option, you can use cron to run it on a regular
 | ||
|   basis and have the report mailed to you.
 | ||
| 
 | ||
|   7.5.2.  grpck
 | ||
| 
 | ||
|   grpck is the consistency checking program for the /etc/group and
 | ||
|   /etc/gshadow files.  It performs the following checks:
 | ||
| 
 | ||
|   <20>  the correct number of fields
 | ||
| 
 | ||
|   <20>  unique group name
 | ||
| 
 | ||
|   <20>  valid list of members and administrators
 | ||
| 
 | ||
|   It also has the -r option for automated reports.
 | ||
| 
 | ||
|   7.6.  Dial-up passwords.
 | ||
| 
 | ||
|   Dial-up passwords are another optional line of defense for systems
 | ||
|   that allow dial-in access.  If you have a system that allows many
 | ||
|   people to connect locally or via a network, but you want to limit who
 | ||
|   can dial in and connect, then dial-up passwords are for you.  To
 | ||
|   enable dial-up passwords, you must edit the file /etc/login.defs and
 | ||
|   ensure that DIALUPS_CHECK_ENAB is set to yes.
 | ||
| 
 | ||
|   Two files contain the dial-up information, /etc/dialups which contains
 | ||
|   the ttys (one per line, with the leading "/dev/" removed).  If a tty
 | ||
|   is listed then dial-up checks are performed.
 | ||
| 
 | ||
|   The second file is the /etc/d_passwd file.  This file contains the
 | ||
|   fully qualified path name of a shell, followed by an optional
 | ||
|   password.
 | ||
| 
 | ||
|   If a user logs into a line that is listed in /etc/dialups, and his
 | ||
|   shell is listed in the file /etc/d_passwd he will be allowed access
 | ||
|   only by suppling the correct password.
 | ||
| 
 | ||
|   Another useful purpose for using dial-up passwords might be to setup a
 | ||
|   line that only allows a certain type of connect (perhaps a PPP or UUCP
 | ||
|   connection).  If a user tries to get another type of connection (i.e.
 | ||
|   a list of shells), he must know a password to use the line.
 | ||
| 
 | ||
|   Before you can use the dial-up feature, you must create the files.
 | ||
| 
 | ||
|   The command dpasswd is provided to assign passwords to the shells in
 | ||
|   the /etc/d_passwd file.  See the manual page for more information.
 | ||
|   8.  Adding shadow support to a C program
 | ||
| 
 | ||
|   Adding shadow support to a program is actually fairly straightforward.
 | ||
|   The only problem is that the program must be run by root (or SUID
 | ||
|   root) in order for the the program to be able to access the
 | ||
|   /etc/shadow file.
 | ||
| 
 | ||
|   This presents one big problem: very careful programming practices must
 | ||
|   be followed when creating SUID programs.  For instance, if a program
 | ||
|   has a shell escape, this must not occur as root if the program is SUID
 | ||
|   root.
 | ||
| 
 | ||
|   For adding shadow support to a program so that it can check passwords,
 | ||
|   but otherwise does need to run as root, it's a lot safer to run the
 | ||
|   program SUID shadow instead.  The xlock program is an example of this.
 | ||
| 
 | ||
|   In the example given below, pppd-1.2.1d already runs SUID as root, so
 | ||
|   adding shadow support should not make the program any more vulnerable.
 | ||
| 
 | ||
|   8.1.  Header files
 | ||
| 
 | ||
|   The header files should reside in /usr/include/shadow.  There should
 | ||
|   also be a /usr/include/shadow.h, but it will be a symbolic link to
 | ||
|   /usr/include/shadow/shadow.h.
 | ||
| 
 | ||
|   To add shadow support to a program, you need to include the header
 | ||
|   files:
 | ||
| 
 | ||
|   #include <shadow/shadow.h>
 | ||
|   #include <shadow/pwauth.h>
 | ||
| 
 | ||
|   It might be a good idea to use compiler directives to conditionally
 | ||
|   compile the shadow code (I do in the example below).
 | ||
| 
 | ||
|   8.2.  libshadow.a library
 | ||
| 
 | ||
|   When you installed the Shadow Suite the libshadow.a file was created
 | ||
|   and installed in /usr/lib.
 | ||
| 
 | ||
|   When compiling shadow support into a program, the linker needs to be
 | ||
|   told to include the libshadow.a library into the link.
 | ||
| 
 | ||
|   This is done by:
 | ||
| 
 | ||
|        gcc program.c -o program -lshadow
 | ||
| 
 | ||
|   However, as we will see in the example below, most large programs use
 | ||
|   a Makefile, and usually have a variable called LIBS=... that we will
 | ||
|   modify.
 | ||
| 
 | ||
|   8.3.  Shadow Structure
 | ||
| 
 | ||
|   The libshadow.a library uses a structure called spwd for the
 | ||
|   information it retrieves from the /etc/shadow file.  This is the
 | ||
|   definition of the spwd structure from the /usr/include/shadow/shadow.h
 | ||
|   header file:
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   struct spwd
 | ||
|   {
 | ||
|     char *sp_namp;                /* login name */
 | ||
|     char *sp_pwdp;                /* encrypted password */
 | ||
|     sptime sp_lstchg;             /* date of last change */
 | ||
|     sptime sp_min;                /* minimum number of days between changes */
 | ||
|     sptime sp_max;                /* maximum number of days between changes */
 | ||
|     sptime sp_warn;               /* number of days of warning before password
 | ||
|                                      expires */
 | ||
|     sptime sp_inact;              /* number of days after password expires
 | ||
|                                      until the account becomes unusable. */
 | ||
|     sptime sp_expire;             /* days since 1/1/70 until account expires
 | ||
|   */
 | ||
|     unsigned long sp_flag;        /* reserved for future use */
 | ||
|   };
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   The Shadow Suite can put things into the sp_pwdp field besides just
 | ||
|   the encoded passwd.  The password field could contain:
 | ||
| 
 | ||
|        username:Npge08pfz4wuk;@/sbin/extra:9479:0:10000::::
 | ||
| 
 | ||
|   This means that in addition to the password, the program /sbin/extra
 | ||
|   should be called for further authentication.  The program called will
 | ||
|   get passed the username and a switch that indicates why it's being
 | ||
|   called.  See the file /usr/include/shadow/pwauth.h and the source code
 | ||
|   for pwauth.c for more information.
 | ||
| 
 | ||
|   What this means is that we should use the function pwauth to perform
 | ||
|   the actual authentication, as it will take care of the secondary
 | ||
|   authentication as well.  The example below does this.
 | ||
| 
 | ||
|   The author of the Shadow Suite indicates that since most programs in
 | ||
|   existence don't do this, and that it may be removed or changed in
 | ||
|   future versions of the Shadow Suite.
 | ||
| 
 | ||
|   8.4.  Shadow Functions
 | ||
| 
 | ||
|   The shadow.h file also contains the function prototypes for the
 | ||
|   functions contained in the libshadow.a library:
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   extern void setspent __P ((void));
 | ||
|   extern void endspent __P ((void));
 | ||
|   extern struct spwd *sgetspent __P ((__const char *__string));
 | ||
|   extern struct spwd *fgetspent __P ((FILE *__fp));
 | ||
|   extern struct spwd *getspent __P ((void));
 | ||
|   extern struct spwd *getspnam __P ((__const char *__name));
 | ||
|   extern int putspent __P ((__const struct spwd *__sp, FILE *__fp));
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   The function that we are going to use in the example is: getspnam
 | ||
|   which will retrieve for us a spwd structure for the supplied name.
 | ||
| 
 | ||
|   8.5.  Example
 | ||
| 
 | ||
|   This is an example of adding shadow support to a program that needs
 | ||
|   it, but does not have it by default.
 | ||
| 
 | ||
|   This example uses the Point-to-Point Protocol Server (pppd-1.2.1d),
 | ||
|   which has a mode in which it performs PAP authentication using user
 | ||
|   names and passwords from the /etc/passwd file instead of the PAP or
 | ||
|   CHAP files.  You would not need to add this code to pppd-2.2.0 because
 | ||
|   it's already there.
 | ||
| 
 | ||
|   This feature of pppd probably isn't used very much, but if you
 | ||
|   installed the Shadow Suite, it won't work anymore because the
 | ||
|   passwords are no longer stored in /etc/passwd.
 | ||
| 
 | ||
|   The code for authenticating users under pppd-1.2.1d is located in the
 | ||
|   /usr/src/pppd-1.2.1d/pppd/auth.c file.
 | ||
| 
 | ||
|   The following code needs to be added to the top of the file where all
 | ||
|   the other #include directives are.  We have surrounded the #includes
 | ||
|   with conditional directives (i.e. only include if we are compiling for
 | ||
|   shadow support).
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   #ifdef HAS_SHADOW
 | ||
|   #include <shadow.h>
 | ||
|   #include <shadow/pwauth.h>
 | ||
|   #endif
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   The next thing to do is to modify the actual code.  We are still
 | ||
|   making changes to the auth.c file.
 | ||
| 
 | ||
|   Function auth.c before modifications:
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   /*
 | ||
|    * login - Check the user name and password against the system
 | ||
|    * password database, and login the user if OK.
 | ||
|    *
 | ||
|    * returns:
 | ||
|    *      UPAP_AUTHNAK: Login failed.
 | ||
|    *      UPAP_AUTHACK: Login succeeded.
 | ||
|    * In either case, msg points to an appropriate message.
 | ||
|    */
 | ||
|   static int
 | ||
|   login(user, passwd, msg, msglen)
 | ||
|       char *user;
 | ||
|       char *passwd;
 | ||
|       char **msg;
 | ||
|       int *msglen;
 | ||
|   {
 | ||
|       struct passwd *pw;
 | ||
|       char *epasswd;
 | ||
|       char *tty;
 | ||
| 
 | ||
|       if ((pw = getpwnam(user)) == NULL) {
 | ||
|           return (UPAP_AUTHNAK);
 | ||
|       }
 | ||
|        /*
 | ||
|        * XXX If no passwd, let them login without one.
 | ||
|        */
 | ||
|       if (pw->pw_passwd == '\0') {
 | ||
|           return (UPAP_AUTHACK);
 | ||
|       }
 | ||
| 
 | ||
|       epasswd = crypt(passwd, pw->pw_passwd);
 | ||
|       if (strcmp(epasswd, pw->pw_passwd)) {
 | ||
|           return (UPAP_AUTHNAK);
 | ||
|       }
 | ||
| 
 | ||
|       syslog(LOG_INFO, "user %s logged in", user);
 | ||
| 
 | ||
|       /*
 | ||
|        * Write a wtmp entry for this user.
 | ||
|        */
 | ||
|       tty = strrchr(devname, '/');
 | ||
|       if (tty == NULL)
 | ||
|           tty = devname;
 | ||
|       else
 | ||
|           tty++;
 | ||
|       logwtmp(tty, user, "");             /* Add wtmp login entry */
 | ||
|       logged_in = TRUE;
 | ||
| 
 | ||
|       return (UPAP_AUTHACK);
 | ||
|   }
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   The user's password is placed into pw->pw_passwd, so all we really
 | ||
|   need to do is add the function getspnam.  This will put the password
 | ||
|   into spwd->sp_pwdp.
 | ||
| 
 | ||
|   We will add the function pwauth to perform the actual authentication.
 | ||
|   This will automatically perform secondary authentication if the shadow
 | ||
|   file is setup for it.
 | ||
| 
 | ||
|   Function auth.c after modifications to support shadow:
 | ||
| 
 | ||
|   ______________________________________________________________________
 | ||
|   /*
 | ||
|    * login - Check the user name and password against the system
 | ||
|    * password database, and login the user if OK.
 | ||
|    *
 | ||
|    * This function has been modified to support the Linux Shadow Password
 | ||
|    * Suite if USE_SHADOW is defined.
 | ||
|    *
 | ||
|    * returns:
 | ||
|    *      UPAP_AUTHNAK: Login failed.
 | ||
|    *      UPAP_AUTHACK: Login succeeded.
 | ||
|    * In either case, msg points to an appropriate message.
 | ||
|    */
 | ||
|   static int
 | ||
|   login(user, passwd, msg, msglen)
 | ||
|       char *user;
 | ||
|       char *passwd;
 | ||
|       char **msg;
 | ||
|       int *msglen;
 | ||
|   {
 | ||
|       struct passwd *pw;
 | ||
|       char *epasswd;
 | ||
|       char *tty;
 | ||
| 
 | ||
|   #ifdef USE_SHADOW
 | ||
|       struct spwd *spwd;
 | ||
|       struct spwd *getspnam();
 | ||
|   #endif
 | ||
| 
 | ||
|       if ((pw = getpwnam(user)) == NULL) {
 | ||
|           return (UPAP_AUTHNAK);
 | ||
|       }
 | ||
| 
 | ||
|   #ifdef USE_SHADOW
 | ||
|           spwd = getspnam(user);
 | ||
|           if (spwd)
 | ||
|                   pw->pw_passwd = spwd->sp-pwdp;
 | ||
|   #endif
 | ||
| 
 | ||
|        /*
 | ||
|        * XXX If no passwd, let NOT them login without one.
 | ||
|        */
 | ||
|       if (pw->pw_passwd == '\0') {
 | ||
|           return (UPAP_AUTHNAK);
 | ||
|       }
 | ||
|   #ifdef HAS_SHADOW
 | ||
|       if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
 | ||
|            && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_LOGIN, NULL))
 | ||
|           || !valid (passwd, pw)) {
 | ||
|           return (UPAP_AUTHNAK);
 | ||
|       }
 | ||
|   #else
 | ||
|       epasswd = crypt(passwd, pw->pw_passwd);
 | ||
|       if (strcmp(epasswd, pw->pw_passwd)) {
 | ||
|           return (UPAP_AUTHNAK);
 | ||
|       }
 | ||
|   #endif
 | ||
| 
 | ||
|       syslog(LOG_INFO, "user %s logged in", user);
 | ||
| 
 | ||
|       /*
 | ||
|        * Write a wtmp entry for this user.
 | ||
|        */
 | ||
|       tty = strrchr(devname, '/');
 | ||
|       if (tty == NULL)
 | ||
|           tty = devname;
 | ||
|       else
 | ||
|           tty++;
 | ||
|       logwtmp(tty, user, "");             /* Add wtmp login entry */
 | ||
|       logged_in = TRUE;
 | ||
| 
 | ||
|       return (UPAP_AUTHACK);
 | ||
|   }
 | ||
|   ______________________________________________________________________
 | ||
| 
 | ||
|   Careful examination will reveal that we made another change as well.
 | ||
|   The original version allowed access (returned UPAP_AUTHACK if there
 | ||
|   was NO password in the /etc/passwd file.  This is not good, because a
 | ||
|   common use of this login feature is to use one account to allow access
 | ||
|   to the PPP process and then check the username and password supplied
 | ||
|   by PAP with the username in the /etc/passwd file and the password in
 | ||
|   the /etc/shadow file.
 | ||
| 
 | ||
|   So if we had set the original version up to run as the shell for a
 | ||
|   user i.e.  ppp, then anyone could get a ppp connection by setting
 | ||
|   their PAP to user ppp and a password of null.
 | ||
| 
 | ||
|   We fixed this also by returning UPAP_AUTHNAK instead of UPAP_AUTHACK
 | ||
|   if the password field was empty.
 | ||
| 
 | ||
|   Interestingly enough, pppd-2.2.0 has the same problem.
 | ||
| 
 | ||
|   Next we need to modify the Makefile so that two things occur:
 | ||
|   USE_SHADOW must be defined, and libshadow.a needs to be added to the
 | ||
|   linking process.
 | ||
| 
 | ||
|   Edit the Makefile, and add:
 | ||
| 
 | ||
|        LIBS = -lshadow
 | ||
| 
 | ||
|   Then we find the line:
 | ||
| 
 | ||
|        COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t
 | ||
| 
 | ||
|   And change it to:
 | ||
| 
 | ||
|        COMPILE_FLAGS = -I.. -D_linux_=1 -DGIDSET_TYPE=gid_t -DUSE_SHADOW
 | ||
| 
 | ||
|   Now make and install.
 | ||
| 
 | ||
|   9.  Frequently Asked Questions.
 | ||
| 
 | ||
|   Q: I used to control which tty's root could log into using the file
 | ||
|   /etc/securettys, but it doesn't seem to work anymore, what's going on?
 | ||
| 
 | ||
|   A: The file /etc/securettys does absolutely nothing now that the
 | ||
|   Shadow Suite is installed.  The tty's that root can use are now
 | ||
|   located in the login configuration file /etc/login.defs.  The entry in
 | ||
|   this file may point to another file.
 | ||
| 
 | ||
|   Q: I installed the Shadow Suite, but now I can't login, what did I
 | ||
|   miss?
 | ||
| 
 | ||
|   A: You probably installed the Shadow programs, but didn't run pwconv
 | ||
|   or you forgot to copy /etc/npasswd to /etc/passwd and /etc/nshadow to
 | ||
|   /etc/shadow.  Also, you may need to copy login.defs to /etc.
 | ||
| 
 | ||
|   Q: In the section on xlock, it said to change the group ownership of
 | ||
|   the /etc/shadow file to shadow.  I don't have a shadow group, what do
 | ||
|   I do?
 | ||
| 
 | ||
|   A: You can add one.  Simply edit the /etc/group file, and insert a
 | ||
|   line for the shadow group.  You need to ensure that the group number
 | ||
|   is not used by another group, and you need to insert it before the
 | ||
|   nogroup entry.  Or you can simply suid xlock to root.
 | ||
| 
 | ||
|   Q: Is there a mailing list for the Linux Shadow Password Suite?
 | ||
| 
 | ||
|   A: Yes, but it's for the development and beta testing of the next
 | ||
|   Shadow Suite for Linux.  You can get added to the list by mailing to:
 | ||
|   shadow-list-request@neptune.cin.net with a subject of: subscribe.  The
 | ||
|   list is actually for discussions of the Linux shadow-YYMMSS series of
 | ||
|   releases.  You should join if you want to get involved in further
 | ||
|   development or if you install the Suite on your system and want to get
 | ||
|   information on newer releases.
 | ||
| 
 | ||
|   Q: I installed the Shadow Suite, but when I use the userdel command, I
 | ||
|   get "userdel: cannot open shadow group file", what did I do wrong?
 | ||
| 
 | ||
|   A: You compiled the Shadow Suite with the SHADOWGRP option enabled,
 | ||
|   but you don't have an /etc/gshadow file.  You need to either edit the
 | ||
|   config.h file and recompile, or create an /etc/group file.  See the
 | ||
|   section on shadow groups.
 | ||
| 
 | ||
|   Q: I installed the Shadow Suite but now I'm getting encoded passwords
 | ||
|   back in my /etc/passwd file, what's wrong?
 | ||
| 
 | ||
|   A: You either enabled the AUTOSHADOW option in the Shadow config.h
 | ||
|   file, or your libc was compiled with the SAHDOW_COMPAT option.  You
 | ||
|   need to determine which is the problem, and recompile.
 | ||
| 
 | ||
|   10.  Copyright Message.
 | ||
| 
 | ||
|   The Linux Shadow Password HOWTO is Copyright (c) 1996 Michael H.
 | ||
|   Jackson.
 | ||
| 
 | ||
|   Permission is granted to make and distribute verbatim copies of this
 | ||
|   document provided the copyright notice and this permission notice are
 | ||
|   preserved on all copies.
 | ||
| 
 | ||
|   Permission is granted to copy and distribute modified versions of this
 | ||
|   document under the conditions for verbatim copies above, provided a
 | ||
|   notice clearly stating that the document is a modified version is also
 | ||
|   included in the modified document.
 | ||
| 
 | ||
|   Permission is granted to copy and distribute translations of this
 | ||
|   document into another language, under the conditions specified above
 | ||
|   for modified versions.
 | ||
| 
 | ||
|   Permission is granted to convert this document into another media
 | ||
|   under the conditions specified above for modified versions provided
 | ||
|   the requirement to acknowledge the source document is fulfilled by
 | ||
|   inclusion of an obvious reference to the source document in the new
 | ||
|   media. Where there is any doubt as to what defines 'obvious' the
 | ||
|   copyright owner reserves the right to decide.
 | ||
| 
 | ||
|   11.  Miscellaneous and Acknowledgments.
 | ||
| 
 | ||
|   The code examples for auth.c are taken from pppd-1.2.1d and
 | ||
|   ppp-2.1.0e, Copyright (c) 1993 and The Australian National University
 | ||
|   and Copyright (c) 1989 Carnegie Mellon University.
 | ||
| 
 | ||
|   Thanks to Marek Michalkiewicz <marekm@i17linuxb.ists.pwr.wroc.pl> for
 | ||
|   writing and maintaining the Shadow Suite for Linux, and for his review
 | ||
|   and comments on this document.
 | ||
| 
 | ||
|   Thanks to Ron Tidd <rtidd@tscnet.com> for his helpful review and
 | ||
|   testing.
 | ||
| 
 | ||
|   Thanks to everyone who has sent me feedback to help improve this
 | ||
|   document.
 | ||
| 
 | ||
|   Please, if you have any comments or suggestions then mail them to me.
 | ||
| 
 | ||
|   regards
 | ||
| 
 | ||
|   Michael H. Jackson <mhjack@tscnet.com>
 | ||
| 
 |