poniedziałek, 13 lipca 2020

Nagios + Nginx na CentOS 7

Dawno nic nie pisałem, ale że akurat skończyłem rozstawiać Nagios na serwerze z CentOS 7 i było to wyzwaniem większym niż powinno, poniżej opis kroków aby uruchomić Nagios na takim serwerze bez uruchamiania Apache.

Istotna kwestia. Wszystko wykonywałem z poziomu root, dlatego poniższym komendom brak sudo wskazującego które komendy wymagają podniesienia uprawnień. Z zasady nie powinno się tak robić pomimo tego, że tak jest łatwiej.

1. Zainstaluj zależności

# yum install -y gcc unzip git libmcrypt4 libpcre3-dev ntp make cifs-utils openssl-devel

W razie jeśli któraś z paczek jest już zainstalowana, może zostać zaktualizowana przez yum przy tym kroku. Nie ma obaw, yum dobrze dba o zależności.

2. Pobierz paczkę

# wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.4.6.tar.gz

Jak będziesz to czytać pewnie wersja paczki Nagios Core się zmieni korzystając ze strony z historią wersji Nagios Core można znaleźć jaki jest numer ostatniego stabilnego wydania i po prostu podmienić numer w komendzie (oby nie zmienili struktury na serwerze).

3. Rozpakuj paczkę

# tar -zxvf nagios-4.4.6.tar.gz
# rm nagios-4.4.6.tar.gz

Usunąłem paczkę zaraz po rozpakowaniu, ale to już moja sprawa. Nie potrzebowałem aby się walała.

4. Zmiany na użytkownikach

# useradd nagios -M -r
# usermod -a -G nagios nginx

Dodaj użytkownika dla nagios jako użytkownika systemowego (-r) bez katalogu domowego (-M). Przy okazji dodaj użytkownika nginx do grupy nagios, co pozwoli na dostęp do zasobów nagiosa z poziomu procesu nginx.

5. Skompiluj i zainstaluj Nagios

# cd nagios-4.4.6
# ./configure --with-nagios-group=nagios --with-command-group=nginx --with-mail=/usr/sbin/sendmail
# make all
# make install
# make install-init
# make install-commandmode
# make install-config

6. pobierz paczkę z pluginami

# cd ~
# wget https://nagios-plugins.org/download/nagios-plugins-2.3.3.tar.gz

7. rozpakuj paczkę z pluginami

# tar -xzvf nagios-plugins-2.3.3.tar.gz
# rm nagios-plugins-2.3.3.tar.gz

8. skompiluj i zainstaluj pluginy

# cd nagios-plugins-2.3.3
# ./configure --with-nagios-user=nagios --with-nagios-group=nagios --with-openssl
# make
# make install
# chown -R nagios:nagios /usr/local/nagios/libexec

Na koniec jeszcze ustawiłem własność folderu z libexec w nagios, gdzie rezydują wszystkie pluginy. Domyślnie była ustawiona na roota.

9. pobierz i zainstaluj NRPE

# cd ~
# wget https://netix.dl.sourceforge.net/project/nagios/nrpe-3.x/nrpe-3.3.0.tar.gz
# tar -xzvf nrpe-3.3.0.tar.gz
# rm nrpe-3.3.0.tar.gz
# cd nrpe-3.3.0
# ./configure --enable-command-args --with-nagios-user=nagios --with-nagios-group=nagios --with-ssl=/usr/bin/openssl --with-ssl-lib=/usr/lib64/
# make all
# make install
# make install-init
# make install-config
# systemctl enable --now nrpe.service

Jedyna nowość to od razu włączyłem usługę nrpe do startu razem z systemem, a opcja --now uruchomiła ją również w tej sesji.

10. Instalacja fcgi

Nagios używa fcgi do części czynności. Nginx nie obsługuje samodzielnie fcgi dlatego potrzebne jest dodatkowe narzędzie do tego. Wygląda na to, że najlepszą opcją jest użycie fcgiwrapper. Tu też pojawia się największa różnica względem tutoriali, na których pracowałem. W większości miejsc zalecane jest użycie spawn-fcgi. Okazuje się, że spawn-fcgi nie jest potrzebny, a nawet przeszkadza. Wystarczy odpowiednie użycie systemd.

# yum install -y fcgiwrap

Tworzymy konfigurację socket fcgiwrap dla systemd. W pliku /etc/systemd/system/fcgiwrap.socket

[Unit]
Description=fcgiwrap Socket

[Socket]
SocketMode=0600
SocketUser=nginx
SocketGroup=nginx
ListenStream=/run/nginx/fcgiwrap.sock

[Install]
WantedBy=sockets.target

Tworzymy konfigurację procesu fcgiwrap dla systemd. W pliku /etc/systemd/system/fcgiwrap.service:

[Unit]
Description=Simple CGI Server
After=nss-user-lookup.target

[Service]
ExecStart=/usr/sbin/fcgiwrap
User=nginx
Group=nginx

[Install]
Also=fcgiwrap.socket

Teraz wystarczy już tylko włączyć i uruchomić nowe komponenty systemd

# systemctl enable --now fcgiwrap.socket
# systemctl enable --now fcgiwrap.service

Teraz jeszcze wyjaśnienie czemu spawn-fcgi nie jest potrzebny, a mi nawet przeszkadzał. Na pierwszy rzut oka wydawało się, że robił to samo, bo uruchamiał proces fcgiwrap i tworzył socket. Kłopot był z SELinux. spawn-fcgi tworzył socket i spawnował proces w niewłaściwym kontekście przez co nginx nie miał możliwości się z nimi komunikować. W przeglądarce pojawiał się błąd 503, a w logach można było znaleźć informację o odrzuceniu połączenia. Problem można było obejść na 2 sposoby: osłabić SELinux, albo go nawet wyłączyć (odpada), albo dodać dla nginx uprawnienia do dostępu do kontekstu socket tak jak ustawił go spawn-fcgi. To niestety też tworzyło lukę bezpieczeństwa, więc odpadało. Skorzystanie bezpośrednio z systemd i odpowiednia konfiguracja socket i service zupełnie eliminują ten problem. Na to rozwiązanie natrafiłem tutaj.

11. Konfiguracja Nginx

Tu już wiele zależy od konfiguracji konkretnego serwera i domeny. W moim przypadku nagios uruchomiony jest w ścieżce /nagios na istniejącej domenie. Dlatego też poniżej nie zamieszczam pełnej konfiguracji domeny, a jedynie część dla nagios.

location /nagios {
    try_files $uri $uri/ /index.php$is_args$args;
    index index.php index.html index.htm;
    alias /usr/local/nagios/share;
    allow all;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param AUTH_USER $remote_user;
        fastcgi_param REMOTE_USER $remote_user;
    }  

    location ~ \.cgi$ {
        root /usr/local/nagios/sbin;
        rewrite ^/nagios/cgi-bin/(.*)\.cgi /$1.cgi break;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param AUTH_USER $remote_user;
        fastcgi_param REMOTE_USER $remote_user;
        fastcgi_pass unix:/var/run/nginx/fcgiwrap.sock;
    }  

    auth_basic "Nagios";
    auth_basic_user_file /usr/local/nagios/etc/htpasswd.users;
}

location ~ ^/nagios/nagiosgraph/cgi-bin/(.*\.cgi)$ {
    alias /usr/local/nagiosgraph/cgi/$1;
    allow all;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $request_filename;
    fastcgi_param AUTH_USER $remote_user;
    fastcgi_param REMOTE_USER $remote_user;
    fastcgi_pass unix:/var/run/nginx/fcgiwrap.sock;
}

location /nagios/nagiosgraph {
    alias /usr/local/nagiosgraph/share;
    allow all;
}

Istotne są konfiguracje cgi. Jak widać wszystkie zapytania do tych lokacji są proxy do socket fcgiwrap.

To już wszystko. Teraz pozostaje tylko skonfigurować konkretne checki na Nagios i nadzorować swoje serwery.

Źródła

Brak komentarzy:

Prześlij komentarz