Portainer
Ce guide vous explique comment configurer l'authentification unique (SSO) entre VaultysHub et Portainer en utilisant OAuth2/OpenID Connect. Portainer Business Edition supporte nativement l'authentification OAuth.
Prérequis
- Portainer Business Edition (BE) version 2.11 ou supérieure
- Accès administrateur à Portainer
- Application configurée dans VaultysHub avec OpenID Connect
- Licence Portainer Business valide
Note : L'authentification OAuth n'est disponible que dans Portainer Business Edition. La version Community Edition (CE) ne supporte que l'authentification locale et LDAP.
Configuration dans VaultysHub
1. Créer l'application
- Connectez-vous à VaultysHub en tant qu'administrateur
- Allez dans Applications → Ajouter
- Créez une nouvelle application :
- Nom : Portainer
- URL :
https://portainer.example.com - Description : Gestion des conteneurs Docker/Kubernetes
- Icône : Choisissez l'icône Portainer
2. Configurer OpenID Connect
- Dans l'onglet Authentification
- Sélectionnez OpenID Connect
- Notez les informations :
- Client ID :
portainer-xxxxxx - Client Secret :
secret-xxxxxx - Issuer URL :
https://votre-smartlink.link.vaultys.org/api/oidc/[appid] - App ID :
[appid](identifiant unique de l'application dans VaultysHub)
- Client ID :
3. URLs de redirection
Ajoutez dans URLs de redirection autorisées :
https://portainer.example.com/
https://portainer.example.com/#!/auth
4. Scopes requis
openidprofileemail
Configuration dans Portainer
1. Accès aux paramètres d'authentification
- Connectez-vous à Portainer en tant qu'administrateur
- Allez dans Settings → Authentication
- Sélectionnez OAuth dans la méthode d'authentification
2. Configuration OAuth2/OpenID Connect
Configurez les paramètres OAuth :
Informations du provider
- Client ID :
portainer-xxxxxx(depuis VaultysHub) - Client secret :
secret-xxxxxx(depuis VaultysHub) - Authorization URL :
https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/auth - Access token URL :
https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/token - Resource URL :
https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/userinfo - Redirect URL :
https://portainer.example.com/(généré automatiquement) - Logout URL :
https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/logout - User identifier :
subouemail - Scopes :
openid profile email
Mapping des attributs
- Username :
email - Given name :
given_name - Family name :
family_name - Email :
email
3. Configuration avec Docker
Pour déployer Portainer avec la configuration OAuth :
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]/auth
- 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/api/oidc/[appid]/logout
- PORTAINER_OAUTH_USER_IDENTIFIER=sub
- PORTAINER_OAUTH_SCOPES=openid profile email
volumes:
portainer_data:
4. Configuration avec Kubernetes
Déploiement Helm pour 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]/auth"
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/api/oidc/[appid]/logout"
userIdentifier: "sub"
scopes: "openid profile email"
Gestion des rôles et permissions
Configuration des rôles automatiques
Portainer supporte plusieurs rôles : Administrator, Operator, User, et HelpDesk.
1. Création automatique d'utilisateurs
Dans Portainer, activez :
- Automatic user provisioning : ✅
- Default role for new users : User
2. Mapping des groupes vers les rôles
VaultysHub ne transmet pas les groupes de l'utilisateur : le mapping automatique des groupes vers les rôles n'est pas possible. Les nouveaux utilisateurs reçoivent le rôle par défaut ci-dessus, puis les rôles sont attribués directement dans Portainer.
Configuration des équipes
Pour organiser les utilisateurs en équipes :
- Settings → Teams
- Créez les équipes nécessaires
- Ajoutez-y les utilisateurs manuellement (l'affectation automatique par claim de groupe n'est pas disponible avec VaultysHub)
Permissions sur les endpoints
Configurez les accès aux différents environnements directement dans Portainer, en attribuant chaque environnement à des équipes ou à des utilisateurs.
Test de la configuration
1. Test de connexion initiale
- Déconnez-vous de Portainer
- Sur la page de connexion, cliquez sur Login with OAuth
- Vous êtes redirigé vers VaultysHub
- Authentifiez-vous avec vos identifiants VaultysHub
- Vous devez être connecté à Portainer
2. Vérification des permissions
# Via l'API Portainer
curl -X GET https://portainer.example.com/api/users/me \
-H "Authorization: Bearer YOUR_TOKEN"
# Réponse attendue
{
"Id": 2,
"Username": "john.doe",
"Role": 1,
"UserTheme": "",
"PortainerAuthorizations": {
"EndpointResourcesAccess": {...},
"PortainerResourcesAccess": {...}
}
}
3. Test avec Docker CLI
# Configuration du context Docker
docker context create portainer \
--docker "host=tcp://portainer.example.com:2376,ca=ca.pem,cert=cert.pem,key=key.pem"
# Utilisation
docker context use portainer
docker ps
Configuration des environnements
Ajout d'environnements Docker
- Environments → Add environment
- Choisissez le type :
- Docker Standalone
- Docker Swarm
- Kubernetes
- Azure Container Instances
- Docker via API
Configuration pour Docker Swarm
# docker-compose.yml pour l'agent Portainer
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
Configuration pour 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
Dépannage
Erreur "Invalid OAuth configuration"
Problème : La configuration OAuth n'est pas valide
Solution :
- Vérifiez tous les URLs (attention aux trailing slashes)
- Testez les endpoints :
curl https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/.well-known/openid-configuration
- Vérifiez les logs Portainer :
docker logs portainer
Erreur "User does not have access to any environment"
Problème : L'utilisateur est connecté mais n'a pas d'accès
Solution :
- Vérifiez les équipes de l'utilisateur dans Portainer
- Configurez les permissions d'endpoint
- Assignez un rôle par défaut aux nouveaux utilisateurs
Les groupes ne sont pas synchronisés
Problème : Les groupes VaultysHub ne sont pas mappés
Solution : c'est le comportement attendu. VaultysHub ne transmet pas les groupes : attribuez les rôles et les équipes directement dans Portainer.
Erreur de certificat SSL
Problème : Erreur SSL lors de la connexion OAuth
Solution :
- Utilisez des certificats valides (pas auto-signés)
- Pour les tests, désactivez temporairement la vérification :
environment:- PORTAINER_OAUTH_SSO_INSECURE_SKIP_VERIFY=true
- ⚠️ Ne jamais utiliser en production
Sécurité
Recommandations
- HTTPS obligatoire : Toujours utiliser HTTPS
- Isolation des environnements : Séparez prod/staging/dev
- RBAC strict : Utilisez les rôles appropriés
- Audit logs : Activez et surveillez les logs
- Rotation des secrets : Changez régulièrement les secrets OAuth
Configuration de sécurité renforcée
# Configuration sécurisée
environment:
# Désactiver l'authentification locale après configuration OAuth
- PORTAINER_AUTH_LOCAL_DISABLED=true
# Timeout de session
- PORTAINER_SESSION_TIMEOUT=8h
# Activer les logs d'audit
- PORTAINER_AUDIT_LOG=true
# Forcer HTTPS
- PORTAINER_HTTP_DISABLED=true
Limitation d'accès par IP
# Configuration Nginx pour limiter l'accès
location / {
# Autoriser uniquement certaines IPs
allow 10.0.0.0/8;
allow 192.168.1.0/24;
deny all;
proxy_pass https://portainer:9443;
proxy_set_header Host $host;
}
Configuration avancée
Intégration avec GitOps
# Configuration ArgoCD pour 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
Monitoring avec Prometheus
# Configuration des métriques
environment:
- PORTAINER_METRICS_ENABLED=true
- PORTAINER_METRICS_PORT=9090
# Scrape config Prometheus
scrape_configs:
- job_name: 'portainer'
static_configs:
- targets: ['portainer:9090']