Pan-chainguard er et verktøy for å løse problemer med sertifikatkjeden ved dekryptering på Palo Alto Networks brannmurer.

Målet mitt med denne artikkelen er å gjøre leseren bevisst på utfordringen med sertifikatkjeder.

Jeg beskriver deretter hvordan leseren kan bruke pan-chainguard for å løse det.

Hvorfor dekryptere?

En viktig funksjon i alle Palo Alto Networks brannmurer er muligheten for å dekryptere SSL (og SSH) trafikk. Dekryptering handler i stor grad om synlighet og innsyn i trafikken. «Man kan ikke kontrollere den trafikken man ikke kan se» er et begrep i denne sammenhengen.

En Palo Alto Networks brannmur er et av de beste verktøyene for synlighet i nettverkstrafikken, og brannmuren bør utnyttes maksimalt ved å iverksette dekryptering.

Uten dekryptering vil brannmuren “se verden i svart-hvitt», og vil gå glipp av store mengder informasjon som kan være kritisk for sikkerheten. Det er ikke lett å stoppe den røde bilen når verden er svart-hvit.   

Gjennom synlighet åpnes muligheten for inspeksjon av trafikken for derved blokkere og stoppe utnyttelse av sårbarheter, datalekkasjer, nedlasting av skadevare og kommando-kontroll trafikk o.l. I tillegg gjør det brannmuren i stand til å identifisere applikasjoner som sender trafikken kryptert. Uten dekryptering er “all” trafikk bare identifisert som SSL. 

Utfordringer med dekryptering 

Dekryptering kommer imidlertid med et sett av utfordringer som kan skape frustrasjon hos brukere og ekstra arbeid for administratorer. Det kan være at serveren returnerer et sertifikat med utsteder som er ukjent for brannmuren, at sertifikatkjeden ikke er komplett eller at applikasjonen benytter certificate pinning for å forhindre man-in-the-middle.    

Det krever en del tuning for at dekryptering skal fungere etter hensikten og være minst mulig til hinder for brukere og serveradmins. Denne artikkelen tar for seg hvordan man kan bidra til at brannmuren i størst mulig grad kan akseptere sertifikatkjeder returnert med feil. 

Problemet 

Mange servere er dessverre konfigurert med feil i sertifikatkjeden. Det kan være at intermediate sertifikatet som returneres er feil, kommer i feil rekkefølge eller ikke returneres i det hele tatt. Dette fører til brudd i tillitskjeden (trust chain), og brannmuren vil avvise trafikken.   

Brannmur administrator kan lokalisere siden og manuelt laste ned og importere riktige intermediate sertifikater, men i en dynamisk verden er dette en kamp mot vindmøller. 

Løsningen – intermediate CA forhåndslasting 

Heldigvis finnes det nå et verktøy utviklet av Kevin Steves som kan hjelpe administrator med denne problemstillingen. Pan-chainguard er et sett med python og shell scripts som identifiserer alle intermediate CA sertifikater for gyldige rot CA’er i brannmurens Default Trusted CA Store.   

Disse kan så lastes ned og importeres til brannmur eller panorama. Pan-chainguard benytter brannmurens «default trusted CA store» og «All Certificate Information CCADB» datafilen til å identifisere og laste ned alle intermediate sertifikater for hvert gyldige rotsertifikat i default trust store. De importerte sertifikatene lagres så i brannmurens Device Certificates lager.   

Ved å forhåndslaste kjente intermediates for trusted CAs kan TLS feil som oppstår når brukere treffer feilkonfigurerte tjenere reduseres, og dette letter også trykket for administrator. 

For øvrig kan nevnes at Default trusted CA store på brannmuren er mer statisk en man kunne ønske. Ifølge Palo Alto Networks oppdateres trusted CA store ved hver hovedrelease: «The Default Trusted Certificate Authorities store is updated with major PAN-OS releases». Derfor bør Pan-Chainguard benyttes etter hver release oppgradering av brannmur eller Panorama. 

PAN-Chainguard 

Pan-chainguard finnes på github eller som pakke på PyPi 
     https://github.com/PaloAltoNetworks/pan-chainguard?tab=readme-ov-file 
https://pypi.org/project/pan-chainguard/  
Admin guide for pan-chainguard:
https://github.com/PaloAltoNetworks/pan-chainguard/blob/main/doc/admin-guide.rst 
 
For de som ikke ønsker å eksperimentere for mye på egenhånd, har jeg etablert en oppskrift basert på kildene som kan følges i 5 steg. Den er verifisert på brannmurer i drift. 

Forutsetninger: pan-chainguard kjører på alle Unix-systemer med Python 3.9 eller høyere, og med OpenSSl eller LibreSSL. Den er testet (av utvikler) på OpenBSD 7.75, Ubuntu 22.04 og MacOS 14. 

Jeg har kjørt den på Ubuntu 22.04 med python3.10.12 og baserer oppskriften på det. Pan-chainguard er godt dokumentert på Github, og jeg anbefaler å lese gjennom adminguiden.  

Pan-Chainguard i 5 steg 

STEP 1: 
Først opprettes en ny brannmur api-bruker med tilhørende adminrolle for å utføre kommunikasjonen med brannmur (eller Panorama). Eksisterende api-bruker kan benyttes om ønskelig.

configure 
set shared admin-role chainguard-api role device xmlapi config enable 
set shared admin-role chainguard-api role device xmlapi op enable 
set shared admin-role chainguard-api role device xmlapi commit enable 
set shared admin-role chainguard-api role device xmlapi import enable 
set shared admin-role chainguard-api role device xmlapi export enable 
set shared admin-role chainguard-api role device webui 
set shared admin-role chainguard-api role device restapi 
set mgt-config users chainguard permissions role-based custom profile chainguard-api (#NB hører til kommandoen over)  
set mgt-config users chainguard password 
commit

STEP 2: 
Her setter vi opp Python miljøet i Ubuntu 22.04. Det forutsettes at Python3 er installert:

mkdir pan-chainguard 
cd pan-chainguard 
apt install python3.10-venv python3-pip 
python3 -m venv panos 
source panos/bin/activate 
python3 -m pip install aiohttp 
python3 -m pip install pan-python 
python3 -m pip install pan-chainguard 
chain.py –-version    #sjekk versjon.  0.5.0 pt  

STEP 3: 
Her genereres API nøkkel som legges inn i en config fil som benyttes av de øvrige scriptene 
<fw-IPaddr> byttes ut med din brannmur IP eller hostnavn 
<myfw> erstattes med hostnavn på din brannmur 
<passwd> byttes ut med passord opprettet i step 1 
 
Åpne i browser: 
https://<fw-IPaddr>/api/?type=keygen&user=chainguard&password=<passwd> 
Opprett en fil i pan-chainguard katalogen med navn .panrc og skriv inn: 

api_key%<myfw>=<api-key>	#lim inn api nøkkelen fra browser 
hostname%<myfw>=<fw-IPaddr> 

Lagre filen

STEP 4: 
Her eksporteres alle CA sertifikater i Default Trusted CA store fra brannmur til en komprimert fil ved hjelp av scriptet fling.py.  Så hentes CCADB filen med wget, og gis nytt navn.  Alt hentes inn i tmp/trust-store katalogen. <myfw> erstattes med hostnavn på din brannmur. 

mkdir -p tmp/trust-store 
fling.py --tag <myfw> --certs tmp/trust-store/trust-store.tgz 
#typisk resultat etter 2-3 minutter: 
# "Exported 293 PAN-OS trusted CAs to tmp/trust-store/trust-store.tgz"	 

 
# pakk ut filen og sjekk at filene er der  
cd tmp/trust-store 
tar xzf trust-store.tgz 
ls -1 | head    #eller ls -1 for å se alle 
cd ../.. 

 
#generer en fil med fingerprints fra alle root CAs som ble eksportert 
cert-fingerprints.sh tmp/trust-store > tmp/cert-fingerprints.csv
 
#sjekk at det ser riktig ut 
head tmp/cert-fingerprints.csv 

cd tmp 
wget https://ccadb.my.salesforce-sites.com/ccadb/AllCertificateRecordsCSVFormatv2 
#NB Dette er én lang kommandolinje

#Gi filen nytt navn, og sjekk innholdet
mv AllCertificateRecordsCSVFormatv2 AllCertificateRecordsReport.csv
ls -lh AllCertificateRecordsReport.csv
cd .. 

STEP 5: 
Siste og viktigste oppgave. Her benyttes chain.py skriptet til å laste ned intermediate CA’er. Dette tar ganske lang tid, 15-20 minutter i beste fall og ofte mye lenger tid med flere forsøk. Se dokumentasjonen. Til slutt lastet alle intermediate CA’ene opp i Device Certificates ved hjelp av guard.py. 

Eventuelle tidligere intermediate sertifikater lastet opp med guard.py blir slettet. Commit opsjonen kan eventuelt droppes, slik at manuell sjekk kan utføres før manuell commit. 

chain.py --ccadb tmp/AllCertificateRecordsReport.csv --fingerprints tmp/cert-    fingerprints.csv --certs tmp/certificates.tgz 
#NB, dette er én lang kommandolinje 

guard.py --tag MYFW --admin chainguard --certs tmp/certificates.tgz --delete --add –-commit 
#NB, dette er én lang kommandolinje

Til slutt sjekker man i brannmur GUI at intermediate kjedene ligger under Device/Certificate Management/Certificates under Device Certificates.

Kilder 
Medium: Streamlining Palo Alto Networks SSL Decryption: Unveiling ChainGuard, “a Game changer
GitHub: Pan-chainguard Administrator’s Guide
YouTube: Panos ChainGuard, Solving missing Intermediate Certificates