본문 바로가기
Security/Keycloak

Keycloak + Vault 연동 SSO(Single Sign-On) 구현하기

by wlsdn3004 2023. 4. 12.
728x90
반응형

 

이번 포스팅에서는  Keycloak과 Vault를 연동하여 SSO를 구현하는 실습을 다룬다.

 

SSO(Single Sign-On)는 여러 시스템에서 사용되는 로그인 정보를 중앙에서 관리하여 사용자가 여러 번 로그인하는 번거로움을 줄여준다.

 

이를 구현하기 위해 Keycloak과 Vault의 OIDC(OpenID Connect) 설정을 이용하여 Keycloak에 등록된 사용자로 Vault에 로그인해 볼 것이다.

OIDC(OpenID Connect)란?
- OAuth 2.0 기반으로 하는 인증 프로토콜 중 하나로, 사용자 인증과 권한 부여를 처리하는 프로토콜.

 

 

Keycloak과 Vault 연동 후 SSO 로그인 시 아래와 같이 동작한다.

 

실습 환경은 이전에 구성하였던 [Keycloak 이란? 개념과 설치 실습][HashiCorp Vault 란? 개념 및 설치] 를 참고하면 된다.

 

설치 버전

  • Keycloak Chart 버전 : 14.0.0
  • Keycloak APP 버전 : 21.0.2
  • Vault Chart 버전 :  0.23.0
  • Vault APP 버전 : 1.12.1

 

 

실습

1. Keycloak Clients 등록


기본 Realm인 master realm에서 진행하겠다.

 

keycloak에 로그인하여 Clients를 만든다.

 

Client Authenticator 활성화한다.

 

로그인 성공 후 Vault로 redirect 되어야 하기 때문에 vault의 주소를 적어준다.

  • {Vault URI}/oidc/callback
  • {Vault URI}/ui/vault/auth/oidc/oidc/callback

 

생성된 Clients를 눌러 Vault에서 사용할 Client secret 값을 확인한다.

  • Vault oidc 설정 때 사용하기 때문에 기록해 두자.

 

 

2. Vault OIDC 연동 설정


Vault pod에 접속하여 root token으로 로그인 후 Authentication Methods인 oidc를 활성화한다.

$ kubectl exec -it -n vault vault-0 -- /bin/sh

## vault root token 로그인
$ vault login hvs.8YXKW7IM4Z1fTgQnMZK4VdE1
Key                  Value
---                  -----
token                hvs.8YXKW7IM4Z1fTgQnMZK4VdE1
token_accessor       8mPHZDIUmjluDM2sI3koW1bj
token_duration       ∞
token_renewable      false
token_policies       ["root"]
identity_policies    []
policies             ["root"]

## oidc 활성화
$ vault auth enable oidc
Success! Enabled oidc auth method at: oidc/

 

Web UI에서 oidc가 활성화되었는지 확인한다.

 

위에서 만든 oidc의 설정을 다음과 같이 한다.

  • oidc_discovery_url : {Keycloak URI}/realms/{keycloak realms}
  • oidc_client_id : Keycloak의 Clients 이름
  • oidc_client_secret : 위에서 기록해 두었던 Client secret 
  • default_role : Vault Role을 부여할 정책 이름
$ vault write auth/oidc/config \
oidc_discovery_url="http://a0bed28a253aa48a28ca445d4.elb.ap-northeast-2.amazonaws.com/realms/master" \
oidc_client_id="vault-oidc" \
oidc_client_secret="dhqDbugNjT4MG9POiwQDj19NT8jX8AxN" \
default_role=default-policy
Success! Data written to: auth/oidc/config
[참고]
- 특정 버전에서는 oidc_discovery_url 주소를 넣을 때  {Keycloak URI}/auth/realms/{keycloak realms}를 넣어야 한다.

 

vault oidc 설정이 잘 되었는지 확인한다.

$ vault read auth/oidc/config
Key                       Value
---                       -----
bound_issuer              n/a
default_role              default-policy
jwks_ca_pem               n/a
jwks_url                  n/a
jwt_supported_algs        []
jwt_validation_pubkeys    []
namespace_in_state        true
oidc_client_id            vault-oidc
oidc_discovery_ca_pem     n/a
oidc_discovery_url        http://a0bed28a253aa48a285d4.elb.ap-northeast-2.amazonaws.com/realms/master
oidc_response_mode        n/a
oidc_response_types       []
provider_config           map[]

 

Vault Web UI로 이동하여 위 설정을 확인할 수도 있다.

 

 

oidc를 통해 로그인하는 유저에게 부여할 Policy를 생성한다.

마지막에 부여된 권한을 확인하기 위해 read 권한만 부여한다.

$ cd /tmp

## default policy 내용
$ cat default-policy.hcl
path "/secret/*" {
    capabilities = ["read", "list"]
}

## Policy 생성
$ cat default-policy.hcl | vault policy write default-policy -
Success! Uploaded policy: default-policy

 

Vault web UI 대시보드를 통해 생성된 정책을 확인할 수 있다.

default-policy

 

OIDC 인증을 위한 role 생성

  • bound_audiences : Keycloak의 Clients 이름.
  • allowed_redirect_uri : Keycloak Clients 생성 때 입력했던 Valid redirect URIs.
  • policies : 위에서 만든 Vault Policy
$ vault write auth/oidc/role/test \
bound_audiences="vault-oidc" \
allowed_redirect_uris="http://a47ee6f255c87b-1615700718.ap-northeast-2.elb.amazonaws.com:8200/oidc/callback" \
allowed_redirect_uris="http://a47ee6f255c87b-1615700718.ap-northeast-2.elb.amazonaws.com:8200/ui/vault/auth/oidc/oidc/callback" \
user_claim="sub" \
policies=default-policy
Success! Data written to: auth/oidc/role/test

 

oidc role이 정상으로 생성되었는지 확인해 보자.

$ vault read auth/oidc/role/test
Key                        Value
---                        -----
allowed_redirect_uris      [http://a47ee6f255c8d4d63b718.ap-northeast-2.elb.amazonaws.com:8200/oidc/callback http://a47ee6f255c8d4d63b9db569e1c9e07b-1615700718.ap-northeast-2.elb.amazonaws.com:8200/ui/vault/auth/oidc/oidc/callback]
bound_audiences            [vault-oidc]
bound_claims               <nil>
bound_claims_type          string
bound_subject              n/a
claim_mappings             <nil>
clock_skew_leeway          0
expiration_leeway          0
groups_claim               n/a
max_age                    0
not_before_leeway          0
oidc_scopes                <nil>
policies                   [default-policy]
role_type                  oidc
token_bound_cidrs          []
token_explicit_max_ttl     0s
token_max_ttl              0s
token_no_default_policy    false
token_num_uses             0
token_period               0s
token_policies             [default-policy]
token_ttl                  0s
token_type                 default
user_claim                 sub
user_claim_json_pointer    false
verbose_oidc_logging       false

 

 

3. Keycloak 사용자 생성


keycloak에서 아래와 같이 test 사용자를 만들어 보자.

 

test 유저가 생성되었으면 비밀번호 설정을 한다.

 

유저가 생성되면 첫 로그인 시 비밀번호를 바꿔야 하는데, 해당 기능은 비활성화한다.

 

 

 

4. Keycloak을 통한 Vault 로그인 및 권한 확인


Vault에서 oidc test role 기반으로 로그인해 보자.

 

정상적으로 로그인되는 것을 확인할 수 있다.

 

Keycloak에서도 Sessions을 확인해

 

 

실제로 default-policy(read, list) 정책을 갖고 로그인이 된 건지 확인해 보자.

Vault pod에 접속하여 kv 타입의 secrets을 2개 만들자.

$ vault secrets enable kv
Success! Enabled the kv secrets engine at: kv/

$ vault secrets enable -path=secret/ kv
Success! Enabled the kv secrets engine at: secret/

 

root token 로그인하여 위에서 만든 2개의 secrets path가 보이는 걸 확인할 수 있다.

 

keycloak test유저 로그인하면 secrets path만 보이는 걸 확인할 수 있다.

 

실제로 keycloak test유저가 write 권한이 없는지 secret 만드는 과정을 통해 확인해 보자.

 

Save를 누르면 permission denied 가 나오는 걸 확인할 수 있다.

 

마치며 


Keycloak과 Vault의 OIDC 설정을 통한 SSO를 구현하여 간편하게 사용자 인증을 처리하고 Vault에 로그인해 보는 실습을 해보았다. 사용자가 많은 기업에서는 이러한 통합 인증 시스템으로 사용자 관리를 통합하여 간편하고 효율적으로 사용자를 관리할 수 있다.

그러나, 이러한 통합 인증 및 권한 관리 시스템을 도입할 때는 적절한 보안 조치와 설정이 필요하기 때문에 충분한 검토와 테스트를 거쳐 안전하게 운영해야 할 것이다.

반응형

댓글