From 44ef25c5aa57fe66f6550b6359502b22389afa9b Mon Sep 17 00:00:00 2001 From: Steven Spencer Date: Wed, 21 Sep 2022 15:54:23 -0500 Subject: [PATCH] LibreNMS current version requirements and changes * Since the document has now been tested with all versions of Rocky Linux, the meta was updated to include the tested versions * Sections for `iptables` have been removed and replaced with `firewalld` instructions * Since PHP 8.1 is now the minimum supported version, added sections on using the REMI repository and installing php81 * documentation updated for the correct path for the php81 packages and symbolic links were added where appropriate for the `php` binary itself * Added separate composer install section * corrected multiple single-line code blocks with multi-line code blocks --- docs/guides/images/librenms_prechecks.png | Bin 34203 -> 36511 bytes .../network/librenms_monitoring_server.md | 286 ++++++++++-------- 2 files changed, 160 insertions(+), 126 deletions(-) diff --git a/docs/guides/images/librenms_prechecks.png b/docs/guides/images/librenms_prechecks.png index 2298f57b0ceabf6b21470d7347b9fd6a23cd17af..f146f0deadce3e1c201768837ab331a9bf4be3c8 100644 GIT binary patch literal 36511 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 diff --git a/docs/guides/network/librenms_monitoring_server.md b/docs/guides/network/librenms_monitoring_server.md index 4c733cb2fd..b4d78920b4 100644 --- a/docs/guides/network/librenms_monitoring_server.md +++ b/docs/guides/network/librenms_monitoring_server.md @@ -1,3 +1,13 @@ +--- +title: LibreNMS Monitoring Server +author: Steven Spencer +contributors: Ezequiel Bruni +tested with: 8.5, 8.6, 9.0 +tags: + - monitoring + - network +--- + # LibreNMS Monitoring Server ## Introduction @@ -22,18 +32,21 @@ While the installation will follow pretty closely to the official install instru These commands should be entered as the root user. Before we begin, note that this installation procedure focuses on httpd, rather than nginx. If you prefer to use the latter, head up to the [Librenms Install Instructions](https://docs.librenms.org/Installation/Install-LibreNMS/) and follow the guide there. We are assuming a fresh install, so we need to do a few things with the repositories before we can continue. First, we need to install the EPEL repository (Extra Packages for Enterprise Linux): -`dnf install -y epel-release` +``` +dnf install -y epel-release +``` -Next, we need to tell the repositories to enable PHP 7.3 as the default PHP: +The current version of LibreNMS requires a minimum PHP version of 8.1. The default package in Rocky Linux 9.0 is PHP 8.0, so we will need to enable a third party repository (true for Rocky Linux 8.6 as well) for this newer version. We will install the REMI repository for this. The version of the repository you install will depend on the version of Rocky Linux you are running. Simply replace the "[v#]" below with either 8 or 9: ``` -dnf module reset php -dnf module enable php:7.3 +dnf install http://rpms.remirepo.net/enterprise/remi-release-[v#].rpm ``` -This will return a listing for httpd, nginx, and php, just answer "y" to the prompt to continue. Next, we need to install a bunch of packages: +Once both the EPEL and REMI repositories are installed, it's time to install the packages we will need: -`dnf install bash-completion cronie fping git httpd ImageMagick mariadb-server mtr net-snmp net-snmp-utils nmap php-fpm php-cli php-common php-curl php-gd php-json php-mbstring php-process php-snmp php-xml php-zip php-mysqlnd python3 python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip` +``` +dnf install bash-completion cronie fping git httpd ImageMagick mariadb-server mtr net-snmp net-snmp-utils nmap php81-php-fpm php81-php-cli php81-php-common php81-php-curl php81-php-gd php81-php-json php81-php-mbstring php81-php-process php81-php-snmp php81-php-xml php81-php-zip php81-php-mysqlnd python3 python3-PyMySQL python3-redis python3-memcached python3-pip python3-systemd rrdtool unzip wget +``` All of these packages represent some portion of the LibreNMS feature set. @@ -41,19 +54,25 @@ All of these packages represent some portion of the LibreNMS feature set. To do this, copy and paste (or type) the following: -`useradd librenms -d /opt/librenms -M -r -s "$(which bash)"` +``` +useradd librenms -d /opt/librenms -M -r -s "$(which bash)" +``` -With this command, we are setting the default directory for our new user to "/opt/librenms" however the "-M" option says "don't create the directory." The reason, of course, is that we will be creating it when we install libreNMS. The "-r" says to make this user a system account and the "-s" says to set the shell (in this case, to "bash") +With this command, we are setting the default directory for our new user to "/opt/librenms" however the "-M" option says "don't create the directory." The reason, of course, is that we will be creating it when we install LibreNMS. The "-r" says to make this user a system account and the "-s" says to set the shell (in this case, to "bash") ## Download LibreNMS and Set Permissions The download is all done through git. You may be familiar with the process as it is used for many projects these days. First, switch over to the /opt directory: -`cd /opt` +``` +cd /opt +``` Then clone the repository: -`git clone https://github.com/librenms/librenms.git` +``` +git clone https://github.com/librenms/librenms.git +``` Next change permissions for the directory: @@ -70,47 +89,55 @@ The _setfacl_ command stands for "set file access control lists" and is another All of the above commands were executed as root or _sudo_, but the PHP dependencies within LibreNMS need to be installed as the librenms user. To do this, -`su - librenms` +``` +su - librenms +``` And then enter the following: -`./scripts/composer_wrapper.php install --no-dev` +``` +./scripts/composer_wrapper.php install --no-dev +``` Once the script is completed, exit back to root: -`exit` +``` +exit +``` ### Failure Of PHP Dependency Install Workaround -LibreNMS documentation says that when you are behind a proxy server, the above procedure may fail. If so, use this procedure as a workaround. Note, too, that this workaround would have to be run as the root user, because it makes modifications to /usr/bin: - -``` -wget https://getcomposer.org/composer-stable.phar -mv composer-stable.phar /usr/bin/composer -chmod +x /usr/bin/composer -``` +LibreNMS documentation says that when you are behind a proxy server, the above procedure may fail. I've found that it can fail for other reasons as well. For this reason, I've added a procedure for installing Composer later in the process. ## Set Timezone We need to make sure that this is set correctly, both for the system and for PHP. You can find a list of valid timezone settings for PHP [here](https://php.net/manual/en/timezones.php). For instance, for the Central timezone, a common entry would be "America/Chicago". Let's start by editing the php.ini file: -`vi /etc/php.ini` +``` +vi /etc/opt/remi/php81/php.ini +``` Find the `date.timezone` line and modify it. Note that it is remarked out, so remove the ";" from the beginning of the line and add your timezone after the "=" sign. For our Central timezone example we will use: -`date.timezone = America/Chicago` +``` +date.timezone = America/Chicago +``` Save your changes and exit the php.ini file. We also need to make sure that the system timezone is correct. Again, using our Central timezone as the example, we would do this with: -`timedatectl set-timezone America/Chicago` +``` +timedatectl set-timezone America/Chicago +``` ## MariaDB Setup Before we get into the database setup required for LibreNMS, run through the [MariaDB procedure](../database/database_mariadb-server.md) and specifically the section for "Securing mariadb-server", and then come back here for these specific settings. The first thing we need to do is modify the mariadb-server.cnf file: -`vi /etc/my.cnf.d/mariadb-server.cnf` +``` +vi /etc/my.cnf.d/mariadb-server.cnf +``` And add the following lines to the "[Mysqld]" section: @@ -128,7 +155,10 @@ systemctl restart mariadb Now gain access to mariadb as the root user. Remember to use the password that you created when folloing the "Securing mariadb-server" section that you performed above: -`mysql -u root -p` + +``` +mysql -u root -p +``` The next thing we need to do is make some specific changes for LibreNMS. With the command below, remember to change the password "password" to something secure and document what that is in a safe spot, such as a password manager, so that you will have it later. At the mysql prompt do: @@ -143,19 +173,16 @@ Once you've done this, type "exit" to exit back out of mariadb. ## Configure PHP-FPM -This section is basically unchanged from the official documentation. First, copy the www.conf: +This section is basically unchanged from the official documentation except for the path to the files. First, copy the www.conf: -`cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/librenms.conf` +``` +cp /etc/opt/remi/php81/php-fpm.d/www.conf /etc/opt/remi/php81/php-fpm.d/librenms.conf +``` Next modify the librenms.conf file: -`vi /etc/php-fpm.d/librenms.conf` - -Near the top, add these two lines to fix a path issue for the librenms user that will come up later: - ``` -; Set the ENV path to fix broken Centos web page issue -env[PATH] = /usr/local/bin:/usr/bin:/bin +vi /etc/opt/remi/php81/php-fpm.d/librenms.conf ``` Change "[www]" to ["librenms]" @@ -169,11 +196,15 @@ group = librenms And finally change the "listen" line to reflect a unique name: -`listen = /run/php-fpm-librenms.sock` +``` +listen = /run/php-fpm-librenms.sock +``` Save your changes and exit the file. If this is the only web service that will be running on this machine, feel free to remove the old www.conf file that we copied: -`rm -f /etc/php-fpm.d/www.conf` +``` +rm -f /etc/opt/remi/php81/php-fpm.d/www.conf +``` ## Configure Apache @@ -181,7 +212,9 @@ Normally, we would use the [Apache sites-enabled](../web/apache-sites-enabled.md Again, in this case we aren't using that procedure and just going with the default, suggested setup. To do this, start by creating this file: -`vi /etc/httpd/conf.d/librenms.conf` +``` +vi /etc/httpd/conf.d/librenms.conf +``` And placing the following in that file: @@ -210,13 +243,15 @@ And placing the following in that file: You should also remove the old default site, welcome.conf: -`rm /etc/httpd/conf.d/welcome.conf` +``` +rm /etc/httpd/conf.d/welcome.conf +``` Finally, we need to enable both _httpd_ and _php-fpm_: ``` systemctl enable --now httpd -systemctl enable --now php-fpm +systemctl enable --now php81-php-fpm ``` ## SELinux @@ -224,7 +259,9 @@ Please note that if you don't plan on using SELinux, skip this and head to the n To setup everything with SELinux, you'll need an additional package installed: -`dnf install policycoreutils-python-utils` +``` +dnf install policycoreutils-python-utils +``` ### Configure LibreNMS Contexts @@ -265,13 +302,13 @@ semodule -i http_fping.pp ``` If you run into problems and you suspect it might be due to an SELinux issue, run the following: -`audit2why < /var/log/audit/audit.log` - -## Firewall Configuration +``` +audit2why < /var/log/audit/audit.log +``` -We will include the _firewalld_ instructions from the official documentation, however we will be using _iptables_ in the lab, so will also include those instructions. To use _iptables_ simply follow [this procedure](../security/enabling_iptables_firewall.md) and then use the _iptables_ script found in this procedure, and make modifications to it for your network. +## Firewall Configuration - `firewalld` -### firewalld +We will include the _firewalld_ instructions from the official documentation. The command to use for _firewalld_ allow rules are as follows: @@ -280,59 +317,21 @@ firewall-cmd --zone public --add-service http --add-service https firewall-cmd --permanent --zone public --add-service http --add-service https ``` -The author has problems with the simplistic nature of _firewalld_. This rule allows your web services to be open to the world, but is that what you want for a monitoring server? I would say that this is usually **not** the case. I prefer _iptables_ rules, because it is easy to see at a glance what you are allowing. - -### iptables - -Create a script to run for adding, changing firewall rules called firewall.conf and put this in /etc - -`vi /etc/firewall.conf` - -Place the following in the file, substituting your network IP addresses as needed. This script allows UDP, SSH, HTTP and HTTPS from the local network in the lab, 192.168.1.0/24. It also allows ICMP type 8 (which stands for "Echo Request" or more commonly "ping") from our network gateway, 192.168.1.2: - -``` -#!/bin/sh -# -#IPTABLES=/usr/sbin/iptables - -# Unless specified, the defaults for OUTPUT is ACCEPT -# The default for FORWARD and INPUT is DROP -# -echo " clearing any existing rules and setting default policy.." -iptables -F INPUT -iptables -P INPUT DROP -iptables -A INPUT -p udp -m udp -s 192.168.1.0/24 -j ACCEPT -iptables -A INPUT -p tcp -m tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT -iptables -A INPUT -p tcp -m tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT -iptables -A INPUT -p tcp -m tcp -s 192.168.1.0/24 --dport 443 -j ACCEPT -iptables -A INPUT -p icmp -m icmp --icmp-type 8 -s 192.168.1.2 -j ACCEPT -iptables -A INPUT -i lo -j ACCEPT -iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset -iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable - -/usr/sbin/service iptables save -``` - -Make the script executable: - -`chmod +x /etc/firewall.conf` - -Run the script: - -`/etc/firewall.conf` - -Assuming no errors, you should be ready to go. +The author has problems with this sort of simplistic _firewalld_ rule set. This rule allows your web services to be open to the world, but is that what you want for a monitoring server? I would say that this is usually **not** the case. If you'd like a more granular approach to using _firewalld_, take a look at [this document](../security/firewalld.md) and then make changes to your _firewalld_ rules accordingly. ## Enable Symbolic Link And Tab-Autocomplete For lnms Commands First, we need a symbolic link on our _lnms_ command so that it can be executed from anywhere: -`ln -s /opt/librenms/lnms /usr/bin/lnms` +``` +ln -s /opt/librenms/lnms /usr/bin/lnms +``` Next, we need to set it up for autocomplete: -`cp /opt/librenms/misc/lnms-completion.bash /etc/bash_completion.d/` +``` +cp /opt/librenms/misc/lnms-completion.bash /etc/bash_completion.d/ +``` ## Configure snmpd @@ -340,19 +339,27 @@ _SNMP_ stands for "Simple Network Management Protocol" and is used in many monit First, copy the snmp.conf file from LibreNMS: -`cp /opt/librenms/snmpd.conf.example /etc/snmp/snmpd.conf` +``` +cp /opt/librenms/snmpd.conf.example /etc/snmp/snmpd.conf +``` Next, edit this file and change the community string from "RANDOMSTRINGGOESHERE" to whatever your community string is or will be. In our example, we are changing it to "LABone": -`vi /etc/snmp/snmpd.conf` +``` +vi /etc/snmp/snmpd.conf +``` and change this line: -`com2sec readonly default RANDOMSTRINGGOESHERE` +``` +com2sec readonly default RANDOMSTRINGGOESHERE +``` to -`com2sec readonly default LABone` +``` +com2sec readonly default LABone +``` Now save your changes and exit. @@ -360,13 +367,44 @@ Now save your changes and exit. Do the following: -`cp /opt/librenms/librenms.nonroot.cron /etc/cron.d/librenms` +``` +cp /opt/librenms/librenms.nonroot.cron /etc/cron.d/librenms +``` + +It's important that the poller has run once, even though there will be nothing to poll, before the web setup procedure is run. It saves a lot of head scratching trying to figure out what is wrong when you get poller errors in the validation section later on. The poller is run by the "librenms" user, and while it would be possible to switch to this user and run the cron files, it's really better to let the poller do it on its own, so make sure that at least 5 minutes have passed between this section and the "Web Setup" section below. ## Log Rotation LibreNMS will create a large set of logs over time. You'll need to setup log rotation for this so that it doesn't eat up too much disk space. To do this, simply do the following now: -`cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms` +``` +cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms +``` + +## Installing Composer + +PHP Composer is required for the current installation (mentioned in the earlier procedure). If the install you ran earlier fails, you'll need to run the following procedure. + +Before we start, we need to link our current version of the `php` binary to a location in the path. Since we used the REMI installation to get the correct version of PHP, it is not installed within the path. This is easy enough to fix with a symbolic link and will make your life much easier as you go through the remaining steps: + +``` +ln -s /opt/remi/php81/root/usr/bin/php /usr/bin/php +``` + +Now go to the [Composer website](https://getcomposer.org/download/) and make sure that the following steps haven't changed. If not, go ahead and run these commands somewhere on the machine (the location isn't important as we will move composer when we are done): + +``` +php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" +php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" +php composer-setup.php +php -r "unlink('composer-setup.php');" +``` + +Move it to a spot within our path. We are using `/usr/local/bin/` for this: + +``` +mv composer.phar /usr/local/bin/composer +``` ## Web Setup @@ -400,11 +438,15 @@ Again, one of our assumptions was that you are using SNMP v2. Remember that each First, install _snmpd_ on the workstation while also updating packages, just to be safe: -`sudo update && sudo apt-get upgrade && sudo apt-get install snmpd` +``` +sudo update && sudo apt-get upgrade && sudo apt-get install snmpd +``` Next, you need to modify the snmpd.conf file: -`sudo vi /etc/snmpd/snmpd.conf` +``` +sudo vi /etc/snmpd/snmpd.conf +``` Go ahead and find the lines that describe your workstation and change them to things that identify the workstation. These lines are shown below: @@ -415,11 +457,15 @@ sysContact Username By default, when you install snmpd on Ubuntu, it only binds to the local address. It does not listen on your machine IP address. This will not allow LibreNMS to connect to it. We need to remark out this line: -`agentaddress 127.0.0.1,[::1]` +``` +agentaddress 127.0.0.1,[::1] +``` And add a new line that looks like what follows here: (In this example, the IP address of our workstation is 192.168.1.122 and the UDP port we are setting is "161") -`agentAddress udp:127.0.0.1:161,udp:192.168.1.122:161` +``` +agentAddress udp:127.0.0.1:161,udp:192.168.1.122:161 +``` Next, we need to specify the read only access community string. Find the below lines and remark them out. (note that we are showing them as remarked out below): @@ -430,7 +476,9 @@ Next, we need to specify the read only access community string. Find the below l Next, add a new line: -`rocommunity LABone` +``` +rocommunity LABone +``` Now save your changes and exit. @@ -447,15 +495,21 @@ If you are running a firewall on your internal workstations, then you will need We are assuming that you are root here or that you can _sudo_ to become so. First, we need to install some packages: -`dnf install net-snmp net-snmp-utils` +``` +dnf install net-snmp net-snmp-utils +``` Next, we want to create a snmpd.conf file. Rather than try to navigate through the file that is included, move this file to rename it, and create a brand new empty file: -`mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.orig` +``` +mv /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.orig +``` and -`vi /etc/snmp/snmpd.conf` +``` +vi /etc/snmp/snmpd.conf +``` Next copy the below into the new file: @@ -492,33 +546,13 @@ systemctl start snmpd #### Firewall -If you are running a server, then you **are** running a firewall, right? We are assuming _iptables_ as noted above, so we need to modify our firewall configuration, (in this case, /etc/firewall.conf) and add access for UDP and ICMP traffic coming from the monitoring server. If you are running _firewalld_, just substitute in the appropriate rules for _firewalld_. Here's a rule set for our example server: +If you are running a server, then you **are** running a firewall, right? If you are running _firewalld_ (as you should be) we will assume that we are using the "trusted" zone here and we just want to allow all traffic from our monitoring server, 192.168.1.140: ``` -#!/bin/sh -# -#IPTABLES=/usr/sbin/iptables - -# Unless specified, the defaults for OUTPUT is ACCEPT -# The default for FORWARD and INPUT is DROP -# -echo " clearing any existing rules and setting default policy.." -iptables -F INPUT -iptables -P INPUT DROP -iptables -A INPUT -p icmp --icmp-type 8 -s 192.168.1.140 -j ACCEPT -iptables -A INPUT -p udp -m udp -s 192.168.1.140 -j ACCEPT -iptables -A INPUT -p tcp -m tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT -iptables -A INPUT -i lo -j ACCEPT -iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset -iptables -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable - -/usr/sbin/service iptables save +firewall-cmd --zone=trusted --add-source=192.168.1.140 --permanent ``` -If you are new to this particular _iptables_ concept, the /etc/firewall.conf is executable, and it's our way of making changes to the saved _iptables_ rules that will be restored on boot. In the above example, we are allowing "ping" and UDP traffic from our monitoring server and SSH from our local network. Many other rules may be necessary for your server functions, perhaps http rules or mysql port allow rules, etc. Once you've made the changes to /etc/firewall.conf, execute it with: - -`/etc/firewall.conf` +Again, we assumed the "trusted" zone here, but you may want something else, even "public", just consder your rules and their affects before adding them in. ## Adding The Devices In Librenms