Notice
Recent Posts
Recent Comments
Today
Total
05-03 00:03
Archives
관리 메뉴

Jeongchul Kim

Keycloak 개념 Container 실행 및 Minio 연동 본문

카테고리 없음

Keycloak 개념 Container 실행 및 Minio 연동

김 정출 2023. 5. 27. 23:36

Keycloak 개념 Container 실행 및 Minio 연동

Keycloak 이란

  • https://www.keycloak.org/
  • Keycloak을 활용하여 애플리케이션 및 보안 서비스에 인증(Authentication)을 추가할 수 있습니다.
  • 사용자를 저장하거나 사용자 인증을 처리를 도와줍니다.
  • 사용자 관리, 인증, 세분화된 인증을 제공합니다.

SSO(Single-Sign On) 기능

  • 사용자는 개별 애플리케이션으로 인증이 아닌 Keycloak 인증으로 통합됩니다.
  • 각 애플리케이션마다 로그인 양식, 사용자 인증, 저장을 처리할 필요가 없습니다.
  • Keycloak 로그인을 통해 모든 애플리케이션에서 액세스가 가능하며, 또한 단일 로그아웃을 통해 모든 애플리케이션에서 로그아웃 됩니다.

Identity Brokering and Social Login

 

  • SNS를 통한 로그인 활성화도 admin 콘솔에서 쉽게 추가할 수 있으며, 코드나 변경이 필요하지 않습니다.
  • KeyCloak은 OpenID Connect 또는 SAML 2.0 ID 공급자로 사용자를 인증할 수 있습니다.
eyJhbGciOiJSUzI1NiIsImtpZCI6IjFlOWdkazcifQ.ewogImlzcyI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZfV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5NzAKfQ.ggW8hZ1EuVLuxNuuIJKX_V8a_OMXzR0EHR9R6jgdqrOOF4daGU96Sr_P6qJp6IcmD3HP99Obi1PRs-cwh3LO-p146waJ8IhehcwL7F09JdijmBqNqeGpe-gccMg4vfKjkM8FcGvnzZUN4_KSP0aAp1tOJ1zZwgjxqGByKHiOtX7TpdQyHE5lcMiKPXfEIQILVq0pc_E2DzL7emopWoaoZTF_m0_N0YzFC6g6EJbOEoRoSK5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg
  • JWT 페이로드를 디코딩하면 사용자 식별을 위한 정보를 확인할 수 있습니다.
{

  "iss": "<http://xxx.com>", # 발급 기관

  "sub": "jckim", # 유저 식별 정보

  "aud": "client-XXXX", # 특정 대상 클라이언트

  "nonce": "n-0S6_WzA2Mj", # 토큰 유효성 검사 매개변수

  "exp": 1311281970, # 만료 시간

  "iat": 1311280970  # 이슈 시간

}
  • SAML 2.0

User Federation

 

  • 관계형 DB, LDAP 또는 Active Directory 서버에 연결하여 데이터를 저장 가능합니다.

 

Admin Console

  • 관리 콘솔을 통해 Keycloak을 관리할 수 있고 세분화된 인증 정책을 정의할 수 있습니다.
  • 애플리케이션 과 서비스 생성, 권한 및 세션, 사용자 관리 가능

 

KeyCloak Docker 실행

Keycloak 실행을 Docker Container로 해봅시다.

https://quay.io/repository/keycloak/keycloak?tab=tags

 

웹 브라우저에서 http://127.0.0.1:8080 으로 이동합니다.

Administration Console로 이동합니다.

Remote PC에서 실행한 Docker를 통해 웹 브라우저로 접속시 https required 로 인해 접속 불가 시에는 다음으로 처리해주세요.

keycloak HTTPS required

docker exec -it keycloak bash

cd /opt/keycloak/bin

./kcadm.sh config credentials --server http://localhost:8080 --realm master --user admin

./kcadm.sh update realms/master -s sslRequired=NONE

 

 

위에서 설정한 계정으로 로그인 접속을 진행합니다.

  • ID: admin
  • PW: admin123$%

master realm으로 이동하였습니다.

realm은 tenant와 같은 namespace 개념으로 영역을 통해 격리된 애플리케이션 및 사용자 그룹을 만들 수 있습니다.

처음에 Keycloak에는 master라는 단일 realm이 포함되어 있습니다. 관리에만 사용하고 application 관리에는 해당 master를 사용하지 않습니다. realm을 생성해봅시다.

상단 부의 master의 드롭다운 메뉴를 클릭하여 Create Realm 버튼을 클릭합니다.

새로운 realm의 이름 myrealm으로 입력을 하고 Enabled는 On으로 체크하고 Create 버튼을 클릭합니다.

 

Realm이 생성 되었습니다.

 

다음은 User를 생성해봅시다. 사이드 메뉴의 Users를 클릭하고, Create new user 버튼을 클릭합니다.

계정명을 입력하고, Required user actions에는 Update password를 선택하고, First name, Last name을 입력합니다.

Create 버튼을 클릭합니다.

새로운 유저의 정보가 보여집니다.

탭 메뉴에서 Credentials로 이동하여 비밀번호를 설정합니다. Set password 버튼을 클릭합니다.

다음의 팝업창에서 비밀번호를 설정합니다.

 

해당 계정으로 로그인을 진행해봅시다. admin에서 로그아웃합니다.

웹 브라우저에서 해당 콘솔로 이동합니다.

http://localhost:8080/realms/myrealm/account/#/

Sign in 버튼을 클릭합니다.

위에서 생성한 User의 이름과 패스워드를 입력합니다.

비밀번호를 업데이트할 것을 요청합니다.

로그인이 완료되었습니다.

 

Account security에서 Signing in에서는 비밀번호 수정이 가능합니다.

Device activity에서는 현재 세션의 로그인 접속 정보를 확인할 수 있습니다.

다음은 admin으로 로그인하여 Client를 생성해봅시다. 인증, 권한 부여 행위를 수행할 애플리케이션 단위가 됩니다.

이번 포스트에서는 minio를 Keycloak과 연동하기 위해 client명을 minio로 생성하겠습니다.

서브 메뉴의 Clients를 클릭하고 Create client 버튼을 클릭합니다.

Client type은 OpenID Connect를 선택하고 Client ID는 minio로 입력합니다. name과 description도 입력합니다.

 

다음의 Capability config 설정에서 Standard flow와 Direct access grants를 선택합니다.

  • Client authentication: OIDC 클라이언트 유형을 정의하며, ON일 경우 confidential access type으로 설정되고, Off일 경우 public access로 정의됩니다.
  • Authorization: 세분화된 인증 지원으로 fine-grained 인증을 활성화 할지 비활성화할지 선택합니다.
  • Standard flow: 인증 코드를 사용하여 표준 OpenID Connect 리디렉션 기반 인증을 사용할 수 있습니다. OpenID Connect 또는 OAuth2 사양 측면에서 이는 이 클라이언트에 대한 'Authorization Code Flow' 지원을 가능하게 합니다.
  • Direct access grants: 클라이언트가 사용자의 사용자 이름/비밀번호에 액세스할 수 있고 액세스 토큰을 위해 Keycloak 서버와 직접 교환할 수 있는 직접 액세스 권한 부여를 지원할 수 있습니다. OAuth2 사양 측면에서 이 클라이언트에 대해 '자원 소유자 암호 자격 증명 부여'를 지원할 수 있습니다.
  • Implicit flow: 이를 통해 인증 코드 없이 OpenID Connect 리디렉션 기반 인증을 지원할 수 있습니다. OpenID Connect 또는 OAuth2 사양 측면에서 이 클라이언트에 대해 '암시적 흐름'을 지원할 수 있습니다.
  • Service account roles: 이 클라이언트를 Keycloak에 인증하고 이 클라이언트 전용 액세스 토큰을 검색할 수 있습니다. OAuth2 사양 측면에서 이 클라이언트에 대해 '클라이언트 자격 증명 부여'를 지원할 수 있습니다.
  • OAuth 2.0 Device Authorization Grant: 이를 통해 OAuth 2.0 장치 권한 부여를 지원할 수 있습니다. 즉, 클라이언트는 입력 기능이 제한되어 있거나 적합한 브라우저가 없는 장치의 애플리케이션입니다.

 



  • Root URL: 루트 URL
  • Home URL: 인증 서버가 클라이언트로 리디렉션하거나 다시 연결해야 할 때 사용할 기본 URL입니다.
  • Validation redirect URIs: 로그인 성공 후 브라우저가 리디렉션할 수 있는 유효한 URI 패턴입니다. 'http://example.com/*'과 같은 단순 와일드카드가 허용됩니다. /my/relative/path/*와 같이 상대 경로도 지정할 수 있습니다. 상대 경로는 클라이언트 루트 URL에 상대적이거나 지정되지 않은 경우 인증 서버 루트 URL이 사용됩니다. SAML의 경우 로그인 요청에 포함된 소비자 서비스 URL을 사용하는 경우 유효한 URI 패턴을 설정해야 합니다.
  • 허용된 CORS 출처. 유효한 리디렉션 URI의 모든 출처를 허용하려면 '+'를 추가합니다. 그러나 여기에는 '*' 와일드카드가 포함되지 않습니다. 모든 원본을 허용하려면 명시적으로 '*'를 추가합니다.

 

 

생성된 minio 클라이언트를 확인할 수 있습니다.

 

 

탭 메뉴에서 Client scops를 클릭합니다. minio-dedicated 버튼을 클릭합니다.

Mappers에서 Add mapper 드롭다운 메뉴를 클릭하고 By configuration 버튼을 클릭합니다.

다음의 팝업창에서 User attribute 버튼을 클릭합니다

다음의 Mapper 입력에서 Name와 User Attribute를 Minio Policy로 입력하고 Token Claim Name을 minio_policy로 입력하고 Claim JSON Type은 String, Add to ID Token, Add to access token, Add to userinfo, Mutivalued, Aggregate attribute values를 전체 선택하고 save 버튼을 클릭합니다.

 

다음은 minio를 실행해보겠습니다. 별도의 OpenID 설정 없이 진행해보겠습니다.

mkdir ~/minio

docker run --name minio --platform linux/amd64 -p 9000:9000 -p 9090:9090 \
  -v /Users/jeongchul.kim/minio:/data -e "MINIO_ROOT_USER=admin" \ 
  -e "MINIO_ROOT_PASSWORD=admin123$%" quay.io/minio/minio \ 
  server /data --console-address ":9090"

웹 브라우저에 http://127.0.0.1:9000 로 이동합니다. 

위에서 환경변수로 설정한 ROOT_USER 정보 로그인을 진행합니다.

  • ID: admin
  • PW: admin123$%

Bucket을 하나 생성해봅시다. Create a Bucket 버튼을 클릭합니다.

Bucket Name은 jckim으로 입력하고 Create Bucket 버튼을 클릭합니다.

Bucket이 생성되었습니다.

 

다음은 사이드 메뉴에서 Policies를 클릭합니다. Create Policy 버튼을 클릭합니다.

Policy 이름은 userPolicy로 입력하고 Write Policy에는 다음을 입력합니다. Save 버튼을 클릭합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::${jwt:preferred_username}/*"
            ]
        }
    ]
}

다음은 Keycloak으로 돌아와 User 설정을 진행합니다. 

사용자 jckim을 클릭합니다.

 

Attributes 탭 메뉴에서 다음을 입력하고 Save 버튼을 클릭합니다.

  • Key: Minio policy
  • Value: userPolicy

 

다음은 Minio 실행을 위해 OpenID 연동 설정으로 Container를 행해보겠습니다.
network는 host로 지정하지 않을 시 Keycloak과 통신을 위해 172.17.0.1:8080으로 OPENID_CONFIG_URL을 지정해야 되나, 웹브라우저 상에 keycloak으로 redirect 시에 접속이 되지 않습니다. 이로 인해 network를 host로 지정하여 minio는 호스트의 네트워크 인터페이스에서 동작하여 다이렉트로 붙도록 설정합니다. 

docker run --name minio --platform linux/amd64 --network host \
   -v /Users/jeongchul.kim/minio:/data \
   -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin123$%" \ 
   -e "MINIO_IDENTITY_OPENID_CONFIG_URL=http://127.0.0.1:8080/realms/myrealm/.well-known/openid-configuration" \
   -e "MINIO_IDENTITY_OPENID_CLIENT_ID=minio" -e "MINIO_IDENTITY_OPENID_CLAIM_NAME=minio_policy" \
   -e "MINIO_IDENTITY_OPENID_REDIRECT_URI=http://127.0.0.1:9090/oauth_callback" \
   quay.io/minio/minio server /data --console-address ":9090"

환경 변수 관련하여 다음의 설정 변수를 확인합니다. https://min.io/docs/minio/linux/reference/minio-server/minio-server.html#minio-server-envvar-external-identity-management-openid

  • OpenID Identity Management: OIDC 호환을 위한 환경 변수

 

 

다시 웹 브라우저로 이동합니다.

Other Authentications Methods 드롭 다운 메뉴를 클릭하고 Login with SSO 버튼을 클릭합니다.

다음의 페이지에서 HTTPS required가 나온다면 Keycloak으로 돌아가 realm 설정을 진행합니다.

openid 설정 정보로 이동하면 http://KEYCLOAK/realms/myrealm/.well-known/openid-configuration 으로 접속 시에 https 접속을 요청합니다.

Keycloak의 사이드 메뉴에서 Realm settings으로 들어가 Require SSL 드롭다운 메뉴에서 None을 지정합니다.

 

다시 openid 설정 정보로 이동하면 정상적으로 데이터를 가져옵니다.

다시 minio로 돌아가 SSO 로그인을 진행합니다. 정상적으로 keycloak로 이동합니다.

Keycloak을 통해 minio로 로그인된 모습입니다.

이상으로 Keycloak를 container로 동작시켜 minio와 연동을 진행하였습니다.

감사합니다.

 

Comments