Skip to content

Raspberry Pi installation and configuration with Raspbian and Docker.

Notifications You must be signed in to change notification settings

ErikSlevin/raspberry-install

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 

Repository files navigation

Raspberry Installation

Datum Beschreibung
13.01.2023 Anleitung erstellt
09.09.2023 Komplette Überarbeitung der Anleitung

Vorbereitungen

  1. Raspberry Pi Imager runterladen & installieren

  2. Windows Terminal herrunterladen

  3. Raspberry Pi OS auf Medium schreiben

    • Raspberry Pi OS (other)
    • Raspberry Pi OS Lite (64-bit) (with no desktop enviroment)
    • SD-Karte: Externes Medium auswählen
    • Einstellungen:
      • SSH aktivieren
      • Passwort und Benutzername setzen
      • Spracheinstellungen festlegen
    • schreiben
  4. SSH Verbindung herstellen

    • Windows Terminal öffnen
    • ssh username@[DYNAMISCHE IP vom Raspberry]

Grundkonfiguration

# Paketquellen aktualisieren und updaten
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && sudo apt autoclean -y

# Raspberry Hardwarekonfiguration ändern
# Hier wird u.A. WLAN, BT, Audio sowie die HDMI Schnittstelle deaktiviert
sudo nano /boot/config.txt

# Statische IP-Adresse konfigurieren
sudo nano /etc/dhcpcd.conf

# IPv6 deaktivieren
sudo nano /etc/sysctl.conf

# SysCtl Konfig übernehmen
sudo sysctl -p

# DCHP Dienst neustarten und Status überprüfen
sudo systemctl restart dhcpcd.service
sudo service dhcpcd status

# Hostname ändern
sudo nano /etc/hostname

# Hosts ändern
sudo nano /etc/hosts

# Locale einstellen
sudo raspi-config nonint do_change_locale de_DE.UTF-8 UTF-8
sudo raspi-config nonint do_change_locale de_DE.UTF-8

# Timezone einstellen
sudo raspi-config nonint do_change_timezone Europe/Berlin

# Neustart
sudo reboot

config.txt dhcpcd.conf sysctl.conf hostname hosts

Automatische Updates einrichten

# unattended-upgrades installieren und konfigurieren
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades

# Konfigurationsdateien anpassen inkl. Push-Notification via Gotify
# Der Notify-Container Gotify wird später noch eingerichtet
sudo nano /etc/apt/apt.conf.d/20auto-upgrades
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

# Push-Benachrichtigung, wenn automatische Updates installiert wurden
sudo mkdir ~/skripte -v
sudo nano /home/erik/skripte/unattended-upgrades-notify.sh
sudo chmod +x /home/erik/skripte/unattended-upgrades-notify.sh

# Neustart (zwingend erforderlich wegen SSH Konfiguration)
sudo reboot

20auto-upgrades 50unattended-upgrades unattended-upgrades-notify.sh

SSH einrichten

# SSH Backup erstellen 
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak -v

# zum root-User wechseln
sudo su

# SSH Schlüssel löschen und neu generieren
rm /etc/ssh/ssh_host_*
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""

# entfernt kleine Diffie-Hellman-Module
awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe
mv /etc/ssh/moduli.safe /etc/ssh/moduli

# Beschränkt den Schlüsselaustausch auf (key exchange), Chiffrier- (cipher) und MAC-Algorithmen.
nano /etc/ssh/sshd_config.d/ssh-audit_hardening.conf

# wechselt zum normalen Benutzer zurück.
exit

# Generiert einen sicheren SSH-Key (ed25519) - mit y Bestätigen.
sudo ssh-keygen -o -a 100 -t ed25519 -N "" -f /etc/ssh/ssh_host_ed25519_key -C "$(date '+%Y%m%d')-$(hostname -s)-ed25519_key"

# .ssh Ordner und authorized_keys erstellen
mkdir ~/.ssh
touch ~/.ssh/{authorized_keys,config}

# Verschiebt den ssh_host_ed25519_key.pub nach authorized_keys.
sudo cat /etc/ssh/ssh_host_ed25519_key.pub >> ~/.ssh/authorized_keys

# Das .ssh-Verzeichnis für andere Benutzer und Gruppen das leserecht entziehen.
chmod 700 ~/.ssh

# Legt fest, dass die SSH-Schlüsselpaare nur gelesen werden können.
sudo chmod 400 /etc/ssh/ssh_host_ed25519_key*

# Setzt den lokalen Benutzer als Besitzer des Public-Keys.
chown $USER:$USER ~/.ssh/authorized_keys

# Platzhalter erstellen für zukünfige Server zu Server Verbindungen etc.
sudo nano ~/.ssh/config

# zeigt den ssh_host_ed25519_key an.
sudo cat /etc/ssh/ssh_host_ed25519_key >> $(date '+%Y%m%d')-$(hostname -s)-ed25519_key
   # --> Windows -> in Datei speichern ODER scp pi-docker-1:~/*key C:\Users\erikw\.ssh\
   # --> !! ACHTUNG ZEILENENDESEQUENZ LF, NICHT CRLF !!!
   # --> Am besten in VSC öffnen und speichern 
   # --> Dateiname: echo $(hostname)-$(date -I)

# startet den SSH-Dienst neu
sudo service ssh restart

# sshd_conf übernehmen 
sudo nano /etc/ssh/sshd_config

# issue.net anpassen
sudo nano /etc/issue.net

# MOTD löschen
sudo rm /etc/motd
sudo rm /etc/update-motd.d/10-uname

# Gotify Benachrichtigung via SSH 
sudo nano /opt/shell-login.sh
sudo chmod 755 /opt/shell-login.sh
echo "/opt/shell-login.sh > /dev/null 2>&1" | sudo tee -a /etc/profile

ssh-audit_hardening.conf config sshd_config issue.net motd shell-login.sh

Firewall unf Fail2Bann einrichten

# UFW installieren
sudo apt install ufw -y && sudo apt autoclean -y && sudo apt autoremove -y

# eingehende Verbindungen werden abgelehnt und ausgehende Verbindungen zugelassen.
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH Verbindungen zulassen
# ACHTUNG: bitte SSH-Port-Nummer anpassen
sudo ufw allow 62253 comment "ssh"

# UFW aktivieren - mit y bestätigen
sudo ufw enable

# installiert die neueste Fail2ban Version
sudo apt install fail2ban -y -y && sudo apt autoclean -y && sudo apt autoremove -y

# erstellt eine Kopie der Konfigurationsdatei.
sudo cp /etc/fail2ban/jail.{conf,local} -v

# zum root-User wechseln
sudo su

# [sshd] Jail konfigurieren
# Zeilennummer vom sshd-Jail in Variable speichern
i=$(grep -n '\[sshd\]' /etc/fail2ban/jail.local | awk 'NR==2 {print}' | cut -d ':' -f 1 | awk '{print $1 + 1}')

# Grundeinstellungen vom Jail entfernen
sudo sed -i "${i},$((i+7))d" /etc/fail2ban/jail.local

# Neue Einstellungen für den Jail hinzufügen
# Folgende Einstellungen werden mit dem echo-Befehl hinzugefügt:
# Wenn Änderungen gewünscht (z.B. SSH-Port) dann bitte den echo befehl anpassen,
# nicht die untenstehenden Kommentarzeilen!
# enabled = true		port = 62253	logpath = %(sshd_log)s	bantime = 2h	
# backend = %(sshd_backend)s	maxretry = 3	ignoreip = 127.0.0.1/8	findtime = 1d
echo -e "enabled = true\nport = 62253\nlogpath = %(sshd_log)s\nbackend = %(sshd_backend)s" \
	"\nmaxretry = 3\nfindtime = 1d\nbantime = 2h\nignoreip = 127.0.0.1/8" | \
	 sed -i "${i}r /dev/stdin" /etc/fail2ban/jail.local

# wechselt zum normalen Benutzer zurück.
exit

# Fail2ban neu starten.
sudo service fail2ban restart

# Fail2ban nach Reboot automatisch starten
sudo systemctl enable fail2ban

20auto-upgrades 50unattended-upgrades unattended-upgrades-notify.sh

Docker und Portainer

# Docker installieren
sudo mkdir ~/docker_files -v
sudo curl -fsSL https://get.docker.com -o get-docker.sh &&  sudo sh get-docker.sh 
sudo rm get-docker.sh
sudo groupadd docker
sudo usermod -aG docker $USER

# Neustart zwingend durch führen!
sudo reboot

# Docker Netzwerke erstellen
docker network create --subnet=10.0.10.0/24 --gateway=10.0.10.1 intern
docker network create --subnet=10.0.20.0/24 --gateway=10.0.20.1 extern

# Portainer deployen
docker run -d -p 9000:9443 --name portainer \
	--restart=always \
	-v /var/run/docker.sock:/var/run/docker.sock \
	-v portainer:/data \
	--label "com.centurylinklabs.watchtower.enable=true" \
	--network intern \
	portainer/portainer-ce:latest

###################### OPTIONAL ###########################
### Weitere Docker-Hosts via Portainer Agent hinzufügen ###

docker run -d \
  -p 9001:9001 \
  --name portainer_agent \
  --restart=always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /var/lib/docker/volumes:/var/lib/docker/volumes \
  --label "com.centurylinklabs.watchtower.enable=true" \
  --network intern \
  portainer/agent:latest

Optional: Server Schlüsselpare austauschen

# 1. Schlüssel vom Server 1 (pi-docker-1) dem Server 2 (pi-docker-2) mitteilen
scp C:\Users\erik/.ssh/20230910-pi-docker-1-ed25519_key pi-docker-1:~/.ssh/20230910-pi-docker-2-ed25519_key

# 2. Auf Server 2 Schlüsseldatei die richtigen Berechtigungen geben
sudo chmod 600 ~/.ssh/20230910-pi-docker-2-ed25519_key

# 3. SSH-Agenten starten
eval "$(ssh-agent -s)"

# 4. Schlüssel hinzufügen via ssh-add
ssh-add 20230910-pi-docker-1-ed25519_key

# Ausgabe: Identity added: 20230910-pi-docker-1-ed25519_key (20230910-pi-docker-1-ed25519_key)

# 5. SSH-Profil anpassen
sudo nano ~/.ssh/config

# Zukünftig kann man via ssh pi-docker-1 eine Verbindung herstellen oder via scp docker-pi-1 Dateien senden

config

Quellen

About

Raspberry Pi installation and configuration with Raspbian and Docker.

Topics

Resources

Stars

Watchers

Forks

Languages