Zum Hauptinhalt springen

Portainer

Dieser Leitfaden erklärt, wie man die Single Sign-On (SSO)-Authentifizierung zwischen SmartLink und Portainer mithilfe von OAuth2/OpenID Connect konfiguriert. Die Portainer Business Edition unterstützt die OAuth-Authentifizierung nativ.

Voraussetzungen

  • Portainer Business Edition (BE) Version 2.11 oder höher
  • Administratorzugriff auf Portainer
  • Anwendung in SmartLink mit OpenID Connect konfiguriert
  • Gültige Portainer Business-Lizenz

Hinweis: Die OAuth-Authentifizierung ist nur in der Portainer Business Edition verfügbar. Die Community Edition (CE) unterstützt nur die lokale und LDAP-Authentifizierung.

1. Anwendung erstellen

  1. Melden Sie sich als Administrator bei SmartLink an
  2. Gehen Sie zu AnwendungenHinzufügen
  3. Erstellen Sie eine neue Anwendung:
    • Name: Portainer
    • URL: https://portainer.example.com
    • Beschreibung: Verwaltung von Docker/Kubernetes-Containern
    • Symbol: Wählen Sie das Portainer-Symbol aus

2. OpenID Connect konfigurieren

  1. Im Tab Authentifizierung
  2. Wählen Sie OpenID Connect
  3. Notieren Sie die Informationen:
    • Client-ID: portainer-xxxxxx
    • Client-Geheimnis: secret-xxxxxx
    • Issuer-URL: https://votre-smartlink.link.vaultys.org/api/oidc/[appid]
    • App-ID: [appid] (eindeutige Kennung der Anwendung in SmartLink)

3. Erlaubte Umleitungs-URLs

Fügen Sie in Erlaubte Umleitungs-URLs hinzu:

https://portainer.example.com/
https://portainer.example.com/#!/auth

4. Erforderliche Scopes

  • openid
  • profile
  • email
  • groups (für das Zuordnen von Rollen)

Konfiguration in Portainer

1. Zugriff auf Authentifizierungseinstellungen

  1. Melden Sie sich als Administrator bei Portainer an
  2. Gehen Sie zu EinstellungenAuthentifizierung
  3. Wählen Sie OAuth als Authentifizierungsmethode

2. OAuth2/OpenID Connect konfigurieren

Konfigurieren Sie die OAuth-Parameter:

Anbieterinformationen

  • Client-ID: portainer-xxxxxx (von SmartLink)
  • Client-Geheimnis: secret-xxxxxx (von SmartLink)
  • Autorisierungs-URL: https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/authorize
  • Zugriffstoken-URL: https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/token
  • Ressourcen-URL: https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/userinfo
  • Umleitungs-URL: https://portainer.example.com/ (automatisch generiert)
  • Abmelde-URL: https://votre-smartlink.link.vaultys.org/logout
  • Benutzeridentifikator: sub oder email
  • Scopes: openid profile email groups

Attributzuordnung

  • Benutzername: email
  • Vorname: given_name
  • Nachname: family_name
  • E-Mail: email
  • Gruppen: groups

3. Konfiguration mit Docker

Um Portainer mit der OAuth-Konfiguration bereitzustellen:

version: '3.8'

services:
portainer:
image: portainer/portainer-ee:latest
container_name: portainer
restart: unless-stopped
ports:
- "9443:9443"
- "8000:8000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
command: >
--http-disabled
--ssl-cert /certs/cert.pem
--ssl-key /certs/key.pem
environment:
- PORTAINER_OAUTH_CLIENT_ID=portainer-xxxxxx
- PORTAINER_OAUTH_CLIENT_SECRET=secret-xxxxxx
- PORTAINER_OAUTH_AUTH_URL=https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/authorize
- PORTAINER_OAUTH_TOKEN_URL=https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/token
- PORTAINER_OAUTH_RESOURCE_URL=https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/userinfo
- PORTAINER_OAUTH_REDIRECT_URL=https://portainer.example.com/
- PORTAINER_OAUTH_LOGOUT_URL=https://votre-smartlink.link.vaultys.org/logout
- PORTAINER_OAUTH_USER_IDENTIFIER=sub
- PORTAINER_OAUTH_SCOPES=openid profile email groups

volumes:
portainer_data:

4. Konfiguration mit Kubernetes

Helm-Bereitstellung für Portainer:

# values.yaml
image:
repository: portainer/portainer-ee
tag: latest

service:
type: LoadBalancer
httpPort: 9000
httpsPort: 9443

persistence:
enabled: true
size: 10Gi

oauth:
enabled: true
clientId: "portainer-xxxxxx"
clientSecret: "secret-xxxxxx"
authorizationURL: "https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/authorize"
accessTokenURL: "https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/token"
resourceURL: "https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/userinfo"
redirectURL: "https://portainer.example.com/"
logoutURL: "https://votre-smartlink.link.vaultys.org/logout"
userIdentifier: "sub"
scopes: "openid profile email groups"

Rollen- und Berechtigungsverwaltung

Konfiguration automatischer Rollen

Portainer unterstützt mehrere Rollen: Administrator, Operator, Benutzer und HelpDesk.

1. Automatische Benutzerbereitstellung

Aktivieren Sie in Portainer:

  • Automatische Benutzerbereitstellung: ✅
  • Standardrolle für neue Benutzer: Benutzer

2. Zuordnung von Gruppen zu Rollen

In den OAuth-Einstellungen von Portainer:

{
"group_mappings": [
{
"group": "portainer-admins",
"role": "Administrator"
},
{
"group": "portainer-operators",
"role": "Operator"
},
{
"group": "portainer-users",
"role": "Benutzer"
},
{
"group": "portainer-helpdesk",
"role": "HelpDesk"
}
]
}

Teamkonfiguration

Um Benutzer in Teams zu organisieren:

  1. EinstellungenTeams
  2. Erstellen Sie Teams, die den SmartLink-Gruppen entsprechen
  3. Konfigurieren Sie die automatische Zuordnung:
    • Teammitgliedschaftsanbieter: OAuth
    • Gruppenanspruch: groups
    • Teamzuweisung: Automatisch

Berechtigungen für Endpunkte

Konfigurieren Sie den Zugriff auf verschiedene Umgebungen:

# Konfiguration von Berechtigungen pro Endpunkt
endpoints:
- name: Produktion
groups:
- portainer-prod-admins: Administrator
- portainer-prod-users: Benutzer

- name: Staging
groups:
- portainer-dev-team: Administrator
- portainer-qa-team: Benutzer

- name: Entwicklung
groups:
- portainer-developers: Administrator

Konfigurationstest

1. Test der Erstverbindung

  1. Melden Sie sich von Portainer ab
  2. Klicken Sie auf der Anmeldeseite auf Mit OAuth anmelden
  3. Sie werden zu SmartLink weitergeleitet
  4. Melden Sie sich mit Ihren SmartLink-Anmeldeinformationen an
  5. Sie sollten bei Portainer angemeldet sein

2. Überprüfung der Berechtigungen

# Über die Portainer-API
curl -X GET https://portainer.example.com/api/users/me \
-H "Authorization: Bearer IHR_TOKEN"

# Erwartete Antwort
{
"Id": 2,
"Username": "john.doe",
"Role": 1,
"UserTheme": "",
"PortainerAuthorizations": {...}
}

3. Test mit Docker CLI

# Docker-Context-Konfiguration
docker context create portainer \
--docker "host=tcp://portainer.example.com:2376,ca=ca.pem,cert=cert.pem,key=key.pem"

# Verwendung
docker context use portainer
docker ps

Umgebungsconfiguration

Hinzufügen von Docker-Umgebungen

  1. UmgebungenUmgebung hinzufügen
  2. Wählen Sie den Typ aus:
    • Docker Standalone
    • Docker Swarm
    • Kubernetes
    • Azure Container Instances
    • Docker über API

Konfiguration für Docker Swarm

# docker-compose.yml für den Portainer-Agent
version: '3.8'

services:
agent:
image: portainer/agent:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]

networks:
agent_network:
driver: overlay
attachable: true

Konfiguration für Kubernetes

# portainer-agent-k8s.yaml
apiVersion: v1
kind: Namespace
metadata:
name: portainer
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: portainer-sa-clusteradmin
namespace: portainer
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: portainer-crb-clusteradmin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: portainer-sa-clusteradmin
namespace: portainer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: portainer-agent
namespace: portainer
spec:
selector:
matchLabels:
app: portainer-agent
template:
metadata:
labels:
app: portainer-agent
spec:
serviceAccountName: portainer-sa-clusteradmin
containers:
- name: portainer-agent
image: portainer/agent:latest
ports:
- containerPort: 9001
protocol: TCP

Fehlerbehebung

Fehler "Ungültige OAuth-Konfiguration"

Problem: Die OAuth-Konfiguration ist ungültig

Lösung:

  1. Überprüfen Sie alle URLs (achten Sie auf abschließende Schrägstriche)
  2. Testen Sie die Endpunkte:
    curl https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/.well-known/openid-configuration
  3. Überprüfen Sie die Portainer-Logs:
    docker logs portainer

Fehler "Benutzer hat keinen Zugriff auf eine Umgebung"

Problem: Der Benutzer ist angemeldet, hat aber keinen Zugriff

Lösung:

  1. Überprüfen Sie die Gruppen des Benutzers in SmartLink
  2. Konfigurieren Sie die Endpunktberechtigungen
  3. Weisen Sie neuen Benutzern eine Standardrolle zu

Gruppen werden nicht synchronisiert

Problem: Die SmartLink-Gruppen werden nicht zugeordnet

Lösung:

  1. Stellen Sie sicher, dass der Scope groups angefordert wird
  2. Testen Sie die UserInfo-Antwort:
    curl -H "Authorization: Bearer TOKEN" \
    https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/userinfo
  3. Überprüfen Sie das Gruppenformat (muss ein Array sein)

SSL-Zertifikatfehler

Problem: SSL-Fehler bei der OAuth-Verbindung

Lösung:

  1. Verwenden Sie gültige Zertifikate (keine selbstsignierten)
  2. Deaktivieren Sie vorübergehend die Überprüfung für Tests:
    environment:
    - PORTAINER_OAUTH_SSO_INSECURE_SKIP_VERIFY=true
  3. ⚠️ Niemals in der Produktion verwenden

Sicherheit

Empfehlungen

  1. Zwingendes HTTPS: Immer HTTPS verwenden
  2. Isolierung der Umgebungen: Prod/Staging/Dev trennen
  3. Strenge RBAC: Geeignete Rollen verwenden
  4. Audit-Logs: Aktivieren und überwachen Sie die Logs
  5. Geheimnisrotation: Ändern Sie die OAuth-Geheimnisse regelmäßig

Verstärkte Sicherheitskonfiguration

# Sichere Konfiguration
environment:
# Deaktivieren der lokalen Authentifizierung nach der OAuth-Konfiguration
- PORTAINER_AUTH_LOCAL_DISABLED=true
# Session-Timeout
- PORTAINER_SESSION_TIMEOUT=8h
# Audit-Logs aktivieren
- PORTAINER_AUDIT_LOG=true
# HTTPS erzwingen
- PORTAINER_HTTP_DISABLED=true

Zugriffsbeschränkung nach IP

# Nginx-Konfiguration zur Beschränkung des Zugriffs
location / {
# Nur bestimmte IPs zulassen
allow 10.0.0.0/8;
allow 192.168.1.0/24;
deny all;

proxy_pass https://portainer:9443;
proxy_set_header Host $host;
}

Erweiterte Konfiguration

Integration mit GitOps

# ArgoCD-Konfiguration für Portainer
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: portainer
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/portainer/k8s
targetRevision: HEAD
path: charts/portainer
helm:
values: |
oauth:
enabled: true
clientId: portainer-xxxxxx
clientSecret: secret-xxxxxx

Überwachung mit Prometheus

# Metrikkonfiguration
environment:
- PORTAINER_METRICS_ENABLED=true
- PORTAINER_METRICS_PORT=9090

# Scrape-Konfiguration Prometheus
scrape_configs:
- job_name: 'portainer'
static_configs:
- targets: ['portainer:9090']

Ressourcen