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 기반 워크플로우를 권장해요. 두 방식이 동시에 동작하지만, 같은 접근 엔티티를 동시에 두 방식으로 관리할 수는 없어요.
기본 사용자
기본적으로 ClickHouse 서버는 default 사용자 계정을 제공해요. 이 계정은 SQL 기반 접근 제어를 쓰지 않지만 모든 권한을 가져요. 사용자 이름이 지정되지 않으면(로그인, 분산 쿼리) default 계정이 사용돼요.
처음 시작할 때 권장 시나리오:
default사용자에 대해 SQL 기반 접근 제어를 활성화해요.default로 로그인해서 필요한 사용자를 모두 만들어요. 관리자를 꼭 만들어요:GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION.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 기반 접근 제어 활성화
access_control_path서버 설정으로 저장 디렉터리를 정해요.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>
- 노드를 재시작하고 클라이언트로 접속해요.
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로 확인할 수 있어요.