Amazon QuickSight RLS(Row Level Security) 사용하기

2024.05.21

안녕하세요, 클래스메소드의 서은우 입니다.

최근에 QuickSight의 RLS(Row Level Security) 기능에 대해 알게 되어 어떠한 기능인지 정리해보고 직접 해보았습니다.

RLS(Row Level Security)란

데이터 세트를 공유하게 되면 사용자가 데이터 세트 안의 모든 데이터들을 확인할 수 있습니다.

RLS(Row Level Security)는 어느 데이터 세트에 대해 엑세스 가능한 데이터의 범위를 행 수준으로 제한할 수 있는 기능으로, RLS를 통해 사용자가 데이터 세트 안의 모든 데이터가 아닌 제한된 데이터만을 볼 수 있게 권한을 설정할 수 있습니다.

RLS는 Enterprise Edtion에서 사용할 수 있으며 특정 QuickSight 유저나 그룹을 기준으로 나누는 방식(user-based rules)과 태그를 기준으로 나누는 방식(tag-based rules), 2가지의 설정 방식이 있습니다.

대시보드에 엑세스 하는 특정 사용자 혹은 그룹을 대상으로 RLS 설정하고 싶은 경우 유저 기반 규칙(user-based rules)을 사용할 수 있으며, 다수의 익명의 사용자를 대상으로 하는 경우, 태그 기반 규칙(tag-based rules)을 사용하여 RLS 를 설정할 수 있습니다.

위 두 방식을 이용하여 RLS 를 설정하게 되면, 설정 기준에 해당하는 대상의 경우 데이터 세트 안의 특정 행의 정보를 참조할 수 없게 되기 때문에, 모든 데이터를 공개하지 않고 설정 내용에 따라 필요한 데이터만 공개하는 것이 가능합니다.

RLS는 데이터 타입이 날짜나 숫자인 경우에는 사용할 수 없으며, 필드의 데이터 타입이 string, varchar 와 같이 텍스트인 경우에만 설정할 수 있다는 점에 주의해 주세요.

직접 해보기

사전 준비

  • QuickSight 유저
  • 데이터 세트(JSON)와 대시보드
  • 유저 기반 규칙(user-based rules)
    • RLS 규칙 세트(CSV 파일)
  • 태그 기반 규칙(tag-based rules)
    • Reader 세션 용량 구매

데이터 세트 준비

본 블로그에서는 각 QuickSight의 유저마다 참조가능한 데이터를 RLS 설정을 통해 제한하고 이를 대시보드를 통해 확인 하고자합니다.

이를 위해 저는 JSON 파일을 데이터 소스로 사용하여 데이터 세트를 작성하고 대시보드를 생성했습니다. JSON을 데이터 소스로 사용하고자 할 경우, 사용하고자 하는 JSON의 구조가 데이터 소스로 사용할 수 있는지에 대해 미리 확인해주세요.

AWS 공식 문서 QuickSight - 지원되는 데이터 소스

제가 사용한 JSON은 아래와 같습니다.

[{
    "order_code":"test_001",
    "total_price":1440,
    "order_user_name":"test_user1",
    "payment_method":"credit_card"
},
{
    "order_code":"test_002",
    "total_price":1320,
    "order_user_name":"test_user2",
    "payment_method":"mobile"
},
{
    "order_code":"test_003",
    "total_price":1000,
    "order_user_name":"test_user3",
    "payment_method":"gift_card"
},
{
    "order_code":"test_004",
    "total_price":5000,
    "order_user_name":"test_user2",
    "payment_method":"credit_card"
}]

각 방식의 RLS 설정을 위해

대시보드에 엑세스하는 대상이 누군지에 따라 어떤 RLS 규칙을 사용할 것인지 결정할 수 있습니다. 그리고 어떤 RLS 규칙을 설정하느냐에 따라 필요한 사전 준비 작업도 달라지게 됩니다.

엑세스 대상이 QuickSight에 등록되어 있는 유저 혹은 그룹인 경우에는 유저 기반 규칙(user-based rules)의 RLS를 설정할 수 있습니다. 유저 기반 규칙은 RLS 규칙이 정의 되어 있는 데이터 세트가 필요하며 CSV 혹은 DB의 테이블로 작성할 수 있습니다.

엑세스 대상이 익명의 사용자인 경우 태그 기반 규칙(tag-based rules)의 RLS 를 설정해야합니다. 유저 기반 규칙과는 다르게 RLS 규칙을 정의한 데이터 세트가 필요 없지만, QuickSight 요금 관리 페이지에서 Reader 세션 용량 요금을 구입해야합니다.(최소 500세션/월 250$)

유저 기반 규칙 RLS

RLS 규칙 정의

유저 기반 규칙을 사용하여 RLS를 설정하기 위해서는 RLS 규칙이 정의 되어 있는 데이터 세트가 필요합니다. 규칙은 여러 타입의 파일 혹은 DB의 테이블로 작성할 수 있습니다. 저는 CSV 파일에 RLS 규칙을 정의하였습니다.

아래의 CSV 파일은 어떤 QuickSight 유저가 어떤 데이터를 참조 가능한지 그 내용을 정의한 것입니다.

test_user1 유저의 경우, order_user_name 필드의 값이 test_user1 인 행에 대해서만 참조가 가능하며, admin 유저의 경우 test_user1, test_user2, test_user3 인 행에 대해서 참조가 가능합니다.

UserName,order_user_name
test_user1,test_user1
test_user2,test_user2
admin,"test_user1,test_user2,test_user3"

QuickSight 콘솔 페이지에 접속하여 위의 csv 파일을 사용해 데이터 세트를 생성합니다.

RLS 설정하기

위에서 생성한 데이터 세트를 RLS를 설정할 대상 데이터 세트에 적용 시키는 것으로 RLS를 설정할 수 있습니다.

RLS 를 설정할 대상 데이터 세트를 선택한 후, 행 수준 보안 설정 화면으로 이동합니다.

그리고 이전의 단계에서 생성한 RLS 규칙이 정의되어 있는 데이터 세트를 선택하고 적용하여 RLS 설정을 완료합니다.

RLS 설정이 완료된 데이터 세트와 해당 데이터 세트로 작성한 대시보드에는 자물쇠 표시가 되어 있는 것을 확인할 수 있습니다.

확인해보기

각 QuickSight 유저로 로그인하여 RLS 설정 결과를 확인해보도록 하겠습니다.

  • admin 유저

  • test_user1 유저

RLS 규칙에 정의된 대로 admin 유저의 대시보드에는 order_user_name 필드가 test_user1, test_user2, test_user3 인 행을 볼 수 있지만, test_user1 유저의 경우 order_user_name 필드가 test_user1 인 행에 대해서만 볼 수 있습니다.

태그 기반 규칙 RLS

태그 기반 규칙은 QuickSight 에 등록되지 않은 익명의 사용자가 대시보드에 엑세스하는 경우에 사용할 수 있습니다. 때문에 태그 기반 규칙을 사용하기 위해서는 Reader 세션 용량이 필요하며 generate-embed-url-for-anonymous-user API 의 파라미터로 세션 태그를 설정하여 사용할 수 있습니다.

익명 사용자를 위한 임베디드 URL 생성에 대해서는 아래의 블로그를 참고해주세요.

RLS 설정하기

태그 기반 규칙은 유저 기반 규칙과는 다르게 규칙을 미리 정의한 데이터 세트를 만들거나 하지 않고, QuickSight 콘솔 화면이나 API를 통해 규칙을 설정할 수 있습니다.

QuickSight 콘솔 페이지에서 RLS 를 설정할 데이터 세트의 태그 기반 규칙 설정값을 켜기로 바꾸고 태그 기반 규칙을 설정합니다. 설정 항목에는 열, 태그, 구분 기호, 모두 일치 등이 있으며 AND 나 OR 같은 조건의 설정도 가능합니다.

저는 특정 주문 유저에 대한 데이터만 공개하기 위해 order_user_name 열에 user 태그 규칙을 설정하였습니다.

확인해보기

generate-embed-url-for-anonymous-user API 를 사용하여 태그를 지정한 임베디드 URL 을 생성하고 생성된 URL 주소로 접속해보겠습니다.

--session-tags 부분에 user 의 값을 test_user1로 지정하고 해당 명령어를 실행합니다.

aws quicksight generate-embed-url-for-anonymous-user \
--aws-account-id xxxxxxxxxxxx \
--namespace default \
--session-tags Key=user,Value=test_user1 \
--authorized-resource-arns "arn:aws:quicksight:ap-northeast-1:xxxxxxxxxxxx:dashboard/dashboard-id" \
--experience-configuration Dashboard={InitialDashboardId=dashboard-id} \

{
    "Status": 200,
    "EmbedUrl": "URL 정보",
    "RequestId": "d42fc416-056a-4def-a526-0e2474d6dbb7",
    "AnonymousUserArn": "arn:aws:quicksight:ap-northeast-1:xxxxxxxxxxxx:anonymousUser/default/3d38bd6c69e047a6998a43072166bb8a"
}

명령어 실행 결과로 반환된 EmbedUrl 주소로 접속해보면 order_user_name 이 test_user1 인 행의 데이터만 표시되는 것을 확인할 수 있습니다.

만약 적절한 세션 태그를 지정하지 않은채 URL을 생성하고 해당 URL에 엑세스해보면, RLS 설정에 의해 대시보드 엑세스 권한이 없다는 것을 확인할 수 있습니다.

끝으로

QuickSight 의 RLS 기능을 직접 사용해보고 소개하면서 스스로도 공부가 많이 되었습니다. RLS 는 데이터의 공개범위를 제한하여 QuickSight 데이터 세트에 관한 보안을 높이는 데에 도움이 되는 기능이라고 생각합니다.

또한 행이 아닌 열 수준으로 공개 범위를 제한할 수 있는 CLS(Column Level Security) 기능도 있으며 필요에 따라 사용할 수 있을 것 같습니다.

참조