Skip to content

Keystone - Service d'Identité

Introduction

Keystone est le service d'authentification et d'autorisation central d'OpenStack. Tous les services et utilisateurs doivent s'authentifier via Keystone pour accéder aux ressources. Il maintient également le catalogue de tous les services disponibles.

Prérequis

Points à apprendre

Concepts fondamentaux

graph TB
    subgraph Keystone["🔑 KEYSTONE"]
        subgraph Default["Domain: Default"]
            AdminProj[Project: admin]
            ServiceProj[Project: service]
            AdminUser[👤 User: admin<br/>Role: admin]
            NovaUser[👤 User: nova<br/>Role: admin]
        end

        subgraph ClientA["Domain: ClientA"]
            ProdProj[Project: prod]
            DevProj[Project: dev]
        end
    end

    AdminUser --> AdminProj
    NovaUser --> ServiceProj

Hiérarchie des entités

Entité Description Exemple
Domain Conteneur de haut niveau pour projets/users "Default", "ClientA"
Project Isolation des ressources (anciennement tenant) "production", "dev"
User Identité (personne ou service) "admin", "nova"
Group Ensemble d'utilisateurs "developers"
Role Permissions accordées "admin", "member", "reader"
Role Assignment Lien User/Group → Role → Project/Domain "admin a le role admin sur project prod"

Authentification

Flux d'authentification

sequenceDiagram
    participant Client as 👤 Client (CLI/API)
    participant Keystone as 🔑 Keystone
    participant Nova as 💻 Nova API

    Client->>Keystone: 1. POST /auth/tokens (credentials)
    Keystone->>Keystone: Validate credentials
    Keystone-->>Client: 2. Token + Service Catalog

    Client->>Nova: 3. GET /servers (X-Auth-Token)
    Nova->>Keystone: 4. Validate token
    Keystone-->>Nova: Token valid + User info
    Nova-->>Client: 5. Response (servers list)

Types de tokens

Type Description Usage
Fernet Tokens chiffrés, pas de stockage DB Standard actuel
JWT JSON Web Tokens (depuis Yoga) Alternatif, auto-contenu
UUID Tokens stockés en DB Déprécié
PKI Tokens signés cryptographiquement Déprécié

Configuration Fernet

# /etc/keystone/keystone.conf
[token]
provider = fernet
expiration = 3600  # 1 heure

[fernet_tokens]
key_repository = /etc/keystone/fernet-keys/
max_active_keys = 3
# Rotation des clés Fernet (à faire régulièrement)
keystone-manage fernet_rotate --keystone-user keystone --keystone-group keystone

Service Catalog

Le catalogue liste tous les services et leurs endpoints.

# Voir le catalogue
openstack catalog list

# Format JSON
openstack catalog list -f json

# Détails d'un service
openstack catalog show nova
{
  "endpoints": [
    {
      "region": "RegionOne",
      "interface": "public",
      "url": "https://cloud.example.com:8774/v2.1"
    },
    {
      "region": "RegionOne",
      "interface": "internal",
      "url": "http://10.0.0.10:8774/v2.1"
    }
  ],
  "type": "compute",
  "name": "nova"
}

Gestion des utilisateurs

# Créer un utilisateur
openstack user create --domain default \
  --password-prompt \
  --email user@example.com \
  --description "Développeur projet X" \
  john

# Lister les utilisateurs
openstack user list --domain default

# Détails utilisateur
openstack user show john

# Modifier utilisateur
openstack user set --password newpassword john
openstack user set --disable john   # Désactiver

# Supprimer
openstack user delete john

Gestion des projets

# Créer un projet
openstack project create --domain default \
  --description "Environnement de production" \
  production

# Lister projets
openstack project list --domain default

# Hiérarchie de projets (depuis Newton)
openstack project create --domain default \
  --parent production \
  production-web

Rôles et assignations

Rôles par défaut

Rôle Description
admin Accès complet
member Accès standard aux ressources du projet
reader Lecture seule
# Lister les rôles
openstack role list

# Créer un rôle
openstack role create developer

# Assigner un rôle (user → role → project)
openstack role add --project production --user john member

# Vérifier les assignations
openstack role assignment list --user john
openstack role assignment list --project production

# Retirer un rôle
openstack role remove --project production --user john member

Application Credentials

Depuis Queens, permet de créer des credentials limités pour les applications.

# Créer un application credential
openstack application credential create my-app \
  --description "CI/CD pipeline" \
  --expiration "2025-12-31T23:59:59Z" \
  --role member

Fédération d'identité

Keystone supporte l'authentification fédérée (SAML, OIDC).

sequenceDiagram
    participant User as 👤 User
    participant IdP as 🏢 Identity Provider<br/>(ADFS/Okta)
    participant Keystone as 🔑 Keystone

    User->>IdP: 1. Authenticate
    IdP->>IdP: Validate user
    IdP->>Keystone: 2. SAML Assertion
    Keystone->>Keystone: 3. Map to local project/roles
    Keystone-->>User: 4. OpenStack Token

    Note right of Keystone: Mapping rules define:<br/>- Groups → Projects<br/>- Attributes → Roles

Policies (RBAC)

Les policies définissent les permissions détaillées.

# /etc/keystone/policy.yaml
"identity:get_user": "rule:admin_or_owner"
"identity:list_users": "rule:admin_required"
"identity:create_user": "rule:admin_required"

# Règles prédéfinies
"admin_required": "role:admin"
"admin_or_owner": "rule:admin_required or user_id:%(user_id)s"

Fichier clouds.yaml

Configuration recommandée pour les clients OpenStack.

# ~/.config/openstack/clouds.yaml
clouds:
  mycloud:
    auth:
      auth_url: https://cloud.example.com:5000/v3
      username: admin
      password: secretpassword
      project_name: admin
      user_domain_name: Default
      project_domain_name: Default
    region_name: RegionOne
    interface: public
    identity_api_version: 3
# Utilisation
export OS_CLOUD=mycloud
openstack server list

Exemples pratiques

Créer un environnement projet complet

# 1. Créer le projet
openstack project create --domain default \
  --description "Application web production" \
  webapp-prod

# 2. Créer les utilisateurs
openstack user create --domain default --password 'DevP@ss123' webapp-dev
openstack user create --domain default --password 'OpsP@ss456' webapp-ops

# 3. Assigner les rôles
openstack role add --project webapp-prod --user webapp-dev member
openstack role add --project webapp-prod --user webapp-ops admin

# 4. Vérifier
openstack role assignment list --project webapp-prod --names

Ressources

Checkpoint

  • Je comprends la hiérarchie Domain → Project → User
  • Je peux créer des utilisateurs et assigner des rôles
  • Je comprends le fonctionnement des tokens Fernet
  • Je sais configurer clouds.yaml
  • Je peux créer des Application Credentials