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 |
| Tokens stockés en DB | Déprécié | |
| 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
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