LDAP
LDAP (LDAP)
LDAP 서버를 사용해 ClickHouse 사용자를 인증할 수 있어요. 이를 위한 두 가지 다른 접근 방식이 있습니다: 기존 사용자를 위한 외부 인증기로 사용하거나, 외부 사용자 디렉터리로 사용하는 것입니다.
출처: 문서
본문
이 페이지는 ClickHouse Cloud에는 적용되지 않아요. 여기서 설명하는 기능은 ClickHouse Cloud 서비스에서는 사용할 수 없습니다.
ClickHouse Cloud Compatibility 가이드를 함께 참고해 주세요.
LDAP 서버를 사용해 ClickHouse 사용자를 인증할 수 있습니다. 이를 위한 두 가지 다른 접근 방식이 있습니다:
- 기존 사용자(
users.xml또는 로컬 접근 제어 경로에 정의된)를 위한 외부 인증기로 LDAP 사용. - 외부 사용자 디렉터리로 LDAP을 사용하고, 로컬에 정의되지 않은 사용자가 LDAP 서버에 존재하면 인증을 허용.
두 접근 방식 모두, 설정의 다른 부분이 참조할 수 있도록 ClickHouse 설정에 내부적으로 이름이 붙은 LDAP 서버가 정의되어 있어야 합니다.
LDAP 서버 정의 (LDAP server definition)
LDAP 서버를 정의하려면 config.xml에 ldap_servers 섹션을 추가해야 합니다.
예시
<clickhouse>
<!- ... -->
<ldap_servers>
<!- Typical LDAP server. -->
<my_ldap_server>
<host>localhost</host>
<port>636</port>
<bind_dn>uid={user_name},ou=users,dc=example,dc=com</bind_dn>
<verification_cooldown>300</verification_cooldown>
<follow_referrals>false</follow_referrals>
<enable_tls>yes</enable_tls>
<tls_minimum_protocol_version>tls1.2</tls_minimum_protocol_version>
<tls_require_cert>demand</tls_require_cert>
<tls_cert_file>/path/to/tls_cert_file</tls_cert_file>
<tls_key_file>/path/to/tls_key_file</tls_key_file>
<tls_ca_cert_file>/path/to/tls_ca_cert_file</tls_ca_cert_file>
<tls_ca_cert_dir>/path/to/tls_ca_cert_dir</tls_ca_cert_dir>
<tls_cipher_suite>ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:AES256-GCM-SHA384</tls_cipher_suite>
</my_ldap_server>
<!- Typical Active Directory with configured user DN detection for further role mapping. -->
<my_ad_server>
<host>localhost</host>
<port>389</port>
<bind_dn>EXAMPLE\{user_name}</bind_dn>
<user_dn_detection>
<base_dn>CN=Users,DC=example,DC=com</base_dn>
<search_filter>(&(objectClass=user)(sAMAccountName={user_name}))</search_filter>
</user_dn_detection>
<enable_tls>no</enable_tls>
</my_ad_server>
</ldap_servers>
</clickhouse>
ldap_servers 섹션 안에 서로 다른 이름으로 여러 LDAP 서버를 정의할 수 있다는 점을 기억하세요.
파라미터
| 파라미터 | 기본값 | 설명 |
|---|---|---|
host |
— | LDAP 서버 호스트명 또는 IP. 이 파라미터는 필수이며 비어 있을 수 없습니다. |
port |
636 / 389 |
LDAP 서버 포트. enable_tls가 yes이면 636, 그렇지 않으면 389가 기본값입니다. |
bind_dn |
— | 바인딩할 DN을 구성하는 데 사용되는 템플릿. 인증 시도마다 템플릿의 모든 {user_name} 부분 문자열이 실제 사용자 이름으로 대체되어 결과 DN이 구성됩니다. |
auth_dn_prefix |
— | 더 이상 사용되지 않음. bind_dn의 대안. bind_dn과 함께 사용할 수 없습니다. 지정하면 바인드 DN이 auth_dn_prefix + {user_name} + auth_dn_suffix로 구성됩니다. 예를 들어 auth_dn_prefix를 uid=로, auth_dn_suffix를 ,ou=users,dc=example,dc=com으로 설정하는 것은 bind_dn을 uid={user_name},ou=users,dc=example,dc=com으로 설정하는 것과 같습니다. |
auth_dn_suffix |
— | 더 이상 사용되지 않음. auth_dn_prefix 참고. |
verification_cooldown |
0 |
성공적인 바인드 시도 후의 시간(초)으로, 이 기간 동안은 LDAP 서버에 접촉하지 않고 사용자가 모든 연속 요청에 대해 성공적으로 인증된 것으로 간주합니다. 0을 지정하면 캐싱을 비활성화하고 매 인증 요청마다 LDAP 서버에 접촉하도록 강제합니다. |
follow_referrals |
false |
LDAP 클라이언트 라이브러리가 서버가 반환한 LDAP referral을 자동으로 추적하도록 허용하는 플래그. 주로 높은 수준의 base DN(예: DC=example,DC=com)에서의 하위 트리 검색이 referral/검색 참조(예: DC=DomainDnsZones,...)를 반환할 수 있는 Microsoft Active Directory 환경에서 관련됩니다. 명시적으로 파티션 간 검색이 필요할 때만 true로 설정하세요. |
enable_tls |
yes |
LDAP 서버에 대한 보안 연결 사용을 트리거하는 플래그. 일반 텍스트 ldap:// 프로토콜은 no(권장되지 않음), LDAP over SSL/TLS ldaps:// 프로토콜은 yes(권장), 레거시 StartTLS 프로토콜(일반 텍스트 ldap:// 프로토콜을 TLS로 업그레이드)은 starttls로 지정합니다. |
tls_minimum_protocol_version |
tls1.2 |
SSL/TLS의 최소 프로토콜 버전. 허용 값: ssl2, ssl3, tls1.0, tls1.1, tls1.2. |
tls_require_cert |
demand |
SSL/TLS 피어 인증서 검증 동작. 허용 값: never, allow, try, demand. |
tls_cert_file |
— | 인증서 파일 경로. |
tls_key_file |
— | 인증서 키 파일 경로. |
tls_ca_cert_file |
— | CA 인증서 파일 경로. |
tls_ca_cert_dir |
— | CA 인증서가 들어 있는 디렉터리 경로. |
tls_cipher_suite |
— | 허용된 cipher suite (OpenSSL 표기). |
search_limit |
256 |
이 서버 정의가 수행하는 LDAP 검색 쿼리(사용자 DN 감지와 역할 매핑용)가 반환할 수 있는 최대 항목 수. |
user_dn_detection 하위 파라미터
바인드된 사용자의 실제 사용자 DN을 감지하기 위한 LDAP 검색 파라미터가 있는 섹션. 주로 서버가 Active Directory일 때 추가 역할 매핑을 위한 검색 필터에서 사용됩니다. 결과 사용자 DN은 {user_dn} 부분 문자열이 허용되는 모든 곳에서 대체할 때 사용됩니다. 기본적으로 사용자 DN은 바인드 DN과 같게 설정되지만, 검색이 수행되면 실제 감지된 사용자 DN 값으로 업데이트됩니다.
| 파라미터 | 기본값 | 설명 |
|---|---|---|
base_dn |
— | LDAP 검색의 base DN을 구성하는 데 사용되는 템플릿. LDAP 검색 중 템플릿의 모든 {user_name}과 {bind_dn} 부분 문자열이 실제 사용자 이름과 바인드 DN으로 대체되어 결과 DN이 구성됩니다. |
scope |
subtree |
LDAP 검색의 범위. 허용 값: base, one_level, children, subtree. |
search_filter |
— | LDAP 검색의 검색 필터를 구성하는 데 사용되는 템플릿. LDAP 검색 중 템플릿의 모든 {user_name}, {bind_dn}, {base_dn} 부분 문자열이 실제 사용자 이름, 바인드 DN, base DN으로 대체되어 결과 필터가 구성됩니다. XML에서 특수 문자는 올바르게 이스케이프해야 합니다. |
LDAP 외부 인증기 (LDAP external authenticator)
원격 LDAP 서버를 로컬에 정의된 사용자(users.xml이나 로컬 접근 제어 경로에 정의된)의 비밀번호를 검증하는 방법으로 사용할 수 있습니다. 이를 위해 사용자 정의에서 password나 유사한 섹션 대신 앞서 정의한 LDAP 서버 이름을 지정하세요.
각 로그인 시도에서 ClickHouse는 제공된 자격 증명으로 LDAP 서버 정의의 bind_dn 파라미터가 정의한 지정 DN에 "바인드"하려고 시도하며, 성공하면 사용자가 인증된 것으로 간주됩니다. 이는 종종 "simple bind" 방법이라고 합니다.
예시
<clickhouse>
<!- ... -->
<users>
<!- ... -->
<my_user>
<!- ... -->
<ldap>
<server>my_ldap_server</server>
</ldap>
</my_user>
</users>
</clickhouse>
사용자 my_user가 my_ldap_server를 참조한다는 점을 기억하세요. 이 LDAP 서버는 앞서 설명한 대로 메인 config.xml 파일에 구성되어 있어야 합니다.
SQL 기반 접근 제어 및 계정 관리가 활성화되면, LDAP 서버가 인증하는 사용자도 CREATE USER 문으로 만들 수 있습니다.
쿼리
CREATE USER my_user IDENTIFIED WITH ldap SERVER 'my_ldap_server';
LDAP 외부 사용자 디렉터리 (LDAP external user directory)
로컬에 정의된 사용자에 더해, 원격 LDAP 서버를 사용자 정의의 출처로 사용할 수 있습니다. 이를 위해 config.xml 파일의 users_directories 섹션 안의 ldap 섹션에 앞서 정의한 LDAP 서버 이름(LDAP Server Definition 참고)을 지정하세요.
각 로그인 시도에서 ClickHouse는 로컬에서 사용자 정의를 찾아 평소처럼 인증하려고 합니다. 사용자가 정의되어 있지 않으면 ClickHouse는 그 정의가 외부 LDAP 디렉터리에 존재한다고 가정하고, 제공된 자격 증명으로 LDAP 서버의 지정 DN에 "바인드"하려고 시도합니다. 성공하면 사용자가 존재하고 인증된 것으로 간주됩니다. 사용자는 roles 섹션에 지정된 목록의 역할을 할당받습니다. 추가로, role_mapping 섹션도 구성되어 있으면 LDAP "검색"을 수행하고 결과를 변환해 역할 이름으로 취급한 다음 사용자에게 할당할 수 있습니다. 이 모든 것은 SQL 기반 접근 제어 및 계정 관리가 활성화되고 역할이 CREATE ROLE 문으로 생성되었음을 전제합니다.
예시
config.xml에 들어가는 내용입니다.
<clickhouse>
<!- ... -->
<user_directories>
<!- Typical LDAP server. -->
<ldap>
<server>my_ldap_server</server>
<roles>
<my_local_role1 />
<my_local_role2 />
</roles>
<role_mapping>
<base_dn>ou=groups,dc=example,dc=com</base_dn>
<scope>subtree</scope>
<search_filter>(&(objectClass=groupOfNames)(member={bind_dn}))</search_filter>
<attribute>cn</attribute>
<prefix>clickhouse_</prefix>
</role_mapping>
</ldap>
<!- Typical Active Directory with role mapping that relies on the detected user DN. -->
<ldap>
<server>my_ad_server</server>
<role_mapping>
<base_dn>CN=Users,DC=example,DC=com</base_dn>
<attribute>CN</attribute>
<scope>subtree</scope>
<search_filter>(&(objectClass=group)(member={user_dn}))</search_filter>
<prefix>clickhouse_</prefix>
</role_mapping>
</ldap>
</user_directories>
</clickhouse>
user_directories 섹션 안의 ldap 섹션에서 참조하는 my_ldap_server는 config.xml에 구성된 앞서 정의된 LDAP 서버여야 합니다(LDAP Server Definition 참고).
파라미터
| 파라미터 | 기본값 | 설명 |
|---|---|---|
server |
— | 위 ldap_servers 설정 섹션에서 정의된 LDAP 서버 이름 중 하나. 이 파라미터는 필수이며 비어 있을 수 없습니다. |
roles |
— | LDAP 서버에서 가져온 각 사용자에게 할당될 로컬에 정의된 역할의 목록이 있는 섹션. 여기나 역할 매핑 중(아래)에 역할이 지정되지 않으면 사용자는 인증 후 어떤 작업도 수행할 수 없습니다. |
role_mapping 하위 파라미터
LDAP 검색 파라미터와 매핑 규칙이 있는 섹션. 사용자가 인증하면, LDAP에 바인드된 상태에서 로그인한 사용자의 이름으로 search_filter를 사용해 LDAP 검색이 수행됩니다. 그 검색 중에 발견된 각 항목에 대해 지정된 속성의 값이 추출됩니다. 지정된 접두사를 가진 각 속성 값에 대해 접두사가 제거되고, 값의 나머지 부분이 ClickHouse에 정의된 로컬 역할의 이름이 됩니다. 이 역할은 CREATE ROLE 문으로 미리 생성되어 있어야 합니다. 같은 ldap 섹션 안에 여러 role_mapping 섹션을 정의할 수 있습니다. 모두 적용됩니다.
| 파라미터 | 기본값 | 설명 |
|---|---|---|
base_dn |
— | LDAP 검색의 base DN을 구성하는 데 사용되는 템플릿. LDAP 검색마다 템플릿의 모든 {user_name}, {bind_dn}, {user_dn} 부분 문자열이 실제 사용자 이름, 바인드 DN, 사용자 DN으로 대체되어 결과 DN이 구성됩니다. |
scope |
subtree |
LDAP 검색의 범위. 허용 값: base, one_level, children, subtree. |
search_filter |
— | LDAP 검색의 검색 필터를 구성하는 데 사용되는 템플릿. LDAP 검색마다 템플릿의 모든 {user_name}, {bind_dn}, {user_dn}, {base_dn} 부분 문자열이 실제 사용자 이름, 바인드 DN, 사용자 DN, base DN으로 대체되어 결과 필터가 구성됩니다. XML에서 특수 문자는 올바르게 이스케이프해야 합니다. |
attribute |
cn |
LDAP 검색이 반환할 값이 있는 속성 이름. |
prefix |
empty | LDAP 검색이 반환한 원래 문자열 목록의 각 문자열 앞에 있을 것으로 예상되는 접두사. 접두사는 원래 문자열에서 제거되고 결과 문자열은 로컬 역할 이름으로 취급됩니다. |