매개변수화된 보안 뷰를 사용하여 애플리케이션 데이터에 대한 액세스 보호 및 제어

이 튜토리얼에서는 PostgreSQL용 AlloyDB의 파라미터화된 보안 뷰를 사용하여 AlloyDB Studio 또는 psql을 통해 파라미터화된 뷰에 대한 사용자 액세스를 제한하는 방법을 설명합니다.

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

기본 요건

결제 및 필수 API 사용 설정

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

    프로젝트 선택기로 이동

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

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

    API 사용 설정

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

      • AlloyDB API

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

  1. 클러스터 및 클러스터의 기본 인스턴스 만들기
  2. 인스턴스에 연결하고 데이터베이스를 만듭니다.

개발 환경 준비

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

필수 확장 프로그램 사용 설정

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

데이터베이스 설정

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

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

  1. AlloyDB Studio 또는 psql을 사용하여 postgres 사용자 또는 AlloyDB 수퍼유저 권한이 있는 사용자로 데이터베이스에 연결합니다.

    psql database -U postgres
    

    자세한 내용은 AlloyDB의 데이터베이스 사용자 관리 정보를 참고하세요.

  2. 데이터베이스에 parameterized_views 확장 프로그램을 만듭니다.

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

    확장 프로그램이 생성되면 API가 해당 스키마의 네임스페이스에 포함되고 API가 기존 API와 충돌하지 않도록 시스템에서 parameterized_views라는 스키마도 생성됩니다.

  3. 데이터베이스를 소유하고 관리하는 AlloyDB 관리 역할을 만듭니다.

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

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

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

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

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

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

    SET role TO admin_user;
    
  6. 테이블이 포함된 스키마를 만듭니다.

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

    CREATE TABLE schema.checked_items(bag_id INT,timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT);
    
    INSERT INTO schema.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. AlloyDB Studio 또는 psql을 사용하여 admin_user로 데이터베이스에 연결합니다.

    psql database -U admin_user
    
  2. 뷰에 대한 제한된 액세스 권한을 제공하려면 파라미터화된 보안 뷰를 만드세요.

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

    GRANT SELECT ON schema.secure_checked_items TO psv_user;
    
  4. 뷰에 액세스하려면 스키마에 대한 액세스 권한을 부여하세요.

    GRANT USAGE ON SCHEMA schema TO psv_user;
    
  5. 기본 테이블에 대한 직접 액세스를 취소합니다.

    REVOKE ALL PRIVILEGES ON schema.checked_items FROM psv_user;
    

데이터 보안 확인

파라미터화된 보안 뷰가 지정된 뷰에 대한 액세스를 제한하는지 확인하려면 psv_user로 다음 명령어를 실행합니다. 애플리케이션이 데이터베이스에 연결하고 로그인하여 쿼리를 실행하는 데 사용하는 AlloyDB 데이터베이스 역할입니다.

  1. 파라미터화된 보안 뷰 사용자로 연결합니다.

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

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

    SELECT * FROM parameterized_views.execute_parameterized_query(
      query => 'SELECT * from schema.secure_checked_items',
      param_names => ARRAY ['app_end_userid'],
      param_values => ARRAY ['303']
    );
    
  4. 자연어로 생성된 쿼리의 보안을 개선하려면 AlloyDB AI 자연어를 사용하여 파라미터화된 보안 뷰를 통합하세요.