카테고리 없음

[K8s] 쿠버네티스 보안 Best Practice01 Image Scanning

Sophie소피 2024. 6. 11. 12:51

Introduction 

쿠버네티스 내에서 애플리케이션을 안전하게 운영하기 위해서는 다양한 보안 모범 사례를 준수해야 합니다. 그 중 하나인 이미지 스캐닝은 신뢰할 수 없는 코드와 레지스트리로부터 발생할 수 있는 보안 위험을 최소화하는 데 필수적입니다. 이미지 스캐닝의 중요성은 컨테이너 이미지 내의 패키지와 종속성을 검사하여 보안 취약점을 식별할 수 있는 능력에 있습니다.

신뢰할 수 없는 레지스트리로부터 코드를 받는 것은 중대한 위험을 초래할 수 있습니다. 이러한 코드에는 바이러스나 백도어와 같은 악성 코드가 포함될 수 있으며, 이는 공격자에게 시스템 액세스 권한을 부여할 수 있습니다. 또한 Docker 이미지가 사용하는 운영체제 패키지와 기본 이미지에도 보안 취약점이 존재할 수 있습니다. 따라서 이미지에 포함된 라이브러리, 종속성 및 도구를 주의 깊게 검토하는 것이 중요합니다.

 

불필요한 의존성 제거 

제거 애플리케이션 이미지를 빌드할 때 불필요한 의존성을 제거하는 것은 중요한 보안 조치입니다. 개발 중에 필요한 패키지가 런타임에는 필요하지 않을 수 있으므로, 이미지를 최소한의 의존성으로 구성하는 것이 좋습니다. 이렇게 하면 이미지 크기를 줄이고 공격 표면을 감소시킬 수 있습니다. 애플리케이션을 실행하는 데 필수적인 도구만 포함하여 불필요한 취약점을 최소화하는 것이 중요합니다.

 

 

호스트 접근 방지

호스트 접근 방지는 컨테이너가 호스트나 Kubernetes 워커 노드에 접근하는 취약점을 방지하는 데 중점을 둡니다. 이러한 취약점을 통해 공격자는 호스트 볼륨의 데이터나 파일 시스템을 읽을 수 있고, kubelet 인증 토큰 및 인증서에 액세스할 수 있습니다. 이는 클러스터 전체를 손상시키고 권한 상승 기회를 제공할 수 있으므로, 컨테이너 이미지가 이러한 취약점으로부터 자유로워야 합니다.

 

 

Image Scanning 시기와 방법 

Image Scanning 은 CI/CD 파이프라인에서 중요한 단계이며, 빌드 과정 중에 수행하는 것이 가장 효과적입니다. Image Scanning 은 코드 테스트 후에 수행하는 것이 좋습니다. 먼저 애플리케이션 코드를 테스트하여 기능적 오류를 제거한 다음 Docker 이미지를 빌드합니다. 빌드된 Docker 이미지를 스캔하여 보안 취약점, 불필요한 패키지, 그리고 알려진 보안 문제를 찾습니다. 스캔 결과를 검토하여 문제가 있는 경우 수정하고, 문제가 없는 경우에만 이미지를 컨테이너 레지스트리에 저장합니다. 최종적으로 검증된 이미지를 Kubernetes 클러스터에 배포합니다.

이와 같은 조치를 통해 CI/CD 파이프라인의 빌드 단계에서 Image Scanning 을 수행함으로써, 애플리케이션의 보안 취약점을 조기에 발견하고 수정할 수 있습니다. 이를 통해 안전하고 신뢰할 수 있는 이미지를 구축하고 배포할 수 있으며, 전체 클러스터의 보안을 강화할 수 있습니다.

 

Jenkins and Clair  Sample 

Clair는 이미지 내의 보안 취약점을 식별하기 위한 도구입니다. Jenkins와 함께 Clair를 사용하려면 Clair 및 Clair-Scanner를 설치하고 구성해야 합니다.

pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                sh 'mvn test'
            }
        }
        stage('Build') {
            steps {
                sh 'docker build -t myapp:latest .'
            }
        }
        stage('Scan') {
            steps {
                sh '''
                    clair-scanner -c http://clair:6060 --ip "$(hostname -I)" myapp:latest
                '''
            }
        }
        stage('Push to Registry') {
            steps {
                script {
                    def scanResults = sh(script: 'clair-scanner -c http://clair:6060 --ip "$(hostname -I)" myapp:latest', returnStatus: true)
                    if (scanResults != 0) {
                        error("Image scanning failed. Fix vulnerabilities before proceeding.")
                    } else {
                        sh 'docker tag myapp:latest myregistry.com/myapp:latest'
                        sh 'docker push myregistry.com/myapp:latest'
                    }
                }
            }
        }
        stage('Deploy') {
            steps {
                sh 'kubectl apply -f k8s/deployment.yaml'
            }
        }
    }
}

 

 

Clair 설치

docker run -p 5432:5432 -d --name db arminc/clair-db:latest
docker run -p 6060:6060 --link db:postgres -d --name clair arminc/clair-local-scan:latest

 

 

Clair-Scanner 설치

wget https://github.com/arminc/clair-scanner/releases/download/v12/clair-scanner_linux_amd64
chmod +x clair-scanner_linux_amd64
mv clair-scanner_linux_amd64 /usr/local/bin/clair-scanner

 

 

Jenkins에서 Image Scanning 결과 확인

스캔 결과는 Jenkins 콘솔 출력에서 확인할 수 있습니다. Image Scanning 중 발견된 모든 취약점은 즉시 처리해야 합니다. 문제가 해결되면 이미지를 레지스트리에 푸시하고 Kubernetes 클러스터에 배포합니다.

 

Conclusion 

CI/CD 파이프라인의 빌드 단계에서 Image Scanning 을 수행함으로써, 애플리케이션의 보안 취약점을 조기에 발견하고 해결할 수 있습니다. Image Scanning은 신뢰할 수 있는 이미지를 구축하고 배포함으로써 전체 클러스터의 보안을 강화하는 데 도움이 됩니다.