Nagios Install on Red Hat 8
by Ramses Soto-Navarro ramses@sotosystems.com, 4/15/2021
Overview
Required Packages
Install Fping
Create Accounts
Install Nagios Core
Install Nagios Plugins
Configure Nagios
Configure Apache
Configure Email
Firewall Rules
Configure Nodes
Add Nodes to Monitor
Logrotate
Configure SNMP Defaults
Test Commands
Node Stress Test
OID List
TODO
Overview
Brief notes on Nagios install on Red Hat Linux 8.x. Provides: SNMP monitoring, Email alerts, web interface. The audience is experienced Linux administrators.
Required Packages
# yum install man wget openssh-clients rsync traceroute nmap nc telnet ftp elinks ntp bind-utils httpd gcc gcc-c++ php glibc glibc-common man perl gd gd-devel libjpeg-devel libpng-devel postfix openssl-devel gnutls gnutls-devel perl-CPAN libdbi libdbi-devel libdbi-dbd-mysql samba-client net-snmp-utils bind-utils perl-DBD-MySQL mod_auth_mysql openldap-clients openldap-devel perl-LDAP php-ldap libgcrypt-devel libopenssl-devel gettext-runtime automake net-snmp perl-Net-SNMP cpan Crypt::DES Digest::HMAC Digest::SHA1 Net::SNMP Crypt:Rijndael # yum groupinstall "MYSQL Database Client" (Optional) # yum install mysql mysql-server mysql-test mysql-devel mysql-libs mysql-connector-odbc php-mysql
Install Fping
# cd /usr/src # wget http://fping.org/dist/fping-5.0.tar.gz # tar zxf fping-5.0.tar.gz # cd fping-5.0/ # ./configure --disable-ipv6 --enable-ipv4 # make # make install # fping mis26
Create Accounts
Create Nagios account:
# groupadd nagios # useradd -m -g nagios nagios # passwd nagios # grep apache /etc/passwd # usermod -a -G nagios apache
Install Nagios Core
# wget https://sourceforge.net/projects/nagios/files/nagios-4.x/nagios-4.4.6/nagios-4.4.6.tar.gz # tar zxvf nagios-4.4.6.tar.gz # cd nagios-4.4.6/ # ./configure --with-nagios-group=nagios --with-command-group=nagios # make all # make install # make install-init # make install-commandmode # make install-config # make install-webconf # make install-exfoliation # make install-daemoninit # make install-classicui # ldconfig
Install Nagios Plugins
# cd /usr/src # wget http://nagios-plugins.org/download/nagios-plugins-2.3.3.tar.gz # tar zxf nagios-plugins-2.3.3.tar.gz # cd nagios-plugins-2.3.3/ # ./configure --with-cgiurl=/ --with-nagios-user=nagios --with-nagios-group=nagios --with-openssl # make # make install # chown -R nagios.nagios /usr/local/nagios
Configure Nagios
Edit CGI configuration:
# sed -i 's/nagiosadmin/nagios/g' /usr/local/nagios/etc/cgi.cfg ... url_html_path=/ ...
Edit PHP configuration:
# vi /usr/local/nagios/share/config.inc.php ... $cfg['cgi_base_url']='/cgi-bin'; ...
Edit contacts Email:
# sed -i 's/nagiosadmin/nagios/g' /usr/local/nagios/etc/objects/contacts.cfg # vi /usr/local/nagios/etc/objects/contacts.cfg ... email ramses@sotosystems.com ; ...
Edit templates:
# vi /usr/local/nagios/etc/objects/templates.cfg define host { name linux-server use generic-host check_period 24x7 check_interval 2 retry_interval 1 max_check_attempts 10 check_command check-host-alive notification_period workhours notification_interval 120 notification_options d,u,r contact_groups admins register 0 }
Edit notification time periods:
define timeperiod { name workhours timeperiod_name workhours alias Normal Work Hours monday 07:00-18:00 tuesday 07:00-18:00 wednesday 07:00-18:00 thursday 07:00-18:00 friday 07:00-18:00 }
Edit commands:
# vi /usr/local/nagios/etc/objects/commands.cfg define command { command_name notify-host-by-email command_line /usr/bin/printf "%b" "Nagios $NOTIFICATIONTYPE$nHost: $HOSTNAME$nState: $HOSTSTATE$nAddress: $HOSTADDRESS$nInfo: $HOSTOUTPUT$nnDate/Time: $LONGDATETIME$n" | /usr/bin/mail -s "$HOSTSTATE$ $HOSTNAME$" $CONTACTEMAIL$ } define command { command_name notify-service-by-email command_line /usr/bin/printf "%b" "Nagios $NOTIFICATIONTYPE$nnService: $SERVICEDESC$nHost: $HOSTALIAS$nAddress: $HOSTADDRESS$nState: $SERVICESTATE$nnDate/Time: $LONGDATETIME$nnAdditional Info:nn$SERVICEOUTPUT$n" | /usr/bin/mail -s "$SERVICESTATE$ $HOSTALIAS$/$SERVICEDESC$" $CONTACTEMAIL$ } ... define command { command_name check_snmp_load command_line $USER1$/check_snmp_load.pl -H $HOSTADDRESS$ -C public -T netsl -w $ARG1$ -c $ARG2$ } define command { command_name check_snmp_storage command_line $USER1$/check_snmp_storage.pl -H $HOSTADDRESS$ -C public -m $ARG1$ -w $ARG2$ -c $ARG3$ $ARG4$ } define command { command_name check_snmp_mem command_line $USER1$/check_snmp_mem.pl -H $HOSTADDRESS$ -C public -w $ARG1$ -c $ARG2$ }
Configure Apache
Create the Apache user and password:
# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagios
Configure Apache virtual host:
# vi /etc/httpd/conf.d/nagios.example.com.conf <VirtualHost *:80> ServerName nagios.example.com ServerAlias nagios.example.com ServerAdmin ramses@example.com ErrorLog /var/log/httpd/nagios.example.com.err CustomLog /var/log/httpd/nagios.example.com.log combined DocumentRoot /usr/local/nagios/share ScriptAlias /cgi-bin "/usr/local/nagios/sbin" <Directory "/usr/local/nagios/sbin"> # SSLRequireSSL Options ExecCGI AllowOverride None <IfVersion >= 2.3> <RequireAll> Require all granted # Require host 127.0.0.1 AuthName "Nagios Access" AuthType Basic AuthUserFile /usr/local/nagios/etc/htpasswd.users Require valid-user </RequireAll> </IfVersion> <IfVersion < 2.3> Order allow,deny Allow from all # Order deny,allow # Deny from all # Allow from 127.0.0.1 AuthName "Nagios Access" AuthType Basic AuthUserFile /usr/local/nagios/etc/htpasswd.users Require valid-user </IfVersion> </Directory> Alias /nagios "/usr/local/nagios/share" <Directory "/usr/local/nagios/share"> # SSLRequireSSL Options None AllowOverride None <IfVersion >= 2.3> <RequireAll> Require all granted # Require host 127.0.0.1 AuthName "Nagios Access" AuthType Basic AuthUserFile /usr/local/nagios/etc/htpasswd.users Require valid-user </RequireAll> </IfVersion> <IfVersion < 2.3> Order allow,deny Allow from all # Order deny,allow # Deny from all # Allow from 127.0.0.1 AuthName "Nagios Access" AuthType Basic AuthUserFile /usr/local/nagios/etc/htpasswd.users Require valid-user </IfVersion> </Directory> </VirtualHost>
Restart Apache:
# systemctl restart httpd
Configure Email
Configure mailer:
# vi /etc/postfix/main.cfg inet_interfaces = $myhostname, localhost relayhost = mx.example.com # systemctl enable postfix # systemctl start postfix
Configure Mailrc:
# vi /home/nagios/.mailrc set from=nagios@nagios.example.com
Firewall Rules
Add firewall rules:
# firewall-cmd --zone=public add-service=http --permament # firewall-cmd --zone=public add-service=https --permament # systemctl reload firewalld
Configure Nodes
Configure each node client with the following:
* SNMP Listen on IPV4 161/udp only, read only access.
* Monitor all disks for 10% or less free space.
* Compatible SNMPv1 public community string.
* Firewall rules accepts only Nagios server and localhost.
* Reachable only by Nagios server and localhost.
* public = SNMP community string.
* No encryption or authentication; keep it simple.
Install SNMP on the host:
# yum install net-snmp
Edit the node SNMP settings so that 192.168.1.45 is the address of the Nagios server. Read-only Security will be accepted via static IP address access and firewall rules. Enable SNMP.
# vi /etc/snmp/snmpd.conf rocommunity public 192.168.1.45 rocommunity public 127.0.0.1 agentAddress udp:161 syscontact sysadmins@example.com includeAllDisks 10% load 15 10 5 # systemctl enable snmpd # systemctl start snmpd
Firewall rule; accept only communication from nagios server 192.168.1.45. List the rules.
# systemctl enable firewalld # systemctl start firewalld
Configure node firewall to accept only connections from Nagios server and localhost:
# firewall-cmd --zone=public --remove-service snmp # firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.45" port protocol="udp" port="161" accept' # firewall-cmd --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port protocol="udp" port="161" accept' # firewall-cmd --runtime-to-permanent # firewall-cmd --reload # firewall-cmd --list-all --zone=public
Add Nodes to Monitor
Create the alert monitoring host file for each node to monitor.
# mkdir -p /usr/local/nagios/etc/objects/hosts # vi /usr/local/nagios/etc/objects/hosts/devapp.broward.edu.cfg define host { use linux-server host_name node1.example.com alias node1.example.com address 10.215.6.80 } # Ping define service { use generic-service host_name node1.example.com service_description Ping check_command check_ping!100.0,20%!500.0,60% notifications_enabled 1 } # SSH define service { use generic-service host_name node1.example.com service_description SSH check_command check_ssh notifications_enabled 1 } # Load define service{ use generic-service host_name node1.example.com service_description Load check_command check_snmp_load!5,4,3!7,6,5 notifications_enabled 1 } # Memory define service{ use generic-service host_name node1.example.com service_description Mem # Memory: -warning ram%,swap% ! -critical ram%,swap% check_command check_snmp_mem!95,60!99,80 #check_command check_snmp_mem!80,60!99,80 #check_command check_snmp_mem!90,60!99,80 notifications_enabled 1 } # Storage / define service{ use generic-service host_name node1.example.com service_description / check_command check_snmp_storage!"^/$"!70!90! notifications_enabled 1 } # Swap define service{ use generic-service host_name node1.example.com service_description Swap check_command check_snmp_storage!Swap!60!90 notifications_enabled 1 } # Storage /usr define service{ use generic-service host_name node1.example.com service_description /usr check_command check_snmp_storage!"^/usr$"!70!90! notifications_enabled 1 } # Storage /specialdir define service{ use generic-service host_name node1.example.com service_description /specialdir check_command check_snmp_storage!"^/specialdir$"!80!90! notifications_enabled 1 } # Storage /var define service{ use generic-service host_name node1.example.com service_description /var check_command check_snmp_storage!"^/var$"!70!90! notifications_enabled 1 } # Storage /home define service{ use generic-service host_name node1.example.com service_description /home check_command check_snmp_storage!"^/home$"!70!90! notifications_enabled 1 } # HTTP define service{ use generic-service host_name node1.example.com service_description HTTP check_command check_http!2!5 notifications_enabled 1 }
Add the configuration to Nagios:
# vi /usr/local/nagios/etc/nagios.cfg ... cfg_file=/usr/local/nagios/etc/objects/hosts/node1.example.com.cfg ...
Restart Nagios:
# systemctl restart nagios # systemctl status nagios
Logrotate
Create the log rotations:
# vi /etc/logrotate.d/nagios /usr/local/nagios/var/nagios.log { monthly compress dateext maxage 90 rotate 10 missingok notifempty size +40960k create 640 nagios.nagios sharedscripts }
Configure SNMP Defaults
From the Nagios server configure the root account with default settings. Verify that the host SNMP can be reached with the defaults.
# mkdir -p ~/.snmp # vi ~/.snmp/snmp.conf defVersion 1 defCommunity public # snmpwalk node1.example.com sysName
Test Commands
Test one Nagios command:
# /usr/local/nagios/libexec/check_http -h # /usr/local/nagios/libexec/check_http -4 -H node1.example.com -w 2 -c 5
Check logs parsing the dates to human readable:
cat /usr/local/nagios/var/nagios.log | perl -pe 's/(d+)/localtime($1)/e'
Test PHP:
# vi /usr/local/nagios/share/test.php <?php phpinfo(); ?>
Test mail:
# su - nagios $ echo "test" | mail -s "test" ramses@sotosystems.com
Testing connecting from the nagios server and from localhost:
# snmpwalk -v 1 -c public node1.example.com sysName # snmpwalk -v 1 -c public localhost sysName
Node Stress Test
Stress samples for testing CPU, memory, disk, SSH.
# yum install lksctp-tools # rpm -ivh https://centos.pkgs.org/8/getpagespeed-x86_64/stress-1.0.4-23.el8.x86_64.rpm.html # rpm -ivh https://centos.pkgs.org/8/epel-testing-x86_64/stress-ng-0.12.00-1.el8.x86_64.rpm.html
Test storage space by filling a mount (increase size to accomodate):
# df -hP # dd if=/dev/zero of=/tmp/nullfile.img bs=1G count=10 # df -hP
Test load. Raise the value for faster stress:
# uptime # stress --cpu 2 # uptime # tail -f /usr/local/nagios/var/nagios.log
On another screen and while looking at the Nagios web GUI, run:
# ../../libexec/check_snmp_load.pl -H node1.example.com -C public -w 3 -c 6 2 CPU, average load 14.0% > 6% : CRITICAL
Test memory:
# stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%dn", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1 # watch free -h
OID List
List of some OID’s in the MIB to search for:
hostname: .1.3.6.1.2.1.1.5 1 minute Load: .1.3.6.1.4.1.2021.10.1.3.1 5 minute Load: .1.3.6.1.4.1.2021.10.1.3.2 15 minute Load: .1.3.6.1.4.1.2021.10.1.3.3 Percentage of user CPU time: .1.3.6.1.4.1.2021.11.9.0 Raw user cpu time: .1.3.6.1.4.1.2021.11.50.0 Percentages of system CPU time: .1.3.6.1.4.1.2021.11.10.0 Raw system cpu time: .1.3.6.1.4.1.2021.11.52.0 Percentages of idle CPU time: .1.3.6.1.4.1.2021.11.11.0 Raw idle cpu time: .1.3.6.1.4.1.2021.11.53.0 Raw nice cpu time: .1.3.6.1.4.1.2021.11.51.0 Total Swap Size: .1.3.6.1.4.1.2021.4.3.0 Available Swap Space: .1.3.6.1.4.1.2021.4.4.0 Total RAM in machine: .1.3.6.1.4.1.2021.4.5.0 Total RAM used: .1.3.6.1.4.1.2021.4.6.0 Total RAM Free: .1.3.6.1.4.1.2021.4.11.0 Total RAM Shared: .1.3.6.1.4.1.2021.4.13.0 Total RAM Buffered: .1.3.6.1.4.1.2021.4.14.0 Total Cached Memory: .1.3.6.1.4.1.2021.4.15.0 Path where the disk is mounted: .1.3.6.1.4.1.2021.9.1.2.1 Path of the device for the partition: .1.3.6.1.4.1.2021.9.1.3.1 Total size of the disk/partion (kBytes): .1.3.6.1.4.1.2021.9.1.6.1 Available space on the disk: .1.3.6.1.4.1.2021.9.1.7.1 Used space on the disk: .1.3.6.1.4.1.2021.9.1.8.1 Percentage of space used on disk: .1.3.6.1.4.1.2021.9.1.9.1 Percentage of inodes used on disk: .1.3.6.1.4.1.2021.9.1.10.1 System Uptime: .1.3.6.1.2.1.1.3.0
TODO
* Configure HTTPS with signed certificate.
The End.