Cloud Storage에 업로드된 파일의 멀웨어 검사 자동화

Last reviewed 2023-04-19 UTC

이 튜토리얼에서는 파일에서 악성 코드를 자동 평가하는 데 유용한 이벤트 기반 파이프라인을 빌드하는 방법을 보여줍니다.

대부분의 앱에서 Cloud Storage에 업로드된 다수의 파일을 수동으로 평가하는 작업은 시간이 오래 걸릴 있습니다.

이 파이프라인은 Google Cloud 제품과 ClamAV라는 오픈소스 바이러스 백신 엔진을 사용하여 빌드됩니다. 이 튜토리얼에서 ClamAV는 Cloud Run에서 호스팅되는 Docker 컨테이너에서 실행됩니다. 또한 파이프라인은 Cloud Logging에 로그 항목을 쓰고 Cloud Monitoring에 측정항목을 기록합니다.

이러한 Logging 로그 항목을 사용하면 감염된 파일에 대해 로그 기반 알림을 트리거할 수 있지만 이러한 알림 설정은 이 튜토리얼에서 다루지 않습니다.

이 튜토리얼 전체에서 멀웨어라는 용어는 트로이 목마, 바이러스, 기타 악성 코드를 설명하는 상위 용어로 사용됩니다.

이 튜토리얼에서는 사용자가 Cloud Storage, Cloud Run, Cloud Scheduler, Eventarc, Docker, Node.js의 기본 기능에 익숙하다고 가정합니다.

아키텍처

다음 다이어그램은 아키텍처 개요를 보여줍니다.

멀웨어 검사 파이프라인의 아키텍처

이 아키텍처에서 관리하는 파이프라인은 두 개가 있습니다.

  • 업로드된 파일에 멀웨어가 있는지 확인하는 파일 검사 파이프라인
  • ClamAV 멀웨어 데이터베이스 미러 업데이트 파이프라인: ClamAV가 사용하는 멀웨어 데이터베이스의 최신 미러를 유지합니다.

파일 스캔 파이프라인

파일 스캔 파이프라인은 다음과 같이 작동합니다.

  1. 최종 사용자가 검사되지 않은 Cloud Storage 버킷에 파일을 업로드합니다.
  2. Eventarc 서비스는 이 업로드 이벤트를 포착하고 Cloud Run 서비스에 새 파일을 알려줍니다.
  3. Cloud Run 서비스는 검사되지 않은 Cloud Storage 버킷에서 새 파일을 다운로드하여 ClamAV 멀웨어 스캐너로 전달합니다.
  4. 멀웨어 검사 결과에 따라 서비스는 다음 작업 중 하나를 수행합니다.
    • ClamAV가 파일이 정상임을 선언하면 검사되지 않은 Cloud Storage 버킷에서 클린 Cloud Storage 버킷으로 이동합니다.
    • ClamAV가 파일에 멀웨어가 있다고 선언하면 파일이 검사되지 않은 Cloud Storage 버킷에서 격리된 Cloud Storage 버킷으로 이동합니다.
  5. 이 서비스는 이러한 작업의 결과를 Logging 및 Monitoring에 보고하여 관리자가 조치를 취할 수 있도록 합니다.

ClamAV 멀웨어 데이터베이스 미러 업데이트 파이프라인

효과적으로 검사하려면 ClamAV 멀웨어 스캐너가 멀웨어 서명의 최신 데이터베이스를 유지해야 합니다.

ClamAV 서비스는 스테이트리스(Stateless) 서비스인 Cloud Run을 사용하여 실행됩니다. 서비스 인스턴스를 시작할 때 ClamAV는 항상 수백 개의 메가바이트 크기의 최신 전체 멀웨어 데이터베이스를 다운로드해야 합니다.

ClamAV용 공개 멀웨어 데이터베이스는 다운로드 속도를 제한하는 콘텐츠 배포 네트워크(CDN)에서 호스팅됩니다. 여러 인스턴스가 시작되고 전체 데이터베이스를 다운로드하려고 하면 비율 제한이 트리거될 수 있습니다. 이렇게 하면 Cloud Run에서 사용하는 외부 IP 주소가 24시간 동안 차단됩니다. 이렇게 하면 ClamAV 서비스가 시작되지 않으며 멀웨어 데이터베이스 업데이트 다운로드도 방지됩니다.

또한 Cloud Run은 외부 IP 주소의 공유 풀을 사용합니다. 따라서 CDN이 여러 프로젝트의 멀웨어 검사 인스턴스에서 다운로드한 것을 단일 주소에서 보낸 것으로 인식하고 블록을 트리거합니다.

이 파이프라인은 Cloud Storage에서 데이터베이스의 최신 비공개 로컬 미러를 유지합니다. 이렇게 하면 전체 데이터베이스가 아닌 작은 차등 업데이트 파일을 다운로드하기 위해 ClamAV 공개 데이터베이스가 업데이트당 한 번만 액세스되므로 비율 제한을 방지할 수 있습니다.

이 파이프라인은 다음과 같이 작동합니다.

  1. Cloud Scheduler 작업은 ClamAV 무료 서비스에서 사용하는 기본 업데이트 확인 간격과 동일한 2시간마다 트리거되도록 구성됩니다. 이 작업은 Cloud Run 서비스에 멀웨어 데이터베이스 미러를 업데이트하도록 HTTP POST 요청을 수행합니다.
  2. Cloud Run 인스턴스가 Cloud Storage 버킷에서 로컬 파일 시스템으로 멀웨어 데이터베이스 미러를 복사합니다.
  3. 그런 다음 인스턴스는 ClamAV CVDUpdate 도구를 실행하여 사용 가능한 차등 업데이트를 다운로드하고 데이터베이스 미러에 적용합니다.
  4. 그런 다음 업데이트된 멀웨어 데이터베이스 미러를 Cloud Storage 버킷으로 다시 복사합니다.

Cloud Run 인스턴스에서 실행되는 ClamAV freshclam 서비스는 시작 시 Cloud Storage에서 멀웨어 데이터베이스를 다운로드하고 런타임 중에 Cloud Storage 버킷에서 사용 가능한 데이터베이스 업데이트를 정기적으로 확인하고 다운로드합니다.

목표

  • Cloud Storage 버킷에 ClamAV 멀웨어 정의 데이터베이스의 미러를 빌드합니다.

  • 다음 함수를 사용하여 Cloud Run 서비스를 빌드합니다.

    • ClamAV를 사용하여 Cloud Storage 버킷의 파일을 멀웨어 검사로 검사하고 검사 결과에 따라 스캔한 파일을 정상 버킷 또는 격리 버킷으로 옮깁니다.
    • Cloud Storage에서 ClamAV 멀웨어 정의 데이터베이스의 미러를 유지합니다.
  • 파일이 Cloud Storage에 업로드될 때 멀웨어 검사 서비스를 트리거하는 Eventarc 트리거를 만듭니다.

  • 멀웨어 검사 서비스를 트리거하여 Cloud Storage에 있는 멀웨어 정의 데이터베이스의 미러를 새로 고치는 Cloud Scheduler 작업을 만듭니다.

비용

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

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

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Artifact Registry, Cloud Run, Eventarc, Logging, Cloud Scheduler, Pub/Sub, and Cloud Build 사용 설정

    API 사용 설정

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

    프로젝트 선택기로 이동

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. API Artifact Registry, Cloud Run, Eventarc, Logging, Cloud Scheduler, Pub/Sub, and Cloud Build 사용 설정

    API 사용 설정

  8. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

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

  9. 이 튜토리얼에서는 Cloud Shell에서 모든 명령어를 실행합니다.

환경 설정하기

이 섹션에서는 리전과 영역 같이 튜토리얼 전반에 사용되는 값의 기본 설정을 할당합니다. 이 튜토리얼에서는 us-central1을 Cloud Run 서비스의 리전으로, us를 Eventarc 트리거 및 Cloud Storage 버킷의 위치로 사용합니다.

  1. Cloud Shell에서 리전과 위치를 포함한 일반적인 셸 변수를 설정합니다.

    REGION=us-central1
    LOCATION=us
    PROJECT_ID=PROJECT_ID
    SERVICE_NAME="malware-scanner"
    SERVICE_ACCOUNT="${SERVICE_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
    

    PROJECT_ID를 프로젝트 ID로 설정합니다.

  2. 프로젝트 ID로 gcloud 환경을 초기화합니다.

    gcloud config set project "${PROJECT_ID}"
    
  3. 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: 멀웨어 검사 서비스의 검사 결과 비감염 파일을 보관합니다.

  4. 네 번째 Cloud Storage 버킷을 만듭니다.

    gsutil mb -l "${LOCATION}" "gs://cvd-mirror-${PROJECT_ID}"
    

    ${PROJECT_ID}은 버킷 이름이 고유한지 확인하는 데 사용됩니다.

    이 버킷 cvd-mirror-PROJECT_ID은 ClamAV CDN에서 비율 제한을 트리거하지 않도록 차단하는 멀웨어 정의 데이터베이스의 로컬 미러를 유지하는 데 사용됩니다.

멀웨어 검사 서비스의 서비스 계정 만들기 및 권한 부여

이 섹션에서는 멀웨어 검사 서비스에 사용할 서비스 계정을 만들고 Cloud Storage 버킷에 읽고 쓸 수 있는 권한을 갖도록 서비스 계정에 적절한 역할을 부여합니다. 이는 계정에 최소한의 권한과 필요한 리소스에 대한 액세스 권한만 부여하도록 하기 위함입니다.

  1. malware-scanner 서비스 계정을 만듭니다.

    gcloud iam service-accounts create ${SERVICE_NAME}
    
  2. 버킷에 객체 관리자 역할을 부여하면 서비스가 검사되지 않은 버킷에서 파일을 읽고 삭제할 수 있으며 격리 및 정상 버킷에 파일을 쓸 수 있습니다.

    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}"
    gsutil iam ch \
        "serviceAccount:${SERVICE_ACCOUNT}:objectAdmin" \
        "gs://cvd-mirror-${PROJECT_ID}"
    
  3. 서비스가 Monitoring에 측정항목을 쓸 수 있도록 측정항목 작성자 역할을 부여합니다.

    gcloud projects add-iam-policy-binding \
          "${PROJECT_ID}" \
          --member="serviceAccount:${SERVICE_ACCOUNT}" \
          --role=roles/monitoring.metricWriter
    

Cloud Run에서 멀웨어 검사 서비스 만들기

이 섹션에서는 멀웨어 검사 서비스를 Cloud Run에 배포합니다. 이 서비스는 Docker 컨테이너에서 실행되며 다음을 포함합니다.

  • 서비스, Node.js 런타임, GCloud SDK, ClamAV 바이너리로 컨테이너 이미지를 빌드하는 Dockerfile
  • 멀웨어 검사 Cloud Run 서비스의 Node.js 파일
  • config.json 구성 파일을 사용하여 Cloud Storage 버킷 이름을 지정합니다.
  • updateCvdMirror.sh 셸 스크립트를 사용하여 Cloud Storage에서 ClamAV 멀웨어 정의 데이터베이스 미러를 새로 고칩니다.
  • cloud-run-proxy 서비스를 사용하여 Cloud Storage API에 대한 인증된 액세스를 제공하는 freshclam HTTP 요청을 프록시합니다.
  • bootstrap.sh 셸 스크립트를 사용하여 인스턴스 시작 시 필요한 서비스를 실행합니다.
  1. Cloud Shell에서 코드 파일이 포함된 샘플 GitHub 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/docker-clamav-malware-scanner.git
    
  2. cloudrun-malware-scanner 디렉터리로 변경합니다.

    cd docker-clamav-malware-scanner/cloudrun-malware-scanner
    
  3. config.json 구성 파일을 수정하여 방금 만든 Cloud Storage 버킷을 지정합니다. 이들은 프로젝트 ID를 기반으로 하기 때문에 간단한 찾기 및 바꾸기를 사용할 수 있습니다.

    sed "s/-bucket-name/-${PROJECT_ID}/" config.json.tmpl > config.json
    

    업데이트된 구성 파일을 볼 수 있습니다.

    cat config.json
    
  4. Cloud Storage에서 ClamAV 멀웨어 데이터베이스 미러의 초기 채우기를 수행합니다.

    python3 -m venv pyenv
    . pyenv/bin/activate
    pip3 install crcmod cvdupdate
    ./updateCvdMirror.sh "cvd-mirror-${PROJECT_ID}"
    deactivate
    

    그러면 CVDUpdate 도구의 로컬 설치가 실행되고, 이를 사용하여 멀웨어 데이터베이스를 다운로드한 다음, 앞에서 만든 Cloud Storage cvd-mirror 버킷에 업로드합니다.

    미러의 콘텐츠를 확인할 수 있습니다.

    gsutil ls "gs://cvd-mirror-${PROJECT_ID}/cvds"
    

    이 버킷에는 전체 멀웨어 데이터베이스가 포함된 여러 CVD 파일, 일일 차등 업데이트가 포함된 .cdiff 파일, 구성 및 상태 정보가 있는 .json 파일 두 개가 포함되어야 합니다.

  5. 앞에서 만든 서비스 계정을 사용하여 Cloud Run 서비스를 만들고 배포합니다.

    gcloud beta run deploy "${SERVICE_NAME}" \
      --source . \
      --region "${REGION}" \
      --no-allow-unauthenticated \
      --memory 4Gi \
      --cpu 1 \
      --concurrency 20 \
      --min-instances 1 \
      --max-instances 5 \
      --no-cpu-throttling \
      --cpu-boost \
      --service-account="${SERVICE_ACCOUNT}"
    

    그러면 vCPU가 1개이고 RAM이 4GiB인 Cloud Run 인스턴스가 생성됩니다. 이 튜토리얼에서는 허용되는 크기이지만 프로덕션 환경에서는 인스턴스에 대해 더 큰 CPU 및 메모리 크기를 선택하고 서비스에서 처리해야 하는 트래픽 양에 따라 더 큰 --max-instances 매개변수를 선택할 수 있습니다.

    --concurrency 매개변수는 각 인스턴스가 처리할 수 있는 동시 요청 수를 지정합니다.

    --no-cpu-throttling 매개변수를 사용하면 인스턴스가 멀웨어 정의 업데이트와 같은 백그라운드 작업을 수행할 수 있습니다.

    --cpu-boost 매개변수는 인스턴스 시작 시 vCPU 수를 두 배로 하여 시작 지연 시간을 줄입니다.

    각 인스턴스의 시작 시간이 상대적으로 높기 때문에 --min-instances 1 매개변수는 하나 이상의 인스턴스를 활성 상태로 유지합니다.

    --max-instances 5 매개변수는 서비스가 너무 높게 확장되지 않도록 합니다.

  6. 메시지가 표시되면 Y를 입력합니다.

빌드 및 배포에 약 10분이 소요됩니다. 완료되면 메시지가 표시됩니다.

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

배포 명령어 출력의 Service URL 값을 셸 변수에 저장합니다. 이 값은 나중에 Cloud Scheduler 작업을 만들 때 사용됩니다.

SERVICE_URL="SERVICE_URL"

Cloud Run 서비스를 사용하려면 모든 호출을 인증해야 하며 인증 ID에는 서비스에 대한 run.routes.invoke 권한이 있어야 합니다.

다음 명령어를 실행하여 실행 중인 서비스와 ClamAV 버전을 확인할 수 있습니다.

curl -D - -H "Authorization: Bearer $(gcloud auth print-identity-token)"  \
     ${SERVICE_URL}

Eventarc Cloud Storage 트리거 만들기

이 섹션에서는 Eventarc에서 Cloud Storage 이벤트를 캡처할 수 있는 권한과 이러한 이벤트를 Cloud Run malware-scanner 서비스로 전송하도록 트리거를 추가합니다.

  1. 2021년 4월 8일 이전에 만든 기존 프로젝트를 사용하는 경우 푸시 알림에 대한 Pub/Sub를 구성합니다.

  2. 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"
    
  3. malware-scanner 서비스 계정이 Cloud Run 서비스를 호출하고 Eventarc 이벤트 수신자 역할을 하도록 허용합니다.

    gcloud run services add-iam-policy-binding "${SERVICE_NAME}" \
      --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"
    
  4. 검사되지 않은 Cloud Storage 버킷에서 최종 객체 이벤트를 캡처하고 Cloud Run 서비스로 전송하는 Eventarc 트리거를 만듭니다. 트리거는 인증에 malware-scanner 서비스 계정을 사용합니다.

    BUCKET_NAME="unscanned-${PROJECT_ID}"
    gcloud eventarc triggers create "trigger-${BUCKET_NAME}-${SERVICE_NAME}" \
      --destination-run-service="${SERVICE_NAME}" \
      --destination-run-region="${REGION}" \
      --location="${LOCATION}" \
      --event-filters="type=google.cloud.storage.object.v1.finalized" \
      --event-filters="bucket=${BUCKET_NAME}" \
      --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.

    ERROR: (gcloud.eventarc.triggers.create) FAILED_PRECONDITION: Invalid resource state for "": Permission denied while using the Eventarc Service Agent. If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. Otherwise, verify that it has Eventarc Service Agent role.

  5. Eventarc 트리거에서 사용하는 기본 Pub/Sub 구독에서 메시지 확인 기한을 2분으로 변경합니다.

    SUBSCRIPTION_NAME=$(gcloud eventarc triggers describe \
        "trigger-${BUCKET_NAME}-${SERVICE_NAME}" \
        --location="${LOCATION}" \
        --format="get(transport.pubsub.subscription)")
    gcloud pubsub subscriptions update "${SUBSCRIPTION_NAME}" --ack-deadline=120
    

    대용량 파일 또는 부하가 높은 경우 기본값은 10초입니다.

ClamAV 데이터베이스 미러 업데이트를 트리거하는 Cloud Scheduler 작업 만들기

Cloud Run 서비스에서 멀웨어 정의 데이터베이스의 미러를 업데이트하는 명령어를 사용하여 HTTP POST 요청을 실행하는 Cloud Scheduler 작업을 만듭니다. 동일한 시간대를 사용하는 클라이언트가 너무 많지 않게 ClamAV에서는 3~57 사이의 무작위 시간에 작업을 예약해야 하므로 10의 배수를 피해야 합니다.

while : ; do
  # set MINUTE to a random number between 3 and 57
  MINUTE="$((RANDOM%55 + 3))"
  # exit loop if MINUTE is not a multiple of 10
  [[ $((MINUTE % 10)) != 0 ]] && break
done

gcloud scheduler jobs create http \
    "${SERVICE_NAME}-mirror-update" \
    --location="${REGION}" \
    --schedule="${MINUTE} */2 * * *" \
    --oidc-service-account-email="${SERVICE_ACCOUNT}" \
    --uri="${SERVICE_URL}" \
    --http-method=post \
    --message-body='{"kind":"schedule#cvd_update"}' \
    --headers="Content-Type=application/json"

--schedule 명령줄 인수는 작업이 unix-cron 문자열 형식을 사용하여 실행되는 시기를 정의합니다. 주어진 값은 2시간마다 무작위로 생성된 특정 분에 실행되어야 함을 나타냅니다.

이 작업은 Cloud Storage에서 ClamAV mirror만 업데이트합니다. Cloud Run의 각 인스턴스에 있는 ClamAV newclam 데몬은 30분마다 미러를 확인하여 새 정의를 확인하고 ClamAV 데몬을 업데이트합니다.

파일을 업로드하여 파이프라인 테스트

멀웨어가 없는 정상 파일 1개와 감염된 파일 1개를 업로드하여 파이프라인을 테스트합니다.

  1. 샘플 텍스트 파일을 만들거나 기존의 클린 파일을 사용하여 파이프라인 프로세스를 테스트합니다.

  2. 샘플 데이터 파일을 검사되지 않은 버킷에 복사합니다.

    gsutil cp filename "gs://unscanned-${PROJECT_ID}"
    

    filename을 클린 텍스트 파일의 이름으로 바꿉니다. 멀웨어 검사 서비스는 각 파일을 검사한 후 적절한 버킷으로 옮깁니다. 이 파일은 클린 버킷으로 이동합니다.

  3. 파이프라인에서 이 파일을 처리할 때까지 몇 초 정도 기다린 다음 클린 버킷에서 처리된 파일이 있는지 확인합니다.

    gsutil ls -r "gs://clean-${PROJECT_ID}"
    
  4. 검사되지 않은 버킷에서 파일이 삭제되었습니다.

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    
  5. Cloud Shell에서 EICAR 표준 멀웨어 방지 테스트 서명이 포함된 eicar-infected.txt 파일을 검사되지 않은 버킷에 업로드합니다.

    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"
    
  6. 몇 초 정도 기다린 다음 격리된 버킷에서 파일이 파이프라인에 따라 처리되었는지 확인합니다. 또한 서비스는 멀웨어에 감염된 파일이 감지되면 Logging에 로그 항목을 로깅합니다.

    gsutil ls -r "gs://quarantined-${PROJECT_ID}"
    
  7. 검사되지 않은 버킷에서 파일이 삭제되었습니다.

    gsutil ls -r "gs://unscanned-${PROJECT_ID}"
    

멀웨어 정의 데이터베이스 업데이트 메커니즘 테스트

  • Cloud Shell에서 Cloud Scheduler 작업을 강제로 실행하여 업데이트 확인을 트리거할 수 있습니다.

    gcloud scheduler jobs run "${SERVICE_NAME}-mirror-update" --location="${REGION}"
    

    이 명령어의 결과는 세부 로그에만 표시됩니다.

서비스 모니터링

Cloud Logging 및 Cloud Monitoring을 사용하여 서비스를 모니터링할 수 있습니다.

자세한 로그 보기

  1. Google Cloud 콘솔에서 Cloud Logging 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 로그 필드 필터가 표시되지 않으면 로그 필드 버튼을 클릭합니다.

  3. 로그 필드 필터에서 Cloud Run 버전을 클릭합니다.

  4. 로그 필드 필터의 서비스 이름 섹션에서 malware-scanner를 클릭합니다.

로그 쿼리 결과에는 업로드한 파일 2개의 검사 요청 및 상태를 보여주는 여러 줄을 포함한 서비스의 로그가 표시됩니다. 예를 들면 다음과 같습니다.

Scan request for gs://unscanned-PROJECT_ID/filename, (##### bytes) scanning with clam ClamAV CLAMAV_VERSION_STRING
Scan status for gs://unscanned-PROJECT_ID/filename: CLEAN (##### bytes in #### ms)
...
Scan request for gs://unscanned-PROJECT_ID/eicar-infected.txt, (69 bytes) scanning with clam ClamAV CLAMAV_VERSION_STRING
Scan status for gs://unscanned-PROJECT_ID/eicar-infected.txt: INFECTED stream: Eicar-Signature FOUND (69 bytes in ### ms)

ClamAV 버전 및 멀웨어 데이터베이스 서명 버전이 감염된 테스트 파일의 멀웨어 이름과 함께 보고됩니다.

이러한 로그 메시지를 사용하여 맬웨어가 발견될 때 또는 검사 중에 오류가 발생할 때 알림을 설정할 수 있습니다.

멀웨어 정의 미러 업데이트 로그도 표시되며 다음과 같이 표시됩니다.

Starting CVD Mirror update
CVD Mirror update check complete. output: ...

미러가 업데이트되면 다음과 같은 줄이 추가됩니다.

CVD Mirror updated: DATE_TIME - INFO: Downloaded daily.cvd. Version: VERSION_INFO

Freshclam 업데이트 로그는 30분마다 표시되며 다음과 같이 표시됩니다.

DATE_TIME -> Received signal: wake up
DATE_TIME -> ClamAV update process started at DATE_TIME
DATE_TIME -> daily.cvd database is up-to-date (version: VERSION_INFO)
DATE_TIME -> main.cvd database is up-to-date (version: VERSION_INFO)
DATE_TIME -> bytecode.cvd database is up-to-date (version: VERSION_INFO)

데이터베이스가 업데이트되면 Freshclam 로그 줄이 다음과 같이 표시됩니다.

DATE_TIME -> daily.cld updated (version: VERSION_INFO)

측정항목 보기

이 서비스는 모니터링 및 알림 목적으로 다음 측정항목을 생성합니다.

  • 처리된 정상 파일 수:
    custom.googleapis.com/opencensus/malware-scanning/clean_files
  • 처리된 감염 파일 수:
    custom.googleapis.com/opencensus/malware-scanning/infected_files
  • 파일을 검사하는 데 걸린 시간:
    custom.googleapis.com/opencensus/malware-scanning/scan_duration
  • 총 검사 바이트 수:
    custom.googleapis.com/opencensus/malware-scanning/bytes_scanned
  • 실패한 멀웨어 검사 수:
    custom.googleapis.com/opencensus/malware-scanning/scans_failed
  • CVD 미러 업데이트 확인 수:
    custom.googleapis.com/opencensus/malware-scanning/cvd-mirror-updates

이러한 측정항목은 Clod Monitoring 측정항목 탐색기에서 볼 수 있습니다.

  1. Google Cloud 콘솔에서 Cloud Monitoring 측정항목 탐색기 페이지로 이동합니다.

    측정항목 탐색기로 이동

  2. 측정항목 선택 필드를 클릭하고 필터 문자열 malware를 입력합니다.

  3. OpenCensus/malware-scanning/clean_files 측정항목을 선택합니다. 그래프에 정상 파일이 검사된 시점을 나타내는 데이터 포인트가 표시됩니다.

측정항목을 사용하여 파이프라인을 모니터링하고 맬웨어가 감지되거나 파일 처리에 실패한 경우에 대한 알림을 만들 수 있습니다.

추가적인 세부정보로 측정항목은 다양한 측정항목 라벨로 세분화할 수 있습니다.

  • source_bucket
  • destination_bucket
  • clam_version
  • cloud_run_revision

여러 버킷 처리

멀웨어 검사 서비스는 여러 소스 버킷의 파일을 검사하여 정상 및 격리 버킷으로 분리할 수 있습니다.

이 고급 구성은 이 튜토리얼의 범위를 벗어나지만 관련된 단계는 다음과 같이 요약됩니다.

  1. 고유한 이름을 사용하여 검사되지 않고 클린하고 격리된 다양한 Cloud Storage 버킷을 만듭니다.

  2. 다양한 버킷에 있는 malware-scanner 서비스 계정에 적절한 역할을 부여합니다.

  3. 구성 파일 config.json을 수정하여 각 구성의 버킷 이름을 지정합니다.

    {
      "buckets": [
        {
          "unscanned": "unscanned-bucket-1-name",
          "clean": "clean-bucket-1-name",
          "quarantined": "quarantined-bucket-1-name"
        },
        {
          "unscanned": "unscanned-bucket-2-name",
          "clean": "clean-bucket-2-name",
          "quarantined": "quarantined-bucket-2-name"
        }
      ]
      "ClamCvdMirrorBucket": "cvd-mirror-bucket-name"
    }
    
  4. 검사되지 않은 각 버킷에 대해 Eventarc 트리거를 생성하여 각 버킷에 고유한 트리거 이름을 보장합니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

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

    리소스 관리로 이동

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

다음 단계

  • Cloud Storage 문서 살펴보기
  • Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터 살펴보기