Kerberos

Kerberos

Kerberos를 사용해 Druid 프로세스에 대한 인증을 활성화하는 확장 기능이에요. SPNEGO 협상 메커니즘으로 HTTP 엔드포인트를 보호하는 Authenticator를 추가해요.

출처: 문서

본문

Kerberos를 사용해 Druid 프로세스에 대한 인증을 활성화하는 Apache Druid 확장 기능이에요. 이 확장 기능은 단순하고 보호된 GSSAPI 협상 메커니즘인 SPNEGO를 사용해 HTTP 엔드포인트를 보호하는 Authenticator를 추가해요. extensions load list에 druid-kerberos를 포함하세요.

구성 (Configuration)

Authenticator 생성 (Creating an Authenticator)

druid.auth.authenticatorChain=["MyKerberosAuthenticator"]

druid.auth.authenticator.MyKerberosAuthenticator.type=kerberos

Kerberos authenticator를 사용하려면 authenticatorChain에 type이 kerberos인 authenticator를 추가하세요. 위 예제는 Authenticator의 이름으로 "MyKerberosAuthenticator"를 사용해요.

이름이 지정된 authenticator의 구성은 다음 형태의 속성으로 할당돼요:

druid.auth.authenticator.<authenticatorName>.<authenticatorProperty>

이 문서의 나머지 구성 예제들은 구성되는 authenticator의 이름으로 "kerberos"를 사용할 거예요.

속성 (Properties)

| Property | Possible Values | Description | Default | required | | druid.auth.authenticator.kerberos.serverPrincipal | HTTP/[email protected] | SPNEGO service principal used by druid processes | Empty | Yes | | druid.auth.authenticator.kerberos.serverKeytab | /etc/security/keytabs/spnego.service.keytab | SPNego service keytab used by druid processes | Empty | Yes | | druid.auth.authenticator.kerberos.authToLocal | RULE:1:$1@$0s/.*/druid DEFAULT | It allows you to set a general rule for mapping principal names to local user names. It will be used if there is not an explicit mapping for the principal name that is being translated. | DEFAULT | No | | druid.auth.authenticator.kerberos.cookieSignatureSecret | secretString | Secret used to sign authentication cookies | Empty | Yes | | druid.auth.authenticator.kerberos.authorizerName | Depends on available authorizers | Authorizer that requests should be directed to | Empty | Yes |

참고로 druid 프로세스가 사용하는 SPNego principal은 HTTP로 시작해야 하며(RFC-4559에 지정됨) "HTTP/_HOST@REALM" 형태여야 해요. 특수 문자열 _HOST는 druid.host 구성 값으로 자동 대체돼요.

druid.auth.authenticator.kerberos.excludedPaths

이전 릴리스에서 Kerberos authenticator에는 인증 확인을 건너뛸 경로 목록을 지정할 수 있는 excludedPaths 속성이 있었어요. 이 속성은 현재 모든 authenticator/authorizer에서 druid.auth.unsecuredPaths를 설정해 처리되므로 Kerberos authenticator에서 제거되었어요 — 메인 인증 문서에서 설명돼요.

Auth to Local 구문 (Auth to Local Syntax)

druid.auth.authenticator.kerberos.authToLocal은 principal 이름을 로컬 사용자 이름으로 매핑하기 위한 일반 규칙을 설정할 수 있게 해줘요. 매핑 규칙의 구문은 RULE:[n:string](regexp)s/pattern/replacement/g예요. 정수 n은 대상 principal이 가져야 하는 컴포넌트 수를 나타내요. 일치하면 principal의 realm을 $0으로, principal의 n번째 컴포넌트를 $n으로 대체해 string에서 문자열이 형성돼요. 예를 들어 principal이 druid/admin이면 [2:$2$1suffix]는 문자열 admindruidsuffix를 만들 거예요. 이 문자열이 regexp와 일치하면 s//[g] 대체 명령이 문자열에 대해 실행돼요. 선택적 g는 문자열의 첫 번째 일치만 대체하는 대신 대체가 문자열 전체에 대해 전역적으로 수행되게 해요. 필요한 경우 여러 규칙을 개행 문자로 연결해 String으로 지정할 수 있어요.

큰 SPNEGO negotiate 헤더를 위한 HTTP 헤더 크기 증가 (Increasing HTTP Header size for large SPNEGO negotiate header)

Active Directory 환경에서 Authorization 헤더의 SPNEGO 토큰은 사용자의 모든 보안 그룹을 포함하는 PAC(Privilege Access Certificate) 정보를 포함해요. 사용자가 많은 보안 그룹에 속한 경우 헤더가 druid가 기본 처리할 수 있는 크기를 넘어설 수 있어요. 이런 경우 druid.server.http.maxRequestHeaderSize(기본 8KiB)와 druid.router.http.maxRequestBufferSize(기본 8KiB)를 설정해 druid가 처리할 수 있는 최대 요청 헤더 크기를 늘릴 수 있어요.

Kerberos 승격 클라이언트 구성 (Configuring Kerberos Escalated Client)

Druid 내부 프로세스는 승격(escalated) http Client를 사용해 서로 통신해요. Kerberos가 활성화된 승격 HTTP 클라이언트는 다음 속성으로 구성할 수 있어요:

| Property | Example Values | Description | Default | required | | druid.escalator.type | kerberos | Type of Escalator client used for internal process communication. | n/a | Yes | | druid.escalator.internalClientPrincipal | [email protected] | Principal user name, used for internal process communication | n/a | Yes | | druid.escalator.internalClientKeytab | /etc/security/keytabs/druid.keytab | Path to keytab file used for internal process communication | n/a | Yes | | druid.escalator.authorizerName | MyBasicAuthorizer | Authorizer that requests should be directed to. | n/a | Yes |

Kerberos 보안이 활성화된 상태에서 Druid HTTP 엔드포인트 접근 (Accessing Druid HTTP end points when kerberos security is enabled)

curl로 druid HTTP 엔드포인트에 접근하려면 먼저 kinit 명령으로 로그인해야 해요 — kinit -k -t <path_to_keytab_file> [email protected]

로그인이 성공하면 klist 명령으로 로그인이 성공했는지 확인하세요.

이제 curl --negotiate -u:anyUser -b ~/cookies.txt -c ~/cookies.txt -X POST -H'Content-Type: application/json' <HTTP_END_POINT> 명령으로 druid HTTP 엔드포인트에 접근할 수 있어요. 예를 들어 query.json 파일에서 쿼리를 Druid Broker로 보내려면 — curl --negotiate -u:anyUser -b ~/cookies.txt -c ~/cookies.txt -X POST -H'Content-Type: application/json' http://broker-host:port/druid/v2/?pretty -d @query.json 명령을 사용하세요. 참고: 위 명령은 SPNego negotiate 메커니즘으로 처음에 사용자를 인증하고 인증 쿠키를 파일에 저장해요. 이후 요청에는 쿠키가 인증에 사용돼요.

웹 브라우저에서 Coordinator 또는 Overlord 콘솔 접근 (Accessing Coordinator or Overlord console from web browser)

브라우저에서 Coordinator/Overlord 콘솔에 접근하려면 브라우저를 SPNego 인증용으로 다음과 같이 구성해야 해요:

  • Safari — 구성이 필요하지 않아요.
  • Firefox — Firefox를 열고 다음 단계를 따르세요: about:config로 가서 network.negotiate-auth.trusted-uris를 검색하세요. 더블클릭하고 다음 값을 추가하세요: "http://druid-coordinator-hostname:ui-port" 및 "http://druid-overlord-hostname:port"
  • Google Chrome — 명령줄에서 다음 명령을 실행하세요: google-chrome --auth-server-whitelist="druid-coordinator-hostname" --auth-negotiate-delegate-whitelist="druid-coordinator-hostname" 및 google-chrome --auth-server-whitelist="druid-overlord-hostname" --auth-negotiate-delegate-whitelist="druid-overlord-hostname"
  • Internet Explorer — 신뢰할 수 있는 웹 사이트에 "druid-coordinator-hostname"과 "druid-overlord-hostname"을 포함하세요. UI 웹 사이트에 대한 협상을 허용하세요.

프로그래밍 방식으로 쿼리 보내기 (Sending Queries programmatically)

Apache Commons HttpComponents와 같은 많은 HTTP 클라이언트 라이브러리는 이미 SPNEGO 인증 수행을 지원해요. 사용 가능한 HTTP 클라이언트 라이브러리 중 아무거나 사용해 druid 클러스터와 통신할 수 있어요.

더 알아보기 (Learn more)