Skip to content

Online Workshop: Yocto Crashkurs

Hallo, Hi,

(for English version see below)

Deutsch

am 2021-05-22 um 14:00+02 veranstaltet das IT-Syndikat einen Workshop zum Thema “Embedded Linux Entwicklung mit Yocto”, gehalten von David Gstir, Aaron Marcher, David Oberhollenzer und Richard Weinberger. Es soll für Einsteiger erklärt werden, wie man mittels des Yocto Projekts eine eigene Linux-Distribution erstellt, baut und in Betrieb nimmt. Eine Anmeldung im Vorhinein ist notwendig! Entweder hier im meta oder unter wir@it-syndikat.org. Bitte gebt bekannt ob ihr Build-System und Raspberry Pi selbst stellen könnt.

Eintritt ist frei, gehalten wird der Workshop online. Erwartete Dauer: 3-4h

Im Workshop wird für einen Raspberry Pi (bevorzugt 4) entwickelt. Dieser sollte, falls möglich, vom Teilnehmer selbst gestellt werden. Sollte dies nicht möglich sein, bitten wir um Bekanntgabe im Vorhinein, damit wir Hardware auftreiben können.

Die zur Entwicklung selbst benötigte Hardware wird von uns gestellt. Sollte ein Build-System bereits vorhanden sein, bitten wir im Vorhinein um Bekanntgabe, damit wir euch die benötigten Dateien zur Verfügung stellen können. Es wird ca. 75-100 GB verfügbarer Speicherplatz benötigt.

Information über den Workshop:

Yocto hat sich mehr oder weniger zu einem Industriestandard gemausert, wer mit embedded Linux zu tun hat, wird um Yocto nur noch schwer einen Bogen machen können. Jedoch fällt der Einstieg oft schwer, da man bei all den unterschiedlichen Komponenten leicht den Überblick verliert.

OpenEmbedded, bitbake, machines, devtool, layer, dynamiclayer, und Ähnliches werden anhand von praktischen Beispielen erklärt. Als Zielplattform dient das Raspberry Pi.

Ziel dieses Workshops ist es einen Überblick zu bekommen und gemeinsam ein Linux-System für ein Raspberry zu erstellen.

Da Yocto ein Linux-System komplett bootstrappt ist ein leistungsstarker Computer notwendig, um in der Zeitdauer des Workshop ein Ergebnis zu bekommen.

Auf einem aktuellen x86_64-System mit 8 CPU-Cores und 16GiB RAM braucht der Bauvorgang gut 2 Stunden und ca. 80GiB Speicher auf der Festplatte. Eine SSD ist auch hilfreich zu haben.

English Version

on 2021-05-12T14:00+02 the IT-Syndikat is holding a workshop with the topic “Embedded Linux development with Yocto” held by David Gstir, Aaron Marcher, David Oberhollenzer and Richard Weinberger. The goal is to show beginners how to build and start their own Linux distributions using the Yocto Project. Reservation in advance is required! Either via this platform or via email: wir@it-syndikat.org. Please provide wether you have your own build system and Raspberry Pi

Free entry, the workshop will be held online. Estimated duration is 3-4h.

The project will be built for the Raspberry Pi (preferred version 4) and we kindly ask participants to provide their own. If this is not possible, please reach out so we can organize hardware for you.

The hardware needed to build the distribution will be provided by us. If you have a build system, again, please reach out to us, so we can provide the necessary build files to you. Around 75-100 GB of storage space will be required for the building process.

13 posts - 4 participants

Read full topic

TLS monitoring für unsere infrastruktur

Wir kennen das seit es Let’s Encrypt gitbt ja alle: man setzt das auf und drei monate später geht auf einmal nix mehr!

Zwar bekommt man wenn bei der LE registrierung eine email addresse angibt benachrichtigungen wenn ein monat vor ablauf kein neues zertifikat für eine domain generiert wurde (siehe LE docs zum thema Expiration Emails). Das reine renewen der certs ist aber oft nicht die ganze story. Eventuell muss man mit deploy hooks auch noch die certs mit richtigen permissions irgendwo hin kopieren oder den server mit einem obskuren signal dazu anregen das cert und den private key neu zu laden. Dabei kann also doch noch einiges schief gehn.

Um dieses problem zu lösen haben wir jetzt einen sehr simplen monitoring cron job laufen der zwei kleine aber feine tricks verwendet.

Auf yxorp.parabox.it-syndikat.org haben wir in /etc/cron.daily/its-monitor-yxorp-tls:

#!/bin/sh
# Bitte bei aenderungen ins meta kopieren: https://meta.it-syndikat.org/t/2492
HC_URL=${HC_URL:-https://hc-ping.com/<uuid>}

set -e

check_tls () {
        # Check two weeks in the future to give us time to fix certs
        faketime +14days \
                openssl s_client -showcerts -verify_return_error "$@" \
                </dev/null
}

cronic () {
        if ! "$@" >/dev/null 2>/dev/null; then
                # Print output on error
                set -x
                "$@"
                printf '\n\n\n\n\n'
        fi
}

for af in -4 -6; do
        for connect in \
                it-syndikat.org:443 \
                www.it-syndikat.org:443 \
                meta.it-syndikat.org:443 \
                meta.it-syndikat.org:443 \
                \
                git.it-syndikat.org:443 \
                mailtrain.it-syndikat.org:443 \
                \
                it-syndik.at:443 \
                matrix.it-syndik.at:443 \
                riot.it-syndik.at:443 \
                1.riot.it-syndik.at:443 \
                2.riot.it-syndik.at:443 \
                3.riot.it-syndik.at:443 \
                \
                mail.it-syndikat.org:465 \
                mail.it-syndikat.org:993 \
                ;
        do
                cronic check_tls $af -connect $connect
        done

        cronic check_tls $af -starttls smtp -connect mail.it-syndikat.org:25
        cronic check_tls $af -starttls smtp -connect mail.it-syndikat.org:587

        #cronic check_tls $af -starttls imap -connect mail.it-syndikat.org:143
done

[ -z "$HC_URL" ] || curl -s -m 10 --retry 5 "$HC_URL" >/dev/null

Das script verwendet ganz einfach openssl s_client um die TLS verbindung zu testen. Per default gibt das jedoch keinen brauchbaren exit code her, die -verify_return_error stellt das um. Normalerweise würde dieses script jetzt genau dann schreien anfangen wenn auch jeder andere das problem schon im browser sieht. Mit dem faketime programm können wir aber s_client in die zukunft schicken und somit zeit bekommen das problem zu lösen.

So weit so gut. Zuletzt verwenden wir dann noch healthchecks.io um benachrichtigt zu werden wenn dieser cronjob nicht sauber durchläuft. Wir haben da ein projekt, aktuell werden @dxld und @gwrx benachrichtigt. Wer zugriff haben will bitte melden.

Auf matrix.parabox.it-syndikat.org läuft ein ähnliches script dass sich um *.it-syndik.at kümmert.

3 posts - 1 participant

Read full topic

Discourse und sekondäre Tor .onion services

(English below)

Der Tor hidden service für unser discourse scheint schon ne zeit lang nicht mehr funktioniert zu haben, seit irgendnem Discourse upgrade schickt das ding jetzt Content-Security-Policy header mit die “brav” mit default-deny resources von diversen pfaden nur von https://meta.it-syndikat.org erlauben. Das problem dabei is halt das beim onion service die URL dann ne andere is… das kann nicht funktionieren.

Der erste versuch das zu fixen war mit ner “multisite” config, wo man im config file discourse secondary hostnames angeben kann die auch erlaubt sind. Dafür haben wir in der discourse VM im /var/discourse/containers/app.yml jetzt:

hooks:
  [...]
  # Allow onion hidden service hostname as secondary hostname. We need
  # this so discourse sets the right CSP for the onion site. --DXLD
  before_bundle_exec:
    - file:
        path: $home/config/multisite.yml
        contents: |
         mainsite:
           adapter: postgresql
           database: discourse
           pool: 5
           timeout: 5000
           host_names:
             - meta.it-syndikat.org
             - meta.itsyndikatgcsfuh.onion

Das heißt zwar “multi” site, wir definieren hier aber nur eine. Das scheint so OK zu sein. Damit bekommt man dann vom onion service mal die richtigen hostnamen im CSP, aber die URL kommt leider wegen dem discourse force_ssl setting mit https: scheme, was bei onion nicht passt.

Wenn man das setting abschaltet kommen aber wieder diverse URLs auf der https://meta.it-syndikat.org als http: raus was dem browser da dann natürlich auch wieder nicht passt.

Wir haben dann ewig im Discourse sourcecode gegraben, es scheint wirklich keine möglichkeit zu geben das in beiden fällen richtig hin zu bekommen. Das zu patchen wäre leider auch ein größeres refactoring. Der code verwendet in manchen fällen das conditional: SiteSetting.force_https? ? "https" : "http" (siehe `lib/discourse.rb), in diesem kontext scheint man aber einfach nicht immer ein request in der hand zu haben aus dem man sich das richtige scheme holen könnte weil der common code zb. auch zum asynchronen email generieren verwendet wird wo man garnicht wirklich ein request in der hand hat.

Die “lösung” war dann den CSP header im onion fall einfach wegzuhauen und https URLs im response body zu rewriten. Siehe das etckeeper commit:

commit fc1a465bcc0ee8eb47c336bee93341062683ba7e (HEAD -> master)
Author: root <root@yxorp.parabox.it-syndikat.org>
Date:   Fri Jan 15 16:53:44 2021 +0100

    Fix meta onion service
    
    The Content-Security-Policy header is wrong for on the onion site. We tried
    to use a multisite.yml config with multiple host_names to get the correct
    urls in the header, while that works we still get https instead of http since
    discourse's force_ssl logic can't allow for a different scheme depending on
    the host.
    
    Disabling force_ssl has it's own problems, namely that we'll get mixed content
    warnings on https instead.
    
    To "fix" this mess we enable force_ssl, and on onion:
    
     - ignore the CSP header and
     - rewrite https://meta.*.onion to http://meta.*.onion in the html response
       bodies.

diff --git a/nginx/sites-available/meta.itsyndikatgcsfuh.onion b/nginx/sites-available/meta.itsyndikatgcsfuh.onion
index 9cad63f..fcecd29 100644
--- a/nginx/sites-available/meta.itsyndikatgcsfuh.onion
+++ b/nginx/sites-available/meta.itsyndikatgcsfuh.onion
@@ -18,5 +18,11 @@ server {
         proxy_set_header X-Real-IP         fd50:7012:7012:7012:7012:7012:7012:7012;
         proxy_set_header X-Forwarded-For   fd50:7012:7012:7012:7012:7012:7012:7012;
         proxy_max_temp_file_size 0;
+
+        proxy_hide_header Content-Security-Policy;
+
+        sub_filter 'https://meta.itsyndikatgcsfuh.onion'  'http://meta.itsyndikatgcsfuh.onion';
+        sub_filter_once off;
+        sub_filter_types text/html;
     }
 }

Leider hab ich kein nginx modul gefunden mit dem man das search/replace auch im CPS header machen kann.

2 posts - 1 participant

Read full topic