Centralny serwer logów MS Windows na PostgreSQL

Transkrypt

Centralny serwer logów MS Windows na PostgreSQL
Artykuł pobrano ze strony eioba.pl
Centralny serwer logów MS Windows na PostgreSQL
Wstęp
Głównym założeniem projektu była centralizacja logów zbieranych z różnych systemów MS Windows z dzienników
evenlog oraz innych (za pośrednictwem protokołu syslog) w jednej darmowej bazie SQL. Z powodu wymagań co do
wydajności bazy, objętości gromadzonych dzienników oraz faktu iż baza ma być darmowa, sql'owa i ma być bazą
(a nie programem do wyświetlania tabelek takim jak "mójsql" ;-) a ponadto koniecznym "połączeniem" do bazy w
postaci komponentu .NET 2.0 na placu boju pozostał PostgreSQL...
Początkowo założyłem, iż aplikacja zbierająca logi z maszyn MS Windows będzie rezydować na jednej z maszyn i
zasysać dzienniki z pozostałych - wstawiając rekordy do bazy SQL. Tak też zostało to zrealizowane. W trakcie
testowania okazało się że wąskim gardłem jest sam protokół zasysający dane z dzienników. Wydajność tegoż
protokołu - jak sądzę bazującego na RPC - była żenująca - zaledwie 30-40 rekordów na sekundę dlatego też
dorobiłem możliwość działania aplikacji na każdej maszynie z której pobierane są rekordy dzienników i wstawiania
ich zdalnie do bazy PostgreSQL. Tutaj wydajność po zasosowaniu paczkowania rekordów w większej transakcji (po
kilkaset insertów) oraz zastosowaniu "prepared statement" wzrosła do 300-400 rekordów/sek (baza stojąca na
zwyczajnym, średniej wydajności pececie).
W dalszym etapie rozwoju aplikacji planowane jest dołożenie interfejsu wyszukiwawczo-raportującego
pozwalającego na zautomatyzowanie wyszukiwania pewnych podejrzanych zdarzeń w logach, tworzenie
syntetycznych i analitycznych raportów, backupowanie i kasowanie starych rekord ów z bazy, daemon/usługa
syslogd (jako odrębny projekt pgsyslogd).
Całość napisałem zgodnie z obowiązującą "modą" w środowisku .NET 2005 (NetFramework 2.0). Jako że nie
przepadam za pisaniem aplikacji w C# czy C++ na NET2005 postanowiłem z wrodzonego twórczego lenistwa i ku
wygodzie własnej i ewentualnych użytkowników napisać całość w darmowym VisualBasic 2005 Express Edition przy
użyciu komponentu Npgsql dla dostępu do bazy PostgreSQL.
Działanie aplikacji:
Aplikacja pgeventcollector może być uruchomiona na dwa sposoby. Pierwszy - zwykły tryb interakcyjny - dostępne
menu, konfiguracja, podgląd postepu wczytywania logów itp. wodotryski. Drugi - tryb wsadowy z linii poleceń lub
harmonogramu zadań - przydatny do kolejnych cyklicznych automatycznych importów logów do bazy.
Aplikacja pgsyslogd może byc uruchomiona jako usługa (nt service) systemowa nasłuchująca na porcie zgodnym z
protokołem syslog i odbierająca dane przesyłane protokołem UDP w tym formacie (w planach także TCP).
Aplikacja rejestruje w rejestrze systemu ostatnia pozycje rekordu dziennika na którym zakończone zostało
importowanie w poprzednim przebiegu. Wpisy pojawiają się po pierwszym wczytywaniu rekordów w gałęzi
[HKLM]/Software/pgeventlogger/[nazwa maszyny]/...
Wymagania
W pierwszym etapie wdrożenia należało utworzyć odpowiednią bazę danych, tabelę na gromadzone logi,
ewentualne indeksy przyśpieszające wyszukiwanie itp. Poniższy skrypt SQL utworzy nam bazę w kodowaniu
UNICODE (utf-8), tabelę log i sekwencję autonumerowania. Ewentualne indeksy i użytkownika na którym będzie
realizowane połączenie z bazą należy założyć sobie samemu. Instalacji i konfiguracji bazy PostgreSQL (na MS
Windows lub na BSD/UNIX/Linux) nie będę tu opisywać - to przedstawia dokumentacja PostgreSQL. Ja
zainstalowałem PostgreSQL w wersji 8.1.3 (taka wersja była najnowsza na moment wdrożenia). Do wykonania
skryptu można zastosować interfejs zarządzania bazą PostgreSQL instalowany wraz z bazą (lub odrębnie)
PgAdminIII. W celu zwiększenia bezpieczeństwa należało by utworzyć dedykowaną rolę (grupę), nadać prawa
wstawiania rekordów w tabeli log dla tej roli + użycia sekwencji seqlogid; utworzyć dedykowanego użytkownika
którym było by realizowane połączenie aplikacji z bazą a dziedziczącego uprawnienia po tej dedykowanej roli
grupowej. Aplikacja wymaga aby dzienniki miały skonfigurowaną odpowiednią wielkość tak by mogły pomieścić
wszystkie rekordy pomiędzy kolejnymi przebiegami importowania. Należy koniecznie zablokować resetowanie
dzienników i nigdy ich nie resetować - nawet ręcznie, dzienniki powinny być ustawione w tryb automatycznego
zastępowania najstarszych rekordów w razie potrzeby - stąd konieczne zaplanowanie ich odpowiedniego rozmiaru.
Przy zresetowaniu dziennika następuje wyzerowanie wewnętrznej numeracji rekordów dzienników - ten właśnie
numer rekordu jest wykorzystywany do zapamiętywania w rejestrze pozycji na której w poprzednim przebiegu
aplikacja zakończyła import zatem wyzerowanie tej numeracji zablokuje importowanie logów - koniecznym będzie
ręczne wyzerowanie liczników aplikacji w rejestrze.
Skrypt SQL
-SET default_with_oids = false;
-- Database: slog
CREATE DATABASE slog
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default;
-- Sequence: seqlogid
CREATE SEQUENCE seqlogid;
ALTER TABLE seqlogid OWNER TO postgres;
-- Table: log
CREATE TABLE log
(
id int8 NOT NULL DEFAULT nextval('seqlogid'), -- id rekordu
kto varchar(15) NOT NULL DEFAULT "current_user"(), -- kto zmodyfikowal rekord
kiedy timestamptz NOT NULL DEFAULT now(), -- kiedy zmodyfikowano rekord
eventlog varchar DEFAULT '', -- z jakiego dziennika pochodzi wpis
entrytype varchar DEFAULT '', -- typ wpisu
category varchar DEFAULT '', -- kategoria wpisu
source varchar DEFAULT '', -- zrodlo wpisu
eventid int4 DEFAULT 0, -- kod eventu
machine varchar DEFAULT '', -- z jakiej maszyny
username varchar DEFAULT '', -- jaki uzytkownik
timegenerated timestamp DEFAULT now(), -- kiedy zaistnialo zdarzenie
timewritten timestamp DEFAULT now(), -- kiedy zarejestrowano zdarzenie w dzienniku
message text DEFAULT '', -- komunikat
CONSTRAINT idlog_pk PRIMARY KEY (id)
)
WITHOUT OIDS;
ALTER TABLE log OWNER TO postgres;
COMMENT ON TABLE log IS 'event log table';
COMMENT ON COLUMN log.id IS 'id rekordu';
COMMENT ON COLUMN log.kto IS 'kto zmodyfikowal rekord';
COMMENT ON COLUMN log.kiedy IS 'kiedy zmodyfikowano rekord';
COMMENT ON COLUMN log.eventlog IS 'z jakiego dziennika pochodzi wpis';
COMMENT ON COLUMN log.entrytype IS 'typ wpisu';
COMMENT ON COLUMN log.category IS 'kategoria wpisu';
COMMENT ON COLUMN log.source IS 'zrodlo wpisu';
COMMENT ON COLUMN log.eventid IS 'kod eventu';
COMMENT ON COLUMN log.machine IS 'z jakiej maszyny';
COMMENT ON COLUMN log.username IS 'jaki uzytkownik';
COMMENT ON COLUMN log.timegenerated IS 'kiedy zaistnialo zdarzenie';
COMMENT ON COLUMN log.timewritten IS 'kiedy zarejestrowano zdarzenie w dzienniku';
COMMENT ON COLUMN log.message IS 'komunikat';
-- Indexes:
CREATE INDEX idxcategory ON log USING btree (category varchar_pattern_ops);
CREATE INDEX idxentrytype ON log USING btree (entrytype varchar_pattern_ops);
CREATE INDEX idxeventid ON log USING btree (eventid);
CREATE INDEX idxeventlog ON log USING btree (eventlog varchar_pattern_ops);
CREATE INDEX idxmachine ON log USING btree (machine varchar_pattern_ops);
CREATE INDEX idxsource ON log USING btree (source varchar_pattern_ops);
CREATE INDEX idxusername ON log USING btree (username varchar_pattern_ops);
--
Instalacja
NetFramework 2.0
Standartowo aplikacje napisane w MS Visual Studio 2005 wymagają zainstalowania NetFramework 2.0. Do pobrania
ze stron producenta lub z pakietu instalacyjnego MS Visual Studio 2005 Express.
Baza danych PostgreSQL
Standartowa instalacja PostgreSQL (u mnie wersja 8.1.3 tak na MS Windows jak i na *nix).
Instalacja aplikacji
Instalacja aplikacji jest prosta. Pierwsze ręczne uruchomienie powoduje zainstalowanie aplikacji i utworzenie
odpowiednich pozycji w "Menu Start" systemu oraz automatyczne pierwsze uruchomienie aplikacji. W tym
momencie należy wejść w menu "Tools->Options" i wprowadzić swoje odpowiednie parametry konfiguracyjne
połaczenia z bazą. Po zatwierdzeniu konfiguracji możliwe jest uruchomienie interakcyjne lub tez w trybie
wsadowym z liniii poleceń lub harmonogramu zadań. Aktualnie obsługiwany jest jedynie przełącznik "/start"
wyzwalający natychmiastowy "produkcyjny" przebieg zaimportowania logów do bazy przy użyciu wcześniej
ustawionej konfiguracji. Okienko konfiguracyjne domyślnie zawiera domyślny wpis postaci "." - odpowiednik
"localhost" symbolizujący iż domyślnie importowane sa logi jedynie z bieżącej maszyny na której została
uruchomiona aplikacja. Ewentualne kolejne maszyny należy podawać w kolejnych liniach w tradycyjnej postaci
FQDN lub notacji adresu IP. Podczas wczytywania logów w trybie interakcyjnym aplikacja sygnalizuje paskiem
postępu aktualny etap importowania, ponadto w lini statusu aplikacji mogą pojawiać się statusy typu "Idle" bezczynna, "Running..." - importowanie rekordów, "Skipping..." - pomijanie rekordów wcześniej wczytanych i
przeskoczenie do miejsca ostatniego zakończenia wczytywania.
Kod źródłowy i wersja binarna
Aplikacja dostępna jest jako spakowana paczka projektu Visual Basic 2005 a także jako skompilowana
wykonywalna działająca wersja binarna z niezbędnymi bibliotekami Npgsql. Kod źródłowy szeroko komentowałem
tak aby był łatwy do zrozumienia i ewentualnej rozbudowy lub dopasowania do własnych potrzeb. Od czasu do
czasu będę publikował nowsze wersje źródeł i binariów - w miarę jak będa postępowac ewentualne dalsze prace
rozwojowe. Licencja kodu aplikacji - standartowa nowa licencja BSD - inne komponenty moga mieć inną - proszę
sobie sprawdzić własnoręcznie jaką (np. Npgsql czy MS Visual Studio 2005 Express).
Uwagi do kodu źródłowego
Aplikacja jest napisana "as is" - nie najgorzej ale i mogło być lepiej - jak będe miał chęci i czas to może
popoprawiam conieco w wyglądzie tak kodu jak i samej aplikacji - narazie jak to mówią "feel free to do it yourself"
;-)
Ręczna rekompilacja projektu wymaga "podpięcia" a właściwie wskazania lokalizacji komponentu Npgsql i biblioteki
npgsql.dll oraz ewentualnego wygenerowania klucza tymczasowego do podpisania projektu. Spakowane binaria
skompilowanej aplikacji już zawierają bibliotekę npgsql.dll.
Features
- tryb interakcyjny oraz wsadowy
- pasek postępu wczytywania logów
- zakładka z błedami i ostrzeżeniami
- statystyki przetwarzania logów
- rejestrowanie w dzienniku aplikacji statystyk z przetwarzania
- predefiniowana modyfikowalna konfiguracja
- statystyki ilości wpisów w dziennikach
- możliwość zasysania logów z wielu maszyn
- ...
ToDo
- dorobienie rejestrowania w eventlogu statystyki po każdym przetworzonym logu
- dalsze modyfikacje okna konfuguracyjnego
- wielojęzykowość aplikacji
- wielowątkowość aplikacji
- oblokowanie menu aplikacji przy pracy interakcyjnej
- automatyczne rozpoznanie zresetowania logów
- automatyczne cykliczne uruchamianie aplikacji wg wewnętrznego timera
- dołożenie automatycznego utworzenia bazy i tabeli przy instalacji (na żądanie)
- dołożenie współpracy z innymi bazami SQL
- dołożenie modułu raportowania, wyszukiwania, analiz i statystyk
- dokończenie i opublikowanie modułu pgsyslogd współpracującego z protokołem syslog
- ...
Screenshoots
- okno główne aplikacji
- okno konfiguracji aplikacji
- postęp wczytywania w trybie interakcyjnym
- wpisy liczników w rejestrze
Do pobrania
Spakowane kody źródłowe aplikacji w postaci projektu MS Visual Studio 2005 Express:
- aktualna wersja źródeł z dnia 2006-04-18 to 1.0.1.2
Spakowana działająca wersja binarna palikacji:
- aktualna wersja binarna z dnia 2006-04-18 to 1.0.1.2
Przydatne linki
- baza danych PostgreSQL http://www.postgresql.org
- aktualna dokumentacja PostgreSQL http://www.postgresql.org/docs/manuals/
- MS Visual Studio 2005 Express http://msdn.microsoft.com/vstudio/express/default.aspx
- MS NET Framework 2.0 http://msdn.microsoft.com/netframework/downloads/updates/default.aspx
- komponent Npgsql http://npgsql.projects.postgresql.org/docs/manual/UserManual.htm
- dokumentacja API komponentu Npgsql http://npgsql.projects.postgresql.org/docs/api/
Autor: Bartek 'saphire' Siębab
Przedruk ze strony: http://blog.siebab.net/2006/12/centralny-serwer-logw-ms-windows-na.html
Artykuł pobrano ze strony eioba.pl