#! /bin/sh # # Copyright 2007 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # # ident "@(#)bsmconv.sh 1.31 07/10/17 SMI" # PROG=bsmconv STARTUP=/etc/security/audit_startup DEVALLOC=/etc/security/device_allocate DEVMAPS=/etc/security/device_maps TEXTDOMAIN="SUNW_OST_OSCMD" export TEXTDOMAIN # Perform required permission checks, depending on value of LOCAL_ROOT # (whether we are converting the active OS or just alternative boot # environments). permission() { ZONE=`/sbin/zonename` if [ ! "$ZONE" = "global" -a "$LOCAL_ROOT" = "true" ] then form=`gettext "%s: ERROR: you must be in the global zone to run this script."` printf "${form}\n" $PROG exit 1 fi WHO=`id | cut -f1 -d" "` if [ ! "$WHO" = "uid=0(root)" ] then form=`gettext "%s: ERROR: you must be super-user to run this script."` printf "${form}\n" $PROG exit 1 fi RESP="x" while [ "$RESP" != `gettext "y"` -a "$RESP" != `gettext "n"` ] do gettext "This script is used to enable the Basic Security Module (BSM).\n" form=`gettext "Shall we continue with the conversion now? [y/n]"` echo "$form \c" read RESP done if [ "$RESP" = `gettext "n"` ] then form=`gettext "%s: INFO: aborted, due to user request."` printf "${form}\n" $PROG exit 2 fi } # Do some sanity checks to see if the arguments to bsmconv # are, in fact, root directories for clients. sanity_check() { for ROOT in $@ do if [ -d $ROOT -a -w $ROOT -a -f $ROOT/etc/system -a -d $ROOT/usr ] then # There is a root directory to write to, # so we can potentially complete the conversion. : else form=`gettext "%s: ERROR: %s doesn't look like a client's root."` printf "${form}\n" $PROG $ROOT form=`gettext "%s: ABORTED: nothing done."` printf "${form}\n" $PROG exit 4 fi done } # bsmconvert # All the real work gets done in this function bsmconvert() { # If there is no startup file to be read by /lib/svc/method/svc-auditd, # then gripe about it. form=`gettext "%s: INFO: checking startup file."` printf "${form}\n" $PROG if [ ! -f ${ROOT}/${STARTUP} ] then form=`gettext "%s: ERROR: no %s file."` printf "${form}\n" $PROG $STARTUP form=`gettext "%s: Continuing ..."` printf "${form}\n" $PROG fi # Disable volume manager from running on reboot. cat >> ${ROOT}/var/svc/profile/upgrade < \ ${ROOT}/etc/security/spool/vold.state # Turn on auditing in the loadable module form=`gettext "%s: INFO: turning on audit module."` printf "${form}\n" $PROG if [ ! -f ${ROOT}/etc/system ] then echo "" > ${ROOT}/etc/system fi grep -v "c2audit:audit_load" ${ROOT}/etc/system > /tmp/etc.system.$$ echo "set c2audit:audit_load = 1" >> /tmp/etc.system.$$ mv /tmp/etc.system.$$ ${ROOT}/etc/system grep "set c2audit:audit_load = 1" ${ROOT}/etc/system > /dev/null 2>&1 if [ $? -ne 0 ] then form=`gettext "%s: ERROR: cannot 'set c2audit:audit_load = 1' in %s/etc/system"` printf "${form}\n" $PROG $ROOT form=`gettext "%s: Continuing ..."` printf "${form}\n" $PROG fi # Initialize device allocation form=`gettext "%s: INFO: initializing device allocation."` printf "${form}\n" $PROG # Need to determine if Trusted Extensions is enabled. This is tricky # because we need to know if TX will be active on the boot following # bsmconv. Check the setting in etc/system (other methods won't work # because TX is likely not yet fully active.) # grep "^[ ]*set[ ][ ]*sys_labeling[ ]*=[ ]*1" \ $ROOT/etc/system > /dev/null 2>&1 if [ $? = 0 ]; then # Trusted Extensions is enabled (but possibly not yet booted). # This is not currently done for alternate boot environments. if [ -z "$ROOT" -o "$ROOT" = "/" ] then /usr/sbin/devfsadm -e fi else if [ ! -f ${ROOT}/${DEVALLOC} ] then mkdevalloc > ${ROOT}/$DEVALLOC fi if [ ! -f ${ROOT}/${DEVMAPS} ] then mkdevmaps > ${ROOT}/$DEVMAPS fi fi # enable auditd at next boot. cat >> ${ROOT}/var/svc/profile/upgrade <