To install a solaris 10 zone, run the script /etc/zone_config.sh.
If the script does not exist, copy the script below to /etc/zone_config.sh
The systax of the script is as follows:
/etc/zone_config.sh
To create a zone called testzone with ip-address 172.20.54.1 on nic bge2, that has metadevice d60 for the root filesystem of 200MB:
/etc/zone_config.sh testzone 172.20.54.1 bge2 d60 200m
On creation of the zone, two new softpartions will be created:
one for the root filesystem of the zone with a size as given by running the command
one for /var of the zone with a default size of 1GB
The softpartions will be created as d90x (/) and d93x (/var), where -x- is the zonenumber.
The zone will be configured as a LDAP client. A netgroup with the zonename will be added to the /etc/passwd.
The new netgroup must be created within LDAP, with the appropriate user access.
All unnecessary services like ftp,telnet,finger etc will be dissabled
A hobbit user will be created and hobbit will be started when the zone starts
#!/bin/ksh
#########################################################################
#
# Version 1.1
# Bart van der Putten
# July 2008
#
#########################################################################
#########################################################################
#
# Check free space within softpartion
#
#########################################################################
free() {
SIZE=`echo “${2}” | sed s/.$//`
let ROOT_SIZE=$SIZE
#echo “ROOT SIZE=$ROOT_SIZE”
CMD=`echo $2 | grep g`
if [ $? != 1 ]
then
let “ROOT_BLOCKS=$ROOT_SIZE * 1024 *2048”
else
let “ROOT_BLOCKS=$ROOT_SIZE * 2048”
fi
#echo “ROOT SIZE=$ROOT_BLOCKS”
TOTAL_SIZE=`metastat -c |grep $1 | grep m | awk ‘{print $3}’`
NUMBER=`echo “${TOTAL_SIZE}” | sed s/.$// | sed s/.$//`
let INT_NUMBER=$NUMBER
#echo “size of $1=$INT_NUMBER”
CMD=`echo “$TOTAL_SIZE” | grep GB`
if [ $? != 1 ]
then
BYTES=”GB”
let “BLOCKS=$INT_NUMBER * 1024 *2048″
else
BYTES=”MB”
let “BLOCKS=$INT_NUMBER * 2048”
fi
#echo “size of $1=$BLOCKS”
USED=0
for SIZE in `metastat -p | grep $1 | grep -v “\-m” | awk ‘{print $7}’`
do
let “USED=$USED + $SIZE”
#echo “USED=$USED”
done
let “TARGET_SIZE=$USED + $ROOT_BLOCKS + 2097152”
let “FREE=$BLOCKS – $USED”;
let “FREE_SIZE=$FREE / 2048”
if [ $TARGET_SIZE -ge $BLOCKS ]
then
echo “”
echo “Not sufficient diskspace in metadevice $1”
echo “Target size : $TARGET_SIZE blocks”
echo “”
echo “Total size $1 : $BLOCKS blocks”
echo “Used Space : $USED blocks”
echo “——————————————- -”
echo “Free Space : $FREE blocks ( $FREE_SIZE MB )”;
exit 1
fi
}
#########################################################################
#########################################################################
#
# Harden zone by disabeling services
#
#########################################################################
hardening() {
echo ”
# Hardening Server
/usr/sbin/svcadm disable svc:/network/ftp:default
/usr/sbin/svcadm disable svc:/network/telnet:default
/usr/sbin/svcadm disable svc:/network/login:rlogin
/usr/sbin/svcadm disable svc:/network/rpc/rusers:default
/usr/sbin/svcadm disable svc:/network/nfs/rquota:default
/usr/sbin/svcadm disable svc:/network/rpc/rstat:default
/usr/sbin/svcadm disable svc:/network/shell:default
/usr/sbin/svcadm disable svc:/network/finger:default
/usr/sbin/svcadm disable svc:/application/x11/xfs:default
/usr/sbin/svcadm disable svc:/network/rpc/smserver:default
/usr/sbin/svcadm disable svc:/network/rpc/gss:default
/usr/sbin/svcadm disable svc:/network/rpc-100235_1/rpc_ticotsord:default
/usr/sbin/svcadm disable svc:/application/print/cleanup:default
/usr/sbin/svcadm disable svc:/application/print/rfc1179:default
/usr/sbin/svcadm disable svc:/network/nfs/nlockmgr:default
/usr/sbin/svcadm disable svc:/network/nfs/status:default
/usr/sbin/svcadm disable svc:/network/nfs/client:default
/usr/sbin/svcadm disable svc:/application/font/stfsloader:default
/usr/sbin/svcadm disable svc:/application/font/fc-cache:default
/usr/sbin/svcadm disable svc:/application/cde-printinfo:default
/usr/sbin/svcadm disable svc:/network/rpc/cde-calendar-manager:default
/usr/sbin/svcadm disable svc:/network/rpc/cde-ttdbserver:tcp
/usr/sbin/svcadm disable svc:/network/cde-spc:default
/usr/sbin/svcadm disable svc:/application/graphical-login/cde-login:default
/usr/sbin/svcadm disable svc:/system/filesystem/volfs:default
/usr/sbin/svcadm disable svc:/application/management/snmpdx:default
/usr/sbin/svcadm disable svc:/application/management/seaport:default
/usr/sbin/svcadm disable svc:/application/management/sma:default
#
echo “LOG_FROM_REMOTE=NO” >> /etc/default/syslogd
/usr/sbin/svcadm restart svc:/system/system-log:default
# Enabeling LDAP
/usr/bin/cp /etc/nsswitch.conf.ldap /etc/nsswitch.conf
/usr/bin/cp /etc/resolv.conf.ldap /etc/resolv.conf
/usr/bin/cp /etc/pam.conf.ldap /etc/pam.conf
/usr/sbin/svcadm enable svc:/network/ldap/client:default
/usr/bin/mv /etc/rc3.d/S80hardening /etc/rc3.d/s80hardening” > /zones/$1/root/etc/rc3.d/S80hardening
}
#########################################################################
#########################################################################
#
# Configure zone as ldap client
#
#########################################################################
add_ldap() {
echo “—–BEGIN CERTIFICATE—–
MIICXjCCAcegAwIBAgIBADANBgkqhkiG9w0BAQUFADAvMQswCQYDVQQGEwJubDET
MBEGA1UEChMKQXQgSG9tZSBDQTELMAkGA1UEAxMCQ0EwHhcNMDgwNzMwMDk0NjIz
WhcNMTgwNzI4MDk0NjIzWjAvMQswCQYDVQQGEwJubDETMBEGA1UEChMKQXQgSG9t
ZSBDQTELMAkGA1UEAxMCQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMEg
7eKiSHGdX7ZYAP+1j3UV5E7v+hTN8rqZoiSxZflkbA+vlmP05tVS+jpbGRSDDB8N
2bA+uS3Qqzuc0xVxTMLZiTjZC9wNitofqRtbldT4SCkASyx5U1lOxH/09fZuyJGI
vURe9/K7mRW1hr1WkFOxUFVFElxLXT/ms3phM9o3AgMBAAGjgYkwgYYwHQYDVR0O
BBYEFE1JlMgNGxLEHVMVdzMoWxGcAmtgMFcGA1UdIwRQME6AFE1JlMgNGxLEHVMV
dzMoWxGcAmtgoTOkMTAvMQswCQYDVQQGEwJubDETMBEGA1UEChMKQXQgSG9tZSBD
QTELMAkGA1UEAxMCQ0GCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOB
gQBObw306RHCAX63Dd1XCLxpHO3Pw3LK6f+8Jkeg8eomX591r8rVwtiy8iPkSiE9
xVyGg62K40UhJ3Rtb/9vXzDxui/MoDwo1v3S9SHhmPtJcX6CMsB1VVFqOLlgmPw0
3uAY3Ns712fif6faXY/RCo9a8aBH4pUwCbNzBco+c99Q7w==
—–END CERTIFICATE—–” > /tmp/cacert.pem
/usr/sbin/mount /dev/md/dsk/d93$MYZONE /zones/$1/root/var
/usr/sfw/bin/certutil -N -d /zones/$1/root/var/ldap
/usr/sfw/bin/certutil -A -n “ca-cert” -i /tmp/cacert.pem -a -t CT -d /zones/$1/root/var/ldap
/usr/bin/chmod 644 /zones/$1/root/var/ldap/*.db
/usr/bin/cp /var/ldap/ldap_client_cred /zones/$1/root/var/ldap
/usr/bin/cp /var/ldap/ldap_client_file /zones/$1/root/var/ldap
/usr/bin/cp /etc/nsswitch.conf /zones/$1/root/etc/nsswitch.conf.ldap
/usr/bin/cp /etc/resolv.conf /zones/$1/root/etc/resolv.conf.ldap
/usr/bin/cp /etc/pam.conf /zones/$1/root/etc/pam.conf.ldap
/usr/bin/cp /tmp/sysidcfg /zones/$1/root/etc/sysidcfg
/usr/bin/touch /zones/$1/root/etc/.NFSinst_state.domain
echo “+@$1:x:::::” >> /zones/$1/root/etc/passwd
echo “+@$1:x:::::::” >> /zones/$1/root/etc/shadow
/usr/sbin/umount /zones/$1/root/var
}
#########################################################################
#########################################################################
#
# Add hobbit user to zone if nessecary
#
#########################################################################
add_hobbit_user() {
cat /zones/$1/root/etc/passwd |grep hobbit
if [ $? != 0 ]
then
echo “Adding hobbit user”
cat /etc/passwd | grep hobbit >> /zones/$1/root/etc/passwd
cat /etc/shadow | grep hobbit >> /zones/$1/root/etc/shadow
cat /etc/group | grep hobbit >> /zones/$1/root/etc/group
fi
}
#########################################################################
#########################################################################
#
# Create a sysidcfg file
#
#########################################################################
create_sysidcfg() {
MASK=`ifconfig $3 | grep netmask | awk ‘{print $4}’`
TMP=`echo $MASK | sed ‘s/../ 0x&/g’`
NETMASK=`printf “%d.%d.%d.%d\n” $TMP`
echo “system_locale=C
timezone=MET
network_interface=primary {hostname=$1
ip_address=$2
netmask=$NETMASK
protocol_ipv6=no }
nfs4_domain=dynamic
terminal=vt100
security_policy=NONE
name_service=NONE
root_password=GIT.TWNm8fMh6” > /tmp/sysidcfg
}
##########################################################################
##########################################################################
#
# MAIN
#
##########################################################################
PATH=/usr/sbin:/usr/bin
export PATH
if [ “$1” = “” ] || [ “$2” = “” ] || [ “$3” = “” ] || [ “$4” = “” ] || [ “$5” = “” ]
then
echo “Usage $0 { zonename ip-address interface metadevice size}”
else
ip_test1=`echo “$2” | tr ‘.’ ‘ ‘`
ip_test2=`echo “$2” | egrep ‘^[0-9.][0-9.]*$’`
ip_test3=`echo “$2” | tr ‘.’ ‘ ‘ | wc -w`
for x in $ip_test1 1
do
if [ ! “$ip_test2” ] || [ “$x” -gt 255 ] || [ “$ip_test3” -gt 4 ] || [ “$ip_test3” -lt 3 ]
then
echo “Not a valid ip address”
exit 1
fi
done
echo “”
echo “$5” | grep -v b | grep -v B| grep “[1-9]*[0-9][m|g]”
if [ $? = 0 ]
then
echo “Root filesystem of $5 will be created”
else
echo “Please enter number of megabytes or gigabytes (e.g. 200m or 2g)”
exit 1
fi
########
#
# Create zone $1 with ip address $2 on interface $3
#
########
`/usr/sbin/metastat -p $4 >/dev/null 2>&1 `
if [ $? != 0 ]
then
echo “Missing metadevice $4 this is a prerequisite.”
exit 1
fi
free $4 $5
LASTZONE=`/usr/sbin/metastat -p|grep d90|grep $4|sort|tail -1|awk {‘print $1’}|sed ‘s/d90//’`
if [ -z $LASTZONE ]
then
LASTZONE=0
fi
MYZONE=`expr $LASTZONE + 1`
echo “”
echo “Create zone $1 with ip addres $2 on interface $3. This will be zone number $MYZONE on this system (on $4 – $5B). (y/n): ”
read ok
case “$ok” in
‘y’ | ‘Y’) # start configuration
mkdir -p /zones/$1
metainit d90$MYZONE -p $4 $5 # Creating Zone / filesystem
metainit d93$MYZONE -p $4 1g # Creating Zone /var filesystem
newfs -m1 /dev/md/rdsk/d90$MYZONE
newfs -m1 /dev/md/rdsk/d93$MYZONE
echo “/dev/md/dsk/d90$MYZONE /dev/md/rdsk/d90$MYZONE /zones/$1 ufs 2 yes -” >> /etc/vfstab
mount /zones/$1
chmod -R g-rx /zones/$1
chmod -R o-rx /zones/$1
echo “Creating SysIdCfg….”
create_sysidcfg $1 $2 $3
echo “Creating zone cfg file….”
echo ”
create -b
set zonepath=/zones/$1
set autoboot=true
add net
set physical=$3
set address=$2
end
add inherit-pkg-dir
set dir=/lib
end
add inherit-pkg-dir
set dir=/platform
end
add inherit-pkg-dir
set dir=/sbin
end
add inherit-pkg-dir
set dir=/usr
end
add fs
set dir=/var
set special=/dev/md/dsk/d93$MYZONE
set raw=/dev/md/rdsk/d93$MYZONE
set type=ufs
add options logging
end
add fs
set dir=/home
set special=/export/home
set type=lofs
end
” > /tmp/$1.cfg
echo “Creating zone with command:”
echo “zonecfg -z $1 -f $1.cfg”
/usr/sbin/zonecfg -z $1 -f /tmp/$1.cfg
echo “”
echo “=================================================
echo “”
Zone Configurations Finished ”
echo “Verifying Zone $1”
echo “”
zoneadm -z $1 verify
if [ $? = 0 ]
then
echo “Installing Zone $1”
zoneadm -z $1 install
echo “Adding hobbit user ”
add_hobbit_user $1
echo “Adding LDAP stuff ”
add_ldap $1
echo “Harding zone $1”
hardening $1
echo “”
echo “Booting Zone $1”
echo “”
zoneadm -z $1 boot
fi
zoneadm -z $1 verify
if [ $? = 0 ]
then
zlogin -C $1
fi
;;
*) echo “Aborting Zone creation”
exit 1
;;
esac
exit 0
fi