AlloyDB 매개변수화된 보안 뷰를 사용하여 애플리케이션 데이터 보안 관리

이 문서에서는 PostgreSQL용 AlloyDB에서 매개변수가 있는 보안 뷰를 사용하는 방법을 설명합니다. 이를 통해 애플리케이션 사용자 인증 정보와 같은 애플리케이션별 이름이 지정된 매개변수를 기반으로 데이터 액세스를 제한할 수 있습니다. 매개변수가 있는 보안 뷰는 PostgreSQL 뷰의 기능을 확장하여 보안 및 액세스 제어를 개선합니다. 또한 이러한 뷰는 실행되는 모든 쿼리에 여러 제한사항을 자동으로 적용하여 애플리케이션에서 신뢰할 수 없는 쿼리를 실행할 위험을 완화합니다.

자세한 내용은 매개변수가 있는 보안 뷰 개요매개변수가 있는 보안 뷰 튜토리얼을 참고하세요.

시작하기 전에

이 문서에서는 AlloyDB 클러스터와 인스턴스를 만들었다고 가정합니다. 자세한 내용은 데이터베이스 만들기를 참고하세요.

매개변수가 있는 보안 뷰를 사용하려면 먼저 다음을 실행해야 합니다.

  1. 매개변수가 지정된 보안 뷰에 대한 액세스 권한을 요청하고 사용 설정 확인을 받을 때까지 기다린 후 시작합니다.

  2. AlloyDB팀에서 필요한 확장 프로그램 라이브러리를 로드하는 parameterized_views.enabled 데이터베이스 플래그를 사용 설정할 때까지 기다립니다. 시작하려면 이 데이터베이스 플래그를 사용 설정해야 합니다.

    AlloyDB팀에서 parameterized_views.enabled 데이터베이스 플래그를 사용 설정하면 데이터베이스가 다시 시작되어 이러한 변경사항이 적용됩니다.

  3. 매개변수화된 뷰가 생성된 데이터베이스에서 AlloyDB 스튜디오 또는 psql을 사용하여 parameterized_views 확장 프로그램을 만듭니다.

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

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

매개변수화된 보안 뷰 만들기

매개변수가 있는 보안 뷰를 만들려면 다음 단계를 따르세요.

  1. 다음 예와 같이 CREATE VIEW DDL 명령어를 실행합니다.

    CREATE VIEW secure_checked_items WITH (security_barrier) AS
    SELECT bag_id, timestamp, location
    FROM checked_items t
    WHERE customer_id = $@app_end_userid;
    

    위 예에서 매개변수가 있는 보안 뷰를 사용하면 /users/checked_items/라는 테이블의 세 열에 액세스할 수 있습니다. 뷰는 /users.id/checked_items.customer_id/가 필수 매개변수와 일치하는 행으로 결과를 제한합니다.

    다음 속성을 사용하세요.

    • security_barrier 옵션을 사용하여 뷰를 만듭니다.
    • 애플리케이션 사용자가 액세스할 수 있는 행만 볼 수 있도록 제한하려면 WHERE 절에서 $@PARAMETER_NAME 문법을 사용하여 필수 매개변수를 추가합니다. 일반적인 사용 사례는 WHERE COLUMN = $@PARAMETER_NAME를 사용하여 열 값을 확인하는 것입니다.
    • $@PARAMETER_NAME는 이름이 지정된 뷰 매개변수를 나타냅니다. 이 값은 execute_parameterized_query API를 사용할 때 제공됩니다. 이름이 지정된 뷰 매개변수에는 다음 요구사항이 적용됩니다.
      • 이름이 지정된 뷰 매개변수는 문자 (a~z)로 시작해야 합니다.
      • 발음 구별 부호가 있는 문자와 라틴어가 아닌 문자를 사용할 수 있으며 밑줄 (_)을 사용할 수 있습니다.
      • 첫 글자 이후에는 문자, 밑줄, 숫자 (0-9)가 올 수 있습니다.
      • 이름이 지정된 뷰 매개변수에는 $를 포함할 수 없습니다.
      • 이름이 지정된 뷰 매개변수는 대소문자를 구분합니다. 예를 들어 $@PARAMETER_NAME$@parameter_name와 다르게 해석됩니다.
  2. 보기를 쿼리할 수 있는 모든 데이터베이스 사용자에게 보기에 대한 SELECT를 부여합니다.

  3. 뷰를 쿼리할 수 있는 모든 데이터베이스 사용자에게 뷰에 정의된 테이블이 포함된 스키마에 대한 USAGE를 부여합니다.

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

애플리케이션 보안 구성

매개변수가 지정된 보안 뷰를 사용하여 애플리케이션의 보안을 구성하려면 다음 단계를 따르세요.

  1. 관리 사용자로 보안 매개변수화된 뷰를 만듭니다. 이 사용자는 데이터베이스 설정 및 보안 관리를 비롯한 애플리케이션의 관리 작업을 실행하는 AlloyDB 데이터베이스 사용자입니다.
  2. 매개변수가 있는 보안 뷰에 대해 쿼리를 실행하기 위한 새 데이터베이스 역할을 만듭니다. 애플리케이션이 데이터베이스에 연결하고 로그인하고 매개변수화된 뷰에 대해 쿼리를 실행하는 데 사용하는 AlloyDB 데이터베이스 역할입니다.

    1. 보안 뷰에 새 역할 권한을 부여합니다. 여기에는 일반적으로 뷰에 대한 SELECT 권한과 스키마에 대한 USAGE가 포함됩니다.
    2. 이 역할이 액세스할 수 있는 객체를 애플리케이션에 필요한 최소한의 공개 함수 및 객체 집합으로 제한합니다. 공개되지 않은 스키마 및 테이블에 대한 액세스 권한을 제공하지 마세요.

    뷰를 쿼리하면 애플리케이션은 애플리케이션 사용자 ID에 연결된 필수 뷰 매개변수의 값을 제공합니다.

    자세한 내용은 데이터베이스 사용자 만들기를 참고하세요.

매개변수화된 보안 뷰 쿼리

매개변수화된 보안 뷰를 쿼리하려면 사용 사례를 가장 잘 지원하는 다음 옵션 중 하나를 사용하세요.

  • JSON 기반: 이 API를 사용하여 원샷으로 쿼리를 실행하고 JSON 행을 반환합니다.
  • CURSOR 기반: 실행 시간이 더 긴 쿼리가 있거나 대규모 쿼리가 있고 결과를 일괄적으로 가져오려는 경우에 이 API를 사용하세요. parameterized_views 확장 프로그램에서 제공하는 execute_parameterized_query 함수는 커서 이름을 허용합니다.
  • PREPARE EXECUTE 문이 있습니다. 이는 다양한 매개변수 값으로 여러 번 실행할 수 있는 준비된 문에 사용합니다.

매개변수화된 보안 뷰를 쿼리하려면 parameterized_views 확장 프로그램에서 제공하는 execute_parameterized_query() 함수를 사용합니다.

JSON API

이 API는 지정된 쿼리의 커서를 선언하므로 제한사항이 있습니다. 따라서 쿼리는 PostgreSQL 커서와 호환되어야 합니다. 예를 들어 CURSOR API는 DO 또는 SHOW 문을 지원하지 않습니다.

또한 이 API는 크기 또는 반환된 행 수로 결과를 제한하지 않습니다.

다음과 같은 구문으로 execute_parameterized_query() 함수를 실행합니다.

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => SQL_QUERY,
    param_names => ARRAY [PARAMETER_NAMES],
    param_values => ARRAY [PARAMETER_VALUES]
)

다음을 바꿉니다.

  • SQL_QUERY: FROM 절이 하나 이상의 매개변수화된 보안 뷰를 참조하는 SQL 쿼리입니다.
  • PARAMETER_NAMES: 문자열로 전달할 매개변수 이름 목록입니다.
  • PARAMETER_VALUES: 전달할 매개변수 값 목록입니다.
    • 이 목록은 param_names 목록과 크기가 같아야 하며, 여기서 값의 순서는 이름의 순서와 일치해야 합니다.
    • 값의 정확한 유형은 쿼리 및 매개변수화된 뷰 정의에서 추론됩니다. 유형 변환은 필요한 경우 및 지정된 매개변수 값이 가능한 경우에 실행됩니다. 유형 불일치가 있는 경우 오류가 발생합니다.

이 함수는 JSON 객체 테이블을 반환합니다. 테이블의 각 행은 원래 쿼리 결과 행의 ROW_TO_JSON() 값과 같습니다.

다음 예를 사용하여 매개변수화된 보안 뷰를 쿼리합니다.

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => 'SELECT * FROM secure_checked_items',
    param_names => ARRAY ['app_end_userid'],
    param_values => ARRAY ['40']
)

이 API를 사용하면 결과의 크기(킬로바이트(KB)로 표시)와 행 수에 따라 결과 집합의 크기가 제한됩니다. parameterized_views.json_results_max_sizeparameterized_views.json_results_max_rows를 사용하여 이러한 제한을 구성할 수 있습니다.

CURSOR API

쿼리 결과를 검색하는 데 사용하는 트랜잭션 범위 CURSOR를 만들고 반환하는 execute_parameterized_query() 함수를 실행합니다.

SELECT * FROM
parameterized_views.execute_parameterized_query(
    query => SQL_QUERY,
    cursor_name => CURSOR_NAME,
    param_names => ARRAY [PARAMETER_NAMES],
    param_values => ARRAY [PARAMETER_VALUES]
)

다음을 바꿉니다.

  • SQL_QUERY: FROM 절이 하나 이상의 매개변수화된 보안 뷰를 참조하는 SQL 쿼리입니다.
  • CURSOR_NAME: 선언할 커서의 이름입니다.
  • PARAMETER_NAMES: 문자열로 전달할 매개변수 이름 목록입니다.
  • PARAMETER_VALUES: 전달할 매개변수 값 목록입니다. 이 목록은 param_names 목록과 크기가 같아야 하며 값의 순서가 이름의 순서와 일치해야 합니다. 값의 정확한 유형은 쿼리 및 매개변수화된 뷰 정의에서 추론됩니다. 유형 변환은 필요한 경우 및 지정된 매개변수 값이 가능한 경우에 실행됩니다. 유형 불일치가 있는 경우 오류가 발생합니다.

다음 예를 사용하여 매개변수화된 보안 뷰를 쿼리합니다.

  -- start a transaction as the that is the default lifetime of a CURSOR
  BEGIN;
  -- create a cursor called 'mycursor'
  SELECT * FROM parameterized_views.execute_parameterized_query(
   query => 'SELECT * FROM secure_checked_items',
   cursor_name => 'mycursor'
   param_names => ARRAY ['app_end_userid'],
   param_values => ARRAY ['40']
  );

  -- then, to actually fetch the results
  FETCH ALL FROM mycursor;
  -- end the transaction, which will clean up the cursor
  END;

반환된 커서는 NO SCROLL 커서 WITHOUT HOLD입니다. 커서를 사용하여 순서가 아닌 방식(예: 뒤쪽 방향)으로 행을 검색할 수는 없습니다. 커서를 만든 트랜잭션 외부에서는 커서를 사용할 수 없습니다.

PREPARE 문

PREPARE .. AS RESTRICTED 명령어를 사용하여 매개변수화된 뷰를 참조하는 준비된 문을 만듭니다. 이러한 준비된 문은 순서 매개변수를 지원하며 실행 시 다양한 제한사항을 적용합니다. 자세한 내용은 보안 메커니즘을 참고하세요.

이 기능은 이름이 지정된 뷰 매개변수를 지원하도록 PREPAREEXECUTE commands를 확장합니다. 준비된 문을 사용하여 문이 실행될 때마다 파싱, 분석, 재작성하는 오버헤드를 방지하면 특히 자주 실행되거나 복잡한 쿼리의 경우 상당한 성능 향상을 얻을 수 있습니다. 준비된 문은 나중에 실행하기 위해 매개변수화된 SQL 문을 미리 컴파일하고 저장하여 성능을 최적화할 수 있는 서버 측 객체입니다.

이 API에는 제한사항이 있습니다. 문이 PREPARE 문에 허용되어야 하므로 SELECTVALUES 문만 지원됩니다.

또한 이 API는 반환되는 크기 또는 행 수로 결과를 제한하지 않습니다.

매개변수화된 뷰를 참조하는 준비된 문을 만들려면 PREPARE .. AS RESTRICTED 명령어를 실행합니다.

PREPARE pquery (/POSITIONAL_PARAM_TYPES/)
        AS RESTRICTED query % a query that may refer to parameterized views
EXECUTE pquery (/POSITIONAL_PARAM_VALUES/)
      WITH VIEW PARAMETERS (VIEW_PARAM_NAME1 = VIEW_PARAM_VALUE1[, ...]);

다음을 바꿉니다.

  • POSITIONAL_PARAM_TYPES: RESTRICTED 쿼리에 사용되는 하나 이상의 위치 매개변수입니다.
  • POSITIONAL_PARAM_VALUES: PREPARE 문에 정의된 위치 매개변수 대신 사용되는 실제 값입니다.
  • VIEW_PARAM_NAME: RESTRICTED 쿼리에서 참조된 매개변수화된 뷰에서 예상하는 매개변수의 이름입니다.
  • VIEW_PARAM_VALUE: 매개변수가 지정된 뷰의 상응하는 viewParamName 매개변수에 전달되는 실제 값입니다.

준비된 문에 매개변수를 포함하려면 PREPARE 문에 데이터 유형 목록을 제공합니다. 준비한 문에서 $1$2와 같이 위치를 사용하여 매개변수를 참조합니다.

EXECUTE .. WITH VIEW PARAMETERS 명령어를 사용하여 PREPARE .. AS RESTRICTED 명령어를 사용하여 만든 이전에 준비된 문을 실행합니다. 문을 만든 PREPARE 문이 위치 매개변수를 지정한 경우 호환되는 매개변수 집합을 EXECUTE 문에 전달해야 합니다. 매개변수화된 뷰에 필요한 모든 이름이 지정된 뷰 매개변수를 WITH VIEW PARAMETERS 절에 전달해야 합니다.

다음 예를 사용하여 매개변수화된 보안 뷰를 쿼리합니다.

PREPARE pquery (timestamp) AS RESTRICTED SELECT * FROM secure_checked_items WHERE timestamp > $1;

EXECUTE pquery (current_date - 1) WITH VIEW PARAMETERS (app_end_userid = 40);
EXECUTE pquery (current_date - 30) WITH VIEW PARAMETERS (app_end_userid = 40);

적용된 쿼리 제한사항

다음은 매개변수화된 보안 보기 쿼리에 설명된 옵션을 사용하여 실행하는 쿼리에 대해 제한된 작업 집합을 보여줍니다.

  • execute_parameterized_query 또는 EXECUTE .. WITH VIEW PARAMETERS를 사용하여 API를 재귀적으로 호출하는 것은 금지되어 있으므로 애플리케이션에서 지정한 값만 사용됩니다. 또한 이 제한은 쿼리가 지정된 매개변수 값 집합의 보안 엔벨롭을 우회하는 데 사용되는 것을 방지합니다.
  • dblink, pg_cron, pg_background 확장 프로그램을 비롯하여 새 백그라운드 세션을 시작하는 일부 확장은 허용되지 않습니다.
  • 다음은 허용되며 제한된 쿼리 구성 집합입니다.
    • 읽기 전용 SELECT 문은 허용됩니다.
    • 읽기 전용 SHOW 문, CALL 문, DO 문이 허용됩니다.
    • INSERT, UPDATE, DELETE와 같은 DML 문은 허용되지 않습니다.
    • CREATE TABLEALTER TABLE와 같은 DDL 문은 허용되지 않습니다.
    • LOAD, SET, CLUSTER, LOCK, CHECKPOINT, EXPLAIN와 같은 다른 문 유형은 허용되지 않습니다.
  • 쿼리 계획을 사용하는 은밀한 채널 공격 가능성을 방지하기 위해 EXPLAIN 문이 허용되지 않습니다. 자세한 내용은 은밀한 채널을 참고하세요.

매개변수화된 모든 뷰 나열

parameterized_views 확장 프로그램을 사용하여 all_parameterized_views 뷰를 사용하여 데이터베이스의 모든 매개변수화된 뷰를 나열합니다. 이 뷰의 출력은 pg_views 카탈로그 뷰와 동일하지만 all_parameterized_views는 이름이 지정된 뷰 매개변수가 있는 뷰만 표시합니다.

매개변수가 있는 뷰를 나열하려면 다음 예시를 사용하세요.

postgres=# select * from parameterized_views.all_parameterized_views ;
schemaname |      viewname      | viewowner |                       definition
-----------+--------------------+-----------+---------------------------------------------------------
public     | checked_items_view | postgres  |  SELECT checked_items.bag_id,                          +
           |                    |           |     checked_items."timestamp",                         +
           |                    |           |     checked_items.location                             +
           |                    |           |    FROM checked_items                                  +
           |                    |           |   WHERE (checked_items.customer_id = $@app_end_userid);

all_parameterized_views에 매개변수가 있는 뷰를 나열하려면 매개변수가 있는 뷰의 정의에 이름이 지정된 뷰 매개변수가 하나 이상 포함되어 있는지 확인합니다.

다음 단계