Elastic SIEM w pigułce (część 2)

Jest to kontynuacja poprzedniego wpisu. Tym razem przyjrzymy się zakładce Detections w Elastic SIEM. Naszym celem jest automatyzacja wykrywania IOC wykorzystując sprawdzone reguły. Przypomnijmy: Zainstalowaliśmy Elasticsearch + Kibana na jednej z maszyn. Monitorujemy maszynę z Ubuntu (Auditbeat, Filebeat, Packetbeat) i Windows 10 (Winlogbeat), choć w tym wpisie skupimy się na tej drugiej.

Jak odblokować Detections w Elastic SIEM?

Według dokumentacji należy:

  • Zapewnić komunikacje Elasticsearch – Kibana po TLS
  • Włączyć xpack.security w Elasticsearch
  • Skonfigurować xpack.encryptedSavedObjects.encryptionKey w Kibanie

Konfiguracja security w Elasticsearch

W tym przypadku mamy jedno-węzłowy klaster Elasticsearch, więc wystarczy tylko dopisać na koniec pliku /etc/elasticsearch/elasticsearch.yml linijkę

xpack.security.enabled: true

i zrestartować serwis Elasticsearch

service elasticsearch restart

Uwaga: W przypadku normalnego klastra nie będzie tak łatwo. Trzeba zabezpieczyć komunikację między węzłami. Tutaj znajdziesz szczegóły.

Właśnie zepsuliśmy cały system zbierania logów, ponieważ od teraz wymagane jest uwierzytelnianie ?.

root@ELK:/etc/elasticsearch# curl localhost:9200?pretty
{
  "error" : {
    "root_cause" : [
      {
        "type" : "security_exception",
        "reason" : "missing authentication credentials for REST request [/?pretty]",
        "header" : {
          "WWW-Authenticate" : "Basic realm=\"security\" charset=\"UTF-8\""
        }
      }
    ],
    "type" : "security_exception",
    "reason" : "missing authentication credentials for REST request [/?pretty]",
    "header" : {
      "WWW-Authenticate" : "Basic realm=\"security\" charset=\"UTF-8\""
    }
  },
  "status" : 401
}

Musimy wygenerować domyślne konta oraz hasła. Służy do tego specjalne narzędzie elasticsearch-setup-passwords znajdujące się w katalogu binarek Elasticsearch czyli /usr/share/elasticsearch/bin/. Dla ułatwienia wszędzie wpisałem to samo (elastic), ale nie powtarzaj tego kroku ?.

root@ELK:/etc/elasticsearch# cd /usr/share/elasticsearch/
root@ELK:/usr/share/elasticsearch# bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

Teraz Elasticsearch odpowie nam gdy przekażemy login oraz hasło.

root@ELK:/usr/share/elasticsearch# curl -u elastic:elastic localhost:9200?pretty 
{                                                                                
  "name" : "ELK",                                                                
  "cluster_name" : "siem",                                                       
  "cluster_uuid" : "u6FDeHNsTmWJcnf-jYUH7Q",                                     
  "version" : {                                                                  
    "number" : "7.8.1",                                                          
    "build_flavor" : "default",                                                  
    "build_type" : "deb",                                                        
    "build_hash" : "b5ca9c58fb664ca8bf9e4057fc229b3396bf3a89",                   
    "build_date" : "2020-07-21T16:40:44.668009Z",                                
    "build_snapshot" : false,                                                    
    "lucene_version" : "8.5.1",                                                  
    "minimum_wire_compatibility_version" : "6.8.0",                              
    "minimum_index_compatibility_version" : "6.0.0-beta1"                        
  },                                                                             
  "tagline" : "You Know, for Search"                                             
}

Musimy też „naprawić” Kibanę dodając login i hasło do /etc/kibana/kibana.yml

...
elasticsearch.username: "kibana_system"
elasticsearch.password: "elastic"
...

Konfiguracja TLS między Elasticsearch i Kibana

Do konfiguracji TLS potrzebne jest nam CA i certyfikat. Jeśli masz swoje PKI – świetnie – jeśli nie masz, to trzeba wygenerować CA. Elasticsearch ma do tego specjalne narzędzie elasticsearch-certutil, które ułatwi ten proces.

root@ELK:/usr/share/elasticsearch# ./bin/elasticsearch-certutil ca
This tool assists you in the generation of X.509 certificates and certificate
signing requests for use with SSL/TLS in the Elastic stack.

The 'ca' mode generates a new 'certificate authority'
This will create a new X.509 certificate and private key that can be used
to sign certificate when running in 'cert' mode.

Use the 'ca-dn' option if you wish to configure the 'distinguished name'
of the certificate authority

By default the 'ca' mode produces a single PKCS#12 output file which holds:
    * The CA certificate
    * The CA's private key

If you elect to generate PEM format certificates (the -pem option), then the output will
be a zip file containing individual files for the CA certificate and private key

Please enter the desired output file [elastic-stack-ca.p12]:
Enter password for elastic-stack-ca.p12 :

Po wygenerowaniu CA (elastic-stack-ca.p12) możemy utworzyć certyfikat.

./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p./bin/elasticsearch-certutil cert \
> --ca elastic-stack-ca.p12 \
> --dns localhost \
> --ip 127.0.0.1 \
> --out http.p12

Wygenerowany http.12 umieszczam w /etc/elasticsearch/certs/ i ustawiam prawa do folderu.

mkdir /etc/elasticsearch/certs
cp elastic-stack-ca.p12 /etc/elasticsearch/certs/
cp http.p12 /etc/elasticsearch/certs/
chown -R elasticsearch:elasticsearch /etc/elasticsearch/certs/

Teraz w /etc/elasticsearch/elasticsearch.yml możemy dodać utworzony certyfikat do komunikacji http. Jak nie pasuje Ci podawanie jawnie hasła w pliku konfiguracyjnym, jest też opcja z keystore’em.

...
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: "./certs/http.p12"
xpack.security.http.ssl.keystore.password: "elastic"

Po zrestartowaniu serwisu poprzedni curl nie będzie nic zwracać.

root@ELK:/etc/elasticsearch# curl -u elastic:elastic localhost:9200?pretty
curl: (52) Empty reply from server

Trzeba zmienic url na https://…, będzie jednak problem z niezaufanym CA.

root@ELK:/etc/elasticsearch# curl -u elastic:elastic https://localhost:9200?pretty
curl: (60) SSL certificate problem: self signed certificate in certificate chain
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

…który możemy zignorować –insecure ?.

root@ELK:/etc/elasticsearch# curl -u elastic:elastic --insecure https://localhost:9200?pretty 
{                                   
  "name" : "ELK",                   
  "cluster_name" : "siem",          
  "cluster_uuid" : "u6FDeHNsTmWJcnf-
  "version" : {                     
    "number" : "7.8.1",             
    "build_flavor" : "default",     
    "build_type" : "deb",           
    "build_hash" : "b5ca9c58fb664ca8
    "build_date" : "2020-07-21T16:40
    "build_snapshot" : false,       
    "lucene_version" : "8.5.1",     
    "minimum_wire_compatibility_vers
    "minimum_index_compatibility_ver
  },                                
  "tagline" : "You Know, for Search"
} 

Naprawa Kibana – zaufanie CA

Musimy jeszcze przywrócić do porządku Kibane. Zamiast PKCS12, wciągniemy CA w postaci pliku PEM i wrzucimy go do katalogu z konfiguracją Kibana.

openssl pkcs12 -in elastic-stack-ca.p12 -out ca.pem -clcerts -noke ys
cp cert.pem /etc/kibana
chown kibana:kibana /etc/kibana/ca.pem

Teraz pozostaje nam tylko dodać wpisy do /etc/kibana/kibana.yml i zrestartować serwis kibana.

...
elasticsearch.hosts: ["https://localhost:9200"]
elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/ca.pem"]
...
xpack.encryptedSavedObjects.encryptionKey: 'fhjskloppd678ehkdfdlliverpoolfcr'

Naprawa Beats’ów

Pewnie myślałeś, że to już koniec. Niespodzianka ?. Elasticsearch wymaga teraz uwierzytelniania. Pójdziemy trochę na skróty i użyjemy konta superusera i zignorujemy weryfikację CA. Nie rób tego na produkcji!

Naprawa polega na odpowiedniej konfigracji sekcji output.elasticsearch.

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

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

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

Plik konfiguracyjny Winlogbeat znajdziesz tutaj C:\ProgramData\Elastic\Beats\winlogbeat\winlogbeat.yml.

Zrestartować serwis Winlogbeat możesz wpisując poniższą komendę w PowerShell’u.

Restart-Service winlogbeat

Wczytanie domyślnych reguł detekcji Elastic SIEM

W końcu mamy dostęp do modułu detekcji. Możemy wczytać domyslne reguły.

Lista domyślnych reguł jest dość spora. W celu testu aktywowałem wszystkie.

Każda reguła ma opis i zależności. Część z nich wymaga funkcjonalności Machine Learning (czytaj: jest płatna).

W darmowej wersji nie mamy możliwości wysyłania powiadomień o zidentyfikowanych detekcjach.

Weryfikacja wykrywania reguł

APTSimulator

Wykorzystamy maszynę z Windows 10. Pomoże nam w tym APTSimulator. Po ściągnięciu wystarczy rozpakować i odpalić APTSimulator.bat.

Wybieramy opcję RUN EVERY TEST

I teraz zaskoczenie. Wygenerowane ataki nie zostały wykryte.

Konfiguracja Sysmon

Winlogbeat zbiera tyle danych, ile udostępnia mu system operacyjny. Musimy zwiększyć obszar interesujących nas zdarzeń w systemie. Sysmon jest to monitor wewnętrznej aktywności Windowsa. Jest to usługa systemowa, która śledzi aktywność systemu plików, rejestru, sieci i działających aplikacji.

Po ściągnięciu możemy przystąpić do instalacji

Sysmon64.exe -i -accepteula -h md5,sha256,imphash -l -n

W tym przypadku będziemy chcieli zbierać wszystko. W praktyce powinniśmy zastanowić się, które zdarzenia są dla nas istotne. Posłużymy się konfiguracją z projektu HELK. Tutaj link do konfiguracji.

Sysmon64.exe -c config.xml

Wykryte zagrożenia

Po ponownym odpaleniu APTSimulator już widać efekty. Oprócz samego zdarzenia, widzimy poziom ryzyka oraz skąd pochodzi informacja.

Z poziomu wykrytych reguł możemy utworzyć nowy timeline i zacząć dochodzenie.

Kurs Elastic Stack

Jestem w trakcie tworzenia kursu z Elastic Stack. Przejdziesz tam drogę od postawienia klastra, wypełnienia go danymi, zabezpieczenia, administracji i wyszukiwania. Wszystko to oparte o darmową licencję. W przyszłości planuję również rozszerzenie go o moduł związany z cyberbezpieczeństwem. Jeśli jesteś zainteresowany, kliknij tutaj.

Wnioski

Widzimy, że SIEM całkiem nieźle spisuje się już w darmowej wersji. Jest dużo wbudowanych reguł, a jeśli nam nie wystarczają, możemy dodawać własne. Niestety nie wykorzystamy funkcjonalności Machine Learning. Problematyczny jest też brak możliwości wysyłania powiadomień o detekcjach, aczkolwiek coś czuję, że można to obejść stawiając obok ElastAlert. Zgaduję, że te detekcje siedzą po prostu gdzieś w jakimś wewnętrznym indeksie.

Uwaga

Pamiętaj, że w tym artykule nie zabezpieczyliśmy komunikacji między węzłami (bo to jedno-węzłowy klaster) oraz nie zabezpieczyliśmy komunikacji HTTP Kibana <-> Klient. Nie należy też używać superusera do komunikacji z Elasticsearch’em w Beats’ach.

Co dalej?

Myślałem o pokazaniu możliwości ElastAlert + Sigma. Daj znać co o tym myślisz. Może masz jakiś pomysł?

Jedna myśl w temacie “Elastic SIEM w pigułce (część 2)”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *