[comp.unix.questions] Using the SunOS 4.0 shadow password file

leadley@uhura.cc.rochester.edu (Scott Leadley) (06/03/90)

	This has already been posted to Sun-Spots and is reposted here for
the benefit of those without FTP access.  I know that it's source.  I know that
it's already been posted to comp.sys.sun.  I thought it was important enough
to ruffle feathers.  If you disagree, my e-mail address is:

	leadley@cc.rochester.edu -or- ...!rochester!ur-cc!leadley
---
Message-ID: <7110@brazos.Rice.edu>
Date: 26 Apr 90 20:13:10 GMT
X-Sun-Spots-Digest: Volume 9, Issue 129, message 10

A little shove for those people who aren't using the SunOS 4.0 shadow
password file yet.  If there are any obvious errors I'd like to know.  I'm
not going to improve it though.

Scott Leadley - leadley@cc.rochester.edu

[[Ed's Note: Placed in titan archives. -bdg]]

FTP:	Hostname : titan.rice.edu (128.42.1.30)
	Directory: sun-source
	Filename : mkshadow

Archive Server Address: archive-server@rice.edu
Archive Server Command: send sun-source mkshadow
---
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  mkshadow
# Wrapped by leadley@uhura.cc.rochester.edu on Fri Apr 27 10:13:13 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'mkshadow' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mkshadow'\"
else
echo shar: Extracting \"'mkshadow'\" \(5028 characters\)
sed "s/^X//" >'mkshadow' <<'END_OF_FILE'
X#!/bin/sh
X#
X# Usage: mkshadow [-f]
X#
X#	-f (force)	skip the sanity check
X#
X#	Start using the SunOS 4.n shadow password file without bothering with
X# the C2 auditing.  This script is a little more paranoid that the Sun
X# supplied C2conv:
X#
X#						C2conv			mkshadow
X#						------			--------
X#	/etc/passwd.bak			owner	?previous owner?	root
X#					group	?previous group?	wheel
X#					mode	?previous mode?		400
X#	/etc/security/			owner	root			root
X#					group	usually staff		wheel
X#					mode	2711 or 711		2711
X#	/etc/security/passwd.adjunct	owner	root			root
X#					group	usually staff		wheel
X#					mode	640			600
X#
X# It wouldn't be terrible to make the mode of /etc/security/ 2700, but that
X# would break issecure(3) for ordinary folks.
X#
X#	C2conv also sets up a shadow password file for /etc/group, but why
X# bother?  If you are feeling energetic and want to maintain two group files,
X# read group.adjunct(5).
X#
X#	Caveat emptor.  READ THE SCRIPT. If you trust me to have figured out
X# all the ways you could have screwed things up, you're crazy.  Use at your
X# own risk.  Lawyers will be shot on sight.  Etcetera.
X#
X#	Scott Leadley, University of Rochester, 4/24/90
X#
X# PS  Why doesn't lockscreen work with a shadow password file?
XPATH=/usr/bin:/usr/ucb:/usr/etc
Xexport PATH
X
Xusage() {
X	echo "usage: $1 [-f]"
X}
X
Xfail() {
X	echo "$1" 1>&2
X	echo "Shadow password file creation failed." 1>&2
X	exit 1
X}
X
XFALSE=1
XTRUE=0
X#
X#
Xcase $# in
X0)	;;
X1)	if [ "$1" != "-f" ]; then
X		fail "`usage $0`"
X	fi
X	;;
X*)	fail "`usage $0`"
X	;;
Xesac
X#
X#	You must do this as root.
Xif [ `whoami` != root ]; then
X	fail "Root must run this program."
Xfi
X#
X#	The C2 security package must be installed (or at least rpc.pwdauthd).
Xif [ ! -f /usr/etc/rpc.pwdauthd ]; then
X	fail "The C2 security package is not installed.  It is a prerequisite."
Xfi
X#
X#	Minor sanity check: is the current password file secure enough for
X# the shadow password file to do any good?  I'm not your Mom, so don't expect
X# this check to be very thorough.
Xif [ "$1" != "-f" ]; then
X	#	Check that, at the very least, /, /etc and /etc/passwd aren't
X	# writeable by everyone.
X	if ls -lgd / | awk '{if($1~/-.$/) exit 1;}'; then
X		fail "Anyone can write to /.  Fix this more basic security problem first."
X	fi
X	if ls -lgd /etc | awk '{if($1~/-.$/) exit 1;}'; then
X		fail "Anyone can write to /etc.  Fix this more basic security problem first."
X	fi
X	if ls -lgd /etc/passwd | awk '{if($1~/-.$/) exit 1;}'; then
X		fail "Anyone can write to /etc/passwd.  Fix this more basic security problem first."
X	fi
Xfi
X
X#
X#	There must be a /etc/security directory to put passwd.adjunct in.
Xpwdauthd_started_by_hand=$FALSE
Xif [ ! -d /etc/security ]; then
X	mkdir /etc/security
X	#	The SunOS 4.0.3 supplied /etc/rc.local starts rpc.pwdauthd only
X	# if /etc/security/passwd.adjunct exists.
X	( cd /; rpc.pwdauthd & )
X	pwdauthd_started_by_hand=$TRUE
X	echo "rpc.pwdauthd started.  Started by /etc/rc.local from now on."
Xfi
X#
X#	The idly curious are denied satisfaction.
Xchown root.wheel /etc/security
Xchmod 711 /etc/security; chmod g+s /etc/security
X#
X#	Create a null /etc/security/passwd.adjunct file.
Xif [ ! -d /etc/security/passwd.adjunct ]; then
X	touch /etc/security/passwd.adjunct
X	if [ $pwdauthd_started_by_hand -eq $FALSE ]; then
X		#	/etc/security/ existed, but passwd.adjunct didn't ...
X		# interesting.
X		( cd /; rpc.pwdauthd & )
X		pwdauthd_started_by_hand=$TRUE
X		echo "rpc.pwdauthd started.  Started by /etc/rc.local from now on."
X	fi
Xelse
X	fail "/etc/security/passwd.adjunct already exists!"
Xfi
X#
X#	It should be impervious to inspection by anyone but root (I wish).
Xchown root.wheel /etc/security/passwd.adjunct
Xchmod 600 /etc/security/passwd.adjunct
X#
X#	The old password file (with passwords still in it) should be locked up.
Xcp /etc/passwd /etc/passwd.bak
Xif [ $? -ne $TRUE ]; then
X	fail "Couldn't create /etc/passwd.bak.  Too dangerous to proceed."
Xfi
Xchown root.wheel /etc/passwd.bak
Xchmod 400 /etc/passwd.bak
X#
X#	Assume that whatever owner, group and mode are current on /etc/passwd
X# make you happy and leave it alone.
X#
X#	Split up the old password file.  One twist (I don't know why, but just
X# to be consistent with C2conv) is that "audit:*:::::all" is the first line in
X# the passwd.adjunct file.  Dealing with NIS (YP) passwd entries and determining
X# if NIS is actually running is just too damn complicated, so punt.  NIS
X# passwd entries are left as is.
XEDITOR=ex
Xexport EDITOR
Xvipw >/dev/null <<EOF
X1,\$! awk -F: '{printf "\%s:\%s:::::\n", \$1, \$2;}'
X/^audit:/d
X1put
X1d
X1put
X1s/\$/all/
Xg/^+/d
Xw! /etc/security/passwd.adjunct
Xe!
X1,\$! awk -F: '{if(\$1~/^+/)print;else printf "\%s:\#\#\%s:\%s:\%s:\%s:\%s:\%s\n", \$1, \$1, \$3, \$4, \$5, \$6, \$7;}'
Xw!
Xq
XEOF
Xegrep '^\+' /etc/passwd >/dev/null
Xif [ $? -eq $TRUE ]; then
X	echo "NIS (YP) passwd entries need to be added to the shadow password file by hand."
Xfi
X#
X#	Reminder to comment out the auditd startup in /etc/rc.local.
Xecho "Remember to comment out or delete the auditd startup in /etc/rc.local:"
Xecho
Xsed -n "/auditd/,/fi/s/^/   /p" /etc/rc.local
END_OF_FILE
if test 5028 -ne `wc -c <'mkshadow'`; then
    echo shar: \"'mkshadow'\" unpacked with wrong size!
fi
chmod +x 'mkshadow'
# end of 'mkshadow'
fi
echo shar: End of shell archive.
exit 0
-- 
					Scott Leadley - leadley@cc.rochester.edu