Pi-Gui.de 

Erstellt mit  Cheatsheet

Einleitung

Vorbereitung

Die aktuelle PiOS Lite arm64 herunterladen und via RPi auf die SD-Card flashen.

Tipp: Mit der Tastenkombination STRG + SHIFT + x kommt man im RPi in die erweiterten Einstellungen.

Überprüfe nachdem Vorgang noch einmal, ob sich die ssh Datei im /boot Verzeichnis der SD-Karte befindet, damit die Freischaltung des ssh Dienstes direkt geschieht.

Nach erfolgreichem booten und verbinden via ssh werden standardmäßig folgende Befehle einmal ausgeführt
sudo apt update && sudo apt upgrade -y

Danach werden einmal die Einstellungen vorgenommen mit
sudo raspi-config

Unter 'System Options' sollte 'Password' ausgeführt werden um das Passwort 'raspberry' zu ändern. (ggf. noch Hostname ändern)

Unter 'Localisation Options' sollte 'Locale' (xx_XX.UTF-8 UTF-8), 'Timezone' und ggf. 'Keyboard' noch eingestellt werden.

Unter 'Advanced Options' noch 'Expand Filesystem' ausführen, um den Speicherplatz auf der SD-Karte automatisch zu konfigurieren.

Die Einstellungen beenden und das System anschließend Neustarten (reboot).

Webserver

Apache2, PHP 7.4 und MariaDB installieren

Es müssen folgende Pakete installiert werden mit
sudo apt install ca-certificates apt-transport-https lsb-release gnupg curl unzip apache2 php7.4 php7.4-cli php7.4-common php7.4-curl php7.4-gd php7.4-intl php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-readline php7.4-xml php7.4-xsl php7.4-zip php7.4-bz2 libapache2-mod-php7.4 php7.4-apcu php7.4-bcmath php7.4-gmp php7.4-imagick imagemagick mariadb-server mariadb-client -y

Über den Befehl
sudo mariadb
wird sich mit dem Datenbankserver verbunden. Mit den nächsten Zeilen wird ein neuer DB-User erstellt und das entsprechende Passwort vergeben (das Passwort muss in den Anführungszeichen stehen), eine neue Datenbank erstellt und dem User cloud Rechte für die Datenbank cloud gegeben.

create user cloud@localhost identified by "Passwort";
create database cloud;
grant all privileges on cloud.* to cloud@localhost;
exit;

Feste IPv4 für lokales Netzwerk

Dem Pi4 muss immer die gleiche IP-Adresse zugewiesen werden! In der FRITZ!Box kann dies unter HeimnetzNetzwerk bei dem jeweiligen Gerät bearbeitet werden. Dort können auch die Ports freigegeben werden, falls der Zugriff über das Internet erfolgen soll.

Portfreigabe

Bezeichnung Protokoll Port an Port
HTTP-Server TCP 80 80
HTTPS-Server TCP 443 443

OpenVPN für feste IPv4

 internet-xs.de

DS-Lite Tunnel Problem lösen mit OpenVPN

Wer einen Internetzugang über einen Kabelanbieter nutzt, kann sich eine IPv4 Adresse mieten, um auch außerhalb des lokalen Netzwerkes Zugriff zu erlangen.

Bei dem verlinkten Anbieter gibt es bereits Anleitungen hierzu, daher wird dieser Schritt übersprungen.

Domain hinzufügen

 netcup.de

Es wird ein neues Verzeichnis in /var/www/ erstellt, wo später alle Dateien der Webseite sich befinden werden.

Über den Befehl
sudo mkdir /var/www/MeineDomain.TLD
wird das Verzeichnis erstellt.

Die entsprechenden Rechte setzten durch den Befehl
sudo chown -R www-data:www-data /var/www/MeineDomain.TLD

Die Virtual Host Config wird geändert und entsprechend angepasst, über
sudo nano /etc/apache2/sites-available/MeineDomain.TLD.conf

<VirtualHost *:80>
	ServerAdmin admin@MeineDomain.TLD
	ServerName MeineDomain.TLD
	DocumentRoot /var/www/MeineDomain.TLD
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<Directory /var/www/MeineDomain.TLD/>
	AllowOverride All
</Directory>

Anschließend die Virtual Host Konfiguration in Apache2 hinterlegen über
sudo a2ensite MeineDomain.TLD

Die Konfiguration kann auch wieder deaktiviert werden, über
sudo a2dissite MeineDomain.TLD

Es muss ein DNS-Eintrag der entsprechende MeineDomain.TLD erfolgen, A-Record mit der IPv4-Adresse.

Die Konfiguration ohne Domain könnte dann wie folgt aussehen, über den Befehl
sudo nano etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
	DocumentRoot /var/www/nextcloud
	<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{HTTPS} off
	RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
	</IfModule>
</VirtualHost>
<IfModule mod_ssl.c>
	<VirtualHost *:443>
		DocumentRoot /var/www/nextcloud
		SSLEngine on
		SSLCertificateFile /var/cert/server.crt
		SSLCertificateChainFile /var/cert/server.csr
		SSLCertificateKeyFile /var/cert/server.key
	</VirtualHost>
</IfModule>

Anschließend wird Apache2 neu gestartet über
sudo systemctl restart apache2

Mit der Software certbot werden die SSL-Zertifikate beantragt und erneuert. Zudem werden die Zertifikate automatisch in Apache2 eingepflegt.

sudo apt install certbot python3-certbot-apache -y

Das Zertifikat kann automatisch beantragt und hinterlegt werden oder nur beantragt werden und selbst hinterlegt werden, hier wird die automatisierte Variante beschrieben. Über den Befehl

sudo certbot --authenticator webroot --installer apache -w /var/www/MeineDomain.TLD -d MeineDomain.TLD

Wenn der Befehl das erste Mal ausgeführt wird, wird man bei Let's Encrypt registriert. Dafür wird eine E-Mail-Adresse benötigt.

Die Lizenzbedingungen müssen akzeptiert werden. Danach wird man gefragt, ob man sich bei einer Art Newsletter der Electronic Frontier Foundation anmelden möchte. Mit Y wird die Anmeldung bestätigt, mit N abgelehnt. Dies ist nicht verpflichtend.

Die SSL-Zertifikate von Let's Encrypt haben eine Gültigkeit von 90 Tagen. Über crontab wird diese Erneuerung automatisiert. Mit dem Befehl
sudo crontab -e
wird der automatisierte Befehl erstellt bzw. bearbeitet. Dort wird dann ganz unten folgendes hinzugefügt
45 7 * * * /usr/bin/certbot renew
damit wird jeden Tag um 7:45 Uhr der Befehl certbot renew ausgeführt.

Das Zertifikat wird ohne Passwort für 365 Tage über folgende Befehle selbst erstellt
sudo mkdir /var/cert
cd /var/cert
sudo openssl genrsa -out server.key 4096
sudo openssl req -new -key server.key -out server.csr -sha256
sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

In dem Verzeichnis sollten sich drei Dateien befinden, dies kann überprüft werden mit dem Befehl
ls

USB-Speicher einhängen

 Part-UUID  fstab

Zuerst wird ein neues Verzeichnis erstellt, wo später die externe Festplatte eingehängt wird. Über den Befehl
sudo mkdir /media/USBDrive

Jetzt wird das externe Speichermedium angeschlossen. Einen Überblick der angeschlossenen Hardware bekommt man über den Befehl
lsblk
Diese könnte so aussehen

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 7,3T 0 disk
└─sda1 8:1 0 7,3T 0 part
mmcblk0 179:0 0 59,5G 0 disk
├─mmcblk0p1 179:1 0 256M 0 part /boot
└─mmcblk0p2 179:2 0 59,2G 0 part /

In diesem Beispiel ist sda bzw. sda1 die Partition mit 8 TB (7,3T) im Dateisystem btrfs. Auf die Formatierung des Speichermediums wird hier vorerst verzichtet.

sudo blkid
zeigt die PARTUUID und auch das Dateisystem. Diese ist für den nächsten Schritt von Bedeutung (PARTUUID kopieren).

Über den Befehl
sudo nano /etc/fstab
die externe Festplatte hinterlegen, damit diese bei Systemstart mit eingehängt wird. Es wird die erste Partition darauf verwendet.

PARTUUID=XXX-01		/boot			vfat	defaults		0	2
PARTUUID=XXX-02		/			ext4	defaults,noatime	0	1
PARTUUID=XXX-XXX	/media/USBDrive		btrfs 	defaults 		0	0

sudo mount -a
kann getestet werden, ob das Speichermedium eingehängt wird. Überprüft wird es mit dem bereits bekannten Befehl
lsblk

Um das externe Speichermedium zu verwenden, muss dies Apache2 mitgeteilt werden. Zuerst wird ein neues Verzeichnis erstellt und die Rechte entsprechend gesetzt
sudo mkdir /media/USBDrive/nextcloud && sudo chown -R www-data:www-data /media/USBDrive/nextcloud

sudo nano /etc/apache2/apache2.conf
wird folgendes einfach nach dem Blockabschnitt <Directory /var/www/> hinzugefügt, einfach mit STRG + w danach suchen

<Directory /media/USBDrive/nextcloud>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

Sicherheit

Backup

 borgbackup

Installieren und ein neues Verzeichnis auf dem externen Speichermedium erstellen, wo später die Backup Dateien gespeichert werden, über
sudo mkdir /media/USBDrive/backup && sudo apt install borgbackup

Zuerst wird das Backup Repository initialisiert über
sudo borg init --encryption=repokey /media/USBDrive/backup
ein Backup wird dann bspw. so erstellt
sudo borg create --stats --compression lz4 /media/USBDrive/backup::bkup1 /etc/ /home/ /root/ /var/
das Backup wird in dem Verzeichnis widerhergestellt, indem man sich aktuell befindet, über
sudo borg extract /media/USBDrive/backup::bkup1
extract durch delete ersetzten um das entsprechende Backup zu löschen.

Die Dokumentation von Borg ist sehr ausführlich beschrieben. Daher wird hier nicht weiter darauf eingegangen.

fail2ban

 fail2ban

Installieren und die Konfigurationsdatei kopieren, mit
sudo apt install fail2ban && sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Alle Änderungen werden in der
sudo nano /etc/fail2ban/jail.local
vorgenommen, damit die Änderungen bei einer Aktualisierung bestehen bleiben.

Unter [DEFAULT] findet man bantime, findtime und maxentry.

Beispiel: Bannzeit von 24 Stunden, wenn innerhalb von 1 Stunde der Login 3x fehlgeschlagen ist.

bantime = 24h
findtime = 1h
maxentry = 3

Zusätzlich sollte man direkt unter [sshd] noch enabled = true hinzufügen, auch, wenn diese standardmäßig aktiviert ist.

Dort kann auch der Port angepasst werden, falls man diesen geändert hat.

Unter dem [sshd] Eintrag kann auch direkt der Nextcloud Eintrag hinzugefügt werden.

[nextcloud]
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
logpath = /var/log/nextcloud.log

Die Logdatei wird noch erstellt und die Rechte wieder vergeben
sudo touch /var/log/nextcloud.log
sudo chown -R www-data:www-data /var/log/nextcloud.log

Zusätzlich wird mit
sudo nano /etc/fail2ban/filter.d/nextcloud.conf
ein neuer Filter erstellt mit folgendem Inhalt (Insgesamt sind es 4 Zeilen)

[Definition]
failregex = ^{"reqId":".*","remoteAddr":".*","app":"core","message":"Login failed: '.*' \(Remote IP: ''\)","level":2,"time":".*"}$
^{"reqId":".*","level":2,"time":".*","remoteAddr":".*","app":"core".*","message":"Login failed: '.*' \(Remote IP: ''\)".*}$
ignoreregex =

Damit die Änderungen wirksam werden, muss man fail2ban neu starten
sudo service fail2ban restart

sudo fail2ban-client status sshd
gibt eine Übersicht aus. Die Nextcloud Log kann nach der Installation so überprüft werden
sudo fail2ban-regex /var/log/nextcloud.log /etc/fail2ban/filter.d/nextcloud.conf

Webserver, Mailserver, FTP usw. kann darüber noch abgesichert werden. Mit
sudo fail2ban-client status
erhält man eine Übersicht, welche Dienste von fail2ban aktiv sind.

Firewall

 ufw

sudo apt-get install ufw -y
wird die Firewall installiert. Der Befehl
sudo ufw default deny
blockiert einmal alle Arten von Verbindungen. Nun wird ssh und der Webserver freigegeben. Über die Befehle
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Die Firewall wird gestartet mit
sudo ufw enable
Bei einer Änderung muss diese neu geladen werden über
sudo ufw reload
Deaktivieren kann man die Firewall wieder mit
sudo ufw disable

Andere Dienste müssen zusätzlich mit freigegeben werden.

Logs

 tail

Man sollte regelmäßig die Log-Einträge überprüfen, diese befinden sich standardmäßig in /var/log/

sudo tail -100 /var/log/fail2ban.log
zeigt die letzten 100 Einträge in der fail2ban-Logdatei. Es kann auch nano genutzt werden.

Nextcloud

installieren

 Server Releases

Nextcloud auf Webserver laden

Zuerst wechseln wir in das entsprechende Verzeichnis wo später das Nextcloud-System ausgeführt wird und laden das entsprechende Archiv herunter mit
cd /var/www
sudo wget https://download.nextcloud.com/server/releases/nextcloud-23.0.0.zip

Anschließend entpacken über
sudo unzip nextcloud-23.0.0.zip

Über den bekannten Befehl ls wird die Übersicht der Dateien und Verzeichnisse angezeigt und ggf. müssen die Daten noch verschoben werden, über
sudo mv nextcloud/* /var/www/MeineDomain.TLD

Das leere Verzeichnis und die .zip Datei wieder löschen mit
sudo rm -r nextcloud nextcloud-23.0.0.zip

Die Rechte wieder mit dem Befehl
sudo chown -R www-data:www-data /var/www/MeineDomain.TLD
setzten und die Installation im Browser abschließen.

Nextcloud im Browser einrichten

Im Browser wir nun die Domain (URL) oder die lokale IP-Adresse aufgerufen. Es wird nach einem Benutzernamen und Passwort gefragt für die Cloudverwaltung. Die Zugangsdaten für die Datenbankverbindung wären in diesem Beispiel User=cloud, Passwort=Passwort, Name=cloud und Server=localhost

Bei dem Datenverzeichnis wird natürlich das externe Speichermedium angegeben, /media/USBDrive/nextcloud/ dort wird alles gespeichert, was später in die Cloud hochgeladen wird.

einrichten

Nach erfolgreicher Installation findet man unter den EinstellungenVerwaltungÜbersicht die Sicherheits- & Einrichtungswarnungen, dort werden mit Sicherheit auch einige Probleme direkt aufgelistet.

Ein vorhandenes PHP-Modul muss noch aktiviert werden über
sudo a2enmod headers
Apache2 anschließend neu starten
sudo systemctl restart apache2

Die PHP Konfiguration bearbeiten, das Speicherlimit erhöhen und die OPCache Nutzung vorbereiten. output_buffering wird direkt mit deaktiviert, upload_max_filesize, post_max_size und upload_tmp_dir einstellen wie gewünscht.

Wenn die Zeile mit einem Semikolon ; beginnt, muss dieses entfernt werden. Mit STRG + w kann in nano gesucht werden.

sudo nano /etc/php/7.4/apache2/php.ini

memory_limit = 512M
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1 
opcache.save_comments=1
output_buffering = 0
upload_max_filesize = 1G
post_max_size = 1G
upload_tmp_dir = /var/tmp/

Als Nächstes wird die
sudo nano /etc/apache2/sites-available/MeineDomain.TLD.conf
bzw. für lokalen Zugriff die
000-default.conf
wieder angepasst und folgendes in den SSL Bereich hinzugefügt

<IfModule mod_headers.c>
	Header always set Strict-Transport-Security "max-age=15768000; preload"
	Redirect 301 /.well-known/carddav /remote.php/dav
	Redirect 301 /.well-known/caldav /remote.php/dav
	Redirect 301 /.well-known/webfinger /index.php/.well-known/webfinger
	Redirect 301 /.well-known/nodeinfo /index.php/.well-known/nodeinfo
</IfModule>

Beispiel: 000-default.conf

Danach wird mit
sudo nano /etc/php/7.4/mods-available/apcu.ini
folgende Zeile hinzugefügt
apc.enable_cli=1
und Apache2 wieder neu starten
sudo systemctl restart apache2

Nun wird noch die Aktivierung des PHP Caches durchgeführt, mit
sudo nano /var/www/MeineDomain.TLD/config/config.php
und dem Array am Ende

'memcache.local' => '\OC\Memcache\APCu',
'default_phone_region' => 'DE',
'log_type' => 'file',
'logtimezone' => 'Europe/Berlin',
'logfile' => '/var/log/nextcloud.log',
'loglevel' => 2,

hinzufügen. Das Array wird mit der geschlossenen Klammer und dem Semikolon ); geschlossen, achte einfach auf die bereits vorhandenen Einträge. Apache2 wieder neu starten, damit die Änderungen wirksam werden mit
sudo systemctl restart apache2

Die PHP occ Befehle müssen in dem Verzeichnis der Nextcloud ausgeführt werden. Über
cd /var/www/MeineDomain.TLD
wird mit dem User www-data die Befehle durchgeführt.

Externe Überwachungsprogramm mit einem Token versehen, besonders wenn die Cloud aus dem Internet erreichbar ist. Mit
sudo -u www-data php occ config:app:set serverinfo token --value DeinToken
wird der Token gesetzt.

sudo -u www-data php occ db:add-missing-indices
und
sudo -u www-data php occ db:convert-filecache-bigint

In den Einstellungen unter Grundeinstellungen wird die Hintergrund-Aufgaben geändert auf Cron. Dieser Cronjob unterscheidet sich aber vom certbot bzw. Let's Encrypt. Wir nutzen hier nicht den User root, sondern www-data mit dem Befehl
sudo crontab -u www-data -e
wird folgende Zeile eingefügt

*/5 * * * * php -f /var/www/MeineDomain.LTD/cron.php

Die Nextcloud sollte damit fertig eingerichtet sein.

Nextcloud Anmeldung absichern

Durch die zwei Apps kann der Login zusätzlich mittels Zwei-Faktor-Authentifizierung abgesichert werden, über TOTP Apps (RFC 6238), Signal, SMS* und Telegram.
*Anbieter wird benötigt, z.B. websms.de

Da Telegram bekannter sein dürfte, habe ich mich für diese Variante entschieden. Es wird ein Telegram-Account benötigt.

Es wird über Telegram nach BotFather gesucht und eine Konversation gestartet. Über die Textnachricht /newbot wird ein neuer Bot erstellt und der Name Mein Bot Name und der Username (muss) endenmit_bot angegeben. Man erhält eine Antwort mit dem entsprechenden Token ...123:ABC...

Es wird in das Verzeichnis
cd /var/www/MeineDomain.TLD
gewechselt und folgender Befehl ausgeführt
sudo -u www-data php occ twofactorauth:gateway:configure telegram
den Telegram Bot Token einfügen und fertig.


ocDownloader mit ARIA2 installieren

Bevor die App installiert wird, werden folgende weitere Pakete installiert, über
sudo apt-get install aria2 curl php-curl python3-pip
und installieren die youtube-dl für Pyhton über
sudo pip install youtube-dl
als nächstes wwerden zwei Verzeichnisse erstellt, über
sudo mkdir /var/log/aria2c /var/local/aria2c

Dann werden zwei Dateien erstellt über touch und entsprechend die Rechte vergeben, über die Befehle
sudo touch /var/log/aria2c/aria2c.log
touch /var/local/aria2c/aria2c.sess
chown www-data.www-data -R /var/log/aria2c /var/local/aria2c
chmod 770 -R /var/log/aria2c /var/local/aria2c

Gestartet wird ARIA2 dann mit einen RPC-Passwort, dieses wird später in den Einstellungen hinterlegt, über
sudo -u www-data aria2c --enable-rpc --rpc-allow-origin-all -c -D --log=/var/log/aria2c/aria2c.log --check-certificate=false --save-session=/var/local/aria2c/aria2c.sess --save-session-interval=2 --continue=true --input-file=/var/local/aria2c/aria2c.sess --rpc-save-upload-metadata=true --force-save=true --log-level=warn --rpc-secret=DEIN_KEY

Die Ports 6881-6999 werden standardmäßig genutzt, diese müssen in der Firewall freigegeben und neugestartet werden über die drei Befehle
sudo ufw allow 6881:6999/tcp
sudo ufw allow 6881:6999/udp
sudo ufw reload