WordPress XML-Sitemap-Plugin mit XMLWriter – Kurzanleitung

Veröffentlichung 28. August 2018 @ 23:44
Letzte Änderung 29. August 2018 @ 15:27

Überblick

  • „Primitives“ Plugin zur Erstellung einer aktuellen XML-Sitemap-Datei für Beiträge und Seiten bei Veröffentlichung eines Beitrags / einer Seite
  • Nutzung der PHP-XMLWriter-Erweiterung zur Erzeugung eines standarkonformen XML-Schemas für das Sitemapprotokoll
  • Präfixe „self“ für PHP-Funktionen und „self-“ für Plugin-Verzeichnis und Plugin-Datei

Voraussetzungen

Netzwerk

  • Website https://wordpress.example.com

Software

  • WordPress 4.9.8 #https://wordpress.example.com/wp-admin/update-core.php

Ordner und Dateien

  • Installation /usr/share/wordpress/wp-content/plugins/self-xml-sitemap

Plugin-Verzeichnis anlegen

mkdir /usr/share/wordpress/wp-content/plugins/self-xml-sitemap

Plugin-Datei erstellen

<?php
/*
Plugin Name: SELF XML Sitemap
Description: Create updated XML sitemap file 'sitemap.xml' in main directory every time a page or post is published
Version: 2018-08-28
Author: Thomas Fabian
Author URI: https://www.fabiblog.de
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
*/
if (!function_exists ('selfCreateXmlSitemap'))
{
  function selfCreateXmlSitemap ()
  {
    // Get all pages and posts
    $args = ['numberposts' => -1, 'post_type' => ['page', 'post']];
    $posts = get_posts ($args);
    // Create XML sitemap file
    $xmlWriter = new XMLWriter ();
    $xmlFile = ABSPATH . 'sitemap.xml';
    $xmlWriter->openURI ($xmlFile);
    $xmlWriter->setIndent (true);
    $xmlWriter->startDocument ('1.0', 'UTF-8');
    $xmlWriter->startElement ('urlset');
    $xmlWriter->writeAttribute ('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
    foreach ($posts as $post)
    {
      setup_postdata ($post);
      $xmlWriter->startElement ('url');
      $xmlWriter->writeElement ('loc', get_permalink ($post->ID));
      $xmlWriter->writeElement ('lastmod', strstr ($post->post_modified, ' ', true));
      $xmlWriter->endElement ();
    }
    $xmlWriter->endElement ();
    $xmlWriter->endDocument ();
    $xmlWriter->flush ();
  }
  // Hook function selfCreateXmlSitemap to actions publish_page and publish_post
  add_action ('publish_page', 'selfCreateXmlSitemap');
  add_action ('publish_post', 'selfCreateXmlSitemap');
}
?>

Zugriffsrechte setzen

chown --recursive www-data:www-data /usr/share/wordpress/wp-content/plugins/self-xml-sitemap

Plugin aktivieren

https://wordpress.example.com/wp-admin/plugins.php
  SELF XML Sitemap - Aktivieren

Quellen

https://codex.wordpress.org/Writing_a_Plugin
https://developer.wordpress.org/plugins/
https://developer.wordpress.org/reference/
https://secure.php.net/manual/de/book.xmlwriter.php
https://www.sitemaps.org/protocol.html

PHP-FPM Logging – Kurzanleitung

Veröffentlichung 28. August 2018 @ 21:32
Letzte Änderung 29. August 2018 @ 10:57

Übersicht

  • Logging von Standardausgabe stdout und Standardfehlerausgabe stderr
  • Logging langsamer PHP-Skripte mit Details in getrennter Logdatei

Voraussetzungen

Software

  • PHP 7.0.30 #php –version
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ordner und Dateien

  • Konfiguration /etc/php/7.0/fpm/pool.d/example.conf
  • Log /var/log/php7.0-fpm.log, /var/log/php7.0-fpm.log.slow
  • Logrotate /etc/logrotate.d/php7.0-fpm

Standardausgabe stdout und Standardfehlerausgabe stderr loggen

FPM-Pool-Konfiguration anpassen

...
;Standardausgaben stdout und Standardfehlerausgaben stderr loggen
catch_workers_output = 1

Langsame PHP-Skripte loggen

FPM-Pool-Konfiguration anpassen

...
;langsame PHP-Skripte loggen
request_slowlog_timeout = 10s
slowlog = /var/log/php7.0-fpm.log.slow

Logdatei für langsame Skripte rotieren

#/var/log/php7.0-fpm.log {
/var/log/php7.0-fpm.log
/var/log/php7.0-fpm.log.slow {
...

PHP-FPM neuladen

systemctl reload php7.0-fpm

Quellen

http://manpages.ubuntu.com/manpages/xenial/man8/logrotate.8.html
https://secure.php.net/manual/de/install.fpm.configuration.php

PHP-FPM Core Dumps – Kurzanleitung

Veröffentlichung 28. August 2018 @ 19:33
Letzte Änderung 29. August 2018 @ 10:58

Übersicht

  • Erzeugen von Core Dumps für PHP-FPM

Voraussetzungen

Software

  • GNU Project Debugger GDB 7.11.1 #gdb –-version
  • PHP 7.0.30 #php –version
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ordner und Dateien

  • Core Dumps /tmp/core-php-fpm7.0-*
  • Konfiguration /etc/default/apport, /etc/init.d/apport, /etc/php/7.0/fpm/pool.d/example.conf, /etc/sysctl.conf, /proc/sys/fs/suid_dumpable, /proc/sys/kernel/core_pattern

GNU Project Debugger GDB installieren

apt install gdb

Apport deaktivieren

Konfigurationsdatei für Apport-SysVinit-Skript /etc/init.d/apport anpassen

...
#Apport deaktivieren
#enabled=1
enabled=0

System neustarten

shutdown -r now

Core Dumps von Programmen mit gesetztem SUID-/SGID-Bit zulassen

Kernel-Parameter dauerhaft bei jedem Systemstart ergänzen und Änderungen sofort laden

...
#auch Core Dumps von Programmen mit gesetztem SUID-/SGID-Bit erzeugen,
#dabei nur Benutzer root Zugriff auf Core-Dump-Dateien erlauben:
fs.suid_dumpable=2
sysctl --load=/etc/sysctl.conf

[Optional] Kernel-Parameter temporär bis zum nächsten Neustart ändern

echo "2" > /proc/sys/fs/suid_dumpable

PHP-FPM neustarten

systemctl restart php7.0-fpm

Aufbau der Core-Dump-Dateinamen festlegen

Format core-Programm-Hostname-PID-UID-GID-Zeitstempel

Kernel-Parameter dauerhaft bei jedem Systemstart ergänzen und Änderungen sofort laden

...
#Aufbau der Core-Dump-Dateinamen festlegen:
kernel.core_pattern=/tmp/core-%e-%h-%p-%u-%g-%t

[Optional] Kernel-Parameter temporär bis zum nächsten Neustart ändern

echo "/tmp/core-%e-%h-%p-%u-%g-%t" > /proc/sys/kernel/core_pattern

Größenbegrenzung für Core Dumps für Pool example aufheben

FPM-Pool-Konfigurationdatei ergänzen

...
;Größenbegrenzung für Core Dumps aufheben
rlimit_core = unlimited

PHP-FPM neuladen

systemctl reload php7.0-fpm

[Optional] Core Dump erzeugen

(Beliebige) ID für Prozess für Pool example finden

ps -ef | grep 'php-fpm: pool example'
  ...
  www-data <PID> xxx 0 xx:xx ? xx:xx:xx php-fpm: pool example
  ...

Prozess mit Signal für Segmentation Fault beenden und dadurch Core-Dump-Datei erzeugen

kill -s SIGSEGV <PID>

Core Dump analysieren

gdb /usr/sbin/php-fpm7.0 /tmp/core-php-fpm7.0-xxx-<PID>-xxx-xxx-xxx
  ...
  (gdb) bt full
  ...

Aufhebung der Größenbegrenzung für Core Dumps für Pool rückgängig machen

FPM-Pool-Konfigurationdatei anpassen

...
;rlimit_core = unlimited

PHP-FPM neuladen

systemctl reload php7.0-fpm

[Optional] Core-Dump-Dateien löschen

rm /tmp/core-*

Quellen

http://manpages.ubuntu.com/manpages/xenial/man1/kill.1.html
http://manpages.ubuntu.com/manpages/xenial/man1/gdb.1.html
http://manpages.ubuntu.com/manpages/xenial/man5/core.5.html
http://manpages.ubuntu.com/manpages/xenial/man5/sysctl.conf.5.html
http://manpages.ubuntu.com/manpages/xenial/man7/signal.7.html
http://manpages.ubuntu.com/manpages/xenial/man8/sysctl.8.html
https://secure.php.net/manual/de/install.fpm.configuration.php
https://wiki.ubuntuusers.de/Apport/

OpenSSH Certificate Authority – Kurzanleitung

Veröffentlichung 21. August 2018 @ 15:47
Letzte Änderung 29. August 2018 @ 10:58

Überblick

  • Certificate Authority (CA) zur zentralen Authentifizierung mit signierten OpenSSH-Zertifikaten
  • Host-Zertifikate zur Authentifizierung von Servern gegenüber Benutzern
  • Benutzer-Zertifikate zur Authentifizierung von Benutzern gegenüber Servern
  • Dateien known_hosts auf Client und authorized_keys auf Host sind obsolet
  • CA-Server kann (sollte) Offline sein

Voraussetzungen

CA-Server ca.example.com

  • Benutzerkonto root
  • CA-Schlüssel für Host-Zertifikate /root/.ssh/ca_host_key, /root/.ssh/ca_host_key.pub
  • CA-Schlüssel für Benutzer-Zertifikate /root/.ssh/ca_user_key, /root/.ssh/ca_user_key.pub

Client client.example.com

  • Benutzerkonto clientuser
  • Benutzer-Zertifikat /home/clientuser/.ssh/id_ed25519-cert.pub
  • CA-Host-Schlüssel /etc/ssh/ssh_known_hosts
  • Client-Schlüssel /home/clientuser/.ssh/id_*

Host host.example.com

  • Benutzerkonto hostuser
  • CA-Benutzer-Schlüssel /etc/ssh/ca_user_key.pub
  • Host-Schlüssel /etc/ssh/ssh_host_*
  • Host-Zertifikat /etc/ssh/ssh_host_ed25519_key-cert.pub
  • Konfiguration /etc/ssh/sshd_config
  • Log /var/log/auth.log
  • SSH-Port 42022

Software

  • OpenSSH 7.2, OpenSSL 1.0.2g #ssh -V
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Certificate-Authority-Schlüssel für Host-Zertifikate auf CA-Server erstellen und anzeigen

Schlüsselpaar zur Signierung von Host-Zertifikaten erzeugen

root@ca.example.com:~# ssh-keygen -f /root/.ssh/ca_host_key -t ed25519
  Generating public/private ed25519 key pair.
  Enter passphrase (empty for no passphrase): ***
  Enter same passphrase again: ***
  ...

Öffentlichen CA-Host-Schlüssel anzeigen

root@ca.example.com:~# less /root/.ssh/ca_host_key.pub
  ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIKSVLOCkiHDiywSAMl+dGfV9R8Cj998wdL+wgUmFkY/ root@ca.example.com

Host-Zertifikat für host.example.com auf CA-Server erzeugen und anzeigen

(Vorhandenen) Öffentlichen Host-Schlüssel ssh_host_ed25519_key.pub von host.example.com nach CA-Server kopieren

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 hostuser@host.example.com:/etc/ssh/ssh_host_ed25519_key.pub /tmp/ssh_host_ed25519_key.pub

Öffentlichen Schlüssel signieren

Optionen
-h: Host-Zertifikat
-I: Zertifikatsname
-n: Hostname(n) („Principal(s)“)
-s: Privater CA-Schlüssel zur Signierung
-V: Gültigkeitsdauer des Zertifikats (52 Wochen = 1 Jahr)

root@ca.example.com:~# ssh-keygen -h -I host.example.com -n host.example.com -s /root/.ssh/ca_host_key -V +52w /tmp/ssh_host_ed25519_key.pub
  Enter passphrase: ***
  Signed host key /tmp/ssh_host_ed25519_key-cert.pub: id "host.example.com" serial 0 for host.example.com valid from xxx to xxx

Host-Zertifikat ssh_host_ed25519_key-cert.pub anzeigen

root@ca.example.com:~# ssh-keygen -f /tmp/ssh_host_ed25519_key-cert.pub -L
  /tmp/ssh_host_ed25519_key-cert.pub:
    Type: ssh-ed25519-cert-v01@openssh.com host certificate
    Public key: ED25519-CERT SHA256:xxx
    Signing CA: ED25519 SHA256:xxx
    Key ID: "host.example.com"
    Serial: 0
    Valid: from xxx to xxx
    Principals:
      host.example.com
    Critical Options: (none)
    Extensions: (none)

Host-Zertifikat nach host.example.com kopieren und lokal verschieben #kein Remote-Schreibzugriff auf /etc/ssh/ssh_host_ed25519_key-cert.pub

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 /tmp/ssh_host_ed25519_key-cert.pub hostuser@host.example.com:/home/hostuser/ssh_host_ed25519_key-cert.pub
root@host.example.com:~# mv /home/thomas/ssh_host_ed25519_key-cert.pub /etc/ssh/ssh_host_ed25519_key-cert.pub
root@host.example.com:~# chown root:root /etc/ssh/ssh_host_ed25519_key-cert.pub

Öffentlichen Schlüssel und Host-Zertifikat auf CA-Server löschen

root@ca.example.com:~# rm /tmp/ssh_host_ed25519_key.pub /tmp/ssh_host_ed25519_key-cert.pub

SSH-Server-Konfiguration auf host.example.com anpassen

Konfiguration ergänzen

...
#SSH mit Zertifikaten, Datei(en) mit Host-Zertifikat(en):
HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub

SSH-Server neustarten und Status abfragen

root@host.example.com:~# systemctl reload ssh
root@host.example.com:~# journalctl --unit ssh.service

SSH-Client-Konfiguration auf client.example.com anpassen

[Optional] Datei known_hosts löschen

root@client.example.com:~# rm /home/clientuser/.ssh/known_hosts

Öffentlichen CA-Host-Schlüssel zentral in Datei ssh_known_hosts hinterlegen

@cert-authority *.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIKSVLOCkiHDiywSAMl+dGfV9R8Cj998wdL+wgUmFkY/ root@ca.example.com

Certificate-Authority-Schlüssel für Benutzer-Zertifikate auf CA-Server erstellen und anzeigen

Schlüsselpaar zur Signierung von Benutzer-Zertifikaten erzeugen

root@ca.example.com:~# ssh-keygen -f /root/.ssh/ca_user_key -t ed25519
  Generating public/private ed25519 key pair.
  Enter passphrase (empty for no passphrase): ***
  Enter same passphrase again: ***
  ...

Öffentlichen CA-Benutzer-Schlüssel anzeigen

root@ca.example.com:~# less /root/.ssh/ca_user_key.pub
  ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHh304gcBUArZTbVGk0b3HYQVIguCmQQlbo0DvU8gItO root@ca.example.com

CA-Benutzer-Schlüssel auf host.example.com hinterlegen und Konfiguration anpassen

Öffentlichen CA-Benutzer-Schlüssel ca_user_key.pub von CA-Server nach host.example.com kopieren und lokal verschieben #kein Remote-Schreibzugriff auf /etc/ssh/ca_user_key.pub

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 /root/.ssh/ca_user_key.pub hostuser@host.example.com:/home/hostuser/ca_user_key.pub
root@host.example.com:~# mv /home/hostuser/ca_user_key.pub /etc/ssh/ca_user_key.pub
root@host.example.com:~# chown root:root /etc/ssh/ca_user_key.pub

SSH-Server-Konfiguration auf host.example.com ergänzen

...
#SSH mit Zertifikaten, Datei(en) mit CA-Benutzer-Schlüssel(n):
TrustedUserCAKeys /etc/ssh/ca_user_key.pub

SSH-Server auf host.example.com neustarten und Status abfragen

root@host.example.com:~# systemctl reload ssh
root@host.example.com:~# journalctl --unit ssh.service

Benutzer-Zertifikat für clientuser@client.example.com auf CA-Server erzeugen und anzeigen

(Vorhandenen) Öffentlichen Client-Schlüssel id_ed25519.pub von client.example.com nach CA-Server kopieren

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 clientuser@client.example.com:/home/clientuser/.ssh/id_ed25519.pub /tmp/id_ed25519.pub

Öffentlichen Client-Schlüssel signieren

Optionen
-I: Zertifikatsname
-n: Benutzername(n) auf Host („Principal(s)“)
-s: Privater CA-Schlüssel zur Signierung
-V: Gültigkeitsdauer des Zertifikats (52 Wochen = 1 Jahr)

root@ca.example.com:~# ssh-keygen -I clientuser@client.example.com -n hostuser -s /root/.ssh/ca_user_key -V +52w /tmp/id_ed25519.pub
  Enter passphrase: ***
  Signed user key /tmp/id_ed25519-cert.pub: id "clientuser@client.example.com" serial 0 for hostuser valid from xxx to xxx

Benutzer-Zertifikat id_ed25519-cert.pub anzeigen

root@ca.example.com:~# ssh-keygen -f /tmp/id_ed25519-cert.pub -L
  /tmp/id_ed25519-cert.pub:
    Type: ssh-ed25519-cert-v01@openssh.com user certificate
    Public key: ED25519-CERT SHA256:xxx
    Signing CA: ED25519 SHA256:xxx
    Key ID: "clientuser@client.example.com"
    Serial: 0
    Valid: from xxx to xxx
    Principals:
      hostuser
    Critical Options: (none)
    Extensions:
      permit-X11-forwarding
      permit-agent-forwarding
      permit-port-forwarding
      permit-pty
      permit-user-rc

Benutzer-Zertifikat nach client.example.com kopieren

root@ca.example.com:~# scp -i /root/.ssh/id_ed25519 -P 42022 /tmp/id_ed25519-cert.pub clientuser@client.example.com:/home/clientuser/.ssh/id_ed25519-cert.pub

Öffentlichen Schlüssel und Benutzer-Zertifikat auf CA-Server löschen

root@ca.example.com:~# rm /tmp/id_ed25519.pub /tmp/id_ed25519-cert.pub

SSH-Client-Konfiguration auf client.example.com anpassen

Client-Konfigurationsdatei ergänzen

...
Host host
  #SSH mit Zertifikaten, Benutzer-Zertifikat, Voreinstellung IdentityFile mit Endung "-cert.pub": 
  #CertificateFile ~/.ssh/id_ed25519-cert.pub
  #sicherster Host-Authentifizierungs-Algorithmus gemäß ssh-keyscan -p 42022 host.example.com:
  #HostKeyAlgorithms ssh-ed25519
  #SSH mit Zertifikaten, Host-Authentifizierungs-Algorithmus für Host-Zertifikat gemäß ssh-keyscan -c -p 42022 host.example.com:
  HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com
  ...

[Optional] Client-Schlüssel-Datei authorized_keys löschen

root@client.example.com:~# rm /home/clientuser/.ssh/authorized_keys

SSH-Zugriff auf Host testen

clientuser@client.example.com:~ ssh -v host
  ...
  debug1: Server host certificate: ssh-ed25519-cert-v01@openssh.com SHA256:xxx, serial 0 ID "host.example.com" CA ssh-ed25519 SHA256:xxx valid from xxx to xxx
  ...
  debug1: Host 'host.example.com' is known and matches the ED25519-CERT host certificate.
  debug1: Found CA key in /etc/ssh/ssh_known_hosts:1
  ...
  Enter passphrase for key '/home/clientuser/.ssh/id_ed25519': ***

Quellen

https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?annotate=HEAD
https://man.openbsd.org/scp
https://man.openbsd.org/ssh
https://man.openbsd.org/ssh-keygen
https://man.openbsd.org/ssh-keygen#CERTIFICATES
https://man.openbsd.org/ssh-keyscan
https://man.openbsd.org/sshd.8
http://manpages.ubuntu.com/manpages/xenial/man5/sshd_config.5.html
https://www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with-ubuntu

WordPress Shortcode-Plugin – Kurzanleitung

Veröffentlichung 15. August 2018 @ 22:40
Letzte Änderung 28. August 2018 @ 23:32

Überblick

  • „Primitives“ Plugin für Shortcodes für den Zeitpunkt der Veröffentlichung und der letzen Änderung eines WordPress-Beitrags
  • Präfixe „self“ für PHP-Funktionen und „self-“ für Plugin-Verzeichnis, Plugin-Datei und Shortcodes

Voraussetzungen

Netzwerk

  • Website https://wordpress.example.com

Software

  • WordPress 4.9.8 #https://wordpress.example.com/wp-admin/update-core.php

Ordner und Dateien

  • Installation /usr/share/wordpress/wp-content/plugins/self-shortcodes

Plugin-Verzeichnis anlegen

mkdir /usr/share/wordpress/wp-content/plugins/self-shortcodes

Plugin-Datei erstellen

<?php
/*
Plugin Name: SELF Shortcodes
Description: Provide shortcodes 'self-modified' for last modification timestamp and 'self-published' for publishing timestamp
Version: 2018-08-15
Author: Thomas Fabian
Author URI: https://www.fabiblog.de
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
*/
if (!function_exists ('selfShortcodeModified'))
{
  function selfShortcodeModified ()
  {
    return get_the_modified_date () . ' @ ' . get_the_modified_time ();
  }
  if (!shortcode_exists ('self-modified'))
  {
    add_shortcode ('self-modified', 'selfShortcodeModified');
  }
}
if (!function_exists ('selfShortcodePublished'))
{
  function selfShortcodePublished ()
  {
    return get_the_date () . ' @ ' . get_the_time ();
  }
  if (!shortcode_exists ('self-published'))
  {
    add_shortcode ('self-published', 'selfShortcodePublished');
  }
}
?>

Zugriffsrechte setzen

chown --recursive www-data:www-data /usr/share/wordpress/wp-content/plugins/self-shortcodes

Plugin aktivieren

https://wordpress.example.com/wp-admin/plugins.php
  SELF Shortcodes - Aktivieren

Beispiel für Nutzung innerhalb eines Beitrags

...
<i>Veröffentlichung [self-published]</i>
<i>Letzte Änderung [self-modified]</i>
...

Quellen

https://codex.wordpress.org/shortcode
https://codex.wordpress.org/Writing_a_Plugin
https://developer.wordpress.org/plugins/
https://developer.wordpress.org/reference/

Nagios – Kurzanleitung

Veröffentlichung 15. August 2018 @ 19:43
Letzte Änderung 29. August 2018 @ 10:58

Überblick

  • IT-Infrastruktur-Monitoring über Weboberfläche
  • Anpassung der php.ini-Datei für mod_php und der Default-Pool-Konfigurationsdatei für FPM
  • Security through obscurity durch komplizierten Hostnamen und abweichenden HTTPS-Port
  • Wildcard-Zertifikat, damit Hostname nicht extern bekannt wird
  • (Zusätzliche) Absicherung über Apache-Basis-Authentifizierung mit kompliziertem Benutzernamen

Voraussetzungen

Netzwerk

  • Administrator-E-Mail admin@example.com
  • Administrator-Host admin.example.com
  • Benutzer nagios
  • Gruppe nagios
  • Host pSh6v5zB86J20Ll3Wiv6.example.com
  • htpasswd-Benutzer K1MHJaHAIDaLiTDmtkjm
  • HTTPS-Port 42443

Software

  • Apache 2.4.18 #apache2 -v
  • Nagios Core 4.4.1 #https://pSh6v5zB86J20Ll3Wiv6.example.com:42443
  • PHP 7.0.30 #php –version
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ordner und Dateien

  • Installation /usr/local/nagios
  • Konfiguration /etc/apache2/sites-available/nagios.conf, /etc/php/7.0/fpm/pool.d/default.conf.disabled, /etc/php/7.0/fpm/pool.d/nagios.conf, /usr/local/nagios/etc
  • Log /usr/local/nagios/var/nagios.log, /var/log/apache2/access-nagios.log, /var/log/apache2/error.log, /var/log/apache2/error-nagios.log, /var/log/php7.0-fpm.log
  • systemd /lib/systemd/system/nagios.service
  • Zertifikate und Schlüssel /etc/letsencrypt/live/example.com/*.pem

Nagios installieren

Erforderliche Pakete installieren

apt install autoconf gcc libc6 libgd2-xpm-dev make unzip wget

Quelltexte herunterladen

cd /tmp
wget --output-document=nagioscore.tar.gz https://github.com/NagiosEnterprises/nagioscore/archive/nagios-4.4.1.tar.gz
tar --extract --file=nagioscore.tar.gz --gzip

Kompilieren

cd /tmp/nagioscore-nagios-4.4.1/
./configure --with-httpd-conf=/etc/apache2/sites-enabled
make all

Benutzer und Gruppe nagios erstellen und Nutzer www-data zu Gruppe nagios hinzufügen

make install-groups-users
usermod -aG nagios www-data

Binärdateien, CGIs und HTML-Dateien installieren

make install

Service installieren und für Autostart einrichten

make install-daemoninit

Command Mode installieren

make install-commandmode

Beispiel-Konfigurationsdateien anlegen

make install-config

Apache-Konfigurationsdateien erstellen und Module aktivieren

make install-webconf
a2enmod rewrite
a2enmod cgi

Benutzerdatei für Basis-Authentifizierung anlegen

Benutzernamen mit Passwortgenerator z. B. KeePass generieren

K1MHJaHAIDaLiTDmtkjm

Benutzerdatei mit Bcrypt-Passwort-Hash neu erstellen

htpasswd -B -c /usr/local/nagios/etc/htpasswd.users K1MHJaHAIDaLiTDmtkjm

Nagios-CGI-Konfigurationsdatei anpassen

...
#authorized_for_system_information=nagiosadmin
authorized_for_system_information=K1MHJaHAIDaLiTDmtkjm
...
#authorized_for_configuration_information=nagiosadmin
authorized_for_configuration_information=K1MHJaHAIDaLiTDmtkjm
...
#authorized_for_system_commands=nagiosadmin
authorized_for_system_commands=K1MHJaHAIDaLiTDmtkjm
...
#authorized_for_all_services=nagiosadmin
#authorized_for_all_hosts=nagiosadmin
authorized_for_all_services=K1MHJaHAIDaLiTDmtkjm
authorized_for_all_hosts=K1MHJaHAIDaLiTDmtkjm
...
#authorized_for_all_service_commands=nagiosadmin
#authorized_for_all_host_commands=nagiosadmin
authorized_for_all_service_commands=K1MHJaHAIDaLiTDmtkjm
authorized_for_all_host_commands=K1MHJaHAIDaLiTDmtkjm
...

Nagios-Konfiguration testen, Service starten und Status abfragen

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
systemctl start nagios
systemctl status nagios.service

Quelltexte löschen

rm --recursive /tmp/nagios*

Virtuellen Host mit Basis-Authentifizierung einrichten

Muster /etc/apache2/sites-enabled/nagios.conf

Hostnamen mit Passwortgenerator z. B. KeePass generieren

pSh6v5zB86J20Ll3Wiv6

Vorinstallierte Apache-Konfiguration löschen

rm /etc/apache2/sites-enabled/nagios.conf

Apache-Konfigurationsdatei anlegen

<VirtualHost *:42443>
  #eigene Subdomain statt in Unterordner nagios: 
  #Alias /nagios /usr/local/nagios/share
  CustomLog ${APACHE_LOG_DIR}/access-nagios.log vhost_combined
  DocumentRoot /usr/local/nagios/share
  ErrorLog ${APACHE_LOG_DIR}/error-nagios.log
  ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin
  ServerAdmin webmaster@example.com
  ServerName pSh6v5zB86J20Ll3Wiv6.example.com
  SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
  SSLEngine on
  <Directory /usr/local/nagios/sbin>
    Options ExecCGI
    <RequireAll>
      AuthBasicProvider file
      AuthName "Nagios"
      AuthType Basic
      AuthUserFile /usr/local/nagios/etc/htpasswd.users
      #Require all granted
      Require host admin.example.com
      Require valid-user
    </RequireAll>
  </Directory>
  <Directory /usr/local/nagios/share>
    <RequireAll>
      AuthBasicProvider file
      AuthName "Nagios"
      AuthType Basic
      AuthUserFile /usr/local/nagios/etc/htpasswd.users
      php_admin_value open_basedir /usr/local/nagios/share/
      #Require all granted
      Require host admin.example.com
      Require valid-user
    </RequireAll>
  </Directory>
</VirtualHost>

Konfiguration aktivieren

a2ensite nagios.conf

Nagios-CGI-Konfigurationsdatei anpassen

...
#eigene Subdomain statt in Unterordner nagios:
#url_html_path=/nagios
url_html_path=/
...

[Optional] FPM-Pool-Konfiguration aus Default-Konfiguration erstellen und virtuellen Host anpassen

FPM-Konfigurationsdatei anlegen

cp /etc/php/7.0/fpm/pool.d/default.conf.disabled /etc/php/7.0/fpm/pool.d/nagios.conf
;[default]
[nagios]
...
;listen = /run/php/php7.0-fpm-default.sock
listen = /run/php/php7.0-fpm-nagios.sock
...
;php_admin_value[open_basedir] = nonexistent
php_admin_value[open_basedir] = /usr/local/nagios/share/
...

Konfiguration testen und PHP-FPM neustarten

php-fpm7.0 --test
systemctl reload php7.0-fpm
#systemctl status php7.0-fpm.service

Apache-Konfigurationsdatei modifizieren

<VirtualHost *:42443>
  ...
  <Directory /usr/local/nagios/share>
    ...
    #php_admin_value open_basedir /usr/local/nagios/share/
    ...
  </Directory>
  <FilesMatch "\.php$">
    <If "-f %{REQUEST_FILENAME}">
      SetHandler "proxy:unix:/run/php/php7.0-fpm-nagios.sock|fcgi://localhost/"
    </If>
  </FilesMatch>
  <Proxy "fcgi://localhost/" enablereuse=on max=10>
  </Proxy>
</VirtualHost>

Konfiguration testen, Apache neustarten und Status abfragen

apache2ctl configtest
systemctl reload apache2
systemctl status apache2.service

Nagios-Plugins installieren

Erforderliche Pakete installieren

apt install autoconf bc build-essential gawk gcc gettext dc libc6 libmcrypt-dev libnet-snmp-perl libssl-dev make snmp wget

Quelltexte herunterladen

cd /tmp
wget --no-check-certificate --output-document=nagios-plugins.tar.gz https://github.com/nagios-plugins/nagios-plugins/archive/release-2.2.1.tar.gz
tar --extract --file=nagios-plugins.tar.gz --gzip

Kompilieren und installieren

cd /tmp/nagios-plugins-release-2.2.1/
./tools/setup
./configure
make
make install

Quelltexte löschen

rm --recursive /tmp/nagios*

Nagios konfigurieren

Sendmail ohne Option -s nutzen

...
command_name notify-host-by-email
#/usr/local/nagios/var/nagios.log "[xxx] wproc: stderr line 01: sendmail: invalid option -- 's'":
#command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /usr/sbin/sendmail -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$
command_line /usr/bin/printf "%b" "Subject: ** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **\n***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /usr/sbin/sendmail $CONTACTEMAIL$
...
command_name notify-service-by-email
#/usr/local/nagios/var/nagios.log "[xxx] wproc: stderr line 01: sendmail: invalid option -- 's'":
#command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /usr/sbin/sendmail -s "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$
command_line /usr/bin/printf "%b" "Subject: ** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **\n***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n" | /usr/sbin/sendmail $CONTACTEMAIL$
...

E-Mail-Adresse hinterlegen

...
#email nagios@localhost ; <<***** CHANGE THIS TO YOUR EMAIL ADDRESS ******
email admin@example.com ;
...

Benachrichtigungen für HTTP-Test aktivieren

...
check_command check_http
#notifications_enabled 0
notifications_enabled 1
...

[Optional] localhost 127.0.0.1 in OpenSSH-Server-Konfiguration eintragen

...
#Zugriff nur auf bestimmte Netzwerkschnittstelle:
ListenAddress xxx.xxx.xxx.xxx
ListenAddress 127.0.0.1
...
systemctl reload ssh

Befehl für SSH-Test auf Port 42022 statt Standardport 22 ändern und Benachrichtigungen aktivieren

...
#check_command check_ssh
check_command check_ssh!--port=42022
#notifications_enabled 0
notifications_enabled 1
...

Nagios-Konfiguration testen, Service neustarten und Status abfragen

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
systemctl reload nagios
systemctl status nagios.service

Quellen

https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/cgiauth.html
https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/index.html
https://httpd.apache.org/
https://httpd.apache.org/docs/2.4/howto/auth.html
https://keepass.info/
http://manpages.ubuntu.com/manpages/xenial/man8/php-fpm7.0.8.html
https://nagios-plugins.org/doc/man/
https://secure.php.net/manual/de/install.fpm.php
https://support.nagios.com/kb/article/nagios-core-installing-nagios-core-from-source-96.html#Ubuntu
https://wiki.apache.org/httpd/PHP-FPM
https://www.nagios.org/

OpenSSH-Client – Kurzanleitung

Veröffentlichung 3. August 2018 @ 17:34
Letzte Änderung 29. August 2018 @ 10:58

Überblick

  • Ed25519-Schlüssel für möglichst sicheren Zugang
  • Ed25519-Schlüssel ohne Passphrase, z. B. für unbeaufsichtigtes Backup
  • RSA-Schlüssel für kompatiblen Zugang, z. B. für Eclipse
  • Hostspezifische SSH-Client-Konfiguration

Voraussetzungen

Client client.example.com

  • Benutzerkonto clientuser
  • Client-Schlüssel /home/clientuser/.ssh/id_*
  • Host-Schlüssel /home/clientuser/.ssh/known_hosts
  • Konfiguration /etc/ssh/ssh_config, /root/.ssh/config

Host host.example.com

  • Benutzerkonto hostuser
  • Client-Schlüssel /home/hostuser/.ssh/authorized_keys
  • Host-Schlüssel /etc/ssh/ssh_host_*
  • IP-Adresse x.x.x.x
  • SSH-Port 42022

Software

  • OpenSSH 7.2, OpenSSL 1.0.2g #ssh -V
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ed25519-SSH-Schlüssel mit Passphrase generieren und auf entferntem Host speichern

SSH-Schlüsselpaar mit Authentifizierungs-Algorithmus Ed25519 erzeugen

ssh-keygen -t ed25519 #keine Option -b, da immer 256 bit
  Generating public/private ed25519 key pair.
  Enter file in which to save the key (/home/clientuser/.ssh/id_ed25519): <Enter>
  Enter passphrase (empty for no passphrase): ***
  Enter same passphrase again: ***
  ...

Öffentlichen Schlüssel in Datei authorized_keys auf Host speichern

ssh-copy-id -i /home/clientuser/.ssh/id_ed25519 -p 42022 hostuser@host.example.com #nur bei SSH-Server mit Passwort-Authentifizierung

[Optional] Öffentlichen Schlüssel aus Datei authorized_keys auf Host löschen

ssh -i /home/clientuser/.ssh/id_ed25519 -p 42022 hostuser@host.example.com 'sed --in-place "/^ssh-ed25519.*clientuser@client.example.com$/d" /home/hostuser/.ssh/authorized_keys'

[Optional] Ed25519-SSH-Schlüssel ohne Passphrase generieren

SSH-Schlüsselpaar mit Authentifizierungs-Algorithmus Ed25519 erzeugen

ssh-keygen -C clientuser@client.example.com_ppl -f /home/clientuser/.ssh/id_ed25519_ppl -N '' -t ed25519 #Endung ppl für passphraseless
  Generating public/private ed25519 key pair.
  ...

Öffentlichen Schlüssel in Datei authorized_keys auf Host speichern

ssh-copy-id -i /home/clientuser/.ssh/id_ed25519_ppl -p 42022 hostuser@host.example.com

[Optional] Öffentlichen Schlüssel aus Datei authorized_keys auf Host löschen

ssh -i /home/clientuser/.ssh/id_ed25519_ppl -p 42022 hostuser@host.example.com 'sed --in-place "/^ssh-ed25519.*clientuser@client.example.com_ppl$/d" /home/hostuser/.ssh/authorized_keys'

[Optional] RSA-SSH-Schlüssel mit Passphrase generieren und auf entferntem Host speichern

SSH-Schlüsselpaar mit Authentifizierungs-Algorithmus RSA mit Schlüssellänge 4096 Bits erzeugen

ssh-keygen -b 4096 -t rsa
  Generating public/private rsa key pair.
  Enter file in which to save the key (/home/clientuser/.ssh/id_rsa): <Enter>
  Enter passphrase (empty for no passphrase): ***
  Enter same passphrase again: ***
  ...

Öffentlichen Schlüssel in Datei authorized_keys auf Host speichern

ssh-copy-id -i /home/clientuser/.ssh/id_rsa -p 42022 hostuser@host.example.com

[Optional] Öffentlichen Schlüssel aus Datei authorized_keys auf Host löschen

ssh -i /home/clientuser/.ssh/id_rsa -p 42022 hostuser@host.example.com 'sed --in-place "/^ssh-rsa.*clientuser@client.example.com$/d" /home/hostuser/.ssh/authorized_keys'

SSH-Client für individuellen Zugriff auf entfernte Hosts konfigurieren und testen

Einstellungen in globaler SSH-Client-Konfigurationsdatei auskommentieren

...
#Host *
...
#SendEnv LANG LC_*
#HashKnownHosts yes
#GSSAPIAuthentication yes
#GSSAPIDelegateCredentials no

Öffentliche Host-Schlüssel abfragen

ssh-keyscan -p 42022 host.example.com
  ...
  [host.example.com]:42022 ssh-ed25519 xxx

Benutzerspezifische SSH-Client-Konfigurationsdatei für möglichst sicheren Zugang anlegen und Zugriffsrechte einschränken

#Einstellungen für alle Hosts:
Host *
  #sicherste symmetrische Chiffre mit Authentizierung und Integritätsprüfung gemäß ssh -Q cipher-auth
  #=> kein Eintrag für MACs erforderlich:  
  Ciphers chacha20-poly1305@openssh.com
  #Einträge in known_hosts-Datei als Hashwerte speichern:
  HashKnownHosts yes
  #sicherster Schlüsselaustausch-Algorithmus gemäß ssh -Q kex:
  KexAlgorithms curve25519-sha256@libssh.org
  #keine Passwort-Authentifizierung:
  PasswordAuthentication no
#Einstellungen für Host host.example.com: 
Host example
  #sicherster Host-Authentifizierungs-Algorithmus gemäß ssh-keyscan -p 42022 host.example.com:
  HostKeyAlgorithms ssh-ed25519
  #Name:
  HostName host.example.com
  #Private Schlüsseldatei entsprechend HostKeyAlgorithms:
  IdentityFile ~/.ssh/id_ed25519
  #geänderter Standard-Port für Security through obscurity:
  Port 42022
  #Benutzer:
  User hostuser
chmod 0600 /home/clientuser/.ssh/config

SSH-Zugriff auf Host testen

ssh example
  The authenticity of host '[host.example.com]:42022 ([x.x.x.x]:42022)' can't be established.
  ED25519 key fingerprint is xxx.
  Are you sure you want to continue connecting (yes/no)? yes
  Warning: Permanently added '[host.example.com]:42022,[x.x.x.x]:42022' (ED25519) to the list of known hosts.

[Optional] Host-Schlüssel aus known_hosts löschen

Schlüssel für Host-FQDN entfernen

ssh-keygen -R [host.example.com]:42022
  Host [host.example.com]:42022 found: line 1
  /home/clientuser/.ssh/known_hosts updated.
  Original contents retained as /home/clientuser/.ssh/known_hosts.old

Schlüssel für Host-IP entfernen

ssh-keygen -R [x.x.x.x]:42022
  Host [x.x.x.x]:42022 found: line 1
  /home/clientuser/.ssh/known_hosts updated.
  Original contents retained as /home/clientuser/.ssh/known_hosts.old

Quellen

https://infosec.mozilla.org/guidelines/openssh
https://man.openbsd.org/ssh
https://man.openbsd.org/ssh-keygen
https://man.openbsd.org/ssh-keyscan
http://manpages.ubuntu.com/manpages/xenial/man1/ssh-copy-id.1.html
http://manpages.ubuntu.com/manpages/xenial/man5/ssh_config.5.html
https://stribika.github.io/2015/01/04/secure-secure-shell.html
https://www.openssh.com/manual.html
https://www.openssh.com/specs.html

Logrotate-Konfigurations-Skript – Kurzanleitung

Veröffentlichung 3. August 2018 @ 15:27
Letzte Änderung 29. August 2018 @ 10:58

Überblick

  • Erzeugen von Logrotate-Konfigurationsdateien

Voraussetzungen

Netzwerk

  • Benutzer root

Software

  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ordner und Dateien

  • Konfiguration /etc/logrotate.d/example
  • Log /root/logs/example.log*
  • Skript /root/scripts/create_logrotate.sh

Bash-Skript zum Anlegen von Logrotate-Konfigurationsdateien erstellen

Logrotate-Skript anlegen

#!/bin/bash
LOGFILE=$1 #Logdatei
CONFIGFILE=$2 #Konfigurationsdatei
CONFIGDIR=/etc/logrotate.d #Konfigurationsverzeichnis
rm --force $CONFIGDIR/$CONFIGFILE
touch $CONFIGDIR/$CONFIGFILE
echo "$LOGFILE {" >> $CONFIGDIR/$CONFIGFILE
echo "  daily" >> $CONFIGDIR/$CONFIGFILE
echo "  missingok" >> $CONFIGDIR/$CONFIGFILE
echo "  nocompress" >> $CONFIGDIR/$CONFIGFILE
echo "  notifempty" >> $CONFIGDIR/$CONFIGFILE
echo "  rotate 7" >> $CONFIGDIR/$CONFIGFILE
echo "}" >> $CONFIGDIR/$CONFIGFILE

Zugriffsrechte anpassen

chmod 0700 /root/scripts/create_logrotate.sh

Beispiel

Logdatei /root/log/example.log rotieren

/root/scripts/create_logrotate.sh /root/logs/example.log example

Quellen

http://manpages.ubuntu.com/manpages/xenial/man8/logrotate.8.html
https://www.gnu.org/software/bash/manual/

Verzeichnis-Backup-Skript – Kurzanleitung

Veröffentlichung 3. August 2018 @ 12:56
Letzte Änderung 6. September 2018 @ 10:10

Überblick

  • Lokale Sicherung von Verzeichnissen
  • Automatisches Löschen alter Backup-Dateien

Voraussetzungen

Netzwerk

  • Benutzer root
  • Verzeichnis /root/example

Software

  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ordner und Dateien

  • Backup /root/backup/example.tar.gz, /root/backup/example/example*.tar.gz
  • Skript /root/scripts/backup_directory.sh

Bash-Skript zur lokalen Sicherung von Verzeichnissen erstellen

Backup-Skript anlegen

DIRECTORY=$1 #Verzeichnisname
BACKUPNAME=$2 #Backup-Name
BACKUPDIR=$3 #Backup-Hauptverzeichnis
USERGROUP=$4 #Benutzer und Gruppe der Backup-Datei
BACKUPMAXAGE=$5 #maximales Alter der Backup-Dateien in Tagen
DATETIME="$(date +%Y-%m-%d-%H-%M-%S)" #aktuelles Datum und aktuelle Uhrzeit
if [ ! -d "$BACKUPDIR/$BACKUPNAME" ]; then
  mkdir --mode=0700 $BACKUPDIR/$BACKUPNAME
  chown $USERGROUP:$USERGROUP $BACKUPDIR/$BACKUPNAME
fi
find $BACKUPDIR/$BACKUPNAME -mtime +$BACKUPMAXAGE -name "$BACKUPNAME-*.tar.gz" -type f -exec rm {} \;
#Verzeichnis mit allen Unterverzeichnissen, die nicht Datei CACHEDIR.TAG enthalten, sichern
tar --create --directory=/ --exclude-caches --file=$BACKUPDIR/$BACKUPNAME/$BACKUPNAME-$DATETIME.tar.gz --gzip ${DIRECTORY:1}/
ln -fs $BACKUPDIR/$BACKUPNAME/$BACKUPNAME-$DATETIME.tar.gz $BACKUPDIR/$BACKUPNAME.tar.gz
chown -h $USERGROUP:$USERGROUP $BACKUPDIR/$BACKUPNAME/$BACKUPNME-$DATETIME.tar.gz $BACKUPDIR/$BACKUPNAME.tar.gz
chmod 0600 $BACKUPDIR/$BACKUPNAME/$BACKUPNAME-$DATETIME.tar.gz

Zugriffsrechte anpassen

chmod 0700 /root/scripts/backup_directory.sh

Beispiel

Verzeichnis /root/example sichern

/root/scripts/backup_directory.sh /root/example example /root/backup root 30

Aktuelles Verzeichnis-Backup rücksichern

tar --directory=/ --extract --file=/root/backup/example.tar.gz --gzip

Quellen

http://www.bford.info/cachedir/
https://www.gnu.org/software/bash/manual/
https://www.gnu.org/software/tar/manual/

MySQL-Backup-Skript – Kurzanleitung

Veröffentlichung 3. August 2018 @ 12:28
Letzte Änderung 29. August 2018 @ 10:59

Überblick

  • Lokale Sicherung von MySQL-Datenbanken
  • Automatisches Löschen alter Backup-Dateien

Voraussetzungen

Netzwerk

  • Benutzer root
  • Datenbank example
  • MySQL-Benutzer root

Software

  • MySQL 5.7.22 #mysql –version
  • Ubuntu Server 16.04.04 LTS #lsb_release -a

Ordner und Dateien

  • Backup /root/backup/example.sql, /root/backup/example/example*.sql
  • Konfiguration /root/.my.cnf
  • Skript /root/scripts/backup_database.sh

MySQL-Konfigurationsdatei für Skriptausführung ohne Passwortabfrage anlegen

Konfigurationsdatei erstellen

[client]
user=root
password=***

Zugriffsrechte anpassen

chmod 0600 /root/.my.cnf

Bash-Skript zur lokalen Sicherung von MySQL-Datenbanken erstellen

Backup-Skript anlegen

#!/bin/bash
DATABASE=$1 #Datenbankname
BACKUPNAME=$2 #Backup-Name
BACKUPDIR=$3 #Backup-Hauptverzeichnis
OPTIONFILE=$4 #MySQL-Optionsdatei
USERGROUP=$5 #Benutzer und Gruppe der Backup-Datei
BACKUPMAXAGE=$6 #maximales Alter der Backup-Dateien in Tagen
DATETIME="$(date +%Y-%m-%d-%H-%M-%S)"
if [ ! -d "$BACKUPDIR/$BACKUPNAME" ]; then
  mkdir --mode=0700 $BACKUPDIR/$BACKUPNAME
  chown $USERGROUP:$USERGROUP $BACKUPDIR/$BACKUPNAME
fi
find $BACKUPDIR/$BACKUPNAME -mtime +$BACKUPMAXAGE -name "$BACKUPNAME-*.sql" -type f -exec rm {} \;
mysqldump --defaults-extra-file=$OPTIONFILE $DATABASE > $BACKUPDIR/$BACKUPNAME/$BACKUPNAME-$DATETIME.sql
ln -fs $BACKUPDIR/$BACKUPNAME/$BACKUPNAME-$DATETIME.sql $BACKUPDIR/$BACKUPNAME.sql
chown -h $USERGROUP:$USERGROUP $BACKUPDIR/$BACKUPNAME/$BACKUPNAME-$DATETIME.sql $BACKUPDIR/$BACKUPNAME.sql
chmod 0600 $BACKUPDIR/$BACKUPNAME/$BACKUPNAME-$DATETIME.sql

Zugriffsrechte anpassen

chmod 0700 /root/scripts/backup_database.sh

Beispiel

Datenbank example sichern

/root/scripts/backup_database.sh example example /root/backup /root/.my.cnf root 30

Aktuelles Datenbank-Backup rücksichern

mysql --defaults-extra-file=/root/.my.cnf example < /root/backup/example.sql

Quellen

https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
https://dev.mysql.com/doc/refman/5.7/en/option-files.html
https://www.gnu.org/software/bash/manual/