

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

# AL2023 中的儲存庫中繼資料簽署
<a name="repo-metadata-signing"></a>

從版本 開始`2023.11.20260406`，AL2023 儲存庫包含儲存庫中繼資料的密碼編譯簽章。每個儲存庫`repomd.xml`的檔案都隨附分離的 GPG 簽章檔案 (`repomd.xml.asc`)，您可以在下載套件之前用來驗證儲存庫中繼資料的真實性和完整性。

此簽署是現有 RPM 套件簽署 (`gpgcheck`) 的補充，可驗證個別套件。儲存庫中繼資料簽署會驗證描述儲存庫內容的中繼資料，例如可用套件的清單及其檢查總和。

套件簽署會保護每個套件。列出這些套件的中繼資料索引以其他方式僅根據 TLS 和檢查總和受信任。如果索引上沒有簽章，受損的鏡像或傳輸路徑可能會提供修改後的中繼資料，以隱藏或封鎖安全更新。儲存庫中繼資料簽署會關閉此差距，且不依賴鏡像或傳輸信任。

## 儲存庫中繼資料簽署的運作方式
<a name="repo-metadata-signing-overview"></a>

發佈 AL2023 儲存庫時，會使用AWS KMS 金鑰簽署儲存庫中繼資料 (`repomd.xml`)。產生的分離簽章 (`repomd.xml.asc`) 會與儲存庫中的中繼資料一起放置。

當您在儲存庫組態`repo_gpgcheck`中啟用 時， 會在使用儲存庫中繼資料之前，針對 GPG DNF 公有金鑰驗證`repomd.xml.asc`簽章。如果驗證失敗， 會DNF拒絕中繼資料，並且不會從該儲存庫執行套件操作。

第一次DNF驗證儲存庫的中繼資料時，它會提示您將該儲存庫的簽署金鑰匯入每個儲存庫 keyring。此提示預設為 `No`。如果您拒絕， 會DNF略過儲存庫。如需 的詳細資訊`repo_gpgcheck`，請參閱[DNF組態參考](https://dnf.readthedocs.io/en/latest/conf_ref.html)。

這是已用於套件驗證的相同金鑰，但會將其DNF存放在用於中繼資料檢查的個別 keyring 中。即使金鑰已在磁碟上，系統也會提示您進行確認。這是預期的DNF行為。

下列 AL2023 儲存庫包含簽章的中繼資料：
+ 核心儲存庫 (`amazonlinux`)
+ Kernel Livepatch 儲存庫 (`kernel-livepatch`)
+ NVIDIA 儲存庫 (`amazonlinux-nvidia`)
+ Amazon Linux 儲存庫的補充套件 (`amazonlinux-spal`)

## `gpgcheck` 和 之間的差異 `repo_gpgcheck`
<a name="repo-metadata-signing-gpgcheck-vs-repo-gpgcheck"></a>


| 設定 | 它驗證的內容 | AL2023 中的預設值 | 
| --- | --- | --- | 
| gpgcheck=1 | 在安裝之前，驗證個別 RPM 套件的 GPG 簽章。 | 已啟用 | 
| repo\_gpgcheck=1 | 在使用儲存庫之前，驗證儲存庫中繼資料 (repomd.xml) 的 GPG 簽章。 | 預設為停用。 | 

我們建議您在確認自動化已就緒之後`repo_gpgcheck`，同時啟用 `gpgcheck`和 。這會在使用前驗證儲存庫中繼資料和個別套件。啟用 之前`repo_gpgcheck`，請參閱 [在自動化中使用儲存庫中繼資料驗證](#repo-metadata-signing-automation)。

## 啟用儲存庫中繼資料驗證
<a name="repo-metadata-signing-enable"></a>

您可以透過更新個別儲存庫的組態檔案來啟用儲存庫中繼資料驗證。

**重要**  
預設不會啟用儲存庫中繼資料簽章驗證。它會保持停用狀態，直到您變更為止。啟用它之前，請確認自動化中的每個無人值守DNF命令都通過 `-y`選項。如需詳細資訊，請參閱[在自動化中使用儲存庫中繼資料驗證](#repo-metadata-signing-automation)。

### 針對特定儲存庫啟用
<a name="repo-metadata-signing-enable-per-repo"></a>

預設`/etc/yum.repos.d/`設定 中的 AL2023 儲存庫組態檔案`repo_gpgcheck=0`。若要啟用儲存庫中繼資料驗證，請在儲存庫組態`1`中將此值變更為 。例如，若要為核心儲存庫啟用它：

```
[amazonlinux]
name=Amazon Linux 2023 repository
...
gpgcheck=1
repo_gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-amazon-linux-2023
```

### 停用儲存庫中繼資料驗證
<a name="repo-metadata-signing-disable"></a>

若要返回先前的行為，`repo_gpgcheck=0`請在儲存庫組態檔案中設定 。下一個中繼資料重新整理會在沒有驗證的情況下成功。

```
[ec2-user ~]$ sudo sed -i 's/^repo_gpgcheck=1/repo_gpgcheck=0/' /etc/yum.repos.d/amazonlinux.repo
[ec2-user ~]$ sudo dnf -y makecache
```

## 驗證儲存庫中繼資料簽署是否正常運作
<a name="repo-metadata-signing-verify"></a>

啟用 後`repo_gpgcheck=1`，您可以透過清除DNF快取並重新整理中繼資料來驗證中繼資料驗證是否正常運作：

```
[ec2-user ~]$ sudo dnf clean metadata
[ec2-user ~]$ sudo dnf makecache
```

第一次DNF驗證儲存庫的中繼資料時，它會提示您匯入該儲存庫的簽署金鑰。輸入 `y` 以確認。匯入金鑰之後， 會DNF建立中繼資料快取，而不會發生錯誤。您將會看到類似下列的輸出：

```
Amazon Linux 2023 repository                    1.7 MB/s | 1.8 kB     00:00
Importing GPG key 0xD832C631:
 Userid     : "Amazon Linux <amazon-linux@amazon.com>"
 Fingerprint: B21C 50FA 44A9 9720 EAA7 2F7F E951 904A D832 C631
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-amazon-linux-2023
Is this ok [y/N]: y
Amazon Linux 2023 repository                      18 MB/s |  55 MB     00:03
Metadata cache created.
```

匯入提示預設為 `No`。如果您拒絕， 會DNF略過輸出`Ignoring repositories`中的儲存庫和報告。如果驗證失敗， 會DNF報告 GPG 簽章錯誤，而且不會建立快取。

如需全自動執行，請參閱 [在自動化中使用儲存庫中繼資料驗證](#repo-metadata-signing-automation)。

## 在自動化中使用儲存庫中繼資料驗證
<a name="repo-metadata-signing-automation"></a>

**注意**  
金鑰匯入提示預設為 `No`。全自動DNF執行無法回應提示，因此會拒絕匯入並略過儲存庫。由於 AL2023 設定 `skip_if_unavailable=True`，命令仍會以狀態 結束`0`。因此，當主機未收到套件或更新時，自動化會報告成功。此符號位於輸出`Ignoring repositories`中。

若要避免這種情況，請將 `-y`選項傳遞給每個重新整理中繼資料的全自動DNF命令，包括持續整合任務、映像和容器建置、`cloud-init`、組態管理和 Cron 任務。

```
[ec2-user ~]$ sudo dnf -y makecache
[ec2-user ~]$ sudo dnf -y check-update
[ec2-user ~]$ sudo dnf -y upgrade
```

重新整理中繼資料的命令需要 `-y`。只讀取本機快取或本機 RPM 資料庫，或使用 `-C`選項的命令，不會重新整理中繼資料，也不會提示。如需完整清單，請參閱[重新整理儲存庫中繼資料的命令](#repo-metadata-signing-command-reference)。

永久保留在您的自動化`-y`中。每個儲存庫 URL 會匯入金鑰一次，而非每個主機匯入一次。AL2023 會從鎖定版本 (`releasever`) 和AWS區域建置每個儲存庫 URL，因此作業系統版本升級或區域變更會解析為新的 URL，並再次提示。簽署金鑰不會變更；只有其 keyring 位置會變更。請勿將金鑰預先插入或預先製作為一次性修正，因為下一個版本升級或區域會再次使用新的 keyring 和提示。

執行 會`dnf clean all`清除快取的中繼資料，但不會移除相同版本中匯入的金鑰。它不會重新觸發提示。

容器映像建置需要特別注意。映像組建中的每個`RUN dnf`步驟都是無人看管的，並且 keyring 是映像檔案系統的一部分，因此它在每個新映像中開始空白。無論您執行中的主機已匯入哪些內容，建置期間都會出現提示。`-y` 傳入映像組建。

**注意**  
如果您以 Python 程式庫 (`import dnf`) DNF 的形式駕駛 ，則不會套用提示。程式庫會在沒有提示的情況下匯入金鑰，因此中繼資料會在沒有 的情況下載入`-y`。

## 重新整理儲存庫中繼資料的命令
<a name="repo-metadata-signing-command-reference"></a>

下載或重新整理儲存庫中繼資料的任何命令都會觸發金鑰匯入和提示。不會讀取本機快取或本機 RPM 資料庫的命令。選項會變更結果：例如， `repolist` `-v`會進行擷取、`--installed`保留`list`和`info`本機，`-C`或`--cacheonly`避免擷取並`--refresh`強制擷取。如有疑問，請傳遞 `-y`。


| 命令 | 重新整理中繼資料 | 
| --- | --- | 
| dnf makecache | 是 | 
| dnf check-update | 是 | 
| dnf upgrade, dnf update | 是 | 
| dnf upgrade-minimal | 是 | 
| dnf distro-sync | 是 | 
| dnf install | 是 | 
| dnf reinstall | 是 | 
| dnf downgrade | 是 | 
| dnf autoremove | 是 | 
| dnf swap | 是 | 
| dnf list （預設 或 --available) | 是 | 
| dnf info （預設 或 --available) | 是 | 
| dnf search | 是 | 
| dnf provides | 是 | 
| dnf repoquery | 是 | 
| dnf repoinfo | 是 | 
| dnf deplist | 是 | 
| dnf repository-packages | 是 | 
| dnf updateinfo | 是 | 
| dnf group （清單、資訊、安裝） | 是 | 
| dnf module （清單、資訊） | 是 | 
| dnf shell （如果其子命令擷取） | 是 | 
| dnf builddep | 是 | 
| dnf changelog | 是 | 
| dnf debuginfo-install | 是 | 
| dnf download | 是 | 
| dnf repoclosure | 是 | 
| dnf repograph | 是 | 
| dnf reposync | 是 | 
| dnf debug-dump | 是 | 
| dnf repolist -v （詳細資訊） | 是 | 
| dnf repolist （純 或 --all) | 否 | 
| dnf list --installed, dnf info --installed | 否 | 
| dnf remove, dnf erase | 否 | 
| dnf mark | 否 | 
| dnf history | 否 | 
| dnf check | 否 | 
| dnf clean | 否 | 
| dnf config-manager | 否 | 
| dnf needs-restarting | 否 | 
| dnf alias | 否 | 
| dnf help | 否 | 
| dnf repomanage | 否 | 
| dnf repodiff | 否 （錯誤，除非已命名兩個儲存庫） | 
| dnf copr | 否 | 
| dnf groups-manager | 否 | 
| dnf playground | 否 | 
| dnf debug-restore | 否 （對儲存的傾印採取行動） | 
| 具有 -C或 的任何命令 --cacheonly | 否 | 

以這種方式略過的儲存庫會在輸出`Ignoring repositories`中報告為 ，但這些命令大多數仍會以 狀態結束，`0`因為 AL2023 會設定 `skip_if_unavailable=True`。請勿只依賴結束程式碼。傳遞 ，`-y`讓金鑰匯入成功。

## 偵測略過的儲存庫
<a name="repo-metadata-signing-detect"></a>

僅結束碼不會確認驗證成功。略過的儲存庫會結束 `0`，且簽署金鑰會在任何執行匯入時持續存在，因此稍後的檢查可以在先前步驟仍然失敗時通過。請改用這兩個檢查：
+ 稽核您的自動化。確認每個中繼資料擷取DNF命令都通過 `-y`。這是讓您繼續處理下一個新儲存庫 URL 的原因。
+ 檢查 的輸出`Ignoring repositories`。下列命令會在略過儲存庫時失敗，您可以用來讓管道失敗：

```
[ec2-user ~]$ sudo dnf makecache 2>&1 | grep -q "Ignoring repositories" && { echo "repo skipped"; exit 1; }
```

## 固定版本
<a name="repo-metadata-signing-pinned"></a>

如果您鎖定 `releasever`（使用 `--releasever`、 `/etc/dnf/vars/releasever`或 `dnf.conf`) 至 之前發行的版本`2023.11.20260406`，則該版本沒有簽章檔案，且`repo_gpgcheck=1`無法重新整理儲存庫：

```
Error: Failed to download metadata for repo 'amazonlinux':
GPG verification is enabled, but GPG signature is not available...
```

固定版本不會收到超過該版本的更新。如果您鎖定，請鎖定至版本 `2023.11.20260406` 或更新版本，或設定 `repo_gpgcheck=0`。

## AL2023 儲存庫的 GPG 公有金鑰
<a name="repo-metadata-signing-gpg-keys"></a>

用於儲存庫中繼資料驗證的 GPG 公有金鑰由對應的儲存庫組態 RPMs 安裝至 `/etc/pki/rpm-gpg/`。下表列出每個儲存庫使用的公有金鑰。


| 儲存庫 | 套件簽署金鑰 | Repodata 簽署金鑰 | 在 中分佈 | 
| --- | --- | --- | --- | 
| 核心 (amazonlinux) | RPM-GPG-KEY-amazon-linux-2023 | RPM-GPG-KEY-amazon-linux-2023 | system-release | 
| Kernel Livepatch (kernel-livepatch) | RPM-GPG-KEY-amazon-linux-2023 | RPM-GPG-KEY-amazon-linux-2023 | system-release | 
| NVIDIA (amazonlinux-nvidia) | RPM-GPG-KEY-NVIDIA-D42D0685 | RPM-GPG-KEY-amazon-linux-2023-nvidia | nvidia-release | 
| SPAL (amazonlinux-spal) | RPM-GPG-KEY-amazonlinux-spal | RPM-GPG-KEY-amazonlinux-spal | spal-release | 

當您安裝對應的儲存庫組態 RPM 時，會自動安裝這些金鑰。