Dydaktyka:
FeedbackTo jest stara wersja strony!
NMS (Network Monitoring System, [1]) to nazwa określająca narzędzia do monitorowania stanu usług i maszyn w sieci w celu powiadomienia administratorów o awariach.
Dostępny jest szeroki wybór systemów NMS, przykładowa lista NMSów: https://en.wikipedia.org/wiki/Comparison_of_network_monitoring_systems
W trakcie zajęć jako przykład takiego systemu zostanie przedstawiona Icinga 2 [1], [2].
Typowe role programów w NMS to:
Serwer – program wykonujący monitoring i wysyłający powiadomienia.
Frontend – interfejs (zwykle webowy) prezentujący stan.
Agent – program na zdalnej maszynie, który sprawdza stan żądanej usługi, a z którym łączy się serwer.
Ćwiczenia proszę wykonywać na maszynie wirtualnej 'Linux SK prog' (VLAB/VM: Linux SK prog).
(Instrukcje instalacji za https://www.icinga.com/docs/icinga2/latest/doc/02-getting-started/)
Aktualna wersja Icingi dla Debiana jest w zewnętrzem repozytorium, które należy dodać komendą:
wget -O - https://packages.icinga.com/icinga.key | apt-key add - echo 'deb https://packages.icinga.com/debian icinga-stretch main' >/etc/apt/sources.list.d/icinga.list apt-get update
Instalacja samego serwera odbywa się z wykorzystaniem polecenia:
apt install icinga2 monitoring-plugins
NB: Icinga moze działać w kilku rolach ('master', 'sattelite', 'client' / agent [1]). Dlatego instalacja icinga2 nie instaluje automatycznie wszystkich potrzebnych dla 'mastera' zależności.
Węzeł typu 'master' potrzebuje bazy danych:
apt install default-mysql-server icinga2-ido-mysql
Aby sprawdzić ustawienia wygenerowane przez dpkg -configure, możesz:
cat /etc/icinga2/features-available/ido-mysql.conf
Instalacja szerszego niż domyślny zbioru wtyczek do monitorowania:
apt install monitoring-plugins nagios-plugins nagios-snmp-plugins snmp smistrip
Do wykorzystania uruchomionej i skonfigurowanej bazy danych w serwerze icinga2, należy:
icinga2 feature enable ido-mysql systemctl restart icinga2
Uwaga: jeśli używasz edytora vim, wykonaj też:
apt install vim-icinga2 vim-addon-manager -w install icinga2
Do diagnozowania problemów można włączyć rozszerzony o komunikaty diagnostyczne log:
icinga2 feature enable debuglog systemctl restart icinga2 tail -f /var/log/icinga2/debug.log
Icinga2 ma (typowy dla takich aplikacji) frontend webowy pod nazwą Icinga Web 2. 
Stąd instalacja frontendu sprowadza się do konfiguracji serwera HTTP (ze wsparciem dla php) i bazy danych na potrzeby webaplikacji.
Instalacja serwera HTTP i plików frontendu:
apt install apache2 icingaweb2 icingacli
Domyślna konfiguracja serwera apache2 jest wystarczająca, możesz ją przejrzeć w:
cat /etc/apache2/conf-enabled/icingaweb2.conf
Brakuje natomiast (sprawdzanego przez frontend) ustawienia strefy czasowej w php:
echo 'date.timezone = Europe/Warsaw' >> /etc/php/7.0/apache2/php.ini
Tworzenie użytkownika i bazy danych na potrzeby frontendu:
mysql MariaDB [(none)]> CREATE DATABASE icingaweb2; MariaDB [(none)]> GRANT ALL ON icingaweb2.* TO icingaweb2 IDENTIFIED BY 'password';
Łączenie ze sobą Icinga Core (serwera) i Icinga Web (frontendu) odbywa się po API RESTowym. Aby skonfigurować API po stronie serwera, należy wykonać:
icinga2 api setup
A następnie zdefiniować nowego użytkownika tego API w pliku /etc/icinga2/conf.d/api-users.conf
$EDITOR /etc/icinga2/conf.d/api-users.conf
  
  object ApiUser "icingaweb2" {
    password = "pass"
    permissions = [ "status/query", "actions/*", "objects/modify/*", "objects/query/*" ]
  }
Przed skonfigurowaniem frontendu zresetuj zarówno serwer HTTP jak i serwer icinga2:
systemctl restart icinga2 systemctl reload apache2
Dalsza część konfiguracji odbywa się z poziomu webui: http://localhost/icingaweb2 
Do wygenerowania tokenu użyj:
icingacli setup token create
Po skończeniu konfiguracji, dodaj nowego użytkownika do frontendu.
(za https://www.icinga.com/docs/icinga2/latest/doc/03-monitoring-basics/)
W domyślnej konfiguracji od razu po zainstalowaniu icinga2 monitoruje lokalny system. 
Przejrzyj pliku konfigurujące to monitorowanie:
/etc/icinga2/constants.conf - zwróć uwagę na NodeName i ZoneName/etc/icinga2/conf.d/hosts.conf - lista monitorowanych węzłów (hostów)/etc/icinga2/conf.d/services.conf - definicja usług, które mają być monitorowane. Zwróć uwagę na apply i assign – te reguły decydują, na których węzłach zostanie uruchomiane sprawdzenie stanu./etc/icinga2/conf.d/templates.conf - definicja szablonów; zwróć uwagę na to, co jaki czas są odpytywane usługi i węzły
Sprawdź w dokumentacji jak przekonać usługę swap do ignorowania braku swapu, następnie wczytaj na nowo pliki konfiguracyjne:
systemctl restart icinga2 || journalctl --no-pager -n 50 _SYSTEMD_UNIT=icinga2.service
Zwykle sprawdzenie stanu usług / węzłów odbywa się przy pomocy wtyczek. 
Icinga (jako dawny fork nagiosa) jest kompatybilna z wtyczkami do Nagiosa. Dostępne wtyczki to między innymi:
Dodaj do listy hostów (plik /etc/icinga2/conf.d/hosts.conf) kilka hostów, sprawdzając ich dostępność przy użyciu ICMP:
object Host "/nazwa/" {
  import "generic-host"
  address = "/adres/"
  check_command = "hostalive"
}
Uwaga: W przykładach fragmenty w ukośnikach (np. /nazwa/) należy zastąpić właściwą treścią (np. lab-sec-30)!
Dodaj przynajmniej (1) jeden komputer z sali, (2) router robiący za bramę domyślną (3) switch na salę
Systemy NMS pozwalają na badanie stanu z wykorzystaniem SNMP.
Poniżej przykładowa ręczna konfiguracja sprawdzania stanu interfejsów: 
object Host "/losowySwitch/" {
  import "generic-host"
  address = "/10.0.0.254/"
  check_command = "hostalive"
  vars.oids["/if1/"] = [ "/IF-MIB::ifOperStatus.1/" , "up" ]
  vars.oids["/if2/"] = [ "/IF-MIB::ifOperStatus.2/" , "up" ]
}
apply Service for (identifier => arr in host.vars.oids) {
  import "generic-service"
  check_command = "snmp"
  display_name = identifier
  vars.snmp_oid = arr[0]
  vars.snmp_ereg = arr[1]
}
W powyższy sposób można sprawdzić stan dowolnego OIDu. Lista opcji snmp dostępna tutaj.
Do typowych zadań, takich jak monitorowanie interfejsów, istnieją gotowe wtyczki. Przykład użycia takiej wtyczki:
object Host "/losowySwitch/" {
  import "/generic-host/"
  address = "10.0.0.254"
  check_command = "hostalive"
  vars.snmp_ifs = [".*"]
}
apply Service for (ifs in host.vars.snmp_ifs ) {
  import "generic-service"
  check_command = "snmp-interface"
  display_name = "snmp-interface" + ifs
  vars.snmp_interface = ifs
}
Przetestuj obie metody – skonfiguruj monitorowanie stanu interfejsów na routerze i switchu laboratoryjnym. Dostosuj listę monitorowanych interfejsów.
Przykład monitoriwania serwera DNS:
object Host "/serwerDNS/" {
  import "generic-host"
  address = "/150.254.5.11/"
  check_command = "hostalive"
  vars.dns_queries = {
                  "/fc/"      = [ "/A/",    "/fc.cs.put.poznan.pl/" ] ,
                  "/reverse/" = [ "/PTR/" , "/103.30.254.150.in-addr.arpa/" ]
                 }
}
apply Service "CheckDnsServer" for ( id => query in host.vars.dns_queries) {
  import "generic-service"
  display_name = "DNS: " + id
  check_command = "dig"
  vars.dig_server = host.address
  vars.dig_record_type = query[0]
  vars.dig_lookup = query[1]
}
Skonfiguruj monitorowanie usług sieciowych DNS (dla innych domen) i DHCP. 
Skonfiguruj sprawdzanie http dla wybranej strony www: 
https://www.icinga.com/docs/icinga2/latest/doc/10-icinga-template-library/#plugin-check-command-http 
W tym celu powinno się:
http
Monitoring z wykorzystaniem SNMP został omówiony wcześniej. 
Warto tutaj podkreślić, że SNMP pełni rolę agenta: Icinga odpytuje agenta SNMP działającego na zdalnym urządzeniu, a agent SNMP odpytuje lokalny sprzęt.
W Icinga można dodatkowo przechwytywać komunikaty SNMP trap/inform  (z wykorzystaniem pośredniego programu snmptt): 
https://www.icinga.com/docs/icinga2/latest/doc/07-agent-based-monitoring/#passive-check-results-and-snmp-traps
(za: https://www.icinga.com/docs/icinga2/latest/doc/06-distributed-monitoring/)
Jako agenta można wykorzystać kolejną Icingę, skonfigurowaną jako klient.
Aby to zrobić, na kliencie należy wpierw zainstalować:
apt install icinga2 monitoring-plugins
A następnie skonfigurować węzeł jako klient poleceniem:
icinga2 node wizard
Uwaga: należy zgodzić się na przyjmowanie komend i konfiguracji
Dodatkowo po stronie mastera należy zaakceptować certyfikat klienta (komunikacja między serwerami jest szyfrowana):
icinga2 ca list icinga2 ca sign /hash/
Po zaakceptowaniu certyfikatu należy jeszcze uruchomić ponownie klienta:
systemctl restart icinga2
Reszta konfiguracji wykonywana jest na głównym serwerze, gdzie trzeba wpierw zmienić plik /etc/icinga2/zones.conf dodając nowego klienta:
object Endpoint "/client/" {
  host = "/10.0.1.150/"
}
object Zone "/someClients/" {
  endpoints = [ "/client/" ]
  parent = ZoneName
}
Uwaga: Icinga sprawdza nazwy - pole common name (CN) certyfikatu klienta musi być identyczne jak nazwa endpointu.
Dalej należy dodać klienta jako kolejny węzeł:
object Host "/client/" {
  import "generic-host"
  check_command = "hostalive"
  address = "/10.0.1.150/"
  vars.client_endpoint = name
}
Przykład usługi uruchamianej na zdanym węźle:
apply Service "load" {
  import "generic-service"
  check_command = "load"
  command_endpoint = host.vars.client_endpoint
  assign where host.vars.client_endpoint == "/client/"
}
Innym przykładem agenta do monitorowania zdalnego systemu jest program NSClient++.
Zarówno NSClient++ jak i Icinga 2 działają zarówno pod Linuksem jak i Windowsem, jednak Icinga 2 dużo lepiej wspiera monitorowanie Linuksów, a NSClient++ - Windowsów.
Więcej na:
Aby odbierać powiadomienia mailowe, zainstaluj przykładowe MTA:
apt install exim4-daemon-light
W domyślnej konfiguracji maile kierowane do roota trafiają do pliku /var/mail/mail, więc możesz je wyświetlić np.:
mail -f /var/mail/mail
lub
tail -f /var/mail/mail
Maile kierowane do zwykłych użytkowników trafiają do ich katalogu domowego, do ~/Maildir można je więc wyświetlić np.:
mail -f ~/Maildir
Dodaj użytkownika student do icinga2 (serwera) w pliku /etc/icinga2/conf.d/users.conf:
object User "student" {
  import "generic-user"
  enable_notifications = true
  email = "student@localhost"
}
Nakaż wysyłanie wszystkich powiadomień użytkownikowi 'student' w pliku /etc/icinga2/conf.d/notifications.conf:
apply Notification "notify" to Service {
  import "mail-service-notification"
  users = ["student"]
  assign where true
}
apply Notification "notify" to Host {
  import "mail-host-notification"
  users = ["student"]
  assign where true
}
Sprawdź czy student dostaje te powiadomienia.
Sprawdź jak wyglądają powiadomienia z interfejsu webowego.
Jak wyłączyć kolejne maile z powiadomieniami?
Następnie skonfiguruj powiadomienia tak, by student dostawał tylko powiadomienia dotyczące wybranego hosta.
Domyślnie powiadomienia są wysyłane po 5 minutach od wykrycia awarii i są wysyłane do skutku. Można to oczywiście zmienić; więcej informacji na: https://www.icinga.com/docs/icinga2/latest/doc/03-monitoring-basics/#notification-delay
Przejrzyj pliki:
/etc/icinga2/conf.d/templates.conf mail-service-notification / mail-host-notification/etc/icinga2/conf.d/commands.conf mail-service-notification / mail-host-notificationStwórz powiadomienie które poinformuje o awarii używając komendy wall:
object NotificationCommand "wall-service" {
  command = [ "wall" , "Icinga2: $service.name$ is $service.state$" ]
}
template Notification "wall-service" {
  import "mail-service-notification"
  interval = 0
  command = "wall-service"
}
apply Notification "wall" to Service {
  import "wall-service"
  users = ["icingaadmin"]
  assign where true
}
Uwaga: komunikaty wall nie są wyświetlane na domyślnym terminalu, żeby je zobaczyć uruchom np. xterm.
Konfiguracja dowolnych komend do powiadamiania o problemach jest konieczna np. do ustawienia powiadomień SMS.