|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 4784 (0x12b0) Types: TextFile Names: »passwd.chk«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦3da311d67⟧ »./cops/1.04/cops_104.tar.Z« └─⟦6a2577110⟧ └─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦6a2577110⟧ »./cops/1.04/cops_104.tar« └─⟦this⟧ »cops_104/perl/passwd.chk«
#!/bin/sh -- need to mention perl here to avoid recursion 'true' || eval 'exec perl -S $0 $argv:q'; eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' & eval 'exec /usr/local/bin/perl -S $0 $argv:q' if 0; # # passwd.chk # # composer@chem.bu.edu # # Check password file -- /etc/passwd -- for incorrect number of fields, # duplicate uid's, non-alphanumeric uids, and non-numeric group id's. # # Mechanism: This script ensures that each line of the passwd file (in # $etc, line 47) has 7 fields and is non-blank, as well as examining the # file for any duplicate users. It then checks to ensure that the first # character of the login name is alphanumeric, and that all uid and gid # numbers are indeed numeric and non-negative. It also checks the # validity of the home directory. # # For yellow pages passwords, it does the same checking, but in order to # get a listing of all members of the password file, it does a "ypcat # passwd" and uses the output from that as a passwd file. # # The /etc/passwd file has a very specific format, making the task fairly # simple. Normally it has lines with 7 fields, each field separated by a # colon (:). The first field is the user id, the second field is the # encrypted password (an asterix (*) means the group has no password, # otherwise the first two characters are the salt), the third field is the # user id number, the fourth field is the group id number, the fifth field # is the GECOS field (basically holds miscellaneous information, varying # from site to site), the sixth field is the home directory of the user, # and lastly the seventh field is the login shell of the user. No blank # lines should be present. Uid's will be flagged if over 8 chars, unless # the $OVER_8 variable (line 45) is set to "YES". # # If a line begins with a plus sign (+), it is a yellow pages entry. See # passwd(5) for more information, if this applies to your site. # require 'pathconf.pl'; require 'pass.cache.pl'; package passwd_chk; # Used for Sun C2 security group file. 'FALSE' (default) will flag # valid C2 passwd syntax as an error, 'TRUE' attempts to validate it. # Thanks to Pete Troxell for pointing this out. $C2='FALSE' if ! defined($C2); # Some systems allow long uids; set this to 'TRUE', if so (thanks # to Pete Shipley (lot of petes around here, eh?)): $OVER_8='NO' if ! defined($OVER_8); # # Important files: $etc_passwd = $'PASSWD || '/etc/passwd'; # Check $etc_passwd for potential problems, or use the alternate method # set in cops.cf: if (!"$'GET_PASSWD") { open(Passwd, $etc_passwd) || warn "$0: Can't open $etc_passwd: $!\n"; } else { open(Passwd, "$'GET_PASSWD|") || warn "$0: Can't open $etc_passwd: $!\n"; } &chk_passwd_file_format('Passwd'); close Passwd; # check ypcat passwd for potential problems... (same checks) if (-s $'YPCAT && -x _) { open(YPasswd, "$'YPCAT passwd 2>/dev/null |") || die "$0: Can't popen $'YPCAT: $!\n"; &chk_passwd_file_format('YPasswd'); close YPasswd; } sub chk_passwd_file_format { local($file) = @_; local($W) = "Warning! $file file,"; undef %users; while (<$file>) { # should really check for correct YP syntax next if /^[-+]/; # skipping YP lines for now print "$W line $., is blank\n", next if /^\s*$/; # make code a little more readable .. use names.. ($user,$pass,$uid,$gid,$gcos,$home,$shell) = split(?:?); $users{$user}++; # keep track of dups print "$W line $., does not have 7 fields:\n\t$_" if (@_ != 7); print "$W line $., nonalphanumeric username:\n\t$_" if $user !~ /^[_A-Za-z0-9-]+$/; print "$W line $., numeric username:\n\t$_" if $user =~ /^\d+$/; print "$W line $., login name > 8 characters:\n\t$_" if ( ! $OVER_8 && length($user) > 8); print "$W line $., no password:\n\t$_" unless $pass; print "$W line $., invalid password field for C2:\n\t$_" if ($C2 && $pass =~ /^##/ && "##$user" ne $pass); if ($uid !~ /^\d+$/) { if ($uid < 0) { print "$W line $., negative user id (uid):\n\t$_"; } else { print "$W line $., nonnumeric user id (uid):\n\t$_"; } } # what about checks for certain ranges of UIDs .. -composer print "$W line $., user $user has uid == 0 and is not root\n\t$_" if $uid == 0 && $user ne "root"; print "$W line $., nonnumeric group id (gid):\n\t$_" unless $gid =~ /^\d+$/; print "$W line $., invalid home directory:\n\t$_" unless $home =~ m:^/:; } # find duplicate usernames # not the best way, but it works ... $dup_warned = 0; for (sort keys %users) { (print "Warning! Duplicate username(s) found in $file:\n"), $dup_warned++ if !$dup_warned && $users{$_} > 1; print "$_ " if $users{$_} > 1; } print "\n" if $dup_warned; } 1; # end of passwd.chk file