Realtidsuppdaterad cyberlägesbild med hjälp av Obsidian

Sunday, May 12, 2024

FörsvarObsidianLägesbild

Christoffer Strömblad

Entusiastisk Jedi inom Cybersäkerhet
5 minuter att läsa.

TL;DR

Med hjälp av Fluentd för logginhämtning, MongoDB för lagring och Obsidian för visualisering var det möjligt att skapa en ganska schysst och kontinuerligt uppdaterad lägesbild. Och för att knyta ihop allting använde jag Python.

En tanke om lägesbild föds

Skulle det vara möjligt att använda Obsidian och Local Graph View för att skapa en någorlunda uppdaterad och användbar vy av “aktörer” som håller på med fuffens mot mina system och applikationer?

Min internet-exponering är kanske större än för de flesta eftersom jag driver ett antal initiativ och projekt. Utöver den här sajten, har jag även Swedish Cyber Community , Cybersäkerhet i Sverige och tillhörande Matrix -instans. Det finns således en viss “yta” exponerad mot Internet och nog borde det finnas en del Threat Intelligence att hämta här efter lite bearbetning, eller?

Vi testar och snickrar ihop en första iteration som proof of concept (PoC).

Vi tar det från slutet

Detta är nuvarande version. Här är “huvudnoderna” de domäner som IP-adresserna ansluter mot. Jag kan med hjälp av Obsidian söka på olika saker och genom det färgsätta anslutande noder. I den här bilden har jag t.ex. filtrerat fram alla hostar med någon form av Linux-anknytning.

Lägesbild Proof of Concept

Tanken är att fortsätta berika dessa med diverse information för att kunna filtrera fram vilka som eventuellt är mest “intressanta” att blockera, eller förflytta till en HoneyPot. Jag har nämligen en annan idé om att kunna dynamiskt instruera att vissa IP-adresser ska flyttas till en annan host där jag lite närmare skulle kunna undersöka dem. Tanken var att flytta dem till en HoneyPot, eller ett Deception network.

Men, dit har jag inte kommit, så låt mig istället förklara hur jag gjorde ovan visualisering.

Lösningsöversikt - Helikopter

Enklare ser det ut ungefär så här. Jag har en server cstromblad.com (fast jag hämtar logg från flera) som jag hämtar logg ifrån med hjälp av fluentd. Logg skickar jag sedan över mitt privata Tailscale VPN till en MongoDB-container som snurrar på min NAS.

Visualisering av koppling till NAS

Jag har kodat ihop ett enklare program som hämtar data från MongoDB, och bygger nod-nätverket och sparar ner det i Markdown-filer så att Obsidian kan läsa filerna och rendera graf-vyn.

Lätt. Som. En. Plätt.

Logginhämtning

Först och främst behöver jag hämta loggarna och samla in dessa på ett “bättre” ställe än där de skapas (servrarna). För ett antal månader sedan sprang jag på Fluentd och tänkte att detta antagligen skulle vara ett bra ställe att börja.

“Fluentd is an open source data collector for unified logging layer. Fluentd allows you to unify data collection and consumption for a better use and understanding of data.” - Fluentd hemsida

Essensen av Fluentd är att ta logg, trolla fram ett, för maskiner bättre, format (JSON) och skicka vidare till bättre platser och med bättre platser kanske det är central lagring, analys eller ett meddelande på Matrix att något nytt har hänt.

Du kan tänka så här:

fluentd

Det finns mängder av olika källor med loggar, och Fluentd ger dig ett sätt att hämta, bearbeta och berika dessa och skicka dem dit du vill ha dem. Och givetvis kan du göra mängder av transformeringar, filtrering osv. direkt från/på källsystemet och bara skicka vidare det du tycker är intressant.

Lagring på NAS

Sedan lång tid tillbaka, långt över ett decennium har jag en NAS (Network Attached Storage) här hemma. Och ganska nyligen uppgraderade jag tidigare NAS mot en nyare version, bättre prestanda etc. Där kör jag nu lite enklare Docker-containers.

Och eftersom jag har erfarenhet av att jobba med MongoDB bestämde jag mig för att spinna upp en mongo-container dit jag kunde skicka all logg. Hur kommer jag åt den kanske du undrar? Från en VPS som står på stan?

Tailscale är svaret. Det är en helt fantastisk VPN-lösning som knyter samman alla mina privata enheter, system och applikationer i ett privat mesh-nätverk. Min NAS är uppkopplad mot detta nätverk. Tailscale bygger på Wireguard och är således både snabbt och säkert.

Essensen av kardemumman är att jag kan exponera min NAS mot min swecyb VPS som står hos en annan leverantör. Och att skicka vidare logg är således inte svårare än med följande konfiguration i Fluentd:

<match nginx.access>
    @type mongo
    host 100.76.142.116
    port 27017
    database swecyb_com
    collection nginx
    <inject>
        time_key time
    </inject>
    <buffer>
        flush_interval 10s
    </buffer>
</match>

That’s it. Ja, det finns ju en <source> sektion, lite <filter> också som förklarar från var logg ska hämtas på systemet.

Lokal Python och Obsidian

När informationen väl landat i MongoDB-containern som snurrar på min NAS är det inte svårare än att jag kodat ihop ett enklare Python-program som var 10:e sekund hämtar ut ny data från mongodb, skapar nya markdown-filer för varje IP, länkar samman i Situational Awareness Map och … ja, that’s it.

För varje IP-adress som dyker upp sparar jag ner vilken user-agent som använts, vilken resource som de frågat efter och hur många gånger de anslutit till min server.

OBS: Här har jag lite uppfunnit hjulet på nytt och byggt en enklare abstraktion för noder, relationer och nod-nätverk. Det finns säkert bra grejer för detta redan men jag ville ha något väldigt enkelt och då snickrade jag ihop något eget istället som fyller precis de mål jag hade för det här projektet.

Framtiden

Det här är tämligen underutvecklat. Tanken var från början mest att undersöka idén om att visualisera och skapa en “dashboard” i Obsidian. Men nästa steg, som jag klurat kring, är att faktiskt börja kolla brandväggarna och visualisera vilka IP-adresser som försöker ansluta till vilka portar.

Det kommer självklart generera stora mängder brus, men kan ändå vara roligt att visualisera t.ex. geografisk plats, om IP-adressen tillhör en Cloud-tjänst, eller andra intressanta parametrar.

Så det får nog bli nästa version av det här konceptet. Och just det, alltså hör av dig om du vill veta mer. Jag tar gärna ett samtal och förklarar lite hur jag har gjort, tänkt osv.

FörsvarObsidianLägesbild

Christoffer Strömblad

Entusiastisk Jedi inom Cybersäkerhet

Har du läst dom här?

Skydda dina kakor med hjälp av Device Bound Session Credentials (DBSC)