Aller au contenu principal

GitLab

Ce guide vous explique comment configurer l'authentification unique (SSO) entre VaultysHub et GitLab. GitLab supporte à la fois OpenID Connect et SAML2 - nous recommandons OpenID Connect pour sa simplicité.

Prérequis​

  • GitLab CE/EE version 11.4+ (pour OpenID Connect)
  • GitLab CE/EE version 9.0+ (pour SAML2)
  • Accès administrateur à GitLab
  • Application configurée dans VaultysHub

Configuration avec OpenID Connect (Recommandé)​

Configuration dans VaultysHub​

1. Créer l'application​

  1. Connectez-vous à VaultysHub en tant qu'administrateur
  2. Allez dans Applications → Ajouter
  3. Créez une nouvelle application :
    • Nom : GitLab
    • URL : https://gitlab.example.com
    • Description : Plateforme DevOps GitLab
    • Icône : Choisissez l'icône GitLab

2. Configurer OpenID Connect​

  1. Dans l'onglet Authentification
  2. Sélectionnez OpenID Connect
  3. Notez les informations :
    • Client ID : gitlab-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)

3. URLs de redirection​

Ajoutez dans URLs de redirection autorisées :

https://gitlab.example.com/users/auth/openid_connect/callback

4. Scopes requis​

  • openid
  • profile
  • email

Configuration dans GitLab​

1. Configuration Omnibus (gitlab.rb)​

Éditez /etc/gitlab/gitlab.rb :

### Configuration OpenID Connect avec VaultysHub ###

gitlab_rails['omniauth_enabled'] = true
gitlab_rails['omniauth_allow_single_sign_on'] = ['openid_connect']
gitlab_rails['omniauth_sync_email_from_provider'] = 'openid_connect'
gitlab_rails['omniauth_sync_profile_from_provider'] = ['openid_connect']
gitlab_rails['omniauth_sync_profile_attributes'] = ['name', 'email']
gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'openid_connect'
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_user'] = ['openid_connect']

gitlab_rails['omniauth_providers'] = [
{
name: "openid_connect",
label: "VaultysHub SSO",
icon: "https://votre-smartlink.example.com/logo.png",
args: {
name: "openid_connect",
scope: ["openid", "profile", "email"],
response_type: "code",
issuer: "https://votre-smartlink.link.vaultys.org/api/oidc/[appid]",
discovery: true,
discovery_endpoint: "https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/.well-known/openid-configuration",
client_auth_method: "query",
uid_field: "sub",
send_scope_to_token_endpoint: "false",
pkce: true,
client_options: {
identifier: "gitlab-xxxxxx",
secret: "secret-xxxxxx",
redirect_uri: "https://gitlab.example.com/users/auth/openid_connect/callback"
}
}
}
]

# Options complémentaires (optionnel)
gitlab_rails['omniauth_external_providers'] = ['openid_connect']
gitlab_rails['omniauth_allow_bypass_two_factor'] = ['openid_connect']

2. Configuration Docker​

Pour GitLab Docker, utilisez les variables d'environnement :

version: '3.8'
services:
gitlab:
image: gitlab/gitlab-ee:latest
environment:
GITLAB_OMNIBUS_CONFIG: |
gitlab_rails['omniauth_enabled'] = true
gitlab_rails['omniauth_allow_single_sign_on'] = ['openid_connect']
gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'openid_connect'
gitlab_rails['omniauth_providers'] = [
{
name: "openid_connect",
label: "VaultysHub SSO",
args: {
name: "openid_connect",
scope: ["openid", "profile", "email"],
response_type: "code",
issuer: "https://votre-smartlink.link.vaultys.org/api/oidc/[appid]",
discovery: true,
discovery_endpoint: "https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/.well-known/openid-configuration",
uid_field: "sub",
client_options: {
identifier: "${OIDC_CLIENT_ID}",
secret: "${OIDC_CLIENT_SECRET}",
redirect_uri: "https://gitlab.example.com/users/auth/openid_connect/callback"
}
}
}
]

3. Appliquer la configuration​

# Pour Omnibus
gitlab-ctl reconfigure
gitlab-ctl restart

# Pour Docker
docker-compose up -d

Synchronisation des groupes​

VaultysHub ne transmet pas les groupes de l'utilisateur (pas de scope ni de claim groups). Les groupes GitLab sont donc gérés directement dans GitLab.

Configuration avec SAML2​

Configuration dans VaultysHub​

1. Configurer SAML2​

  1. Dans l'application GitLab
  2. Onglet Authentification → SAML2
  3. Configurez :
    • Entity ID : https://gitlab.example.com
    • ACS URL : https://gitlab.example.com/users/auth/saml/callback
    • Format NameID : emailAddress

2. Télécharger les métadonnées​

Téléchargez ou notez :

  • Métadonnées IdP : https://votre-smartlink.link.vaultys.org/api/saml2/metadata/[appid]
  • Certificat X.509
  • SSO URL : https://votre-smartlink.link.vaultys.org/api/saml2/sso/[appid]

La déconnexion unique (Single Logout) depuis VaultysHub n'est pas prise en charge.

Configuration dans GitLab​

# Dans /etc/gitlab/gitlab.rb

gitlab_rails['omniauth_enabled'] = true
gitlab_rails['omniauth_allow_single_sign_on'] = ['saml']
gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'saml'
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_auto_link_saml_user'] = true

gitlab_rails['omniauth_providers'] = [
{
name: "saml",
label: "VaultysHub SSO",
args: {
assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
idp_cert: "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
idp_sso_target_url: "https://votre-smartlink.link.vaultys.org/api/saml2/sso/[appid]",
idp_metadata_url: "https://votre-smartlink.link.vaultys.org/api/saml2/metadata/[appid]",
issuer: "https://gitlab.example.com",
name_identifier_format: "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",
attribute_statements: {
email: ['email'],
first_name: ['firstName'],
last_name: ['lastName']
}
}
}
]

Gestion des permissions​

Mapping des rôles​

VaultysHub ne transmet pas les groupes ni les rôles de l'utilisateur. Les rôles (administrateur, utilisateur externe, auditeur…), l'appartenance aux groupes et aux projets GitLab ainsi que l'attribution des licences se gèrent directement dans GitLab.

Configuration des utilisateurs​

Configuration du profil utilisateur​

# Synchronisation complète du profil
gitlab_rails['omniauth_sync_profile_from_provider'] = ['openid_connect']
gitlab_rails['omniauth_sync_profile_attributes'] = [
'name',
'email'
]

Test de la configuration​

1. Test de connexion​

  1. Déconnectez-vous de GitLab
  2. Sur la page de connexion, cliquez sur VaultysHub SSO
  3. Authentifiez-vous sur VaultysHub
  4. Vérifiez la redirection vers GitLab

2. Vérification des permissions​

# Via l'API GitLab
curl -H "PRIVATE-TOKEN: your_token" \
"https://gitlab.example.com/api/v4/user"

# Via Rails console
gitlab-rails console
user = User.find_by_email('user@example.com')
user.identities
user.group_members

3. Test avec Git​

# Cloner avec SSO
git clone https://gitlab.example.com/groupe/projet.git

# Si demandé, utilisez :
# Username: oauth2
# Password: [votre token d'accès personnel]

Dépannage​

Erreur "Could not authenticate you from OpenIDConnect"​

Solution :

  1. Vérifiez les logs GitLab :
    gitlab-ctl tail gitlab-rails
  2. Testez la découverte OIDC avec votre appid :
    curl https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/.well-known/openid-configuration
  3. Vérifiez le Client ID et Secret

Les groupes ne sont pas synchronisés​

Solution : c'est le comportement attendu. VaultysHub ne transmet pas les groupes : gérez l'appartenance aux groupes directement dans GitLab.

Erreur 422 après authentification​

Solution :

  1. Vérifiez que l'email est unique dans GitLab
  2. Activez l'auto-link :
    gitlab_rails['omniauth_auto_link_user'] = ['openid_connect']

Utilisateurs bloqués après création​

Solution :

# Désactiver le blocage automatique
gitlab_rails['omniauth_block_auto_created_users'] = false

# Ou débloquer manuellement
gitlab-rails console
User.where(state: 'blocked').update_all(state: 'active')

Sécurité​

Recommandations​

  1. HTTPS obligatoire sur GitLab et VaultysHub
  2. Rotation des secrets régulière
  3. Audit logs activés :
    gitlab_rails['audit_events_enabled'] = true
  4. 2FA bypass uniquement si VaultysHub gère le MFA :
    gitlab_rails['omniauth_allow_bypass_two_factor'] = ['openid_connect']

Protection CSRF​

# Protection contre les attaques CSRF
gitlab_rails['omniauth_providers'] = [
{
args: {
pkce: true, # Utiliser PKCE pour OpenID Connect
state: true # Vérifier le state parameter
}
}
]

Configuration avancée​

Multi-instance GitLab​

Pour plusieurs instances GitLab avec le même VaultysHub :

# Instance production
gitlab_rails['omniauth_providers'] = [
{
name: "openid_connect",
args: {
client_options: {
identifier: "gitlab-prod-xxxxxx",
redirect_uri: "https://gitlab.example.com/users/auth/openid_connect/callback"
}
}
}
]

# Instance staging
gitlab_rails['omniauth_providers'] = [
{
name: "openid_connect",
args: {
client_options: {
identifier: "gitlab-staging-xxxxxx",
redirect_uri: "https://gitlab-staging.example.com/users/auth/openid_connect/callback"
}
}
}
]

Intégration CI/CD​

Pour utiliser SSO dans les pipelines :

# .gitlab-ci.yml
variables:
CI_JOB_TOKEN_SCOPE: "openid_connect"

deploy:
script:
- |
TOKEN=$(curl -X POST https://votre-smartlink.link.vaultys.org/api/oidc/[appid]/token \
-d "grant_type=client_credentials" \
-d "client_id=${CI_CLIENT_ID}" \
-d "client_secret=${CI_CLIENT_SECRET}")
- # Utiliser $TOKEN pour les déploiements

Ressources​