본문으로 바로가기
본문으로 바로가기

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

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

개요

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

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

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

  1. 허용 범위(read_only, 메ン테ナンス 등)를 나타내는 역할을 설계합니다.
  2. 해당 역할을 서비스 계정에 부여합니다.
  3. 연결 시점에 SET 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 ...를 다중 문으로 전송할 수 없습니다. 대신 역할을 쿼리 매개변수로 전달하십시오.

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

?role=...은 문 실행 전에 SET ROLE read_only_role를 실행하는 것과 동일합니다. 여러 역할 매개변수는 SET ROLE role 1, role 2처럼 동작합니다.

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