

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon Inspector Dockerfile 检查
<a name="dockerfile-checks"></a>

 本节介绍如何使用 Amazon Inspector SBOM 生成器来扫描 Dockerfiles 和 Docker 容器映像，以查找是否存在会引入安全漏洞的错误配置。

**Topics**
+ [使用 Sbomgen Dockerfile 检查](#w2aac39c13b7)
+ [支持的 Dockerfile 检查](#w2aac39c13b9)

## 使用 Sbomgen Dockerfile 检查
<a name="w2aac39c13b7"></a>

 当发现名为 `Dockerfile` 或 `*.Dockerfile` 的文件以及扫描 Docker 映像后，会自动执行 Dockerfile 检查。

 您可以使用 `--skip-scanners dockerfile` 参数禁用 Dockerfile 检查。您还可以将 Dockerfile 检查与任何可用的扫描器（例如操作系统或第三方软件包）结合使用。

**Docker 检查命令示例**  
 以下示例命令演示如何为 Dockerfiles 和 Docker 容器镜像以及操作系统和第三方软件包生成 SBOMs 。

```
# generate SBOM only containing Docker checks for Dockerfiles in a local directory
./inspector-sbomgen directory --path ./project/ --scanners dockerfile
            
# generate SBOM for container image will by default include Dockerfile checks
./inspector-sbomgen container --image image:tag

# generate SBOM only containing Docker checks for specific Dockerfiles and Alpine, Debian, and Rhel OS packages in a local directory
/inspector-sbomgen directory --path ./project/ --scanners dockerfile,dpkg,alpine-apk,rhel-rpm

# generate SBOM only containing Docker checks for specific Dockerfiles in a local directory
./inspector-sbomgen directory --path ./project/ --skip-scanners dockerfile
```

**示例文件组件**  
 以下是 Dockerfile 查找文件组件的示例。

```
{
     "bom-ref": "comp-2",
      "name": "dockerfile:data/docker/Dockerfile",
      "properties": [
        {
          "name": "amazon:inspector:sbom_scanner:dockerfile_finding:IN-DOCKER-001",
          "value": "affected_lines:27-27"
        }
      ],
      "type": "file"
    },
```

**漏洞响应组件示例**  
 以下是 Dockerfile 查找漏洞响应组件的示例。

```
{
      "advisories": [
        {
          "url": "https://docs.docker.com/develop/develop-images/instructions/"
        }
      ],
      "affects": [
        {
          "ref": "comp-2"
        }
      ],
      "analysis": {
        "state": "in_triage"
      },
      "bom-ref": "vuln-13",
      "created": "2024-03-27T14:36:39Z",
      "description": "apt-get layer caching: Using apt-get update alone in a RUN statement causes caching issues and subsequent apt-get install instructions to fail.",
      "id": "IN-DOCKER-001",
      "ratings": [
        {
          "method": "other",
          "severity": "info",
          "source": {
            "name": "AMAZON_INSPECTOR",
            "url": "https://aws.amazon.com/inspector/"
          }
        }
      ],
      "source": {
        "name": "AMAZON_INSPECTOR",
        "url": "https://aws.amazon.com/inspector/"
      },
      "updated": "2024-03-27T14:36:39Z"
    },
```

**注意**  
 如果调用 Sbomgen 时不带 `--scan-sbom` 标志，则只能查看原始的 Dockerfile 调查发现。

## 支持的 Dockerfile 检查
<a name="w2aac39c13b9"></a>

 对以下内容支持 Sbomgen Dockerfile 检查：
+  Sudo 二进制程序包 
+  Debian APT 实用程序 
+  硬编码密钥 
+  根容器 
+  运行时弱化命令标志 
+  运行时弱化环境变量 

 这些 Dockerfile 检查中的每一项都有相应的严重性评级，该评级显示在以下主题的顶部。

**注意**  
 以下主题中描述的建议均基于行业最佳实践。

### Sudo 二进制程序包
<a name="w2aac39c13b9c11"></a>

**注意**  
 此检查的严重性评级为**信息**。

 我们建议不要安装或使用 Sudo 二进制程序包，因为它具有不可预测的 TTY 和信号转发行为。有关更多信息，请参阅 Docker Docs 网站中的 [User](https://docs.docker.com/build/building/best-practices/#user)。如果您的使用案例需要类似于 Sudo 二进制程序包的功能，我们建议使用 [Gosu](https://github.com/tianon/gosu)。

### Debian APT 实用程序
<a name="w2aac39c13b9c13"></a>

**注意**  
 此检查的严重性评级为**高**。

 以下是使用 Debian APT 实用程序的最佳实践。

**将 `apt-get` 命令合并到单个 `Run` 语句中以避免缓存问题**  
 我们建议在 Docker 容器内将 `apt-get` 命令合并到单个 RUN 语句中。单独使用 `apt-get update` 会导致缓存问题且后续 `apt-get install` 指令会失败。有关更多信息，请参阅 Docker Docs 网站上的 [apt-get](https://docs.docker.com/build/building/best-practices/#apt-get)。

**注意**  
 如果 Docker 容器软件已过期，则所述的缓存行为也可能发生在 Docker 容器内。

**以非交互方式使用 APT 命令行实用程序**  
 我们建议以交互方式使用 APT 命令行实用程序。APT 命令行实用程序被设计为终端用户工具，其行为在不同版本之间会发生变化。有关更多信息，请参阅 Debian 网站中的 [Script Usage and differences from other APT tools](https://manpages.debian.org/stretch/apt/apt.8.en.html#SCRIPT_USAGE_AND_DIFFERENCES_FROM_OTHER_APT_TOOLS)。

### 硬编码机密
<a name="w2aac39c13b9c15"></a>

**注意**  
 此检查的严重性评级为**严重**。

 您 Dockerfile 中的机密信息被视为硬编码机密。通过 Sbomgen Dockerfile 检查可以识别以下硬编码机密：
+  AWS 访问密钥 IDs — `AKIAIOSFODNN7EXAMPLE` 
+  AWS 密钥 — `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` 
+  DockerHub 个人访问令牌 — `dckr_pat_thisisa27charexample1234567` 
+  GitHub 个人访问令牌 — `ghp_examplev61wY7Pj1YnotrealUoY123456789` 
+  GitLab 个人访问令牌 — `glpat-12345example12345678` 

### 根容器
<a name="w2aac39c13b9c17"></a>

**注意**  
 此检查的严重性标记为**信息**。

 我们建议在没有根权限的情况下运行 Docker 容器。对于没有根权限就无法运行的容器化工作负载，我们建议使用最少权限原则来构建应用程序。有关更多信息，请参阅 Docker Docs 网站中的 [User](https://docs.docker.com/build/building/best-practices/#user)。

### 运行时弱化环境变量
<a name="w2aac39c13b9c19"></a>

**注意**  
 此检查的严重性评级为**高**。

 一些命令行实用程序或编程语言运行时支持绕过安全默认值，从而通过不安全的方法执行。

**NODE\_TLS\_REJECT\_UNAUTHORIZED=0**  
 当 Node.js 进程在 `NODE_TLS_REJECT_UNAUTHORIZED` 设置为 `0` 的情况下运行时，将禁用 TLS 证书验证。有关更多信息，请参阅 Node.js 网站中的 [NODE\_TLS\_REJECT\_UNAUTHORIZED=0](https://nodejs.org/api/cli.html#node_tls_reject_unauthorizedvalue)。

**GIT\_SSL\_NO\_VERIFY=\***  
 当 git 命令行进程在设置 `GIT_SSL_NO_VERIFY` 的情况下运行时，Git 会跳过验证 TLS 证书。有关更多信息，请参阅 Git 网站中的 [Environment variables](https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables)。

**PIP\_TRUSTED\_HOST=\***  
 当 Python pip 命令行进程在设置 `PIP_TRUSTED_HOST` 的情况下运行时，Pip 会跳过验证指定域上的 TLS 证书。有关更多信息，请参阅 Pip 网站中的 [--trusted-host](https://pip.pypa.io/en/stable/cli/pip/#cmdoption-trusted-host)。

**NPM\_CONFIG\_STRICT\_SSL=false**  
 当 Node.js npm 命令行进程在将 `NPM_CONFIG_STRICT_SSL` 设置为 false 的情况下运行时，Node Package Manager（npm）实用程序将在不验证 TLS 证书的情况下连接到 NPM 注册表。有关更多信息，请参阅 npm Docs 网站中的 [strict-ssl](https://docs.npmjs.com/cli/v10/using-npm/config#strict-ssl)。

### 运行时弱化命令标志
<a name="w2aac39c13b9c21"></a>

**注意**  
 此检查的严重性评级为**高**。

 与运行时弱化环境变量类似，一些命令行实用程序或编程语言运行时支持绕过安全默认值，从而通过不安全的方法执行。

**`npm ––strict-ssl=false`**  
 当 Node.js npm 命令行进程结合 `--strict-ssl=false` 标志运行时，Node Package Manager（npm）实用程序将在不验证 TLS 证书的情况下连接到 NPM 注册表。有关更多信息，请参阅 npm Docs 网站中的 [strict-ssl](https://docs.npmjs.com/cli/v10/using-npm/config#strict-ssl)。

**`apk ––allow-untrusted`**  
 当 Alpine Package Keeper 实用程序结合 `--allow-untrusted` 标志运行时，`apk` 将安装没有签名或签名不可信的软件包。有关更多信息，请参阅 Apline 网站中的[以下存储库](https://gitlab.alpinelinux.org/alpine/apk-tools/-/blob/f9eaeb6429325eeb5a17ed771fd477be9227fe15/doc/apk.8.scd#L114-115)。

**`apt-get ––allow-unauthenticated`**  
 当 Debian `apt-get` 软件包实用程序结合 `--allow-unauthenticated` 标志运行时，`apt-get` 不会检查软件包的有效性。有关更多信息，请参阅 Debian 网站中的 [APT-Get(8)](https://manpages.debian.org/stretch/apt/apt-get.8.en.html)。

**`pip ––trusted-host`**  
 当 Python pip 实用程序结合 `--trusted-host` 标志运行时，指定的主机名将绕过 TLS 证书验证。有关更多信息，请参阅 Pip 网站中的 [--trusted-host](https://pip.pypa.io/en/stable/cli/pip/#cmdoption-trusted-host)。

**`rpm ––nodigest, ––nosignature, ––noverify, ––nofiledigest`**  
 当基于 RPM 的软件包管理器 `rpm` 结合 `--nodigest`、`--nosignature`、`--noverify` 和 `--nofiledigest` 标志运行时，RPM 软件包管理器在安装软件包时不会验证软件包标头、签名或文件。有关更多信息，请参阅 RPM 网站上的以下 [RPM 手册页](https://rpm-software-management.github.io/rpm/man/)：

**`yum-config-manager ––setopt=sslverify false`**  
 当基于 RPM 的软件包管理器 `yum-config-manager` 在将 `--setopt=sslverify` 标志设置为 false 的情况下运行时，YUM 软件包管理器将不会验证 TLS 证书。有关更多信息，请参阅 Man7 网站上的以下 [YUM 手册页](https://man7.org/linux/man-pages/man5/yum.conf.5.html)：

**`yum ––nogpgcheck`**  
 基于 RPM 的软件包管理器 `yum` 结合 `--nogpgcheck` 标志运行时，YUM 软件包管理器会跳过检查软件包上的 GPG 签名。有关更多信息，请参阅 Man7 网站上的 [yum(8)](https://man7.org/linux/man-pages/man8/yum.8.html)。

**`curl ––insecure, curl –k`**  
 当 `curl` 结合 `--insecure` 或 `-k` 标志运行时，将禁用 TLS 证书验证。默认情况下，在进行传输之前，`curl` 建立的每个安全连接都要经过安全验证。此选项会让 `curl` 跳过验证步骤，无需检查即可继续操作。有关更多信息，请参阅 Curl 网站上的以下 [Curl 手册页](https://curl.se/docs/manpage.html#-k)：

**`wget ––no-check-certificate`**  
 当 `wget` 结合 `--no-check-certificate` 标志运行时，将禁用 TLS 证书验证。有关更多信息，请参阅 GNU 网站上的以下 [Wget 手册页](https://www.gnu.org/software/wget/manual/wget.html#index-SSL-certificate_002c-check)：

### 对容器内操作系统程序包数据库进行移除检查
<a name="w2aac39c13b9c23"></a>

**注意**  
 此检查的严重性评级为**信息**。

 移除操作系统程序包数据库会降低扫描容器映像的软件完整清单的能力。在执行容器构建步骤期间，这些数据库应保持不变。

 以下程序包管理器支持对操作系统程序包数据库进行移除检查：

**Alpine Package Keeper（APK）**  
 利用已安装软件的 APK 程序包管理器的容器映像必须确保在构建期间不会移除 APK 系统文件。有关更多信息，请参阅 Arch Linux 网站上的 [APK 手册页](https://man.archlinux.org/man/apk.8.en#System_files)系统文件文档。

**Debian Package Manager（DPKG）**  
 利用 DPKG 程序包管理器的容器（例如基于 Debian、Ubuntu 或 Distroless 的映像）必须确保在容器构建期间不会移除 DPKG 数据库。有关更多信息，请参阅 Ubuntu 网站上的 [DPKG 手册页](https://manpages.ubuntu.com/manpages/trusty/man1/dpkg.1.html#files)系统文件文档。

**RPM Package Manager（RPM）**  
 利用 RPM 包管理器（yum/dnf）的容器（例如 Amazon Linux 或 Red Hat Enterprise Linux）必须确保在构建容器期间不会移除 RPM 数据库。有关更多信息，请参阅 RPM 网站上的 [RPM 手册页](https://rpm-software-management.github.io/rpm/man/rpm-common.8#FILES)系统文件文档。