
# 在CCE集群中使用镜像服务的安全配置建议
容器镜像是防御外部攻击的第一道防线，对保障应用程序、系统乃至整个供应链的安全至关重要。不安全的镜像容易成为攻击者的突破口，导致容器逃逸到宿主机。一旦容器逃逸发生，攻击者便能访问宿主机的敏感数据，甚至利用宿主机作为跳板，进一步控制整个集群或租户账户。以下是一些建议，以降低这种风险。
#### 容器镜像最小化
为了加强容器镜像的安全性，首先应从镜像中移除所有不必要的二进制文件。如果使用的是Docker Hub上的未知镜像，推荐使用如Dive这样的工具来审查镜像内容。Dive能够展示镜像每一层的详细内容，帮助您识别潜在的安全风险。更多信息，请参见[Dive](https://github.com/wagoodman/dive)。
建议删除所有设置了SETUID和SETGID权限的二进制文件，因为这些权限可能被恶意利用来提升权限。同时，考虑移除那些可能被用于恶意目的的Shell工具和应用程序，如nc和curl。您可以使用以下命令找到带有SETUID和SETGID位的文件：
```
find / -perm /6000 -type f -exec ls -ld {} \;
```
要从这些文件中删除特殊权限，请将以下指令添加到您的容器镜像中：
```
RUN find / -xdev -perm /6000 -type f -exec chmod a-s {} \; || true
```
#### 使用多阶段构建
多阶段构建是一种高效的容器镜像制作方法，它在自动化持续集成流程中发挥着重要作用。通过这种方式，您可以在构建过程中对源代码进行lint检查或执行静态代码分析，从而为开发人员提供快速反馈，无需长时间等待整个构建流程完成。
从安全性角度来看，多阶段构建具有显著优势。它允许开发者在最终推送到容器注册表的镜像中仅包含必需的组件，排除了构建工具和其他非必要二进制文件。这种方法可以显著减少镜像的攻击面，从而提高整体安全态势。
为了充分利用多阶段构建的优势，建议参考[Docker官方文档](https://docs.docker.com/develop/develop-images/multistage-build/)，深入了解其概念和最佳实践。这将帮助您创建更精简、更安全的容器镜像，同时优化开发和部署流程。
#### 使用SWR镜像服务
容器镜像服务（SoftWare Repository for Container，简称SWR）是一种支持镜像全生命周期管理的服务，提供简单易用、安全可靠的镜像管理功能，包括镜像的上传、下载、删除等。
SWR的一个显著特点是其细粒度的权限管理能力，允许管理员为不同用户定制访问权限，包括读取、编辑和管理等级别。这确保了镜像的安全性和合规性，同时满足了团队协作的需求。
此外，SWR还具备自动化部署的能力。用户可以通过设置触发器，实现镜像版本更新时的自动部署。每当镜像有新版本发布，SWR将自动触发云容器引擎（CCE）中使用该镜像的应用进行更新，从而简化了持续集成和持续部署（CI/CD）流程。
为了进一步增强SWR服务的安全性和灵活性，您可以为IAM（Identity and Access Management）用户添加精细的权限控制，以确保权限分配的准确性和安全性。具体的授权管理操作，您可以参考SWR的[授权管理](https://support.huaweicloud.com/usermanual-swr/swr_01_0015.html)文档。
#### 使用SWR镜像安全扫描
容器镜像服务为您提供了一个强大的工具------镜像安全扫描功能。只需一键操作，您就可以对您的镜像进行全面的安全检查。这项服务能够深入扫描您在镜像仓库中的私有镜像，识别出潜在的安全漏洞，并为您提供针对性的修复建议。
了解更多关于如何使用镜像安全扫描功能，以及如何解读和应用扫描结果中的修复建议，请参见[镜像安全扫描](https://support.huaweicloud.com/usermanual-swr/swr_01_0042.html)。
#### 使用镜像签名并配置验签策略
镜像验签是一种安全机制，用于验证容器镜像是否在创建后被篡改过。镜像的创建者可以对其内容进行签名，使用者则可以通过验证这个签名来确认镜像的完整性和来源。
镜像验签是维护容器镜像安全性的关键措施之一。通过实施镜像验签，组织可以确保其容器化应用的安全性和可靠性，保护其免受潜在的安全威胁。
SWR为您提供了镜像验签功能，关于如何镜像验签的配置请参见[镜像验签](https://support.huaweicloud.com/usermanual2-swr/swr_02_0502.html)。
#### 将USER指令添加到Dockerfiles中，并以非root用户运行
通过在容器构建和部署过程中设置正确的用户和权限，可以显著提高容器的安全性。这不仅有助于防止潜在的恶意活动，也是遵循最小权限原则的体现。
在Dockerfile中设置USER指令，可以确保所有随后的命令都以非root用户身份执行，这是标准的安全实践。
- 降低权限：以非root用户运行容器可以降低潜在安全风险，因为即使容器被攻击，攻击者也无法获得宿主机的完全控制权。
- 限制访问：非root用户通常具有有限的权限，这限制了它们对宿主机资源的访问和操作能力。
除了Dockerfile，您还可以在Kubernetes的podSpec中使用securityContext字段来设置用户和组ID，在部署时强制执行安全策略。
