Zugriffsprotokollierung

Zugriffe auf geschützte Dienste können protokolliert werden. Diese Option ist standardmäßig nicht aktiviert, kann jedoch durch Anpassung der Konfiguration eingeschaltet werden. Hierbei ist es möglich, das Logging für jeden unterstützten Diensttyp separat zu konfigurieren. Es gibt vier Arten von LoggingHandlern, die in jeglicher Kombination verwendet werden können.

LoggingHandler

GetRequestLoggingHandler

Dieser Handler protokolliert Parameterwerte aus einem HTTP GET Aufruf des geschützten Dienstes. Im Ergebnis wird jeweils der Name des Parameters als Schlüssel und der Parameterwert als Wert gespeichert. Für Schlüssel, die nicht aufgelöst werden können, wird der Wert gespeichert, der als valueNotFoundString definiert ist.

<Entry>
    <Object class="de.conterra.suite.security.interceptor.logging.handler.GetRequestLoggingHandler">
        <Property name="valueNotFoundString" value="[request_parameter_not_found]" />
        <Property name="parameterList">
            <List>
                <Entry value="request" />
                <Entry value="service" />
                <Entry value="version" />
            </List>
        </Property>
    </Object>
</Entry>

ContentLoggingHandler

Dieser Handler protokolliert Inhalte einer HTTP POST Anfrage. Die Inhalte werden über XPath-Ausdrücke definiert. Zunächst wird konfiguriert für welche mimeTypes der Handler aktiv wird. Im Weiteren werden in der Property namespaces zuerst die Namensräume definiert, die in den XPath-Ausdrücken verwendet werden. Über eine parameterMap können dann XPath-Ausdrücke definiert werden, die auf bestimmte Inhalte zeigen. Diese Inhalte werden mit dem definierten Namen als Schlüssel abgespeichert.

<Entry>
    <Object class="de.conterra.suite.security.interceptor.logging.handler.ContentLoggingHandler">
        <Property name="mimeTypes">
            <List>
                <Entry value="text/xml" />
                <Entry value="application/xml" />
            </List>
        </Property>
        <Property name="valueNotFoundString" value="[no_xpath_value_found]" />
        <Property name="namespaces">
            <Map>
                <Entry name="gml" value="http://www.opengis.net/gml" />
                <Entry name="wfs" value="http://www.opengis.net/wfs" />
                <Entry name="ogc" value="http://www.opengis.net/ogc" />
            </Map>
        </Property>
        <Property name="parameterMap">
            <Map>
                <Entry name="PropertyName" value="/wfs:GetFeature/wfs:Query/ogc:PropertyName/text()" />
                <Entry name="outputFormat" value="/wfs:GetFeature/@outputFormat" />
                <Entry name="BoundingBox_Coordinates" value="/wfs:GetFeature/wfs:Query/ogc:Filter/ogc:BBOX/gml:Box/gml:coordinates/text()" />
            </Map>
        </Property>
    </Object>
</Entry>

HeaderAttributesLoggingHandler

Mithilfe dieses Handlers können bestimmte HTTP Header Attribute protokolliert werden. Diese werden in der Property attributeList definiert. Die Namen der Attribute werden als Schlüssel zusammen mit den entsprechenden Werten gespeichert.

<Entry>
    <Object class="de.conterra.suite.security.interceptor.logging.handler.HeaderAttributesLoggingHandler">
        <Property name="valueNotFoundString" value="[http_header_attribute_not_found]" />
        <Property name="attributeList">
            <List>
                <Entry value="X-Forwarded-For" />
                <Entry value="Accept-Charset" />
                <Entry value="Accept-Encoding" />
                <Entry value="Accept-Language" />
                <Entry value="User-Agent" />
                <Entry value="Host" />
            </List>
        </Property>
    </Object>
</Entry>

SpecialParameterLoggingHandler

Dieser Handler speichert Werte zu vordefinierten Schlüsselworten. Es können folgende Schlüsselwerte verwendet werden:

username

Speichert den Namen des angemeldeten Nutzers.

timestamp

Speichert den Zeitstempel des Zugriffs.

request

Speichert die gesamte Anfrage (unabhängig davon, ob HTTP GET oder POST).

base_url

Speichert die Basis-URL des WSS.

path_info

Speichert evtuell vorhandene Informationen zum Pfad.

secured_service_url

Speichert die URL des zu schützenden Dienstes.

<Entry>
    <Object class="de.conterra.suite.security.interceptor.logging.handler.SpecialParameterLoggingHandler">
        <Property name="valueNotFoundString" value="[value_not_found]" />
        <Property name="parameterList">
            <List>
                <Entry value="timestamp" />
                <Entry value="username" />
                <Entry value="request" />
                <Entry value="base_url" />
                <Entry value="path_info" />
                <Entry value="secured_service_url" />
            </List>
        </Property>
    </Object>
</Entry>

LoggerChain

Die einzelnen Handler werden in eine LoggerChain eingereiht, die wiederum in einem eigenen Interceptor abgearbeitet wird. Zu beachten ist hierbei, dass die Reihenfolge in der die Interceptoren definiert sind Einfluss auf die Ergebnisse haben kann: Wird der Logging-Interceptor zu Beginn der verschiedenen Interceptoren definiert, loggt dieser die Original-Anfragen. Wird er hingegen als letzter Interceptor definiert, ist es möglich, dass vorher bereits eine Veränderung der Anfrage stattgefunden hat und nun diese als Basis für den Logging-Interceptor gilt.

<Interceptor class="de.conterra.suite.security.interceptor.logging.LoggingInterceptor">
    <Property name="inputLoggerChainList">
        <List>
            <Entry>
                <Object class="de.conterra.suite.security.interceptor.logging.handler.LoggerChain">
                    <Property name="loggingHandlerList">
                        <List>
                            <Entry>
                                <Object class="de.conterra...handler.SpecialParameterLoggingHandler">
                                    ...
                                </Object>
                            </Entry>
                            <Entry>
                                ...
                            </Entry>
                        </List>
                    </Property>
                </Object>
            </Entry>
        </List>
    </Property>
</Interceptor>

Die Konfiguration des Logging-Interceptors muss in der entsprechenden Moduldatei erfolgen, für die geloggt werden soll. Diese finden sich im Verzeichnis [INSTALL_FOLDER]/webapp/wss/WEB-INF/classes/enforcementpoint-modules. Beispielkonfigurationen können in den Modulen von WMS und ArcGIS Server gefunden werden.

Die Speicherung des Logging-Ergebnis erfolgt im Standard-Log-Verzeichnis des Tomcats und wird in der Datei ct-security-<version>-wss-access.log abgelegt. Für jeden Request wird eine Zeile in dieser Datei ergänzt. Speicherpfad und Dateinamen können in der Datei [INSTALL_FOLDER]/webapp/wss/WEB-INF/classes/log4j.xml für den Appender ACCESS_LOGFILE verändert werden. Klassen, die innerhalb der log4j.xml Datei verwendet werden, müssen in Form von JAR-Dateien im Verzeichnis [INSTALL_FOLDER]/webapp/wss/WEB-INF/classes/access-log-lib abgelegt werden.

Die Ergebnisse werden als CSV-Datei gespeichert. Per Konfiguration kann das Layout dieser Datei verändert werden.

<layout class="de.conterra.suite.security.interceptor.logging.CSVLogInterceptorLayout">
    <param name="ShowKeys" value="true" />
    <param name="KeyValueSeparator" value="=" />
    <param name="ValueSeparator" value=";" />
    <param name="EntrySeparator" value="," />
    <param name="Prefix" value="Logging-Interceptor: " />
    <param name="Suffix" value=" - End of Entry" />
</layout>

Die dargestellte Konfiguration führt zu folgendem Eintrag in der Log-Datei:

Logging-Interceptor: timestamp=2010-08-31 09:00:57.057,username=user1,base_url=http://localhost:8080/wss/service/my_wfs/httpauth,
secured_service_url=http://localhost:8080/mywfs/DATA,X-Forwarded-For=127.0.0.1,Accept-Encoding=gzip,
Accept-Language=\[http_header_attribute_not_found\],User-Agent=uDig 1.2.0 (http://udig.refractions.net)  Java/1.6.0_17,
Host=localhost:8080,outputFormat=GML2,BoundingBox_Coordinates=-202.9635499207607,-91.71156893819334 202.9635499207607,91.71156893819334,
PropertyName=GEOM - End of Entry