Suricata IDS samen met Elastic Stack installeren en configureren op Rocky Linux 8

Suricata is een Netwerk Monitoring tool dat elk pakketje Internet verkeer dat door je server stroomt onderzoekt en verwerkt. Het kan log events genereren, waarschuwingen activeren en verkeer laten vallen als het verdachte activiteiten ontdekt.

Je kunt Suricata op een enkele machine installeren om het verkeer te bewaken, of op een gateway host inzetten om al het inkomende en uitgaande verkeer te scannen van andere servers die ermee verbonden zijn. Je kunt Suricata combineren met Elasticsearch, Kibana, en Filebeat om een Security Information and Event Management(SIEM) hulpmiddel te maken.

In deze zelfstudie installeer je Suricata IDS samen met ElasticStack op een Rocky Linux 8 server. De verschillende onderdelen van de stack zijn:

  • Elasticsearch om de beveiligingsgebeurtenissen van de server op te slaan, te indexeren, te correleren en te doorzoeken.
  • Kibana om de in Elasticsearch opgeslagen logs weer te geven.
  • Filebeat om Suricata’s eve.json logbestand te ontleden en elke gebeurtenis naar Elasticsearch te sturen voor verwerking.
  • Suricata om het netwerkverkeer te scannen op verdachte gebeurtenissen en de ongeldige pakketten te laten vallen.

De zelfstudie is in twee delen verdeeld, het eerste deel behandelt de installatie en configuratie van Suricata, en het tweede deel de installatie en configuratie van Elastic Stack.

We zullen Suricata en de Elastic stack op verschillende servers installeren voor onze zelfstudie.

Vereisten

  • De servers waarop de Elastic Stack en Suricata worden geïnstalleerd moeten minimaal 4 GB RAM en 2 CPU cores hebben.

  • De servers moeten met elkaar kunnen communiceren via privé IP adressen.

  • De servers moeten Rocky Linux 8 draaien met een niet-root sudo gebruiker.

  • Als je Kibana dashboards overal vandaan wilt kunnen benaderen, stel dan een domein in (kibana.example.com) dat naar de server wijst waar Suricata geïnstalleerd zal worden.

  • Installeer essentiële pakketten op beide servers.

    $ sudo dnf install yum-utils nano curl
    

Configureer de firewall

DEEL 1

Stap 1 – Installeer Suricata

Om Suricata te installeren, moet je de Open Information Security Foundation’s (OISF) pakket repository aan je server toevoegen.

$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @oisf/suricata-6.0

Het eerste commando schakelt de Community projecten (copr) in voor de dnf pakketinstaller. Het tweede commando schakelt de OISF repository in en voegt die toe aan je systeem. suricata-6.0 schakelt de repository in voor de laatste stabiele versie van de software. Druk telkens op y en ENTER als je daarom gevraagd wordt.

Voeg vervolgens de EPEL repository toe.

$ sudo dnf install epel-release

Installeer Suricata.

$ sudo dnf install suricata

Schakel de Suricata dienst in.

$ sudo systemctl enable suricata

Stap 2 – Configureer Suricata

Suricata slaat zijn configuratie op in het /etc/suricata/suricata.yaml bestand. De standaard modus voor Suricata is de IDS (Intrusion Detection System) modus, waarin het verkeer alleen gelogd wordt en niet gestopt. Als je nieuw bent met Suricata, kun je de modus beter ongewijzigd laten. Als je het eenmaal geconfigureerd hebt en meer geleerd hebt, kun je de IPS (Intrusion Prevention System) modus inschakelen.

Schakel Community ID in

Het community ID veld maakt het gemakkelijker gegevens te correleren tussen records die door verschillende bewakingstools gegenereerd worden. Omdat we Suricata met Elasticsearch zullen gebruiken, kan het inschakelen van Community ID nuttig zijn.

Open het bestand /etc/suricata/suricata.yaml om het te bewerken.

$ sudo nano /etc/suricata/suricata.yaml

Zoek de regel # Community Flow ID op en stel de waarde van de variabele community-id in op true.

. . .
      # Community Flow ID
      # Adds a 'community_id' field to EVE records. These are meant to give
      # records a predictable flow ID that can be used to match records to
      # output of other tools such as Zeek (Bro).
      #
      # Takes a 'seed' that needs to be same across sensors and tools
      # to make the id less predictable.

      # enable/disable the community id feature.
      community-id: true
. . .

Nu zullen je gebeurtenissen een ID dragen als 1:S+3BA2UmrHK0Pk+u3XH78GAFTtQ= dat je kunt gebruiken om datasets over verschillende bewakingstools te matchen.

Selecteer Netwerk Interface

Het standaard Suricata configuratiebestand inspecteert verkeer op het eth0 apparaat/de netwerkinterface. Als je server een andere netwerk interface gebruikt, zul je dat in de configuratie moeten bijwerken.

Controleer de apparaatnaam van je netwerk interface met het volgende commando.

$ ip -p -j route show default

Je krijgt dan een uitvoer als het volgende.

[ {
        "dst": "default",
        "gateway": "164.90.192.1",
        "dev": "eth0",
        "protocol": "static",
		"metric": 100,
        "flags": [ ]
    } ]

De variabele dev verwijst naar het netwerkapparaat. In onze uitvoer staat eth0 als het netwerkapparaat. Je uitvoer kan anders zijn, afhankelijk van je systeem.

Nu je de naam van je apparaat kent open je het configuratiebestand.

$ sudo nano /etc/suricata/suricata.yaml

Zoek de regel af-packet: rond regelnummer 580. Zet eronder de waarde van de variabele interface op de naam van het apparaat voor je systeem.

# Linux high speed capture support
af-packet:
  - interface: eth0
    # Number of receive threads. "auto" uses the number of cores
    #threads: auto
    # Default clusterid. AF_PACKET will load balance packets based on flow.
    cluster-id: 99
. . .

Als je extra interfaces wilt toevoegen, kun je dat doen door ze onderaan de sectie af-packet in te voegen, rond regel 650.

Om een nieuwe interface toe te voegen voeg je hem net boven de - interface: default sectie in, zoals hieronder.

    #  For eBPF and XDP setup including bypass, filter and load balancing, please
    #  see doc/userguide/capture-hardware/ebpf-xdp.rst for more info.

  - interface: enp0s1
    cluster-id: 98
...
  - interface: default
    #threads: auto
    #use-mmap: no
    #tpacket-v3: yes

We hebben in ons voorbeeld een nieuwe interface enp0s1 toegevoegd en een unieke waarde voor de variabele cluster-id. Je moet bij elke interface die je toevoegt een uniek cluster id vermelden.

Live Regel Herladen

Je moet Suricata opnieuw starten telkens als je regels toevoegt, verwijdert en bewerkt. Door Live Rule in te schakelen kan Suricata alle regelwijzigingen verwerken zonder opnieuw op te starten.

Om live herladen in te schakelen voeg je onderaan het configuratiebestand de volgende regels toe.

. . .

detect-engine:
  - rule-reload: true

Met live reloading ingeschakeld kun je het volgende commando gebruiken om regels te herladen zonder het Suricata proces te herstarten.

$ sudo kill -usr2 $(pidof suricata)

De vlag $(pidof suricata) lokaliseert het proces ID van het Suricata proces. Het -usr2 deel van het kill commando zendt een SIGUSR2 signaal naar het Suricata proces. Het SIGUSR2 signaal wordt met Suricata ingesteld om de regels opnieuw te laden.

Als je klaar bent, sla je het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Configureer Directory rechten

Suricata maakte tijdens het installatieproces automatisch een systeemgebruiker en groep aan met de naam suricata. Je moet de juiste directory rechten geven om de installatie goed te laten werken.

Voer het volgende commando uit om suricata in te stellen als de groep voor de mappen van Suricata.

$ sudo chgrp -R suricata /etc/suricata
$ sudo chgrp -R suricata /var/lib/suricata/rules
$ sudo chgrp -R suricata /var/lib/suricata/update
$ sudo chgrp -R suricata /var/log/suricata 

Stel de groepspermissies in voor lezen en schrijven.

$ sudo chmod -R g+r /etc/suricata/
$ sudo chmod -R g+rw /var/lib/suricata/rules
$ sudo chmod -R g+rw /var/lib/suricata/update
$ sudo chmod -R g+rw /var/log/suricata

Voeg je huidige gebruikersnaam toe aan de suricata groep, zodat je direct bewerkingen kunt uitvoeren zonder sudo nodig te hebben.

$ sudo usermod -a -G suricata $USER

Om het nieuwe groepslidmaatschap toe te passen, log je uit op de server en weer in, of typ je het volgende:

$ su - ${USER}

Je wordt gevraagd het wachtwoord van je gebruiker in te voeren om verder te gaan.

Bevestig dat je gebruiker nu aan de suricata groep is toegevoegd door te typen:

$ id -nG
username sudo suricata

Stap 3 – Configureer Suricata regels

Suricata gebruikt standaard slechts een beperkte set regels om netwerkverkeer te detecteren. Je kunt meer regelsets van externe aanbieders toevoegen met een hulpmiddel dat suricata-update heet. Voer het volgende commando uit om extra regels op te nemen.

$ suricata-update
16/2/2022 -- 07:00:16 - <Info> -- Using data-directory /var/lib/suricata.
16/2/2022 -- 07:00:16 - <Info> -- Using Suricata configuration /etc/suricata/suricata.yaml
16/2/2022 -- 07:00:16 - <Info> -- Using /usr/share/suricata/rules for Suricata provided rules.
.....
16/2/2022 -- 07:00:16 - <Info> -- No sources configured, will use Emerging Threats Open
('https://rules.emergingthreats.net/open/suricata-6.0.4/emerging.rules.tar.gz', None, True)
16/2/2022 -- 07:00:16 - <Info> -- Checking https://rules.emergingthreats.net/open/suricata-6.0.4/emerging.rules.tar.gz.md5.
16/2/2022 -- 07:00:16 - <Info> -- Fetching https://rules.emergingthreats.net/open/suricata-6.0.4/emerging.rules.tar.gz.
 100% - 3162050/3162050
.....
16/2/2022 -- 07:00:23 - <Info> -- Writing rules to /var/lib/suricata/rules/suricata.rules: total: 32004; enabled: 24611; added: 8; removed 1; modified: 1218
16/2/2022 -- 07:00:23 - <Info> -- Writing /var/lib/suricata/rules/classification.config
16/2/2022 -- 07:00:23 - <Info> -- Testing with suricata -T.
16/2/2022 -- 07:01:16 - <Info> -- Done.

Regelset-aanbieders toevoegen

Je kunt Suricata’s regels uitbreiden door meer providers toe te voegen. Het kan regels ophalen van een verscheidenheid aan gratis en commerciële providers.

Je kunt de standaard lijst van providers opvragen met het volgende commando.

$ suricata-update list-sources

Als je bijvoorbeeld de tgreen/hunting regelset wilt opnemen, kun je die inschakelen met het volgende commando.

$ suricata-update enable-source tgreen/hunting

Voer het suricata-update commando opnieuw uit om de nieuwe regels te downloaden en bij te werken.

Stap 4 – Valideer de Suricata configuratie

Suricata wordt geleverd met een validatiehulpmiddel om het configuratiebestand en de regels op fouten te controleren. Voer het volgende commando uit om het validatiegereedschap te starten.

$ sudo suricata -T -c /etc/suricata/suricata.yaml -v
22/2/2022 -- 23:20:10 - <Info> - Running suricata under test mode
22/2/2022 -- 23:20:10 - <Notice> - This is Suricata version 6.0.4 RELEASE running in SYSTEM mode
22/2/2022 -- 23:20:10 - <Info> - CPUs/cores online: 2
22/2/2022 -- 23:20:10 - <Info> - dropped the caps for main thread
22/2/2022 -- 23:20:10 - <Info> - fast output device (regular) initialized: fast.log
22/2/2022 -- 23:20:10 - <Info> - eve-log output device (regular) initialized: eve.json
22/2/2022 -- 23:20:10 - <Info> - stats output device (regular) initialized: stats.log
22/2/2022 -- 23:20:21 - <Info> - 1 rule files processed. 24611 rules successfully loaded, 0 rules failed
22/2/2022 -- 23:20:21 - <Info> - Threshold config parsed: 0 rule(s) found
22/2/2022 -- 23:20:21 - <Info> - 24614 signatures processed. 1216 are IP-only rules, 4120 are inspecting packet payload, 19074 inspect application layer, 108 are decoder event only
22/2/2022 -- 23:21:02 - <Notice> - Configuration provided was successfully loaded. Exiting.
22/2/2022 -- 23:21:03 - <Info> - cleaning up signature grouping structure... complete

De vlag -T instrueert Suricata om in testmodus te draaien, de vlag -c configureert de locatie van het configuratiebestand, en de vlag -v drukt de verbose uitvoer van het commando af. Afhankelijk van je systeemconfiguratie en het aantal toegevoegde regels kan het een paar minuten duren voor het commando klaar is.

Stap 5 – Suricata uitvoeren

Nu Suricata geconfigureerd en ingesteld is, is het tijd om de toepassing te draaien.

$ sudo systemctl start suricata

Controleer de status van het proces.

$ sudo systemctl status suricata

Je zou de volgende uitvoer moeten zien als alles correct werkt.

? suricata.service - Suricata Intrusion Detection Service
   Loaded: loaded (/usr/lib/systemd/system/suricata.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-02-16 07:14:22 UTC; 32min ago
     Docs: man:suricata(1)
  Process: 1494 ExecStartPre=/bin/rm -f /var/run/suricata.pid (code=exited, status=0/SUCCESS)
 Main PID: 1496 (Suricata-Main)
    Tasks: 8 (limit: 23479)
   Memory: 367.5M
   CGroup: /system.slice/suricata.service
           ??1496 /sbin/suricata -c /etc/suricata/suricata.yaml --pidfile /var/run/suricata.pid -i eth0 --user suricata

Feb 16 07:14:22 suricata systemd[1]: Starting Suricata Intrusion Detection Service...
Feb 16 07:14:22 suricata systemd[1]: Started Suricata Intrusion Detection Service.

Het proces kan een paar minuten duren om alle regels te parseren. Daarom is de bovenstaande statuscontrole geen volledige indicatie of Suricata up and ready is. Je kunt het logbestand daarvoor controleren met het volgende commando.

$ sudo tail -f /var/log/suricata/suricata.log

Als je de volgende regel in het logbestand ziet, betekent dat dat Suricata draait en klaar is om netwerkverkeer te monitoren.

16/02/2022 -- 07:18:39 - <Info> - All AFP capture threads are running.

Stap 6 – Testen van Suricata regels

We zullen controleren of Suricata verdacht verkeer detecteert. De Suricata gids beveelt aan de ET Open regel nummer 2100498 te testen met het volgende commando.

$ curl http://testmynids.org/uid/index.html

Je krijgt het volgende antwoord.

uid=0(root) gid=0(root) groups=0(root)

Het bovenstaande commando doet alsof het de uitvoer geeft van hetid commando dat op een gecompromitteerd systeem kan worden uitgevoerd. Om te testen of Suricata het verkeer detecteerde, moet je het logbestand bekijken met het opgegeven regelnummer.

$ grep 2100498 /var/log/suricata/fast.log

Als je verzoek IPv6 gebruikte, zou je de volgende uitvoer moeten zien.

02/22/2022-23:24:33.997371  [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 2600:9000:2204:5c00:0018:30b3:e400:93a1:80 -> 2a03:b0c0:0002:00d0:0000:0000:0fc2:b001:41468

Als je verzoek IPv4 gebruikte, zou je de volgende uitvoer zien.

02/22/2022-23:21:46.783476  [**] [1:2100498:7] GPL ATTACK_RESPONSE id check returned root [**] [Classification: Potentially Bad Traffic] [Priority: 2] {TCP} 204.246.178.81:80 -> 164.90.192.1:36364

Suricata logt ook gebeurtenissen naar het /var/log/suricata/eve.log bestand in JSON formaat. Om die regels te lezen en te interpreteren, moet je jq installeren, wat buiten het bestek van deze zelfstudie valt.

We zijn klaar met deel één van de zelfstudie, waarin we Suricata installeerden en het testten. Het volgende deel behelst de installatie van de ELK stack en de instelling ervan om Suricata en zijn logs te visualiseren. Dit deel twee van de zelfstudie moet op de tweede server gebeuren, tenzij anders aangegeven.

Stap 7 – Installeer Elasticsearch en Kibana

De eerste stap in de installatie van Elasticsearch bestaat uit het toevoegen van de Elastic GPG sleutel aan je server.

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Maak een repository voor het Elasticsearch pakket door het bestand /etc/yum/yum.repos.d/elasticsearch.repo aan te maken en te openen voor bewerking.

$ sudo nano /etc/yum.repos.d/elasticsearch.repo

Plak er de volgende code in.

[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Installeer Elasticsearch en Kibana.

$ sudo dnf install --enablerepo=elasticsearch elasticsearch kibana

Je moet telkens de vlag --enablerepo=elasticsearch gebruiken, want we hebben de repository standaard uitgeschakeld gehouden. Dit voorkomt het per ongeluk upgraden van deze pakketten.

Zoek het privé IP adres van je server op met het volgende commando.

$ ip -brief address show
lo               UNKNOWN        127.0.0.1/8 ::1/128
eth0             UP             164.90.205.77/20 10.18.0.7/16 2a03:b0c0:2:d0::fef:b001/64 fe80::340a:6eff:fe5c:76ed/64
eth1             UP             10.133.0.3/16 fe80::906f:b5ff:fec4:c7b8/64

Noteer het privé IP van je server (10.133.0.3 in dit geval). We zullen het aanduiden als your_private_IP. Het publieke IP adres van de server (164.90.205.77) zal in de verdere handleiding your_public_IP genoemd worden. Noteer ook de netwerknaam van je server, eth1.

Stap 8 – Configureer Elasticsearch

Elasticsearch slaat zijn configuratie op in het /etc/elasticsearch/elasticsearch.yml bestand. Open het bestand om het te bewerken.

$ sudo nano /etc/elasticsearch/elasticsearch.yml

Elasticsearch accepteert standaard alleen lokale verbindingen. We moeten dit veranderen zodat Kibana het via het privé IP adres kan benaderen.

Zoek de regel #network.host: 192.168.0.1 en voeg er de volgende regel vlak onder toe, zoals hieronder.

# By default Elasticsearch is only accessible on localhost. Set a different
# address here to expose this node on the network:
#
#network.host: 192.168.0.1
network.bind_host: ["127.0.0.1", "your_private_IP"]
#
# By default Elasticsearch listens for HTTP traffic on the first free port it
# finds starting at 9200. Set a specific HTTP port here:

Dit zorgt ervoor dat Elastic nog steeds lokale verbindingen kan accepteren terwijl het voor Kibana beschikbaar is via het privé IP adres.

De volgende stap is om enkele beveiligingsfuncties aan te zetten en ervoor te zorgen dat Elastic geconfigureerd is om op een enkele node te draaien. Om dat te doen voeg je de volgende regels toe aan het eind van het bestand.

. . .
discovery.type: single-node
xpack.security.enabled: true

Als je meerdere Elastic zoekknooppunten gaat gebruiken, kun je de eerste regel weglaten.

Als je klaar bent, sla je het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Configureer de firewall

Voeg de juiste firewall regels voor Elasticsearch toe, zodat het via het privé netwerk toegankelijk is.

$ sudo firewall-cmd --permanent --zone=internal --change-interface=eth1
$ sudo firewall-cmd --permanent --zone=internal --add-service=elasticsearch
$ sudo firewall-cmd --permanent --zone=internal --add-service=kibana
$ sudo firewall-cmd --reload

Let erop dat je in het eerste commando de interfacenaam kiest zoals je die uit stap 7 kreeg. De bovenstaande commando’s veranderen de standaard zone van de firewall in intern en openen poorten 9200, 9300 voor Elasticsearch en poort 5601 voor Kibana.

Start Elasticsearch

Nu je Elasticsearch geconfigureerd hebt, is het tijd om de dienst te starten.

$ sudo systemctl start elasticsearch

Maak wachtwoorden voor Elasticsearch

Na het inschakelen van de beveiligingsinstelling van Elasticsearch is de volgende stap het aanmaken van een aantal wachtwoorden voor de standaard gebruiker. Elasticsearch wordt geleverd met een hulpprogramma voor het maken van wachtwoorden op /usr/share/elasticsearch/bin/elasticsearch-setup-passwords dat willekeurige wachtwoorden kan genereren.

Maak de wachtwoorden.

$ cd /usr/share/elasticsearch/bin
$ sudo ./elasticsearch-setup-passwords auto

Je krijgt een uitvoer als het volgende. Druk op y om verder te gaan als daarom gevraagd wordt.

Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y


Changed password for user apm_system
PASSWORD apm_system = EtwMg8maU67o5tvD5rse

Changed password for user kibana_system
PASSWORD kibana_system = dTanR7Q2HtgDtATRvuJv

Changed password for user kibana
PASSWORD kibana = dTanR7Q2HtgDtATRvuJv

Changed password for user logstash_system
PASSWORD logstash_system = XGSjxNktuNMWVfGYibox

Changed password for user beats_system
PASSWORD beats_system = JXTr7CeHkMue608qVTQa

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = Q6JTJNl3lPy0fhy6QuMP

Changed password for user elastic
PASSWORD elastic = bd1YJfhSa8RC8SMvTIwg

Je kunt het hulpprogramma maar één keer uitvoeren, dus bewaar alle wachtwoorden op een veilige plaats.

Stap 9 – Configureer Kibana

De eerste stap in het instellen van Kibana is het inschakelen van de xpack beveiligingsfunctie door geheime sleutels te genereren. Kibana gebruikt deze geheime sleutels om gegevens in Elasticsearch op te slaan. Het hulpprogramma om geheime sleutels te genereren is te vinden in de map /usr/share/kibana/bin.

$ cd /usr/share/kibana/bin/
$ sudo ./kibana-encryption-keys generate -q --force

De vlag -q onderdrukt de commando instructies, en de vlag --force zorgt ervoor dat verse geheimen worden gegenereerd. Je krijgt een uitvoer als de volgende.

xpack.encryptedSavedObjects.encryptionKey: 0f4e5e1cf8fad1874ffed0faac6be0da
xpack.reporting.encryptionKey: d435c78a4e37521e539c0e905420c9f5
xpack.security.encryptionKey: 7ba0e2a02747bb90fb0f9a3c267b99ed

Kopieer de uitvoer. Open het Kibana’s configuratiebestand op /etc/kibana/kibana.yml om het te bewerken.

$ sudo nano /etc/kibana/kibana.yml

Plak de code van het vorige commando aan het eind van het bestand.

. . .

# Specifies locale to be used for all localizable strings, dates and number formats.
# Supported languages are the following: English - en , by default , Chinese - zh-CN .
#i18n.locale: "en"

xpack.encryptedSavedObjects.encryptionKey: 0f4e5e1cf8fad1874ffed0faac6be0da
xpack.reporting.encryptionKey: d435c78a4e37521e539c0e905420c9f5
xpack.security.encryptionKey: 7ba0e2a02747bb90fb0f9a3c267b99ed

Configureer de poort van Kibana

Kibana moet zo ingesteld worden dat het toegankelijk is op het privé IP adres van de server. Zoek de regel #server.host: "localhost" in het bestand en voeg de volgende regel vlak eronder toe zoals getoond.

# Kibana is served by a back end server. This setting specifies the port to use.
#server.port: 5601

# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
#server.host: "localhost"
server.host: "your_private_IP"

Als je klaar bent, sla je het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Configureer Kibana toegang

De volgende stap is het aanmaken van een gebruikersnaam en wachtwoord die Kibana kan gebruiken voor authenticatie. Je kunt dat doen door Kibana’s configuratiebestand direct te bewerken, maar dat kan een beveiligingsprobleem opleveren. De veilige methode omvat het gebruik van de applicatie kibana-keystore.

Voer de volgende commando’s uit om een gebruikersnaam in te stellen. Voer kibana_system in als gebruikersnaam.

$ cd /usr/share/kibana/bin
$ sudo ./kibana-keystore add elasticsearch.username
Enter value for elasticsearch.username: *************

Voer het commando nogmaals uit om het wachtwoord in te stellen. Zorg ervoor dat je het wachtwoord gebruikt dat je in stap 8 voor Kibana maakte. Voor onze zelfstudie is het wachtwoord dTanR7Q2HtgDtATRvuJv.

$ sudo ./kibana-keystore add elasticsearch.password
Enter value for elasticsearch.password: ********************

Kibana starten

Nu je veilige toegang en netwerken voor Kibana hebt ingesteld, start je het proces.

$ sudo systemctl start kibana

Controleer de status om te zien of het draait.

$ sudo systemctl status kibana

Stap 10 – Installeer en configureer Filebeat

Het is belangrijk op te merken dat we Filebeat zullen installeren op de Suricata server. Schakel daar dus naar terug en voeg de Elastic GPG sleutel toe om aan de slag te gaan.

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Maak en open de elastische repository.

$ sudo nano /etc/yum.repos.d/elasticsearch.repo

Plak de volgende code.

[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Installeer Filebeat.

$ sudo dnf install --enablerepo=elasticsearch filebeat

Filebeat slaat zijn configuratie op in het /etc/filebeat/filebeat.yml bestand. Open het om het te bewerken.

$ sudo nano /etc/filebeat/filebeat.yml

Het eerste wat je moet doen is het verbinden met het dashboard van Kibana. Zoek de regel #host: "localhost:5601" in de Kibana sectie en voeg er de volgende regel vlak onder toe zoals getoond.

. . .
# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
# This requires a Kibana endpoint configuration.
setup.kibana:

  # Kibana Host
  # Scheme and port can be left out and will be set to the default (http and 5601)
  # In case you specify and additional path, the scheme is required: http://localhost:5601/path
  # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
  #host: "localhost:5601"
  host: "your_private_IP:5601"

. . .

Zoek vervolgens de Elasticsearch Output sectie van het bestand en bewerk de waarden van hosts, username, en password zoals hieronder getoond. Kies voor de gebruikersnaam elastic als waarde, en gebruik voor het wachtwoord de waarde die in stap 8 van deze handleiding gegenereerd werd.

output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["your_private_IP:9200"]

  # Protocol - either `http` (default) or `https`.
  #protocol: "https"

  # Authentication credentials - either API key or username/password.
  #api_key: "id:api_key"
  username: "elastic"
  password: "bd1YJfhSa8RC8SMvTIwg"

. . .

Als je klaar bent, sla je het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Schakel vervolgens Filebeat’s ingebouwde Suricata module in.

$ sudo filebeat modules enable suricata

De laatste stap bij het instellen van Filebeat is het laden van de SIEM dashboards en pijplijnen in Elasticsearch met het filebeat setup commando.

$ sudo filebeat setup

Het kan een paar minuten duren voor het commando klaar is. Als het klaar is, zou je de volgende uitvoer moeten krijgen.

Overwriting ILM policy is disabled. Set `setup.ilm.overwrite: true` for enabling.

Index setup finished.
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
Setting up ML using setup --machine-learning is going to be removed in 8.0.0. Please use the ML app instead.
See more: https://www.elastic.co/guide/en/machine-learning/current/index.html
It is not possble to load ML jobs into an Elasticsearch 8.0.0 or newer using the Beat.
Loaded machine learning job configurations
Loaded Ingest pipelines

Start de Filebeat dienst.

$ sudo systemctl start filebeat

Controleer de status van de dienst.

$ sudo systemctl status filebeat

Stap 11 – Toegang tot het Kibana Dashboard

Omdat KIbana zo is ingesteld dat het alleen via zijn privé IP adres toegang heeft tot Elasticsearch, heb je twee mogelijkheden om het te benaderen. De eerste methode is om vanaf je PC een SSH Tunnel naar de Elasticsearch server te gebruiken. Dit zal poort 5601 van je PC doorsturen naar het privé IP adres van de server, en je zult Kibana vanaf je PC kunnen benaderen op http://localhost:5601. Maar deze methode betekent dat je er nergens anders meer bij kunt.

De optie is om Nginx op je Suricata server te installeren en die als een reverse proxy te gebruiken om de Elasticsearch server te benaderen via zijn privé IP adres. We zullen beide manieren bespreken. Je kunt beide manieren kiezen, afhankelijk van je eisen.

SSH lokale tunnel gebruiken

Als je Windows 10 of Windows 11 gebruikt, kun je de SSH LocalTunnel uitvoeren vanuit je Windows Powershell. Op Linux of macOS kun je de terminal gebruiken. Je zult waarschijnlijk SSH toegang moeten configureren als je dat nog niet gedaan hebt.

Voer het volgende commando uit in de terminal van je computer om de SSH Tunnel te maken.

$ ssh -L 5601:your_private_IP:5601 [email protected]_public_IP -N
  • De -L vlag verwijst naar de lokale SSH Tunnel, die het verkeer van de poort van je PC doorstuurt naar de server.
  • De private_IP:5601 is het IP adres waar je verkeer naar doorgestuurd wordt op de server. Vervang het in dit geval door het privé IP adres van je Elasticsearch server.
  • De your_public_IP is het openbare IP adres van de Elasticsearch server, dat gebruikt wordt om een SSH verbinding te openen.
  • De vlag -N vertelt OpenSSH geen commando uit te voeren, maar de verbinding in leven te houden zolang de tunnel loopt.

Nu de tunnel open is, kun je Kibana openen door de URL http://localhost:5601 in de browser van je PC te openen. Je krijgt dan het volgende scherm.

Kibana Dashboard Inloggen

Je zult het commando moeten laten lopen zolang je toegang tot Kibana nodig hebt. Druk op Ctrl + C in je terminal om de tunnel te sluiten.

Nginx Reverse-proxy gebruiken

Deze methode is het meest geschikt als je van overal ter wereld toegang tot het dashboard wilt.

Firewall configureren

Voor je verder gaat, moet je HTTP en HTTPS poorten openen in de firewall.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Herlaad de firewall om de veranderingen mogelijk te maken.

$ sudo firewall-cmd --reload

SSL installeren en instellen

De eerste stap is het installeren van het Let’s Encrypt SSL Certificaat. Omdat we de EPEL repository al hebben ingesteld, installeer je het Certbot gereedschap.

$ sudo dnf install certbot

Genereer het SSL certificaat voor het domein kibana.example.com.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d kibana.example.com

Het bovenstaande commando downloadt een certificaat naar de /etc/letsencrypt/live/kibana.example.com directory op je server.

Genereer een Diffie-Hellman groepscertificaat.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Maak een challenge web root directory voor Let’s Encrypt auto-renewal.

$ sudo mkdir -p /var/lib/letsencrypt

Maak een Cron Job om de SSL te vernieuwen. Deze zal elke dag lopen om het certificaat te controleren en zo nodig te vernieuwen. Maak daarvoor eerst het bestand /etc/cron.daily/certbot-renew en open het om te bewerken.

$ sudo nano /etc/cron.daily/certbot-renew

Plak er de volgende code in.

#!/bin/sh
certbot renew --cert-name kibana.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Verander de permissies op het taakbestand om het uitvoerbaar te maken.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Installeer en configureer Nginx

Raket Linux 8.5 wordt geleverd met de laatste stabiele versie van Nginx als module. Installeer het met het volgende commando.

$ sudo dnf module install nginx:1.20

Je kunt de versie die je wilt installeren controleren met het volgende commando.

$ dnf module list nginx
Rocky Linux 8 - AppStream
Name                                           Stream                                            Profiles                                                Summary
nginx                                          1.14 [d]                                          common [d]                                              nginx webserver
nginx                                          1.16                                              common [d]                                              nginx webserver
nginx                                          1.18                                              common [d]                                              nginx webserver
nginx                                          1.20 [e]                                          common [d] [i]                                          nginx webserver

Extra Packages for Enterprise Linux Modular 8 - x86_64
Name                                           Stream                                            Profiles                                                Summary
nginx                                          mainline                                          common                                                  nginx webserver
nginx                                          1.20 [e]                                          common [d] [i]                                          nginx webserver

Bevestig de Nginx installatie.

$ nginx -v
nginx version 1.20.1

Schakel de Nginx dienst in.

$ sudo systemctl enable nginx

Maak en open het Nginx configuratiebestand voor Kibana.

$ sudo nano /etc/nginx/conf.d/kibana.conf

Plak er de volgende code in. Vervang het IP adres door het privé IP adres van je Elasticsearch server.

server {
        listen 80; listen [::]:80;
        server_name kibana.example.com;
        return 301 https://$host$request_uri;
}

server {
        server_name kibana.example.com;
        charset utf-8;

        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        access_log /var/log/nginx/kibana.access.log;
        error_log /var/log/nginx/kibana.error.log;

        ssl_certificate /etc/letsencrypt/live/kibana.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/kibana.example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/kibana.example.com/chain.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m;
        ssl_session_tickets off;

        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
		
		resolver 8.8.8.8;

        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
 
        location / {
                proxy_pass http://your_private_IP:5601;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Open het bestand /etc/nginx/nginx.conf om het te bewerken.

$ sudo nano /etc/nginx/nginx.conf

Voeg de volgende regel toe vóór de regel include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren wanneer daarom wordt gevraagd.

Verifieer de configuratie.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Start de Nginx dienst.

$ sudo systemctl start nginx

Je Kibana dashboard zou toegankelijk moeten zijn via de URL https://kibana.example.com van waar je maar wilt.

Stap 12 – Kibana dashboards beheren

Voor je verder gaat met het beheren van de dashboards, moet je het basis URL veld toevoegen in Kibana’s configuratie.

Open het configuratiebestand van Kibana.

$ sudo nano /etc/kibana/kibana.yml

Zoek de regel #server.publicBaseUrl: "" met commentaar en verander het als volgt door de hash ervoor te verwijderen.

server.publicBaseUrl: "https://kibana.example.com"

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Herstart de Kibana dienst.

$ sudo systemctl restart kibana

Wacht een paar minuten en laad de URL https://kibana.example.com in je browser. Log in met de gebruikersnaam elastic en het wachtwoord dat je eerder genereerde (bd1YJfhSa8RC8SMvTIwg) en je krijgt het volgende scherm.

Kibana Dashboard

Typ type:data suricata in het zoekvak bovenaan om de informatie van Suricata te vinden.

Suricata zoeken in Kibana

Klik op het eerste resultaat ([Filebeat Suricata] Alert Overview), en je krijgt een scherm dat lijkt op het volgende. Standaard toont het de vermeldingen van alleen de laatste 15 minuten, maar we tonen het over een grotere tijdspanne om meer gegevens voor de uitleg te laten zien.

Filebeat Suricata waarschuwingen

Klik op de knop Events om alle gelogde gebeurtenissen te zien.

Filebeat Suricata Gebeurtenissen

Als je op de pagina’s met gebeurtenissen en waarschuwingen naar beneden scrollt, kun je elke gebeurtenis en waarschuwing identificeren aan de hand van het soort protocol, de bron- en doelpoorten, en het IP adres van de bron. Je kunt ook de landen bekijken waar het verkeer vandaan kwam.

Je kunt Kibana en Filebeat gebruiken om andere soorten dashboards te openen en te genereren. Een van de nuttige ingebouwde dashboards die je meteen kunt gebruiken is het Beveiligingsdashboard. Klik op het Netwerk dashboard uit het linker hamburger menu, en je krijgt het volgende scherm.

Kibana beveiligingsdashboard

Je kunt meer dashboards toevoegen zoals Nginx door de ingebouwde Filebeat modules in te schakelen en te configureren.

Conclusie

Dit is het einde van de zelfstudie over het installeren en instellen van Suricata IDS met Elastic Stack op een Rocky Linux 8 gebaseerde server. Je hebt ook Nginx als reverse proxy geconfigureerd om extern toegang te krijgen tot Kibana dashboards. Als je vragen hebt, stel ze dan in de commentaar hieronder.