Container-Optimized OS에 바이러스 백신 및 파일 무결성 모니터링 설치

이 가이드에서는 Container-Optimized OS pod를 사용하여 Google Kubernetes Engine(GKE) 클러스터에 바이러스 백신(AV)과 파일 무결성 모니터링(FIM)을 설치하고 구성하는 프로세스를 안내합니다. 결제 카드 산업 데이터 보안 표준(PCI DSS) 같은 일부 규정 준수 제도에서는 규제 환경 내에 바이러스 백신과 파일 무결성 모니터링을 설치해야 합니다.

Container-Optimized OS는 더 안전하고 효율적인 Docker 컨테이너 호스팅을 위해 Google이 유지보수하는 노드 이미지입니다. Container-Optimized OS는 파일 시스템을 잠금으로써 중요한 시스템 파일이 변경될 가능성을 줄여 보안을 강화합니다. 이러한 보안 강화는 AV와 FIM을 시스템에 추가하려는 사람들에게 부담을 가중시킬 수 있습니다.

목표

  • AV Docker 이미지 빌드
  • FIM Docker 이미지 빌드
  • AV 및 FIM 컨테이너를 만들어 Container-Optimized OS 서버에 배포
  • AV 및 FIM 컨테이너를 GKE 클러스터에 배포

비용

이 가이드에서는 GKE 클러스터를 포함한 여러 서버를 만드는 방법을 안내합니다. GKE는 클러스터의 노드에 Compute Engine 인스턴스를 사용합니다. 이러한 각 인스턴스의 요금은 Compute Engine 가격 책정에 준하여 노드가 삭제될 때까지 청구됩니다. Compute Engine 리소스 요금은 초 단위로 청구되며 최소 사용 기준은 1분입니다. 클러스터 관리 비용은 없습니다.

Container Registry를 사용하여 저장소를 호스팅하는 경우, 스토리지 및 데이터 전송 요금은 Container Registry 가격 책정 페이지를 참조하세요.

예기치 않은 요금이 청구되지 않도록 하려면 삭제 섹션을 참조하세요. 이 가이드용으로 새 프로젝트를 생성하는 것이 좋습니다. 그러면 마친 후 모든 리소스를 쉽게 삭제할 수 있습니다.

시작하기 전에

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

    프로젝트 선택기로 이동

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

  4. Compute Engine, GKE, and Container Registry API를 사용 설정합니다.

    API 사용 설정

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

    프로젝트 선택기로 이동

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

  7. Compute Engine, GKE, and Container Registry API를 사용 설정합니다.

    API 사용 설정

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

AV Docker 이미지 빌드

이 섹션에서는 호스트 서버의 파일 시스템을 마운트한 다음 일정한 간격으로 해당 폴더를 검사하는 커스텀 Docker 이미지를 만듭니다.

  1. Cloud Console에서 Cloud Shell을 엽니다.

    Cloud Shell로 이동

  2. GitHub 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/community
    
  3. 작업 디렉터리로 이동합니다.

    cd community/tutorials/gcp-cos-clamav
    
  4. 필요에 따라 scan.sh 스크립트의 바이러스 백신 검사 옵션과 conf 디렉터리의 콘텐츠를 맞춤설정합니다. 자세한 내용은 공식 구성 문서를 참조하세요.

  5. start.py를 수정하여 cron 일정을 맞춤설정합니다.

    기본적으로 시스템이 바이러스를 검사하는 시간은 매시간 동일합니다. 검사를 실행할 시간(분)을 스크립트가 임의로 선택하게 하지 말고 특정 검사 시간을 직접 선택하거나 검사 실행 빈도를 높이거나 낮추는 것이 좋습니다. 로깅, 무시된 경로, 성능 옵션을 맞춤설정할 수도 있습니다. 파일에 로깅하는 것 외에도 표준 출력에 로깅하도록 이미지가 구성되어 있으므로 Cloud Monitoring에서 스캔 로그를 캡처할 수 있습니다.

  6. Dockerfile 폴더에서 다음 명령어를 실행하여 이미지를 빌드하고 Container Registry에 푸시합니다.

    DOCKER_REPO="gcr.io/${DEVSHELL_PROJECT_ID}"
    docker build -t clamav .
    docker tag clamav $DOCKER_REPO/clamav
    docker push $DOCKER_REPO/clamav
    

FIM Docker 이미지 빌드

Container-Optimized OS에서의 파일 무결성 모니터링은 바이러스 백신 실행과 비슷합니다. 목표는 상위 OS 파일 시스템을 읽기 전용 모드로 마운트하고 파일 변경 사항을 간헐적으로 검사하는 컨테이너를 실행하는 것입니다. 이 이미지는 첫 번째 실행에서 전체 디지털 지문 검사를 실행하고 그 후에는 24시간마다 같은 시간에 후속 검사를 실행하도록 구성되어 있습니다.

이 가이드에서 사용하는 스캐너는 basic-fim이라고 합니다. 이 스캐너는 사용자에게 생성, 수정 또는 삭제된 파일에 대해 알립니다. 다른 스캐너를 사용하려면 Dockerfile을 수정하고 scan.sh를 대체하면 됩니다.

  1. Cloud Console에서 Cloud Shell을 엽니다.

    Cloud Shell로 이동

  2. GitHub 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/community
    
  3. 작업 디렉터리 gcp-cos-basic-fim로 이동합니다.

    cd community/tutorials/gcp-cos-basic-fim
    
  4. nano 또는 viscan.sh 스크립트를 수정하여 무시된 경로를 변경하고, start.py 스크립트를 변경하여 cron 간격을 제어합니다.

    기본적으로 이미지는 하루에 한 번 임의의 시간(시/분)에 파일 무결성 모니터 검사를 수행하도록 구성되어 있습니다.

  5. Dockerfile 폴더에서 Container Registry 이미지를 빌드하고 푸시합니다.

    DOCKER_REPO="[YOUR_REPO_NAME]gcr.io/${DEVSHELL_PROJECT_ID}"
    docker build -t basic-fim .
    docker tag basic-fim $DOCKER_REPO/basic-fim
    docker push $DOCKER_REPO/basic-fim
    

워크로드 이미지 준비

중앙 집중식 AV 및 FIM이 효과적이려면 각 pod가 작업 디렉터리를 노드 호스트와 공유하고 파일 시스템의 다른 모든 부분을 읽기 전용으로 잠금 처리해야 합니다.

  1. 워크로드가 쓸 수 있는 작업 디렉터리를 식별합니다.
  2. 워크로드 이미지를 수정하여 파일 시스템의 다른 모든 부분을 읽기 전용으로 설정합니다.
  3. 작업 디렉터리에 특정 콘텐츠가 필요한 경우 시드 파일을 다른 디렉터리에서 시작한 후 인스턴스가 시작되면 작업 디렉터리로 복사하도록 이미지를 수정합니다.
  4. 이미지를 실행할 때 작업 디렉터리를 노드 파일 시스템의 알려진 위치에 매핑된 로컬 볼륨으로 마운트합니다.

여기까지 하면 애플리케이션은 동적 파일을 검사할 준비가 된 것입니다. pod 파일 시스템의 다른 모든 부분은 잠겨 있습니다. 컨테이너 분석을 사용하면 이미지가 시작되기 전에 이미지를 검사하여 파일 시스템의 전체 콘텐츠를 얻을 수 있습니다.

Container-Optimized OS 서버에 AV 및 FIM 배포

다음 단계는 독립형 서버에서 AV와 FIM을 구현하는 것입니다.

Container-Optimized OS 서버 만들기

  1. Cloud Console에서 Compute Engine > VM 인스턴스 > 인스턴스 만들기로 이동합니다.
  2. 부팅 디스크Container-Optimized OS [version] 정식으로 변경합니다.

    : Docker 버전을 확인하여 올바른 Chromium OS 기반 이미지 버전을 선택합니다.

  3. 스캐너에서 생성된 로그 파일을 캡처하려면 로깅 및 모니터링에서 Logging 사용 설정Monitoring 사용 설정을 선택합니다.

    새 인스턴스 생성 시 Cloud Logging 및 Cloud Monitoring 사용 설정

  4. 필요에 따라 인스턴스를 구성한 다음 만들기를 클릭합니다.

이제 AV 및 FIM 컨테이너를 Container-Optimized OS 서버에 배포합니다.

  1. Cloud Shell에서 SSH를 사용하여 Container-Optimized OS 서버에 연결합니다.
  2. clamav Docker 컨테이너를 만듭니다. -v 플래그는 clamav 로깅 폴더를 최상위 컨테이너에 매핑하고 AV 컨테이너가 읽을 수 있는 디렉터리에 전체 파일 시스템을 마운트합니다.

    docker create --name=clamav \
       -v /:/host-fs:ro \
       -v /var/log/clamav:/logs \
    --health-cmd "/health.sh" \
       $DOCKER_REPO/clamav
    
    docker start clamav
    
  3. 컨테이너가 실행 중인지 확인합니다.

    1. 로그 출력을 확인합니다.

      docker logs clamav
      
    2. 컨테이너에서 터미널을 엽니다.

      docker exec -it clamav /bin/sh
      
    3. 파일 시스템 검사가 실행되도록 예약된 시간을 확인합니다.

      fcrontab -l
      
    4. 로그 파일이 만들어졌는지 확인합니다(이 프로세스는 1분 정도 걸릴 수 있습니다).

      ls -l /var/log/clamav
      
    5. 컨테이너에 로그인하고 freshclamclamd 프로세스를 찾습니다.

      docker exec -it clamav /bin/sh
      watch ps aux
      
    6. 소스 로그 파일을 확인합니다.

      ls /logs
      
  4. 정상적인 검사 시작을 보려면 cron 작업 실행이 예약된 시간 몇 분 전에 SSH를 사용하여 Container-Optimized OS 인스턴스에 연결합니다.

  5. 검사 진행 상황을 모니터링합니다.

    tail -f /var/log/clamscan.log
    

    Cloud Logging을 사용 설정한 경우 출력도 자동으로 Cloud Logging에 전송됩니다.

  6. basic-fim Docker 컨테이너를 만듭니다.

    docker create --name=basic-fim \
       -v /:/host-fs:ro \
       -v /var/log/basic-fim:/logs \
       $DOCKER_REPO/basic-fim
    
    docker start basic-fim
    
  7. 컨테이너가 실행 중인지 확인합니다.

    1. 로그 출력을 확인합니다.

      docker logs basic-fim
      
    2. 컨테이너에서 터미널을 엽니다.

      docker exec -it basic-fim /bin/sh
      
    3. 파일 시스템 검사가 실행되도록 예약된 시간을 확인합니다.

      fcrontab -l
      

      로그를 볼 때 초기 검사가 진행 중일 수 있습니다. 첫 번째 실행은 시스템 전체에서 디지털 지문을 수집하므로 자세한 정보가 표시되지만 후속 실행에서는 델타만 표시됩니다.

GKE 클러스터에 AV 및 FIM 배포

지금까지 독립형 컨테이너 최적화 OS 서버에서 보안 검사를 수행하는 Docker 이미지를 빌드하고 실행했습니다. 빌드한 Docker 이미지는 일반적인 워크로드처럼 클러스터에 배포할 수 있습니다. 하지만 노드당 pod가 정확히 하나가 되도록 하려면 daemonsets를 사용해야 합니다. 그러지 않으면 서버가 보호되지 않거나 리소스가 낭비될 수 있습니다.

Kubernetes에서 실행되는 AV 및 FIM 컨테이너는 자동으로 Cloud Logging에 로그를 푸시해야 합니다. 여기서 각각의 보안 스캐너에서 이벤트가 발생할 때 트리거되는 알림을 만들어야 합니다.

  1. Cloud Shell에서 클러스터의 작업 매개변수를 정의합니다.

    COMPUTE_ZONE=[COMPUTE_ZONE]
    CLUSTER_NAME=[CLUSTER_NAME]
    
  2. 테스트 클러스터를 만듭니다.

    gcloud container clusters create $CLUSTER_NAME \
       --num-nodes 1 --machine-type "n1-standard-2" \
       --image-type "COS_CONTAINERD" --enable-cloud-logging \
       --enable-cloud-monitoring --zone $COMPUTE_ZONE
    
  3. 클러스터가 시작되기를 기다리는 동안 clamav-daemonset.yaml 파일을 열고 "image:" 매개변수를 찾습니다. 이 매개변수를 앞서 만든 컨테이너 저장소로 설정합니다.

  4. 클러스터가 온라인 상태가 되면 클러스터 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials $CLUSTER_NAME \
        --zone $COMPUTE_ZONE
    
  5. Dockerfile이 포함된 동일한 디렉터리에서 daemonset를 시작합니다.

    kubectl apply -f clamav-daemonset.yaml
    
  6. 다음 1시간 이내의 일정 시점에 실행되도록 검사가 예약됩니다. 수동으로 검사를 트리거하려면 먼저 pod 이름을 가져옵니다.

    kubectl get pods
    
  7. pod 이름을 복사하고 다음 명령어에서 사용하여 전체 검사를 시작합니다.

    kubectl exec [POD_NAME] -c clamav-scanner -it /scan.sh
    
  8. pod에서 최신 로그를 확인합니다.

    kubectl logs [POD_NAME]
    

    바이러스 검사가 로그 항목을 표시합니다.

    SSH를 통해 Kubernetes 노드에 연결

기타 제품 팁

  • clamav 컨테이너의 기본값은 상세 로깅입니다. 로깅 수준을 변경하고 특정 디렉터리를 제외하려면 scan.sh를 수정합니다.
  • clamavbasic-fim 모두 시스템 지원 서비스입니다. daemonset 구성에 "namespace: kube-system"을 추가하여 이러한 컨테이너를 시스템 네임스페이스에 배치하는 것이 좋습니다.
  • 바이러스 검사는 메모리를 많이 사용할 수 있습니다. 스캐너와 함께 프로덕션 워크로드를 실행하기에 충분한 RAM이 노드에 있어야 합니다.

삭제

모든 리소스를 삭제하는 가장 쉬운 방법은 이 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다. 프로젝트를 삭제하지 않으려면 후속 삭제 섹션의 안내에 따르세요.

프로젝트 삭제

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

    리소스 관리로 이동

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

Kubernetes 클러스터 삭제

만든 Kubernetes 클러스터를 정리하는 가장 쉬운 방법은 삭제하는 것입니다.

  1. Cloud Console에서 Kubernetes 클러스터 페이지로 이동합니다. 현재 위치가 올바른 프로젝트인지 확인합니다.

    Kubernetes 클러스터 페이지로 이동

  2. 이 데모용으로 만든 클러스터를 찾아 선택한 다음 삭제 를 클릭합니다.

개별 컴퓨팅 인스턴스 삭제

시작한 일회성 컴퓨팅 인스턴스에 다음을 수행합니다.

  1. Cloud Console에서 VM 인스턴스 페이지로 이동합니다. 현재 위치가 올바른 프로젝트인지 확인합니다.

    VM 인스턴스 페이지로 이동

  2. 삭제할 인스턴스를 선택하고 해당 체크박스를 선택합니다.

  3. 삭제 를 클릭합니다.

원치 않는 저장소 삭제

Container Registry에서는 데이터 저장용량과 네트워크 이그레스에 대해 요금이 청구됩니다. 원치 않는 Container Registry를 삭제하려면 다음을 수행합니다.

  1. Cloud Console에서 Container Registry 페이지로 이동합니다. 현재 위치가 올바른 프로젝트인지 확인합니다.

    Container Registry 페이지로 이동

  2. 삭제할 저장소를 클릭합니다.

  3. 삭제하려는 각 이미지 옆의 체크박스를 클릭한 다음 삭제 를 클릭합니다.

다음 단계