Under Construction
Schritt 4: Meldungen und Fehlermeldungen
Die mitgelieferten Skripte protokollieren alle im Skript ausgeführten Kommandos in die Log-Datei /etc/security/aixpert/log/aixpert.log. Außerdem überprüfen Sie den korrekten Skript-Aufruf (korrekte Anzahl und Art der Argumente) und geben weitere Meldungen aus.
In der Datei /etc/security/aixpert/bin/initialize_variables werden einige Variablen gesetzt, welche z.B. Log-Dateien, Report-Dateien und weitere Pfade beinhalten. Alle vordefinierten Skripte lesen den Inhalt dieser Datei ein. Hier kurz der Inhalt dieser Datei:
# cat /etc/security/aixpert/bin/initialize_variables
#!/usr/bin/ksh
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# bos720 src/bos/usr/lib/security/aixpert/scripts/initialize_variables.sh 1.3
#
# Licensed Materials - Property of IBM
#
# Restricted Materials of IBM
#
# COPYRIGHT International Business Machines Corp. 2006,2007
# All Rights Reserved
#
# US Government Users Restricted Rights - Use, duplication or
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
#
# IBM_PROLOG_END_TAG
# @(#)89 1.3 src/bos/usr/lib/security/aixpert/scripts/initialize_variables.sh, aixpert, bos720 2/20/07 02:11:57
LOG=/etc/security/aixpert/log/aixpert.log
REPORT=/etc/security/aixpert/check_report.txt
SAVE=/etc/security/aixpert/undo/data
SCPTDIR=/etc/security/aixpert/undo
UNDOXML=/etc/security/aixpert/core/undo.xml
AIXPERT_FIFO=/etc/security/aixpert/tmp/AIXPERT
TMPDIR=/etc/security/aixpert/tmp
#
Wir übernehmen den Anfang der mitgelieferten Skripte:
export PATH=/usr/bin:/usr/sbin:$PATH
# Initialize variables AIXPERT_FIFO, LOG, REPORT, SCPTDIR and UNDOXML
. /etc/security/aixpert/bin/initialize_variables
Die Re-Definition der PATH Variablen stellt sicher das /usr/bin und /usr/sbin zuerst nach Kommandos durchsucht werden. Anschließend wird die Datei initialize_variables eingesourced.
Als nächstes wird mit den folgenden Zeilen Standard-Ausgabe und Standard-Fehler Kanal auf die Log-Datei /etc/security/aixpert/log/aixpert.log ($LOG) umgeleitet:
# Log output and errors to /etc/security/aixpert/log/aixpert.log
exec 1>>$LOG
exec 2>&1
Sämtliche Ausgaben gehen damit in die genannte Log-Datei!
Damit im Log erkennbar ist von welchem Skript die Ausgaben stammen, wird eine Header-Zeile im Log generiert:
# echo all the commands and the current time and date to the AIXpert log
set -x
date
echo $0 $@ AIXPERT_CHECK_REPORT=$AIXPERT_CHECK_REPORT BASE_REPT=$BASE_REPT DETAILED_REPT=$DETAILED_REPT
Und zuletzt nehmen wir noch eine Überprüfung der übergebenen Argumente vor. Für den Moment soll unser Skript nicht mit Argumenten aufgerufen werden:
if [ $# -ne 0 ]
then
echo "Usage : local_chsshdconf\n"
exit 1
fi
(Wir werden später noch Argumente hinzufügen.)
Damit ergibt sich insgesamt die folgende Version des Skripts:
# cat /etc/security/aixpert/bin/local_chsshdconf
#! /bin/ksh
export PATH=/usr/bin:/usr/sbin:$PATH
# Initialize variables AIXPERT_FIFO, LOG, REPORT, SCPTDIR and UNDOXML
. /etc/security/aixpert/bin/initialize_variables
# Log output and errors to /etc/security/aixpert/log/aixpert.log
exec 1>>$LOG
exec 2>&1
# echo all the commands and the current time and date to the AIXpert log
set -x
date
echo $0 $@ AIXPERT_CHECK_REPORT=$AIXPERT_CHECK_REPORT BASE_REPT=$BASE_REPT DETAILED_REPT=$DETAILED_REPT
if [ $# -ne 0 ]
then
echo "Usage : local_chsshdconf\n"
exit 1
fi
# Check whether AIXPERT_CHECK_REPORT environment variable is set or not.
report=`echo $AIXPERT_CHECK_REPORT`
if [ "$report" = "1" ]
then
ret=1
permit=$( awk '$1 ~ /^PermitRootLogin$/ { print $2; }' /etc/ssh/sshd_config 2>/dev/null | tail -n 1 )
case "${permit}" in
[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]) ret=0 ;;
esac
exit $ret
fi
exit 0
#
Wir führen einen weiteren Probe-Durchlauf durch:
/etc/security/aixpert # aixpert -c -P custom/sshd.xml
Processedrules=1 Passedrules=0 Failedrules=1 Level=TEST
Input file=custom/sshd.xml
/etc/security/aixpert #
Eine Überprüfung der Log-Datei aixpert.log zeigt, das nun alle Kommandos die im Skript ausgeführt wurden, mitprofokolliert wurden:
/etc/security/aixpert # cat log/aixpert.log
+ date
Fri Dec 2 15:21:21 CET 2022
+ echo /etc/security/aixpert/bin/local_chsshdconf AIXPERT_CHECK_REPORT=1 BASE_REPT= DETAILED_REPT=
/etc/security/aixpert/bin/local_chsshdconf AIXPERT_CHECK_REPORT=1 BASE_REPT= DETAILED_REPT=
+ [ 0 -ne 0 ]
+ + echo 1
report=1
+ [ 1 = 1 ]
+ ret=1
+ + awk $1 ~ /^PermitRootLogin$/ { print $2; } /etc/ssh/sshd_config
+ 2> /dev/null
+ tail -n 1
permit=yes
+ exit 1
/etc/security/aixpert #
Schlägt eine Überprüfung fehl, sollte eine entsprechende Meldung in /etc/security/aixpert/check_report.txt ausgegeben werden. Hier eine Beispiel-Meldung eines anderen Skripts:
chusrattr.sh: User attribute minlen, for srvproxy should have value 8, but it is 6 now
In den Standard-Skripten wird für einen normalen Report eine solche Meldung an /etc/security/aixpert/check_report.txt ($REPORT) und an /etc/security/aixpert/tmp/AIXPERT ($AIXPERT_FIFO) angefügt:
dspmsg -s 4 aixpert.cat 3 "chusrattr.sh: User attribute %s, for $username should have value %s, but it is %s now\n" $usrattr $value $defvalue >>$REPORT
dspmsg -s 4 aixpert.cat 3 "chusrattr.sh: User attribute %s, for $username should have value %s, but it is %s now\n" $usrattr $value $defvalue >>$AIXPERT_FIFO
Mit Locale abhängigen Meldungen werden wir uns hier nicht beschäftigen und verwenden daher ein simples printf für die Ausgaben in unserem Skript:
printf "local_chsshdconf.sh: sshd attribute %s should have value %s, but it is %s now\n" PermitRootLogin no $permit >>$REPORT
printf "local_chsshdconf.sh: sshd attribute %s should have value %s, but it is %s now\n" PermitRootLogin no $permit >>$AIXPERT_FIFO
Die Meldungen werden nur generiert werden, wenn die Überprüfung nicht erfolgreich war, also PermitRootLogin erlaubt ist. Wir setzen daher die beiden Zeilen in den Körper einer if-Anweisung, die auf „$ret = 1“ überprüft. Insgesamt ergibt sich dann die folgende Version:
# cat /etc/security/aixpert/bin/local_chsshdconf
#! /bin/ksh
export PATH=/usr/bin:/usr/sbin:$PATH
# Initialize variables AIXPERT_FIFO, LOG, REPORT, SCPTDIR and UNDOXML
. /etc/security/aixpert/bin/initialize_variables
# Log output and errors to /etc/security/aixpert/log/aixpert.log
exec 1>>$LOG
exec 2>&1
# echo all the commands and the current time and date to the AIXpert log
set -x
date
echo $0 $@ AIXPERT_CHECK_REPORT=$AIXPERT_CHECK_REPORT BASE_REPT=$BASE_REPT DETAILED_REPT=$DETAILED_REPT
if [ $# -ne 0 ]
then
echo "Usage : local_chsshdconf\n"
exit 1
fi
# Check whether AIXPERT_CHECK_REPORT environment variable is set or not.
report=`echo $AIXPERT_CHECK_REPORT`
if [ "$report" = "1" ]
then
ret=1
permit=$( awk '$1 ~ /^PermitRootLogin$/ { print $2; }' /etc/ssh/sshd_config 2>/dev/null | tail -n 1 )
case "${permit}" in
[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]) ret=0 ;;
esac
if [ $ret = 1 ]
then
printf "local_chsshdconf.sh: sshd attribute %s should have value %s, but it is %s now\n" PermitRootLogin no $permit >>$REPORT
printf "local_chsshdconf.sh: sshd attribute %s should have value %s, but it is %s now\n" PermitRootLogin no $permit >>$AIXPERT_FIFO
fi
exit $ret
fi
exit 0
#
Ein weiterer Lauf von aixpert mit anschließendem Blick auf /etc/security/aixpert/check_report.txt zeigt das es nun entsprechende Meldungen zu der fehlgeschlagenen Überprüfung gibt:
/etc/security/aixpert # cat check_report.txt
…
***** aix01 : Dec 2 15:42:31 ******
local_chsshdconf.sh: sshd attribute PermitRootLogin should have value no, but it is yes now
Processedrules=1 Passedrules=0 Failedrules=1 Level=TEST
Input file=custom/sshd.xml
/etc/security/aixpert #
Der AIX Security Expert bietet bei der Überprüfung (aixpert -c) noch zwei zusätliche Optionen an:
-r : Generieren eines Base Compliance Reports
-R: Generieren eines Description Reports
Wird ein Check mit der zusätzlichen Option „-r“ (Base Compliance Report) aufgerufen, wird die Variable BASE_REPT=1 für den Skript-Aufruf gesetzt. Für die Option „-R“ (Description Report) wird DETAILED_REPT=1 für den Skript-Aufruf gesetzt. In beiden Fällen wird die Datei in die geloggt werden soll über die Variable TMPREPT übergeben. Spezifische Meldungen zum fehlgeschlagenen Check werden dann nicht in /etc/security/aixpert/check_report.txt geschrieben, sondern in die Datei /etc/security/aixpert/check_report.csv.
Die Standard-Skripte verarbeiten die ersten beiden Variablen typischerweise in der folgenden Form:
BrType=`echo $BASE_REPT`
DrType=`echo $DETAILED_REPT`
Diese Zeilen stehen unmittelbar hinter dem Setzen der Variablen report.
Schlägt eine Überprüfung fehl und ist BrType gleich „1“ (aixpert wurde mit Option -r gestartet), dann wird in aixpert.log die Meldung „Base Compliance Report“ hinzugefügt und eine Meldung an $TMPREPT geschrieben. Im Falle das DrType gleich „1“ ist (aixpert wurde mit Option -R gestartet), wird die Meldung „Description Report“ an den aixpert.log angefügt und eine spezifische Meldung zur fehlgeschlagenen Überprüfung geht wiederum an $TMPREPT.
Wir fügen eine entsprechende Fallunterscheidung unserem Skript hinzu, wieder in Anlehnung an die existierenden Skripte von IBM:
# cat /etc/security/aixpert/bin/local_chsshdconf
#! /bin/ksh
export PATH=/usr/bin:/usr/sbin:$PATH
# Initialize variables AIXPERT_FIFO, LOG, REPORT, SCPTDIR and UNDOXML
. /etc/security/aixpert/bin/initialize_variables
# Log output and errors to /etc/security/aixpert/log/aixpert.log
exec 1>>$LOG
exec 2>&1
# echo all the commands and the current time and date to the AIXpert log
set -x
date
echo $0 $@ AIXPERT_CHECK_REPORT=$AIXPERT_CHECK_REPORT BASE_REPT=$BASE_REPT DETAILED_REPT=$DETAILED_REPT
if [ $# -ne 0 ]
then
echo "Usage : local_chsshdconf\n"
exit 1
fi
# Check whether AIXPERT_CHECK_REPORT environment variable is set or not.
report=`echo $AIXPERT_CHECK_REPORT`
BrType=`echo $BASE_REPT`
DrType=`echo $DETAILED_REPT`
if [ "$report" = "1" ]
then
ret=1
permit=$( awk '$1 ~ /^PermitRootLogin$/ { print $2; }' /etc/ssh/sshd_config 2>/dev/null | tail -n 1 )
case "${permit}" in
[Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]) ret=0 ;;
esac
if [ $ret = 1 ]
then
if [ "$BrType" = "1" ]
then
echo "Base Compliance Report\n";
printf "local_chsshdconf: sshd attribute %s should have value %s, but it is %s now\n" PermitRootLogin no $permit >>$TMPREPT
elif [ "$DrType" = "1" ]
then
echo "Description Report\n";
printf "local_chsshdconf: sshd attribute %s should have value %s, but it is %s now\n" PermitRootLogin no $permit >>$TMPREPT
else
printf "local_chsshdconf: sshd attribute %s should have value %s, but it is %s now\n" PermitRootLogin no $permit >>$REPORT
printf "local_chsshdconf: sshd attribute %s should have value %s, but it is %s now\n" PermitRootLogin no $permit >>$AIXPERT_FIFO
fi
fi
exit $ret
fi
exit 0
#
Ein Lauf mit gesetzter Option „-r“ zeigt, das nun entsprechende Meldungen in /etc/security/aixpert/check_report.csv erscheinen:
/etc/security/aixpert # aixpert -c -P custom/sshd.xml -r
Processedrules=1 Passedrules=0 Failedrules=1 Level=TEST
Input file=custom/sshd.xml
/etc/security/aixpert #
/etc/security/aixpert # cat check_report.csv
Admin:root
Report date and Time:Dec 2 17:34:09
Report Version 1.0
HostName,IP Address,Description,Command Arguments,Result,Reason for failure
aix01,192.168.188.19,"Ensure that PermitRootLogin is False.",/etc/security/aixpert/bin/local_chsshdconf ,FAIL, sshd attribute PermitRootLogin should have value no, but it is yes now
Processedrules=1 Passedrules=0 Failedrules=1 Level=TEST
Input file=custom/sshd.xml
/etc/security/aixpert #
Damit wird schon mal eine Überprüfung der Einstellung von PermitRootLogin beim SSH-Daemon vom eigenen Skript unterstützt.
Als nächstes wird dann das Setzen von PermitRootLogin über aixpert und das Skript gezeigt.