

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 網站中的[使用者](https://docs.docker.com/build/building/best-practices/#user)。如果您的使用案例需要與 Sudo 二進位套件類似的功能，建議使用 [Gosu](https://github.com/tianon/gosu)。

### Debian APT 公用程式
<a name="w2aac39c13b9c13"></a>

**注意**  
 此檢查的嚴重性評分為**高**。

 以下是使用 APT Debian 公用程式的最佳實務。

**在單一`Run`陳述式中結合`apt-get`命令以避免快取問題**  
 我們建議您在 Docker 容器內的單一 RUN 陳述式中結合`apt-get`命令。`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 網站中的[指令碼用量和與其他 APT 工具的差異](https://manpages.debian.org/stretch/apt/apt.8.en.html#SCRIPT_USAGE_AND_DIFFERENCES_FROM_OTHER_APT_TOOLS)。

### 硬式編碼秘密
<a name="w2aac39c13b9c15"></a>

**注意**  
 此檢查的嚴重性評分為**關鍵**。

 Dockerfile 中的機密資訊會被視為硬式編碼的秘密。下列硬式編碼秘密可透過 Sbomgen Docker 檔案檢查來識別：
+  AWS 存取金鑰 IDs – `AKIAIOSFODNN7EXAMPLE` 
+  AWS 私密金鑰 – `wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY` 
+  DockerHub 個人存取字符 – `dckr_pat_thisisa27charexample1234567` 
+  GitHub 個人存取字符 – `ghp_examplev61wY7Pj1YnotrealUoY123456789` 
+  GitLab 個人存取字符 – `glpat-12345example12345678` 

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

**注意**  
 此檢查的嚴重性標記是**資訊**。

 我們建議您在沒有根權限的情況下執行 Docker 容器。對於在沒有根權限的情況下無法執行的容器化工作負載，我們建議您使用權限最低的原則來建置應用程式。如需詳細資訊，請參閱 Docker Docs 網站中的[使用者](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 網站中的[環境變數](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) 公用程式會連線至 NPM 登錄檔，而不驗證 TLS 憑證。如需詳細資訊，請參閱 npm Docs 網站中的 [strict-ssl](https://docs.npmjs.com/cli/v10/using-npm/config#strict-ssl)。

### 執行期弱化命令旗標
<a name="w2aac39c13b9c21"></a>

**注意**  
 此檢查的嚴重性評分為**高**。

 與執行時間弱化環境變數類似，數個命令列公用程式或程式設計語言執行時間支援繞過安全預設值，這允許透過不安全的方法執行。

**`npm ––strict-ssl=false`**  
 使用 `--strict-ssl=false`旗標執行 Node.js npm 命令列程序時，Node Package Manager (npm) 公用程式會連線至 NPM 登錄檔，而不驗證 TLS 憑證。如需詳細資訊，請參閱 npm Docs 網站中的 [strict-ssl](https://docs.npmjs.com/cli/v10/using-npm/config#strict-ssl)。

**`apk ––allow-untrusted`**  
 使用 `--allow-untrusted`旗標執行Alpine Package Keeper公用程式時， `apk`會安裝沒有或不受信任簽章的套件。如需詳細資訊，請參閱 Apline 網站上的[下列儲存庫](https://gitlab.alpinelinux.org/alpine/apk-tools/-/blob/f9eaeb6429325eeb5a17ed771fd477be9227fe15/doc/apk.8.scd#L114-115)。

**`apt-get ––allow-unauthenticated`**  
 使用 `--allow-unauthenticated`旗標執行 Debian `apt-get`套件公用程式時， `apt-get`不會檢查套件有效性。如需詳細資訊，請參閱 Debian 網站上的 [APT-Get(8)](https://manpages.debian.org/stretch/apt/apt-get.8.en.html)。

**`pip ––trusted-host`**  
 使用 `--trusted-host`旗標執行 Python pip 公用程式時，指定的主機名稱會略過 TLS 憑證驗證。如需詳細資訊，請參閱 Pip 網站上的 [--trusted-host](https://pip.pypa.io/en/stable/cli/pip/#cmdoption-trusted-host)。

**`rpm ––nodigest, ––nosignature, ––noverify, ––nofiledigest`**  
 當以 RPM 為基礎的套件管理員使用 `--nodigest`、`--noverify`、 `--nosignature`和 `--nofiledigest`旗標`rpm`執行時，RPM 套件管理員不會在安裝套件時驗證套件標頭、簽章或檔案。如需詳細資訊，請參閱 [RPM 網站上的下列 RPM 手動頁面](https://rpm-software-management.github.io/rpm/man/)。

**`yum-config-manager ––setopt=sslverify false`**  
 當以 RPM 為基礎的套件管理員在`--setopt=sslverify`旗標設定為 false `yum-config-manager`的情況下執行時，YUM 套件管理員不會驗證 TLS 憑證。如需詳細資訊，請參閱 Man7 網站的下列 [YUM 手動頁面](https://man7.org/linux/man-pages/man5/yum.conf.5.html)。

**`yum ––nogpgcheck`**  
 使用 `--nogpgcheck`旗標`yum`執行 RPM 型套件管理員時，YUM 套件管理員會略過檢查套件上的 GPG 簽章。如需詳細資訊，請參閱 Man7 網站上的 [yum(8)](https://man7.org/linux/man-pages/man8/yum.8.html)。

**`curl ––insecure, curl –k`**  
 使用 `--insecure`或 `-k`旗標執行 `curl` 時，會停用 TLS 憑證驗證。根據預設，`curl`在進行傳輸之前，會驗證 的每個安全連線都是安全的。此選項可讓 `curl` 略過驗證步驟，並在不檢查的情況下繼續。如需詳細資訊，請參閱 [Curl 網站上的下列 Curl 手動頁面](https://curl.se/docs/manpage.html#-k)。

**`wget ––no-check-certificate`**  
 使用 `--no-check-certificate`旗標執行 `wget` 時，會停用 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 Package Manager (yum/dnf) 的容器，例如 Amazon Linux 或 Red Hat Enterprise Linux，必須確保在容器建置期間不會移除 RPM 資料庫。如需詳細資訊，請參閱 [RPM 網站上的 RPM 手冊](https://rpm-software-management.github.io/rpm/man/rpm-common.8#FILES)系統檔案文件。