이 문서에서는 애플리케이션 사용자 인증 정보와 같은 애플리케이션별로 이름이 지정된 파라미터를 기반으로 데이터 액세스를 제한할 수 있는 MySQL용 Cloud SQL의 파라미터화된 보안 뷰를 사용하는 방법을 설명합니다. 파라미터화된 보안 뷰는 MySQL 뷰의 기능을 확장하여 보안 및 액세스 제어를 개선합니다. 이러한 뷰는 실행되는 모든 쿼리에 여러 제한을 자동으로 적용하여 애플리케이션에서 신뢰할 수 없는 쿼리를 실행하는 위험도 완화합니다.
자세한 내용은 Cloud SQL의 매개변수화된 보안 뷰를 참고하세요.
시작하기 전에
이 문서에서는 MySQL용 Cloud SQL 인스턴스를 이미 만들었다고 가정합니다.
Cloud SQL 인스턴스가 MySQL 8.0.43 이상을 실행하고 있는지 확인합니다. MySQL 8.0 인스턴스가 이전 부 버전을 실행 중인 경우 부 버전 업그레이드를 실행할 수 있습니다.
인스턴스에
cloudsql_parameterized_secure_view데이터베이스 플래그를 사용 설정합니다.이 플래그 변경사항은 데이터베이스를 다시 시작할 필요가 없습니다. 자세한 내용은 데이터베이스 플래그 구성을 참고하세요.
파라미터화된 보안 뷰 만들기
파라미터화된 보안 뷰를 만들려면 CREATE VIEW DDL 명령어를 실행합니다.
예를 들면 다음과 같습니다.
CREATE VIEW v_orders
AS SELECT * FROM orders
WHERE customer_id = @local_customer_id;
다음 구문을 사용합니다.
-- Create a view with a parameter using the WHERE clause CREATE VIEW VIEW_NAME AS SELECT * FROM TABLE_NAME WHERE CONDITION;
-- Create a view with a parameter using the HAVING clause CREATE VIEW VIEW_NAME AS SELECT * FROM TABLE_NAME WHERE CONDITION_1 -- row level security GROUP BY COLUMN_NAME HAVING CONDITION_2; -- grouping
-- Create a view with a parameter using the ON clause CREATE VIEW VIEW_NAME AS SELECT * FROM TABLE_NAME_1 JOIN TABLE_NAME_2 ON CONDITION_1 -- join criteria WHERE CONDITION_2; -- row level security
다음을 바꿉니다.
VIEW_NAME: 파라미터화된 보안 뷰의 이름TABLE_NAME또는TABLE_NAME_N: 파라미터화된 뷰에서 사용할 테이블의 이름COLUMN_NAME또는COLUMN_NAME_N: 파라미터화된 뷰에서 사용할 테이블 열의 이름CONDITION또는CONDITION_N:WHERE,ON또는HAVING절의 일부로 평가할 조건문입니다. 나중에 뷰에 대해 쿼리를 실행할 때 매개변수로 사용되는 세션 변수를 지정할 수 있습니다. 조건은 다음과 유사합니다.WHERE customer_id = @local_customer_id
세션 변수
@variable_name는CREATE VIEW문의WHERE,ON또는HAVING절 내에서만 허용됩니다.
파라미터화된 보안 뷰 쿼리
MySQL용 Cloud SQL에서 파라미터화된 보안 뷰를 쿼리하는 방법에는 다음 두 가지가 있습니다.
파라미터화된 보안 뷰를 쿼리하는 동안
SET_VIEW_VARS힌트를 사용하여 변수에 값을 할당합니다. 뷰에서 참조하는 변수가 설정되지 않았거나 관련 없는 변수가SET_VIEW_VARS힌트에 표시되면 파라미터화된 보안 뷰에 대한 쿼리가 실패합니다.mysql.execute_parameterized_query절차를 호출하여 파라미터화된 보안 뷰를 쿼리합니다.mysql.execute_parameterized_query절차를 사용하는 경우 절차에 두 개의 인수를 제공합니다. 첫 번째 인수는 세션 변수에 관한 힌트가 없는 파라미터화된 보안 뷰에 대한 쿼리입니다. 두 번째 인수는 필요한 모든 세션 변수와 제공하려는 값을 제공합니다.
힌트 값 사용
SET_VIEW_VARS 힌트를 사용하여 파라미터화된 보안 뷰를 쿼리하려면 다음을 실행하세요.
-- Set the parameter and query SELECT /*+ SET_VIEW_VARS(SESSION_VARIABLE = VALUE) */ * FROM VIEW_NAME;
다음을 바꿉니다.
SESSION_VARIABLE: 다양한 값을 제공할 수 있는 파라미터화된 보안 뷰의 명명된 파라미터입니다. 보기 조건 절에서@variable_name표기법을 사용하여 보기를 만들 때 세션 변수 이름을 정의합니다.VALUE: 이 명명된 매개변수의 값VIEW_NAME: 파라미터화된 보안 뷰의 이름
예를 들면 다음과 같습니다.
SELECT /*+ SET_VIEW_VARS(local_customer_id = 12345) */ *
FROM v_orders;
매개변수화된 쿼리 절차 사용
mysql.execute_parameterized_query 절차를 사용하여 파라미터화된 보안 뷰를 쿼리하려면 다음 문법을 사용하세요.
CALL mysql.execute_parameterized_query( 'SELECT * FROM DATABASE_NAME.VIEW_NAME', 'SESSION_VARIABLE=VALUE');
다음을 바꿉니다.
SESSION_VARIABLE: 다양한 값을 제공할 수 있는 파라미터화된 보안 뷰의 명명된 파라미터입니다. 보기 조건 절에서@variable_name표기법을 사용하여 보기를 만들 때 세션 변수 이름을 정의합니다.VALUE: 이 명명된 매개변수의 값DATABASE_NAME: 뷰의 데이터베이스 이름VIEW_NAME: 파라미터화된 보안 뷰의 이름
예를 들면 다음과 같습니다.
CALL mysql.execute_parameterized_query(
'SELECT * FROM db.v_orders',
'local_customer_id = 5, earliest_year = 2021');
쿼리 제한사항
다음은 파라미터화된 보안 뷰 쿼리에 설명된 옵션을 사용하여 실행하는 쿼리에 적용되는 일련의 제한된 작업 목록입니다.
- 쿼리는
SELECT문만 가능합니다. - 쿼리에 사용자 정의 함수 또는 저장 프로시저 호출이 포함될 수 없습니다.
- 쿼리는 변수를 할당할 수 없습니다.
CALL mysql.execute_parameterized_query메서드를 사용하는 경우 쿼리는 단일 문으로 연결된 여러 문일 수 없습니다. 예를 들어SELECT * FROM a; DROP TABLE a;쿼리 문은 유효하지 않습니다.
로그에서 파라미터화된 보안 뷰 보기
MySQL용 Cloud SQL 데이터베이스 사용자가 매개변수화된 보안 뷰를 만들려고 하면 다음과 비슷한 정보 수준 메시지가 MySQL 오류 로그에 기록됩니다.
User variables permitted in %s.%s through Parameterized Secure View feature
파라미터화된 보안 뷰 문제 해결
| 문제 | 문제 해결 |
|---|---|
인스턴스에 cloud_parameterized_secure_view 플래그가 설정되지 않음
|
cloudsql_parameterized_secure_view 플래그가 OFF로 설정된 경우 기존 파라미터화된 보안 뷰를 쿼리하려고 하면 다음 오류가 발생합니다.
플래그를 설정하지 않고 파라미터화된 보안 뷰를 만들려고 하면 다음 오류가 표시됩니다.
전역 변수를 확인하여 Cloud SQL 인스턴스에 파라미터화된 보안 뷰가 사용 설정되어 있는지 확인할 수 있습니다. SHOW VARIABLES LIKE 'cloudsql_parameterized_secure_view'; |
View's SELECT contains a variable or
parameter 오류와 함께 쿼리가 실패합니다. |
변수는 WHERE, HAVING 또는 ON 절 외부에서 허용되지 않습니다. 이러한 절 외부에서 변수를 사용하면 오류가 발생합니다. |
User variable `%s` used in Parameterized Secure View %s
must be set in the query before using SET_VIEW_VARS hint 오류와 함께 쿼리가 실패함
|
쿼리를 실행하기 전에 세션 변수를 설정합니다. |
| MySQL 버전 오류로 인해 쿼리가 실패함 | 8.0.43 이전 버전의 MySQL에서 기존의 파라미터화된 보안 뷰를 쿼리하려고 하면 다음 오류가 발생할 수 있습니다.
|