Geschreven door Dennis van Beek

Certificaten monitoren met Splunk

Data4 minuten leestijd

Certificaten, cruciaal om je server verkeer te beveiligen. Maar ze staan bij veel mensen ook bekend als probleem-veroorzakers. Eén van de problemen die we bij onze klanten meemaken is dat de certificaten niet tijdig worden vervangen. Met Splunk hebben we een krachtige tool in handen, die we ook voor dit probleem kunnen inzetten.

OpenSSL

Een Splunk installatie heeft een aantal standaard componenten. Zo komt Splunk standaard met zijn eigen Python versie, maar ook OpenSSL is een van deze componenten. Met OpenSSL kunnen we certificaten uitlezen en dat maakt het mogelijk om monitoring in te richten.

Het volgende commando kan de start- en einddatum van een certificaat tonen:

splunk cmd openssl x509 -inform pem -noout -startdate -enddate

Om dit te kunnen doen hebben we eerst het certificaat nodig. Indien je certificaten die op de server staan zou willen monitoren, kan je die waarschijnlijk nog wel vinden. Maar deze oplossing is juist zo krachtig omdat je de geldigheid van certificaten kunt monitoren waar jij zelf gebruik van maakt. Om certificaten te tonen van andere servers of applicaties kunnen we het volgende commando gebruiken:

splunk cmd openssl s_client -showcerts -connect cinqict.nl:443

In dit voorbeeld maakt OpenSSL een verbinding met de website van CINQ over poort 443. Op deze manier kunnen allerlei applicaties op verschillende poorten benaderd worden. Combineer deze commando’s, filter wat op de output en je hebt bijvoorbeeld dit commando:

splunk cmd openssl s_client -showcerts -servername cinqict.nl -connect cinqict.nl:443  2>/dev/null | splunk cmd openssl x509 -inform pem -noout -startdate -enddate

De output hiervan ziet er als volgt uit:

notAfter=Apr 11 07:13:54 2022 GMT
notBefore=Jan 11 07:13:55 2022 GMT

De volgende stap die we nu moeten doen, is zorgen dat we hiervan een scripted input maken in Splunk.

Scripted input

Het commando dat we gemaakt hebben zetten we om in een Linux shell script. We zetten de hostname en de poort om in parameter. Het scriptje noemen we: sslcheck.sh. 

echo hostname=$1 port=$2
echo | splunk cmd openssl s_client -showcerts -servername $1 -connect $1:$2 2>/dev/null | splunk cmd openssl x509 -inform pem -noout -startdate -enddate

Vergeet niet het scriptje executable te maken (chmod +x) en probeer het uit:

./sslcheck.sh cinqict.nl 443

De output van dit scriptje ziet er als volgt uit:

hostname=cinqict.nl port=443
notBefore=Jan 11 07:13:55 2022 GMT
notAfter=Apr 11 07:13:54 2022 GMT

Als we de output van dit script in Splunk indexeren, kunnen we proactief gaan monitoren! Daar hebben we een zogeheten scripted input voor nodig. Maak in je Splunk home directory in etc/apps een nieuwe app aan: TA_CertificateMonitoring en maak twee subdirectories: bin en local. In de bin directory plaats je het sslcheck.sh script en in de local directory maak je een inputs.conf aan.

[script:///$SPLUNK_HOME/etc/apps/TA_SSLCertificateCheck/bin/sslcheck.sh {hostname} {port}]
index = {indexname}
sourcetype = sslcheck
disabled = false
interval = 43200

Als laatste moeten we de Sourcetype nog definiëren, alle data in Splunk bevat een tijdswaarde. In de output van het script zit alleen de start- en einddatum van het certificaat, niet het tijdstip van monitoren. Daarom voegen we in de Sourcetype definitie toe dat de huidige systeem-tijd hiervoor gebruikt moet worden. In de local directory van de TA maak je een props.conf aan die er alsvolgt uitziet:

[sslcheck]
DATETIME_CONFIG = CURRENT
SHOULD_LINEMERGE = true
NO_BINARY_CHECK = true
BREAK_ONLY_BEFORE = hostname

Monitoren met Splunk

Zodra we de scripted input hebben aangemaakt en Splunk herstart hebben, is de input actief. Zoek in de index die je in de inputs.conf hebt opgegeven naar de data:

Er zijn meerdere manieren om de einddatum juist in een veld te krijgen. Je kunt hiervoor bijvoorbeeld gebruik maken van een field extraction of een calculated field, waarbij je een EVAL functie kunt gebruiken. In dit voorbeeld lossen we het voor het gemak even op met een reguliere expressie. Vervolgens zetten we het veld om naar een epoch timestamp zodat we dit kunnen vergelijken met de huidige datum tijd.

index=_internal sourcetype=sslcheck hostname=cinqict.nl
| rex "notAfter=(?<enddate>[^\n]+)"
| eval enddate = strptime(enddate, "%b %d %H:%M:%S %Y %Z”)

Nu kunnen we een alert gaan maken die ons twee maanden van te voren informeert, zodat we tijdig het certificaat kunnen verlengen of vervangen.

index=_internal sourcetype=sslcheck hostname=cinqict.nl
| rex "notAfter=(?<enddate>[^\n]+)"
| eval enddate = strptime(enddate, "%b %d %H:%M:%S %Y %Z")
| where enddate < relative_time(now(), "+2m")

Sla deze search op als alert, laat deze dagelijks draaien en mail bijvoorbeeld naar het gehele team. Misschien is er op jouw Splunk omgeving wel een custom alert action gemaakt, waardoor je hier meteen een actie van kunt maken op je sprint planning!

Mocht je na het lezen van deze blogpost vragen hebben over het monitoren van certificaten, neem dan gerust contact met ons op. We denken graag met je mee!

Meer weten over certificaten monitoren en vervangen?