Apache mit Makros – Kurzanleitung

Veröffentlichung 10. September 2018 @ 20:58
Letzte Änderung 20. September 2018 @ 17:58

Übersicht

  • Anlage typischer Virtual-Host-Konfigurationen mit Makros
  • Anwendungsbeispiel mit Umleitungen auf kanonische URL mit Authentifizierung und PHP-FPM-Anbindung

Voraussetzungen

Ubuntu-Server

  • Admin-E-Mail webmaster@example.com
  • Betriebsystem Ubuntu Server 16.04.05 LTS #lsb_release -a
  • htpasswd-Datei /etc/apache2/.htpasswd
  • Installation /srv/www/example
  • Konfiguration /etc/apache2/conf-available/macro.conf, /etc/apache2/mods-available/macro.load, /etc/apache2/sites-available/example.conf
  • Log /var/log/apache2/example-access.log, /var/log/apache2/example-error.log
  • PHP-FPM-Socket /run/php/php7.0-fpm-example.sock
  • Ports HTTP 80, HTTPS 443
  • Software Apache 2.4.18 #apache2 -v
  • Software PHP 7.0.30 #php –version
  • URLs http://example.com, http://www.example.com, https://example.com, https://www.example.com
  • Zertifikate und Schlüssel /etc/letsencrypt/live/example.com/*.pem, /etc/letsencrypt/live/www.example.com/*.pem

Apache-Modul mod_macro aktivieren

a2enmod macro

Apache-Makro-Konfiguration anlegen und aktivieren

Konfigurationsdatei anlegen

#Macros for single directives / sets of directives:
<Macro MacroDocument $DocumentRoot>
  DocumentRoot $DocumentRoot
</Macro>
<Macro MacroLog $Log>
  CustomLog ${APACHE_LOG_DIR}/$Log-access.log vhost_combined
  ErrorLog ${APACHE_LOG_DIR}/$Log-error.log
</Macro>
<Macro MacroRedirect $Redirect>
  Redirect permanent / $Redirect
</Macro>
<Macro MacroServer $ServerAdmin $ServerName>
  ServerAdmin $ServerAdmin
  ServerName $ServerName
</Macro>
<Macro MacroServerAlias $ServerAlias>
  ServerAlias $ServerAlias
</Macro>
<Macro MacroSSL $SSLCertificateFile $SSLCertificateKeyFile>
  SSLCertificateFile $SSLCertificateFile
  SSLCertificateKeyFile $SSLCertificateKeyFile
  SSLEngine on
</Macro>
#Macros for directories:
<Macro MacroDirectoryAuth $Directory $AuthName $AuthUserFile>
  <Directory $Directory>
    AuthBasicProvider file
    AuthName $AuthName
    AuthType Basic
    AuthUserFile $AuthUserFile
    Require valid-user
  </Directory>
</Macro>
#Special purpose macros: 
<Macro MacroPHPFPMProxy $Socket>
  <FilesMatch "\.php$">
    <If "-f %{REQUEST_FILENAME}">
      SetHandler "proxy:unix:/run/php/php7.0-fpm-$Socket.sock|fcgi://localhost/"
    </If>
  </FilesMatch>
  <Proxy "fcgi://localhost/">
  </Proxy>
</Macro>
#Macros for virtual hosts:
<Macro MacroVirtualHostHTTPForRedirectWithAlias $Port $Log $Redirect $ServerAdmin $ServerName $ServerAlias>
  <VirtualHost *:$Port>
    Use MacroLog $Log
    Use MacroRedirect $Redirect
    Use MacroServer $ServerAdmin $ServerName
    Use MacroServerAlias $ServerAlias
  </VirtualHost>
</Macro>
<Macro MacroVirtualHostHTTPSForRedirect $Port $Log $Redirect $ServerAdmin $ServerName $SSLCertificateFile $SSLCertificateKeyFile>
  <VirtualHost *:$Port>
    Use MacroLog $Log
    Use MacroRedirect $Redirect
    Use MacroServer $ServerAdmin $ServerName
    Use MacroSSL $SSLCertificateFile $SSLCertificateKeyFile
  </VirtualHost>
</Macro>
<Macro MacroVirtualHostHTTPSWithAuthAndFPM $Port $DocumentRoot $Log $ServerAdmin $ServerName $SSLCertificateFile $SSLCertificateKeyFile $AuthUserFile $Socket>
  <VirtualHost *:$Port>
    Use MacroDocument $DocumentRoot
    Use MacroLog $Log
    Use MacroServer $ServerAdmin $ServerName
    Use MacroSSL $SSLCertificateFile $SSLCertificateKeyFile
    Use MacroDirectoryAuth $DocumentRoot $ServerName $AuthUserFile
    Use MacroPHPFPMProxy $Socket
  </VirtualHost>
</Macro>

Konfiguration aktivieren

a2enconf macro

Konfiguration testen und Apache neuladen

apache2ctl configtest
systemctl reload apache2
#systemctl status apache2

[Beispiel] Virtuellen Host mit Umleitung von http://example.com, http://www.example.com und https://example.com auf https://www.example.com, Authentifizierung und PHP-FPM-Anbindung einrichten

Apache-Konfigurationsdatei anlegen

Use MacroVirtualHostHTTPForRedirectWithAlias "80" "example" "https://example.com/" "webmaster@example.com" "example.com" "www.example.com"
Use MacroVirtualHostHTTPSForRedirect "443" "example" "https://www.example.com/" "webmaster@example.com" "example.com" "/etc/letsencrypt/live/example.com/fullchain.pem" "/etc/letsencrypt/live/example.com/privkey.pem"
Use MacroVirtualHostHTTPSWithAuthAndFPM "443" "/srv/www/example" "example" "webmaster@example.com" "www.example.com" "/etc/letsencrypt/live/www.example.com/fullchain.pem" "/etc/letsencrypt/live/www.example.com/privkey.pem" "/etc/apache2/.htpasswd" "example"
UndefMacro MacroVirtualHostHTTPForRedirectWithAlias
UndefMacro MacroVirtualHostHTTPSForRedirect
UndefMacro MacroVirtualHostHTTPSWithAuthAndFPM

Virtuellen Host aktivieren

a2ensite example

Konfiguration testen und Apache neuladen

apache2ctl configtest
systemctl reload apache2
#systemctl status apache2

Quellen

https://httpd.apache.org/
https://httpd.apache.org/docs/2.4/mod/mod_macro.html
https://serverfault.com/questions/717481/how-can-i-fix-recurring-php-503-errors-on-my-apache-mod-proxy-fcgi-php-fpm-serve
https://wiki.apache.org/httpd/PHP-FPM

Gobale Verzeichnisse mit bindfs – Kurzanleitung

Veröffentlichung 7. September 2018 @ 15:31
Letzte Änderung 10. September 2018 @ 21:01

Übersicht

  • Gemeinsame Verzeichnisse für (lokale) Backups und Websites
  • Verzeichniszugriff für weiteren Benutzer über bindfs-Einhängepunkte
  • Unabhängig voneinander einstellbare Benutzer und Gruppen in Originalverzeichnis und Einhängepunkt

Voraussetzungen

Ubuntu-Server

  • Betriebsystem Ubuntu Server 16.04.05 LTS #lsb_release -a
  • Einhängepunkte /home/ubuntuuser/mnt/srv/backup und /home/ubuntuuser/mnt/srv/www mit Benutzer ubuntuuser
  • Globale Verzeichnisse /srv/backup mit Benutzer root und /srv/www mit Benutzer www-data
  • Konfiguration /etc/fstab
  • Software bindfs 1.12.6 #bindfs –version
  • Software fusermount 2.9.4 #fusermount -V

Globale Verzeichnisse anlegen und Zugriffsrechte setzen

mkdir /srv/{backup,www}
chown root:root /srv/backup
chown www-data:www-data /srv/www
chmod 0700 /srv/www

Backup-Verzeichnis von Sicherung mit tar ausschließen

echo 'Signature: 8a477f597d28d172789f06886806bc55' > /srv/backup/CACHEDIR.TAG
chmod 0400 /srv/backup/CACHEDIR.TAG

bindfs installieren

apt install bindfs

Globale Verzeichnisse dauerhaft in Benutzerverzeichnis ubuntuuser einbinden

Einhängepunkte für Benutzer ubuntuuser erstellen und Zugriffsrechte setzen

mkdir --mode=0700 --parents /home/ubuntuuser/mnt/srv/{backup,www}
chown --recursive ubuntuuser:ubuntuuser /home/ubuntuuser/mnt

Konfigurationsdatei für einzubindende Verzeichnisse ergänzen

...
#Globale Verzeichnisse in Benutzerverzeichnis ubuntuuser einbinden: 
/srv/backup /home/ubuntuuser/mnt/srv/backup fuse.bindfs chgrp-ignore,chown-ignore,create-for-group=root,create-for-user=root,force-group=ubuntuuser,force-user=ubuntuuser 0 0
/srv/www /home/ubuntuuser/mnt/srv/www fuse.bindfs chgrp-ignore,chown-ignore,create-for-group=www-data,create-for-user=www-data,force-group=ubuntuuser,force-user=ubuntuuser 0 0

[Optional] Globale Verzeichnisse temporär in Benutzerverzeichnis ubuntuuser einbinden

Einhängepunkte für Benutzer ubuntuuser erstellen und Zugriffsrechte setzen

mkdir --mode=0700 --parents /home/ubuntuuser/mnt/srv/{backup,www}
chown --recursive ubuntuuser:ubuntuuser /home/ubuntuuser/mnt

Verzeichnisse mit bindfs einbinden

bindfs --chgrp-ignore --chown-ignore --create-for-group=root --create-for-user=root --force-group=ubuntuuser --force-user=ubuntuuser /srv/backup /home/ubuntuuser/mnt/srv/backup
bindfs --chgrp-ignore --chown-ignore --create-for-group=www-data --create-for-user=www-data --force-group=ubuntuuser --force-user=ubuntuuser /srv/www /home/ubuntuuser/mnt/srv/www

[Optional] Globale Verzeichnisse aus Benutzerverzeichnis ubuntuuser aushängen und Einhängepunkte löschen

Verzeichnisse mit fusermount aushängen

fusermount -u /home/ubuntuuser/mnt/srv/backup
fusermount -u /home/ubuntuuser/mnt/srv/www

Einhängepunkte löschen

rmdir /home/ubuntuuser/mnt/srv/{backup,www}

Quellen

http://manpages.ubuntu.com/manpages/xenial/man1/bindfs.1.html
http://manpages.ubuntu.com/manpages/xenial/man1/fusermount.1.html
http://manpages.ubuntu.com/manpages/xenial/man5/fstab.5.html
http://www.bford.info/cachedir/
http://www.pathname.com/fhs/pub/fhs-2.3.html

Samba Master-Browser – Kurzanleitung

Veröffentlichung 4. September 2018 @ 8:25
Letzte Änderung 4. September 2018 @ 22:53

Übersicht

  • Samba-Server als lokaler Master-Browser für (Windows-)Arbeitsgruppe

Voraussetzungen

Samba-Server

  • Arbeitsgruppe EXAMPLE
  • Betriebsystem Ubuntu Server 16.04.05 LTS #lsb_release -a
  • IP-Adresse x.x.x.x
  • Konfiguration /etc/samba/smb.conf
  • Log /var/log/samba/log.*
  • NetBIOS-Name SAMBASERVER
  • Port NetBIOS Datagram Service 138 #netstat –listening –numeric –program –udp | grep nmbd
  • Port NetBIOS Name Service 137 #netstat –listening –numeric –program –udp | grep nmbd
  • Port NetBIOS Session Service 139 #netstat –listening –numeric –program –tcp | grep smbd
  • Port SMB over TCP 445 #netstat –listening –numeric –program –tcp | grep smbd
  • Software Samba 4.3.11 #samba –version
  • SysVinit-Skripte /etc/init.d/nmbd, /etc/init.d/smbd

Samba-Server installieren

apt install samba

SAMBASERVER als lokalen Master-Browser für Arbeitsgruppe EXAMPLE konfigurieren

Konfigurationsdatei ändern / ergänzen

...
[global]
...
###Server
#Arbeitsgruppe ändern:
#workgroup = WORKGROUP
workgroup = EXAMPLE
...
###Server
#NetBIOS-Name:
netbios name = SAMBASERVER
#Samba-Server als Master-Browser für Arbeitsgruppe EXAMPLE anbieten, Defaultwert yes:
local master = yes
#Priorität für Master-Browser-Wahl auf Höchstwert 255 festlegen:   
os level = 255
#Master-Browser-Wahl beim Start von nmbd durchführen:
preferred master = yes
...
#testparm 'WARNING: The "syslog" option is deprecated':
#syslog = 0
...

Konfigurationsdatei überprüfen

testparm

Samba NetBIOS Nameserver nmbd neustarten und Status abfragen

systemctl restart nmbd
systemctl status nmbd

Samba SMB/CIFS Daemon smbd neuladen und Status abfragen

systemctl reload smbd
systemctl status smbd

Kontrollieren, ob SAMBASERVER Master-Browser ist

grep 'local master browser' /var/log/samba/log.nmbd
  Samba name server SAMBASERVER is now a local master browser for workgroup EXAMPLE on subnet x.x.x.x

[Optional] Unter Windows kontrollieren, ob SAMBASERVER Master-Browser ist

nbtstat -a SAMBASERVER
  ...
  ...__MSBROWSE__...
  ...

Quellen

http://manpages.ubuntu.com/manpages/xenial/man1/testparm.1.html
http://manpages.ubuntu.com/manpages/xenial/man5/smb.conf.5.html
http://manpages.ubuntu.com/manpages/xenial/man8/nmbd.8.html
http://manpages.ubuntu.com/manpages/xenial/man8/smbd.8.html
https://wiki.samba.org/

Samba Client – Kurzanleitung

Veröffentlichung 3. September 2018 @ 21:33
Letzte Änderung 24. September 2018 @ 12:32

Übersicht

  • Netzwerkprotokoll Server Message Block SMB für Zugriff von Unix-Systemen auf Windows-Systeme
  • Einbindung von Windows-Freigaben mit Common Internet File System CIFS
  • Einsatz von SMB / CIFS nur in lokalen Netzwerken sinnvoll

Voraussetzungen

Samba-Client

  • Benutzerkonto sambauser
  • Betriebsystem Ubuntu Server 16.04.05 LTS #lsb_release -a
  • Einhängepunkt /media/windows/share
  • Konfiguration /etc/fstab, /etc/samba/smb.conf, /home/sambauser/.samba-credentials-windows-share
  • Software Samba-Client 4.3.11 #smbclient –version

Windows-Server

  • Benutzerkonto windowsuser
  • Betriebsystem Windows 10
  • FQDN windows.example.local
  • Freigabe //windows.example.local/share
  • IP-Adresse x.x.x.x
  • NetBIOS-Name WINDOWS

Samba-Client und Hilfprogramme installieren

Samba-Client smbclient

apt install smbclient

Gemeinsame Dateien für Samba-Server und -Client für testparm

apt install samba-common-bin

cifs-utils zur Einbindung des virtuellen Dateisystems cifs-vfs mit mount-Option cifs

apt install cifs-utils

Samba konfigurieren und Konfigurationsdatei überprüfen

...
[global]
...
###Client
#Protokoll SMB3 für Windows ab Windows 8 / Windows Server 2012:
client max protocol = SMB3
client min protocol = SMB3
...
#testparm 'WARNING: The "syslog" option is deprecated':
#syslog = 0
...
testparm

Authentifikationsdatei für Server-Freigabe anlegen und Zugriffsrechte anpassen

username=windowsuser
password=***
chmod 0600 /home/sambauser/.samba-credentials-windows-share

Freigaben und weitere Informationen über Server WINDOWS ausgeben

smbclient --authentication-file=/home/sambauser/.samba-credentials-windows-share --list //WINDOWS

Mit Samba-Client auf Server-Freigabe zugreifen

smbclient --authentication-file=/home/sambauser/.samba-credentials-windows-share //windows.example.local/share

Server-Freigabe temporär einbinden

Einhängepunkt anlegen

mkdir --parents /media/windows/share

Freigabe mit Protokoll SMB3 einbinden

mount -o credentials=/home/sambauser/.samba-credentials-windows-share,vers=3.0 -t cifs //x.x.x.x/share /media/windows/share

[Optional] Freigabe aushängen und Einhängepunkt löschen

umount /media/windows/share
rm /media/windows/share

Server-Freigabe dauerhaft einbinden

Einhängepunkt anlegen

mkdir --parents /media/windows/share

Konfigurationsdatei für einzubindendes Verzeichnis ergänzen

...
#Server-Freigabe von windows.example.local einbinden:
//x.x.x.x/share /media/windows/share cifs /home/sambauser/.samba-credentials-windows-share,vers=3.0 0 0

Quellen

http://manpages.ubuntu.com/manpages/xenial/man1/smbclient.1.html
http://manpages.ubuntu.com/manpages/xenial/man1/testparm.1.html
http://manpages.ubuntu.com/manpages/xenial/man5/fstab.5.html
http://manpages.ubuntu.com/manpages/xenial/man5/smb.conf.5.html
http://manpages.ubuntu.com/manpages/xenial/man8/mount.cifs.8.html
http://manpages.ubuntu.com/manpages/xenial/man8/umount.8.html
https://wiki.samba.org/

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

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/