Giriş
Bu doküman, bir kimlik sağlayıcı olan Keycloak ile bulut yönetim platformu OpenStack Keystone arasında OpenID Connect (OIDC) protokolü kullanılarak federated authentication (federasyon tabanlı kimlik doğrulama) entegrasyonunu anlatır.
Temel Kavramlar:
- Keycloak: Açık kaynaklı bir kimlik ve erişim yönetimi çözümüdür. Kullanıcı kimlik doğrulama, yetkilendirme, kullanıcı profili yönetimi gibi işlemleri sağlar.
- OpenStack Keystone: OpenStack’in kimlik yönetimi servisidir. Kullanıcıların, projelerin ve rollerin doğrulanmasından sorumludur.
- OpenID Connect (OIDC): OAuth 2.0 protokolünün kimlik doğrulama katmanıdır. Keycloak gibi OIDC sağlayıcıları, OpenStack gibi uygulamalara kullanıcı kimlik doğrulama imkanı sunar.
Keycloak – OpenStack Keystone OpenID Connect Entegrasyonu Rehberi
Genel Bilgilendirme
Bu dökümanda geçen örnek domain adresleri:
-
auth.keycloak.local
: Keycloak sunucusunun HTTPS üzerinden erişilebilir alan adıdır. Gerçek ortamda bu adres, sizin Keycloak kurulumunuzun erişilebilir FQDN (tam nitelikli alan adı) olmalıdır. -
dlp.srv.world
: OpenStack Keystone ve Horizon servislerinin HTTPS ile sunulduğu alan adıdır. Bu da sizin ortamınıza uygun bir şekilde DNS ile çözülmelidir. Eğer DNS yoksa/etc/hosts
ile eşleştirme yapılabilir.
Her iki servis de HTTPS ile çalışmalı ve geçerli sertifikalarla (self-signed ya da CA imzalı) yapılandırılmış olmalıdır.
Bu döküman, Keycloak kimlik sağlayıcısını kullanarak OpenStack Keystone ile OpenID Connect (OIDC) tabanlı federated authentication yapılandırmasını anlatır. Bu sayede kullanıcılar, Horizon arayüzü veya CLI üzerinden Keycloak ile OpenStack'e giriş yapabilir.
Ön Gereksinimler
HTTPS yapılandırılmış bir Keycloak sunucusu
(Self-signed veya geçerli bir SSL sertifikası ile)HTTPS yapılandırılmış bir OpenStack Horizon servisi
(Sadece CLI kullanılacaksa Horizon gerekmez)
1. Adım: Keycloak Yapılandırması
Client Oluşturma
Keycloak arayüzünde aşağıdaki şekilde keystone
adlı bir client oluşturulmalıdır:
-
Protocol:
openid-connect
- Client Authentication: Açık
-
Etkin Flowlar:
Standard Flow
Implicit Flow
Direct Access Grants
-
Root URL:
https://dlp.srv.world:5000
-
Valid Redirect URIs:
https://dlp.srv.world:5000/*
-
Web Origins:
+
-
Admin URL:
https://dlp.srv.world:5000
PKCE Ayarı
-
Code Challenge Method:
S256
User Attribute Tanımları
Keycloak > Realm Settings > User Profile alanından aşağıdaki attribute'lar eklenmelidir:
openstack-user-domain
openstack-default-project
Client Scope ve Mapper
-
keystone
adlı bir Client Scope oluşturun - Mapper olarak aşağıdaki iki alan tanımlanmalı:
openstack-user-domain
openstack-default-project
Kullanıcı Attribute'leri
Her kullanıcı için yukarıdaki attribütler manuel olarak doldurulmalıdır:
2. Adım: Keystone Yapılandırması
Identity Provider Tanımı
openstack identity provider create --remote-id https://auth.keycloak.local/realms/master keycloak
Mapping Tanımı (mapping.json)
[
{
"local": [
{
"user": {
"name": "{0}",
"email": "{1}",
"domain": {
"name": "{2}"
}
},
"domain": {
"name": "{2}"
},
"projects": [
{
"name": "{3}",
"roles": [
{
"name": "member"
}
]
}
]
}
],
"remote": [
{ "type": "OIDC-preferred_username" },
{ "type": "OIDC-email" },
{ "type": "OIDC-openstack-user-domain" },
{ "type": "OIDC-openstack-default-project" }
]
}
]
Mapping Oluşturma
openstack mapping create --rules mapping.json mymapping
Protocol Oluşturma
openstack federation protocol create openid --mapping mymapping --identity-provider keycloak
3. Adım: Apache OIDC Konfigürasyonu
Apache sunucusundaki uygun .conf
dosyasına aşağıdaki satırlar eklenmelidir:
OIDCSSLValidateServer Off
OIDCOAuthSSLValidateServer Off
OIDCCookieSameSite Off
WSGIPassAuthorization On
OIDCStateTimeout 300
OIDCClaimPrefix "OIDC-"
OIDCResponseType "id_token token"
OIDCScope "openid email profile"
OIDCProviderMetadataURL "https://auth.keycloak.local/realms/master/.well-known/openid-configuration"
OIDCClientID "keystone"
OIDCClientSecret "<KEYCLOAK_CLIENT_SECRET>"
OIDCPKCEMethod "S256"
OIDCCryptoPassphrase "openstack"
OIDCRedirectURI "https://dlp.srv.world:5000/v3/auth/OS-FEDERATION/websso/openid"
OIDCOAuthVerifyJwksUri "https://auth.keycloak.local/realms/master/protocol/openid-connect/certs"
<Location "/v3/auth/OS-FEDERATION/websso/openid">
AuthType "openid-connect"
Require valid-user
</Location>
<Location "/v3/auth/OS-FEDERATION/identity_providers/keycloak/protocols/openid/websso">
AuthType "openid-connect"
Require claim preferred_username
</Location>
<Location "/v3/auth/OS-FEDERATION/identity_providers/keycloak/protocols/openid/auth">
AuthType "openid-connect"
Require valid-user
</Location>
LogLevel auth_openidc:debug
4. Adım: Keystone Konfigürasyonu
/etc/keystone/keystone.conf
içerisine aşağıdakiler eklenmelidir:
[auth]
methods = password,token,openid
[federation]
remote_id_attribute = HTTP_OIDC_ISS
trusted_dashboard = https://dlp.srv.world/horizon/auth/websso/
systemctl restart apache2
5. Adım: Horizon Entegrasyonu
/etc/openstack-dashboard/local_settings.py
dosyasının sonuna ekleyin:
WEBSSO_ENABLED = True
WEBSSO_INITIAL_CHOICE = "OIDC"
WEBSSO_CHOICES = (
("OIDC", "Login with Keycloak"),
("credentials", "Keystone Credentials"),
)
WEBSSO_IDP_MAPPING = {
"OIDC": ("keycloak", "openid")
}
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"
OPENSTACK_API_VERSIONS = {
"identity": 3,
}
REMOTE_USER_CLAIM = "OIDC-preferred_username"
systemctl restart apache2
Horizon arayüzünde "Login with Keycloak" ile giriş yapılabilir.
Sonuç
Bu yapılandırma sayesinde kullanıcılar, OpenStack Horizon arayüzünden Keycloak hesabı ile giriş yapabilir. Aynı zamanda CLI üzerinden federated token kullanarak OpenStack kaynaklarına erişim sağlanabilir.
Resource Owner Password Credentials Grant (CLI Üzerinden Erişim)
Eğer Horizon yerine CLI ile erişim tercih edilecekse v3oidcpassword
yöntemi kullanılabilir. Bunun için aşağıdaki örnekteki gibi bir clouds.yaml
dosyası oluşturulmalıdır:
clouds:
federated:
auth_type: v3oidcpassword
auth:
auth_url: https://dlp.srv.world:5000
username: admin
password: admin
identity_provider: keycloak
protocol: openid
client_id: keystone
client_secret: cbFMos3ehMrxvOg0MYEA8gomVdCWj5wR
discovery_endpoint: https://auth.keycloak.local/realms/master/.well-known/openid-configuration
project_name: demo
project_domain_name: Default
verify: false
CLI Komutu ile Giriş:
openstack --os-cloud federated token issue
Bu komut başarılı olursa Keycloak üzerinden federated kullanıcı ile kimlik doğrulama sağlanmış olacaktır.