이 튜토리얼에서는 문서에서 악성 코드를 자동 평가하는 데 유용한 이벤트 기반 파이프라인을 빌드하는 방법을 보여줍니다.
대부분의 앱에서 Cloud Storage에 업로드된 다수의 문서를 수동으로 평가하는 작업은 시간이 오래 걸릴 있습니다.
이 파이프라인은 Google Cloud 제품과 ClamAV라는 오픈소스 바이러스 백신 엔진을 사용하여 빌드됩니다. 이 튜토리얼에서 ClamAV는 Cloud Run에서 호스팅되는 Docker 컨테이너에서 실행됩니다. 또한 파이프라인은 Cloud Logging에 로그 항목을 쓰고 Cloud Monitoring에 측정항목을 기록합니다.
이러한 Logging 로그 항목을 사용하면 감염된 문서에 대해 로그 기반 알림을 트리거할 수 있지만 이러한 알림 설정은 이 튜토리얼에서 다루지 않습니다.
이 튜토리얼 전체에서 멀웨어라는 용어는 트로이 목마, 바이러스, 기타 악성 코드를 설명하는 상위 용어로 사용됩니다.
이 튜토리얼에서는 사용자가 Cloud Storage, Cloud Run, Eventarc, Docker, Node.js의 기본 기능에 익숙하다고 가정합니다.
아키텍처
다음 다이어그램은 파이프라인의 단계를 간략하게 보여줍니다.
다음 단계는 아키텍처 파이프라인을 간략하게 설명합니다.
- Cloud Storage에 파일을 업로드합니다.
- 업로드 이벤트가 멀웨어 검사 서비스를 자동으로 트리거합니다.
- 멀웨어 검사 서비스는 업로드된 문서에 멀웨어가 있는지 검사합니다.
- 서비스는 감염된 문서는 격리된 버킷으로 옮기고, 그 밖의 문서는 비감염 문서를 보관하는 다른 버킷으로 옮깁니다.
목표
ClamAV를 사용하여 문서에 멀웨어가 있는지 검사하는 Cloud Run 멀웨어 검사 서비스를 빌드하고 검사 결과에 따라 스캔한 문서를 정상 버킷 또는 격리 버킷으로 이동합니다.
문서가 Cloud Storage에 업로드될 때 멀웨어 검사 서비스를 트리거하는 Eventarc 트리거를 만듭니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Run, Eventarc, Logging, and Cloud Build APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
이 튜토리얼에서는 Cloud Shell에서 모든 명령어를 실행합니다.
환경 설정
이 섹션에서는 리전과 영역 같이 가이드 전반에 사용되는 값의 기본 설정을 할당합니다.
이 튜토리얼에서는 us-central1
을 Cloud Run 서비스의 리전으로, us
를 Eventarc 트리거 및 Cloud Storage 버킷의 위치로 사용합니다.
Cloud Shell에서 리전과 위치를 설정합니다.
export REGION=us-central1 export LOCATION=us
프로젝트 ID로
gcloud
환경을 초기화하고 환경 변수를 설정합니다.export PROJECT_ID=PROJECT_ID gcloud config set project "${PROJECT_ID}"
PROJECT_ID를 프로젝트 ID로 설정합니다.
3개의 Cloud Storage 버킷을 만들고 각각 고유한 이름을 지정합니다.
gsutil mb -l "${LOCATION}" "gs://unscanned-${PROJECT_ID}" gsutil mb -l "${LOCATION}" "gs://quarantined-${PROJECT_ID}" gsutil mb -l "${LOCATION}" "gs://clean-${PROJECT_ID}"
${PROJECT_ID}
는 버킷 이름이 고유한지 확인하는 데 사용합니다.
생성된 3개의 버킷에는 파이프라인의 여러 단계에서 처리되는 문서를 보관합니다.
unscanned-PROJECT_ID
: 처리되기 전 문서를 보관합니다. 문서를 업로드할 버킷입니다.quarantined-PROJECT_ID
: 멀웨어 검사 서비스의 검사 결과 멀웨어가 포함된 것으로 판단되는 문서를 보관합니다.clean-PROJECT_ID
: 멀웨어 검사 서비스의 검사 결과 비감염 문서를 보관합니다.
멀웨어 검사 서비스의 서비스 계정 만들기 및 권한 부여
이 섹션에서는 멀웨어 검사 서비스에 사용할 서비스 계정을 만들고 Cloud Storage 버킷에 읽고 쓸 수 있는 권한을 갖도록 서비스 계정에 적절한 역할을 부여합니다. 이는 계정에 최소한의 권한과 필요한 리소스에 대한 액세스 권한만 부여하도록 하기 위함입니다.
malware-scanner
서비스 계정을 만듭니다.gcloud iam service-accounts create malware-scanner export SERVICE_ACCOUNT="malware-scanner@${PROJECT_ID}.iam.gserviceaccount.com"
버킷에 객체 관리자 역할을 부여하면 서비스가 스캔되지 않은 버킷에서 문서를 읽고 삭제할 수 있으며 격리 및 정상 버킷에 문서를 쓸 수 있습니다.
gsutil iam ch \ "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \ "gs://unscanned-${PROJECT_ID}" gsutil iam ch \ "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \ "gs://clean-${PROJECT_ID}" gsutil iam ch \ "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \ "gs://quarantined-${PROJECT_ID}"
서비스가 Monitoring에 측정항목을 쓸 수 있도록 측정항목 작성자 역할을 부여합니다.
gcloud projects add-iam-policy-binding \ "${PROJECT_ID}" \ --member="serviceAccount:${SERVICE_ACCOUNT}" \ --role=roles/monitoring.metricWriter
Cloud Run에서 멀웨어 검사 서비스 만들기
이 섹션에서는 멀웨어 검사 서비스를 Cloud Run에 배포합니다. 이 서비스는 Docker 컨테이너에서 실행되며 다음을 포함합니다.
- 멀웨어 검사 서비스의 Node.js 파일
- 서비스 및 ClamAV 바이너리로 이미지를 빌드하는 Dockerfile
- 컨테이너 시작 시 clamAV 및
freshclam
데몬을 실행하는bootstrap.sh
셸 스크립트
Cloud Shell에서 코드 파일이 포함된 샘플 GitHub 저장소를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
cloudrun-malware-scanner
디렉터리로 변경합니다.cd docker-clamav-malware-scanner/cloudrun-malware-scanner
앞에서 만든 서비스 계정을 사용하여 Cloud Run 서비스를 만들고 배포합니다.
export SERVICE_NAME=malware-scanner gcloud beta run deploy "${SERVICE_NAME}" \ --source . \ --region "${REGION}" \ --no-allow-unauthenticated \ --memory 4Gi \ --min-instances 1 \ --no-cpu-throttling \ --service-account="${SERVICE_ACCOUNT}" \ --set-env-vars \ "UNSCANNED_BUCKET=unscanned-${PROJECT_ID}, CLEAN_BUCKET=clean-${PROJECT_ID}, QUARANTINED_BUCKET=quarantined-${PROJECT_ID}"
메시지가 표시되면
Y
를 입력합니다.
배포가 완료되면 메시지가 표시됩니다.
Service [malware-scanner] revision [malware-scanner-NNNNN-XXX] has been deployed and is serving 100 percent of traffic. Service URL: https://malware-scanner-XXXXXXXX-XX.a.run.app
Cloud Run 서비스를 사용하려면 모든 호출을 인증해야 하며 인증 ID에는 서비스에 대한 run.routes.invoke
권한이 있어야 합니다.
다음 명령어를 실행하여 실행 중인 서비스와 ClamAV 버전을 확인할 수 있습니다.
curl -D - -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ SERVICE_URL
SERVICE_URL은 이전에 표시된 배포 출력에 보고된 URL입니다.
Eventarc Cloud Storage 트리거 만들기
이 섹션에서는 Eventarc에서 Cloud Storage 이벤트를 캡처할 수 있는 권한과 이러한 이벤트를 Cloud Run malware-scanner
서비스로 전송하도록 트리거를 추가합니다.
2021년 4월 8일 이전에 만든 기존 프로젝트를 사용하는 경우 푸시 알림에 대한 Pub/Sub를 구성합니다.
Cloud Shell에서 Cloud Storage 서비스 계정에
roles/pubsub.publisher
역할을 부여합니다.STORAGE_SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p "${PROJECT_ID}") gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member "serviceAccount:${STORAGE_SERVICE_ACCOUNT}" \ --role "roles/pubsub.publisher"
malware-scanner
서비스 계정이 Cloud Run 서비스를 호출하고 Eventarc 이벤트 수신자 역할을 하도록 허용합니다.gcloud run services add-iam-policy-binding malware-scanner \ --region="${REGION}" \ --member "serviceAccount:${SERVICE_ACCOUNT}" \ --role roles/run.invoker gcloud projects add-iam-policy-binding "${PROJECT_ID}" --member "serviceAccount:${SERVICE_ACCOUNT}" --role "roles/eventarc.eventReceiver"
검사되지 않은 Cloud Storage 버킷에서 최종 객체 이벤트를 캡처하고 Cloud Run 서비스로 전송하는 Eventarc 트리거를 만듭니다. 트리거는 인증에
malware-scanner
서비스 계정을 사용합니다.gcloud eventarc triggers create trigger-gcs-malware-scanner \ --destination-run-service="${SERVICE_NAME}" \ --destination-run-region="${REGION}" \ --location="${LOCATION}" \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=unscanned-${PROJECT_ID}" \ --service-account="${SERVICE_ACCOUNT}"
다음 오류가 발생하면 1분 동안 기다렸다가 명령어를 다시 실행합니다.
ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: The request was invalid: Bucket "unscanned-PROJECT_ID" was not found. Please verify that the bucket exists.
파일을 업로드하여 파이프라인 테스트
멀웨어가 없는 정상 파일 1개와 감염된 파일 1개를 업로드하여 파이프라인을 테스트합니다.
샘플 텍스트 파일을 만들거나 기존의 클린 파일을 사용하여 파이프라인 프로세스를 테스트합니다.
샘플 데이터 파일을 스캔되지 않은 파일 버킷에 복사합니다.
gsutil cp filename "gs://unscanned-${PROJECT_ID}"
filename
을 클린 텍스트 파일의 이름으로 바꿉니다. 멀웨어 검사 서비스는 각 문서를 검사한 후 적절한 버킷으로 옮깁니다. 이 문서는clean-PROJECT_ID
버킷으로 이동합니다.파이프라인에서 이 문서를 처리할 때까지 몇 초 정도 기다린 다음
clean-PROJECT_ID
버킷에서 처리된 문서가 있는지 확인합니다.gsutil ls -r "gs://clean-${PROJECT_ID}"
검사되지 않은 버킷에서 문서가 삭제되었습니다.
gsutil ls -r "gs://unscanned-${PROJECT_ID}"
Cloud Shell에서 EICAR 표준 멀웨어 방지 테스트 서명이 포함된
eicar-infected.txt
파일을unscanned-PROJECT_ID
버킷에 업로드합니다.echo -e 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \ | gsutil cp - "gs://unscanned-${PROJECT_ID}/eicar-infected.txt"
몇 초 정도 기다린 다음
quarantined-PROJECT_ID
버킷에서 문서가 파이프라인에 따라 처리되었는지 확인합니다. 또한 서비스는 멀웨어에 감염된 문서가 감지되면 Logging에 로그 항목을 로깅합니다.gsutil ls -r "gs://quarantined-${PROJECT_ID}"
검사되지 않은 버킷에서 문서가 삭제되었습니다.
gsutil ls -r "gs://unscanned-${PROJECT_ID}"
서비스 모니터링
Cloud Logging 및 Cloud Monitoring을 사용하여 서비스를 모니터링할 수 있습니다.
로그 보기
Google Cloud 콘솔에서 Cloud Logging 로그 탐색기 페이지로 이동합니다.
로그 필드 필터가 표시되지 않으면 로그 필드 버튼을 클릭합니다.
로그 필드 필터에서 Cloud Run 버전을 클릭합니다.
로그 필드 필터의 서비스 이름 섹션에서 malware-scanner를 클릭합니다.
로그 쿼리 결과에는 업로드한 파일 2개의 검사 요청 및 상태를 보여주는 여러 줄을 포함한 서비스의 로그가 표시됩니다. 예를 들면 다음과 같습니다.
Info: "Scan request for gs://unscanned-PROJECT_ID/filename, (##### bytes) scanning with clam ClamAV 0.103.3/26347/Mon Nov 8 09:19:39 2021" Info: "Scan status for gs://unscanned-PROJECT_ID/filename: CLEAN (##### bytes in #### ms)" ... Info: "Scan request for gs://unscanned-PROJECT_ID/eicar-infected.txt, (69 bytes) scanning with clam ClamAV 0.103.3/26347/Mon Nov 8 09:19:39 2021" Warning: "Scan status for gs://unscanned-PROJECT_ID/eicar-infected.txt: INFECTED stream: Eicar-Signature FOUND (69 bytes in ### ms)"
ClamAV 버전 및 바이러스 서명 버전이 감염된 테스트 파일의 바이러스 이름과 함께 보고되었음을 확인할 수 있습니다.
이러한 로그 메시지를 사용하여 바이러스가 발견될 때 또는 검사 중에 오류가 발생할 때 알림을 설정할 수 있습니다.
측정항목 보기
이 서비스는 모니터링 및 알림 목적으로 다음 측정항목을 생성합니다.
- 처리된 정상 파일 수:
custom.googleapis.com/opencensus/malware-scanning/clean_files
- 처리된 감염 파일 수:
custom.googleapis.com/opencensus/malwares-canning/infected_files
- 파일을 검사하는 데 걸린 시간:
custom.googleapis.com/opencensus/malware-scanning/scan_duration
- 총 검사 바이트 수:
custom.googleapis.com/opencensus/malware-scanning/bytes_scanned
- 실패한 멀웨어 검사 수:
custom.googleapis.com/opencensus/malwares-canning/scans_failed
이러한 측정항목은 Clod Monitoring 측정항목 탐색기에서 볼 수 있습니다.
Google Cloud 콘솔에서 Cloud Monitoring 측정항목 탐색기 페이지로 이동합니다.
측정항목 필드를 클릭하고 필터 문자열
malware
를 입력합니다.OpenCensus/malware-scanning/clean_files 측정항목을 선택합니다. 그래프에 정상 파일이 검사된 시점을 나타내는 데이터 포인트가 표시됩니다.
측정항목을 사용하여 파이프라인을 모니터링하고 바이러스가 감지되거나 파일 처리에 실패한 경우에 대한 알림을 만들 수 있습니다.
추가적인 세부정보로 측정항목은 다양한 측정항목 라벨로 세분화할 수 있습니다.
- source_bucket
- destination_bucket
- clam_version
- cloud_run_revision
여러 버킷 처리
멀웨어 검사 서비스는 여러 소스 버킷의 파일을 검사하여 정상 및 격리 버킷으로 분리할 수 있습니다.
이 고급 구성은 이 튜토리얼의 범위를 벗어나지만 관련된 단계는 다음과 같이 요약됩니다.
검사되지 않거나 정상이거나 격리된 다양한 Cloud Storage 버킷을 만듭니다.
다양한 버킷에 있는
malware-scanner
서비스 계정에 적절한 역할을 부여합니다.구성 파일
config.json
을 수정하여 각 구성의 버킷 이름을 지정합니다.{ "buckets": [ { "unscanned": "unscanned-bucket-1", "clean": "clean-bucket-1", "quarantined": "quarantined-bucket-1" }, { "unscanned": "unscanned-bucket-2", "clean": "clean-bucket-2", "quarantined": "quarantined-bucket-2" } ] }
세 개의
XXX_BUCKET=...
변수 대신 환경 변수CONFIG_FILE=./config.json
을 지정하여malware-scanner
서비스를 배포하여 파일의 구성이 사용되도록 합니다.검사되지 않은 각 버킷에 대해 Eventarc 트리거를 생성하여 매번 트리거 이름과 버킷 이름을 변경합니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
다음 단계
- Cloud Storage 문서 살펴보기
- Google Cloud에 대한 참조 아키텍처, 다이어그램, 튜토리얼, 권장사항 살펴보기. Cloud 아키텍처 센터 살펴보세요.