K.inc Tec Blog

Mein kleines EDV Logbuch

AzureAD SAML und Conditional Access

In diesem Artikel wird die Authentifikation über AzureAD SAML Single Sign On beschrieben und wie man die Zugriffsberechtigungen hierzu auf Gruppen einschränkt. Zusätzlich wird die Möglichkeit zur Authentifizierung per Conditional Access auf IP-Ebene eingeschränkt.

Microsoft weist inzwischen darauf hin, dass man für neue Projekte die Microsoft Identity Platform verwenden soll. Das ist dan OpenID oder OAuth.

Wir benötigen einen AzureAD Admin mit entsprechenden Zugriffsrechten auf die folgenden Portale:

  • portal.azure.com
  • admin.microsoft.com

Das Portal admin.microsoft.com erreicht man auch über portal.office.com und dann links über das Symbol Admin.

Als erstes eine kleine Empfehlung: belasst das Portal portal.azur.com und admin.office.com auf Englisch. Die Übersetzung ist maximal schlecht. Meine Meinung.

SAML Dienst erstellen

Portal: aad.portal.azure.com

Unter Enterprise Applications eine neue Applikation erstellen.

In der rechten Seitenleiste einen sinnvollen Namen vergeben und Non-gallery Application erstellen:

Die neue Applikation findet man nun in der Liste aller Applikationen oder man sucht alternativ nach dem eben vergebenen Namen. Mit einem Klick auf den Namen gelangt man in das Konfigurationsmenu für unsere neue Applikation.

Hier wählen wir nun den Punkt Single Sign On->SAML

Etwas Theorie: SAML funktioniert über REST-Endpunkte. Der Dienst, für den man die SAML Authentifikation aufetzt, liefert normalerweise ein sogenanntes Metadata File in XML-Format. In der Datei sind die Endpunkte und das Zertifikat der gegenseite hinterlegt. Man kann diese Datei nun einfach in unsere AzureAD Applikation importieren. Dazu klicken wir oben auf „Upload metadata file“.

Wählt man die Datei aus erscheint rechts ein neuer Dialog, in dem man die Daten nochmal überprüfen kann. Im Normalfall kann man hier einfach oben auf „Save“ klicken.

Attribute und Claims

Der Dienst kann aus dem AzureAD bestimmte Attribute abfragen, bzw. diese werden beim einer Authentifizierung einfach mitgeliefert. Wenn also die Authentifizierung eines Benutzers über SAML erfolgreich ist, werden die hier definierten Attribute an den Dienst geliefert. Der Dienst sagt normalerweise über Hilfeseiten oder den Support an, welche Attribute benötigt werden. Das wichtigste Attribut ist hier der Unique User Identifier. Man verwendet normalerweise entweder den Userprincipalname (UPN) oder die E-Mail Adresse. Der UPN ist vorausgewählt. Wir ändern beispielhaft auf die E-Mail-Adresse.

Wir ändern den Wert user.principalname, indem wir auf das Feld klicken und aus der vorgegebenen Liste user.mail auswählen. Dann oben auf „Save“ klicken:

Metadata File

https://learn.microsoft.com/de-de/azure/active-directory/azuread-dev/azure-ad-federation-metadata

Die Gegenseite benötigt nun unser Metadata File. Die Datei kann man einfach unter Download Metadata File runterladen. Sie liegt im XML-Format vor.

Man kann dem Dienst auch noch das Base64-Zertifikat, die LoginURL, den AzureAD Identifier und die LogoutURL mitgeben. Damit könnte der Dienst seine Seite auch ohne Metadata File von uns konfigurieren (z.B. falls er die nicht importieren kann).

Zugriff auf bestimmte Benutzer beschränken

1. Benutzerquelle aus onPremise AD per AzureAD Connect

AzureAD Connect->Synchronisierungsoptionen anpassen->Kontodaten eingeben->Verzeichnis auswählen

Es werden nun die Active Directory OU’s angezeigt. Hier die OU’s auswählen, deren Benutzer/Gruppen mit dem AzureAD synchronisiert werden sollen.

ACHTUNG: AzureAD unterstützt keine verschachtelten Gruppen. Stand 2022.

2. Benutzerquelle direkt über AzureAD

Portal: admin.microsoft.com

3. Zugriff auf AzureAD Applikation einschränken

Die benötigten Daten sind nun durch die obige Konfiguration im AzureAD verfügbar. Wir wählen die AzureAD Applikation aus und wählen dort:

Users and Groups->Add user/group

Rechts geht die Liste der verfügbaren Benutzer und Gruppen auf. Hier einfach die entsprechende Auswahl treffen.

Conditional Access Location einrichten

Portal: azure.mocrosoft.com

Pfad: Azure Active Directory > Security > Conditional Access > Named Locations

https://www.penthara.com/configuring-conditional-access-policy-to-restrict-access-from-specific-ip-or-location/

https://learn.microsoft.com/en-us/azure/active-directory/conditional-access/location-condition

Azure Active Directory > Security > AzureAD Conditional Access > Named locations

Auf „+IP ranges location“ klicken. Es geht rechts eine neue Eingabemaske auf.

Wenn wir ein vertrauenswürdiges Netz einrichten wollen, den Haken für „Mark as trusted location“ setzen. Dann einen Namen für das Netz vergeben, z.B. „Trusted Location Branch Office 1“. Unten auf das + klicken und die entsprechenden Netzbereiche eingeben. Wenn es nur eine IP ist, wird trotzdem eine Netzmaske verlangt. Wir geben dann IP/32 ein und speichern alles.

Damit haben wir die Conditional Access Location konfiguriert. Im nächsten Schritt verknüpfen wir die Location mit dem Dienst.

MFA Trusted IP’s

Portal: portal.azure.com

Pfad: Azure Active Directory > Security > Conditional Access > Named Locations

Eine Conditional Access Policy setzt normalerweise mindestens einen weiteren Sicherheitsfaktor voraus, meist Multi Factor Authentication. Um das zu umgehend Setzen die IP’s auch als MFA Trusted IP’s.

Conditional Access Policy für SAML Dienst einrichten

Portal: portal.azure.com

Wir wählen in der linken Spalte „Enterprise Applications“. Es werden alle Applikationen aufgelistet, die wir im Tenant konfiguriert haben. Wir wählen nun die App aus, für die wir den Conditional Access einrichten wollen. Dann wählen wir im Bereich Security „Conditional Access“ und klicken auf „+New policy“.

Folgende Informationen werden für eine Contitional Access Policy benötigt:

  • Ein Name für die Policy
  • Welchen Benutzern die Policy zugewiesen wird
  • Die Anwendung, der die Policy zugewiesen wird
  • Die Konditionen (Conditions, z.B. IP’s)
  • Access Control über Grant oder Session Block

Folgendes sollte man außerdem beachten:

  • Nie alle Benutzer in eine Policy einschließen. Es sollte sogenannte Break Glass Benutzer geben, die Zugreifen können, falls man sich über eine Fehlkonfiguration ausgeschlossen hat.
  • Die Richtlinie nie direkt aktivieren, sondern erst über Report-only prüfen was passiert.
Wir vergeben einen Namen, klicken auf Conditions->Locations->Configure: Yes und wählen die im obigen Abschnitt konfigurierten Locations. ACHTUNG: unten die Policy aktivieren, sonst wird nur berichtet was passieren würde, wenn man die Policy aktiviert hätte.

Wir bauen uns nun eine Deny-Regel. Wir blockieren also alle Locations, bis auf die oben spezifizierten Locations. Diese Regel wenden wir auf alle Benutzer an, bis auf die Break Glass Benutzer und evtl. spezielle Admins.

Users or workload identities

Include: All users

Exclude: Break Glass und Admins

Cloud apps or actions

Die SAML App auswählen

Conditions

Locations -> Include: Any location

Locations -> Exclude: Selected Locations (hier die Locations auswählen, die wir erlauben wollen)

Access Control

Block access

Pizza

Teig

1g Hefe auf 500g

24 Std ziehen lassen

ca 300 ml Wasser (bis alles Mehl in der Teigmasse aufgeht)

Mit Mixer mixen, bis man den Teig ohne Verkleben vom Schüsselrand lösen kann.

Wenn der Teig schneller gehen muss 1pkg. Hefe benutzen

Evtl. 2 TL Salz

Tomatensoße (kalt)

Dose Schältomaten

(viel) Knoblauch

Salz

Pfeffer

etwas Zucker

Basilikum

Oregano

Linsensuppe

Hmm ich weiss nicht die mengen genau, aber so ca 200, 250 gram linsen, 2 mittel bis größe Karotten und min 2 Stange Selerie. Abhängig von linsen, einige muss man mehrere stunden einweichen…..dan zwiebeln und knobi karotte und selerie im öl anbraten….zu letzt linsen rein wasser bis zum ende linsen und 40min kochen….das ist für braune linsen, rote passen nicht gut…salz pfeffer ca….und am.ende mit balsamiko im teller geniessen🙂

Kartoffelgratin

https://www.chefkoch.de/rezepte/837601188560864/Kartoffelgratin.html?portionen=4

1.000 g Kartoffeln, vorwiegend festkochend
¼ Liter Milch
¼ Liter Rahm (süße Sahne)
2 Knoblauchzehe(n)
Salz und Pfeffer
Rosmarin
Butter für die Form
6 EL Käse, frisch geriebener (z. B. Parmesan oder Pecorino)

Zubereitung

Die Kartoffeln schälen und in dünne Scheiben (ca. 2 mm) schneiden.

Milch und Rahm vermischen, Knoblauch fein gehackt oder gepresst dazugeben. Etwas Salz und Pfeffer sowie Rosmarin beifügen und mit den Kartoffelscheiben sanft aufkochen lassen, dann unter häufigem vorsichtigem Rühren ca. 10 Minuten köcheln lassen.

Eine Auflaufform mit Butter ausstreichen, die Kartoffelmasse einfüllen und mit Käse bestreuen.

Im vorgeheizten Ofen bei 220 °C Ober-/Unterhitze ca. 15 – 20 Minuten überbacken.

Okroschka

https://www.chefkoch.de/rezepte/2060241333351072/Die-beste-Okroschka-nach-Mamas-Rezept.html

Zutaten

1 Ring/e Fleischwurst (Geflügel-), fein gewürfelt
6 m.-große Kartoffel(n), gekocht und gewürfelt
5 Ei(er), gekocht und gewürfelt
1 Bund Radieschen, geraspelt
1 Gurke(n), geraspelt
½ Bund Petersilie, fein gehackt
½ Bund Dill, fein gehackt
3 Frühlingszwiebel(n), in feine Ringe geschnitten
1 Becher Schmand
1 Becher saure Sahne
1 Becher Buttermilch
1 EL, gestr. Senf
etwas Zitronensaft
1 ½ Liter Mineralwasser, mit Kohlensäure, gekühlt
Salz und Pfeffer

Zubereitung

Die Kartoffeln gar und die Eier hart kochen und richtig abkühlen lassen. Oft mache ich das schon am Vortag.
Die Geflügelfleischwurst, das Gemüse und die Kräuter wie oben beschrieben würfeln bzw. raspeln. Dabei genau daran halten, ob gewürfelt oder geraspelt, das macht meines Erachtens nach sehr viel aus.
Alle Zutaten in eine große Schüssel oder einen großen Topf (auf jeden Fall mit Deckel) geben und Schmand, saure Sahne und Buttermilch, Senf und Zitronensaft dazugeben und vorsichtig umrühren. Dann mit dem kalten Mineralwasser aufgießen, bis die gewünschte Dicke erreicht ist. Eine 1,5 l Flasche braucht man dabei mindestens, meist werden es 2 l. Am Ende dann mit Salz und Pfeffer abschmecken.
Am besten schmeckt die Suppe, wenn sie einige Stunden gut durchgezogen ist und am zweiten Tag sowieso am besten. Sie ist gut 3 Tage im Kühlschrank haltbar und die beste Lösung für heiße Sommertage. Sehr erfrischend, vor allem, da man so viel Flüssigkeit zu sich nimmt. Vegetarier können die Fleischwurst einfach weglassen.

Das Rezept kenne ich so, seit ich klein bin von meiner Mama und es ist seitdem absolutes Lieblingsessen.
Richtig ausgesprochen wird der Name der Suppe „Akroschka“.

Powershell als Systembenutzer ausführen

Das Ausführen von Powershell Befehlen mit dem Systemkonto erreicht man am besten mit PsExec aus der Sysinternals Suite, die inzwischen zu Microsoft gehört:

Start-Process -FilePath cmd.exe -Verb Runas -ArgumentList ‘/k C:\tools\PsExec.exe -i -s powershell.exe’

https://www.heise.de/download/product/sysinternals-suite-48696

Nginx unter MotionEyeOS installieren

Nginx von Raspbian kopieren

https://wiki.satria.de/index.php?title=MotionEyeOS

Da MotionEyeOs gut gegen Schreibzugriffe gesichert ist und auch kein apt nutzt, muss man etwas kreativ werden. Glücklicherweise ist Nginx nur ein kleines Paket und kann leicht von Raspbian kopiert werden.

Folgende Dateien werden benötigt:

/etc/nginx/nginx.conf
/etc/nginx/*
/usr/lib/libpcre.so.3.13.3 plus Symlink auf /usr/lib/libpcre.so.3
/usr/sbin/nginx
/var/lib/nginx/ (Ordner muss nur angelegt werden. Berechtigung muss für www-data vergeben werden, damit nginx dort temporäre Dateien speichern kann. Mit chown www-data:root /var/lib/nginx/)
/var/log/nginx/ (Ordner muss nur angelegt werden)

Schreibzugriff auf das Dateisystem

Dateisystem:

mount -o remount,rw / 

Bootpartition:

mount -o remount,rw /boot

Nginx Konfiguration

server {
  listen 80;
  listen [::]:80;

  listen              443 ssl;
  ssl_certificate     /etc/nginx/ssl/example.crt;
  ssl_certificate_key /etc/nginx/ssl/example.key;
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;

  server_name example.com;

  location / {
      proxy_pass http://localhost:8080/;
      proxy_cache off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
  }
}

SSL Zertifikat mit OpenSSL erzeugen

Siehe OpenSSL Befehlsübersicht

Init.d Script anlegen

Das mit Raspbian gelieferte Bootscript ist zu komplex, daher nutzen wir für MotionEyeOs das folgende.

/etc/init.d/S89nginx

case "$1" in
  start)
    echo Starting nginx...
    /usr/sbin/nginx
    ;;
  stop)
    echo Terminating all nginx instances...
    killall nginx
    ;;
  *)
    echo "Usage: /etc/init.d/nginx {start|stop}"
    exit 1
    ;;
esac

exit 0

Linux IP Änderung an E-Mail senden via Python Script

#!/usr/bin/env python2
import os
import urllib2
import smtplib
import time

from datetime import datetime
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

site= "https://api.ipify.org"
hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
       'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
       'Accept-Encoding': 'none',
       'Accept-Language': 'en-US,en;q=0.8',
       'Connection': 'keep-alive'}

req = urllib2.Request(site, headers=hdr)

current_ip = ""

while (True):
        fqn = os.uname()[1]
        external_ip = urllib2.urlopen(req).read()

        #print(external_ip)
        if current_ip != external_ip:
                current_ip = external_ip
                fromaddr = "FROMADDR"
                toaddr = "TOADDR"
                msg = MIMEMultipart()
                msg['From'] = fromaddr
                msg['To'] = toaddr
                msg['Subject'] = "IP Address change"
                body = 'A new IP has been detected: %s' % str(external_ip)
                msg.attach(MIMEText(body, 'plain'))
                server = smtplib.SMTP('mail.domain.de', 587)
                server.starttls()
                server.login(fromaddr, "Passwort")
                text = msg.as_string()
                server.sendmail(fromaddr, toaddr, text)
                server.quit()
        time.sleep(600)

Nginx als ReverseProxy

Basiskonfiguration

server {
  listen 80;
  listen [::]:80;

  server_name example.com;

  location / {
      proxy_pass http://localhost:8080/;
  }
}

SSL

server {
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ...
}

Websockets

https://www.nginx.com/blog/websocket-nginx/

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;

Linux Zeitzone ändern

Die Systemzeit wird konfiguriert, indem der Symlink /etc/localtime gegen eine Binärdatei mit dem Zeitzonen-Indentifier im Verzeichnis /usr/share/zoneinfo erzeugt wird. Also einfach auf eine andere Datei linken.

Seite 3 von 24

Präsentiert von WordPress & Theme erstellt von Anders Norén