Począwszy od wersji 1.10 Docker posiada funkcjonalność umożliwiającą gromadzenie i przesyłanie zdarzeń logowania z kontenerów i aplikacji w nich uruchomionych do Splunka, bez potrzeby użycia agenta. W wersji 1.13 sterownik logowania do Splunka został przepisany na nowo. Jest teraz szybszy, bardziej wydajny i ma więcej funkcji.
Nowością w Splunk Enterprise 6.3 jest funkcjonalność HTTP Event Collector, ułatwiająca bezagentowe przesyłanie zdarzeń logowania do platformy Splunk.
Korzystając z tych dwóch technologii użytkownicy mogą w krótkim czasie uruchomić kolekcję zdarzeń zarówno z aplikacji uruchomionych wewnątrz kontenerów jak i kontenerów dockera.
W niniejszym artykule przedstawię, jak w podstawowym zakresie skonfigurować logowanie zdarzeń z aplikacji uruchomionych w kontenerach zarządzanych przez Dockera, używając 2 kontenerów. W pierwszym kontenerze uruchomię instancję Splunk Enterprise, która zostanie wykorzystana do gromadzenia, analizy i wizualizacji zdarzeń pochodzących z access loga serwera WWW uruchomionego w osobnym kontenerze.
Artykuł jest przeznaczony dla osób, które mają podstawową wiedzę w
zakresie korzystania z Dockera i Splunk. Jeżeli jednak nie znacie
jeszcze tych technologii a chcielibyście szybko i bezboleśnie zdobyć
podstawową wiedzę o ich użytkowaniu to dobrymi źródłami wiedzy jest
strona Getting Started na oficjalnym portalu Splunka oraz Get started with docker.
Przejdźmy teraz do konfiguracji.
1. Uruchomienie kontenera ze Splunk Enterprise
docker run --name "splunk" -d \
-e "SPLUNK_START_ARGS=--accept-license" \
-p 8000:8000 -p 8088:8088 -p 8089:8089 splunk/splunk:6.5.2
Ustawienie zmiennej “SPLUNK_START_ARGS=–accept-license” powoduje, że tekst licencji nie zostanie wyświetlony i użytkownik automatycznie akceptuje jej postanowienia.
Do kontenera zostały zmapowane trzy porty:
- 8000/TCP – GUI Splunk Enterprise oraz
- 8088/TCP – port, na który będą wysyłane zdarzenia
- 8089/TCP – zarządznie
Obraz kontenera splunk/splunk:6.5.2 został opublikowany przez
firmę Splunk i zawiera próbną wersję oprogramowania Splunk Enterprise
która działa przez 60 dni i pozwala zaindeksować 500MB danych dziennie.
2. Włączenie funkcji kolekcji zdarzeń przy użyciu HTTP Event Collector
Funkcjonalność HTTP Event Collector jest dostępna w Splunk Enterprise od wersi 6.3. Ogólnie rzecz biorąc jest to JSONowe API umożliwiające przesyłanie zdarzeń do Splunka z jakiegokolwiek źródła bez konieczności używania agenta.
Włączenie i podstawowa konfiguracja HTTP Event Collectora jest stosunkowo prosta.
Włączenie HTTP Event Collector
docker exec -it splunk /opt/splunk/bin/splunk \
http-event-collector enable -uri https://linuxpolska.com:8089
Splunk poprosi o podanie użytkownika i hasła. Loguję się na konto admin z domyśmym hasłem: changeme.
Generowanie tokena
docker exec -it splunk /opt/splunk/bin/splunk \
http-event-collector create nginx -uri https://linuxpolska.com:8089
Wykonanie tej komendy spowoduje wygenerowanie tokena o nazwie nginx, którego wartości użyję później, przy konfiguracji wysyłania zdarzeń do splunka. Przykładowy wynik:
http://nginx
token=52370866-EB4D-4902-A1C9-13E4DA38A087
description=
disabled=0
index=default
indexes=
source=
sourcetype=
outputgroup=
use-ack=
W przedstawionym wyżej przykładzie wartość tokena to: 52370866-EB4D-4902-A1C9-13E4DA38A087
Włączenie HTTP Event Collector i definiowanie tokenów jest możliwe również przy użyciu GUI Splunk. Procedura została opisana w rozdziale Set up and use HTTP Event Collector w dokumentacji Splunk Enterprise.
Test konfiguracji HTTP Event Collector
Sprawdzam czy konfiguracja HTTP Event Collector działa.
Wysyłam do Splunka testowe zdarzenie zawierające pole o nazwie test_field i wartości Test message
curl -k -H 'Authorization: Splunk 52370866-EB4D-4902-A1C9-13E4DA38A087' \
https://192.168.66.66:8088/services/collector/event \
-d '{"event": { "test_field": "Test message"}}'
W przypadku powodzenia zostanie zwrócony komunikat:
{„text”:”Success”,”code”:0}
Przedstawiona komenda wysyła zdarzenie do instancji Splunk uruchomionej na hoście o adresie ip: 192.168.66.66. na port 8088/TCP przy użyciu wartości zdefiniowanego wcześniej tokena (52370866-EB4D-4902-A1C9-13E4DA38A087).
Zdarzenia przesyłane do HTTP Event Collectora powinny być odpowiednio sformatowane. Zasady formatowania zdarzeń zostały opisane w dokumencie Format events for HTTP Event Collector.
Na koniec upewniam się czy wysłane zdarzenie zostało zaindeksowane w Splunku. Zdarzenie testowe powinno zostać zapisane w domyślnym indexie. Pole source powinno zostać automatycznie wypełnione przez Splunka, zgodnie ze wzorcem: http:<nazwa_tokena>. Wobec tego mogę wykorzystać pole source aby wyszukać wszystkie zdarzenia, które zostały przesłane przy użyciu tokena nginx:
Zapytanie zwróciło wysłane wcześniej zdarzenie testowe. Test zakończył się powodzeniem. Teraz mogę przejść do uruchomienia i konfiguracji kontenera z serwerem webowym.
3. Uruchomienie serwera webowego w kontenerze
docker run --log-driver=splunk --log-opt
splunk-token=52370866-EB4D-4902-A1C9-13E4DA38A087 --log-opt
splunk-url=https://192.168.66.66:8088 --log-opt splunk-insecureskipverify=true -p
"80:80" nginx
Opis opcji dotyczących logowania
- log-driver=splunk – ustawia sterownik logowania
- log-opt splunk-token=52370866-EB4D-4902-A1C9-13E4DA38A087 – ustawia token na ten, który zdefiniowałem wcześniej w Splunku.
- log-opt splunk-url=https://192.168.66.66:8088 – url instancji Splunka z uruchomionym HTTP Event Collectorem
- log-opt splunk-insecureskipverify=true – weryfikacja certyfikatu ssl zostanie pominięta. Testowa instancjaSplunka, z której korzystam ma certyfikat niezaufany (self-signed)
Opisany zestaw opcji wykorzystanych do uruchomienia przesyłania zdarzeń do Splunka jest zestawem minimalnym. Dockerowy sterownik logowania do Splunka daje dużo więcej możliwości formatowania zdarzeń i uzupełniania ich dodatkowymi informacjami. Wszystkie opcje zostały opisane w instrukcji Splunk logging driver, która jest częścią oficjalnej dokumentacji Dockera.
4. Test przesyłania zdarzeń z serwera WWW
Przy użyciu curl wysyłam dwa testowe zapytania http do serwera
WWW. Serwer powinien wygenerować zdarzenia logowania, które zostaną
przesłane na do Splunka gdzie zostaną zaindeksowane w domyślnym indeksie
z wartością http:nginx w polu source.
curl 192.168.66.66:80
curl 192.168.66.66:80?id=1234
Wyszukuję zdarzenia korzystając z GUI Splunka:
Zapytanie zwróciło dwa nowe zdarzenia. Każde z nich zawiera 3 pola:
- line – zdarzenie logowania wygenerowane przez serwer WWW
- source – źródło zdarzenia. Uruchomiony w kontenerze serwer WWW wysyła logi access do standardowego wyjścia, dlatego w polu source mamy wartość stdout.
- tag – domyślna wartość to 12 pierwszych znaków ID kontenera serwera WWW.
Wykonanie wszystkich procedur opisanych w artykule zajęło niespełna 15 minut. W tym czasie, przy użyciu środowiska Docker zostały uruchomione dwa kontenery, jeden z instancją Splunk Enterprise, drugi z serwerem WWW działającym pod kontrolą Nginx oraz zostało skonfigurowane przesyłanie zdarzeń logowania z serwera WWW do Splunka.
Używając sterownika logowania Splunk w dokerze możemy w łatwy i szybki sposób wykorzystać platformę Splunk Enterprise do gromadzenia, wizualizacji i analizy zdarzeń generowanych przez aplikacje uruchomione wewnątrz kontenerów dockerowych.