3.6. 컨테이너 콘텐츠 보안

컨테이너 내부 콘텐츠의 보안을 유지하려면 Red Hat Universal Base Image와 같은 신뢰할 수 있는 기본 이미지로 시작하고 신뢰할 수 있는 소프트웨어를 추가해야 합니다. 컨테이너 이미지의 지속적인 보안을 확인하기 위해 이미지를 스캔하는 Red Hat 도구와 타사 도구가 있습니다.

3.6.1. 컨테이너 내부 보안

애플리케이션 및 인프라는 쉽게 사용할 수 있는 구성요소로 구성되며, 대부분은 Linux 운영 체제, JBoss Web Server, PostgreSQL 및 Node.js와 같은 오픈소스 패키지입니다.

이러한 패키지의 컨테이너화된 버전도 제공됩니다. 그러나 패키지의 원래 위치, 사용된 버전, 빌드한 사람 및 악성 코드가 있는지 여부를 알아야 합니다.

답변해야 할 몇 가지 질문은 다음과 같습니다.

  • 컨테이너 내부의 구성요소 때문에 인프라가 손상됩니까?
  • 애플리케이션 계층에 알려진 취약점이 있습니까?
  • 런타임 및 운영 체제 계층이 최신입니까?

Red Hat UBI(Universal Base Images)의 컨테이너를 빌드하여 컨테이너 이미지의 기초가 Red Hat Enterprise Linux에 포함된 동일한 RPM 패키지 소프트웨어로 구성되게 합니다. UBI 이미지를 사용하거나 재배포하는 데 서브스크립션이 필요하지 않습니다.

컨테이너 자체의 지속적인 보안을 보장하기 위해 RHEL에서 직접 사용되거나 OpenShift Container Platform에 추가된 보안 스캔 기능을 통해 사용 중인 이미지에 취약점이 있을 때 경고할 수 있습니다. OpenSCAP 이미지 스캔은 RHEL에서 사용할 수 있으며 Container Security Operator를 추가하여 OpenShift Container Platform에서 사용되는 컨테이너 이미지를 확인할 수 있습니다.

3.6.2. UBI를 사용하여 재배포 가능한 이미지 생성

컨테이너화된 애플리케이션을 생성하려면 일반적으로 운영 체제에서 제공하는 구성요소를 제공하는 신뢰할 수 있는 기본 이미지로 시작합니다. 여기에는 라이브러리, 유틸리티 및 운영 체제의 파일 시스템에서 애플리케이션에 표시될 것으로 예상되는 기타 기능이 포함됩니다.

Red Hat UBI(Universal Base Image)는 자체 컨테이너를 구축하는 모든 사용자가 Red Hat Enterprise Linux rpm 패키지 및 기타 콘텐츠를 사용하여 전적으로 구성된 컨테이너로 시작하도록 생성되었습니다. 이 UBI 이미지는 보안 패치로 최신 상태를 유지하고 고유 소프트웨어를 포함하도록 빌드된 컨테이너 이미지를 자유롭게 사용하고 재배포하도록 정기적으로 업데이트됩니다.

다른 UBI 이미지의 상태를 찾고 확인하려면 Red Hat Ecosystem Catalog를 검색하십시오. 보안 컨테이너 이미지의 생성자는 다음과 같은 일반적인 두 가지 유형의 UBI 이미지에 관심이 있을 수 있습니다.

  • UBI: RHEL 7 및 8의 표준 UBI 이미지(ubi7/ubiubi8/ubi) 외에도 해당 시스템 기반의 최소 이미지(ubi7/ubi-minimalubi8/ubi-mimimal)가 있습니다. 이러한 이미지는 모두 표준 yumdnf 명령을 사용하여 빌드한 컨테이너 이미지에 추가할 수 있는 RHEL 소프트웨어의 무료 리포지토리를 가리키도록 미리 구성되어 있습니다. Red Hat에서는 Fedora 및 Ubuntu와 같은 다른 배포판에서 이러한 이미지를 사용하도록 권장합니다.
  • Red Hat 소프트웨어 컬렉션: 특정 유형의 애플리케이션에 관한 기본 이미지로 사용하기 위해 생성된 이미지를 찾으려면 Red Hat Ecosystem Catalog에서 rhscl/을 검색하십시오. 예를 들어, Apache httpd(rhscl/httpd-*), Python(rhscl/python-*), Ruby(rhscl/ruby-*), Node.js(rhscl/nodejs-*) 및 Perl(rhscl/perl-*) rhscl 이미지가 있습니다.

UBI 이미지는 자유롭게 재배포할 수 있지만, 이러한 이미지에 관한 Red Hat 지원은 Red Hat 제품 서브스크립션을 통해서만 제공됩니다.

표준, 최소 및 초기화 UBI 이미지에서 사용하고 빌드하는 방법에 관한 정보는 Red Hat Enterprise Linux 설명서에서 Red Hat Universal Base 이미지 사용을 참조하십시오.

3.6.3. RHEL의 보안 스캔

RHEL(Red Hat Enterprise Linux) 시스템의 경우 OpenSCAP 스캔은 openscap-utils 패키지에서 사용할 수 있습니다. RHEL에서 openscap-podman 명령을 사용하여 이미지의 취약점을 스캔할 수 있습니다. Red Hat Enterprise Linux 설명서에서 컨테이너 및 컨테이너 이미지에서 취약점 스캔을 참조하십시오.

OpenShift Container Platform을 사용하면 CI/CD 프로세스에서 RHEL 스캐너를 활용할 수 있습니다. 예를 들어 소스 코드의 보안 결함을 테스트하는 정적 코드 분석 툴과 오픈소스 라이브러리에서 알려진 취약점과 같은 메타데이터를 제공하기 위해 해당 라이브러리르 식별하는 소프트웨어 구성 분석 툴을 통합할 수 있습니다.

3.6.3.1. OpenShift 이미지 스캔

OpenShift Container Platform에서 실행 중이고 Red Hat Quay 레지스트리에서 가져온 컨테이너 이미지의 경우 Operator를 사용하여 해당 이미지의 취약점을 나열할 수 있습니다. 선택한 네임스페이스에 추가된 이미지의 취약점 보고를 제공하기 위해 Container Security Operator는 OpenShift Container Platform에 추가할 수 있습니다.

Red Hat Quay의 컨테이너 이미지 스캔은 Clair 보안 스캐너를 사용하여 수행됩니다. Red Hat Quay에서 Clair는 RHEL, CentOS, Oracle, Alpine, Debian 및 Ubuntu 운영 체제 소프트웨어에서 빌드된 이미지의 취약점을 검색하고 보고할 수 있습니다.

3.6.4. 외부 스캔 통합

OpenShift Container Platform은 오브젝트 주석을 사용하여 기능을 확장합니다. 취약점 스캐너와 같은 외부 툴에서는 메타데이터로 이미지 오브젝트에 주석을 달아 결과를 요약하고 Pod 실행을 제어할 수 있습니다. 이 섹션에서는 이 주석의 인식된 형식을 설명하므로 유용한 데이터를 사용자에게 표시하기 위해 콘솔에서 안정적으로 사용할 수 있습니다.

3.6.4.1. 이미지 메타데이터

패키지 취약점 및 오픈소스 소프트웨어(OSS) 라이센스 컴플라이언스를 포함하여 다양한 유형의 이미지 품질 데이터가 있습니다. 또한 이 메타데이터를 제공하는 공급자가 둘 이상일 수 있습니다. 이를 위해 다음 주석 형식이 예약되어 있습니다.

quality.images.openshift.io/<qualityType>.<providerId>: {}

표 3.1. 주석 키 형식

구성요소설명허용 가능한 값

qualityType

메타데이터 유형

vulnerability
license
operations
policy

providerId

공급자 ID 문자열

openscap
redhatcatalog
redhatinsights
blackduck
jfrog

3.6.4.1.1. 주석 키 예
quality.images.openshift.io/vulnerability.blackduck: {}
quality.images.openshift.io/vulnerability.jfrog: {}
quality.images.openshift.io/license.blackduck: {}
quality.images.openshift.io/vulnerability.openscap: {}

이미지 품질 주석의 값은 다음 형식을 준수해야 하는 구조화된 데이터입니다.

표 3.2. 주석 값 형식

필드필수 여부설명유형

name

공급자 표시 이름

문자열

timestamp

스캔 타임스탬프

문자열

description

아니요

짧은 설명

문자열

reference

정보 소스 또는 자세한 내용의 URL. 사용자가 데이터를 검증하려면 필수

문자열

scannerVersion

아니요

스캐너 버전

문자열

compliant

아니요

컴플라이언스 합격 또는 불합격

부울

summary

아니요

발견된 문제 요약

목록(아래 표 참조)

summary 필드는 다음 형식을 준수해야 합니다.

표 3.3. 요약 필드 값 형식

필드설명유형

label

구성요소의 표시 레이블(예: "심각", "중요", "중간", "낮음" 또는 "상태")

문자열

data

이 구성요소의 데이터(예: 발견된 취약점 수 또는 점수)

문자열

severityIndex

그래픽 표시의 순서를 지정하고 할당할 수 있는 구성요소 색인입니다. 값은 0..3 범위입니다. 여기서 0 = 낮음입니다.

정수

reference

정보 소스 또는 자세한 내용의 URL. 선택 사항입니다.

문자열

3.6.4.1.2. 주석 값 예

이 예에서는 취약성 요약 데이터 및 컴플라이언스 부울이 있는 이미지의 OpenSCAP 주석을 표시합니다.

OpenSCAP 주석

{
  "name": "OpenSCAP",
  "description": "OpenSCAP vulnerability score",
  "timestamp": "2016-09-08T05:04:46Z",
  "reference": "https://www.open-scap.org/930492",
  "compliant": true,
  "scannerVersion": "1.2",
  "summary": [
    { "label": "critical", "data": "4", "severityIndex": 3, "reference": null },
    { "label": "important", "data": "12", "severityIndex": 2, "reference": null },
    { "label": "moderate", "data": "8", "severityIndex": 1, "reference": null },
    { "label": "low", "data": "26", "severityIndex": 0, "reference": null }
  ]
}

이 예에서는 추가 세부 사항의 외부 URL이 있는 상태 인덱스 데이터가 있는 이미지의 Red Hat Ecosystem Catalog의 컨테이너 이미지 섹션 주석을 표시합니다.

Red Hat Ecosystem Catalog 주석

{
  "name": "Red Hat Ecosystem Catalog",
  "description": "Container health index",
  "timestamp": "2016-09-08T05:04:46Z",
  "reference": "https://access.redhat.com/errata/RHBA-2016:1566",
  "compliant": null,
  "scannerVersion": "1.2",
  "summary": [
    { "label": "Health index", "data": "B", "severityIndex": 1, "reference": null }
  ]
}

3.6.4.2. 이미지 오브젝트에 주석 달기

이미지 스트림 오브젝트는 OpenShift Container Platform의 최종 사용자가 작동하는 대상인 반면, 이미지 오브젝트는 보안 메타데이터로 주석을 답니다. 이미지 오브젝트는 클러스터 범위에 있으며, 여러 이미지 스트림 및 태그에서 참조할 수 있는 단일 이미지를 가리킵니다.

3.6.4.2.1. 주석 CLI 명령 예

<image>를 이미지 다이제스트로 교체합니다(예: sha256:401e359e0f45bfdcf004e258b72e253fd07fba8cc5c6f2ed4f4608fb119ecc2).

$ oc annotate image <image> \
    quality.images.openshift.io/vulnerability.redhatcatalog='{ \
    "name": "Red Hat Ecosystem Catalog", \
    "description": "Container health index", \
    "timestamp": "2020-06-01T05:04:46Z", \
    "compliant": null, \
    "scannerVersion": "1.2", \
    "reference": "https://access.redhat.com/errata/RHBA-2020:2347", \
    "summary": "[ \
      { "label": "Health index", "data": "B", "severityIndex": 1, "reference": null } ]" }'

3.6.4.3. Pod 실행 제어

images.openshift.io/deny-execution 이미지 정책을 사용하여 이미지 실행 가능 여부를 프로그래밍 방식으로 제어합니다.

3.6.4.3.1. 주석 예
annotations:
  images.openshift.io/deny-execution: true

3.6.4.4. 통합 참조

대부분의 경우 취약성 스캐너와 같은 외부 툴은 이미지 업데이트를 감시하고 스캔을 수행하며 결과를 사용하여 관련 이미지 오브젝트에 주석을 추가하는 스크립트 또는 플러그인을 개발합니다. 일반적으로 이 자동화에서는 OpenShift Container Platform 4.6 REST API를 호출하여 주석을 작성합니다. REST API에 관한 일반 정보는 OpenShift Container Platform REST API를 참조하십시오.

3.6.4.4.1. REST API 호출 예

curl을 사용하는 다음 예제 호출은 주석의 값을 덮어씁니다. <token>, <openshift_server>, <image_id><image_annotation>의 값을 교체하십시오.

API 호출 패치

$ curl -X PATCH \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/merge-patch+json" \
  https://<openshift_server>:8443/oapi/v1/images/<image_id> \
  --data '{ <image_annotation> }'

다음은 PATCH 페이로드 데이터의 예입니다.

호출 데이터 패치

{
"metadata": {
  "annotations": {
    "quality.images.openshift.io/vulnerability.redhatcatalog":
       "{ 'name': 'Red Hat Ecosystem Catalog', 'description': 'Container health index', 'timestamp': '2020-06-01T05:04:46Z', 'compliant': null, 'reference': 'https://access.redhat.com/errata/RHBA-2020:2347', 'summary': [{'label': 'Health index', 'data': '4', 'severityIndex': 1, 'reference': null}] }"
    }
  }
}