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