DLP 프록시를 사용하여 Cloud SQL와 상호작용

이 가이드에서는 반환된 결과가 토큰화되거나 익명화되도록 Cloud Data Loss Prevention(Cloud DLP)을 통해 쿼리 결과를 전달하는 프록시 사용 방법을 보여줍니다. 이 프록시는 이 가이드에서 데모용으로 사용되며, 프로덕션 용도로 사용되지 않습니다.

이 가이드는 Cloud DLP를 사용하여 Cloud SQL에 저장된 데이터를 토큰화하고 익명화하는 데 관심이 있는 데이터베이스 관리자, 보안 전문가, 클라우드 설계자를 대상으로 작성되었습니다. 이 가이드에서는 사용자가 Cloud Shell 및 Cloud SQL에 익숙하다고 가정합니다.

모든 조직에서 저장되는 데이터 양이 계속 증가하고 있으며, 이중 상당 부분은 민감한 정보로 고려될 수 있습니다. 데이터베이스에 쿼리를 실행할 때 이렇게 저장된 데이터에 액세스하는 모든 사람이 민감한 정보를 봐야 할 필요는 없습니다.

이 가이드에서는 민감한 정보가 포함된 Cloud SQL 데이터베이스에 액세스를 허용하면서도 쿼리 결과를 볼 때 이러한 민감한 정보가 표시되지 않도록 방지하는 한 가지 방법을 보여줍니다.

다음 다이어그램에서는 이 가이드에서 사용되는 배포 아키텍처를 보여줍니다.

사용자가 Cloud SQL 데이터베이스에 액세스할 수 있는 배포 아키텍처

이 가이드에서는 Cloud SQL과 간단한 SQL 클라이언트 사이의 인터페이스로 작동하는 DLP 프록시를 설정합니다.

목표

  • 데이터베이스를 만들고 테이블에 민감한 샘플 데이터를 채웁니다.
  • Cloud DLP 템플릿을 만듭니다.
  • DLP 프록시 서버 및 클라이언트 JAR 파일을 다운로드합니다.
  • Cloud SQL 인스턴스 데이터베이스에 연결하고 Cloud DLP 템플릿을 사용하도록 DLP 프록시를 구성합니다.
  • 프록시 기능을 테스트합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Cloud Console의 프로젝트 선택기 페이지에서 Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. 필요한 API를 사용 설정합니다.

    API 사용 설정

MySQL용 Cloud SQL 데이터베이스 만들기

이 섹션에서는 Cloud SQL 인스턴스를 만들고, MySQL용 Cloud SQL 데이터베이스를 만들고 몇 가지 민감한 샘플 데이터를 추가합니다.

  1. Cloud Console에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Cloud Console 하단에 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 gcloud 명령줄 도구가 포함되고 Cloud SDK가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

  2. 이 가이드의 모든 명령어는 Cloud Shell에서 실행됩니다.
  3. Google의 공개 Cloud Storage 버킷 가이드를 완료하는 데 필요한 파일을 gcp-dlp-tutorial 폴더에 복사합니다.
    mkdir gcp-dlp-proxy-tutorial
    gsutil cp  gs://solutions-public-assets/dlp-cloudsql-proxy/*.* gcp-dlp-proxy-tutorial
    
  4. Cloud 프로젝트를 설정합니다.
    gcloud config set project project-id
    

    다음을 바꿉니다.

    • project-id: 해당 클라우드 프로젝트 ID입니다.
  5. 가이드 파일을 복사한 폴더로 디렉터리를 바꿉니다.
    cd  gcp-dlp-proxy-tutorial
    
  6. 영역 목록을 보려면 다음 명령어를 실행하세요.
    gcloud compute zones list
    

    영역에 대한 자세한 내용은 지리 및 리전을 참조하세요.

  7. Cloud SQL 인스턴스를 만들려는 영역을 선택하고 영역을 환경 변수로 내보냅니다.
    export ZONE=zone
    

    다음을 바꿉니다.

    • zone: Cloud SQL 인스턴스를 만들기 위해 선택한 영역입니다.
  8. MySQL용 Cloud SQL 인스턴스(dlp-test-instance)를 만듭니다.
    gcloud sql instances create dlp-test-instance  --zone  $ZONE
    

    다음과 비슷한 결과가 표시되면 인스턴스가 생성됩니다.

    Creating Cloud SQL instance...done.
    Created [https://www.googleapis.com/sql/v1beta4/projects/[PROJECT_ID]/instances/dlp-test-instance].
    NAME               DATABASE_VERSION  LOCATION  TIER              PRIMARY_ADDRESS  PRIVATE_ADDRESS  STATUS
    dlp-test-instance  MYSQL_5_7         [ZONE]    db-n1-standard-1  35.195.26.16     -                RUNNABLE
    
  9. root@% MYSQL 사용자의 비밀번호를 설정합니다.
    gcloud sql users set-password root \
      --host=% --instance=dlp-test-instance \
      --password=password
    

    다음을 바꿉니다.

    • password: 강력한 비밀번호입니다.

    결과가 다음과 같이 표시됩니다.

    Updating Cloud SQL user...done.
    
  10. 인스턴스에 dlp-test-db라는 데이터베이스를 만듭니다.
    gcloud sql databases create  dlp-test-db --instance dlp-test-instance
    

    출력은 다음과 비슷합니다.

    Creating Cloud SQL database...done.
    Created database [dlp-test-db].
    instance: dlp-test-instance
    name: dlp-test-db
    project: project-id
    
  11. dlptester라는 데이터베이스 사용자를 만듭니다.
    gcloud sql users create dlptester \
      --host=% --instance=dlp-test-instance --password=password-database
    

    다음을 바꿉니다.

    • password-database: 강력한 비밀번호입니다. 비밀번호는 이 가이드의 후반부에 필요하므로 비밀번호를 기록해 둡니다.

    출력이 다음과 같이 표시됩니다.

    Creating Cloud SQL user...done.
    Created user [dlptester].
    
  12. MySQL용 Cloud SQL 인스턴스에 연결합니다.
    gcloud sql connect dlp-test-instance  --user=dlptester
    

    메시지가 표시되면 password-database를 입력합니다.

  13. MySQL 프롬프트에서 TEST_DATA라는 테이블을 만들고 여기에 민감한 샘플 데이터 행을 몇 개 정도 채웁니다.
    source create_test_data.sql
    
  14. MySQL 프롬프트에서 테스트 데이터가 테이블에 로드되었는지 보여주는 쿼리를 실행합니다.
    select * from TEST_DATA LIMIT 10;
    

    다음과 비슷하게 쿼리 결과가 표시됩니다.

    MySQL [dlp-test-db]> select * from TEST_DATA LIMIT 10;
    +------+---------------------+--------------+-------------+--------+
    | id   | email               | phone        | ssn         | metric |
    +------+---------------------+--------------+-------------+--------+
    |    1 | mallory@example.org | 858-222-0222 | 222-22-2222 |      5 |
    |    2 | james@example.org   | 858-333-0333 | 333-33-3333 |      8 |
    |    3 | mallory@example.org | 858-222-0222 | 222-22-2222 |      8 |
    |    4 | maria@example.org   | 858-444-0444 | 444-44-4444 |      1 |
    |    1 | mallory@example.org | 858-222-0222 | 222-22-2222 |      5 |
    |    2 | james@example.org   | 858-333-0333 | 333-33-3333 |      8 |
    |    3 | mallory@example.org | 858-222-0222 | 222-22-2222 |      8 |
    |    4 | maria@example.org   | 858-444-0444 | 444-44-4444 |      1 |
    +------+---------------------+--------------+-------------+--------+
    8 rows in set (0.00 sec)
    
  15. MySQL 클라이언트를 종료합니다.
    exit
    

Cloud DLP 템플릿 만들기

이 섹션에서는 Cloud DLP 템플릿을 2개 만듭니다. 첫 번째는 InfoTypes로 정의된 대로 TEST_DATA 테이블의 데이터에 민감한 정보가 있는지 검사하는 검사 템플릿입니다. 두 번째는 InfoTypes로 정의된 민감한 정보를 토큰화하는 익명화 템플릿입니다.

검사 템플릿 만들기

  1. Cloud Console에서 Cloud DLP 페이지로 이동합니다.

    CLOUD DLP로 이동

  2. 만들기를 클릭하고 템플릿을 선택합니다.

  3. 템플릿 ID 필드에서 inspect-template-1을 입력합니다.

  4. 계속을 클릭합니다.

  5. InfoTypesEMAIL_ADDRESS, PHONE_NUMBER, US_SOCIAL_SECURITY_NUMBER로 설정합니다.

  6. 만들기를 클릭합니다.

익명화 템플릿 만들기

이 섹션에서는 암호화 해시를 사용해서 생성된 서로게이트 값으로 민감한 정보를 바꾸도록 구성된 de-identify-template-1이라는 익명화 템플릿을 만듭니다. 자세한 내용은 Cloud DLP 문서의 cryptoHashConfig 섹션을 참조하세요.

  1. API 탐색기로 이동합니다.

  2. 상위 필드에서 [YOUR-PROJECT]를 클라우드 프로젝트 ID로 바꿉니다.

  3. 실행을 선택하고 메시지가 표시되면 실행을 다시 선택합니다.

    다음과 비슷한 200 응답 및 결과가 표시됩니다.

    {
      "name": "projects/YOUR-PROJECT-ID/deidentifyTemplates/de-identify-template-1",
      "createTime": "2019-10-15T12:46:51.944253Z",
      "updateTime": "2019-10-15T12:46:51.944253Z",
      "deidentifyConfig": {
        "infoTypeTransformations": {
          "transformations": [
            {
              "infoTypes": [
                {
                  "name": "PHONE_NUMBER"
                },
                {
                  "name": "US_SOCIAL_SECURITY_NUMBER"
                },
                {
                  "name": "EMAIL_ADDRESS"
                }
              ],
              "primitiveTransformation": {
                "cryptoDeterministicConfig": {
                  "cryptoKey": {
                    "transient": {
                      "name": "abc"
                    }
                  },
                  "surrogateInfoType": {
                    "name": "S1"
                  }
    
  4. 익명화 템플릿이 성공적으로 저장되었는지 검사하려면 API 탐색기로 돌아가서 템플릿 목록을 표시합니다.

  5. 상위 필드에 projects/project-id를 입력합니다.

  6. 실행을 선택하고 메시지가 표시되면 실행을 다시 선택합니다.

    다음과 비슷한 출력이 표시되고 생성한 템플릿이 포함됩니다.

    API 탐색기의 출력

DLP 프록시 구성 및 사용

이 섹션에서는 DLP 프록시를 구성하고, 클라이언트를 사용해서 프록시에 연결하고, 쿼리 결과가 Cloud DLP에서 처리되는지 테스트합니다.

  1. Cloud Shell에서 가이드 파일을 복사한 폴더가 있는 디렉터리로 변경합니다.

    cd  ~/gcp-dlp-proxy-tutorial
    
  2. DLP 프록시 서버 구성 파일을 편집합니다.

    nano config.json
    
  3. 다음 줄을 수정하여 해당 구성에 맞는 값으로 자리 표시자를 바꿉니다.

    "db_instance": "project_id:region:instance_name",
    "db_dbname": "dbase_name",
    "projectID": "project_id",
    "audit_template": "inspect_template",
     "deidentify_template": "deidentify_template",
    

    다음을 바꿉니다.

    • project_id: 해당 클라우드 프로젝트 ID입니다.
    • region: Cloud SQL 인스턴스가 생성된 영역에 해당하는 리전 이름입니다. 예를 들어 인스턴스가 us-central1-a 영역에 생성된 경우에는 리전이 us-central1.입니다.
    • instance_name: Cloud SQL 인스턴스 이름입니다(예: dlp-test-instance).
    • dbase_name: 데이터베이스 이름입니다(예: dlp-test-db).
    • inspect_template: 검사 템플릿 이름입니다(예: inspect-template-1).
    • inspect_template: 익명화 템플릿입니다(예: de-identify-template-1).
  4. DLP 프록시를 시작하려면 터미널 결과를 log.txt 파일로 지정하여 백그라운드에서 프록시를 실행합니다.

    java -jar dlp-cloudsql-proxy-server.jar database_userpassword-databaselog.txt 2>&1 &
    

    다음을 바꿉니다.

    • database_user: 데이터베이스 사용자의 사용자 이름입니다.
    • password-database: 이전에 만든 데이터베이스 사용자의 비밀번호입니다.
  5. DLP 프록시가 실행 중인지 확인하려면 프로세스가 실행 중인지 확인합니다.

    ps -ax | grep dlp-cloudsql-proxy-server.jar
    

    DLP 프록시를 실행하는 프로세스가 출력에 표시됩니다.

    1233 pts/1    Sl     0:08 java -jar dlP-cloudsql-proxy-Server.jar dlptester XXXXXXXX
    1266 pts/1    S+     0:00 grep --color=auto dlp-cloud sql-proxy-Server
    

    실행 중인 프로세스가 표시되지 않으면 log.txt 파일에서 오류 메시지를 확인합니다.

  6. 제공된 간단한 클라이언트를 시작하여 5000 포트에서 DLP 프록시에 연결합니다.

    java -jar dlp-sql-proxy-client-0.1.0.jar 5000
    
  7. 클라이언트에서 간단한 쿼리를 실행합니다. 반환되기 전 Cloud DLP가 데이터를 처리해야 하기 때문에 이 명령어는 잠시 시간이 걸릴 수 있습니다.

    select * from TEST_DATA LIMIT 10;
    

    결과에는 쿼리 결과에서 암호화된 방식으로 해시된 서로게이트 값으로 바뀐 상태의 전화 번호, 이메일 주소, SSN 값이 포함됩니다. 앞에서 프록시를 사용하지 않은 상태로 반환된 결과와 이 결과를 비교하세요.

    Connected to SQL Proxy
    Enter query here (enter "quit" to disconnect):
    select * from TEST_DATA LIMIT 10;
    id: 1
    phone: S1(40):AYnPXA6QcxlpOITeaZZM3+U/s7KtXyTqv5KAbB8=
    metric: 5
    email: S1(48):AS8hnzz6g1fGCabK2cbhPn5X7Qvc7FKmLTXnKF1iKF2nRjGQ
    ssn: S1(40):AQ1jSCdIsctniCkCHNEbsc+kliJArHmM6bOJRg==
    
    id: 2
    phone: S1(40):AfiaKlOYHAzgWGtrkpvaCWUY1e2yvMaK7IQvM/M=
    metric: 8
    email: S1(48):ASF7UBFuZ/xUzXJjD1Ap745xcGmKpTjw+IwIBB/F/OX53w==
    ssn: S1(40):AWYXh7U8PhNUZu+fXLuLFS0KCMmcM5uKH17rig==
    
    id: 3
    phone: S1(40):AYnPXA6QcxlpOITeaZZM3+U/s7KtXyTqv5KAbB8=
    metric: 8
    email: S1(48):AS8hnzz6g1fGCabK2cbhPn5X7Qvc7FKmLTXnKF1iKF2nRjGQ
    ssn: S1(40):AQ1jSCdIsctniCkCHNEbsc+kliJArHmM6bOJRg==
    
    id: 4
    phone: S1(40):AXFnPkf620wIBXxW0uuBXSVERzRzvhdgbCdaYIw=
    metric: 1
    email: S1(48):AZgs1pfjEPLL6sDAcIZWuCZhC/saw/rQrujxAFy/O60uIA==
    ssn: S1(40):AatdICHDpwCc19ELEjCS8zAmeSVvx/1KB5/S2Q==
    
    End of query results
    
  8. 클라이언트를 종료합니다.

    quit
    
  9. DLP 프록시 서버를 종료합니다.

    killall java
    
  10. DLP 프록시의 출력을 표시하도록 터미널에 log.txt 파일을 작성합니다.

    cat  log.txt
    

    감사 단계의 결과가 앞에서 구성한 세 가지 InfoTypes에 맞게 파일 끝에 표시됩니다.

    RunCommand
    DLP Result
    DLP Findings:
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
            Quote:                          Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
            Quote:                          Info type: EMAIL_ADDRESS        Likelihood: LIKELY
            Quote:                          Info type: US_SOCIAL_SECURITY_NUMBER    Likelihood: VERY_LIKELY
    
    Got DLP Result
    Sensitive information found
    write log: 1503994
    Logged Main.Query: 1503994
    

삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 Cloud 프로젝트를 삭제하는 것입니다. 또는 개별 리소스를 삭제할 수 있습니다.

프로젝트 삭제

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제 를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계