class: center, middle # Linux Web/Mail/Datenbank-Server ## TuxTage 2020 ### Installation, Konfiguration, Absicherung #### Hauke Goos-Habermann --- ### Worum geht es? ![img20r](gfx/lamp.png) - Installation und Konfiguration - **L**inux - **A**pache - **M**ariaDB - **P**HP - Mailserver: Dovecot (imap/pop3) und Postfix (SMTP) - Dodger-Tools: Skriptsammlung - Sicherheit - SSH-Server absichern - Intrusion-Prevention-Systeme: SSHGuard und fail2ban - SSL-Zertifikate: (Let's Encrypt) - Automatisierte Systemaktualisierungen: dt-cron-apt - Zugriffsrechte: Mailkonten und WWW - Beispielseite bzw. Anwendung - Informationen über PHP und Module: phpinfo.php - Webbasierte Datenbankadministration: phpMyAdmin --- ### Zum Ablauf - Ein paar Folien - Demonstration auf einer Debian-10-VM - Viel Automatisierung - Erklärung z.B. an dahinterliegenden BASH-Skripten - Fragen in YT-Chat, Twitter oder Mastodon schreiben --- ### Über mich / Wie kam ich zu diesem Vortrag? - Dienstleistungen zu Linux und Freier Software - Entwickler des Softwareverteilungssystems m23 (Installation und Management von Linux-Systemen innerhalb von Netzwerken) - Softwareentwicklung (PHP, BASH, C/C++, JS, Python und was sonst so gebraucht wird...) - Administration - Schulungen, Support und Beratung - quasi alles, was mit Linux zu tun hat - Ich installiere, konfiguriere und warte Webserver: Als Dienstleistung (
https://goos-habermann.de
) und ehrenamtlich (
https://kieler-linuxtage.de
). - Umstellung von mehreren Servern auf Debian 10 - Sichtung der vorhandenen Konfiguration und Daten der alten Server - Gestartet mit Grundinstallation von Debian 10 auf den neuen Servern - Weitestgehende Automation nach nachfolgenden Konfiguration - Dokumentation als Teil der Skripte - Wiederherstellung von Daten(banken) --- ### "Verkabelung" ![img80](gfx/FB-Ports-Schema.png) ![img20r](gfx/info.png) Die HTTP(s)- und SSH-Ports der virtuellen Maschine sind durch den Router über die öffentliche IP im Internet verfügbar. FRITZ!Box: Internet → Freigaben → Portfreigaben Per DHCP intern vergebene IP: 192.168.178.24 --- ### Debian 10 installieren ![img50l](gfx/Debian-Installer.png) ####VirtualBox * Neue VM anlegen * Linux/Debian 64 * 25 GB Festplatte * Netzwerkbrücke MAC: 08002737D716 * Keine Soundkarte * ISO einlegen * VM starten ####Debian-Installer * Benutzer: test * OpenSSH + Standardwerkzeuge mitinstallieren --- ### 1. Anmelden Auf VM per SSH einloggen: ```bash ssh -o ServerAliveInterval=15 test@ttdemo.pc-kiel.de ``` **Alles**, was nun kommt, wird auf der VM ausgeführt (und nicht im lokalen Terminal) ![img20r](gfx/info.png) Beim Herstellen einer SSH-Verbindung mit einem *noch unbekannten Server* wird der SSH-Client fragen, ob man dem Zielsystem und dessen Hash-Summe vertrauen möchte. Diese werden auf dem **Zielsystem** folgendermaßen berechnet: ```bash ls /etc/ssh/*.pub | xargs -n1 ssh-keygen -lf ``` Um sicherzugehen sollten die Hashes vom Serverbetreiber auf einem *sicheren Kanal* an den Nutzer gesendet werden. --- ### SSH-Schlüssel kopieren Öffentliche(n) SSH-Schlüssel vom *Desktoprechner* ausgeben ```bash cat ~/.ssh/id_*.pub ``` In der VM: Verzeichnis ~/.ssh mit korrekten Zugriffsrechten anlegen lassen, Befehl abbrechen mit Strg+C ```bash ssh localhost ``` Schlüssel eintragen (Speichern mit Strg + X und bestätigen) ```bash nano ~/.ssh/authorized_keys ``` Abmelden und neu anmelden ```bash exit ssh -o ServerAliveInterval=15 test@ttdemo.pc-kiel.de ``` Nun sollte keine Paßwortabfrage mehr kommen. --- ### Los geht's root werden, Skriptbibliothek herunterladen und laden: ```bash su - wget https://goos-habermann.de/commonInstall.inc -O /tmp/commonInstall.inc . /tmp/commonInstall.inc ``` Webadresse (FQDN), unter dem die VM erreichbar ist: ```bash export DT_INST_hostname='ttdemo.pc-kiel.de' ``` Liste mit Domains, für die der Mailserver zuständig ist (mehrere mit Komma und Leerzeichen trennen): ```bash export DT_INST_domain='ttdemo.pc-kiel.de' ``` Admin-eMail-Adresse und Zeitpunkt (hier 4 Uhr morgens) für automatische Updates festlegen: ```bash CI_setAdminMailAndDtCronAptRuntime "ttdemo@pc-kiel.de" 4 ``` .cls[.copyright[FQDN:
https://de.wikipedia.org/wiki/Domain_(Internet)#Fully_Qualified_Domain_Name_(FQDN)
]] --- ### Dodger-Tools ![img33l](gfx/Dodger-Tools-logo.png) Über die Jahre stetig erweiterte Sammlung von BASH-Werkzeugen und Debian-Paketen für Linux/Debian-Nutzer und -Administratoren Enthalten sind unter anderem: - *"Intelligentes"* Editieren von Dateien - Automatisiertes Aktualisieren von Servern - Werkzeuge für das Erstellen von Backups über das Netzwerk - Monitoring - Erstellung von Debian-Paketen und -Paketquellen - Setzen von IP-Adressen - Generierung von Vorschaubildern - etc. .cls[Mehr Informationen:
http://dodger-tools.sf.net
] Dodger-Tools installieren: ```bash CI_inst_dodgerTools ``` --- ### Installation und Konfiguration Grundlegende Server-Pakete (z.B. dt-cron-apt, rkhunter, fail2ban) installieren: ```bash CI_installBasicServerDebs ``` SSH-Server absichern: SSHGuard + Zugriff nur über SSH-Schlüssel: ```bash CI_secureSSHd ``` Dovecot (imap/pop3) und Postfix (SMTP) installieren: ```bash CI_mailServerInstall ``` Apache und PHP installieren: ```bash CI_installApachePHP ``` --- ### Webseite testen Im Browser aufrufen (wichtig noch kein HTTP**S**): http://ttdemo.pc-kiel.de/ ![img80](gfx/Apache2_Debian_Default_Page_It_works.png) --- ### MariaDB installieren MariaDB-Server installieren und starten: ```bash CI_installMariaDB ``` Kontrolle mit: ```bash mariadb ``` ![img80](gfx/mariadb-client.png) --- ### PHP-Infoseite Datei für die PHP-Infoseite anlegen: ```bash echo '' > /var/www/html/info.php ``` Im Browser abrufen: http://ttdemo.pc-kiel.de/info.php ![img80](gfx/phpinfo.png) --- ### PHP-Infoseite löschen ![img20r](gfx/achtung.png) Aus Sicherheitsgründen sollte die Seite wieder entfernt werden: ```bash rm /var/www/html/info.php ``` --- ### phpMyAdmin phpMyAdmin herunterladen und entpacken: ```bash cd /var/www wget https://files.phpmyadmin.net/phpMyAdmin/5.0.4/phpMyAdmin-5.0.4-all-languages.zip unzip phpMyAdmin-5.0.4-all-languages.zip rm phpMyAdmin-5.0.4-all-languages.zip mv phpMyAdmin-5.0.4-all-languages phpMyAdmin ``` Zugriffsrechte für phpMyAdmin auf Apache-Benutzer und -Gruppe setzen: ```bash chown www-data:www-data -R phpMyAdmin/ ``` --- ### phpMyAdmin: Apache-Seitenkonfiguration Konfigurationsdatei schreiben: ```bash echo "
DocumentRoot "/var/www/phpMyAdmin" ServerName $DT_INST_hostname ServerSignature Off
AllowOverride All
" > /etc/apache2/sites-available/phpmyadmin.conf ``` Standardseite deaktivieren und phpMyAdmin-Seite aktivieren: ```bash a2ensite phpmyadmin a2dissite 000-default systemctl reload apache2 ``` --- ### phpMyAdmin: Seite aufrufen Im Browser abrufen: http://ttdemo.pc-kiel.de/ ![img33l](gfx/phpMyAdmin.png) --- ### ~~Let's Encrypt~~ Einrichten und SSL-Zertifikat holen: ```bash CI_installLetsEncrypt ``` ![img80](gfx/letsencrypt.png) Hier die Option *2: Redirect - Make all requests redirect to secure HTTPS access.* wählen. Im Browser abrufen: http://ttdemo.pc-kiel.de/ Leitet nun automatisch weiter auf: https://ttdemo.pc-kiel.de/ --- ### Warum geht das nicht (mehr)? ![img20r](gfx/achtung.png) * Mein Provider hat auf **Carrier-grade NAT** umgestellt, um die wenigen verfügbaren öffentlichen IPv4-Adressen besser auszunutzen. * Mehrere Kunden teilen sich dieselbe öffentliche IP-Adresse. * Über eine **private IP-Adresse** aus dem 100.xxx.yyy.zzz-Bereich ist meine VM weiterhin komplett verfügbar, aber nicht über meine (geteilte) **öffentlichen IPv4-Adresse**. * **certbot** akzeptiert aber keine **private IP-Adresse**. .cls[.copyright[Carrier-grade NAT:
https://de.wikipedia.org/wiki/Carrier-grade_NAT
]] --- ### Zugriffsschutz für WWW-Verzeichnisse Neuen Benutzer *db* in **neuer** Nutzerdatenbank anlegen: ```bash htpasswd -c /etc/phpmyadmin.htpasswd db ``` Zusätzlichen Benutzer *db2* in **vorhandener** Nutzerdatenbank hinzufügen: ![img20r](gfx/info.png) ```bash htpasswd /etc/phpmyadmin.htpasswd db2 ``` Benutzer *db* aus Nutzerdatenbank entfernen: ```bash htpasswd -D /etc/phpmyadmin.htpasswd db ``` Zugriff auf */var/www/phpMyAdmin* schützen: ```bash echo 'AuthUserFile /etc/phpmyadmin.htpasswd AuthName GeschlosseneGesellschaft AuthType Basic
require valid-user
' > /var/www/phpMyAdmin/.htaccess ``` --- ### Zugriffsschutz testen Im Browser abrufen: http://ttdemo.pc-kiel.de/ ![img80](gfx/htaccess.png) --- ### MariaDB-Administrator anlegen MariaDB-Client starten: ```bash mariadb ``` Neuen Benutzer *admin* mit allen Rechten und Paßwort *ganzGeheimesPassw0rt* anlegen: ```sql CREATE USER 'admin'@'localhost' IDENTIFIED BY 'ganzGeheimesPassw0rt'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; QUIT; ``` --- ### phpMyAdmin: Konfiguration MariaDB-Server-Zugriffsinformationen in Konfigurationsdatei hinterlegen: ```bash echo ' /var/www/phpMyAdmin/config.inc.php ``` --- ### phpMyAdmin: Konfiguration testen Im Browser abrufen: http://ttdemo.pc-kiel.de/ ![img80](gfx/phpMyAdmin2.png) --- ### Mailserver einrichten und Konten anlegen ~~Selbstsigniertes Dovecot-SSL-Zertifikat gegen Let's Encrypt Zertifikat austauschen:~~ ```bash CI_replaceDovecotSSLKeysWithLetsEncrypt "/etc/letsencrypt/live/$DT_INST_hostname" ``` Zwei Mailkonten für die Nutzer *tux* und *tux2* einrichten: ```bash adduser --shell /bin/false tux; adduser --shell /bin/false tux2 ``` ![img20r](gfx/achtung.png) **Nach jedem Anlegen** eines neuen Mailkontos muß die Datenbank für postfix aktualisiert werden, da ansonsten die Mails **nicht zugestellt** werden: ```bash newaliases systemctl restart postfix ``` Mailkonto *tux* löschen: ```bash deluser --remove-home tux ``` --- ### Mailprogramm einrichten Die Mailkonten (eMail: tux@ttdemo.pc-kiel.de / Serveradresse: ttdemo.pc-kiel.de) werden im Mailprogramm (hier beispielhaft in *Claws Mail*) eingerichtet: ![img50](gfx/claws-mail2.png) ![img50](gfx/claws-mail3.png) --- class: center, middle # Danke für die Aufmerksamkeit ### Informationen: https://goos-habermann.de ###Veranstaltungshinweis6.12. CryptoAdvent Online * WWW: https://kilux.de/programm/CA20 * Wie sicher ist WhatsApp? Über Verschlüsselung und Messenger * Ein bisschen OpenSSL * Crypto Wars: Die Bürger sind gefordert - aber überfordert