Mailman 3 auf Docker

    Vor einiger Zeit habe ich meinen ersten Dockerserver aufgesetzt. Ziel war es die Möglichkeit zu schaffen weitere Komponenten auf dem Server zu installieren und Konflikte zwischen Softwarevoraussetzungen zu vermeiden.

    GNU Mailman war damals schon mein erster Fall den ich vor Augen hatte. Ich möchte diesen Listserver verwenden um Maillinglisten für Schulklassen und Elternpflegschaften zu verwalten.

    Die Installation von Mailman per Docker wird von den Entwickler befürwortet und die Dokumentation erweckt den Eindruck das der Autor weiß was er tut.

    Da ich generell noch etwas misstrauisch bin wollte ich mir diese Installationsweise vorab etwas genauer ansehen.

    Es gib 3 Dockercontainer die über ein eigenes internes Netz verbunden sind. Diese “sprechen” nach außen über die internen Docker IP Adressen und sollten damit nicht von extern ansprechbar sein. Es gibt 3 Schnittstellen nach außen

    • Konfigurationsverzeichnisse in die Container
    • Zwei Ports über die die Kommunikation des Core Service angesprochen werden kann
    • Ein Port über den der Webserver arbeiten kann.

    Damit sollte nach meinem Kenntnisstand die Installation erst einmal recht risikoarm sein da an sich der Dockercontainer abgekappselt ist.

    Die eigenen Konfigurationen werden in einem Verzeichnis des Host Servers gehalten und in den Docker Container “an die richtige Stelle” gemappt. Die Daten werden in /opt/mailman/databases gehalten

    Backup:

    Um die Daten und Konfigurationen des Mailman Servers zu sichern sollte es ausreichen man das Verzeichnis /opt/mailman in das Backup mit aufzunehmen. Dort müssten alle Daten und eigenen Konfigurationen enthalten sein.

    Installation

    Die Installation müsste recht einfach sein. Aber das scheint wahrscheinlich nur so. Mal sehen.

    16.9.18
    Weitere Beiträge zu: Mailman3 Docker Debian

    Cisco SIP Telefone für Asterisk mit Ansible verwalten

    Ich verwende seit kurzem wieder ausschließlich Asterisk als Telefonanlage und dazu Cisco 7960 SIP Telefone.

    Generell ist diese Konfiguration in diesem Privathaushalt mit Homeoffice recht einfach. Jeder darf mit jedem telefonieren und ich lege zentral fest welches Telefon bei welcher externen Nummer klingel soll. Also keine Benutzer mit Kennwörtern sondern nur Geräte mit Nummern. Das macht es mir möglich einen Großteil der Konfiguration in Ansible zu verwalten.

    Die Konfiguration ist im Prinzip nicht schwer, geschieht aber an verschiedenen Stellen und ist deshalb etwas fusselig.

    Telefongeräte

    Für jedes Telefongerät muss eine Konfiguration erstellt werden die sich das Telefon beim Booten von einem TFTP Server zieht. Dort stehen also schon mal Namen und Kennwörter. Diese Konfigurationsdatei muss in dem Namen die MAC Adresse des Telefons haben.

    Asterisk

    Auch hier wird für jedes Telefon ein “Account” angelegt und es muss festgelegt werden unter welcher Nummer es extern erreichbar ist, welche Nummer es beim telefonieren verwenden soll und das man es intern erreichen kann.

    Neuanlage eines Telefons

    Man trägt also für jedes Telefon zuerst die Nummer in der SIP Configuration ein, legt einen Eintrag für die Extension an und dann noch mal diese SIP Konfiguration auf dem FTP Server.

    Und überall stehen im wesentlichen nur ein paar Informationen wiederholt drin.

    Automatisierung mit Ansible

    (Der folgende Text setzt schon Ansible Wissen voraus.)

    Das Playbook besteht aus folgenden Dateien

     roles/asterisk/
     ├── handler
     │   └── main.yml
     ├── tasks
     │   └── main.yml
     └── templates
         ├── interne-erreichbarkeit-sip-conf.j2
         ├── sip-config-xml.j2
         └── sip-conf.j2
    

    In der Konfiguration des Asterisk Servers sind folgende Variablen für jedes Telefon enthalten

    - sipname: "311"
      name: "311"
      callerid_name: "Familie Bauer"
      callerid_num: "+49222xxxx"
      logo_url: "http://server.domain.lcl/eigenes-cisco-logo.bmp"
      mac: "0016Cxx228E"
    

    Asterisk Extensions

    Es wird für jedes Telefon eine Datei angelegt in der steht unter welcher Nummer ein Telefon erreichbar ist

      - name: create config directory in asteriskdir
        file:
          path: "/etc/asterisk/my/"
          state: directory
          mode: 0750
      - name: Create a rule for internal-calls.conf
        template:
          src=interne-erreichbarkeit-sip-conf.j2
          dest=/etc/asterisk/my/internal-calls-{{ item.name }}.conf
          owner=asterisk
          group=asterisk
          mode=0750
        with_items: "{{ sipphones }}"
    

    Das Template sie so aus und enthält nur eine Zeile.

     exten =>  {{ item.name }} ,1,Dial(SIP/{{ item.name }})  
    

    In der extension.conf werden alle diese Konfigurationen eingebunden

      #include "my/internal-calls-\*.conf"
    

    Damit ist gibt es für jedes Telefon eine Anrufmöglichkeit.

    Telefon Definition

    Ähnlich baue ich die SIP Definitionen

    Task:

      - name: Create a sip1.conf
        template:
        src=sip-conf.j2
        dest=/etc/asterisk/my/sip-{{ item.name }}.conf
        owner=asterisk
        group=asterisk
        mode=0750
        with_items: "{{ sipphones }}"
    

    Template:

     [{{ item.name }}] ; Name
    
     type=friend
     username = {{ item.name }}
     secret = {{ item.name }}
     pickupgroup = 1
     callgroup = 1
     context=mycontext;
     setvar=EXTERNAL_CALLERID=”{{ item.callerid_name }}” <{{ item.callerid_num }}>;
      ....
      .....
      .....
     {% if item.mailbox is defined %}
     mailbox= {{ item.mailbox }}
     {% endif %}
    

    In der /etc/asterisk/sip.conf steht dann

       #include /etc/asterisk/my/sip-\*.conf
    

    Telefonkonfiguraton

    Bleibt noch die Konfiguration der Telefone selbst. Auch die ist recht einfach gehalten aber mit etwas Logik kann man das auch komplizierter machen.

    Tasks:

     - name: Create a Phone XML Configuration
       template:
        src=sip-config-xml.j2
        dest=/opt/tftp/diskless/SIP{{ item.mac }}.cnf
        owner=asterisk
        group=asterisk
        mode=0750
      with_items: "{{ sipphones }}"
    

    Template:

     phone_label: "{{ item.name }}"
     proxy_register: 1
     line1_name: "{{ item.name }}"
     line1_displayname: "{{ item.name }}"
     line1_shortname: "{{ item.name }}"
     line1_authname: "{{ item.name }}"
     line1_password: "{{ item.name }}"
     {% if item.logo_url is defined %}
     logo_url: "{{ item.logo_url }}"
     {% endif %}
    

    Ergebniss

    Jetzt trage ich nur noch in der Ansible Server Konfiguration ein neues Telefon mit der gewünschten Nummer und der Mac Adresse ein und mit einem Befehl wird der Account definiert, die Nummer eingerichtet und die Telefonkonfiguration erstellt.

    ansible-playbook asterisk.yml -b
    
    10.9.18
    Weitere Beiträge zu: Ansible Asterisk Cisco7960

    Raspberry Pi offline @ Amsterdam

    Leider geht die Zeit für meinen kleinen RaspberryPi in Amsterdam zu ende.

    We are reaching out to inform you that, as of the 10th of January 2019, we will stop with our Raspberry Pi colocation service. As you might remember, we started this adventure over five years ago and while its been really fun and way more successful than we could ever imagine, we have decided to no longer continue with the service in 2019.

    Ja es hat wirklich Spaß gemacht aber die Zeit ist gekommen. Der Pi wird gespendet.

    pcextrem.nl ist mir dadurch aber als verlässlicher Partner für ein Hosting außerhalb von Deutschland ans Herz gewachsen.

    6.9.18
    Weitere Beiträge zu: raspberrypi pcextrem

    Installation Docker auf Debian 9

    Ziel war es einen Docker Dienst auf einem öffentlichen Server zu installieren um zukünftig über den Mechanismus der Container einfacher verschiedene Dienste zu fahren die sich mit Ihren Abhängigkeiten nicht in die Quere kommen sollen.

    Die bisherigen Beschreibungen sahen allesamt recht einfach aus. Zusätzlich wollte ich noch vorhandene Sicherheitsempfehlungen nachgehen und bin auf Docker Bench gestoßen das wohl die gängigen Empfehlungen im System prüft.

    Eigentlich lief alles nach Doku. Dies sind meine Notizen ohne Anspruch auf Korrektheit.

    Die Basisbeschreibung stammt von hier

       sudo apt-get update
       sudo apt-get install apt-transport-https ca-certificates  curl gnupg2 software-properties-common
       curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
       sudo apt-key fingerprint 0EBFCD88
           pub   rsa4096 2017-02-22 [SCEA]
                 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
           uid        [ unbekannt ] Docker Release (CE deb) <docker@docker.com>
           sub   rsa4096 2017-02-22 [S]
       sudo add-apt-repository \
          "deb [arch=amd64] https://download.docker.com/linux/debian \
          $(lsb_release -cs) \
          stable"
       sudo apt-get update
       sudo apt-get install docker-ce
       sudo systemctl status docker
       sudo usermod -aG docker meinuser
       id -nG
          meinuser docker ..
       docker run hello-world
           Hello from Docker!
           This message shows that your installation appears to be working correctly.
      sudo systemctl enable docker
         Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
         Executing: /lib/systemd/systemd-sysv-install enable docker
    

    Damit war Docker installiert, das Hello World Beispiel erfolgreich gestartet und der Dienst sollte sich automatisch starten.

    Jetzt der Sicherheitsscheck auf Basis dieser Beschreibung

    git clone https://github.com/docker/docker-bench-security.git
    cd docker-bench-security/
    ./docker-bench-security.sh
    

    Der Check selbst brachte das gleiche Ergebnis wie in dem Dokument und bis auf die separate Partition konnte ich allen Empfehlungen folgen

    Die Überwachung der Dockerverzeichnisse

       sudo apt-get install auditd
       vi /etc/audit/rules.d/audit.rules
          -w /usr/bin/docker -p wa
          -w /var/lib/docker -p wa
          -w /etc/docker -p wa
          -w /lib/systemd/system/docker.service -p wa
          -w /lib/systemd/system/docker.socket -p wa
          -w /etc/default/docker -p wa
          -w /etc/docker/daemon.json -p wa
          -w /usr/bin/docker-containerd -p wa
          -w /usr/bin/docker-runc -p wa
       sudo systemctl restart auditd
    

    Die Beschränkungen des Docker Daemons

       sudo vi /etc/docker/daemon.json
    
       {
           "icc": false,
           "userns-remap": "default",
           "log-driver": "syslog",
           "disable-legacy-registry": true,
           "live-restore": true,
           "userland-proxy": false,
           "no-new-privileges": true
       }
    

    Docker Trust

      echo "DOCKER_CONTENT_TRUST=1" | sudo tee -a /etc/environment
    

    Dann blieben noch zwei Warnungen übrig.

      ./docker-bench-security.sh  |  grep WARN
      [WARN] 1.1  - Ensure a separate partition for containers has been created
      [WARN] 2.11 - Ensure that authorization for Docker client commands is enabled
    

    Die Partition kann ich aktuell nicht separieren und die andere Warnung kann man wohl erst mal ignorieren kann da man keinen externen Zugriff erlaubt.

      The audit will continue to flag this test as a WARN, though access to the default local-only Docker socket is protected by requiring membership in the docker group so this can be safely ignored.
    
    5.9.18
    Weitere Beiträge zu: debian docker

    Wie eine Türklingel Telefonanrufe auslösen kann

    Ein echtes Vater / Sohn Projekt das echt viel Spaß gemacht hat. Die Löt- und Arduinokenntnisse von meinem Sohn wurden kombiniert mit meine bescheidenen MQTT Kenntnissen und meiner Asterisk Anlage.

    Das Problem

    Wenn jemand in unserem Haus klingelt und man sich oben in einem der Zimmer mit geschlossener Zimmertür aufhält dann hört man nichts. Das Ziel war das es ein einem bestimmten Zimmer eine Benachrichtigung gibt. Das Zimmer ist auch mit einem Telefon ausgestattet.

    Der Wunsch

    Schon seit langem wollte ich die Klingel “irgendwie” mit dem LAN verbinden hatte aber noch nicht die richtige Idee.

    Dann kam dieser Heise Artikel. Dort sollte zwar eine Fritzbox angeschlossen werden aber es gab auch die Möglichkeit eine MQTT Nachricht zu versenden.

    Das Netz für die ganzen IOT Geräte ist vollkommen abgeschottet. Das Netz für Telefonanlage ist ebenfalls abgeschottet darf aber in das IOT Netzwerk. In jedem Netzwerk ist ein RaspberryPi mit einem MQTT Server

    Die Bauteile waren meinem Sohn aufgrund seiner Arduino Workshop schon bekannt. Die Kosten waren im 10 Euro Bereich. Der Bauplan war für Ihn recht einfach und sieht gemäß CT so aus

    Das ganze wurde noch etwas provisorisch an der Klingel angeschlossen

    Das Programm für den ESP8266 ist recht simpel.

      #include <ESP8266WiFi.h>
      #include <PubSubClient.h>
      #define WLAN_SSID "wlan-it"
      #define WLAN_PASSWORD "xxxxxx"
      #define MQTT_HOST "iot-mqtt.yourlan.lcl"
      #define MQTT_USER "doorbell"
      #define MQTT_PASSWORD "geheim"
      #define MQTT_PORT 1883
      #define MQTT_TOPIC "doorbell/ring"
      #define MQTT_MESSAGE "true"
    
      WiFiClient wifiClient;
      PubSubClient mqtt_client(wifiClient);
    
      void setup_wifi() {
        WiFi.begin(WLAN_SSID, WLAN_PASSWORD);
        while (WiFi.status() != WL_CONNECTED) {
          delay(500);
        }
      }
    
      void connect_mqtt() {
        while (!mqtt_client.connected()) {
          if (mqtt_client.connect("Klingelanlage", MQTT_USER, MQTT_PASSWORD)) {
          } else {
            delay(5000);
          }
        }
      }
    
      void setup() {
        setup_wifi();
        mqtt_client.setServer(MQTT_HOST, MQTT_PORT);
        if (!mqtt_client.connected()) {
          connect_mqtt();
        }
        mqtt_client.loop();
        mqtt_client.publish(MQTT_TOPIC, MQTT_MESSAGE);
        delay(4000);
        ESP.deepSleep(0);
      }
    
      void loop() {
      }
    

    Es meldet sich im unsicheren IOT WLAN an und versendet eine MQTT Nachricht an den dortigen MQTT Broker.

    Die Asterisk Telefonanlage befindet sich auf einem weiteren Rapsberri Pi. Dort läuft der MQTT-Launcher von jpmens und immer wenn das relevante Topic im IOT VLAN erscheint kopiert dieser eine sogenannte Call Datei in das richtige Verzeichnis für die Telefonanlage. In der Call Datei steht welche Telefonnummer für wie lange angerufen werden soll:

     Channel: SIP/Wunschummer
     Callerid: Pforte
     MaxRetries: 0
     WaitTime: 14
     Context: internercontext
     Extension: Wunschnummer
     Priority: 2
    

    Wenn es also klingelt “wacht” der Doorbellbaustein auf und sendet eine MQTT Nachricht. Der Asteriskserver “hört” das und ruft die richtige Nummer an.

    Bis jetzt läuft das die ersten Tage schon recht stabil

    Weitere Ideen:

    • V2 Ich möchte im Urlaub benachrichtigt werden wenn jemand klingelt und ein Bild der Videokamera zu gesendet bekommen.
    • V3 die alte Gegensprechanlage wird an Telefon angeschlossen und kann angerufen werden.
    2.9.18
    Weitere Beiträge zu: MQTT Asterisk

    Froscon 13: Mein Vortrag und ein Resümee

    Bei Konferenzen wie der Froscon13 kann man ja immer mehr oder weniger Glück haben. Dieses Jahr hatte ich Glück. Es waren viele für mich interessanten Vorträge dabei und bei meinem eigenen Vortrag zu Sichere Netzwerke mit pfsense hatte ich ein aktives Publikum mit vielen Nachfragen und gutem Feedback zum Schluss.

    Die Logistik war wie die vergangenen Jahre sehr gut. Auch wenn ich schon mal weniger Glück hatte kann ich diesen Event wirklich zu jedem ans Herz legen der sich mit freier Software beschäftigt.

    Den einen oder anderen Vortrag der mit besonders gut gefallen hat werde ich in den nächsten Tagen noch vorstellen.

    27.8.18
    Weitere Beiträge zu: Froscon pfsense

    Froscon 13: Documentation with any editor

    Der Froscon13 Vortrag auf den ich am gespanntesten war da ich mit Christoph schon im Vorfeld darüber gesprochen hatte.

    Create beautiful documentation in the editor of your choice and organize your stuff in git and co

    Und ich wurde nicht enttäuscht. Dieses asciidoctor werde ich auf jeden Fall in dem nächste Dokumentationsprojekt verwenden.

    Also jeder der mit seiner aktuellen Art Dokumentation zu schreiben nicht zufrieden ist sollte sich dieses Replay unbedingt ansehen.

    25.8.18
    Weitere Beiträge zu: Froscon Documentation asciidoctor

    Der Ransomware Angriff bei Maersk

    Die Reederei Maersk war einer der am härtesten betroffenen weltweiten Unternehmen des Verschlüsselungstrojaner NotPetya.

    Diese Geschichte liest sich wie eine Kriminalgeschichte.

    Lessons learned: Nachlässigkeiten in der Sicherheitskonzeption werden bestraft. Wenn nicht heute dann morgen.

    $10 billion: Total damages from NotPetya, as estimated by the White House

    24.8.18
    Weitere Beiträge zu: Sicherheit notpetya

    Ubuntu 18.04 Bootprobleme nach Update

    Nach dem Update auf Ubuntu 18.04 hatte ich bei dem Rechner meiner Tochter das Problem das er bei dem Ubuntu Splashscreen bei “einem Punkt” hängen geblieben ist.

    Hier gab es dazu eine Lösung. In den Recoverymodus booten und Wayland für den Login Manager ausschalten. (Keine Ahnung was dann wegfällt. Aber dafür kann meine Tochter wie bisher weiter arbeiten)

     vi b/etc/gdm3/custom.conf.
         WaylandEnable=false
    
    21.8.18
    Weitere Beiträge zu: Ubuntu

    Sicherheit bei Bodycams

    Ich bin mir sicher die Bodycams die in Deutschland zum Einsatz kommen weisen die hier gefundenen Probleme der Bodycams in den USA nicht auf.

    Mitchell even realized that because he can remotely access device storage on models like the Fire Cam OnCall, an attacker could potentially plant malware on some of the cameras. Then, when the camera connects to a PC for syncing, it could deliver all sorts of malicious code: a Windows exploit that could ultimately allow an attacker to gain remote access to the police network, ransomware to spread across the network and lock everything down, a worm that infiltrates the department’s evidence servers and deletes everything, or even cryptojacking software to mine cryptocurrency using police computing resources

    Auch werden mit Sicherheit die Videos digital signiert um eine nachträgliche Verifikation zu ermöglichen …..

    Popcorn?

    20.8.18
    Weitere Beiträge zu: Sicherheit Bodycams

    Netzwerkangriffe über Multifunktionsgeräte via Fax

    Was es alles gibt. Es scheint so zu sein das man über ein Fax an Multifunktionsgeräte in ein Netzwerk eindringen kann.

    Auch wenn einige nicht mehr wissen was ein Fax ist, das ist für viele Firmen eine echte Bedrohung.

    Wieder ein Grund mehr über Netzwerksegmentierung (z.B. mit pfsense) nachzudenken.

    sss

    Datenschutzhinweis - Dieser Link startet einen externen Abruf des Videos bei Youtube

    16.8.18
    Weitere Beiträge zu: Sicherheit Netzwerksegmentierung

Dies ist ein privater Blog von Hagen Bauer- berufstätiger Vater, Ehemann, Naturliebhaber, Läufer, Zelter, technikverliebt.


Creative Commons License
This blog is licensed under a Creative Commons License