Let’s Encrypt Certbot für Apache in Debian 10 und 11 installieren
Let’s Encrypt ist eine Zertifizierungsstelle (CA), die eine einfache Möglichkeit bietet, kostenlose TLS/SSL-Zertifikate zu beziehen und zu installieren. Hier installieren wir Certbot für Apache 2 in Debian 10 und 11, wodurch verschlüsseltes HTTPS auf Webservern ermöglicht wird. Es vereinfacht den Prozess, indem es einen Software-Client, Certbot, bereitstellt, der versucht, die meisten der erforderlichen Schritte zu automatisieren. Let’s Encrypt verwendet das ACME-Protokoll (ACMEv2), um den Domainnamen zu überprüfen und das Zertifikat zu steuern und auszustellen. Derzeit ist der gesamte Prozess zum Erhalten und Installieren eines Zertifikats sowohl auf Apache als auch auf Nginx vollständig automatisiert.
Tutorial Let’s Encrypt Certbot installieren
In diesem Tutorial werden wir den Let’s Encrypt Certbot installieren, um ein kostenloses SSL-Zertifikat für Apache unter Debian 10 und 11 zu erhalten und um Zertifikate so einzurichten, dass sie automatisch installiert werden.
Voraussetzungen
Ein Debian 10 Server, ein Nicht-Root Benutzer mit sudo Berechtigungen ist angelegt und eine Firewall (ufw oder firewalld) ist eingerichtet.
Ein vollständig registrierter Domainname, zum Beispiel unblog.ch.
Beide der folgenden DNS-Einträge sind für den Server eingerichtet.
Ein A Record für meine_domain der auf die öffentliche IP-Adresse des Servers verweist.
Ein A Record für www.meine_domain der auf die öffentliche IP-Adresse des Servers verweist.
Apache ist installiert, hierzu kann die Anleitung LAMP Stack auf Debian Installieren befolgt werden. Stelle sicher, dass eine virtuelle Hostdatei für die Domain eingerichtet ist. Dieses Tutorial verwendet als Beispiel /etc/apache2/sites-available/meine_domain.conf
Hinweis : Derzeit ist Certbot standardmäßig nicht in den Debian-Software-Repositorys verfügbar. Um Certbot als Snap auf Debian zu installieren, muss zuerst snapd auf dem Server installiert werden. snapd ist ein Daemon, der zum installieren und Verwalten von Snaps erforderlich ist.
Snap ist ein Softwareverteilungssystem und eine Paketverwaltung für Linux, das bzw. die distributionsübergreifend arbeitet. Das von Canonical entwickelte System unterstützt transaktionale Updates und Rollbacks. Es wurde von Canonical für Ubuntu entwickelt und ist mittlerweile auch für andere Linux-Distributionen verfügbar.
Certbot Installation auf Debian 10
Führe die folgenden Anweisungen in der Befehlszeile auf dem Debian Server aus, um die neueste Version von snapd zu installieren.
$ sudo snap install core; sudo snap refresh core
Führe diesen Befehl in der Befehlszeile aus, um Certbot zu installieren.
$ sudo snap install --classic certbot
Die folgende Anweisung in der Befehlszeile ausführen, um sicherzustellen, dass der Befehl certbot ausgeführt werden kann.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Dieser Befehl um ein Zertifikat abzurufen und um Certbot die Apache-Konfiguration automatisch bearbeiten zu lassen, indem der HTTPS-Zugriff in einem einzigen Schritt aktiviert wird.
$ sudo certbot --apache
Wer die Änderungen an der Apache-Konfiguration selber vornehmen möchte, kann diesen Befehl ausführen.
$ sudo certbot certonly --apache
Die automatische Verlängerung derZertifikate testen, geht mit dem folgenden Befehl.
$ sudo certbot renew --dry-run
Um das ganze zu überprüfen, besuche https://meine_domain/ im Browser deiner Wahl und schaue in der URL-Zeile nach dem Schlosssymbol.
Certbot Zertifikat in Apache Virtual Host
Certbot muss den richtigen virtuellen Host in der Apache-Konfiguration finden, damit SSL automatisch konfiguriert werden kann. Dies geschieht insbesondere, indem nach der ServerName Anweisung gesucht wird, die der Domäne entspricht, für die ein Zertifikat angefordert werden soll.
Öffne zur Überprüfung die virtuelle Hostdatei für die Domain mit vim oder nano Texteditor.
$ vi /etc/apache2/sites-available/meine_domain.conf
Suche in der Zeile nach ServerName. Es sollte hier der Domainname stehen meine_domain.
ServerName meine_domain
Falls noch nicht geschehen, aktualisiere die ServerName Anweisung so, dass sie auf den Domainname verweist.
Apache configtest
Überprüfe als Nächstes die Syntax der Konfigurationsänderungen.
$ sudo apache2ctl configtest
Zertifikat mit Certbot installieren
Certbot bietet eine Vielzahl von Möglichkeiten, SSL-Zertifikate über Plugins zu erhalten. Das Apache-Plugin kümmert sich um die Neukonfiguration von Apache und lädt die Konfiguration bei Bedarf neu. Folgender Befehl verwendet dieses Plugin.
Es wird certbot mit dem --apache Plugin ausgeführt und verwendet -d, um die Domain Namen anzugeben, für die das Zertifikat gültig sein soll.
Let’s Encrypt Nutzungsbedingungen
Wenn man Certbot zum ersten Mal startet, werd man aufgefordert, eine E-Mail-Adresse einzugeben und den Nutzungsbedingungen zuzustimmen. Darüber hinaus wird man gefragt, ob man bereit ist, die E-Mail-Adresse an die Electronic Frontier Foundation weiterzugeben, eine gemeinnützige Organisation, die sich für digitale Rechte einsetzt und auch Certbot herstellt. Bestätige hier mit Y für die E-Mail-Adresse oder N um abzulehnen.
Certbot Erneuerungsprozess testen
Um den Erneuerungsprozess zu testen gibt es folgender Probelauf.
$ sudo certbot renew --dry-run
Fazit
In diesem Tutorial haben wir Certbot, den Let’s Encrypt-Client für Apache in Debian installiert, SSL-Zertifikate für die Domain heruntergeladen, Apache für die Verwendung dieser Zertifikate konfiguriert und die automatische Zertifikatserneuerung eingerichtet.
LAMP ist eine auf Open-Source basierte Kombination aus Software, die als LAMP Stack zusammen installiert wird, damit ein Debian Server dynamische Webseiten und Web-Apps hosten kann. LAMP ist das Akronym für Linux Apache MySQL PHP, dass für Linux mit dem Apache Webserver, der MySQL-Datenbank und PHP für die dynamische Verarbeitung von Webseiten steht.
In diesem Tutorial wird der LAMP Stack auf einem Debian 10 (buster) als Web Server komplett mit Apache/2.4, MariaDB 10, PHP 7.4 und vsftpd sowie Fail2ban und allen erforderlichen Pakete installiert und konfiguriert. Der geschätzte Zeitaufwand der Installation beträgt etwa 10 Minuten, am Ende steht ein Webserver für Content-Management-Systeme bereit. Neu erstellte Benutzer für den FTP Zugang werden automatisch zu chroot der eigenen DocumentRoot.
LAMP Stack Debian Server Installation
Wir sind auf einem Debian 10 Linux als root eingelggt, wie immer wird erst Update durchgeführt, bevor weitere Pakete installiert werden.
apt update
Erst werden benötigte Pakte als voraussetzung zur weiteren Installation bereitgestellt.
apt install ca-certificates apt-transport-https lsb-release gnupg curl vim unzip -y
Das Debian Repository enthält nicht die neusten PHP Versionen, daher verwenden wir das Sury Repository.
Soll auf dem Debian Server mit LAMP Stack eine neuere PHP Version installiert werden, geht es hier zum PHP Upgrade Beitrag.
Als nächstes wird der MariaDB-Server installiert.
apt install mariadb-server mariadb-client -y
Nun geben wir den Befehl ein, um die Konfiguration des MariaDB-Servers abzuschließen.
mysql_secure_installation
Bei der ersten Abfrage des aktuellen Passworts muss man nichts eingeben, sondern einfach die Enter-Taste drücken. Bestätige die nächste Frage bzgl. der Änderung des Root-Passworts mit Enter. Nun wird ein Passwort für den Root-Benutzer des MariaDB-Servers vergeben (nicht der Linux root User). Während der Eingabe erscheinen keine Zeichen, das ist normal. Bestätige alle folgenden Fragen (Löschung des anonymen Benutzers, Verbieten des externen Root-Logins aus Sicherheitsgründen, Entfernen der Testdatenbank und Aktualisieren der Rechte) ebenfalls mit Enter. Danach ist der MariaDB-Server fertig installiert und konfiguriert.
phpMyAdmin installieren
Jetzt wechseln wir mit dem Befehl cd /usr/share das Verzeichnis, in diesem phpMyAdmin installiert wird.
Um phpMyAdmin herunterzuladen, führen wir nun wget aus.
Es ist aus Sicherheitsgründen die Passwort-Authentifizierung beim MariaDB-Server nicht mehr empfohlen, um sich direkt als Root-Nutzer anzumelden (z.B. über phpMyAdmin).
Ein zusätzlichen Benutzer mit allen Rechten anlegen, dazu melden wir uns mit dem MySQL-Client am MariaDB-Server an.
mysql -u root
Wenn bis hier alles klappte, bist Du jetzt im MySQL (MariaDB) Prompt.
MariaDB [(none)]>
Und führen jetzt die folgenden SQL Befehle aus um den MariaDB-Benutzer zu erstellen und ihm die Rechte zu erteilen.
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Ersetze hierbei „username“ und „password“ durch den gewünschten Benutzernamen und ein Passwort. Beende die MariaDB-Konsole abschließend mit exit.
MariaDB [(none)]> exit
Jetzt kann man sich mit dem neu erstellten Benutzer am MariaDB-Server anmelden (z.B. auch über phpMyAdmin).
http://192.168.2.12/phpmyadmin
Fertig – der Apache2-Webserver inkl. PHP 7.4, MariaDB-Server und phpMyAdmin ist nun einsatzbereit. Das phpMyAdmin-WebUI wird erreichet, indem man nach der IP-Adresse oder des FQDN im Browser /phpmyadmin anhängt.
Hinweis. Bei der ersten Anmeldung in phpMyAdmin wird man eine Fehlermeldung am unteren Seitenrand sehen.
Ab sofort muss ein geheimes Passwort zur Verschlüsselung in der Konfigurationsdatei gesetzt werden (blowfish_secret).
Abhilfe schaft eine Passphrase die in der Datei config.inc.php bei $cfg['blowfish_secret'] eingefügt wird. Hier ein Beispiel:
vi /usr/share/phpmyadmin/config.inc.php
$cfg['blowfish_secret'] = 'ttTo4Zhy6zEOdUatH6vcOQFbXpnnM/WmOZpO1bM9BH2R7i4WZJVpdBntcsvSDVlM'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
Hinweis: Wenn man zum editieren vim nutzt, bemerkt man das nach eingabe zum insert mode beim text einfügen mit der rechten Maustaste sich der blockwise Visual mode aktiviert — (insert) VISUAL — das sich als unerwünscht zeigt, das kleine Malheur kann aber schnell behoben werden, indem man die Maussteuerung für vim deaktiviert, erstelle hierzu die Datei mit echo "set mouse-=a" > ~/.vimrc
Tipp! Eine Passphrase erzeugen ist einfach wie folgende Befehlszeile zeigt. Beispiel mit 48 Zeichen lange zufällige Zeichenkette.
openssl rand -base64 48
ttTo4Zhy6zEOdUatH6vcOQFbXpnnM/WmOZpO1bM9BH2R7i4WZJVpdBntcsvSDVlM
# oder andere 48 Zeichen
date +%s | sha256sum | base64 | head -c 48 ; echo
MjhhMGUwMjYyYjljNWI2MjFiMGZmNmQ5MjdiYjY2MGE2YWNl
Debian Web Server absichern und härten
Als erstes wird die Kernel Firewall für den Debian Server mit dem LAMP Stack Webserver konfiguriert, es sollen nur die erforderlichen Services eingehend erlaubt werden. Bei Debian ist standardmässig nach der Installation die ufw (Uncomplicated Firewall) aktiviert. Die für den Webserver benötigten Ports werden wie folgt geöffnet.
Hinweis: nach jeder änderung muss firewalld die änderung aktivieren.
firewall-cmd --reload
FTP-Server Installation mit vsftpd
vsftpd ist ein FTP-Server für das alte File Transfer Protocol. Als Akronym steht sein Name für Very Secure File Transfer Protocol Daemon. Ob gleich OpenSSH mit sFTP bei jedem Linux und FreeBSD zum Standard gehört, ist FTP noch immer weit verbreitet.
Der vsftpd Daemon wird wie folgt installiert.
apt install vsftpd -y
Die vsftpd Konfigurationsdatei für Änderungen editieren.
vi /etc/vsftpd.conf
Wir deaktivieren die anonyme Anmeldung und erlauben lokalen Benutzern zu schreiben.
chroot steht für change root und ist eine Funktion für Unixoide Systeme, um das Rootverzeichnis zu ändern. chroot wirkt sich nur auf den aktuellen Prozess und seine Child-Prozesse aus, es ist ein einfacher Jail-Mechanismus in dem das FTP-Dienstprogramm verhindert das Benutzer auf Dateien ausserhalb seines Verzeichnisses zugreifen können. chroot bietet auch eine einfache Möglichkeit, nicht vertrauenswürdige Daten in eine Sandbox zu versetzen. Die chroot Einstellungen für VSFTPD Benutzer findet man in der Datei vsftpd.conf bei Zeile chroot_local_user und ändere dort auf YES, so auch bei chroot_list_enable.
chroot_local_user=YES
chroot_list_enable=YES
Alle Benutzer werden chroot zugeteilt, bis auf einige die befreit sind, dazu wird die Datei /etc/vsftpd.chroot_list erstellt, diese Benutzer enthält, die von chroot ausgeschlossen werden.
Erstelle eine Datei vsftpd.userlist und füge Benutzer hinzu diese abgeleht werden sollen. Abgelehnt werden sollten die Service Accounts, da diese gerne für Angriffe genutzt werden. Ein Benutzer pro Zeile hinzufügen, Beispiel: vsftpd.userlist
root
bin
daemon
sys
sync
man
backup
admin
sshd
lp
sync
proxy
list
irc
shutdown
halt
mail
news
uucp
operator
games
nobody
postfix
www-data
ftp
mysql
Den vsftpd Daemon starten.
systemctl start vsftpd
Schutz gegen DoS Angriffe mit Fail2ban
Das in Python geschriebene Tool fail2ban verfolgt das Ziel, Serverdienste gegen DoS Angriffe abzusichern. Es prüft Logdateien nach vordefinierten Mustern und sperrt bei wiederholtem fehlgeschlagenem Zugriff temporär die entsprechenden IP-Adressen. Damit wird der Debian Webserver auf LAMP Stack vor Angriffe geschützt.
fail2ban wird auf Debian wie folgt installiert und konfiguriert.
apt install fail2ban -y
Die Konfiguration von Fail2ban für ein Webserver mit Jail Filter für Zugriff auf den SSH und FTP Service, um Brute-Force Attacken zu blockieren.
Nach dem die Konfigurationsdatei jail.conf kopiert ist, kann die Datei jail.local in den Editor geladen werden, alle Einstellungen hier übersteuern den Wert in jail.conf.
vi /etc/fail2ban/jail.local
Hier können Einstellungen angepasst werden und Filter für Services aktiviert oder deaktiviert werden. Der DEFAULT erlaubt eine globale Definition der Optionen. Die Optionen können anschließend in jedem Jail außer Kraft gesetzt werden.
bantime definiert die dauer der blockierung, hier 12 Std. (in Sekunden angegeben).
findtime definiert die dauer in der fehlgeschlagene versuche stattfinden können, hier 10 min.
maxretry gibt die Anzahl versuche an.
fail2ban hat Standardmässig nur den SSH Filter aktiviert, weitere Filter werden mit enabled = true aktiviert.
[sshd]
enabled = true
# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
#mode = normal
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
[vsftpd]
enabled = true
# or overwrite it in jails.local to be
# logpath = %(syslog_authpriv)s
# if you want to rely on PAM failed login attempts
# vsftpd's failregex should match both of those formats
port = ftp,ftp-data,ftps,ftps-data
logpath = %(vsftpd_log)s
fail2ban Status abfragen, Status für SSH detailert ausgeben.
fail2ban-client status
fail2ban-client -vvv status sshd
Hinweis: Seit fail2ban 0.10 (IPv6-Unterstützung) wird mit actionstart die IP-Familie On-Demand ausgeführt, bei dem ersten Ban pro Jail, sodass iptables-multiport den Chain f2b-sshd nur erstellt, wenn die erste IP im sshd-Jail gesperrt wird.
Mit einem einfachen Skript lässt sich ein neuen Apache VirtualHost erstellen, für unseren Debian Webserver mit dem LAMP Stack, zusammen mit einer neuen DocumentRoot und einem eigenen Benutzer, der Dateien hochladen kann, um die Website zu erstellen.
#!/bin/bash
if [ $# -lt 2 ]; then
echo "Missinng argument!"
echo "use: addvhost [example.com] [username]"
exit 1
fi
# make directory for new docroot
mkdir -p /var/www/$1 /var/www/$1/html
# add user for new docroot
useradd -s /sbin/nologin -d /var/www/$1/html $2
# put index.html into docroot
echo -e "<html>
<head>
<title>Welcome to $1</title>
</head>
<body>
<h1>Howdy! Apache2 virtual host $1 is working!</h1>
</body>
</html>" > /var/www/$1/html/index.html
# assign owner and grant rights
chown -R $2:$2 /var/www/$1
chmod -R 755 /var/www
# create new apache virtual host config
cat <<EOF> /etc/apache2/sites-available/$1.conf
<VirtualHost *:80>
ServerAdmin webmaster@$1
ServerName $1
ServerAlias www.$1
DocumentRoot /var/www/$1/html
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
EOF
# enable the new apache virtual host
a2ensite $1
systemctl restart apache2
Die Zeilen in eine Skriptdatei als addvhost speichern und wie folgt ausführen.
Verwende das erste Argument für den Domänennamen und das zweite für den zu erstellenden Benutzernamen.
Hinweis. daran denken das der neue Benutzer noch ein Passwort benötig mit passwd [username]
Nach dem Ausführen des Skripts findet man eine neue Docroot unter /var/www sowie die zugehörige Apache Virtual Host-Konfiguration unter /etc/apache2/sites-available diese bereits aktiviert ist.
Für HTTPS Webseiten kann Certbot integriert werden, mit Let’s Encrypt SSL-Zertifikate, mehr im Beitrag hier.
Fazit
Wie in diesem Tutorial gezeigt, ist es möglich in kurzer Zeit einen kompletten Webserver auf einem Debian Server mit LAMP Stack und allen notwendigen Diensten aufzubauen. Es zeigt sich das keine grafische Benutzeroberflächen oder andere Tools zur Einrichtung und Administration erforderlich wären.
UNBLOG verwendet Cookies, um Dein Online-Erlebnis zu verbessern. Mit "ACCEPT" gibst Du Deine Zustimmung zur Nutzung dieser Website und unseren Datenschutzbestimmungen, oder wähle Cookie settings.
Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern, während Sie durch die Website navigieren. Von diesen werden die Cookies, die nach Bedarf kategorisiert werden, in Ihrem Browser gespeichert, da sie für das Funktionieren der grundlegenden Funktionen der Website wesentlich sind. Wir verwenden auch Cookies von Drittanbietern, mit denen wir analysieren und verstehen können, wie Sie diese Website nutzen. Diese Cookies werden nur mit Ihrer Zustimmung in Ihrem Browser gespeichert. Sie haben auch die Möglichkeit, diese Cookies zu deaktivieren. Das Deaktivieren einiger dieser Cookies kann sich jedoch auf Ihre Browser-Erfahrung auswirken.
Notwendige Cookies sind unbedingt erforderlich, damit die Website ordnungsgemäß funktioniert. Diese Kategorie enthält nur Cookies, die grundlegende Funktionen und Sicherheitsmerkmale der Website gewährleisten. Diese Cookies speichern keine persönlichen Informationen.
Alle Cookies, die für die Funktion der Website möglicherweise nicht besonders erforderlich sind und speziell zur Erfassung personenbezogener Daten des Benutzers über Analysen, Anzeigen und andere eingebettete Inhalte verwendet werden, werden als nicht erforderliche Cookies bezeichnet. Es ist obligatorisch, die Zustimmung des Benutzers einzuholen, bevor diese Cookies auf Ihrer Website ausgeführt werden.