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