파라미터화된 보안 뷰를 사용하여 애플리케이션 데이터 보호 및 액세스 제어

파라미터화된 보안 뷰는 애플리케이션에 데이터 보안 및 행 액세스 제어를 제공합니다. 애플리케이션 사용자의 ID를 기반으로 쿼리 결과를 필터링합니다.

이 튜토리얼에서는 PostgreSQL용 AlloyDB에서 파라미터화된 보안 뷰를 설정하고, 기본 테이블에 대한 액세스를 제한하도록 데이터베이스 역할 및 권한을 구성하고, 데이터 보안을 확인하는 방법을 설명합니다. 이 문서에 제공된 예시는 데모용으로만 제공됩니다.

파라미터화된 보안 뷰란 무엇인가요?

일반적인 권장사항에 따라 애플리케이션은 데이터베이스에 필요한 최소한의 액세스 권한이 있는 서비스 계정을 사용하여 실행되어야 합니다. 예를 들어 애플리케이션이 데이터베이스에 쓰지 않아야 하는 경우 읽기 전용 액세스 권한이 있는 역할을 사용해야 합니다. 데이터베이스 수준에서 이러한 액세스 제어를 구성해야 합니다.

애플리케이션에 표준 데이터베이스 수준 액세스 권한보다 더 세분화된 보안이 필요한 경우 파라미터화된 보안 뷰를 사용하여 사용자가 승인된 데이터만 보도록 할 수 있습니다. 파라미터화된 보안 뷰는 각 애플리케이션 최종 사용자에게 별도의 데이터베이스 역할이 필요하지 않고 멀티 테넌트 SaaS 애플리케이션에 적합한 동적 데이터 보안 및 행 액세스 제어를 제공합니다.

파라미터화된 보안 뷰를 사용하면 세 가지 주요 이점이 있습니다.

  • 동적 데이터 보안 및 행 액세스 제어: 최종 사용자 식별자를 사용하여 쿼리를 필터링하므로 사용자는 쿼리 표현과 관계없이 승인된 데이터에만 액세스할 수 있습니다.
  • 더 쉬운 역할 관리: 각 개인에 대해 별도의 데이터베이스 역할을 관리하는 대신 모든 애플리케이션 사용자에 대해 단일 공유 데이터베이스 역할을 사용합니다.

목표

  • 이름이 지정된 뷰 파라미터를 사용하여 파라미터화된 보안 뷰 만들기
  • 애플리케이션이 데이터베이스에 연결하고 파라미터화된 보안 뷰에 액세스할 때 사용할 데이터베이스 역할 만들기
  • 새 역할에 파라미터화된 보안 뷰에 대한 권한을 부여하고 기본 테이블에 대한 액세스 권한 취소하기
  • 새 역할을 사용해 연결한 후 제한된 테이블에 액세스할 수 없는지 확인하기
  • execute_parameterized_query() 함수 또는 QueryData API를 사용하여 파라미터화된 보안 뷰에서 쿼리를 실행합니다.

비용

이 문서에서는 비용이 청구될 수 있는 Google Cloud구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용합니다.

신규 Google Cloud 사용자는 무료 체험판을 이용할 수 있습니다.

요금이 계속 청구되지 않도록 하려면 이 문서의 작업을 완료한 후 만든 리소스를 삭제하세요. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

파라미터화된 보안 뷰를 만들기 전에 다음 기본 요건을 완료하세요.

결제 및 필수 API 사용 설정

  1. Google Cloud 콘솔에서 프로젝트를 선택합니다.

    프로젝트 선택기로 이동

  2. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  3. PostgreSQL용 AlloyDB를 만들고 여기에 연결하는 데 필요한 Cloud API를 사용 설정합니다.

    1. API 사용 설정

    2. 프로젝트 확인 단계에서 다음을 클릭하여 변경할 프로젝트의 이름을 확인합니다.

    3. API 사용 설정 단계에서 사용 설정을 클릭하여 다음을 사용 설정합니다.

      • PostgreSQL용 AlloyDB API
      • Knowledge Catalog API
      • Gemini 기반 Data Analytics API(geminidataanalytics.googleapis.com)

데이터베이스 만들기 및 연결

  1. 클러스터 및 클러스터의 기본 인스턴스 만들기
  2. 인스턴스에 연결 및 데이터베이스 만들기

필수 역할 부여 및 IAM 데이터베이스 사용자 만들기

Identity and Access Management(IAM)로 인증하고 매개변수화된 보안 뷰에 대해 queryData 요청을 실행하려면 IAM 사용자 또는 서비스 계정을 구성합니다.

  1. Google Cloud 프로젝트에서 IAM_USER_EMAIL에 다음 IAM 역할을 부여합니다.

    • roles/geminidataanalytics.queryDataUser
    • roles/serviceusage.serviceUsageConsumer
    • roles/alloydb.databaseUser

    IAM 역할 부여에 대한 자세한 내용은 프로젝트에 IAM 정책 바인딩 추가를 참고하세요.

  2. AlloyDB 인스턴스에서 IAM 인증을 사용 설정하고 IAM_USER_EMAIL을 클러스터의 IAM 기반 데이터베이스 사용자로 추가합니다. psv_user 데이터베이스 역할을 부여하기 전에 이 IAM 데이터베이스 사용자를 만들어야 합니다. IAM 데이터베이스 사용자 설정에 대한 자세한 내용은 IAM 인증 관리를 참조하세요.

개발 환경 준비

파라미터화된 보안 뷰에서 쿼리를 실행하기 위해서는 먼저 데이터베이스, 데이터베이스 역할, parameterized_views 확장 프로그램, 애플리케이션 스키마를 설정해야 합니다.

데이터베이스 플래그 사용 설정

필수 확장 프로그램 라이브러리를 로드하는 parameterized_views.enabled 데이터베이스 플래그를 사용 설정합니다. 자세한 내용은 인스턴스의 데이터베이스 플래그 구성을 참조하세요.

데이터베이스 설정

  • 애플리케이션 데이터 및 파라미터화된 보안 뷰를 위해 database라는 데이터베이스를 만듭니다. 자세한 내용은 데이터베이스 만들기를 참조하세요.

데이터베이스 역할, 확장 프로그램, 애플리케이션 스키마 만들기

  1. Google Cloud 콘솔에서 AlloyDB 페이지로 이동합니다.

    AlloyDB로 이동

  2. 목록에서 클러스터를 선택합니다.

  3. 탐색 메뉴에서 AlloyDB Studio를 클릭합니다.

  4. 관리자 계정 인증을 사용하여 Studio에 로그인합니다.

  5. 인증을 클릭합니다. 탐색기 창에 데이터베이스의 객체 목록이 표시됩니다.

  6. 새 SQL 편집기 탭 또는 새 탭을 클릭하여 새 탭을 엽니다.

  7. 파라미터화된 뷰를 사용하려면 데이터베이스에 parameterized_views 확장 프로그램을 만듭니다.

    -- Requires parameterized_views.enabled set to true
    CREATE EXTENSION parameterized_views;
    

    확장 프로그램이 생성되면 데이터베이스가 parameterized_views라는 스키마도 함께 생성하여, API가 해당 스키마의 네임스페이스 내에 포함되도록 하고 기존 API와 충돌하지 않도록 합니다.

  8. 기본 제공 postgres 사용자와 같은 수퍼유저 권한이 있는 사용자로 로그인합니다. 새 수퍼유저(예: admin_user)를 만들려면 다음 명령어를 실행합니다.

    CREATE ROLE admin_user WITH LOGIN PASSWORD '...';
    GRANT ALL PRIVILEGES ON DATABASE database TO admin_user;
    

    자세한 내용은 CREATE USER를 참조하세요.

  9. 파라미터화된 보안 뷰에 대해 쿼리를 실행하기 위한 새 데이터베이스 역할을 만들고 admin_user에 이 역할을 관리할 수 있는 권한을 부여합니다. 이 역할은 애플리케이션이 데이터베이스에 연결하고 로그인하여 공개 함수나 객체에 대해 최소한의 액세스 권한만으로 쿼리를 실행할 때 사용되는 AlloyDB 역할입니다.

    CREATE ROLE psv_user WITH LOGIN PASSWORD '...';
    GRANT psv_user TO admin_user WITH ADMIN OPTION;
    

    자세한 내용은 CREATE USER를 참조하세요.

  10. 관리 사용자로 연결합니다.

    SET role TO admin_user;
    
  11. 테이블이 포함되는 스키마를 만듭니다.

    CREATE SCHEMA store;
    
  12. 테이블을 만들고 데이터를 삽입합니다.

    CREATE TABLE store.checked_items(bag_id INT,timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT);
    
    INSERT INTO store.checked_items (bag_id, timestamp, loc_code, scan_type, location, customer_id) VALUES
    (101, '2023-10-26 10:00:00', 'ABC', 'I', 'Warehouse A', 123),
    (102, '2023-10-26 10:15:30', 'DEF', 'O', 'Loading Dock B', 456),
    (103, '2023-10-26 10:30:45', 'GHI', 'I', 'Conveyor Belt 1', 789),
    (104, '2023-10-26 11:00:00', 'JKL', 'O', 'Shipping Area C', 101),
    (105, '2023-10-26 11:45:15', 'MNO', 'I', 'Sorting Station D', 202),
    (106, '2023-10-26 12:00:00', 'PQR', 'O', 'Truck Bay E', 303);
    

파라미터화된 보안 뷰 만들기 및 액세스 권한 설정

파라미터화된 보안 뷰를 만들고 기본 테이블 및 뷰에 대한 적절한 액세스 권한을 설정하려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 AlloyDB 페이지로 이동합니다.

    AlloyDB로 이동

  2. 목록에서 클러스터를 선택합니다.

  3. 탐색 메뉴에서 AlloyDB Studio를 클릭합니다.

  4. Studio에 로그인하고 admin_user 사용자로 database 데이터베이스에 연결합니다.

  5. 인증을 클릭합니다. 탐색기 창에 데이터베이스의 객체 목록이 표시됩니다.

  6. 새 SQL 편집기 탭 또는 새 탭을 클릭하여 새 탭을 엽니다.

  7. 뷰에 제한된 액세스 권한을 제공하기 위해 파라미터화된 뷰를 만듭니다.

    CREATE VIEW store.secure_checked_items WITH (security_barrier) AS
    SELECT bag_id, timestamp, location
    FROM store.checked_items t
    WHERE customer_id = $@app_end_userid;
    
  8. 뷰에 대한 액세스 권한을 부여합니다.

    GRANT SELECT ON store.secure_checked_items TO psv_user;
    
  9. 뷰에 액세스할 수 있도록 스키마에 대한 액세스 권한을 부여합니다.

    GRANT USAGE ON SCHEMA store TO psv_user;
    
  10. 기본 테이블에 대한 직접 액세스 권한을 취소합니다.

    REVOKE ALL PRIVILEGES ON store.checked_items FROM psv_user;
    

    참고: 파라미터화된 뷰의 소유자에게는 기본 테이블에 대한 SELECT 권한이 있어야 합니다. 또한 매개변수화된 뷰의 사용자에게는 뷰의 스키마에 대한 USAGE 및 뷰에 대한 SELECT가 있어야 합니다. 예를 들어 admin_user 사용자는 파라미터화된 뷰를 소유하므로 기본 테이블에 대한 SELECT 권한이 있는 반면 psv_user는 store 스키마에 대한 USAGE 및 뷰에 대한 SELECT가 있어야 합니다.

  11. IAM_USER_EMAIL가 IAM 데이터베이스 사용자로 클러스터에 추가되었는지 확인하고, postgres 사용자 또는 admin_user로 로그인한 후 IAM 인증 사용자에게 psv_user 역할을 부여합니다.

    GRANT psv_user TO "IAM_USER_EMAIL";
    

    IAM_USER_EMAIL을 IAM 사용자 이메일 주소로 바꿉니다.

데이터 보안 확인

파라미터화된 보안 뷰가 지정된 뷰에 대한 액세스를 제한하고 있는지 확인하려면 IAM 인증 사용자로 데이터베이스에 로그인합니다. AlloyDB에서 IAM 사용자는 자신에게 할당된 데이터베이스 역할의 권한을 상속합니다.

  1. IAM 인증 사용자로 데이터베이스에 로그인합니다.

  2. 기본 테이블에 액세스할 수 없는지 확인합니다.

    SELECT * FROM store.checked_items;
    ERROR:  permission denied for table checked_items
    
  3. execute_parameterized_query 함수를 사용하여 파라미터화된 보안 뷰에 액세스합니다.

    SELECT * FROM parameterized_views.execute_parameterized_query(
      query => 'SELECT * from store.secure_checked_items',
      param_names => ARRAY ['app_end_userid'],
      param_values => ARRAY ['303']
    );
    
  4. gcloud auth application-default login를 실행하여 IAM_USER_EMAIL로 Google Cloud CLI에 로그인하면 gcloud auth application-default print-access-token가 제한된 IAM 데이터베이스 사용자의 토큰을 생성합니다. 그런 다음 PSV 매개변수와 함께 queryData 메서드를 사용하여 매개변수화된 보안 뷰를 쿼리합니다.

      curl -X POST \
        "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        -H "x-goog-user-project: PROJECT_ID" \
        -H "Content-Type: application/json; charset=utf-8" \
        -d '{
          "prompt": "Show me the checked items.",
          "context": {
            "datasource_references": {
              "alloydb": {
                "database_reference": {
                  "project_id": "PROJECT_ID",
                  "region": "REGION",
                  "cluster_id": "CLUSTER_ID",
                  "instance_id": "INSTANCE_ID",
                  "database_id": "DATABASE_ID",
                  "table_ids": [
                    "store.secure_checked_items"
                  ]
                }
              }
            },
            "parameterized_secure_view_parameters": {
              "parameters": [
                {
                  "key": "app_end_userid",
                  "value": "303"
                }
              ]
            }
          },
          "generation_options": {
            "generate_query_result": true,
            "generate_natural_language_answer": true,
            "generate_explanation": true
          }
        }'

    database_reference의 table_ids 필드를 사용하여 QueryData가 store.secure_checked_items 파라미터화된 보안 뷰에 대해서만 SQL을 생성하도록 합니다. table_ids를 생략하고 데이터베이스 역할에 store.checked_items 기본 테이블에 대한 SELECT 액세스 권한이 있는 경우 QueryData는 보안 뷰를 우회하여 기본 테이블을 직접 쿼리할 수 있습니다. table_ids의 정규화되지 않은 이름은 기본적으로 public 스키마로 설정되므로 스키마 정규화 뷰 이름을 지정합니다.

    다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
    • REGION: PostgreSQL용 AlloyDB 인스턴스가 있는 리전입니다.
    • CLUSTER_ID: PostgreSQL용 AlloyDB 클러스터의 ID입니다.
    • INSTANCE_ID: PostgreSQL용 AlloyDB 인스턴스의 ID입니다.
    • DATABASE_ID: PostgreSQL용 AlloyDB 데이터베이스의 ID입니다. 이 튜토리얼에서는 database입니다.

    삭제

    클러스터 삭제

    시작하기 전에 섹션에서 만든 클러스터를 삭제하면 만든 모든 객체도 삭제됩니다.

    1. Google Cloud 콘솔에서 AlloyDB 페이지로 이동합니다.

      AlloyDB로 이동

    2. 목록에서 클러스터를 선택합니다.

    3. 클러스터 삭제를 클릭합니다.

    4. 클러스터 삭제에서 클러스터 이름을 입력하여 클러스터를 삭제할 것인지 확인합니다.

    다음 단계