Matrix Synapse Benutzer nach Authentik migrieren
Die Migration von Benutzern von Matrix Synapse nach Authentik kann mit dem folgenden Workflow durchgeführt werden. Hier werden die Daten von einer Postgres Datenbank in eine CSV-Datei exportiert und mit einem Python Script nach Authentik importiert.
Exportieren aller aktiven Benutzer
Mit dem SQL werden alle Benutzer exportiert, die die folgenden Kriterien erfüllen:
- Benutzer ist aktiv
- Benutzer besitzt eine E-Mail-Adresse
- Ist kein Appservice (Bridge Benutzer, wie Whatsapp, Telegram, etc.)
- Mit dem folgenden SQL alle Benutzer exportieren
SELECT DISTINCT u.name AS username, ut.address AS email FROM users u LEFT JOIN user_threepids ut ON u.name = ut.user_id AND ut.medium = 'email' WHERE deactivated = 0 AND appservice_id IS NULL AND ut.address IS NOT NULL ORDER BY u.name;
- Diese Liste muss in einer auf dem lokalen Desktop Rechner verfügbaren CSV-Datei gespeichert werden
Setzen der Berechtigungen in Authentik
Damit die Benutzer in Authentik importiert werden können, muss der Admin-Benutzer die korrekte Berechtigung erhalten.
- Mit dem Admin-Benutzer in Authentik anmelden
- Unter Verzeichnis > Benutzer den Admin-Benutzer editieren
- Den Tab "Permissions" auswählen und dort auf "Assign permission" anklicken
- Im neuen Dialog auf das + Symbol neben "Permission to add" klicken
- Nun nach "user" suchen und den Eintrag "Can add User" anhaken
- Auf Hinzufügen und anschließend auf Assign klicken
Erzeugen eines Auth Tokens
Im nächsten Schritt benötigen wir ein Auth Token, damit sich das Python Script mit Authentik authentifizieren und somit die API bedienen kann.
- In der Admin-Oberfläche von Authentik auf Verzeichnis > Tokens und App Passwörter klicken
- Auf Erstellen klicken
- In dem Dialog folgende Informationen eingeben / auswählen
Kennung, Benutzer auswählen (Admin Benutzer), Läuft ab am
- Nun auf Erstellen klicken und den Token über das Symbol in der entsprechenden neuen Zeile kopieren
Importieren der CSV-Benutzerliste
Das folgende Script liest die CSV-Datei aus und führt für jeden gefundenen Benutzer einen API-Call zum Hinzufügen aus.
Wichtig!
Den Benutzern wird ein zufällig generiertes Passwort zugewiesen. Da sie dieses nicht können, müssen sie bei der ersten Anmeldung an Authentik ein neues Passwort vergeben.
Script
Vor der Ausführung unbedingt die vier Werte konfigurieren.
DOMAIN = "example.com" # Replace with your domain
AUTHENTIK_URL = f"https://auth.{DOMAIN}" # Replace with your authentik URL
API_TOKEN = "" # Replace with your API token
CSV_FILE_PATH = "/full/path/to/csv/file" # Update with your actual CSV file path
Hier das vollständig Script:
import csv
import requests
import random
import string
# --- Configuration for authentik API ---
DOMAIN = "example.com" # Replace with your domain
AUTHENTIK_URL = f"https://auth.{DOMAIN}" # Replace with your authentik URL
API_TOKEN = "" # Replace with your API token
CSV_FILE_PATH = "/full/path/to/csv/file" # Update with your actual CSV file path
headers = {
"Authorization": f"Bearer {API_TOKEN}",
'Accept': 'application/json',
"Content-Type": "application/json",
}
# A helper function to generate a temporary password
def generate_temp_password(length=12):
return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
with open(CSV_FILE_PATH, newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
# Assuming the CSV has columns 'username' and 'email'
username = row.get("username").replace('@', '').replace(f":{DOMAIN}", '')
email = row.get("email")
temp_password = generate_temp_password()
# Build the user payload for authentik
user_data = {
"username": username,
"name": username,
"email": email,
"password": temp_password,
"is_active": True,
"groups": [],
"attributes": {},
"path": "string",
"type": "internal",
}
# Adjust the API endpoint URL according to your authentik version and configuration
url = f"{AUTHENTIK_URL}/api/v3/core/users/"
response = requests.post(url, json=user_data, headers=headers)
if response.status_code in (200, 201):
print(f"Created user {username} in authentik.")
else:
print(f"Failed to create user {username}: {response.status_code} - {response.text}")
No Comments