파라미터화된 보안 뷰는 애플리케이션에 데이터 보안 및 행 수준 액세스 제어를 제공합니다. 애플리케이션 사용자의 ID를 기반으로 쿼리 결과를 필터링합니다.
이 튜토리얼에서는 Cloud SQL에서 파라미터화된 보안 뷰를 설정하고, 기본 테이블에 대한 액세스를 제한하도록 데이터베이스 역할 및 권한을 구성하고, 데이터 보안을 확인하는 방법을 설명합니다. 이 문서에 제공된 예시는 데모용으로만 제공됩니다.
파라미터화된 보안 뷰란 무엇인가요?
일반적인 권장사항으로 애플리케이션은 데이터베이스에 대한 최소한의 필수 액세스 권한이 있는 서비스 계정을 사용하여 실행해야 합니다. 예를 들어 애플리케이션이 데이터베이스에 써서는 안 되는 경우 읽기 전용 액세스 권한이 있는 역할을 사용해야 합니다. 데이터베이스 수준에서 이러한 액세스 제어를 구성해야 합니다.
애플리케이션에 표준 데이터베이스 수준 액세스 권한보다 세분화된 보안이 필요한 경우 파라미터화된 보안 뷰를 사용하여 사용자가 승인된 데이터만 보도록 할 수 있습니다. 파라미터화된 보안 뷰는 각 애플리케이션 최종 사용자를 위한 별도의 데이터베이스 역할이 필요하지 않고 다중 테넌트 SaaS 애플리케이션에 적합한 동적 데이터 보안 및 행 수준 액세스 제어를 제공합니다.
파라미터화된 보안 뷰를 사용하면 다음과 같은 세 가지 주요 이점이 있습니다.
- 동적 데이터 보안 및 행 수준 액세스 제어: 최종 사용자 식별자를 사용하여 쿼리를 필터링하므로 사용자는 쿼리 구문과 관계없이 승인된 데이터에만 액세스합니다.
- 더 쉬운 역할 관리: 각 개인의 별도 데이터베이스 역할을 관리하는 대신 모든 애플리케이션 사용자를 위한 단일 공유 데이터베이스 역할을 사용합니다.
목표
- 이름이 지정된 뷰 파라미터를 사용하여 파라미터화된 보안 뷰를 만듭니다.
- 애플리케이션이 데이터베이스에 연결하고 파라미터화된 보안 뷰에 액세스할 때 사용할 데이터베이스 역할을 만듭니다.
- 새 역할에 파라미터화된 보안 뷰에 대한 권한을 부여하고 기본 테이블에 대한 액세스 권한을 취소합니다.
- 새 역할을 사용해 연결한 후 제한된 테이블에 액세스할 수 없는지 확인합니다.
mysql.execute_parameterized_query저장 프로시저 또는 QueryData API를 사용하여 파라미터화된 뷰에서 쿼리를 실행합니다.
비용
이 문서에서는 비용이 청구될 수 있는 구성요소를 사용합니다 Google Cloud.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용합니다.
신규 Google Cloud 사용자는 무료 체험판을 사용할 수 있습니다.
요금이 계속 청구되지 않도록 하려면 이 문서의 작업을 완료할 때 만든 리소스를 삭제합니다. 자세한 내용은 정리를 참조하세요.
시작하기 전에
파라미터화된 보안 뷰를 만들기 전에 다음 기본 요건을 완료하세요.
결제 및 필수 API 사용 설정
Google Cloud 콘솔에서 프로젝트를 선택합니다.
Cloud SQL을 만들고 여기에 연결하는 데 필요한 Cloud API를 사용 설정합니다.
프로젝트 확인 단계에서 다음을 클릭하여 변경할 프로젝트의 이름을 확인합니다.
API 사용 설정 단계에서 사용 설정 을 클릭하여 다음을 사용 설정합니다.
- MySQL용 Cloud SQL API
- Knowledge Catalog API
데이터베이스 만들기 및 연결
개발 환경 준비
파라미터화된 보안 뷰에서 쿼리를 실행할 준비를 하려면 데이터베이스, 데이터베이스 역할, 애플리케이션 스키마를 설정합니다.
데이터베이스 플래그 사용 설정
- MySQL용 Cloud SQL 인스턴스가 MySQL용 Cloud SQL 8.0.43 이상을 실행하고 있는지 확인합니다. MySQL용 Cloud SQL 8.0 인스턴스가 이전 마이너 버전을 실행하고 있는 경우 마이너 버전 업그레이드를 실행할 수 있습니다.
- 인스턴스에
cloudsql_parameterized_secure_view데이터베이스 플래그를 사용 설정합니다. 이 플래그 변경에는 데이터베이스 재시작이 필요하지 않습니다. 자세한 내용은 인스턴스의 데이터베이스 플래그 구성을 참조하세요.
데이터베이스 및 역할 설정
콘솔에서 Cloud SQL 페이지로 이동합니다. Google Cloud
목록에서 인스턴스를 선택합니다.
탐색 메뉴에서 Cloud SQL Studio 를 클릭합니다.
관리 권한 사용자 계정을 사용하여 스튜디오 에 로그인합니다.
인증 을 클릭합니다. 탐색기 창에 데이터베이스의 객체 목록이 표시됩니다.
새 SQL 편집기 탭 또는 새 탭 을 클릭하여 새 탭을 엽니다.
애플리케이션 데이터 및 뷰를 위해
store_db라는 데이터베이스를 만듭니다.CREATE DATABASE IF NOT EXISTS store_db; USE store_db;파라미터화된 뷰에 대해 쿼리를 실행하기 위한 새 데이터베이스 역할을 만듭니다. 애플리케이션은 이 역할을 사용하여 데이터베이스에 연결하고 승인된 뷰에만 엄격하게 제한된 액세스 권한으로 쿼리를 실행합니다.
CREATE ROLE 'psv_user';
테이블 만들기 및 데이터 삽입
콘솔에서 Cloud SQL 페이지로 이동합니다. Google Cloud
목록에서 MySQL용 Cloud SQL 인스턴스를 선택합니다.
탐색 메뉴에서 Cloud SQL Studio 를 클릭합니다.
데이터베이스 인증을 사용하여 스튜디오 에 로그인합니다.
새 탭 을 클릭하여 새 SQL 편집기 탭을 엽니다.
테이블을 만들고 데이터를 삽입합니다.
CREATE TABLE store_db.checked_items ( bag_id INT, timestamp TIMESTAMP, loc_code CHAR(3), scan_type CHAR(1), location TEXT, customer_id INT ); INSERT INTO store_db.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);
파라미터화된 보안 뷰 만들기 및 액세스 권한 설정
파라미터화된 보안 뷰를 만들려면 다음 단계를 따르세요.
콘솔에서 Cloud SQL 페이지로 이동합니다. Google Cloud
목록에서 인스턴스를 선택합니다.
탐색 메뉴에서 Cloud SQL Studio 를 클릭합니다.
스튜디오 에 로그인하고 이전 섹션에서 사용한
store_db사용자 계정으로database에 연결합니다.인증 을 클릭합니다. 탐색기 창에 데이터베이스의 객체 목록이 표시됩니다.
새 SQL 편집기 탭 또는 새 탭 을 클릭하여 새 탭을 엽니다.
뷰에 제한된 액세스 권한을 제공하기 위해 파라미터화된 뷰를 만듭니다.
CREATE VIEW store_db.secure_checked_items AS SELECT bag_id, timestamp, location FROM store_db.checked_items t WHERE customer_id = @app_end_userid;psv_user역할에 파라미터화된 뷰에 대한 SELECT 액세스 권한을 부여합니다.GRANT SELECT ON store_db.secure_checked_items TO 'psv_user';파라미터화된 쿼리를 안전하게 실행하는 데 사용되는 기본 제공 시스템 저장 프로시저에 대한 실행 권한을 부여합니다.
GRANT EXECUTE ON PROCEDURE mysql.execute_parameterized_query TO 'psv_user';선택사항입니다. 사용자가 보안 뷰를 우회할 수 없도록
psv_user에서 기본 테이블에 대한 직접 권한을 명시적으로 취소합니다.REVOKE ALL PRIVILEGES ON store_db.checked_items FROM 'psv_user';IAM 인증 데이터베이스 사용자 또는 애플리케이션 로그인 계정에
psv_user역할을 부여합니다.GRANT 'psv_user' TO 'IAM_USER_EMAIL'@'%'; SET DEFAULT ROLE 'psv_user' TO 'IAM_USER_EMAIL'@'%';IAM_USER_EMAIL을 IAM 사용자 이메일 주소 또는 애플리케이션 로그인 계정으로 바꿉니다.
데이터 보안 확인
파라미터화된 보안 뷰를 쿼리할 수 있는지 확인하려면 다음 단계를 따르세요.
제한된 IAM 이메일 주소 또는 애플리케이션 로그인을 사용하여 Cloud SQL Studio 에 로그인합니다.
새 탭 을 클릭하여 새 SQL 편집기 탭을 엽니다.
기본 테이블을 쿼리하고 액세스가 거부되었는지 확인합니다.
SELECT * FROM store_db.checked_items;데이터베이스에서
ERROR 1142 (42000): SELECT command denied to user 'IAM_USER_EMAIL'@'%' for table 'checked_items'오류를 반환합니다.기본 제공
mysql.execute_parameterized_query저장 프로시저를 사용하여 파라미터화된 보안 뷰를 쿼리합니다.CALL mysql.execute_parameterized_query( 'SELECT * FROM store_db.secure_checked_items', 'app_end_userid=303' );SQL 구문과 PSV 매개변수가 있는
QueryData요청을 사용하여 파라미터화된 보안 뷰를 쿼리합니다.curl -X POST \ "https://geminidataanalytics.googleapis.com/v1beta/projects/PROJECT_ID/locations/REGION:queryData" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json; charset=utf-8" \ -d '{ "prompt": "Show me the checked items.", "context": { "datasource_references": { "cloud_sql_reference": { "database_reference": { "engine": "MYSQL", "project_id": "PROJECT_ID", "region": "REGION", "instance_id": "INSTANCE_ID", "database_id": "DATABASE_ID" } } }, "parameterized_secure_view_parameters": { "parameters": { "key": "app_end_userid" "app_end_userid": "303" } } }, "generation_options": { "generate_query_result": true, "generate_natural_language_answer": true, "generate_explanation": true } }'다음 값을 바꿉니다.
PROJECT_ID: 프로젝트 ID입니다. Google CloudREGION: MySQL용 Cloud SQL 인스턴스가 있는 리전입니다.INSTANCE_ID: MySQL용 Cloud SQL 인스턴스의 ID입니다.DATABASE_ID: MySQL용 Cloud SQL 데이터베이스의 ID입니다.
정리
클러스터 삭제
시작하기 전 섹션에서 만든 클러스터를 삭제하면 만든 모든 객체도 삭제됩니다.
콘솔에서 Cloud SQL 페이지로 이동합니다. Google Cloud
목록에서 인스턴스를 선택합니다.
삭제 를 클릭합니다.
인스턴스 이름을 입력하고 삭제 를 클릭하여 인스턴스 삭제를 확인합니다.