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