접근 제어와 계정 관리
접근 제어와 계정 관리 (Access control and account management)
ClickHouse는 RBAC 방식에 기반한 접근 제어 관리를 지원해요. 사용자 계정, 역할, 행 정책, 설정 프로필, 할당량 같은 접근 엔티티를 관리할 수 있습니다.
출처: 문서
본문
ClickHouse는 RBAC 방식에 기반한 접근 제어 관리를 지원합니다.
ClickHouse 접근 엔티티:
접근 엔티티는 다음을 사용해 구성할 수 있습니다:
SQL 기반 워크플로를 권장합니다. 두 구성 방법 모두 동시에 작동하므로, 계정과 접근 권한 관리에 서버 구성 파일을 사용하고 있다면 SQL 기반 워크플로로 부드럽게 전환할 수 있습니다.
동일한 접근 엔티티를 두 구성 방법으로 동시에 관리할 수는 없습니다.
ClickHouse Cloud 콘솔 사용자 관리를 원한다면 이 페이지를 참고하세요.
모든 사용자, 역할, 프로필 등을 확인하려면 SHOW ACCESS 문을 사용하세요.
개요 (Overview)
기본적으로 ClickHouse 서버는 default 사용자 계정을 제공하며, 이 계정은 SQL 기반 접근 제어 및 계정 관리를 사용할 수 없지만 모든 권한을 가집니다. default 사용자 계정은 사용자 이름이 정의되지 않은 모든 경우(예: 클라이언트에서 로그인하거나 분산 쿼리에서)에 사용됩니다. 분산 쿼리 처리에서 서버나 클러스터의 구성이 사용자와 비밀번호 속성을 지정하지 않으면 기본 사용자 계정이 사용됩니다.
방금 ClickHouse 사용을 시작했다면 다음 시나리오를 고려해 보세요:
default사용자에 대해 SQL 기반 접근 제어 및 계정 관리를 활성화합니다.default사용자 계정으로 로그인해 필요한 모든 사용자를 만듭니다. 관리자 계정을 만드는 것도 잊지 마세요 (GRANT ALL ON *.* TO admin_user_account WITH GRANT OPTION).default사용자의 권한을 제한하고 그에 대한 SQL 기반 접근 제어 및 계정 관리를 비활성화합니다.
현재 솔루션의 속성 (Properties of current solution)
- 존재하지 않는 데이터베이스와 테이블에 대해서도 권한을 부여할 수 있습니다.
- 테이블이 삭제되면 그 테이블에 해당하는 모든 권한이 해지되지 않습니다. 즉, 나중에 같은 이름으로 새 테이블을 만들어도 모든 권한이 유효하게 유지됩니다. 삭제된 테이블에 해당하는 권한을 해지하려면 예를 들어
REVOKE ALL PRIVILEGES ON db.table FROM ALL쿼리를 실행해야 합니다. - 권한에는 수명(lifetime) 설정이 없습니다.
사용자 계정 (User account)
사용자 계정은 누군가를 ClickHouse에서 인가(authorize)할 수 있게 해 주는 접근 엔티티입니다. 사용자 계정은 다음을 포함합니다:
- 식별 정보.
- 사용자가 실행할 수 있는 쿼리의 범위를 정의하는 권한.
- ClickHouse 서버에 연결할 수 있는 호스트.
- 할당된 기본 역할(assigned and default roles).
- 사용자 로그인 시 기본으로 적용되는 제약이 있는 설정.
- 할당된 설정 프로필.
권한은 GRANT 쿼리나 역할 할당으로 사용자 계정에 부여될 수 있습니다. 사용자에게서 권한을 해지하려면 ClickHouse는 REVOKE 쿼리를 제공합니다. 사용자의 권한을 나열하려면 SHOW GRANTS 문을 사용하세요.
관리 쿼리:
설정 적용 (Settings applying)
설정은 다르게 구성될 수 있습니다: 사용자 계정에 대해, 부여된 역할에서, 설정 프로필에서. 사용자 로그인 시, 어떤 설정이 서로 다른 접근 엔티티에 구성되어 있다면 이 설정의 값과 제약이 다음과 같이 적용됩니다(높은 순위에서 낮은 순위로):
- 사용자 계정 설정.
- 사용자 계정의 기본 역할에 대한 설정. 어떤 역할들에 설정이 구성되어 있다면 설정 적용 순서는 정의되어 있지 않습니다.
- 사용자나 그 기본 역할에 할당된 설정 프로필의 설정. 어떤 프로필에 설정이 구성되어 있다면 설정 적용 순서는 정의되어 있지 않습니다.
- 기본적으로 또는 기본 프로필에서 서버 전체에 적용되는 설정.
역할 (Role)
역할은 사용자 계정에 부여될 수 있는 접근 엔티티의 컨테이너입니다.
역할은 다음을 포함합니다:
- 권한
- 설정과 제약
- 할당된 역할 목록
관리 쿼리:
권한은 GRANT 쿼리로 역할에 부여될 수 있습니다. 역할에서 권한을 해지하려면 ClickHouse는 REVOKE 쿼리를 제공합니다.
행 정책 (Row policy)
행 정책은 사용자나 역할에게 어떤 행이 제공되는지를 정의하는 필터입니다. 행 정책은 특정 테이블에 대한 필터와, 이 행 정책을 사용해야 하는 역할 및/또는 사용자 목록을 포함합니다.
행 정책은 테이블 데이터가 로컬에서 읽히는 곳에 적용됩니다. Distributed 테이블이나 다른 원격 서버에 읽기를 위임하는 테이블의 경우, 각 서버의 기본 테이블에 정책을 정의하세요: 원격 지원 테이블 자체에 대한 정책은 전송된 쿼리에 적용될 수 없으며, 이를 통한 읽기는 거부됩니다. 기본 테이블에 대한 그러한 정책은 개시자(initiator)가 이미 구축된 읽기 플랜을 전송할 때는 적용되지 않으므로, 행 정책이 적용되어야 하는 사용자에 대해서는 serialize_query_plan = 0을 유지하세요 (issue #112891 참고).
행 정책은 읽기 전용 접근이 있을 때만 의미가 있습니다. 테이블을 수정하거나 테이블 간에 파티션을 복사할 수 있다면, 행 정책의 제한이 무력화됩니다.
관리 쿼리:
설정 프로필 (Settings profile)
설정 프로필은 설정의 모음입니다. 설정 프로필은 설정과 제약, 그리고 이 프로필이 적용되는 역할 및/또는 사용자 목록을 포함합니다.
관리 쿼리:
- CREATE SETTINGS PROFILE
- ALTER SETTINGS PROFILE
- DROP SETTINGS PROFILE
- SHOW CREATE SETTINGS PROFILE
- SHOW PROFILES
할당량 (Quota)
할당량은 리소스 사용을 제한합니다. 할당량 참고.
할당량은 일부 기간에 대한 제한 집합과, 이 할당량을 사용해야 하는 역할 및/또는 사용자 목록을 포함합니다.
관리 쿼리:
SQL 기반 접근 제어 및 계정 관리 활성화하기 (Enabling SQL-driven access control and account management)
-
구성 저장용 디렉터리를 설정합니다. ClickHouse는 접근 엔티티 구성을 access_control_path 서버 구성 파라미터에 설정된 폴더에 저장합니다.
-
적어도 하나의 사용자 계정에 대해 SQL 기반 접근 제어 및 계정 관리를 활성화합니다. ClickHouse와 함께 제공되는
users.xml구성 파일은access_management과named_collection_control을 1로 설정해default사용자에 대해 SQL 기반 접근 제어 및 계정 관리를 활성화합니다. 다른 모든 사용자에 대해서는 두 설정이 모두 기본 0이므로 명시적으로 설정해야 합니다.show_named_collections_secrets는default사용자에게도 기본 0입니다. named collection을 관리할 수 있다는 것이 그 안에 이미 저장된 자격 증명을 읽어 올 수 있다는 뜻은 아니기 때문입니다. 사용자는 자신이 가진 권한만 부여할 수 있으므로, 이 설정이 0인 한 사용자는 완전한 권한 집합을 갖지 못하고GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION같은 쿼리는 거부됩니다:Not enough privileges. To execute this query, it's necessary to have the grant ALL ON *.* WITH GRANT OPTION. (Missing permissions: SHOW NAMED COLLECTIONS SECRETS ON *)사용자를 완전한 관리자로 만들려면 세 설정을 모두 1로 설정하세요.
SQL 사용자와 역할 정의하기 (Defining SQL users and roles)
ClickHouse Cloud에서 작업한다면 Cloud 접근 관리를 참고하세요.
이 문서는 SQL 사용자와 역할을 정의하고 그 권한과 허가를 데이터베이스, 테이블, 행, 컬럼에 적용하는 기본을 보여줍니다.
SQL 사용자 모드 활성화 (Enabling SQL user mode)
-
users.xml파일의<default>사용자 아래에서 SQL 사용자 모드를 활성화합니다:<access_management>1</access_management> <named_collection_control>1</named_collection_control> <!-- Needed to make the user a complete administrator, otherwise `GRANT ALL ... WITH GRANT OPTION` below is rejected. --> <show_named_collections_secrets>1</show_named_collections_secrets>처음 두 설정은 ClickHouse와 함께 제공되는
users.xml파일에서default사용자에 대해 이미 활성화되어 있습니다.show_named_collections_secrets는 그곳에서 주석 처리되어 있으므로 주석을 해제해야 합니다.
default 사용자는 새로 설치할 때 생성되는 유일한 사용자이며, 기본적으로 노드 간 통신에 사용되는 계정이기도 합니다. 프로덕션에서는 노드 간 통신이 SQL 관리자 사용자와 <secret>, 클러스터 자격 증명, 및/또는 노드 간 HTTP·전송 프로토콜 자격 증명으로 구성된 후에는 default 계정이 노드 간 통신에 사용되므로 이 사용자를 비활성화하는 것이 좋습니다.
-
변경 사항을 적용하려면 노드를 재시작합니다.
-
ClickHouse 클라이언트를 시작합니다:
clickhouse-client --user default --password <password>
사용자 정의하기 (Defining users)
-
SQL 관리자 계정을 만듭니다:
CREATE USER clickhouse_admin IDENTIFIED BY 'password'; -
새 사용자에게 완전한 관리 권한을 부여합니다
GRANT ALL ON *.* TO clickhouse_admin WITH GRANT OPTION;
ALTER 권한 (Alter permissions)
이 문서는 권한을 정의하는 방법과, 특권을 가진 사용자가 ALTER 문을 사용할 때 권한이 어떻게 동작하는지 더 잘 이해하도록 돕기 위한 것입니다.
ALTER 문은 여러 범주로 나뉘며, 일부는 계층적이고 일부는 그렇지 않아 명시적으로 정의해야 합니다.
예시 DB, 테이블, 사용자 구성
- 관리자 사용자로 샘플 사용자를 만듭니다
CREATE USER my_user IDENTIFIED BY 'password';
- 샘플 데이터베이스를 만듭니다
CREATE DATABASE my_db;
- 샘플 테이블을 만듭니다
CREATE TABLE my_db.my_table (id UInt64, column1 String) ENGINE = MergeTree() ORDER BY id;
- 권한을 부여/해지할 샘플 관리자 사용자를 만듭니다
CREATE USER my_alter_admin IDENTIFIED BY 'password';
권한을 부여하거나 해지하려면 관리자 사용자가 WITH GRANT OPTION 권한을 가져야 합니다. 예를 들어:
GRANT ALTER ON my_db.* WITH GRANT OPTION
GRANT 또는 REVOKE 권한을 하려면 사용자가 먼저 그 권한을 스스로 가져야 합니다.
권한 부여 또는 해지 (Granting or Revoking Privileges)
ALTER 계층:
├── ALTER (only for table and view)/
│ ├── ALTER TABLE/
│ │ ├── ALTER UPDATE
│ │ ├── ALTER DELETE
│ │ ├── ALTER COLUMN/
│ │ │ ├── ALTER ADD COLUMN
│ │ │ ├── ALTER DROP COLUMN
│ │ │ ├── ALTER MODIFY COLUMN
│ │ │ ├── ALTER COMMENT COLUMN
│ │ │ ├── ALTER CLEAR COLUMN
│ │ │ └── ALTER RENAME COLUMN
│ │ ├── ALTER INDEX/
│ │ │ ├── ALTER ORDER BY
│ │ │ ├── ALTER SAMPLE BY
│ │ │ ├── ALTER ADD INDEX
│ │ │ ├── ALTER DROP INDEX
│ │ │ ├── ALTER MATERIALIZE INDEX
│ │ │ └── ALTER CLEAR INDEX
│ │ ├── ALTER CONSTRAINT/
│ │ │ ├── ALTER ADD CONSTRAINT
│ │ │ └── ALTER DROP CONSTRAINT
│ │ ├── ALTER TTL/
│ │ │ └── ALTER MATERIALIZE TTL
│ │ ├── ALTER SETTINGS
│ │ ├── ALTER MOVE PARTITION
│ │ ├── ALTER FETCH PARTITION
│ │ └── ALTER FREEZE PARTITION
│ └── ALTER LIVE VIEW/
│ ├── ALTER LIVE VIEW REFRESH
│ └── ALTER LIVE VIEW MODIFY QUERY
├── ALTER DATABASE
├── ALTER USER
├── ALTER ROLE
├── ALTER QUOTA
├── ALTER [ROW] POLICY
└── ALTER [SETTINGS] PROFILE
- 사용자 또는 역할에게
ALTER권한 부여하기
GRANT ALTER on *.* TO my_user를 사용하면 최상위 ALTER TABLE과 ALTER VIEW에만 영향을 줍니다. 다른 ALTER 문은 개별적으로 부여하거나 해지해야 합니다.
예를 들어, 기본 ALTER 권한을 부여합니다:
GRANT ALTER ON my_db.my_table TO my_user;
결과 권한 집합:
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: 706befbc-525e-4ec1-a1a2-ba2508cc09e3
┌─GRANTS FOR my_user───────────────────────────────────────────┐
│ GRANT ALTER TABLE, ALTER VIEW ON my_db.my_table TO my_user │
└──────────────────────────────────────────────────────────────┘
이것은 위 예시의 ALTER TABLE과 ALTER VIEW 아래의 모든 권한을 부여하지만, ALTER ROW POLICY 같은 특정 다른 ALTER 권한은 부여하지 않습니다(위 계층을 다시 보면 ALTER ROW POLICY가 ALTER TABLE이나 ALTER VIEW의 자식이 아님을 알 수 있습니다). 그것들은 명시적으로 부여되거나 해지되어야 합니다.
ALTER 권한의 부분집합만 필요하다면 각각을 별도로 부여할 수 있습니다. 그 권한에 하위 권한이 있다면 그것들도 자동으로 부여됩니다.
예를 들어:
GRANT ALTER COLUMN ON my_db.my_table TO my_user;
권한은 다음과 같이 설정됩니다:
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: 47b3d03f-46ac-4385-91ec-41119010e4e2
┌─GRANTS FOR my_user────────────────────────────────┐
│ GRANT ALTER COLUMN ON default.my_table TO my_user │
└───────────────────────────────────────────────────┘
1 row in set. Elapsed: 0.004 sec.
이것은 또한 다음 하위 권한을 부여합니다:
ALTER ADD COLUMN
ALTER DROP COLUMN
ALTER MODIFY COLUMN
ALTER COMMENT COLUMN
ALTER CLEAR COLUMN
ALTER RENAME COLUMN
- 사용자와 역할에서
ALTER권한 해지하기
REVOKE 문은 GRANT 문과 유사하게 작동합니다.
사용자/역할에게 하위 권한이 부여되었다면, 그 하위 권한을 직접 해지하거나 그것이 상속하는 상위 권한을 해지할 수 있습니다.
예를 들어, 사용자에게 ALTER ADD COLUMN이 부여되었다면
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user;
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user
Query id: 61fe0fdc-1442-4cd6-b2f3-e8f2a853c739
Ok.
0 rows in set. Elapsed: 0.002 sec.
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: 27791226-a18f-46c8-b2b4-a9e64baeb683
┌─GRANTS FOR my_user──────────────────────────────────┐
│ GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user │
└─────────────────────────────────────────────────────┘
권한은 개별적으로 해지할 수 있습니다:
REVOKE ALTER ADD COLUMN ON my_db.my_table FROM my_user;
또는 상위 단계 중 어느 하나에서 해지할 수 있습니다(모든 COLUMN 하위 권한 해지):
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user;
REVOKE ALTER COLUMN ON my_db.my_table FROM my_user
Query id: b882ba1b-90fb-45b9-b10f-3cda251e2ccc
Ok.
0 rows in set. Elapsed: 0.002 sec.
SHOW GRANTS FOR my_user;
SHOW GRANTS FOR my_user
Query id: e7d341de-de65-490b-852c-fa8bb8991174
Ok.
0 rows in set. Elapsed: 0.003 sec.
추가 (Additional)
권한은 WITH GRANT OPTION을 가질 뿐만 아니라 그 권한 자체도 가진 사용자에 의해 부여되어야 합니다.
- 관리자 사용자에게 권한을 부여하고 권한 집합을 관리하게 하려면 아래는 예시입니다:
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;
이제 그 사용자는 ALTER COLUMN과 모든 하위 권한을 부여하거나 해지할 수 있습니다.
테스트 (Testing)
SELECT권한을 추가합니다
GRANT SELECT ON my_db.my_table TO my_user;
- 사용자에게 add column 권한을 추가합니다
GRANT ADD COLUMN ON my_db.my_table TO my_user;
- 제한된 사용자로 로그인합니다
clickhouse-client --user my_user --password password --port 9000 --host <your_clickhouse_host>
- 컬럼 추가를 테스트합니다
ALTER TABLE my_db.my_table ADD COLUMN column2 String;
ALTER TABLE my_db.my_table
ADD COLUMN `column2` String
Query id: d5d6bfa1-b80c-4d9f-8dcd-d13e7bd401a5
Ok.
0 rows in set. Elapsed: 0.010 sec.
DESCRIBE my_db.my_table;
DESCRIBE TABLE my_db.my_table
Query id: ab9cb2d0-5b1a-42e1-bc9c-c7ff351cb272
┌─name────┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ id │ UInt64 │ │ │ │ │ │
│ column1 │ String │ │ │ │ │ │
│ column2 │ String │ │ │ │ │ │
└─────────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
- 컬럼 삭제를 테스트합니다
ALTER TABLE my_db.my_table DROP COLUMN column2;
ALTER TABLE my_db.my_table
DROP COLUMN column2
Query id: 50ad5f6b-f64b-4c96-8f5f-ace87cea6c47
0 rows in set. Elapsed: 0.004 sec.
Received exception from server (version 22.5.1):
Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_user: Not enough privileges. To execute this query it's necessary to have grant ALTER DROP COLUMN(column2) ON my_db.my_table. (ACCESS_DENIED)
- 권한을 부여해 alter admin을 테스트합니다
GRANT SELECT, ALTER COLUMN ON my_db.my_table TO my_alter_admin WITH GRANT OPTION;
- alter admin 사용자로 로그인합니다
clickhouse-client --user my_alter_admin --password password --port 9000 --host <my_clickhouse_host>
- 하위 권한을 부여합니다
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user;
GRANT ALTER ADD COLUMN ON my_db.my_table TO my_user
Query id: 1c7622fa-9df1-4c54-9fc3-f984c716aeba
Ok.
- alter admin 사용자가 가지지 않은, 관리자 사용자의 부여 중 하위 권한이 아닌 권한을 부여하는 것을 테스트합니다.
GRANT ALTER UPDATE ON my_db.my_table TO my_user;
GRANT ALTER UPDATE ON my_db.my_table TO my_user
Query id: 191690dc-55a6-4625-8fee-abc3d14a5545
0 rows in set. Elapsed: 0.004 sec.
Received exception from server (version 22.5.1):
Code: 497. DB::Exception: Received from chnode1.marsnet.local:9440. DB::Exception: my_alter_admin: Not enough privileges. To execute this query it's necessary to have grant ALTER UPDATE ON my_db.my_table WITH GRANT OPTION. (ACCESS_DENIED)
요약 (Summary)
ALTER 권한은 테이블과 뷰에 대한 ALTER에는 계층적이지만 다른 ALTER 문에는 그렇지 않습니다. 권한은 세분화된 수준이나 권한 그룹화로 설정할 수 있고, 유사하게 해지할 수도 있습니다. 부여하거나 해지하는 사용자는 사용자(행위 사용자 자신을 포함)에 권한을 설정하려면 WITH GRANT OPTION을 가져야 하며, 이미 그 권한을 가지고 있어야 합니다. 행위 사용자는 자신이 그랜트 옵션 권한을 가지지 않았다면 자신의 권한을 해지할 수 없습니다.