면책 조항: 블로그에 표현된 모든 견해와 의견은 저자에게만 해당되며, 저자의 고용주나 다른 어떤 그룹 또는 개인과는 반드시 관련이 없습니다. 이 기사는 어떠한 클라우드/데이터 관리 플랫폼을 홍보하는 것이 아닙니다. 모든 이미지와 코드 조각은 Azure/Databricks 웹사이트에서 공개적으로 이용 가능합니다.
제 다른 DZone 기사에서는 Databricks Unity Catalog가 무엇인지, Unity Catalog의 권한 모델이 어떻게 작동하는지, 스키마 수준, 그리고 카탈로그 및 스키마 수준에서 권한 관리를 자동화하는 스크립트에 대해 논의했습니다.
이번 기사에서는 Unity Catalog 테이블 수준에서 권한 관리를 자동화하는 스크립트를 제공하는 것을 목표로 합니다.
Unity Catalog 테이블 수준의 권한
Unity Catalog (Databricks)에서 테이블 수준에서 권한을 적용하는 것은 특정 테이블이나 뷰에 대한 접근을 제어하고 싶을 때 필요합니다. 이는 스키마 내의 모든 객체에 권한을 적용하는 것이 아닙니다. 테이블 수준의 권한은 다음과 같은 시나리오에서 유용합니다:
1. 세분화된 접근 제어
특정 테이블이나 뷰에 대한 접근을 부여하거나 제한해야 할 때, 전체 스키마에 영향을 주지 않고.
스키마에 민감한 데이터가 포함되어 있을 때, 일부 테이블에 대한 접근을 허용하면서 다른 테이블에 대한 접근을 제한하고자 할 때 특히 중요합니다.
2. 민감한 데이터 보호
스키마 내의 특정 테이블에 기밀 또는 제한된 데이터(예: 개인 식별 정보, 재무 데이터)가 포함되어 있는 경우, 권한을 테이블 수준에서 적용하여 승인된 사용자만 이러한 테이블을 조회하거나 쿼리할 수 있도록 할 수 있습니다.
예를 들어, 일부 요약 또는 집계 데이터 테이블에 대한 접근을 허용하되 민감한 정보를 포함하는 원시, 세부 테이블에 대한 접근은 제한할 수 있습니다.
3. 여러 팀을 위한 테이블이 포함된 스키마에서 특정 팀/사용자에게 접근 위임하기
동일한 스키마 내에서 서로 다른 사용자 또는 팀이 서로 다른 테이블에 접근해야 할 때입니다. 예를 들어, 영업 팀은 고객 관련 테이블에 접근해야 할 수 있고, 재무 팀은 수익 테이블에 접근해야 할 수 있습니다.
테이블 수준에서 권한을 적용하면 각 팀이 자신의 작업과 관련된 테이블만 접근할 수 있도록 보장합니다.
4. 데이터 거버넌스 준수
엄격한 데이터 거버넌스 정책을 시행할 때, 보다 세분화된 수준(개별 테이블까지)에서 접근을 제어해야 할 수 있습니다. 테이블 수준의 권한은 사용자가 작업할 수 있도록 승인된 데이터에만 접근을 허용함으로써 준수를 보장하는 데 도움이 됩니다.
5. 스키마 내에서 혼합된 접근 요구 사항 처리하기
스키마에 다양한 수준의 민감성 또는 기밀성을 가진 테이블이 포함된 경우, 스키마 수준에서 권한을 적용하는 것은 너무 광범위할 수 있습니다. 테이블 수준의 권한을 사용하면 특정 요구 사항에 따라 각 테이블에 대한 접근을 개별적으로 관리할 수 있습니다.
테이블 수준에서 적용할 수 있는 권한
- SELECT: 테이블에 대한 읽기 접근을 부여하여 사용자가 쿼리할 수 있게 합니다.
- MODIFY: 객체로부터 데이터를 추가, 삭제 및 수정할 수 있는 능력을 부여합니다.
- APPLY TAG: 객체에 태그를 적용할 수 있는 능력을 부여합니다.
- ALL PRIVILEGES: 모든 권한을 부여합니다.
자동화 스크립트
전제 조건
- Unity Catalog가 이미 설정되어 있습니다.
- 주체가 Databricks 작업 공간과 연결되어 있습니다.
- 권한 스크립트를 실행하는 사용자가 테이블, 스키마 및 카탈로그에 대한 적절한 권한을 가지고 있습니다.
1단계: 노트북 생성 및 변수 선언
Databricks 작업 공간에 노트북을 생성합니다. 작업 공간에서 노트북을 생성하려면 사이드바에서 “+” 새로 만들기를 클릭한 다음 노트북을 선택합니다.
빈 노트북이 작업 공간에 열립니다. Python이 노트북 언어로 선택되어 있는지 확인합니다.
아래 코드 조각을 노트북 셀에 복사하여 붙여넣고 셀을 실행하세요.
catalog = 'main' # Specify your catalog name
schema = 'default' # Specify your schema name
tables_arr= 'test1,test2' # Specify the Comma(,) seperated values of table name
tables = tables_arr.split(',')
principals_arr = '' # Specify the Comma(,) seperated values for principals in the blank text section (e.g. groups, username)
principals = principals_arr.split(',')
privileges_arr = 'SELECT,APPLY TAG' # Specify the Comma(,) seperated values for priviledges in the blank text section (e.g. SELECT,APPLY TAG)
privileges = privileges_arr.split(',')
단계 2: 카탈로그와 스키마 설정하기
아래 코드 블록을 새 셀 또는 기존 셀에 복사하여 붙여넣고 셀을 실행하세요.
query = f"USE CATALOG `{catalog}`" #Sets the Catalog
spark.sql(query)
query = f"USE SCHEMA `{schema}`" #Sets the Schema
spark.sql(query)
단계 3: 주체와 권한을 반복하고 카탈로그, 스키마 및 테이블에 부여 적용하기
아래 코드 블록을 새 셀 또는 기존 셀에 복사하여 붙여넣고, 셀을 실행하여 권한을 적용하세요.
for principal in principals:
query = f"GRANT USE_CATALOG ON CATALOG `{catalog}` TO `{principal}`" # Use catalog permission at Catalog level
spark.sql(query)
query = f"GRANT USE_SCHEMA ON SCHEMA `{schema}` TO `{principal}`" # Use schema permission at Schema level
spark.sql(query)
for table in tables:
for privilege in privileges:
query = f"GRANT `{privilege}` ON `{table}` TO `{principal}`" # Grant priviledges on the tables to the pricipal
print(query)
spark.sql(query)
검증
Databricks UI를 열고 데이터 탐색기에서 “카탈로그”로 이동하여 권한을 검증할 수 있습니다. 카탈로그가 데이터 섹션에 나타나면 카탈로그를 클릭하고 스키마를 확장한 후 권한을 적용한 스키마 내의 테이블을 선택하고 “권한” 탭으로 이동하세요. 이제 테이블에 적용된 모든 권한을 볼 수 있습니다. 아래는 기본 카탈로그 내의 기본 제공 카탈로그 테이블과 information_schema
스키마에 적용된 권한의 스크린샷입니다.
노트북에서 아래 SQL 스크립트를 실행하여 검증의 일환으로 테이블에 대한 모든 권한을 표시할 수도 있습니다.
SHOW GRANTS ON TABLE table_name;
결론
Databricks Unity Catalog에서 테이블 수준의 권한 관리를 자동화하면 Unity Catalog의 최저 수준에서 권한을 적용하는 일관되고 효율적인 접근 방식을 보장하는 데 도움이 됩니다. 제공된 코드는 단일 카탈로그와 스키마에서 여러 주체와 테이블에 대해 여러 테이블 수준의 권한을 할당하는 실용적인 방법을 보여줍니다. 수백 개의 테이블이 있는 카탈로그에서 서로 다른 주체에 대해 서로 다른 권한을 제공해야 할 경우, 위의 자동화는 수동 오류와 노력을 크게 줄여줍니다.
Source:
https://dzone.com/articles/automate-databricks-unity-catalog-permissions-at-table-level