309 lines
13 KiB
Bash
309 lines
13 KiB
Bash
|
#!/bin/bash
|
||
|
# vim: dict+=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
#
|
||
|
# runtest.sh of /CoreOS/krb5/Sanity/inplace-upgrade-sanity-test
|
||
|
# Description: Verifies basic scenarios which should work after inplace upgrade.
|
||
|
# Author: Patrik Kis <pkis@redhat.com>
|
||
|
#
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
#
|
||
|
# Copyright (c) 2014 Red Hat, Inc.
|
||
|
#
|
||
|
# This copyrighted material is made available to anyone wishing
|
||
|
# to use, modify, copy, or redistribute it subject to the terms
|
||
|
# and conditions of the GNU General Public License version 2.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be
|
||
|
# useful, but WITHOUT ANY WARRANTY; without even the implied
|
||
|
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
# PURPOSE. See the GNU General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public
|
||
|
# License along with this program; if not, write to the Free
|
||
|
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
|
# Boston, MA 02110-1301, USA.
|
||
|
#
|
||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
|
||
|
# Include Beaker environment
|
||
|
. /usr/bin/rhts-environment.sh
|
||
|
. /usr/share/beakerlib/beakerlib.sh || exit 1
|
||
|
|
||
|
PACKAGE="krb5"
|
||
|
PACKAGES="krb5-libs krb5-server krb5-workstation openssh"
|
||
|
|
||
|
TEST_ENTROPY_SOURCE=${TEST_ENTROPY_SOURCE:-no}
|
||
|
echo TEST_ENTROPY_SOURCE=$TEST_ENTROPY_SOURCE
|
||
|
|
||
|
hostnamectl set-hostname test.fedora.com
|
||
|
|
||
|
host_ip=`hostname -I | awk '{print$1}'`
|
||
|
echo "$host_ip test.fedora.com" >> /etc/hosts
|
||
|
|
||
|
krb5REALM1='ZMRAZ.COM'
|
||
|
krb5REALM2='PKIS.NET'
|
||
|
krb5HostName=`hostname`
|
||
|
krb5DomainName='fedora.com'
|
||
|
krb5User='alice'
|
||
|
krb5UserPass='alice'
|
||
|
krb5UserKrbPass='aaa'
|
||
|
krb5User2='bob'
|
||
|
krb5User3='carl'
|
||
|
krb5KDCPass='qwe'
|
||
|
krb5RootPass='rrr'
|
||
|
|
||
|
krb5conf="/etc/krb5.conf"
|
||
|
krb5confdir="/etc/krb5.conf.d"
|
||
|
krb5kdcconf="/var/kerberos/krb5kdc/kdc.conf"
|
||
|
krb5kadmacl="/var/kerberos/krb5kdc/kadm5.acl"
|
||
|
|
||
|
rlJournalStart
|
||
|
rlPhaseStartSetup
|
||
|
for pkg in $PACKAGES; do
|
||
|
rlAssertRpm $pkg
|
||
|
done
|
||
|
rlRun "TmpDir=\$(mktemp -d)"
|
||
|
rlRun "pushd $TmpDir"
|
||
|
rlPhaseEnd
|
||
|
|
||
|
# Run this part on OLD and in "normal" mode
|
||
|
if [[ -z $IN_PLACE_UPGRADE || $IN_PLACE_UPGRADE == old ]]; then
|
||
|
rlPhaseStartSetup "KDC and kadmind setup"
|
||
|
# Stop and backup
|
||
|
rlRun "rlServiceStop kadmin krb5kdc"
|
||
|
rlRun "rm -f /var/kerberos/krb5kdc/principal* /var/kerberos/krb5kdc/.k5*"
|
||
|
rlFileBackup $krb5conf /var/kerberos/krb5kdc /etc/sysconfig/{kadmin,krb5kdc}
|
||
|
[ -e /etc/krb5.keytab ] && rlFileBackup /etc/krb5.keytab
|
||
|
[ -e $krb5confdir ] && rlFileBackup $krb5confdir
|
||
|
# Basic setup of KDC and krb5.conf
|
||
|
if rlIsRHEL 6; then
|
||
|
rlRun "sed -i \"s/EXAMPLE.COM/$krb5REALM1/\" $krb5conf"
|
||
|
rlRun "sed -i \"s/kerberos.example.com/$krb5HostName/\" $krb5conf"
|
||
|
rlRun "sed -i \"s/example.com/$krb5DomainName/\" $krb5conf"
|
||
|
else
|
||
|
rlRun "sed -i \"s/\[libdefaults\]/[libdefaults]\n default_realm = $krb5REALM1/\" $krb5conf"
|
||
|
rlRun "sed -i \"s/\[realms\]/[realms]\n $krb5REALM1 = {\n kdc = $krb5HostName\n admin_server = $krb5HostName\n }/\" $krb5conf"
|
||
|
rlRun "sed -i \"s/\[domain_realm\]/[domain_realm]\n .$krb5DomainName = $krb5REALM1\n $krb5DomainName = $krb5REALM1/\" $krb5conf"
|
||
|
fi
|
||
|
rlRun "sed -i s/EXAMPLE.COM/$krb5REALM1/ $krb5kdcconf"
|
||
|
# Configure the kadmin ACL
|
||
|
rlRun "echo \"*/master@$krb5REALM1 *\" > $krb5kadmacl"
|
||
|
# Configure the 2nd realmd
|
||
|
cat >>$krb5kdcconf <<_EOF
|
||
|
|
||
|
$krb5REALM2 = {
|
||
|
#master_key_type = aes256-cts
|
||
|
database_name = /var/kerberos/krb5kdc/principal.$krb5REALM1
|
||
|
acl_file = /var/kerberos/krb5kdc/kadm5.acl
|
||
|
dict_file = /usr/share/dict/words
|
||
|
admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
|
||
|
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
|
||
|
}
|
||
|
_EOF
|
||
|
rlIsRHEL 6 || rlRun "sed -i \"s/supported_enctypes.*/supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal/\" /var/kerberos/krb5kdc/kdc.conf"
|
||
|
rlRun "sed -i \"s/\[realms\]/[realms]\n $krb5REALM2 = {\n kdc = $krb5HostName\n admin_server = $krb5HostName\n }/\" $krb5conf"
|
||
|
cat >> $krb5conf << _EOF
|
||
|
|
||
|
[capaths]
|
||
|
$krb5REALM1 = {
|
||
|
$krb5REALM2 = .
|
||
|
}
|
||
|
_EOF
|
||
|
# Test the entropy source (not relevant for RHEL6)
|
||
|
if ! rlIsRHEL 6 && [[ $TEST_ENTROPY_SOURCE == 'yes' ]]; then
|
||
|
rlLog "The source of entropy will be tested as well"
|
||
|
START_DATE=`date +%H:%M:%S`
|
||
|
echo START_DATE=$START_DATE
|
||
|
sleep 1
|
||
|
rlRun "auditctl -w /dev/random -p rwxa -k RAND"
|
||
|
auditctl -l
|
||
|
sleep 1
|
||
|
rlRun "ausearch -i -k RAND -ts $START_DATE"
|
||
|
fi
|
||
|
# Create the realm databases
|
||
|
rlRun "rngd -r /dev/urandom"
|
||
|
rlRun "kdb5_util create -s -r $krb5REALM1 -P $krb5KDCPass"
|
||
|
rlRun "kdb5_util create -s -r $krb5REALM2 -P $krb5KDCPass"
|
||
|
# Configure KDC to handle 2 realms
|
||
|
if rlIsRHEL 6; then
|
||
|
rlRun "echo \"KRB5REALM=$krb5REALM1\" > /etc/sysconfig/krb5kdc"
|
||
|
rlRun "echo KRB5KDC_ARGS=\\\"-r $krb5REALM2\\\" >> /etc/sysconfig/krb5kdc"
|
||
|
else
|
||
|
rlRun "echo KRB5KDC_ARGS=\\\"-r $krb5REALM1 -r $krb5REALM2 \\\" >/etc/sysconfig/krb5kdc"
|
||
|
fi
|
||
|
rlRun "rlServiceStart kadmin krb5kdc"
|
||
|
# Add krb5 principals for the 2nd realm
|
||
|
rlRun "kadmin.local -r $krb5REALM1 -q \"addprinc -pw $krb5RootPass root/master\""
|
||
|
rlRun "kadmin.local -r $krb5REALM1 -q \"addprinc -pw $krb5UserKrbPass $krb5User\""
|
||
|
rlRun "kadmin.local -r $krb5REALM1 -q \"addprinc -randkey host/$krb5HostName\""
|
||
|
rlRun "kadmin.local -r $krb5REALM1 -q \"ktadd host/$krb5HostName\""
|
||
|
rlRun "kadmin.local -r $krb5REALM1 -q \"addprinc -pw $krb5KDCPass krbtgt/$krb5REALM1@$krb5REALM2\""
|
||
|
rlRun "kadmin.local -r $krb5REALM1 -q \"addprinc -pw $krb5KDCPass krbtgt/$krb5REALM2@$krb5REALM1\""
|
||
|
# Add krb5 principals for the 2nd realm
|
||
|
rlRun "kadmin.local -r $krb5REALM2 -q \"addprinc -pw $krb5UserKrbPass $krb5User2\""
|
||
|
rlRun "kadmin.local -r $krb5REALM2 -q \"addprinc -randkey host/$krb5HostName\""
|
||
|
rlRun "kadmin.local -r $krb5REALM2 -q \"addprinc -pw $krb5KDCPass krbtgt/$krb5REALM1@$krb5REALM2\""
|
||
|
rlRun "kadmin.local -r $krb5REALM2 -q \"addprinc -pw $krb5KDCPass krbtgt/$krb5REALM2@$krb5REALM1\""
|
||
|
# Create test system user
|
||
|
[ $krb5User != "root" ] && rlRun "useradd $krb5User"
|
||
|
rlRun "echo $krb5UserPass | passwd --stdin $krb5User"
|
||
|
rlPhaseEnd
|
||
|
fi
|
||
|
|
||
|
rlPhaseStartTest "Daemon start and log file test"
|
||
|
# Make sure there is enough entropy and start recording of the logs
|
||
|
rlRun "rngd -r /dev/urandom"
|
||
|
if grep -q krb5kdc /var/log/krb5kdc.log; then
|
||
|
tail -n0 -f /var/log/krb5kdc.log &> krb5kdc.log.record &
|
||
|
KRB5KDC_LOG_PID=$!
|
||
|
echo "log_record_start: PID = $KRB5KDC_LOG_PID"
|
||
|
sleep 1
|
||
|
elif journalctl |grep -q krb5kdc; then
|
||
|
journalctl -f &> krb5kdc.log.record &
|
||
|
KRB5KDC_LOG_PID=$!
|
||
|
echo "log_record_start: PID = $KRB5KDC_LOG_PID"
|
||
|
sleep 1
|
||
|
else
|
||
|
rlFail "Could not find krb5kdc logs"
|
||
|
echo "journalctl:"
|
||
|
journalctl -n 100
|
||
|
ls -la /var/log/krb5kdc*
|
||
|
echo "/var/log/krb5kdc.log:"
|
||
|
tail -n 100 /var/log/krb5kdc.log
|
||
|
fi
|
||
|
if grep -q kadmind /var/log/kadmind.log; then
|
||
|
tail -n0 -f /var/log/kadmind.log &> kadmind.log.record &
|
||
|
KADMIND_LOG_PID=$!
|
||
|
echo "log_record_start: PID = $KADMIND_LOG_PID"
|
||
|
sleep 1
|
||
|
elif journalctl |grep -q kadmind; then
|
||
|
journalctl -f &> kadmind.log.record &
|
||
|
KADMIND_LOG_PID=$!
|
||
|
echo "log_record_start: PID = $KADMIND_LOG_PID"
|
||
|
sleep 1
|
||
|
else
|
||
|
rlFail "Could not find kadmind logs"
|
||
|
echo "journalctl:"
|
||
|
journalctl -n 100
|
||
|
ls -la /var/log/kadmind*
|
||
|
echo "/var/log/kadmind.log:"
|
||
|
tail -n 100 /var/log/kadmind.log
|
||
|
fi
|
||
|
# Restart daemon auto start
|
||
|
if rlIsRHEL 6; then
|
||
|
rlRun "service krb5kdc restart"
|
||
|
rlRun "service kadmin restart"
|
||
|
rlRun "service krb5kdc status"
|
||
|
rlRun "service kadmin status"
|
||
|
else
|
||
|
rlRun "systemctl restart krb5kdc.service"
|
||
|
rlRun "systemctl restart kadmin.service"
|
||
|
rlRun "systemctl --no-pager status krb5kdc.service"
|
||
|
rlRun "systemctl --no-pager status kadmin.service"
|
||
|
fi
|
||
|
rlRun "echo $krb5UserKrbPass |kinit $krb5User && klist"
|
||
|
rlRun "kdestroy"
|
||
|
rlRun "kadmin -p root/master -w rrr -q ''"
|
||
|
rlAssertGrep "AS_REQ.*$krb5User@$krb5REALM1.*krbtgt/$krb5REALM1@$krb5REALM1" krb5kdc.log.record
|
||
|
cat krb5kdc.log.record
|
||
|
rlAssertGrep "Request: kadm5_init.*root/master@$krb5REALM1.*service=kadmin/`hostname`@$krb5REALM1" kadmind.log.record
|
||
|
cat kadmind.log.record
|
||
|
# Stop log recording
|
||
|
kill $KADMIND_LOG_PID
|
||
|
kill $KRB5KDC_LOG_PID
|
||
|
rlPhaseEnd
|
||
|
|
||
|
rlPhaseStartTest "SSH test"
|
||
|
cat > sshtest.exp <<'_EOF'
|
||
|
#!/usr/bin/expect -f
|
||
|
set USER [lindex $argv 0]
|
||
|
set HOST [lindex $argv 1]
|
||
|
set timeout 15
|
||
|
spawn ssh $USER@$HOST pwd
|
||
|
expect {
|
||
|
-re ".*(yes/no).*" { send -- "yes\r"; exp_continue }
|
||
|
-re ".*password:.*" { exit 1 }
|
||
|
"/home/$USER" { exit 0 }
|
||
|
timeout { exit 2 }
|
||
|
eof { exit 3 }
|
||
|
}
|
||
|
exit 4
|
||
|
_EOF
|
||
|
chmod 744 sshtest.exp
|
||
|
rlAssertExists sshtest.exp
|
||
|
rlRun "echo $krb5UserKrbPass |kinit $krb5User && klist"
|
||
|
rlRun "./sshtest.exp $krb5User $krb5HostName"; echo
|
||
|
rlRun "klist &>klist.log"
|
||
|
cat klist.log
|
||
|
rlAssertGrep "host/`hostname`@$krb5REALM1" klist.log
|
||
|
rlRun "kdestroy"
|
||
|
rlPhaseEnd
|
||
|
|
||
|
rlPhaseStartTest "Basic kadmin and kpasswd test"
|
||
|
rlRun "kadmin.local -q \"listprincs\" |grep -v Authenticating >lplocal"
|
||
|
rlRun "kadmin -p root/master -w $krb5RootPass -q \"listprincs\" |grep -v Authenticating >lpremote"
|
||
|
rlAssertNotDiffer lplocal lpremote || diff -u lplocal lpremote
|
||
|
diff lplocal lpremote
|
||
|
rlRun "kadmin -p root/master -w $krb5RootPass -q \"addprinc -pw $krb5User2 $krb5User2@$krb5REALM1\""
|
||
|
rlRun "kadmin -p root/master -w $krb5RootPass -q \"listprincs\" | grep \"$krb5User2@$krb5REALM1\""
|
||
|
|
||
|
rlRun "echo $krb5User2 | kinit $krb5User2"
|
||
|
rlRun "echo -e \"$krb5User2\nqwerty\nqwerty\" | kpasswd &>kpasswd.log"
|
||
|
cat kpasswd.log
|
||
|
rlAssertGrep "Password changed." kpasswd.log
|
||
|
rlRun "echo qwerty | kinit $krb5User2"
|
||
|
rlRun "kdestroy"
|
||
|
rlRun "kadmin -p root/master -w $krb5RootPass -q \"delprinc -force $krb5User2@$krb5REALM1\""
|
||
|
rlPhaseEnd
|
||
|
|
||
|
rlPhaseStartTest "Basic ksu test"
|
||
|
[[ -f /root/.k5login ]] && rlRun "mv /root/.k5login ."
|
||
|
rlRun "echo $krb5User@$krb5REALM1 > /root/.k5login"
|
||
|
rlRun "su - $krb5User -c \"echo $krb5UserKrbPass | kinit $krb5User\""
|
||
|
rlRun "su - $krb5User -c \"ksu -e /usr/bin/id\" &> ksu.log"
|
||
|
cat ksu.log
|
||
|
rlAssertGrep "^uid=0(root) gid=0(root)" ksu.log
|
||
|
rlRun "su - $krb5User -c kdestroy"
|
||
|
[[ -f .k5login ]] && rlRun "mv .k5login /root/.k5login"
|
||
|
rlPhaseEnd
|
||
|
|
||
|
rlPhaseStartTest "Cross realm test"
|
||
|
rlRun "echo $krb5UserKrbPass |kinit $krb5User && klist"
|
||
|
rlRun "kvno host/`hostname`@$krb5REALM2"
|
||
|
rlRun "klist &>klist.log"
|
||
|
cat klist.log
|
||
|
rlAssertGrep "krbtgt/$krb5REALM1@$krb5REALM1" klist.log
|
||
|
rlAssertGrep "krbtgt/$krb5REALM2@$krb5REALM1" klist.log
|
||
|
rlAssertGrep "host/`hostname`@$krb5REALM2" klist.log
|
||
|
rlRun "kdestroy"
|
||
|
rlPhaseEnd
|
||
|
|
||
|
# Test the entropy source (not relevant for RHEL6)
|
||
|
if ! rlIsRHEL 6 && [[ $TEST_ENTROPY_SOURCE == 'yes' ]]; then
|
||
|
rlPhaseStartTest "Enable faster getrandom-based entropy system"
|
||
|
echo START_DATE=$START_DATE
|
||
|
auditctl -l
|
||
|
rlRun "ausearch -i -k RAND -ts $START_DATE"
|
||
|
rlRun "ausearch -i -k RAND -ts $START_DATE |grep comm= |grep -v 'comm=rngd'" 1
|
||
|
rlRun "auditctl -D"
|
||
|
rlPhaseEnd
|
||
|
fi
|
||
|
|
||
|
# Run this part on "normal" mode; in inplace upgrade no cleanup is needed
|
||
|
if [[ -z $IN_PLACE_UPGRADE ]]; then
|
||
|
rlPhaseStartCleanup "KDC and kadmind cleanup"
|
||
|
rlRun "rm -rf /var/kerberos/krb5kdc/* /var/kerberos/krb5kdc/.k5* /etc/krb5* /etc/sysconfig/{kadmin,krb5kdc}"
|
||
|
rlFileRestore
|
||
|
rlRun "rlServiceRestore krb5kdc kadmin"
|
||
|
[ $krb5User != "root" ] && rlRun "userdel -r -f $krb5User"
|
||
|
rlPhaseEnd
|
||
|
fi
|
||
|
|
||
|
rlPhaseStartCleanup
|
||
|
rlRun "popd"
|
||
|
rlRun "rm -r $TmpDir"
|
||
|
rlPhaseEnd
|
||
|
rlJournalPrintText
|
||
|
rlJournalEnd
|