[CKS] Supply Chain Security (1)

Kubernetes 보안을 위한 안전한 소프트웨어 공급망 구축 방법을 소개합니다. SBOM 생성, 취약점 스캔, 컨테이너 이미지 최소화 등을 통해 개발부터 배포까지 보안을 강화할 수 있습니다.

[CKS] Supply Chain Security (1)
Photo by Bernd 📷 Dittrich / Unsplash

개요

아래 강의를 듣고 정리했습니다.

안전한 Supply Chain 구축하기

제조업에서의 안전한 공급망은 다음을 의미한다고 생각합니다.

  • 철저한 품질 검사
  • 제작 단계의 엄격한 기준 준수 확인과 안전 검사
  • 결함을 식별하고 수정하거나 재생성
  • 안전하게 포장 및 출하

Securing Software Development Life Cycle

Notion Image

안전한 소프트웨어 개발 프로세스는 신뢰할 수 있는 환경에서 소스 코드를 작성하고 테스트합니다.

이후 빌드 / 컴파일 → 배포 준비를 수행합니다. 빌드 프로세스의 무결성을 보장하기 위해 환경을 격리합니다. 종속성을 최신 상태로 유지하며  OWASP Dependency-Check 및 Snyk를 통해 취약점을 검사합니다. 배포 전 컨테이너 이미지는 취약점을 탐지하기 위해 철처지 검사해야하며 Clair 및 Trivy 와 같은 도구를 사용합니다.

제조업에서 사용자에게 결함없이 안전한 상품을 전달하기 위한 과정과 유사하며 안전한 환경에서 작업해야합니다.

Enhancing Deployment Security

배포는 Software 무결성의 최종 단계로 무단 접근이나 수정하지 못하게 강력한 보안 조치를 수행해야합니다.

 Pod 보안 정책 , 네트워크 정책, 역할 기반 접근 제어(RBAC) 등을 구성하여 Kubernetes 리소스를 보호합니다.

이러한 Supply Chain Security은 다음과 같은 이점이 존재합니다.

안전한 공급망을 구축하기 위한 필수적인 단계로 소홀히 관리된다면 위험에 노출되고 침해를 당할 수 있습니다.

  • 취약점 조기 탐지: 문제가 초기 단계에서 발견되어 신속한 해결이 가능합니다.
  • 최적화된 리소스 관리: 지속적인 검사를 통해 보안 사고로 인한 생산 중단을 방지합니다.
  • 규정 준수 강화: 엄격한 보안 표준을 준수함으로써 조직은 업계 규정을 충족할 수 있습니다.
  • 효율적인 사고 대응: 간소화된 프로세스를 통해 침해 사고 발생 시 피해를 최소화합니다.
  • 전반적인 보안 강화: 안전한 공급망은 개발부터 배포까지 모든 단계의 무결성을 강화합니다.

취약한 공급망의 위험성

패치 안 한 취약점으로 대규모 데이터 유출

소프트웨어 구성 요소의 알려진 취약점을 간과하여 대규모 공격 기회를 제공할 수 있습니다. 최근 React2Shell 취약점이 대표적입니다. 사고 발생 시 막대한 재정 손실, 벌금, 고객 신뢰 등의 손상을 초래할 수 있습니다.

신뢰할 수 없는 소프트웨어 구성 요소

검증되지 않은 구성 요소는 숨겨진 악성코드를 유입할 수 있습니다. 공격자는 이를 백도어로 활용하며 네트워크 침투, 전반적인 보안을 위협할 수 있습니다.

  • npm 공급망 공격 등 신뢰할 수 없는 패키지가 다운로드 될 수 있습니다.

민감한 정보 노출

자격 증명 등 Authentication 정보가 노출되어 Abuse, Malware에 노출될 수 있습니다.

AWS Access Key 등 자격 증명을 항상 암호화하거나 엄격하게 관리하여 무단 접근을 방지해야합니다.

  • Vault, Secret Manager 등

과도한 권한 설정으로 인한 취약점

접근 제어를 제대로 구성하지 않는다면 작은 피해가 커질 수 있고 쉬운 접근 경로가 제공될 수 있습니다.

네트워크 정책이 허술하거나 역할 기반 제어(RBAC)가 없다면 취약한 Pod에 침투하고 네트워크 취약점을 악용할 수 있습니다.

  • 최소 권한 원칙

컨테이너 보안 설정 오류 및 호스트 침해

컨테이너 보안 구성 실수로 공격자가 컨테이너 환경에서 벗어나 호스트 시스템을 조작할 수 있습니다.

더 나아가 데이터 탈취, 시스템 권한 악용, 전체 시스템의 완전한 제어권 확보까지 이어질 수 있습니다.

  • Privilege 설정 제어

SBOM의 개념과 중요성

Software Bill of Materials (SBOM) 소프트웨어 애플리케이션을 구성하는 모든 구성 요소의 포괄적인 목록

  • SBOM(소프트웨어 구성 요소 명세서)
    • 소프트웨어 내부 구성 요소 확인 + 위험을 관리하고 무결성을 보장하는 데 도움
    • 구성 요소와 상호 의존성을 체계적으로 문서화하여 의존성을 관리
      • 오래 되었거나 안전하지 않은 의존성으로 인한 위험 제거
      • 구성 요소와 취약점을 함께 기록하여 소프트웨어 보안을 향상

아래는 예시입니다.

{
  "package": {
    "name": "grep",
    "SPDXID": "SPDXRef-Package-deb-grep-a8613391d2f5a59d",
    "versionInfo": "3.8-5",
    "supplier": "Person: Anibal Monsalve Salazar (anibal@debian.org)",
    "originator": "Person: Anibal Monsalve Salazar (anibal@debian.org)",
    "downloadLocation": "NOASSERTION",
    "filesAnalyzed": true,
    "packageVerificationCode": {
      "packageVerificationCodeValue": "6dab867e2a9f53bf5faee39422e2c82e551ca7d8d"
    },
    "sourceInfo": "acquired package info from DPKG DB: /usr/share/doc/grep/copyright, /var/lib/dpkg/info/grep.list",
    "licenseConcluded": "NOASSERTION",
    "licenseDeclared": "GPL-3.0-only AND GPL-3.0-or-later",
    "copyrightText": "NOASSERTION",
    "externalRefs": [
      {
        "referenceCategory": "SECURITY",
        "referenceType": "cpe22Type",
        "referenceLocator": "cpe:2.3:a:grep:grep:3.8-5:*:*:*:*:*:*:*"
      },
      {
        "referenceCategory": "PACKAGE-MANAGER",
        "referenceType": "url",
        "referenceLocator": "pkg:deb/debian/grep@3.8-5?arch=amd64&distro=debian-12"
      }
    ]
  }
}
  • 구성 요소 명
  • 버전
  • 공급업체 & 제작자 정보
  • 라이선스
  • 종속성 및 취약점 정보
  • 보안 참조

이를 통해 투명성을 향상시킬 수 있습니다. 보안 사고 발생 시 신속하게 대응하고 패키지의 효율적인 관리를 수행할 수 있게 관리합니다. 취약점 추적으로 보안을 강화하고 규제를 준수할 수 있도록 구성합니다.

Minimize base image footprint

Docker 이미지를 최소화하여 효율성, 보안 및 빠른 배포를 수행하도록 이미지 최적화하는 방법을 확인했습니다.

Base Image 이해하기

이미지 최적화를 위해선 이미지가 어떻게 구축되는지 이해해야합니다.

이를 이해하기 위해서 httpd 를 웹 앱 기준으로 상위 이미지로 거슬러가보겠습니다.

# Dockerfile – My Custom Webapp
FROM httpd
COPY index.html htdocs/index.html
# Dockerfile - httpd
FROM debian:buster-slim
ENV HTTPD_PREFIX /usr/local/apache2
ENV PATH $HTTPD_PREFIX/bin:$PATH
WORKDIR $HTTPD_PREFIX
# <content trimmed>

httpd 패키지에서 계속 내려오면 FROM scratch로 구성된 이미지를 확인할 수 있습니다. 이미지 계층 구조에서 부모 이미지 없이 처음부터 이미지를 만들 때 해당 이미지를 기본 이미지(From scratch)라고 표현합니다.

# Dockerfile - debian:buster-slim
FROM scratch
ADD rootfs.tar.xz /
CMD ["bash"]

이미지 제작을 위한 모범 사례

Docker Image를 생성하기 위해선 효율성, 보안 및 관리 용이성을 고민해야합니다.

일반적인 모범사례는 다음과 같습니다.

애플리케이션 분리

Web, DB, 그 외 애플리케이션을 분리합니다. 구성 요소 별로 모듈화된 이미지를 별도로 구축해야합니다. 자체 라이브러리와 종속성으로 독립적인 확장, 축소가 가능해야 관리를 간소화하고 격리를 통해 보안을 강화할 수 있습니다.

컨테이너 내부의 데이터 저장 금지

Container의 본질적으로 Stateless와 Ephemeral합니다. 컨테이너에 내부 데이터나 상태를 저장하지 말고 외부 볼륨(Disk)이나 캐싱 서비스(Volume)를 사용하여 데이터를 영구 저장해야합니다.

신뢰할 수 있는 이미지 선택

애플리케이션 요구 사항과 신뢰성 있는 이미지를 사용해야합니다. Docker Hub에서 검증된 게시자 태그와 인증 표시가 있는 이미지를 찾고 정기적으로 업데이트 되는지 확인해야합니다.

이미지 사이즈 최소화

이미지가 작을수록 다운로드 속도와 실행 속도가 빨라집니다. 운영 체제의 minimal versions을 권장합니다.

공격자가 악용할 수 있는 curl,wget 같은 불필요한 내용을 제거하는 것이 도움이 될 수 있습니다.

필요하지 않은 패키지 관리자, 런타임 들을 제거하는 것이 좋습니다.

취약점 최소화

패키지 수 즐이기, 이미지 크기 최소화하기만 해도 보안 취약점을 크게 줄일 수 있습니다. Google의 distroless 패키지는 쉘(bash), 패키지 관리자(apt, yum), 네트워크 도구(curl, wget) 같은 불필요한 것들을 제거한 이미지를 제공하고 있습니다. 각 언어의 런타임을 제공합니다.

  • gcr.io/distroless/python3
  • gcr.io/distroless/java
  • gcr.io/distroless/nodejs

그 외에도 Alpine 등으로 패키지 수를 최소화하여 취약점을 줄일 수 있습니다.

Trivy 도구를 사용하여 표준 HTTP 이미지와 HTTP Alpine 이미지의 취약점 스캔 결과를 비교해 보겠습니다.

  • CVE 취약점 확인 → Attack Surface 최소화 가능
trivy image httpd
httpd (debian 10.8)
====================
Total: 124 (UNKNOWN: 0, LOW: 88, MEDIUM: 9, HIGH: 25, CRITICAL: 2)


trivy image httpd:alpine
httpd:alpine (alpine 3.12.4)
==============================
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

안전한 이미지를 사용했다 한들 앞으로도 안전하다고 볼 순 없습니다. 취약점이 생기는 것을 방지하려면 기본 이미지의 보안 업데이트 및 패치를 항상 확인해야합니다.

SBOM Format

소프트웨어 명세서(SBOM) 형식인 SPDX와 CycloneDX를 확인합니다.

  • SPDX는 라이선스 및 법률 준수에 중점
  • CycloneDX는 취약점 식별 및 공급망 위험 관리의 보안 측면

SPDX

소프트웨어 패키지 문서화하는 방법인 SBOM 형식입니다.

  1. 문서 정보: 작성자 정보, 생성 날짜 및 버전을 포함하여 SPDX 문서에 대한 메타데이터
  2. 관계: SBOM의 다양한 구성 요소 간의 상호 관계(예: 파일-패키지 또는 종속성 관계) 정의
  3. 패키지 정보: 소프트웨어 패키지의 이름, 버전, 공급업체 및 검증 정보(예: 체크섬)세부 정보 제공
    1. 패키지가 변조되지 않았는지 무결성을 확인하기 위해 필요함
  4. 코드 조각: 오픈 소스 라이브러리의 일부를 포함하여 코드 또는 구성 요소의 더 작은 부분 캡쳐
  5. 파일 정보: 패키지 내의 개별 파일 추적
  6. 추가 메타데이터: SBOM의 정확성을 보장하기 위해 메모, 라이선스 정보 및 검토 기록 등 세부 정보 제공
  • NGINX의 SPDX 문서입니다. JSON으로 SPDX 2.3을 준수했으며 ANKOR SIFT 도구를 사용했습니다.
{
  "spdxVersion": "SPDX-2.3",
  "dataLicense": "CC0-1.0",
  "SPDXID": "SPDXRef-DOCUMENT",
  "name": "nginx",
  "documentNamespace": "https://anchore.com/syft/image/nginx-2a35db70-da10-45cd-b82d-00921857780f",
  "creationInfo": {
    "licenseListVersion": "3.25",
    "creators": [
      "Organization: Anchore, Inc",
      "Tool: syft-1.13.0"
    ]
  },
  "created": "2024-09-24T18:17:42Z"
}
  • grep 패키지용 SPDX 문서
    • 공급업체 정보, 라이선스 세부 정보 및 취약점
    • cpe23Type(Common Platform Enumeration) 표준화된 형식으로 식별
{
  "package": {
    "name": "grep",
    "SPDXID": "SPDXRef-Package-deb-grep-a86139312d2f5a59d",
    "versionInfo": "3.8-5",
    "supplier": "Person: Anibal Monsalve Salazar (anibal@debian.org)",
    "originator": "Person: Anibal Monsalve Salazar (anibal@debian.org)",
    "downloadLocation": "NOASSERTION",
    "filesAnalyzed": true,
    "packageVerificationCode": {
      "packageVerificationCodeValue": "6da86e7e3a9f53bf5faee3942e2c8e2551ca7d8d"
    },
    "sourceInfo": "acquired package info from DPKG DB: /usr/share/doc/grep/copyright, /var/lib/dpkg/info/grep.md5sums, /var/lib/dpkg/status",
    "licenseConcluded": "NOASSERTION",
    "licenseDeclared": "GPL-3.0-only AND GPL-3.0-or-later",
    "copyrightText": "NOASSERTION",
    "externalRefs": [
      {
        "referenceCategory": "SECURITY",
        "referenceType": "cpe23Type",
        "referenceLocator": "cpe:2.3:a:grep:grep:3.8-5:*****:*:*:*:*:*:*"
      },
      {
        "referenceCategory": "PACKAGE-MANAGER",
        "referenceType": "url",
        "referenceLocator": "pkg:deb/debian/grep@3.8-5?arch=amd64&distro=debian-12"
      }
    ]
  }
  • Pod에 대한 SPDX 문서
    • 파일 유형 및 체크섬 데이터 등 세부 정보를 포함
{
  "file": {
    "fileName": "/usr/lib/systemd/system/pam_namespace.service",
    "SPDXID": "SPDXRef-File---systemd-system-pam-namespace.service-87d70ca1b93138b1",
    "fileTypes": [
      "TEXT"
    ],
    "checksums": [
      {
        "algorithm": "SHA1",
        "checksumValue": "9b870dae75ff7a0c34eeb85e4c9c42a8cfdc10f8"
      },
      {
        "algorithm": "SHA256",
        "checksumValue": "e4dcd011776e596cbb73dcffde737aa043b5308fobf797a23d4229de54d716"
      }
    ],
    "licenseConcluded": "NOASSERTION",
    "licenseInfoInFiles": [
      "NOASSERTION"
    ],
    "copyrightText": "",
    "comment": "layerID: sha256:82e2ab394fabf575000041a8f0801b04e91c7027b7c174fe95332c7ebb6501cb"
  }
}

CycloneDX Format

  • BOM 메타데이터: 버전, 타임스탬프, 작성자 정보 등 SBOM에 대한 일반 정보 포함
  • 구성 요소 목록: 소프트웨어 내의 개별 부분 또는 모듈 열거
  • 취약점: 구성 요소와 관련된 알려진 보안 취약점 나열
    • SPDX와 구별되는 섹션입니다.
  • 소프트웨어 서비스: 소프트웨어와 관련된 모든 서비스 세부 정보
  • 주석: 추가적인 메모나 맥락 정보
  • 종속성 및 확장: 구성 요소 종속성 및 확장된 메타데이터에 대한 정보
{
  "$schema": "http://cyclonedx.org/schema/bom-1.6.schema.json",
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "serialNumber": "urn:uuid:e7f6caab-6589-430d-bb7f-0076d23e9efb",
  "version": 1,
  "metadata": {
    "timestamp": "2024-09-24T18:46:28Z",
    "tools": {
      "components": [
        {
          "type": "application",
          "author": "anchore",
          "name": "syft",
          "version": "1.13.0"
        }
      ]
    }
  },
  "component": {
    "bom-ref": "eb2d7db1213e6155",
    "type": "container",
    "name": "nginx",
    "version": "sha256:edf555d07d2ddeb6b616d9024442feac12a91310c9a156fa6f60cd602881a"
  },
  "properties": [
    {
      "name": "syft:image:labels:maintainer",
      "value": "NGINX Docker Maintainers <docker-maint@nginx.com>"
    }
  ],
  "components": [
    {
      "bom-ref": "pkg:deb/debian/adduser@3.134?arch=all&distro=debian-12&package-id=8a498975e59f569c2",
      "type": "library",
      "publisher": "Debian Adduser Developers <adduser@packages.debian.org>"
    }
  ]
}
특징 SPDX 사이클론DX
형식 및 복잡성 라이선스 및 규정 준수에 중점을 둔 광범위한 메타데이터를 제공합니다. JSON 및 RDF 형식으로 제공됩니다. 보안 및 취약점에 초점을 맞춘 경량 형식입니다. JSON 및 XML 형식으로 제공됩니다.
보안에 집중 상세한 라이선스 데이터 및 규정 준수 지표. 취약점 추적 및 종속성 관리를 강조합니다.
사용 편의성 광범위한 메타데이터 포함으로 인해 더 복잡해졌습니다. 더 간소하고 보안 및 규정 준수에 더욱 집중했습니다.
  • SPDX를 통해 포괄적인 법률 및 라이센스 세부 정보인지
  • CycloneDX를 통해 간소화된 보안 정보인지

SBOM Workflow

SBOM을 생성/관리하는 가이드입니다. 전체 프로세스를 확인하고 개발 수명 주기와 규정을 준수하는 소프트웨어 공급망을 유지할 수 있습니다.

SBOM 생성하기

Syft 를 통해 SBOM을 생성합니다. Syft는 Docker 이미지와 로컬 소드 코드 디렉토리를 스캔 가능합니다.

# Generate an SPDX SBOM for a Docker image
syft <image-name>:<tag> -o spdx-json


# Generate an SPDX SBOM for a source code directory
syft /path/to/source/code -o spdx-json

SBOM이 생성되면 안전한 저장소에 저장합니다.

syft docker.io/kodekloud/webapp-color:latest -o cyclonedx-json=webapp-sbom.json

SBOM 스캔

Grype로 취약점 검사를 수행할 수 있습니다.

# Install Grype
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh


# Scan the generated SBOM for vulnerabilities
grype sbom:nginx-sbom.cyclonedx.json
$ grype clshapp/qa-page | head

Vulnerability DB                                     Info update available
Pulling image                                       [5.8 MB / 56 MB]
11 Layers |
grype /root/webapp-sbom.json --file /root/grype-report.json --output json
cat grype-report.json | jq -e '.matches[] | select(.vulnerability.id == "CVE-2022-48174")'

{
  "vulnerability": {
    "id": "CVE-2022-48174",
    "dataSource": "https://nvd.nist.gov/vuln/detail/CVE-2022-48174",
    "namespace": "nvd:cpe",
    "severity": "Critical",
    ...
   }
}

취약점 분석

스캔 결과 분석을 위해 취약점 정보를 JSON으로 확인할 수 있습니다.

  • libnginx-mod-http-xslt-filter (버전 1.10.3-1+deb9u3)에서 취약점(CVE-2020-11724) 발견
{
  "vulnerability": {
    "id": "CVE-2020-11724",
    "severity": "Medium",
    "links": [
      "http://security-tracker.debian.org/tracker/CVE-2020-11724"
    ]
  },
  "cvss-v2": {
    "base-score": 5,
    "vector": "AV:N/AC:L/Au:N/C:N/I:P/A:N"
  },
  "matched-by": {
    "matcher": "dpkg-matcher",
    "search-key": "distro[debian 9] constraint[< 1.10.3-1+deb9u5 (deb)]"
  },
  "artifact": {
    "name": "libnginx-mod-http-xslt-filter",
    "version": "1.10.3-1+deb9u3",
    "type": "deb",
    "found-by": "dpkg-catalog"
  },
  "locations": [
    {
      "path": "/var/lib/dpkg/status",
      "layer-index": 1
    }
  ],
  "metadata": {
    "package": "libnginx-mod-http-xslt-filter",
    "source": "nginx",
    "version": "1.10.3-1+deb9u3"
  }
}

취약점 해결

취약점 분석한 후 해결 조치를 수행합니다. 통제된 테스트 환경에서 조치가 필요합니다.

  • 버전 업그레이드 혹은 적합한 대체 솔루션을 사용

지속적인 모니터링 & Alert 시스템

SBOM을 지속적으로 수행하기 위해 CI/CD 파이프라인 내에서 지속적으로 모니터링과 자동화 알람을 설정합니다.

종속성이 장기적으로 업데이트되고 새로운 취약점이나 규정 준수 문제를 확인해야합니다.

SBOM Lab

SBOM Github Action Workflow 생성하기

name: Generate SBOM Report with Syft

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  generate-sbom:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout Repository
      uses: actions/checkout@v3

    - name: Install Syft
      run: |
        curl -sSfL https://raw.githubusercontent.com/anchore/syft/main/install.sh | sh -s -- -b /usr/local/bin

    - name: Generate SBOM
      run: |
        syft docker.io/kodekloud/webapp-color:latest -o spdx-json > spdx.json  

    - name: Upload SBOM Artifact
      uses: actions/upload-artifact@v4
      with:
        name: sbom-report
        path: sbom.xml