Maandelijks archief: maart 2017

Cacti 1.0.4 op Centos7 met PHP7 en Percona-server

Als je een server hebt met Centos7 gecombineerd met PHP7.x en dus ook Percona Server 5.x geinstalleerd, dan is het installeren van Cacti wel een beetje een domper.

Want, de vereisten van Cacti op hun website zijn als volgt (belangrijkste items):

  • httpd,php,php-mysql,php-snmp
  • php-xml
  • mysql,mysql-server

Dat zou zeggen, de installatie is zo gedaan. Kwestie van yum install en klaar. Maar helaas;

Error: Package: 1:mariadb-5.5.52-1.el7.x86_64 (base)
           Requires: mariadb-libs(x86-64) = 1:5.5.52-1.el7
           Available: 1:mariadb-libs-5.5.52-1.el7.x86_64 (base)
               mariadb-libs(x86-64) = 1:5.5.52-1.el7
Error: Package: php-ldap-5.4.16-42.el7.x86_64 (base)
           Requires: php-common(x86-64) = 5.4.16-42.el7
           Installed: php-common-7.0.17-1.el7.remi.x86_64 (@remi-php70)
               php-common(x86-64) = 7.0.17-1.el7.remi
           Available: php-common-5.4.16-42.el7.x86_64 (base)
               php-common(x86-64) = 5.4.16-42.el7
Error: Package: php-snmp-5.4.16-42.el7.x86_64 (base)
           Requires: php-common(x86-64) = 5.4.16-42.el7
           Installed: php-common-7.0.17-1.el7.remi.x86_64 (@remi-php70)
               php-common(x86-64) = 7.0.17-1.el7.remi
           Available: php-common-5.4.16-42.el7.x86_64 (base)
               php-common(x86-64) = 5.4.16-42.el7
Error: php-mysql conflicts with php-mysqlnd-7.0.17-1.el7.remi.x86_64
Error: Package: php-mbstring-5.4.16-42.el7.x86_64 (base)
           Requires: php-common(x86-64) = 5.4.16-42.el7
           Installed: php-common-7.0.17-1.el7.remi.x86_64 (@remi-php70)
               php-common(x86-64) = 7.0.17-1.el7.remi
           Available: php-common-5.4.16-42.el7.x86_64 (base)
               php-common(x86-64) = 5.4.16-42.el7
Error: Package: cacti-1.0.4-1.el7.noarch (epel)
           Requires: php-mysql
           Available: php-mysqlnd-5.4.16-42.el7.x86_64 (base)
               php-mysql = 5.4.16-42.el7
           Installed: php-mysqlnd-7.0.17-1.el7.remi.x86_64 (@remi-php70)
               Not found
Error: Package: php-xml-5.4.16-42.el7.x86_64 (base)
           Requires: php-common(x86-64) = 5.4.16-42.el7
           Installed: php-common-7.0.17-1.el7.remi.x86_64 (@remi-php70)
               php-common(x86-64) = 7.0.17-1.el7.remi
           Available: php-common-5.4.16-42.el7.x86_64 (base)
               php-common(x86-64) = 5.4.16-42.el7
Error: Package: php-mysql-5.4.16-42.el7.x86_64 (base)
           Requires: php-pdo(x86-64) = 5.4.16-42.el7
           Installed: php-pdo-7.0.17-1.el7.remi.x86_64 (@remi-php70)
               php-pdo(x86-64) = 7.0.17-1.el7.remi
           Available: php-pdo-5.4.16-42.el7.x86_64 (base)
               php-pdo(x86-64) = 5.4.16-42.el7
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

De optie –enablerepo=remi-php70 geeft wel een deel opgelost terug maar niet alles. Jammer genoeg.

Error: Package: cacti-1.0.4-1.el7.noarch (epel)
           Requires: php-mysql
           Available: php-mysql-5.4.16-42.el7.x86_64 (base)
               php-mysql = 5.4.16-42.el7
           Available: php-mysqlnd-5.4.16-42.el7.x86_64 (base)
               php-mysql = 5.4.16-42.el7
           Available: php-pecl-mysql-1.0.0-0.8.20151007git294ce3b.el7.remi.7.0.x86_64 (remi-php70)
               php-mysql = 1:1.0.0
           Available: php-pecl-mysql-1.0.0-0.9.20151007git294ce3b.el7.remi.7.0.x86_64 (remi-php70)
               php-mysql = 1:1.0.0
           Installed: php-mysqlnd-7.0.17-1.el7.remi.x86_64 (@remi-php70)
               Not found
           Available: php-mysqlnd-7.0.16-1.el7.remi.x86_64 (remi-php70)
               Not found
Error: Package: 1:mariadb-5.5.52-1.el7.x86_64 (base)
           Requires: mariadb-libs(x86-64) = 1:5.5.52-1.el7
           Available: 1:mariadb-libs-5.5.52-1.el7.x86_64 (base)
               mariadb-libs(x86-64) = 1:5.5.52-1.el7
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

De optie –skip-broken geeft helemaal niet het gewenste resultaat. Oftewel we zijn weer terug bij af.

Er is een weg dat we het wel aan de praat krijgen middels de source RPM.

We maken allereerst een extra user aan “rpmbuild” en installeren de package rpmbuild. Onder de user rpmbuild downloaden we de source RPM voor cacti versie 1.0.4 en pakken deze uit:

useradd rpmbuild
yum install -y rpm-build
su - rpmbuild

wget https://dl.fedoraproject.org/pub/epel/7/SRPMS/c/cacti-1.0.4-1.el7.src.rpm

rpm -i cacti-1.0.4-1.el7.src.rpm

Er zijn dan een tweetal directories aangemaakt in de map “rpmbuild”. We open de directory “SPECS” en stellen de originele even veilig waarna we de “cacti.spec” openen met een text editor zoals VIM:cd

cd rpmbuild/

ls -l
total 0
drwxr-xr-x. 2 rpmbuild rpmbuild 124 Mar 31 13:46 SOURCES
drwxr-xr-x. 2 rpmbuild rpmbuild  24 Mar 31 13:46 SPECS

cd SPECS
cp cacti.spec cacti.orig

vim cacti.spec

Op regel nummer 13 en 14 vind je de vereisten php (en componenten) en mariadb terug. Deze kan je uitzetten door een ‘#’ er voor te zetten:

#Requires: php, php-ldap, php-mbstring, php-mysql, php-pdo, php-snmp, php-xml
#Requires: mariadb

Hierna moeten nog 2 regels uitgezet worden door een comment (‘#’) te plaatsen op regel 46 en 71:

#%{__install} -d -m 0755 %{buildroot}/%{_pkgdocdir}
#%{__cp} -a docs/ %{buildroot}/%{_pkgdocdir}

Daarna, zet in de regel 3 iets extra’s neer om een eigen release naam aan te duiden, zodat duidelijk is dat deze niet origineel is:

Release: 1%{?dist}
word:
Release: 1%{?dist}.bj

Nu is alles in place om de RPM weer terug te bouwen:

rpmbuild -ba cacti.spec

Er is zijn nu diverse files gemaakt waarmee je verder kan. Je kan ook de nieuwe Source RPM kopieren om weer extra aanpassingen elders te maken. Dat doen we nu niet, we gaan de gecompileerde RPM installeren. Deze is gemaakt in de directory rpmbuild/RPMS/. Uiteraard moeten we weer uit het user account ‘rpmbuild’ gaan en root access hebben. De installatie kan door middel van:

yum install /home/rpmbuild/rpmbuild/RPMS/noarch/cacti-1.0.4-1.el7.centos.bj.noarch.rpm

En daarmee is Cacti door Yum geinstalleerd op een CentOS7 machine met PHP7.0 en Percona-Server 5.7.

Het beste is dan te starten vanaf stap 2:

http://docs.cacti.net/manual:088:1_installation.1_install_unix.5_install_and_configure_cacti

In mijn geval n.a.v. de nieuwe server is het volgende eerst inregelen, en dan op stap 2 verder:

mv /etc/httpd/conf.d/cacti.conf /etc/httpd/conf.d/cacti.conf.old
ln -s /usr/share/cacti /var/www/cacti

vim /etc/httpd/conf.d/cacti.pc-mania.nl.conf:
<VirtualHost *:80>
 DocumentRoot /var/www/cacti/
 ServerName cacti.pc-mania.nl
 <Directory /var/www/cacti/>
      AllowOverride all
      Options MultiViews IncludesNoExec FollowSymLinks
 </Directory>
</VirtualHost>

<VirtualHost *:443>
 DocumentRoot /var/www/cacti
 ServerName cacti.pc-mania.nl
 SSLEngine on
 SSLCertificateFile /etc/letsencrypt/live/cacti.pc-mania.nl/cert.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/cacti.pc-mania.nl/privkey.pem
 SSLCertificateChainFile /etc/letsencrypt/live/cacti.pc-mania.nl/chain.pem

<Directory /var/www/cacti/>
       <IfModule mod_authz_core.c>
               # httpd 2.4
               Require all granted
       </IfModule>
       <IfModule !mod_authz_core.c>
               # httpd 2.2
               Order allow,deny
               Allow from all
       </IfModule>
      AllowOverride all
      Options MultiViews IncludesNoExec FollowSymLinks
</Directory>

<Directory /var/www/cacti/install>
        # mod_security overrides.
        # Uncomment these if you use mod_security.
        # allow POST of application/x-www-form-urlencoded during install
        #SecRuleRemoveById 960010
        # permit the specification of the rrdtool paths during install
        #SecRuleRemoveById 900011
</Directory>


# These sections marked "Require all denied" (or "Deny from all")
# should not be modified.
# These are in place in order to harden Cacti.
<Directory /var/www/cacti/log>
        <IfModule mod_authz_core.c>
                Require all denied
        </IfModule>
        <IfModule !mod_authz_core.c>
                Order deny,allow
                Deny from all
        </IfModule>
</Directory>
<Directory /var/www/cacti/rra>
        <IfModule mod_authz_core.c>
                Require all denied
        </IfModule>
        <IfModule !mod_authz_core.c>
                Order deny,allow
                Deny from all
        </IfModule>
</Directory>

</VirtualHost>

 

Een nieuwe Centos7 server opzetten

Inleiding

Er is een tijd van komen en gaan, dat zeggen ze wel eens. Om even beeld te geven: ik heb diverse virtuele machines in mijn eigen Vmware cloud. Daarvan zijn er 2 met publieke functies te weten “uxx-001” en “uxx-002” met respectievelijk Centos6.8 en Centos5.11. De uxx-002 is de oudste in het ‘serverpark’. Waarom 002 ? Ik weet eerlijk niet meer wat de eerste 001 was.

De uxx-002 server is na ruim 5 jaar definitief uitgezet en verwijderd. Het OS is ouderwets en de software erop niet meer van deze tijd. Dat brengt mij op deze post.

Ik heb daarom ook ruim een jaar terug redelijk wat inhoud van websites uit Centos5.11 met PHP5.3 en functionaliteit verhuisd naar de uxx-001. Daar is tenminste PHP5.6 actief, MySQL (MariaDB) 5.6, Postfix i.p.v Sendmail en meer.

Echter; ik heb nog 2 service VM’s. Deze “services-001” en “services-002” doen bijzaken voor het gehele netwerk, dus ook de via VPN bereikbare thuis netwerken. Deze doen: DNS caching (met Adblock), SMTP (met TLS), LDAP, Tacacs en NTP. Het zijn relatief simpele en platte VM met 1 cpu, 1GB mem en 10GB disk, ook Centos6.8.

Het idee is dus nu ontstaan om deze service VM’s samen te voegen op de bestaande uxx-001 en de nieuwe uxx-002. En uiteindelijk de websites te verhuizen.

De nieuwe server

  • Centos7 minimal install, x86_64
    • default packages na installatie:
      wget mailx mlocate open-vm-tools vim epel-release bind-utils ftp
    • firewalld vervangen voor iptables
    • httpd
    • php7
    • functionaliteit vanuit services-00x
      • ntpd
      • dnsmasq
      • ldap
      • tacacs
    • functionaliteit vanuit uxx-001
      • mysql
      • postfix voor pc-mania.nl domain
      • rsyslog vervangen voor syslog-ng
      • vsftpd
      • cacti en snmpd
      • phpmyadmin

Redelijk eenvoudig zou je zeggen.

Na de basis installatie:

yum install -y wget mailx mlocate open-vm-tools vim epel-release bind-utils ftp
systemctl enable vmtoolsd
systemctl start vmtoolsd
yum update -y && reboot

Na de reboot is de basis er en kunnen we aan de slag. Het eerste is de firewalld vervangen voor iptables. Dit is puur gemak, firewalld werkt ook prima.

yum install -y iptables-services
systemctl stop firewalld
systemctl start iptables
systemctl start ip6tables
systemctl enable iptables
systemctl enable ip6tables
systemctl disable firewalld
yum -y remove firewalld

Dan, kunnen we beginnen aan de httpd en php setup. Hiervoor moeten we een extra Repo installeren. Dit is bij de voorkeur REMI. De webtatic en IUS repo’s zijn het over het algemeen nét niet.

wget -4 http://rpms.remirepo.net/enterprise/remi-release-7.rpm
rpm -Uvh remi-release-7.rpm

De installatie van httpd en php is dan als volgt

yum install -y httpd mod_ssl
yum install -y --enablerepo=remi-php70 php php70-php-mysqlnd php-mysqli php70-php-ldap php70-php-gd

Dan moet er, vanwege een externe Repo wat recht gezet gaan worden.

echo "extension=gd.so" > /etc/php.d/30-gd.ini
echo "extension=ldap.so" > /etc/php.d/30-ldap.ini
echo "date.timezone = Europe/Amsterdam" /etc/php.ini
mv /usr/lib64/php/modules /usr/lib64/php/modules.old
ln -s /opt/remi/php70/root/usr/lib64/php/modules /usr/lib64/php/modules
systemctl restart httpd

Nu dat gebeurd is kan ook de MySQL server geïnstalleerd. Hier is de voorkeur Percona 5.7 ten opzichte van MariaDB.

yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
yum install -y Percona-Server-server-57

En niet te vergeten:

systemctl enable httpd
systemctl enable mysqld
systemctl start httpd
systemctl start mysqld

Gefeliciteerd! Er is een LAMP-stack actief. Goed, de firewall rules voor poort 80/443 moeten er nog in maar dat ter zijde.

SELinux?

Er is, wat dat moet opgevallen zijn, sprake van een “enforcing” SELinux policy. Vele zetten dit direct in het begin uit met “setenforce 0” maar dat is relatief laf. Daarom alles met Enforcing. Hier zijn later dus ook wat trucs voor. De belangrijkste nu omdat we zover zijn is:

setsebool -P httpd_can_network_connect_db 1

Je leest het goed. Anders werkt je website gewoon niet met MySQL samen.

Netwerk statisch maken

Er is vanuit de basis installatie middels DHCP een adres en via de IPV6_ND een IPv6 adres verkregen. Dit is voor de basis installatie prima geweest maar we veranderen dit nu. Hier is de VMware console voor nodig.

rm -f /var/lib/NetworkManager/dhclient*
systemctl stop NetworkManager
systemctl disable NetworkManager

Daarna kan je het ifcfg-eth0 bestand keurig invullen naar wens:

TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
IPADDR="192.168.190.52"
PREFIX="24"
GATEWAY="192.168.190.254"
DNS1="192.168.190.21"
DOMAIN="192.168.190.22"
IPV4_FAILURE_FATAL="yes"
IPV6INIT="yes"
IPV6ADDR="2001:9a0:5004:1900::52/64"
IPV6_DEFAULTGW="2001:9a0:5004:1900::1"
IPV6_AUTOCONF="no"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_FORWARDING="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="eth0"
# This is system specific and can be created using 'uuidgen eth0' command #
UUID="c27bbe86-3299-440e-88bc-9ed5901b2142"
DEVICE="ens192"
ONBOOT="yes"
NM_CONTROLLED=no

Het commando in de comment is mogelijk nog nodig om te draaien op de prompt. Let hier op. Na een extra ‘systemctl restart network’ moet je weer verbonden zijn en kan je het verifiëren met ‘ip a’ of ‘ifconfig’.
De laatste regel is met name van belang zodat deze file gebruikt word voor configuratie van het ‘eth0’ interface, in plaats dat de NetworkManager dit overneemt.

Syslog-NG met MySQL Logparser (Netlog)

Vanuit de Uxx-001 server heb ik een Syslog systeem wat dermate handig en simplistisch is in gebruik maar wel goed oogt dat dit ook mee moet. Hier is in de basis Syslog-NG voor nodig, als mede MySQL en een stukje PHP software. De laatst genoemde functionaliteit is mogelijk, dus nu Syslog-NG nog. Vanuit de CentOS community is er gekozen voor RSyslog en deze zal verwijderd moeten worden.

wget https://copr.fedorainfracloud.org/coprs/czanik/syslog-ng37/repo/epel-7/czanik-syslog-ng37-epel-7.repo
mv czanik-syslog-ng37-epel-7.repo /etc/yum.repos.d/syslog-ng37-epel-7.repo
systemctl stop rsyslog
systemctl disable rsyslog
yum -y remove rsyslog
yum install -y syslog-ng
systemctl start syslog-ng
systemctl enable syslog-ng

Meer is het niet, gelukkig en dat scheelt. Nu de meer interessante stukken. Eerst zal de basis van MySQL nog even goed gezet moeten worden.

Configureer in /root een bestand ‘.my.cnf’ . Zoek hiervoor het root password op via “cat /var/log/mysqld.log | grep root@”

[client]
user=root
pass=<wat je vond>

Nu kan je inloggen in de MySQL server. Hier zullen diverse changes doorgevoerd moeten worden als basis. Het eerste is je password opnieuw invoeren.

ALTER USER 'root'@'localhost' IDENTIFIED BY '<je password>';

Er zullen een aantal databases en tabellen aangemaakt moeten worden. Door onderstaand in te voeren is dat geregeld (voer indien gewenst een ander wachtwoord in op regels 5 en 6:

CREATE DATABASE `syslog`;
CREATE DATABASE `netlogconfig`;
 
GRANT ALL ON syslog.* TO 'syslog'@'localhost' IDENTIFIED BY 'WonFaznu$(s#3nCi';
GRANT ALL ON netlogconfig.* TO 'syslog'@'localhost' IDENTIFIED BY 'WonFaznu$(s#3nCi';
 
USE syslog;
CREATE TABLE `template` (
  `id` int(15) unsigned NOT NULL AUTO_INCREMENT,
  `HOST` varchar(39) NOT NULL,
  `FAC` varchar(255) NOT NULL,
  `PRIO` varchar(255) NOT NULL,
  `LVL` varchar(255) NOT NULL,
  `TAG` varchar(255) NOT NULL,
  `DAY` varchar(10) NOT NULL,
  `TIME` varchar(8) NOT NULL,
  `PROG` varchar(255) NOT NULL,
  `MSG` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `HOST` (`HOST`),
  KEY `DAY` (`DAY`),
  KEY `TIME` (`TIME`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
USE netlogconfig;
CREATE TABLE `hostnames` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `hostip` text NOT NULL,
  `hostname` text NOT NULL,
  `hosttype` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
CREATE TABLE `hosttype` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;
 
CREATE TABLE `lograte` (
  `id` int(10) NOT NULL auto_increment,
  `hostnameid` int(10) NOT NULL,
  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `1min` float default NULL,
  `5min` float default NULL,
  `10min` float default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;
 
CREATE TABLE `lograteconf` (
  `hostnameid` int(10) NOT NULL,
  `samplerate` int(10) default NULL
) ENGINE=MyISAM;

CREATE TABLE `logscavenger` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `keyword` varchar(100) DEFAULT NULL,
  `dateadded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `active` int(1) NOT NULL,
  `datedeleted` timestamp NULL DEFAULT NULL,
  `emailrcpt` varchar(255) DEFAULT NULL,
  `emailgroup` int(2) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `emailgroups` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `groupname` varchar(40) NOT NULL,
  `recepients` text NOT NULL,
  `active` int(1) DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `logcache` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `host` varchar(39) NOT NULL,
  `msg` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `host` (`host`),
  KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Vervolgens kan de basis van Netlog geinstalleerd worden. Download de installatie files van de Netlog applicatie:

wget https://www.pc-mania.nl/netlog_v2.01.tgz

Dan kan het bestand uitgepakt worden, bij voorkeur in de /tmp of /root directory en de  installatie uitgevoerd:

tar xvf netlog_v2.01.tgz
cd netlog_v2.01
./install.sh

Deze zal de bestanden verplaatsen naar de juiste directories. Na deze stap kan het nodige aan instellingen rechtgezet worden indien je bijvoorbeeld het wachtwoord van een of beide databases hebt aangepast. De 2 bestanden voor wachtwoorden zijn, zoals je zag in de install.sh output duidelijk te vinden.

 Nu de belangrijkste 2 directory’s en bestanden bestaan is het tijd om deze ‘logparser’ als daemon (service) mee te laten draaien. Dit kan via de systemd systematiek binnen Centos7. De oude ‘/etc/inittab’ met runlevels (3 bijv.) zijn niet meer  namelijk.
Maak een bestand aan met de naam ‘/usr/lib/systemd/system/logparser.service‘ en vul deze met:

[Unit]
Description=System Logger Parser Daemon
After=mysqld.service
 
[Service]
ExecStart=/usr/bin/php /usr/share/syslog-ng/php/logparser.php
Restart=on-failure
 
[Install]
WantedBy=multi-user.target
Alias=logparser.service

Dan kan het systeem herladen worden en de service gestart.

systemctl daemon-reload
systemctl enable logparser.service
systemctl status logparser

De service word nog niet  gestart! Dat is met reden dat de Syslog-NG backend nog verteld moet worden wat deze moet doen en hoe deze inkomende berichten moet verwerken.

In het bestand ‘/etc/syslog-ng/syslog-ng.conf’ moeten er 2 sources, 1 destination en 2 log methodes voor toegevoegd worden.

#voer in onder de stanza van 'source s_sys'
 
source s_network_udp {
    network(
        ip(0.0.0.0)
        port(514)
        transport("udp")
    );
};
source s_network_tcp {
    network(
        ip(0.0.0.0)
        port(514)
        transport("tcp")
    );
};
 
#voer in onder de stanza van 'destination d_mlal'
 
destination d_mysql {
    pipe("/var/log/syslog.fifo"
    template("HOST_:_$SOURCEIP _,_ FAC_:_$FACILITY _,_ PRIO_:_$PRI _,_ LVL_:_$LEVEL _,_ TAG_:_$TAG _,_ DAY_:_$YEAR-$MONTH-$DAY _,_ TIME_:_$HOUR:$MIN:$SEC _,_ PROG_:_$PROGRAM _,_ MSG_:_$MSG\n")
    template-escape(yes));
};
 
#voer in onder de laatste stanza van 'log { source(s_sys)'
 
log { source(s_network_udp); destination(d_mysql); };
log { source(s_network_tcp); destination(d_mysql); };

Sla het werk op en herstart de Syslog-NG daemon via “systemctl restart syslog-ng“. Voer desgewenst een check uit met “systemctl status syslog-ng” en “ss -ln|grep 514”:

udp    UNCONN     0      0         *:514                   *:*
tcp    LISTEN     0      128       *:514                   *:*

Nu Syslog-NG weet wat er moet gebeuren met de inkomende berichten en deze dus met een specifieke opmaak naar het FiFo bestand in ‘/var/log/syslog.fifo‘ moet schrijven kunnen we de logparser service starten.

systemctl start logparser
systemctl status logparser
● logparser.service - System Logger Parser Daemon
   Loaded: loaded (/usr/lib/systemd/system/logparser.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2017-03-29 13:33:37 CEST; 4s ago
 Main PID: 3155 (php)
   CGroup: /system.slice/logparser.service
           └─3155 /usr/bin/php /usr/share/syslog-ng/php/logparser.php

Mar 29 13:33:37 uxx-002.pc-mania.nl systemd[1]: Started System Logger Parser Daemon.
Mar 29 13:33:37 uxx-002.pc-mania.nl systemd[1]: Starting System Logger Parser Daemon...

 Voila. De Netlog parser service draait en als alles goed verlopen is zal ook de website werken. Browse naar http://192.168.190.52/ en de website moet getoond worden. Uiteraard zonder informatie, hosts of categorieen.

Vergeet niet de jobs in ‘/etc/crontab’ actief te zetten. Let op; de laatste regel met “prunelog.php” is alleen noodzakelijk bij een archiver situatie. In dit geval dus even niet.

Test door middel van een extra host of netwerk device of je logging werkt. Een check kan als volgt uitgevoerd worden:

iptables -L -nv
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
...
   96 17444 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW udp dpt:514


mysqlshow --count syslog
Database: syslog
+-------------------------------------+----------+------------+
|               Tables                | Columns  | Total Rows |
+-------------------------------------+----------+------------+
| HST_192_168_190_254_DATE_2017_03_29 |       10 |        235 |
| template                            |       10 |          0 |
+-------------------------------------+----------+------------+
2 rows in set.

Voor de lograte pagina moet er een correctie gedaan worden. Vanwege PHP7 is GD nog niet volledig up to date. Bewerk het bestand ‘/usr/share/php/jpgraph/gd_image.inc.php’ op regel 110 en zet de “//” voor deze regel

  //JpGraphError::RaiseL(25128);//(......

Om de pagina direct beter te laten werken (er zijn namelijk wat functies missend in de settings.php) moet er handmatig even wat via MySQL gedaan worden:

use netlogconfig;
insert into hosttype values (1,"Firewall")
insert into hostnames (hostip,hostname,hosttype) values ("192.168.190.254","dc-firewall",1);
insert into lograteconf values (1,1);
exit;

Ga naar de logout knop op de pagina om de sessie te resetten. En dan zal de logging getoond moeten worden.

Webserver en TLS/SSL

De standaard inrichting van httpd en php zijn nog van toepassing. Ook de zojuist geïnstalleerde Netlog applicatie draait, jawel, in de standaard ‘/var/www/html’ directory. Geen probleem. Er zal wat aangepast moeten worden.

#Listen 80
Listen *:80

#ServerAdmin root@localhost
ServerAdmin bartjan [ at ] pc-mania [dot] nl

#ServerName www.example.com:80
ServerName uxx-002.pc-mania.nl

Maak een default site aan, zodat alle request daar op binnen komen in de configuratie ‘/etc/httpd/conf.d/_default-site.conf

<VirtualHost *:80>
 DocumentRoot /var/www/html
 ServerName uxx-002.pc-mania.nl
 <Directory /var/www/html>
      AllowOverride all
      Options MultiViews IncludesNoExec FollowSymLinks
 </Directory>
</VirtualHost>

Test de configuratie met het commando ‘httpd -t‘ en eventueel met de output van ‘httpd -S’ zoals hieronder (let op, het voorheen gebruikte ‘apachectl -S’ word niet meer gebruikt):

httpd -S
VirtualHost configuration:
*:443                  uxx-002.pc-mania.nl (/etc/httpd/conf.d/ssl.conf:56)
*:80                   is a NameVirtualHost
         default server uxx-002.pc-mania.nl (/etc/httpd/conf.d/_default-site.conf:1)
         port 80 namevhost uxx-002.pc-mania.nl (/etc/httpd/conf.d/_default-site.conf:1)

Nu kunnen er meer websites toegevoegd worden, door elke in zijn eigen .conf  bestand te plaatsen. Verplaats de inhoud van de map ‘/var/www/html’ naar een nieuwe map ‘/var/www/syslog’ en voeg deze configuratie toe in ‘/etc/httpd/conf.d/syslog.pc-mania.nl.conf’

<VirtualHost *:80>
 DocumentRoot /var/www/syslog
 ServerName syslog.pc-mania.nl
 <Directory /var/www/syslog>
      AllowOverride all
      Options MultiViews IncludesNoExec FollowSymLinks
 </Directory>
</VirtualHost>

Voer een herstart uit met ‘apachectl restart’ of ‘systemctl restart httpd’ en controleer of de output van ‘httpd -S’ nu uitgebreid is.

TLS/SSL hardening toepassen

Voordat we TLS (of SSL) gaan toepassen moeten er wat regels gezet worden wat de beveiliging omhoog brengt. Dit voorkomt mogelijke man-in-the-middle aanvallen of andere meeluister praktijken. Dat zal niet hard lopen met de hobby matige informatie maar toch.

Maak een bestand aan ‘/etc/httpd/conf.d/security.conf en voeg onderstaande in.

ServerTokens Prod
ServerSignature Off
TraceEnable Off
Header set X-Content-Type-Options: "nosniff"
Header set X-Frame-Options: "sameorigin"
Header unset ETag
FileETag None

Nadat deze aangemaakt is moet ook de ‘/etc/httpd/conf.d/ssl.conf’ er aan geloven. Open deze en voeg het volgende toe onderaan het bestand:

SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:AES256+ED
SSLHonorCipherOrder on

##
## Header context
##
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always edit Set-Cookie ^(.*)$ $1;secure
Header always set X-Frame-Options "DENY"
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Permitted-Cross-Domain-Policies "none"

Verwijderd het gehele stuk van de ‘virtualhost _default_:443’ en voeg dit toe aan de ‘/etc/httpd/conf.d/_default-site.conf:

<VirtualHost *:443>
 DocumentRoot /var/www/html
 ServerName uxx-002.pc-mania.nl
 SSLEngine on
 SSLCertificateFile /etc/pki/tls/certs/localhost.crt
 SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
 <Directory /var/www/html>
      AllowOverride all
      Options MultiViews IncludesNoExec FollowSymLinks
 </Directory>
</VirtualHost>

En ook dat werkt nu, op het certificaat na, goed. Dat is eenvoudig toe te voegen door LetsEncrypt.

yum install -y python-certbot-apache

Zorg wel dat de server uiteraard bereikbaar is op DNS en IP adres, zowel poort 80 en 443.

certbot --apache certonly -m bartjan [ at ]  pc-mania [dot] nl -d uxx-002.pc-mania.nl

Hierna zijn er diverse files gegenereerd en kan je de configuratie in de ‘/etc/httpd/conf.d/_default-site.conf’ aanpassen:

 SSLCertificateFile /etc/letsencrypt/live/uxx-002.pc-mania.nl/cert.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/uxx-002.pc-mania.nl/privkey.pem
 SSLCertificateChainFile /etc/letsencrypt/live/uxx-002.pc-mania.nl/chain.pem

 

 

 

Emergency Backup op de QNAP

In mijn thuis situatie heb ik een QNAP (TS-412)  actief waarop meerdere gebruikers hun bestanden kwijt kunnen. Nu had ik laatst het idee; wat als… Ja wat als. Wat als er brand uit breekt, of wat als de mooie polder waar ik mij in bevind weer onder water komt. Dan is het nodige kwijt.

Een disaster backup, of emergency backup is dan wel wenselijk. Maar dan geen dikke media files, geen duizenden foto’s of gedownloade installatiebestanden; nee.
Documenten. De digitalisering is redelijk toegeslagen en alle documenten van papier worden langzamerhand ingescanned of opgeslagen in een directory ‘Digiarchive’.

Hier heb ik, want zelf maken is leuker, een setup voor gebouwd en een script voor gemaakt. De setup is eenvoudig:

  • 1x VPS op de eigen vCloud omgeving in Amsterdam met 300GB storage, Centos als een NFS server.
  • 1x VPN IKE/IPsec
  • 1x QNAP met SSH access

Op de NFS server moet het bestand /etc/exports gevuld worden. Hier moet verteld worden in welke map wie en hoe bij mag. In dit geval de map /var/data/vrieskist en de host 192.168.1.100 (QNAP):

/var/data/vrieskist 192.168.1.100(rw,sync,no_root_squash,no_subtree_check)

Daarna kan het script gemaakt worden in het bestand embackup.sh . Hierin zit een dependency voor het bestand to_backup. In dit bestand kan je alle directory’s of files aangeven welke je elke maand gebackuped wil hebben.

Het script werkt als volgt:

  1. Geen input bestand? Stop
  2. Directory waarin de mount moet zijn bestaat niet? Maak aan, bij fout: Stop
  3. Mount zelf bestaat niet? Maak aan, bij fout: Stop
  4. Bestaat dezelfde maand van vorig jaar? Delete deze
  5. Bestaat deze maand van dit jaar? Dan heeft de backup al  gedraaid
  6. Kopieer de direcotory’s/bestanden
#!/bin/bash

if [ ! -f /share/Bartjan/Scripts/to_backup ]; then
	# input file does not exists, failing
	echo "No input file detected, exiting..."
	exit 1
fi
	
if [ ! -d "/mnt/dcstore/vrieskist" ]; then
	# dir does not exists, try to create
	echo "Mountpoint directory does not exists"
	echo "Trying make the mountpoint directory"
	mkdir -p /mnt/dcstore/vrieskist 2> /dev/null
	if [ $? -eq 0 ]; then
		echo "Mount point directory created"
		echo ""
	else
		echo "Cannot create mount point directory" >&2
		exit 1
	fi
elif [ -d "/mnt/dcstore/vrieskist" ]; then
	echo "Mountpoint directory exists"
fi


if ! `grep -qs /mnt/dcstore/vrieskist /proc/mounts`; then
	echo "Mountpoint directory does exists"
	echo "Trying to make the mount"
	mount -t nfs 192.168.100.14:/var/data/vrieskist /mnt/dcstore/vrieskist/ 2> /dev/null
	if [ $? -eq 0 ]; then
		echo "Mount point created"
		echo ""
	else
		echo "Cannot create mount point" >&2
		exit 1
	fi
elif `grep -qs /mnt/dcstore/vrieskist /proc/mounts`; then
	echo "Mount exists"
fi


# Looks like the critical parts are in place...

LASTYEAR=`date +%b_%Y --date="1 year ago"`
THISYEAR=`date +%b_%Y`

if [ -d "/mnt/dcstore/vrieskist/$LASTYEAR" ]; then
	echo "$LASTYEAR: it exists"
	rm -rf /mnt/dcstore/vrieskist/$LASTYEAR 2> /dev/null
	if [ $? -eq 0 ]; then
		echo "Directory $LASTYEAR purged"
		echo ""
	else
		echo "Cannot remove directory $LASTYEAR" >&2
		exit 1
	fi
else
	echo "$LASTYEAR: it does not exists"
fi

if [ -d "/mnt/dcstore/vrieskist/$THISYEAR" ]; then
	echo "$THISYEAR: it exists. Probably no need to copy.."
else
	echo "$THISYEAR: does not exists"
	echo "Creating target directory"
	mkdir /mnt/dcstore/vrieskist/$THISYEAR 2> /dev/null
	if [ $? -eq 0 ]; then
		echo "Target directory created"
		echo ""
	else
		echo "Cannot create target directory" >&2
		exit 1
	fi
	echo "Copying..."
	echo ""
	while read line; do
		cp -a "$line" /mnt/dcstore/vrieskist/$THISYEAR/ 2> /dev/null
	done < /share/Bartjan/Scripts/to_backup
	if [ $? -eq 0 ]; then
		echo "Copy succesfull!"
		echo ""
	else
		echo "Failure: Cannot copy source to target directory" >&2
		exit 1
	fi
fi

exit 0

De output kan zijn:

[./Scripts] # .embackup.sh
Mountpoint directory exists
Mount exists
Mar_2016: it does not exists
Mar_2017: does not exists
Creating target directory
Target directory created

Copying..
Copy succesfull!

Maar ook het kan als volgt zijn:

[./Scripts] # .embackup.sh
Mountpoint directory does not exists
Trying make the mountpoint directory
Mount point directory created

Mountpoint directory does exists
Trying to make the mount
Mount point created

Mar_2016: it does not exists
Mar_2017: it exists. Probably no need to copy..

Het doel word hiermee simpel bereikt. Dit kan vast en zeker in bestaande software pakketten of misschien veel simpeler. Dit is nu zo gedaan vanwege de automatische restore van systeem settings op de Qnap. Na een reboot zijn mount points weg, directory’s in /mnt en zo nog een paar zaken. Het staat nu in de crontab van de QNAP dat het elke maar de eerste dag even draait.

Natuurlijk, het is ook vast vanuit de QNAP store middels een te installeren programma mogelijk naar een online cloud dienst en dat is prima. Maar ik heb nu de controle over wat, hoe en ook waar.