애플리케이션 데이터에 대한 액세스 보호 및 제어

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

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

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

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

애플리케이션에 표준 데이터베이스 수준 액세스에서 허용하는 것보다 더 세부적인 보안이 필요한 경우 파라미터화된 보안 뷰를 사용하여 사용자가 승인된 데이터만 볼 수 있도록 할 수 있습니다.

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

  • 동적 행 수준 보안: 사용자가 쿼리 문구와 관계없이 승인된 데이터에만 액세스할 수 있도록 최종 사용자 식별자를 사용하여 쿼리를 필터링합니다.
  • 역할 관리 간소화: 각 개인별로 별도의 데이터베이스 역할을 관리하는 대신 모든 애플리케이션 사용자에 대해 단일 공유 데이터베이스 역할을 사용합니다.

목표

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

비용

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

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

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

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

시작하기 전에

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

결제 및 필수 API 사용 설정

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

    프로젝트 선택기로 이동

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

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

    1. API 사용 설정

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

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

      • PostgreSQL용 Cloud SQL API
      • Knowledge Catalog API

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

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

개발 환경 준비

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

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

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

데이터베이스 설정

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

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

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

    Cloud SQL로 이동

  2. 목록에서 인스턴스를 선택합니다.

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

  4. Postgres 인증을 사용하여 스튜디오에 로그인합니다.

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

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

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

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

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

  8. 기본 제공 postgres 사용자와 같은 수퍼유저 권한이 있는 사용자로 로그인합니다.

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

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

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

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

    SET role TO postgres;
    
  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 콘솔에서 Cloud SQL 페이지로 이동합니다.

    Cloud SQL로 이동

  2. 목록에서 인스턴스를 선택합니다.

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

  4. 스튜디오에 로그인하고 postgresdatabase에 연결합니다.

  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 권한이 있어야 합니다. 예를 들어 postgres 사용자가 파라미터화된 뷰를 소유하므로 기본 테이블에 대한 SELECT 권한이 있는 반면 psv_user에는 store 스키마에 대한 USAGE 권한과 뷰에 대한 SELECT 권한이 있어야 합니다.

  11. postgres 관리자로 로그인하고 IAM 인증 사용자에게 psv_user 역할을 부여합니다.

    GRANT psv_user TO "IAM_USER_EMAIL";
    

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

데이터 보안 확인

파라미터화된 보안 뷰가 지정된 뷰에 대한 액세스를 제한하고 있는지 확인하려면 IAM 인증 사용자로 데이터베이스에 로그인합니다. Cloud SQL에서 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']
    );
    
    1. 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": {
                "cloud_sql_reference": {
                  "database_reference": {
                    "engine": "POSTGRESQL",
                    "project_id": "PROJECT_ID",
                    "region": "REGION",
                    "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용 Cloud SQL 인스턴스가 있는 리전입니다.
      • INSTANCE_ID: PostgreSQL용 Cloud SQL 인스턴스의 ID
      • DATABASE_ID: PostgreSQL용 Cloud SQL 데이터베이스의 ID

    삭제

    클러스터 삭제

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

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

      Cloud SQL로 이동

    2. 목록에서 인스턴스를 선택합니다.

    3. 삭제를 클릭합니다.

    4. 인스턴스 이름을 입력하고 삭제를 클릭하여 인스턴스 삭제를 확인합니다.