ClickHouse 접근 제어

ClickHouse 접근 제어 (Access Control)

ClickHouse는 RBAC(Role-Based Access Control, 역할 기반 접근 제어) 방식의 접근 제어 관리를 지원해요. 접근 엔티티(access entity)는 사용자 계정(User), 역할(Role), 행 정책(Row Policy), 설정 프로파일(Settings Profile), 쿼터(Quota)로 나뉘어요.

접근 엔티티는 SQL 기반 워크플로우와 서버 설정 파일(users.xml, config.xml) 두 가지로 구성할 수 있어요. 공식 문서는 SQL 기반 워크플로우를 권장해요. 두 방식이 동시에 동작하지만, 같은 접근 엔티티를 동시에 두 방식으로 관리할 수는 없어요.

출처: https://clickhouse.com/docs/operations/access-rights

기본 사용자

기본적으로 ClickHouse 서버는 default 사용자 계정을 제공해요. 이 계정은 SQL 기반 접근 제어를 쓰지 않지만 모든 권한을 가져요. 사용자 이름이 지정되지 않으면(로그인, 분산 쿼리) default 계정이 사용돼요.

처음 시작할 때 권장 시나리오:

  1. default 사용자에 대해 SQL 기반 접근 제어를 활성화해요.
  2. default로 로그인해서 필요한 사용자를 모두 만들어요. 관리자를 꼭 만들어요: GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION.
  3. default 사용자의 권한을 제한하고 SQL 기반 접근 제어를 비활성화해요.

접근 엔티티

User account (사용자 계정)

누군가를 인증하는 접근 엔티티예요. 다음을 포함해요.

  • 식별 정보
  • 사용자가 실행할 수 있는 쿼리 범위를 정의하는 권한(Privileges)
  • 연결을 허용하는 호스트
  • 할당된 역할·기본 역할
  • 로그인 시 기본 적용되는 설정·제약
  • 할당된 설정 프로파일

권한 부여는 GRANT, 회수는 REVOKE, 목록은 SHOW GRANTS. 관리 쿼리: CREATE USER, ALTER USER, DROP USER, SHOW USERS.

Role (역할)

사용자 계정에 부여할 수 있는 접근 엔티티 컨테이너예요. 권한, 설정과 제약, 할당된 역할 목록을 포함해요. 관리 쿼리: CREATE ROLE, ALTER ROLE, DROP ROLE, SET ROLE, SET DEFAULT ROLE, SHOW ROLES.

Row policy (행 정책)

사용자나 역할에게 어떤 행이 보이는지 정의하는 필터예요. 특정 테이블에 대한 필터와 그 정책을 쓸 역할/사용자 목록을 포함해요. 행 정책은 readonly 접근일 때만 의미가 있어요. 관리 쿼리: CREATE ROW POLICY, ALTER ROW POLICY, DROP ROW POLICY, SHOW POLICIES.

Settings profile (설정 프로파일)

설정과 제약, 적용 대상 역할/사용자 목록의 모음이에요. 관리 쿼리: CREATE SETTINGS PROFILE, ALTER SETTINGS PROFILE, DROP SETTINGS PROFILE, SHOW PROFILES.

Quota (쿼터)

리소스 사용을 제한해요. 시간 구간별 한도와 적용 대상 역할/사용자 목록을 포함해요. 관리 쿼리: CREATE QUOTA, ALTER QUOTA, DROP QUOTA, SHOW QUOTA(S).

SQL 기반 접근 제어 활성화

  1. access_control_path 서버 설정으로 저장 디렉터리를 정해요.
  2. users.xml에서 최소한 한 사용자에 대해 SQL 기반 접근 제어를 활성화해요. <default> 사용자에 아래 설정을 추가해요.
<access_management>1</access_management>
<named_collection_control>1</named_collection_control>
<show_named_collections>1</show_named_collections>
<show_named_collections_secrets>1</show_named_collections_secrets>
  1. 노드를 재시작하고 클라이언트로 접속해요.
clickhouse-client --user default --password <password>

사용자·역할 정의 예시

CREATE USER clickhouse_admin IDENTIFIED BY 'password';
GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION;

WITH GRANT OPTION이 있어야 다른 사용자에게 권한을 부여할 수 있고, 권한을 이미 가진 사용자만 부여할 수 있어요. ALTER 계열 권한은 계층적이지만 반드시 명시적으로 정의해야 해요. 전체 목록은 SHOW ACCESS로 확인할 수 있어요.

더 알아보기