Einleitung

Vor einiger Zeit stieß ich auf einen Artikel zu DNS-Abfragen und die Rolle des Providers. Ich möchte diesen Artikel nur kurz aufs Wesentliche herunterbrechen: Jede Adresse, die man in die Adresszeile seines Browsers eingibt, landet bei einem sogenannten DNS-Server, der zur eingegebenen Webadresse die jeweilig zugehörige IP-Adresse abfragt und den Nutzer dann entsprechend auf den Zielserver weiterleitet. Nun ergibt sich bei genauerer Überlegung folgende Problematik: Heutzutage verwendet fast jede Webseite, die etwas von sich hält "https" also Webkommunikation über TLS-Verschlüsselung (zum Glück immer seltener SSL-Verschlüsselung). Die Anfragen an den DNS-Server sind jedoch unverschlüsselt, d.h. theoretisch könnte es jemanden mit entsprechendem Wissen gelingen, Anfragen, die an den DNS-Sender gesendet werden, entsprechend zu manipulieren und dann bei einem Aufruf von z.B. duckduckgo.com eine andere Adresse anzuzeigen. Freilich wird das dann schwieriger das "https"-Zertifikat zu fälschen, hierzu bräuchte der Angreifer Zugriff auf die DNS-Einstellungen der jeweiligen Domain. Aber eine "http"-Seite, ohne entsprechende Verschlüsselung, ließe sich damit theoreitsch relativ leicht, ohne Wissen den Nutzers umleiten, sogenanntes "DNS spoofing". Neben dem "DNS spoofing" muss man sich noch einer Tatsache bewusst werden. Standardmäßig surft man immer über den DNS-Server des eigenen Internetproviders. Im Klartext heißt das, dass dieser theoretisch jede Abfrage mitloggen kann und so jederzeit nachvollziehen kann, welcher Benutzer mit welcher IP zu welchen Zeiten auf welchen Webseiten war. Was den Datenschutz angeht, ist das höchst fragwürdig...

Um sich dagegen zu schützen, gibt es zwei Möglichkeiten:

  1. Eine Verschlüsselte zum DNS-Server über "https" (DoH)
  2. DNSCrypt mithilfe von verschiednen "private keys" und "public keys"

Hypriot OS

Als erstes installiert man sich Hypriot OS. Flashen der heruntergeladenen .zip Datei gelingt am besten mit balena Etcher. Nach erneutem mounten der SD-Karte sollte eine Partition namens "Hypriot OS" erscheinen. Hier sucht man die Datei user-data und bearbeitet diese nach Wünschen. Eine Beispielkonfiguration:

#cloud-config
# vim: syntax=yaml
#

# The current version of cloud-init in the Hypriot rpi-64 is 0.7.6
# When dealing with cloud-init, it is SUPER important to know the version
# I have wasted many hours creating servers to find out the module I was trying to use wasn't in the cloud-init version I had
# Documentation: http://cloudinit.readthedocs.io/en/0.7.9/index.html

# Set your hostname here, the manage_etc_hosts will update the hosts file entries as well
hostname: prismplex.hole
manage_etc_hosts: true

# You could modify this for your own user information
users:
  - name: username
    gecos: "Prismplex Hole"
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    groups: users,docker,video,input
    plain_text_passwd: hypriot
    lock_passwd: false
    ssh_pwauth: true
    chpasswd: { expire: false }

# # Set the locale of the system
# locale: "en_GB.UTF-8"

# # Set the timezone
# # Value of 'timezone' must exist in /usr/share/zoneinfo
timezone: "Europa/Berlin"

# # Update apt packages on first boot
package_update: true
package_upgrade: true
# package_reboot_if_required: true

# # Install any additional apt packages you need here
# packages:
#  - ntp
#  - dnscrypt-proxy

# Static IP address
write_files:
  - content: |
      persistent
      # Generate Stable Private IPv6 Addresses instead of hardware based ones
      slaac private
      # static IP configuration:
      interface eth0
      static ip_address=#ip-address/24
      static ip6_address=#ip-address/64
      static routers=#router-address
      static domain_name_servers=#dns-adress
    path: /etc/dhcpcd.conf

# # WiFi connect to HotSpot
# # - use `wpa_passphrase SSID PASSWORD` to encrypt the psk
# write_files:
#   - content: |
#       allow-hotplug wlan0
#       iface wlan0 inet dhcp
#       wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
#       iface default inet dhcp
#     path: /etc/network/interfaces.d/wlan0
#   - content: |
#       country=de
#       ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
#       update_config=1
#       network={
#       ssid="YOUR_WIFI_SSID"
#       psk="YOUR_WIFI_PASSWORD"
#       proto=RSN
#       key_mgmt=WPA-PSK
#       pairwise=CCMP
#       auth_alg=OPEN
#       }
#     path: /etc/wpa_supplicant/wpa_supplicant.conf

# These commands will be ran once on first boot only
runcmd:
  # Pickup the hostname changes
  - 'systemctl restart avahi-daemon'

#  # Activate WiFi interface
#  - 'ifup wlan0'

Man kann nun die SD-Karte auswerfen, in den Raspberry Pi 3 stecken und booten. Nachdem man die IP-Adresse weiß oder herausgefunden hat, kann man per ssh auf den Raspi zugreifen und mit der Installation von "dnscrypt-proxy" fortfahren.

Installation von "dnscrypt-proxy"

Zur Installation von "dnscrypt-proxy" folgen nun eine Reihe von Befehlen:

$ cd /opt
$ sudo wget https://github.com/jedisct1/dnscrypt-proxy/releases/download/2.0.25/dnscrypt-proxy-linux_arm-2.0.25.tar.gz
$ sudo tar -xvf dnscrypt-proxy-linux_arm-2.0.25.tar.gz
$ sudo mv linux-arm dnscrypt-proxy
$ sudo rm dnscrypt-proxy-linux_arm-2.0.25.tar.gz
$ sudo systemctl daemon-reload
$ sudo systemctl stop systemd-resolved
$ sudo systemctl mask systemd-resolved
$ cd dnscrypt-proxy

Als nächstes folgt die Konfiguartion von "dnscrypt-proxy". Hierzu kopiert man die Beispielkonfiguration: sudo cp example-dnscrypt-proxy.toml dnscrypt-proxy.toml und editiert die neue Datei dann entsprechend mit sudo nano dnscrypt-proxy.toml. Bei listen_addresses muss der Port von 53 auf zum Beispiel 5454 geändert werden. Weiter geht es mit:

$ sudo ./dnscrypt-proxy -service install
$ sudo ./dnscrypt-proxy -service start

Automatische Updates von "dnscrypt-proxy":

$ cd /home/$USER
$ nano dnscrypt-proxy-update.sh

mit folgendem Inhalt:

#! /bin/sh

INSTALL_DIR="/opt/dnscrypt-proxy"
LATEST_URL="https://api.github.com/repos/jedisct1/dnscrypt-proxy/releases/latest"

Update() {
    workdir="$(mktemp -d)"
    curl -sL $(curl -sL "$LATEST_URL" |
        grep dnscrypt-proxy-linux_arm- | grep browser_download_url | head -1 | cut -d \" -f 4) |
        tar xz -C "$workdir" -f - linux-arm/dnscrypt-proxy &&
        [ -x linux-arm/dnscrypt-proxy ] &&
        mv -f "${INSTALL_DIR}/dnscrypt-proxy" "${INSTALL_DIR}/dnscrypt-proxy.old" || : &&
        mv -f "${workdir}/linux-x86_64/dnscrypt-proxy" "${INSTALL_DIR}/" &&
        cd "$INSTALL_DIR" && rm -fr "$workdir" &&
        ./dnscrypt-proxy -check && ./dnscrypt-proxy -service install 2>/dev/null || : &&
        ./dnscrypt-proxy -service restart || ./dnscrypt-proxy -service start
}

lversion=$("${INSTALL_DIR}/dnscrypt-proxy" -version)
rmersion=$(curl -sL "$LATEST_URL" | grep "tag_name" | head -1 | cut -d \" -f 4)
[ -z "$lversion" ] && exit 1
[ -z "$rmersion" ] && exit 1

echo locally installed
echo "$lversion"

echo remote git version
echo "$rmersion"

if [ "$rmersion" != "$lversion" ]; then
    echo "Updating" && Update
else
    echo "No Update Needed"
fi

Es folgt sudo crontab -e, um dieses Script als Benutzer "root" über Cron auszuführen. Hierzu fügt man einfach diese Zeile hinzu: 0 */12 * * * /path/dnscrypt-proxy-update.sh.

Installation von "Pi-hole"

Als erstes erstellen wir eine docker-compose.yml.

$ mkdir pihole
$ cd pihole
$ nano docker-compose.yml

Der Inhalt dieser Datei wird folgender sein:

version: "3"

# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    network_mode: "host"
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "67:67/udp"
      - "80:80/tcp"
      - "443:443/tcp"
    environment:
      TZ: 'Europe/Berlin'
      # WEBPASSWORD: 'set a secure password here or it will be random'
      # ServerIP: 'IP'
      # ServerIPv6: 'IPv6'
      DNS1: '127.0.0.1#5454'
      # DNS2: '::1#5454'
    # Volumes store your data between container upgrades
    volumes:
       - './etc-pihole/:/etc/pihole/'
       - './etc-dnsmasq.d/:/etc/dnsmasq.d/'
    dns:
      - 127.0.0.1
      - 1.1.1.1
    # Recommended but not required (DHCP needs NET_ADMIN)
    #   https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
    # cap_add:
    #   - NET_ADMIN
    restart: unless-stopped

Als letzten Schritt startet man mithilfe docker-compose up -d den Container.

Automatische Updates von Docker Containern

$ sudo docker run -d \
    --name watchtower \
    -v /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower

Quellen:

Nächster Beitrag Vorheriger Beitrag