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