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

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

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

시작하기 전에

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

매개변수화된 보안 뷰를 사용하려면 다음을 수행해야 합니다.

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

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

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

  3. AlloyDB Studio 또는 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 행을 반환합니다.
  • 커서 기반: 장기 실행 쿼리가 있거나 대규모 쿼리가 있고 결과를 일괄적으로 가져오려는 경우 이 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

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);

쿼리에 적용된 제한사항

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

  • 애플리케이션에서 지정한 값만 사용되도록 API(execute_parameterized_query 또는 EXECUTE .. WITH VIEW PARAMETERS 사용)의 재귀 호출은 금지됩니다. 이 제한으로 인해 쿼리를 사용하여 지정된 매개변수 값 집합의 보안 봉투를 우회할 수도 없습니다.
  • 새 백그라운드 세션을 시작하는 일부 확장 프로그램(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에 매개변수화된 뷰를 나열하려면 매개변수화된 뷰의 정의에 하나 이상의 명명된 뷰 매개변수가 포함되어 있어야 합니다.

다음 단계