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.