OAuth 2와 Keycloak 설정
OAuth 2와 Keycloak 설정 (Setting Up OAuth 2 with Keycloak)
Hive Metastore(HMS)를 OAuth 2 리소스 서버로 등록하고, Trino 같은 클라이언트가 REST 카탈로그(예: Iceberg REST Catalog)를 통해 안전하게 접근하도록 Keycloak을 설정하는 방법을 설명해요. 클라이언트 생성, 스코프 정의, 서비스 계정 클레임 구성까지 단계별로 따라 해볼 수 있답니다.
출처: 문서
본문
Keycloak 설정 (Keycloak Settings)
1. Hive Metastore를 리소스 서버로 등록하기
Manage -> Clients -> Create client로 이동해 OAuth 2 리소스 서버로 HMS용 클라이언트를 만들어요. 이 예제에서는 클라이언트 ID로 hive-metastore를 사용해요. 클라이언트 시크릿은 Credentials 탭에서 확인할 수 있어요.
2. "catalog" 스코프 정의하기
Iceberg REST Catalog는 기본 스코프 이름으로 "catalog"를 사용해요.
Manage -> Client scopes -> Create client scope로 이동해 스코프를 만들어요. Name은 반드시 catalog여야 하고, Include in token scope를 활성화해야 해요.
그런 다음 Mappers 탭에 접근해 Configure a new mapper를 클릭하고 Audience를 선택해, 액세스 토큰의 aud 클레임을 설정하는 프로토콜 매퍼를 구성해요. Included Client Audience 값은 반드시 hive-metastore여야 해요.
3. Hive Metastore 클라이언트 만들기
Trino를 REST 클라이언트로 구성한다고 가정해요.
Manage -> Clients -> Create client로 이동해 OAuth 2 클라이언트로 Trino용 클라이언트를 만들어요. Service accounts roles를 활성화해야 해요.
Client scopes 탭에 접근해 Add client scope를 클릭하고, catalog를 체크한 뒤 Optional 스코프로 추가해요.
선택적으로, 사용자 이름을 해석하는 데 유용한 사용자 정의 클레임을 추가할 수 있어요. HMS가 나중에 사용자 이름으로 사용할 수 있도록 서비스 계정에 hive-client-username을 추가해 봐요. Client scopes 탭에서 trino-dedicated에 접근해 Configure a new mapper로 진행하고, Hardcoded claim을 선택한 뒤 프로토콜 매퍼를 추가해요.
Advanced 탭에 접근해 Use "at+jwt" as access token header type을 활성화해요. Hive는 Authorization Server가 RFC 9068을 준수할 것을 기대해요.
클라이언트 시크릿은 Credentials 탭에서 확인할 수 있어요.
애플리케이션 설정 (Application Settings)
Hive Metastore
metastore-site.conf에 다음 매개변수를 추가하게 돼요.
| Key | 필수? | 기본값 | 값 |
|---|---|---|---|
| metastore.catalog.servlet.auth | 예 | jwt |
반드시 oauth2를 선택 |
| metastore.catalog.servlet.auth.oauth2.issuer | 예 | N/A | https://{keycloak-host}:{keycloak-port}/realms/{realm name} |
| metastore.catalog.servlet.auth.oauth2.audience | 예 | N/A | HMS의 클라이언트 ID. 이 예제에서 hive-metastore |
| metastore.catalog.servlet.auth.oauth2.validation.method | 아니요 | jwt |
RFC 7662 - OAuth 2.0 Token Introspection을 사용하려면 introspection 선택. lightweight access token을 사용할 때 Token Introspection이 필요할 수 있음 |
| metastore.catalog.servlet.auth.oauth2.principal.mapper.regex.username.field | 아니요 | sub |
사용자 이름을 담은 클레임 이름. 이 예제에서 hive-client-username |
| metastore.catalog.servlet.auth.oauth2.principal.mapper.regex.username.pattern | 아니요 | (.*) |
클레임에서 사용자 이름을 추출하는 패턴. 예를 들어 (.*)@example.com을 지정하면 이메일 주소의 로컬 부분을 사용자 이름으로 사용할 수 있음 |
metastore.catalog.servlet.auth.oauth2.validation.method=introspection을 사용할 때는 다음 매개변수도 구성해야 해요.
| Key | 필수? | 기본값 | 값 |
|---|---|---|---|
| metastore.catalog.servlet.auth.oauth2.client.id | 예 | N/A | Token Introspection 사용 시 HMS의 클라이언트 ID를 넣어야 함. 이 예제에서 hive-metastore |
| metastore.catalog.servlet.auth.oauth2.client.secret | 예 | N/A | Token Introspection 사용 시 HMS의 클라이언트 시크릿을 넣어야 함 |
| metastore.catalog.servlet.auth.oauth2.introspection.cache.expiry | 아니요 | 60s | Token Introspection 캐시의 만료 시간. 캐시를 비활성화하려면 0 |
| metastore.catalog.servlet.auth.oauth2.introspection.cache.num | 아니요 | 1000 | Token Introspection 캐시의 항목 수 |
Trino
REST 카탈로그에 대해 다음 매개변수를 구성하게 돼요.
| Key | 값 |
|---|---|
| connector.name | iceberg |
| iceberg.catalog.type | rest |
| iceberg.rest-catalog.uri | https://{hms-host}:{hms-rest-port}/iceberg |
| iceberg.rest-catalog.security | OAUTH2 |
| iceberg.rest-catalog.oauth2.server-uri | https://{keycloak-host}:{keycloak-port}/realms/{realm name}/protocol/openid-connect/token |
| iceberg.rest-catalog.oauth2.credential | {client-id-of-trino}:{client-secret-of-trino}. 이 예제에서 trino:{Client ID in the Credential tab} |