《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.8环境中验证
环境说明
- OpenShift 4.8
- RHEL 8/CentOS 8 (其上安装有 openscap-utils,podman),或者 RHEL 7/CentOS 7(其上安装有 openscap-utils,docker)
- quay.io 账号
构建应用镜像并加固镜像安全漏洞
- 允许从外部访问 OpenShift 内部的 Image Registry。
$ oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge
- 设置环境
$ QUAY_USER=dawnskyliu
$ QUAY_PASS=XXXXX
$ OLD_VER=7.7-178
$ NEW_VER=latest
$ INTERNAL_REGISTRY=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}')
- 获取应用资源
$ git clone https://github.com/liuxiaoyu-git/Jenkins-DevSecOps
$ cd Jenkins-DevSecOps/
- 修改“hardening_pipeline/Dockerfile”文件,将第一行内容
FROM registry.access.redhat.com/ubi7/ubi:latest
修改为:
FROM registry.access.redhat.com/ubi7/ubi:7.7-178
将以下两行内容
RUN chmod +x /fix*.sh && for i in $(ls /fix*.sh); do sh ${i}; done && rm -rf /fix*.sh
RUN yum update -y && rm -rf /var/cache/yum/ /var/tmp/* /tmp/* /var/tmp/.???* /tmp/.???*
注释掉,修改为:
# RUN chmod +x /fix*.sh && for i in $(ls /fix*.sh); do sh ${i}; done && rm -rf /fix*.sh
# RUN yum update -y && rm -rf /var/cache/yum/ /var/tmp/* /tmp/* /var/tmp/.???* /tmp/.???*
- 创建项目,并根据Dockerfile创建BuildConfig资源,然后构建应用镜像。镜像会存放在 OpenShift 内部 Image Registry。
$ oc new-project openjdk-hardening
$ oc new-build --name=harden-build --strategy=docker --binary --to=hardened-openjdk -n openjdk-hardening
$ oc start-build harden-build --from-dir=hardening_pipeline --wait --follow -n openjdk-hardening
- 将镜像从 内部 Image Registry 推送到 quay.io。这里需要重复执行2次命令,第一次只会在 quay.io 中创建 Repository,第二次才会完成镜像推送。
$ skopeo --debug copy --src-creds=$(oc whoami):$(oc whoami -t) --dest-creds=${QUAY_USER}:${QUAY_PASS} \
--src-tls-verify=false --dest-tls-verify=false \
docker://${INTERNAL_REGISTRY}/openjdk-hardening/hardened-openjdk:latest \
docker://quay.io/${QUAY_USER}/hardened-openjdk:${OLD_VER}
$ skopeo --debug copy --src-creds=$(oc whoami):$(oc whoami -t) --dest-creds=${QUAY_USER}:${QUAY_PASS} \
--src-tls-verify=false --dest-tls-verify=false \
docker://${INTERNAL_REGISTRY}/openjdk-hardening/hardened-openjdk:latest \
docker://quay.io/${QUAY_USER}/hardened-openjdk:${OLD_VER}
- 在 quay.io 中查看 “hardened-openjdk:7.7-178”镜像,确认有不同级别的漏洞。
- 恢复“hardening_pipeline/Dockerfile”文件内容。
- 再次生成应用镜像,并将其推送到 quay.io。
$ oc start-build harden-build --from-dir=hardening_pipeline --wait --follow -n openjdk-hardening
$ skopeo --debug copy --src-creds=$(oc whoami):$(oc whoami -t) --dest-creds=${QUAY_USER}:${QUAY_PASS} \
--src-tls-verify=false --dest-tls-verify=false \
docker://${INTERNAL_REGISTRY}/openjdk-hardening/hardened-openjdk:latest \
docker://quay.io/${QUAY_USER}/hardened-openjdk:${NEW_VER}
- 在 quay.io 中查看 “hardened-openjdk:latest”镜像,确认已经没有漏洞了。
镜像合规扫描
- 从 quay.io 下载镜像
$ podman login quay.io -u ${QUAY_USER} -p ${QUAY_PASS}
$ podman pull quay.io/${QUAY_USER}/hardened-openjdk
Trying to pull quay.io/dawnskyliu/hardened-openjdk...Getting image source signatures
Copying blob 0bcb99761896 done
Copying blob c65299f28473 done
Copying blob d08acf026168 done
Copying blob 1ce67f45ed87 done
Copying blob ef2628c0f044 done
Copying blob 6bc50ed2498b done
Copying blob 78baaf40360c done
Copying config b181f6275f done
Writing manifest to image destination
Storing signatures
b181f6275fa3df7f4c34b1128e57ec1d1fa0b169b4d06a88799e73885a382126
- 根据“xccdf”扫描镜像合规。说明:因为镜像是基于 “ubi7”,因此合规扫描基于 “ssg-rhel7-ds.xml”。
$ sudo oscap-podman quay.io/${QUAY_USER}/hardened-openjdk:latest xccdf eval \
--fetch-remote-resources \
--profile xccdf_org.ssgproject.content_profile_stig \
--report report.html \
/usr/share/xml/scap/ssg/content/ssg-rhel7-ds.xml
- 生成“oval”扫描镜像合规。
$ wget -O - https://www.redhat.com/security/data/oval/v2/RHEL7/rhel-7.oval.xml.bz2 | bzip2 --decompress > rhel-7.oval.xml
$ oscap-podman quay.io/${QUAY_USER}/hardened-openjdk:latest oval eval --report report-cve.html rhel-7.oval.xml