이 문서에서는 애플리케이션 사용자 인증 정보와 같은 애플리케이션별로 이름이 지정된 파라미터를 기반으로 데이터 액세스를 제한할 수 있는 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에서 기존 파라미터화된 보안 뷰를 쿼리하려고 하면 다음 오류가 발생할 수 있습니다:
|