Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

데이터베이스 서비스 계정 관리

데이터베이스 서비스 계정은 인증을 위해 별도의 비밀번호 또는 인증서를 사용하는 사용자 계정처럼 단순한 형태일 수도 있습니다. 고급 사용자의 경우 SET ROLE을 사용해 권한 범위를 동적으로 변경할 수 있는 계정을 설정하면, 로그아웃하거나 콘텐츠를 다시 로드하지 않고도 프로필 간에 빠르게 전환할 수 있습니다.

개요

SET ROLE은 세션 동안 서비스 계정의 권한 범위를 동적으로 제한하는 데 사용할 수 있습니다. 이는 사용자의 유효 권한을 활성화된 역할이 부여한 권한으로만 한정하는 방식으로 작동합니다. 이 방식에는 다음과 같은 장점이 있습니다:

  • 서비스 계정에 여러 역할을 할당해 두고, 특정 쿼리에 필요한 역할만 활성화할 수 있습니다.
  • 서비스 계정이 손상되더라도 공격자는 현재 활성화된 역할의 권한만 사용할 수 있습니다.
  • 작업마다 별도의 자격 증명을 사용할 필요 없이, 하나의 계정이 역할을 전환하며 다양한 작업을 수행할 수 있습니다.
  • 개별 사용자를 일일이 수정하지 않고 역할 하나만 변경해도 해당 범주의 서비스 계정 전체에 대한 권한을 업데이트할 수 있습니다.
  • 로그를 통해 쿼리 실행 중 어떤 역할이 활성화되어 있었는지 추적할 수 있어 보안 감사 시 더 명확한 맥락을 제공합니다.

실제로는 다음과 같이 합니다:

  1. 허용된 범위(read_only, maintenance 등)를 나타내는 역할을 설계합니다
  2. 해당 역할을 서비스 계정에 부여합니다
  3. connection 시점에 SET ROLE(또는 role 매개변수)을 통해 활성 역할을 선택하여, 해당 세션에서 수행할 수 있는 작업을 제한합니다

서비스 역할 설정

서비스 계정에 역할 부여

먼저 원하는 권한/설정으로 역할을 생성한 다음, 이를 서비스 계정에 부여합니다.

CREATE ROLE read_only_role;
GRANT SELECT ON db1.* TO read_only_role;

CREATE ROLE maint_role;
GRANT SELECT, INSERT, ALTER on db1.* TO maint_role;

GRANT read_only_role, maint_role TO service_user;

`SET ROLE`을 사용해 세션 경계 정의

세션이 시작될 때 서비스 계정은 어떤 역할을 활성화할지 선택합니다.

-- 이 세션에서는 읽기 전용 동작만 사용
SET ROLE read_only_role;

또는:

-- 부여된 모든 역할 사용(전체 권한)
SET ROLE ALL;

SET ROLE은 현재 사용자의 역할을 활성화합니다. 유효 권한은 활성화된 모든 역할 권한의 합집합에 사용자에게 직접 부여된 권한을 더한 것입니다.

모든 역할을 비활성화할 수도 있습니다:

SET ROLE NONE;

또는 여러 역할을 활성화할 수 있습니다:

SET ROLE read_only_role, maint_role;

현재 활성화된 역할은 system.current_roles를 통해 확인할 수 있습니다.

서비스 계정의 기본 역할 설정

서비스 계정이 항상 제한된 모드로 시작하도록 하려면 기본 역할을 구성합니다:

SET DEFAULT ROLE read_only_role TO service_user;

또는

SET DEFAULT ROLE ALL EXCEPT maint_role TO service_user;

HTTP를 통해 / 프로그래밍 방식으로 `SET ROLE` 사용

서비스 계정이 HTTP를 통해 연결하는 경우 SET ROLE; SELECT ...를 여러 SQL 문으로 함께 보낼 수 없습니다. 대신 역할을 쿼리 매개변수(query parameter)로 전달하십시오:

curl "https://host:8123?user=service_user&password=...&role=read_only_role" \
 --data-binary "SELECT * FROM db1.table1"

?role=…은 해당 SQL 문을 실행하기 전에 SET ROLE read_only_role를 실행하는 것과 같습니다. 여러 role 매개변수는 SET ROLE role 1, role 2처럼 동작합니다.

일부 드라이버(예: Python용 ClickHouse Connect)는 각 요청과 함께 전송되는 역할 설정도 제공하며, 서버는 이를 세션 역할로 사용합니다.

Navigation