security revision 1.103 1 1.1 cgd #!/bin/sh -
2 1.1 cgd #
3 1.103 tron # $NetBSD: security,v 1.103 2007/08/09 07:50:58 tron Exp $
4 1.9 cgd # from: @(#)security 8.1 (Berkeley) 6/9/93
5 1.1 cgd #
6 1.1 cgd
7 1.9 cgd PATH=/sbin:/usr/sbin:/bin:/usr/bin
8 1.1 cgd
9 1.89 jmmv rcvar_manpage='security.conf(5)'
10 1.89 jmmv
11 1.31 lukem if [ -f /etc/rc.subr ]; then
12 1.31 lukem . /etc/rc.subr
13 1.31 lukem else
14 1.31 lukem echo "Can't read /etc/rc.subr; aborting."
15 1.31 lukem exit 1;
16 1.31 lukem fi
17 1.31 lukem
18 1.9 cgd umask 077
19 1.64 cjs TZ=UTC; export TZ
20 1.1 cgd
21 1.15 mrg if [ -s /etc/security.conf ]; then
22 1.15 mrg . /etc/security.conf
23 1.15 mrg fi
24 1.15 mrg
25 1.67 lukem # Set reasonable defaults (if they're not set in security.conf)
26 1.67 lukem #
27 1.67 lukem backup_dir=${backup_dir:-/var/backups}
28 1.67 lukem pkgdb_dir=${pkgdb_dir:-/var/db/pkg}
29 1.67 lukem max_loginlen=${max_loginlen:-8}
30 1.67 lukem max_grouplen=${max_grouplen:-8}
31 1.67 lukem
32 1.67 lukem # Other configurable variables
33 1.67 lukem #
34 1.67 lukem special_files="/etc/mtree/special /etc/mtree/special.local"
35 1.67 lukem MP=/etc/master.passwd
36 1.67 lukem CHANGELIST=""
37 1.67 lukem work_dir=$backup_dir/work
38 1.67 lukem
39 1.67 lukem if [ ! -d "$work_dir" ]; then
40 1.67 lukem mkdir -p "$work_dir"
41 1.67 lukem fi
42 1.67 lukem
43 1.102 martti SECUREDIR=$(mktemp -d -t _securedir) || exit 1
44 1.56 lukem
45 1.67 lukem trap "/bin/rm -rf $SECUREDIR ; exit 0" EXIT INT QUIT PIPE
46 1.15 mrg
47 1.56 lukem if ! cd "$SECUREDIR"; then
48 1.56 lukem echo "Can not cd to $SECUREDIR".
49 1.15 mrg exit 1
50 1.15 mrg fi
51 1.15 mrg
52 1.91 lukem ERR=err.$$
53 1.91 lukem TMP1=tmp1.$$
54 1.91 lukem TMP2=tmp2.$$
55 1.91 lukem MPBYUID=mpbyuid.$$
56 1.91 lukem MPBYPATH=mpbypath.$$
57 1.91 lukem LIST=list.$$
58 1.91 lukem OUTPUT=output.$$
59 1.91 lukem LABELS=labels.$$
60 1.91 lukem PKGS=pkgs.$$
61 1.91 lukem CHANGEFILES=changefiles.$$
62 1.91 lukem SPECIALSPEC=specialspec.$$
63 1.67 lukem
64 1.15 mrg
65 1.67 lukem # migrate_file old new
66 1.67 lukem # Determine if the "${old}" path name needs to be migrated to the
67 1.67 lukem # "${new}" path. Also checks if "${old}.current" needs migrating,
68 1.67 lukem # and if so, migrate it and possibly "${old}.current,v" and
69 1.67 lukem # "${old}.backup".
70 1.67 lukem #
71 1.67 lukem migrate_file()
72 1.67 lukem {
73 1.67 lukem _old=$1
74 1.67 lukem _new=$2
75 1.67 lukem if [ -z "$_old" -o -z "$_new" ]; then
76 1.67 lukem err 3 "USAGE: migrate_file old new"
77 1.67 lukem fi
78 1.67 lukem if [ ! -d "${_new%/*}" ]; then
79 1.67 lukem mkdir -p "${_new%/*}"
80 1.67 lukem fi
81 1.67 lukem if [ -f "${_old}" -a ! -f "${_new}" ]; then
82 1.67 lukem echo "==> migrating ${_old}"
83 1.67 lukem echo " to ${_new}"
84 1.67 lukem mv "${_old}" "${_new}"
85 1.67 lukem fi
86 1.67 lukem if [ -f "${_old}.current" -a ! -f "${_new}.current" ]; then
87 1.67 lukem echo "==> migrating ${_old}.current"
88 1.67 lukem echo " to ${_new}.current"
89 1.67 lukem mv "${_old}.current" "${_new}.current"
90 1.67 lukem if [ -f "${_old}.current,v" -a ! -f "${_new}.current,v" ]; then
91 1.67 lukem echo "==> migrating ${_old}.current,v"
92 1.67 lukem echo " to ${_new}.current,v"
93 1.67 lukem mv "${_old}.current,v" "${_new}.current,v"
94 1.67 lukem fi
95 1.67 lukem if [ -f "${_old}.backup" -a ! -f "${_new}.backup" ]; then
96 1.67 lukem echo "==> migrating ${_old}.backup"
97 1.67 lukem echo " to ${_new}.backup"
98 1.67 lukem mv "${_old}.backup" "${_new}.backup"
99 1.67 lukem fi
100 1.67 lukem fi
101 1.67 lukem }
102 1.67 lukem
103 1.67 lukem
104 1.67 lukem # backup_and_diff file printdiff
105 1.67 lukem # Determine if file needs backing up, and if so, do it.
106 1.67 lukem # If printdiff is yes, display the diffs, otherwise
107 1.67 lukem # just print a message saying "[changes omitted]".
108 1.67 lukem #
109 1.67 lukem backup_and_diff()
110 1.67 lukem {
111 1.67 lukem _file=$1
112 1.67 lukem _printdiff=$2
113 1.67 lukem if [ -z "$_file" -o -z "$_printdiff" ]; then
114 1.67 lukem err 3 "USAGE: backup_and_diff file printdiff"
115 1.67 lukem fi
116 1.67 lukem ! checkyesno _printdiff
117 1.67 lukem _printdiff=$?
118 1.67 lukem
119 1.67 lukem _old=$backup_dir/${_file##*/}
120 1.67 lukem case "$_file" in
121 1.67 lukem $work_dir/*)
122 1.67 lukem _new=$_file
123 1.67 lukem migrate_file "$backup_dir/$_old" "$_new"
124 1.67 lukem migrate_file "$_old" "$_new"
125 1.67 lukem ;;
126 1.67 lukem *)
127 1.67 lukem _new=$backup_dir/$_file
128 1.67 lukem migrate_file "$_old" "$_new"
129 1.67 lukem ;;
130 1.67 lukem esac
131 1.67 lukem CUR=${_new}.current
132 1.67 lukem BACK=${_new}.backup
133 1.67 lukem if [ -f $_file ]; then
134 1.67 lukem if [ -f $CUR ] ; then
135 1.67 lukem if [ "$_printdiff" -ne 0 ]; then
136 1.83 jhawk diff ${diff_options} $CUR $_file > $OUTPUT
137 1.67 lukem else
138 1.67 lukem if ! cmp -s $CUR $_file; then
139 1.67 lukem echo "[changes omitted]"
140 1.67 lukem fi > $OUTPUT
141 1.67 lukem fi
142 1.67 lukem if [ -s $OUTPUT ] ; then
143 1.67 lukem printf \
144 1.67 lukem "\n======\n%s diffs (OLD < > NEW)\n======\n" $_file
145 1.67 lukem cat $OUTPUT
146 1.67 lukem backup_file update $_file $CUR $BACK
147 1.67 lukem fi
148 1.67 lukem else
149 1.67 lukem printf "\n======\n%s added\n======\n" $_file
150 1.67 lukem if [ "$_printdiff" -ne 0 ]; then
151 1.83 jhawk diff ${diff_options} /dev/null $_file
152 1.67 lukem else
153 1.67 lukem echo "[changes omitted]"
154 1.67 lukem fi
155 1.67 lukem backup_file add $_file $CUR $BACK
156 1.67 lukem fi
157 1.67 lukem else
158 1.67 lukem if [ -f $CUR ]; then
159 1.67 lukem printf "\n======\n%s removed\n======\n" $_file
160 1.67 lukem if [ "$_printdiff" -ne 0 ]; then
161 1.83 jhawk diff ${diff_options} $CUR /dev/null
162 1.67 lukem else
163 1.67 lukem echo "[changes omitted]"
164 1.67 lukem fi
165 1.67 lukem backup_file remove $_file $CUR $BACK
166 1.67 lukem fi
167 1.67 lukem fi
168 1.67 lukem }
169 1.48 abs
170 1.9 cgd
171 1.67 lukem # These are used several times.
172 1.67 lukem #
173 1.91 lukem awk -F: '!/^\+/ { print $1 " " $3 }' $MP | sort -k2n > $MPBYUID
174 1.29 lukem awk -F: '{ print $1 " " $9 }' $MP | sort -k2 > $MPBYPATH
175 1.91 lukem for file in $special_files; do
176 1.91 lukem [ -s $file ] && cat $file
177 1.91 lukem done | mtree -CM -k all > $SPECIALSPEC || exit 1
178 1.9 cgd
179 1.67 lukem
180 1.9 cgd # Check the master password file syntax.
181 1.32 lukem #
182 1.31 lukem if checkyesno check_passwd; then
183 1.85 jhawk # XXX: the sense of permit_star is reversed; the code works as
184 1.85 jhawk # implemented, but usage needs to be negated.
185 1.81 jhawk checkyesno check_passwd_permit_star && permit_star=0 || permit_star=1
186 1.94 jdolecek checkyesno check_passwd_permit_nonalpha \
187 1.94 jdolecek && permit_nonalpha=1 || permit_nonalpha=0
188 1.94 jdolecek
189 1.81 jhawk awk -v "len=$max_loginlen" \
190 1.81 jhawk -v "nowarn_shells_list=$check_passwd_nowarn_shells" \
191 1.81 jhawk -v "nowarn_users_list=$check_passwd_nowarn_users" \
192 1.94 jdolecek -v "permit_star=$permit_star" \
193 1.94 jdolecek -v "permit_nonalpha=$permit_nonalpha" \
194 1.94 jdolecek '
195 1.25 lukem BEGIN {
196 1.25 lukem while ( getline < "/etc/shells" > 0 ) {
197 1.39 hubertf if ($0 ~ /^\#/ || $0 ~ /^$/ )
198 1.25 lukem continue;
199 1.25 lukem shells[$1]++;
200 1.25 lukem }
201 1.81 jhawk split(nowarn_shells_list, a);
202 1.81 jhawk for (i in a) nowarn_shells[a[i]]++;
203 1.81 jhawk split(nowarn_users_list, a);
204 1.81 jhawk for (i in a) nowarn_users[a[i]]++;
205 1.81 jhawk uid0_users_list="root toor"
206 1.81 jhawk split(uid0_users_list, a);
207 1.81 jhawk for (i in a) uid0_users[a[i]]++;
208 1.25 lukem FS=":";
209 1.25 lukem }
210 1.25 lukem
211 1.25 lukem {
212 1.15 mrg if ($0 ~ /^[ ]*$/) {
213 1.25 lukem printf "Line %d is a blank line.\n", NR;
214 1.15 mrg next;
215 1.15 mrg }
216 1.34 abs if (NF != 10 && ($1 != "+" || NF != 1))
217 1.25 lukem printf "Line %d has the wrong number of fields.\n", NR;
218 1.34 abs if ($1 == "+" ) {
219 1.34 abs if (NF != 1 && $3 == 0)
220 1.81 jhawk printf "Line %d includes entries with uid 0.\n",
221 1.81 jhawk NR;
222 1.34 abs next;
223 1.34 abs }
224 1.94 jdolecek if (!permit_nonalpha &&
225 1.95 peter $1 !~ /^[_A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])*$/)
226 1.25 lukem printf "Login %s has non-alphanumeric characters.\n",
227 1.25 lukem $1;
228 1.34 abs if (length($1) > len)
229 1.81 jhawk printf "Login %s has more than "len" characters.\n",
230 1.81 jhawk $1;
231 1.81 jhawk if ($2 == "" && !nowarn_users[$1])
232 1.81 jhawk printf "Login %s has no password.\n", $1;
233 1.81 jhawk if (!nowarn_shells[$10] && !nowarn_users[$1]) {
234 1.81 jhawk if (length($2) != 13 &&
235 1.81 jhawk length($2) != 20 &&
236 1.81 jhawk $2 !~ /^\$1/ &&
237 1.81 jhawk $2 !~ /^\$2/ &&
238 1.99 jmcneill $2 !~ /^\$sha1/ &&
239 1.81 jhawk $2 != "" &&
240 1.81 jhawk (permit_star || $2 != "*") &&
241 1.81 jhawk $2 !~ /^\*[A-z-]+$/ &&
242 1.81 jhawk $1 != "toor") {
243 1.81 jhawk if ($10 == "" || shells[$10])
244 1.81 jhawk printf "Login %s is off but still has "\
245 1.81 jhawk "a valid shell (%s)\n", $1, $10;
246 1.81 jhawk } else if (! shells[$10])
247 1.81 jhawk printf "Login %s does not have a valid "\
248 1.81 jhawk "shell (%s)\n", $1, $10;
249 1.81 jhawk }
250 1.81 jhawk if ($3 == 0 && !uid0_users[$1] && !nowarn_users[$1])
251 1.25 lukem printf "Login %s has a user id of 0.\n", $1;
252 1.15 mrg if ($3 < 0)
253 1.25 lukem printf "Login %s has a negative user id.\n", $1;
254 1.15 mrg if ($4 < 0)
255 1.25 lukem printf "Login %s has a negative group id.\n", $1;
256 1.15 mrg }' < $MP > $OUTPUT
257 1.15 mrg if [ -s $OUTPUT ] ; then
258 1.15 mrg printf "\nChecking the $MP file:\n"
259 1.15 mrg cat $OUTPUT
260 1.15 mrg fi
261 1.15 mrg
262 1.15 mrg awk -F: '{ print $1 }' $MP | sort | uniq -d > $OUTPUT
263 1.15 mrg if [ -s $OUTPUT ] ; then
264 1.15 mrg printf "\n$MP has duplicate user names.\n"
265 1.15 mrg column $OUTPUT
266 1.15 mrg fi
267 1.15 mrg
268 1.37 wrstuden # To not exclude 'toor', a standard duplicate root account, from the duplicate
269 1.37 wrstuden # account test, uncomment the line below (without egrep in it)and comment
270 1.37 wrstuden # out the line (with egrep in it) below it.
271 1.37 wrstuden #
272 1.37 wrstuden # < $MPBYUID uniq -d -f 1 | awk '{ print $2 }' > $TMP2
273 1.36 wrstuden < $MPBYUID egrep -v '^toor ' | uniq -d -f 1 | awk '{ print $2 }' > $TMP2
274 1.15 mrg if [ -s $TMP2 ] ; then
275 1.15 mrg printf "\n$MP has duplicate user id's.\n"
276 1.15 mrg while read uid; do
277 1.28 lukem grep -w $uid $MPBYUID
278 1.15 mrg done < $TMP2 | column
279 1.15 mrg fi
280 1.9 cgd fi
281 1.9 cgd
282 1.9 cgd # Check the group file syntax.
283 1.32 lukem #
284 1.31 lukem if checkyesno check_group; then
285 1.15 mrg GRP=/etc/group
286 1.49 jdolecek awk -F: -v "len=$max_grouplen" '{
287 1.15 mrg if ($0 ~ /^[ ]*$/) {
288 1.25 lukem printf "Line %d is a blank line.\n", NR;
289 1.15 mrg next;
290 1.15 mrg }
291 1.34 abs if (NF != 4 && ($1 != "+" || NF != 1))
292 1.25 lukem printf "Line %d has the wrong number of fields.\n", NR;
293 1.34 abs if ($1 == "+" ) {
294 1.34 abs next;
295 1.34 abs }
296 1.95 peter if ($1 !~ /^[_A-Za-z0-9]([-A-Za-z0-9_.]*[A-Za-z0-9])*$/)
297 1.25 lukem printf "Group %s has non-alphanumeric characters.\n",
298 1.25 lukem $1;
299 1.49 jdolecek if (length($1) > len)
300 1.49 jdolecek printf "Group %s has more than "len" characters.\n", $1;
301 1.15 mrg if ($3 !~ /[0-9]*/)
302 1.25 lukem printf "Login %s has a negative group id.\n", $1;
303 1.15 mrg }' < $GRP > $OUTPUT
304 1.15 mrg if [ -s $OUTPUT ] ; then
305 1.15 mrg printf "\nChecking the $GRP file:\n"
306 1.15 mrg cat $OUTPUT
307 1.15 mrg fi
308 1.15 mrg
309 1.15 mrg awk -F: '{ print $1 }' $GRP | sort | uniq -d > $OUTPUT
310 1.15 mrg if [ -s $OUTPUT ] ; then
311 1.15 mrg printf "\n$GRP has duplicate group names.\n"
312 1.15 mrg column $OUTPUT
313 1.15 mrg fi
314 1.9 cgd fi
315 1.9 cgd
316 1.9 cgd # Check for root paths, umask values in startup files.
317 1.9 cgd # The check for the root paths is problematical -- it's likely to fail
318 1.9 cgd # in other environments. Once the shells have been modified to warn
319 1.9 cgd # of '.' in the path, the path tests should go away.
320 1.32 lukem #
321 1.31 lukem if checkyesno check_rootdotfiles; then
322 1.67 lukem rhome=~root
323 1.15 mrg umaskset=no
324 1.15 mrg list="/etc/csh.cshrc /etc/csh.login ${rhome}/.cshrc ${rhome}/.login"
325 1.15 mrg for i in $list ; do
326 1.15 mrg if [ -f $i ] ; then
327 1.67 lukem if egrep '^[ \t]*umask[ \t]+[0-7]+' $i > /dev/null ;
328 1.67 lukem then
329 1.15 mrg umaskset=yes
330 1.15 mrg fi
331 1.63 lukem # Double check the umask value itself; ensure that
332 1.67 lukem # both the group and other write bits are set.
333 1.67 lukem #
334 1.45 sommerfe egrep '^[ \t]*umask[ \t]+[0-7]+' $i |
335 1.63 lukem awk '{
336 1.67 lukem if ($2 ~ /^.$/ || $2 ~! /[^2367].$/) {
337 1.80 wiz print "\tRoot umask is group writable"
338 1.63 lukem }
339 1.67 lukem if ($2 ~ /[^2367]$/) {
340 1.80 wiz print "\tRoot umask is other writable"
341 1.63 lukem }
342 1.67 lukem }' | sort -u
343 1.26 lukem SAVE_PATH=$PATH
344 1.26 lukem unset PATH
345 1.15 mrg /bin/csh -f -s << end-of-csh > /dev/null 2>&1
346 1.15 mrg source $i
347 1.15 mrg /bin/ls -ldgT \$path > $TMP1
348 1.9 cgd end-of-csh
349 1.76 atatat export PATH=$SAVE_PATH
350 1.15 mrg awk '{
351 1.15 mrg if ($10 ~ /^\.$/) {
352 1.27 lukem print "\tThe root path includes .";
353 1.15 mrg next;
354 1.15 mrg }
355 1.15 mrg }
356 1.15 mrg $1 ~ /^d....w/ \
357 1.80 wiz { print "\tRoot path directory " $10 " is group writable." } \
358 1.15 mrg $1 ~ /^d.......w/ \
359 1.80 wiz { print "\tRoot path directory " $10 " is other writable." }' \
360 1.67 lukem < $TMP1
361 1.15 mrg fi
362 1.67 lukem done > $OUTPUT
363 1.15 mrg if [ $umaskset = "no" -o -s $OUTPUT ] ; then
364 1.27 lukem printf "\nChecking root csh paths, umask values:\n$list\n\n"
365 1.15 mrg if [ -s $OUTPUT ]; then
366 1.15 mrg cat $OUTPUT
367 1.15 mrg fi
368 1.15 mrg if [ $umaskset = "no" ] ; then
369 1.27 lukem printf "\tRoot csh startup files do not set the umask.\n"
370 1.15 mrg fi
371 1.9 cgd fi
372 1.9 cgd
373 1.15 mrg umaskset=no
374 1.23 lukem list="/etc/profile ${rhome}/.profile"
375 1.15 mrg for i in $list; do
376 1.15 mrg if [ -f $i ] ; then
377 1.15 mrg if egrep umask $i > /dev/null ; then
378 1.15 mrg umaskset=yes
379 1.15 mrg fi
380 1.15 mrg egrep umask $i |
381 1.67 lukem awk '$2 ~ /^.$/ || $2 ~ /[^2367].$/ \
382 1.80 wiz { print "\tRoot umask is group writable" } \
383 1.67 lukem $2 ~ /[^2367]$/ \
384 1.80 wiz { print "\tRoot umask is other writable" }'
385 1.26 lukem SAVE_PATH=$PATH
386 1.26 lukem unset PATH
387 1.15 mrg /bin/sh << end-of-sh > /dev/null 2>&1
388 1.15 mrg . $i
389 1.26 lukem list=\`echo \$PATH | /usr/bin/sed -e \
390 1.26 lukem 's/^:/.:/;s/:$/:./;s/::/:.:/g;s/:/ /g'\`
391 1.15 mrg /bin/ls -ldgT \$list > $TMP1
392 1.9 cgd end-of-sh
393 1.76 atatat export PATH=$SAVE_PATH
394 1.15 mrg awk '{
395 1.15 mrg if ($10 ~ /^\.$/) {
396 1.27 lukem print "\tThe root path includes .";
397 1.15 mrg next;
398 1.15 mrg }
399 1.15 mrg }
400 1.15 mrg $1 ~ /^d....w/ \
401 1.80 wiz { print "\tRoot path directory " $10 " is group writable." } \
402 1.15 mrg $1 ~ /^d.......w/ \
403 1.80 wiz { print "\tRoot path directory " $10 " is other writable." }' \
404 1.67 lukem < $TMP1
405 1.9 cgd
406 1.15 mrg fi
407 1.67 lukem done > $OUTPUT
408 1.15 mrg if [ $umaskset = "no" -o -s $OUTPUT ] ; then
409 1.15 mrg printf "\nChecking root sh paths, umask values:\n$list\n"
410 1.15 mrg if [ -s $OUTPUT ]; then
411 1.15 mrg cat $OUTPUT
412 1.15 mrg fi
413 1.15 mrg if [ $umaskset = "no" ] ; then
414 1.27 lukem printf "\tRoot sh startup files do not set the umask.\n"
415 1.15 mrg fi
416 1.9 cgd fi
417 1.9 cgd fi
418 1.9 cgd
419 1.9 cgd # Root and uucp should both be in /etc/ftpusers.
420 1.32 lukem #
421 1.31 lukem if checkyesno check_ftpusers; then
422 1.28 lukem list="uucp "`awk '$2 == 0 { print $1 }' $MPBYUID`
423 1.27 lukem for i in $list; do
424 1.29 lukem if /usr/libexec/ftpd -C $i ; then
425 1.67 lukem printf "\t$i is not denied\n"
426 1.27 lukem fi
427 1.67 lukem done > $OUTPUT
428 1.28 lukem if [ -s $OUTPUT ]; then
429 1.28 lukem printf "\nChecking the /etc/ftpusers configuration:\n"
430 1.28 lukem cat $OUTPUT
431 1.28 lukem fi
432 1.9 cgd fi
433 1.9 cgd
434 1.43 itojun # Uudecode should not be in the /etc/mail/aliases file.
435 1.32 lukem #
436 1.31 lukem if checkyesno check_aliases; then
437 1.43 itojun for f in /etc/mail/aliases /etc/aliases; do
438 1.43 itojun if [ -f $f ] && egrep '^[^#]*(uudecode|decode).*\|' $f; then
439 1.43 itojun printf "\nEntry for uudecode in $f file.\n"
440 1.43 itojun fi
441 1.43 itojun done
442 1.9 cgd fi
443 1.9 cgd
444 1.9 cgd # Files that should not have + signs.
445 1.32 lukem #
446 1.31 lukem if checkyesno check_rhosts; then
447 1.15 mrg list="/etc/hosts.equiv /etc/hosts.lpd"
448 1.15 mrg for f in $list ; do
449 1.15 mrg if [ -f $f ] && egrep '\+' $f > /dev/null ; then
450 1.15 mrg printf "\nPlus sign in $f file.\n"
451 1.15 mrg fi
452 1.15 mrg done
453 1.15 mrg
454 1.15 mrg # Check for special users with .rhosts files. Only root and toor should
455 1.16 mikel # have .rhosts files. Also, .rhosts files should not have plus signs.
456 1.15 mrg awk -F: '$1 != "root" && $1 != "toor" && \
457 1.15 mrg ($3 < 100 || $1 == "ftp" || $1 == "uucp") \
458 1.20 mycroft { print $1 " " $9 }' $MP |
459 1.19 mycroft sort -k2 |
460 1.15 mrg while read uid homedir; do
461 1.15 mrg if [ -f ${homedir}/.rhosts ] ; then
462 1.15 mrg rhost=`ls -ldgT ${homedir}/.rhosts`
463 1.46 christos printf -- "$uid: $rhost\n"
464 1.15 mrg fi
465 1.15 mrg done > $OUTPUT
466 1.15 mrg if [ -s $OUTPUT ] ; then
467 1.15 mrg printf "\nChecking for special users with .rhosts files.\n"
468 1.15 mrg cat $OUTPUT
469 1.15 mrg fi
470 1.15 mrg
471 1.15 mrg while read uid homedir; do
472 1.35 fair if [ -f ${homedir}/.rhosts -a -r ${homedir}/.rhosts ] && \
473 1.41 christos cat -f ${homedir}/.rhosts | egrep '\+' > /dev/null ; then
474 1.46 christos printf -- "$uid: + in .rhosts file.\n"
475 1.15 mrg fi
476 1.29 lukem done < $MPBYPATH > $OUTPUT
477 1.15 mrg if [ -s $OUTPUT ] ; then
478 1.15 mrg printf "\nChecking .rhosts files syntax.\n"
479 1.15 mrg cat $OUTPUT
480 1.15 mrg fi
481 1.9 cgd fi
482 1.9 cgd
483 1.9 cgd # Check home directories. Directories should not be owned by someone else
484 1.80 wiz # or writable.
485 1.32 lukem #
486 1.31 lukem if checkyesno check_homes; then
487 1.85 jhawk checkyesno check_homes_permit_usergroups && \
488 1.85 jhawk permit_usergroups=1 || permit_usergroups=0
489 1.15 mrg while read uid homedir; do
490 1.15 mrg if [ -d ${homedir}/ ] ; then
491 1.15 mrg file=`ls -ldgT ${homedir}`
492 1.46 christos printf -- "$uid $file\n"
493 1.9 cgd fi
494 1.29 lukem done < $MPBYPATH |
495 1.85 jhawk awk -v "usergroups=$permit_usergroups" '
496 1.85 jhawk $1 != $4 && $4 != "root" \
497 1.15 mrg { print "user " $1 " home directory is owned by " $4 }
498 1.101 jnemeth $2 ~ /^d....w/ && (!usergroups || $5 != $1) \
499 1.80 wiz { print "user " $1 " home directory is group writable" }
500 1.101 jnemeth $2 ~ /^d.......w/ \
501 1.80 wiz { print "user " $1 " home directory is other writable" }' \
502 1.27 lukem > $OUTPUT
503 1.15 mrg if [ -s $OUTPUT ] ; then
504 1.15 mrg printf "\nChecking home directories.\n"
505 1.15 mrg cat $OUTPUT
506 1.15 mrg fi
507 1.15 mrg
508 1.15 mrg # Files that should not be owned by someone else or readable.
509 1.67 lukem list=".Xauthority .netrc .ssh/id_dsa .ssh/id_rsa .ssh/identity"
510 1.15 mrg while read uid homedir; do
511 1.15 mrg for f in $list ; do
512 1.15 mrg file=${homedir}/${f}
513 1.15 mrg if [ -f $file ] ; then
514 1.46 christos printf -- "$uid $f `ls -ldgT $file`\n"
515 1.15 mrg fi
516 1.15 mrg done
517 1.29 lukem done < $MPBYPATH |
518 1.85 jhawk awk -v "usergroups=$permit_usergroups" '
519 1.85 jhawk $1 != $5 && $5 != "root" \
520 1.15 mrg { print "user " $1 " " $2 " file is owned by " $5 }
521 1.85 jhawk $3 ~ /^-...r/ && (!usergroups || $6 != $1) \
522 1.15 mrg { print "user " $1 " " $2 " file is group readable" }
523 1.15 mrg $3 ~ /^-......r/ \
524 1.15 mrg { print "user " $1 " " $2 " file is other readable" }
525 1.85 jhawk $3 ~ /^-....w/ && (!usergroups || $6 != $1) \
526 1.80 wiz { print "user " $1 " " $2 " file is group writable" }
527 1.15 mrg $3 ~ /^-.......w/ \
528 1.80 wiz { print "user " $1 " " $2 " file is other writable" }' \
529 1.27 lukem > $OUTPUT
530 1.15 mrg
531 1.80 wiz # Files that should not be owned by someone else or writable.
532 1.19 mycroft list=".bash_history .bash_login .bash_logout .bash_profile .bashrc \
533 1.79 elric .cshrc .emacs .exrc .forward .history .k5login .klogin .login \
534 1.79 elric .logout .profile .qmail .rc_history .rhosts .shosts ssh .tcshrc \
535 1.79 elric .twmrc .xinitrc .xsession .ssh/authorized_keys \
536 1.79 elric .ssh/authorized_keys2 .ssh/config .ssh/id_dsa.pub \
537 1.79 elric .ssh/id_rsa.pub .ssh/identity.pub .ssh/known_hosts \
538 1.79 elric .ssh/known_hosts2"
539 1.15 mrg while read uid homedir; do
540 1.15 mrg for f in $list ; do
541 1.15 mrg file=${homedir}/${f}
542 1.15 mrg if [ -f $file ] ; then
543 1.46 christos printf -- "$uid $f `ls -ldgT $file`\n"
544 1.15 mrg fi
545 1.15 mrg done
546 1.29 lukem done < $MPBYPATH |
547 1.85 jhawk awk -v "usergroups=$permit_usergroups" '
548 1.85 jhawk $1 != $5 && $5 != "root" \
549 1.15 mrg { print "user " $1 " " $2 " file is owned by " $5 }
550 1.85 jhawk $3 ~ /^-....w/ && (!usergroups || $6 != $1) \
551 1.80 wiz { print "user " $1 " " $2 " file is group writable" }
552 1.15 mrg $3 ~ /^-.......w/ \
553 1.80 wiz { print "user " $1 " " $2 " file is other writable" }' \
554 1.27 lukem >> $OUTPUT
555 1.15 mrg if [ -s $OUTPUT ] ; then
556 1.15 mrg printf "\nChecking dot files.\n"
557 1.15 mrg cat $OUTPUT
558 1.15 mrg fi
559 1.9 cgd fi
560 1.9 cgd
561 1.9 cgd # Mailboxes should be owned by user and unreadable.
562 1.32 lukem #
563 1.31 lukem if checkyesno check_varmail; then
564 1.86 jhawk ls -lA /var/mail | \
565 1.63 lukem awk ' NR == 1 { next; }
566 1.86 jhawk $9 ~ /^\./ {next; }
567 1.63 lukem $3 != $9 {
568 1.63 lukem print "user " $9 " mailbox is owned by " $3
569 1.63 lukem }
570 1.63 lukem $1 != "-rw-------" {
571 1.63 lukem print "user " $9 " mailbox is " $1 ", group " $4
572 1.63 lukem }' > $OUTPUT
573 1.15 mrg if [ -s $OUTPUT ] ; then
574 1.15 mrg printf "\nChecking mailbox ownership.\n"
575 1.15 mrg cat $OUTPUT
576 1.15 mrg fi
577 1.15 mrg fi
578 1.15 mrg
579 1.32 lukem # NFS exports shouldn't be globally exported
580 1.32 lukem #
581 1.32 lukem if checkyesno check_nfs && [ -f /etc/exports ]; then
582 1.32 lukem awk '{
583 1.22 lukem # ignore comments and blank lines
584 1.39 hubertf if ($0 ~ /^\#/ || $0 ~ /^$/ )
585 1.22 lukem next;
586 1.100 tron # manage line continuation
587 1.100 tron while ($NF ~ /^\\$/) {
588 1.100 tron $NF = "";
589 1.100 tron line = $0 "";
590 1.100 tron getline;
591 1.100 tron $0 = line $0 "";
592 1.100 tron }
593 1.22 lukem
594 1.100 tron delete dir;
595 1.100 tron readonly = ndir = 0;
596 1.100 tron for (i = 1; i <= NF; ++i) {
597 1.100 tron if ($i ~ /^\//) dir[ndir++] = $i;
598 1.100 tron else if ($i ~ /^-/) {
599 1.100 tron if ($i ~ /^-(ro|o)$/) readonly = 1;
600 1.100 tron if ($i ~ /^-network/) next;
601 1.100 tron }
602 1.100 tron else next;
603 1.15 mrg }
604 1.15 mrg if (readonly)
605 1.100 tron for (item in dir)
606 1.100 tron rodir[nrodir++] = dir[item];
607 1.15 mrg else
608 1.100 tron for (item in dir)
609 1.100 tron rwdir[nrwdir++] = dir[item];
610 1.100 tron
611 1.100 tron }
612 1.100 tron
613 1.100 tron END {
614 1.100 tron if (nrodir) {
615 1.100 tron printf("Globally exported file system%s, read-only:\n",
616 1.100 tron nrodir > 1 ? "s" : "");
617 1.100 tron for (item in rodir)
618 1.100 tron printf("\t%s\n", rodir[item]);
619 1.100 tron }
620 1.100 tron if (nrwdir) {
621 1.100 tron printf("Globally exported file system%s, read-write:\n",
622 1.100 tron nrwdir > 1 ? "s" : "");
623 1.100 tron for (item in rwdir)
624 1.100 tron printf("\t%s\n", rwdir[item]);
625 1.100 tron }
626 1.32 lukem }' < /etc/exports > $OUTPUT
627 1.32 lukem if [ -s $OUTPUT ] ; then
628 1.15 mrg printf "\nChecking for globally exported file systems.\n"
629 1.15 mrg cat $OUTPUT
630 1.15 mrg fi
631 1.9 cgd fi
632 1.9 cgd
633 1.9 cgd # Display any changes in setuid files and devices.
634 1.32 lukem #
635 1.31 lukem if checkyesno check_devices; then
636 1.28 lukem > $ERR
637 1.92 erh (
638 1.98 lukem
639 1.98 lukem # Convert check_devices_ignore_fstypes="foo !bar bax"
640 1.98 lukem # into "-fstype foo -o ! -fstype bar -o -fstype bax"
641 1.98 lukem # and check_devices_ignore_paths="/foo !/bar /bax"
642 1.98 lukem # into " -path /foo -o ! -path /bar -o -path /bax"
643 1.98 lukem #
644 1.98 lukem ignexpr=$(\
645 1.98 lukem echo $check_devices_ignore_fstypes | \
646 1.98 lukem sed -e's/\(!*\)\([^[:space:]]\{1,\}\)/-o \1 -fstype \2/g' ; \
647 1.98 lukem echo $check_devices_ignore_paths | \
648 1.98 lukem sed -e's/\(!*\)\([^[:space:]]\{1,\}\)/-o \1 -path \2/g' \
649 1.98 lukem )
650 1.98 lukem
651 1.98 lukem # Massage the expression into ( $ignexpr ) -a -prune -o
652 1.98 lukem if [ -n "${ignexpr}" ]; then
653 1.98 lukem ignexpr=$(\
654 1.98 lukem echo $ignexpr | \
655 1.98 lukem sed -e 's/^-o /( /' \
656 1.98 lukem -e 's/$/ ) -a -prune -o/' \
657 1.98 lukem )
658 1.98 lukem fi
659 1.98 lukem
660 1.98 lukem find / $ignexpr \
661 1.21 mycroft \( \( -perm -u+s -a ! -type d \) -o \
662 1.21 mycroft \( -perm -g+s -a ! -type d \) -o \
663 1.24 lukem -type b -o -type c \) -print0 | \
664 1.98 lukem xargs -0 ls -ldgTq | sort +9 > $LIST
665 1.98 lukem
666 1.98 lukem ) 2> $OUTPUT
667 1.15 mrg
668 1.15 mrg # Display any errors that occurred during system file walk.
669 1.15 mrg if [ -s $OUTPUT ] ; then
670 1.28 lukem printf "Setuid/device find errors:\n" >> $ERR
671 1.28 lukem cat $OUTPUT >> $ERR
672 1.28 lukem printf "\n" >> $ERR
673 1.15 mrg fi
674 1.15 mrg
675 1.15 mrg # Display any changes in the setuid file list.
676 1.15 mrg egrep -v '^[bc]' $LIST > $TMP1
677 1.15 mrg if [ -s $TMP1 ] ; then
678 1.15 mrg # Check to make sure uudecode isn't setuid.
679 1.15 mrg if grep -w uudecode $TMP1 > /dev/null ; then
680 1.28 lukem printf "\nUudecode is setuid.\n" >> $ERR
681 1.15 mrg fi
682 1.15 mrg
683 1.67 lukem file=$work_dir/setuid
684 1.67 lukem migrate_file "$backup_dir/setuid" "$file"
685 1.67 lukem CUR=${file}.current
686 1.67 lukem BACK=${file}.backup
687 1.15 mrg if [ -s $CUR ] ; then
688 1.15 mrg if cmp -s $CUR $TMP1 ; then
689 1.15 mrg :
690 1.15 mrg else
691 1.15 mrg > $TMP2
692 1.15 mrg join -110 -210 -v2 $CUR $TMP1 > $OUTPUT
693 1.15 mrg if [ -s $OUTPUT ] ; then
694 1.28 lukem printf "Setuid additions:\n" >> $ERR
695 1.28 lukem tee -a $TMP2 < $OUTPUT >> $ERR
696 1.28 lukem printf "\n" >> $ERR
697 1.15 mrg fi
698 1.15 mrg
699 1.15 mrg join -110 -210 -v1 $CUR $TMP1 > $OUTPUT
700 1.15 mrg if [ -s $OUTPUT ] ; then
701 1.28 lukem printf "Setuid deletions:\n" >> $ERR
702 1.28 lukem tee -a $TMP2 < $OUTPUT >> $ERR
703 1.28 lukem printf "\n" >> $ERR
704 1.15 mrg fi
705 1.15 mrg
706 1.20 mycroft sort -k10 $TMP2 $CUR $TMP1 | \
707 1.27 lukem sed -e 's/[ ][ ]*/ /g' | \
708 1.27 lukem uniq -u > $OUTPUT
709 1.15 mrg if [ -s $OUTPUT ] ; then
710 1.28 lukem printf "Setuid changes:\n" >> $ERR
711 1.28 lukem column -t $OUTPUT >> $ERR
712 1.28 lukem printf "\n" >> $ERR
713 1.15 mrg fi
714 1.9 cgd
715 1.52 atatat backup_file update $TMP1 $CUR $BACK
716 1.9 cgd fi
717 1.15 mrg else
718 1.28 lukem printf "Setuid additions:\n" >> $ERR
719 1.28 lukem column -t $TMP1 >> $ERR
720 1.28 lukem printf "\n" >> $ERR
721 1.52 atatat backup_file add $TMP1 $CUR $BACK
722 1.9 cgd fi
723 1.15 mrg fi
724 1.15 mrg
725 1.27 lukem # Check for block and character disk devices that are readable or
726 1.80 wiz # writable or not owned by root.operator.
727 1.15 mrg >$TMP1
728 1.61 lukem DISKLIST="ccd ch hk hp ld md ra raid rb rd rl rx \
729 1.57 simonb sd se ss uk up vnd wd xd xy"
730 1.27 lukem # DISKLIST="$DISKLIST ct mt st wt"
731 1.15 mrg for i in $DISKLIST; do
732 1.15 mrg egrep "^b.*/${i}[0-9][0-9]*[a-p]$" $LIST >> $TMP1
733 1.15 mrg egrep "^c.*/r${i}[0-9][0-9]*[a-p]$" $LIST >> $TMP1
734 1.15 mrg done
735 1.15 mrg
736 1.15 mrg awk '$3 != "root" || $4 != "operator" || $1 !~ /.rw-r-----/ \
737 1.25 lukem { printf "Disk %s is user %s, group %s, permissions %s.\n", \
738 1.25 lukem $11, $3, $4, $1; }' < $TMP1 > $OUTPUT
739 1.15 mrg if [ -s $OUTPUT ] ; then
740 1.28 lukem printf "\nChecking disk ownership and permissions.\n" >> $ERR
741 1.28 lukem cat $OUTPUT >> $ERR
742 1.28 lukem printf "\n" >> $ERR
743 1.9 cgd fi
744 1.9 cgd
745 1.15 mrg # Display any changes in the device file list.
746 1.20 mycroft egrep '^[bc]' $LIST | sort -k11 > $TMP1
747 1.15 mrg if [ -s $TMP1 ] ; then
748 1.67 lukem file=$work_dir/device
749 1.67 lukem migrate_file "$backup_dir/device" "$file"
750 1.67 lukem CUR=${file}.current
751 1.67 lukem BACK=${file}.backup
752 1.15 mrg
753 1.15 mrg if [ -s $CUR ] ; then
754 1.15 mrg if cmp -s $CUR $TMP1 ; then
755 1.15 mrg :
756 1.15 mrg else
757 1.15 mrg > $TMP2
758 1.15 mrg join -111 -211 -v2 $CUR $TMP1 > $OUTPUT
759 1.15 mrg if [ -s $OUTPUT ] ; then
760 1.28 lukem printf "Device additions:\n" >> $ERR
761 1.28 lukem tee -a $TMP2 < $OUTPUT >> $ERR
762 1.28 lukem printf "\n" >> $ERR
763 1.15 mrg fi
764 1.15 mrg
765 1.15 mrg join -111 -211 -v1 $CUR $TMP1 > $OUTPUT
766 1.15 mrg if [ -s $OUTPUT ] ; then
767 1.28 lukem printf "Device deletions:\n" >> $ERR
768 1.28 lukem tee -a $TMP2 < $OUTPUT >> $ERR
769 1.28 lukem printf "\n" >> $ERR
770 1.15 mrg fi
771 1.15 mrg
772 1.27 lukem # Report any block device change. Ignore
773 1.27 lukem # character devices, only the name is
774 1.27 lukem # significant.
775 1.15 mrg cat $TMP2 $CUR $TMP1 | \
776 1.27 lukem sed -e '/^c/d' | \
777 1.27 lukem sort -k11 | \
778 1.27 lukem sed -e 's/[ ][ ]*/ /g' | \
779 1.27 lukem uniq -u > $OUTPUT
780 1.15 mrg if [ -s $OUTPUT ] ; then
781 1.28 lukem printf "Block device changes:\n" >> $ERR
782 1.28 lukem column -t $OUTPUT >> $ERR
783 1.28 lukem printf "\n" >> $ERR
784 1.15 mrg fi
785 1.9 cgd
786 1.52 atatat backup_file update $TMP1 $CUR $BACK
787 1.9 cgd fi
788 1.15 mrg else
789 1.28 lukem printf "Device additions:\n" >> $ERR
790 1.28 lukem column -t $TMP1 >> $ERR
791 1.28 lukem printf "\n" >> $ERR
792 1.52 atatat backup_file add $TMP1 $CUR $BACK >> $ERR
793 1.9 cgd fi
794 1.28 lukem fi
795 1.28 lukem if [ -s $ERR ] ; then
796 1.28 lukem printf "\nChecking setuid files and devices:\n"
797 1.28 lukem cat $ERR
798 1.28 lukem printf "\n"
799 1.9 cgd fi
800 1.9 cgd fi
801 1.9 cgd
802 1.9 cgd # Check special files.
803 1.9 cgd # Check system binaries.
804 1.9 cgd #
805 1.9 cgd # Create the mtree tree specifications using:
806 1.67 lukem # mtree -cx -pDIR -kmd5,uid,gid,mode,nlink,size,link,time > DIR.secure
807 1.38 kleink # chown root:wheel DIR.secure
808 1.67 lukem # chmod u+r,go= DIR.secure
809 1.9 cgd #
810 1.9 cgd # Note, this is not complete protection against Trojan horsed binaries, as
811 1.9 cgd # the hacker can modify the tree specification to match the replaced binary.
812 1.9 cgd # For details on really protecting yourself against modified binaries, see
813 1.9 cgd # the mtree(8) manual page.
814 1.32 lukem #
815 1.31 lukem if checkyesno check_mtree; then
816 1.82 jhawk if checkyesno check_mtree_follow_symlinks; then
817 1.82 jhawk check_mtree_flags="-L"
818 1.82 jhawk else
819 1.82 jhawk check_mtree_flags=""
820 1.82 jhawk fi
821 1.91 lukem mtree -e -l -p / $check_mtree_flags -f $SPECIALSPEC 3>&1 >$OUTPUT 2>&3 |
822 1.87 jhawk grep -v '^mtree: dev/tty: Device not configured$' >&2
823 1.15 mrg if [ -s $OUTPUT ]; then
824 1.9 cgd printf "\nChecking special files and directories.\n"
825 1.9 cgd cat $OUTPUT
826 1.9 cgd fi
827 1.9 cgd
828 1.16 mikel for file in /etc/mtree/*.secure; do
829 1.16 mikel [ $file = '/etc/mtree/*.secure' ] && continue
830 1.9 cgd tree=`sed -n -e '3s/.* //p' -e 3q $file`
831 1.82 jhawk mtree $check_mtree_flags -f $file -p $tree > $TMP1
832 1.9 cgd if [ -s $TMP1 ]; then
833 1.67 lukem printf "\nChecking $tree:\n"
834 1.67 lukem cat $TMP1
835 1.9 cgd fi
836 1.67 lukem done > $OUTPUT
837 1.15 mrg if [ -s $OUTPUT ]; then
838 1.9 cgd printf "\nChecking system binaries:\n"
839 1.9 cgd cat $OUTPUT
840 1.9 cgd fi
841 1.9 cgd fi
842 1.9 cgd
843 1.32 lukem # Backup disklabels of available disks
844 1.32 lukem #
845 1.32 lukem if checkyesno check_disklabels; then
846 1.67 lukem # migrate old disklabels
847 1.67 lukem for file in `ls -1d $backup_dir/$backup_dir/disklabel.* \
848 1.67 lukem $backup_dir/disklabel.* 2>/dev/null`; do
849 1.67 lukem migrate_file "$file" "$work_dir/${file##*/}"
850 1.67 lukem done
851 1.67 lukem
852 1.103 tron # generate list of old disklabels, fdisks & wedges and remove them
853 1.103 tron ls -1d $work_dir/disklabel.* $work_dir/fdisk.* $work_dir/wedges.* 2>/dev/null |
854 1.52 atatat egrep -v '\.(backup|current)(,v)?$' > $LABELS
855 1.32 lukem xargs rm < $LABELS
856 1.32 lukem
857 1.103 tron # generate disklabels of all disks excluding: cd dk fd md st
858 1.103 tron disks=`iostat -x | awk 'NR > 1 && $1 !~ /^[cfm]d|dk|st|nfs/ { print $1; }'`
859 1.32 lukem for i in $disks; do
860 1.67 lukem disklabel $i > "$work_dir/disklabel.$i" 2>/dev/null
861 1.32 lukem done
862 1.32 lukem
863 1.67 lukem # if fdisk is available, generate fdisks for: ed ld sd wd
864 1.67 lukem if [ -x /sbin/fdisk ]; then
865 1.67 lukem disks=`iostat -x| awk 'NR > 1 && $1 ~ /^[elsw]d/ { print $1; }'`
866 1.67 lukem for i in $disks; do
867 1.67 lukem /sbin/fdisk $i > "$work_dir/fdisk.$i" 2>/dev/null
868 1.67 lukem done
869 1.67 lukem fi
870 1.67 lukem
871 1.103 tron # if dkctl is available, generate dkctl listwedges for: ed ld sd wd cgd ofdisk ra rl raid
872 1.103 tron if [ -x /sbin/dkctl ]; then
873 1.103 tron disks=`iostat -x| awk 'NR > 1 && $1 ~ /^[elsw]d|cgd|ofdisk|r[al]|raid/ { print $1; }'`
874 1.103 tron for i in $disks; do
875 1.103 tron /sbin/dkctl $i listwedges > "$work_dir/wedges.$i" 2>/dev/null
876 1.103 tron done
877 1.103 tron fi
878 1.103 tron
879 1.103 tron # append list of new disklabels, fdisks and wedges
880 1.103 tron ls -1d $work_dir/disklabel.* $work_dir/fdisk.* $work_dir/wedges.* 2>/dev/null |
881 1.52 atatat egrep -v '\.(backup|current)(,v)?$' >> $LABELS
882 1.62 atatat CHANGELIST="$LABELS $CHANGELIST"
883 1.62 atatat fi
884 1.62 atatat
885 1.62 atatat # Check for changes in the list of installed pkgs
886 1.62 atatat #
887 1.65 lukem if checkyesno check_pkgs && [ -d $pkgdb_dir ]; then
888 1.67 lukem pkgs=$work_dir/pkgs
889 1.67 lukem migrate_file "$backup_dir/pkgs" "$pkgs"
890 1.65 lukem ( cd $pkgdb_dir
891 1.62 atatat pkg_info | sort
892 1.62 atatat echo ""
893 1.62 atatat find . \( -name +REQUIRED_BY -o -name +CONTENTS \) -print0 |
894 1.72 lukem xargs -0 ls -ldgTq | sort -t. +1 | sed -e 's, \./, ,'
895 1.62 atatat ) > $pkgs
896 1.67 lukem echo "$pkgs" > $PKGS
897 1.62 atatat CHANGELIST="$PKGS $CHANGELIST"
898 1.32 lukem fi
899 1.32 lukem
900 1.67 lukem # List of files that get backed up and checked for any modifications.
901 1.9 cgd # Any changes cause the files to rotate.
902 1.32 lukem #
903 1.67 lukem if checkyesno check_changelist ; then
904 1.91 lukem mtree -D -k type -f $SPECIALSPEC -E exclude |
905 1.91 lukem sed '/^type=file/!d ; s/type=file \.//' | unvis > $CHANGEFILES
906 1.67 lukem
907 1.75 lukem (
908 1.68 lukem # Add other files which might dynamically exist:
909 1.67 lukem # /etc/ifconfig.*
910 1.67 lukem # /etc/raid*.conf
911 1.68 lukem # /etc/rc.d/*
912 1.67 lukem # /etc/rc.conf.d/*
913 1.68 lukem #
914 1.75 lukem echo "/etc/ifconfig.*"
915 1.75 lukem echo "/etc/raid*.conf"
916 1.75 lukem echo "/etc/rc.d/*"
917 1.75 lukem echo "/etc/rc.conf.d/*"
918 1.67 lukem
919 1.68 lukem # Add /etc/changelist
920 1.68 lukem #
921 1.75 lukem if [ -s /etc/changelist ]; then
922 1.75 lukem grep -v '^#' /etc/changelist
923 1.75 lukem fi
924 1.75 lukem ) | while read file; do
925 1.75 lukem case "$file" in
926 1.75 lukem *[\*\?\[]*) # If changelist line is a glob ...
927 1.75 lukem # ... expand possible backup files
928 1.75 lukem #
929 1.75 lukem ls -1d $(echo $backup_dir/${file}.current) 2>/dev/null \
930 1.75 lukem | sed "s,^$backup_dir/,, ; s,\.current$,,"
931 1.75 lukem
932 1.75 lukem # ... expand possible files
933 1.75 lukem #
934 1.75 lukem ls -1d $(echo $file) 2>/dev/null
935 1.75 lukem ;;
936 1.75 lukem *)
937 1.75 lukem # Otherwise, just print the filename
938 1.75 lukem echo $file
939 1.75 lukem ;;
940 1.75 lukem esac
941 1.75 lukem done >> $CHANGEFILES
942 1.67 lukem CHANGELIST="$CHANGEFILES $CHANGELIST"
943 1.67 lukem fi
944 1.67 lukem
945 1.67 lukem # Special case backups, including the master password file and
946 1.67 lukem # ssh private host keys. The normal backup mechanisms for
947 1.67 lukem # $check_changelist (see below) also print out the actual file
948 1.67 lukem # differences and we don't want to do that for these files
949 1.67 lukem #
950 1.67 lukem echo $MP > $TMP1 # always add /etc/master.passwd
951 1.91 lukem mtree -D -k type -f $SPECIALSPEC -I nodiff |
952 1.91 lukem sed '/^type=file/!d ; s/type=file \.//' | unvis >> $TMP1
953 1.73 lukem grep -v '^$' $TMP1 | sort -u > $TMP2
954 1.68 lukem
955 1.69 lukem while read file; do
956 1.67 lukem backup_and_diff "$file" no
957 1.69 lukem done < $TMP2
958 1.67 lukem
959 1.32 lukem
960 1.32 lukem if [ -n "$CHANGELIST" ]; then
961 1.73 lukem grep -h -v '^$' $CHANGELIST | sort -u > $TMP1
962 1.68 lukem comm -23 $TMP1 $TMP2 | while read file; do
963 1.67 lukem backup_and_diff "$file" yes
964 1.9 cgd done
965 1.44 ad fi
966 1.44 ad
967 1.44 ad if [ -f /etc/security.local ]; then
968 1.90 kim . /etc/security.local > $OUTPUT 2>&1
969 1.84 jhawk if [ -s $OUTPUT ] ; then
970 1.84 jhawk printf "\nRunning /etc/security.local:\n"
971 1.84 jhawk cat $OUTPUT
972 1.84 jhawk fi
973 1.9 cgd fi
974