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

이 튜토리얼에서는 PostgreSQL용 AlloyDB에서 파라미터화된 보안 뷰를 사용하여 데이터베이스 테이블에 대한 사용자 액세스를 제한하는 방법을 설명합니다. 이 튜토리얼에서는 파라미터화된 보안 뷰를 설정하고, 기본 테이블에 대한 액세스를 제한하도록 데이터베이스 역할과 권한을 구성하고, 데이터 보안을 확인합니다. 파라미터화된 보안 뷰는 QueryData API를 사용하여 생성된 자연어 쿼리를 사용하는 애플리케이션을 보호하는 데 도움이 됩니다.

파라미터화된 보안 뷰의 기능을 보여주기 위해 예시가 포함되어 있습니다. 이 예시는 데모용으로만 제공됩니다.

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

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

하지만 애플리케이션에 표준 데이터베이스 수준 액세스에서 허용하는 것보다 더 세분화된 보안 제어가 필요한 경우가 있습니다. 파라미터화된 보안 뷰는 SQL 뷰를 사용하여 애플리케이션 데이터 보안 및 행 수준 액세스 제어를 제공합니다. 이를 통해 애플리케이션 사용자가 액세스 권한이 있는 데이터만 볼 수 있습니다.

파라미터화된 보안 뷰는 최종 사용자 식별자로 뷰를 파라미터화하여 임시 또는 LLM 생성 자연어 쿼리를 처리할 때 보안 위험을 완화합니다. 이를 통해 사용자는 쿼리 문구와 관계없이 승인된 데이터에만 액세스할 수 있습니다. 또한 이 접근 방식을 사용하면 단일 데이터베이스 역할로 모든 애플리케이션 사용자를 안전하게 지원할 수 있으므로 각 개인에 대해 별도의 데이터베이스 역할을 만들어 행 수준 보안을 적용할 필요가 없어 사용자 관리가 간소화됩니다.

목표

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

비용

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

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

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

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

시작하기 전에

컨텍스트 세트를 만들기 전에 다음 기본 요건을 완료하세요.

결제 및 필수 API 사용 설정

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

    프로젝트 선택기로 이동

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

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

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

      • PostgreSQL용 AlloyDB API
      • Dataplex Universal Catalog API

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

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

개발 환경 준비

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

필요한 확장 프로그램 사용 설정

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

데이터베이스 설정

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

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

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

    AlloyDB로 이동

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

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

  4. Postgres 인증을 사용하여 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. 파라미터화된 보안 뷰에 대해 쿼리를 실행하기 위한 새 데이터베이스 역할을 만듭니다. 이 역할은 애플리케이션이 데이터베이스에 연결하고 로그인하여 공개 함수나 객체에 대해 최소한의 액세스 권한만으로 쿼리를 실행할 때 사용되는 AlloyDB 역할입니다.

    CREATE ROLE psv_user WITH LOGIN PASSWORD '...';
    

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

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

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

    CREATE SCHEMA schema;
    
  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. 스튜디오에 로그인하고 databaseadmin_user로 연결합니다.

  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;
    
  11. 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. SQL 구문과 PSV 매개변수가 포함된 QueryData 요청을 사용하여 파라미터화된 보안 뷰를 쿼리합니다.

    curl -X POST \
      "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -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"
              }
            }
          },
          "parameterized_secure_view_parameters": {
            "parameters": {
              "app_end_userid": "303"
            }
          }
        },
        "generation_options": {
          "generate_query_result": true,
          "generate_natural_language_answer": true,
          "generate_explanation": true
        }
      }'

다음 값을 바꿉니다.

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

삭제

클러스터 삭제

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

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

    AlloyDB로 이동

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

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

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

다음 단계