데이터베이스 서비스 계정 관리
데이터베이스 서비스 계정은 인증을 위해 별도의 비밀번호 또는 인증서를 사용하는 사용자처럼 단순한 형태일 수 있습니다. 숙련된 사용자는 로그아웃하거나 콘텐츠를 다시 로드하지 않고도 프로필 간에 빠르게 전환할 수 있도록, SET ROLE로 권한 범위를 동적으로 변경할 수 있는 계정을 구성할 수도 있습니다.
개요
SET ROLE은 세션 동안 서비스 계정의 권한 범위를 동적으로 제한하는 데 사용할 수 있습니다. 이는 사용자의 유효 권한을 활성화된 역할이 부여한 권한으로만 제한하는 방식으로 동작합니다. 이 접근 방식에는 다음과 같은 여러 장점이 있습니다.
- 서비스 계정에 여러 역할을 할당할 수 있지만, 특정 쿼리에 필요한 역할만 활성화할 수 있습니다.
- 서비스 계정이 손상되더라도 공격자는 활성화된 역할의 권한만 사용할 수 있습니다.
- 각 작업마다 별도의 자격 증명이 필요하지 않으며, 하나의 계정으로 역할을 전환해 다양한 작업을 수행할 수 있습니다.
- 개별 사용자를 각각 업데이트하는 대신, 하나의 역할만 수정해 서비스 계정 전체 범주의 권한을 업데이트할 수 있습니다.
- 로그에서 쿼리 실행 중 어떤 역할이 활성화되어 있었는지 추적할 수 있으므로, 보안 감사 시 더 명확한 맥락을 제공합니다.
실제로는 다음과 같이 합니다.
- 허용 범위(read_only, 메ン테ナンス 등)를 나타내는 역할을 설계합니다.
- 해당 역할을 서비스 계정에 부여합니다.
- 연결 시점에
SET ROLE(또는 역할 매개변수)을 통해 활성 역할을 선택하여 해당 세션에서 수행할 수 있는 작업을 제한합니다.
서비스 역할 설정
SET ROLE을 사용해 세션별 권한 범위 정의
세션 시작 시 서비스 계정은 활성화할 역할을 선택합니다.
또는 다음과 같이 지정할 수 있습니다.
SET ROLE은 현재 사용자의 역할을 활성화합니다. 유효 권한은 활성화된 모든 역할의 권한 합집합과 사용자에게 직접 부여된 권한으로 구성됩니다.
모든 역할을 비활성화할 수도 있습니다.
또는 여러 역할을 활성화할 수 있습니다.
현재 활성화된 역할은 system.current_roles를 통해 확인할 수 있습니다.
HTTP/프로그래밍 방식에서 SET ROLE 사용
서비스 계정이 HTTP를 통해 연결하는 경우 SET ROLE; SELECT ...를 다중 문으로 전송할 수 없습니다. 대신 역할을 쿼리 매개변수로 전달하십시오.
?role=...은 문 실행 전에 SET ROLE read_only_role를 실행하는 것과 동일합니다. 여러 역할 매개변수는 SET ROLE role 1, role 2처럼 동작합니다.
일부 드라이버(예: Python용 ClickHouse Connect)는 각 요청과 함께 전송되는 역할 설정도 제공하며, 서버는 이를 세션 역할로 사용합니다.