

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

# 使用 cert-manager 和 Let's Encrypt 為 Amazon EKS 上的應用程式設定end-to-end加密
<a name="set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt"></a>

*Mahendra Revanasiddappa 和 Vasanth Jeyaraj，Amazon Web Services*

## 總結
<a name="set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt-summary"></a>

實作end-to-end加密可能很複雜，您需要管理微服務架構中每個資產的憑證。雖然您可以使用 Network Load Balancer 或 Amazon API Gateway 在 Amazon Web Services (AWS) 網路的邊緣終止 Transport Layer Security (TLS) 連線，但某些組織需要end-to-end加密。

此模式使用 NGINX 傳入控制器進行傳入。這是因為當您建立 Kubernetes 輸入時，輸入資源會使用 Network Load Balancer。Network Load Balancer 不允許上傳用戶端憑證。因此，您無法透過 Kubernetes 輸入實現交互 TLS。

此模式適用於在其應用程式中的所有微服務之間需要交互身分驗證的組織。相互 TLS 可減少維護使用者名稱或密碼的負擔，也可以使用統包安全架構。如果您的組織有大量連線裝置，或必須符合嚴格的安全準則，則此模式的方法是相容的。

此模式透過為在 Amazon Elastic Kubernetes Service (Amazon EKS) 上執行的應用程式實作end-to-end加密，協助提高組織的安全狀態。此模式在 Amazon EKS 儲存庫上的 GitHub 端對端加密中提供範例應用程式和程式碼，以顯示微服務如何在 Amazon EKS 上使用end-to-end加密來執行。 [End-to-end ](https://github.com/aws-samples/end-to-end-encryption-on-amazon-eks#readme) 模式的方法使用 [cert-manager](https://cert-manager.io/docs/)，這是 Kubernetes 的附加元件，並以 [Let's Encrypt](https://letsencrypt.org/) 做為憑證授權單位 (CA)。Let's Encrypt 是一種經濟實惠的解決方案，可用來管理憑證，並提供 90 天內有效的免費憑證。在 Amazon EKS 上部署新的微服務時，Cert-manager 會自動化隨需佈建和輪換憑證。 

**目標對象**

對於具有 Kubernetes、TLS、Amazon Route 53 和網域名稱系統 (DNS) 經驗的使用者，建議使用此模式。

## 先決條件和限制
<a name="set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ 現有 Amazon EKS 叢集。
+ 在 macOS、Linux 或 Windows 上安裝和設定 AWS Command Line Interface (AWS CLI) 1.7 版或更新版本。
+ `kubectl` 命令列公用程式，已安裝並設定為存取 Amazon EKS 叢集。如需詳細資訊，請參閱 Amazon EKS 文件中的[安裝 kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)。
+ 用來測試應用程式的現有 DNS 名稱。如需詳細資訊，請參閱[《Amazon Route 53 文件》中的使用 Amazon Route 53 註冊網域名稱](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/registrar.html)。 Amazon Route 53  
+ 安裝在本機電腦上的最新 [Helm](https://docs.aws.amazon.com/eks/latest/userguide/helm.html) 版本。如需詳細資訊，請參閱 [Amazon EKS 文件和 GitHub Helm 儲存庫](https://docs.aws.amazon.com/eks/latest/userguide/helm.html)中的搭配使用 [Helm](https://github.com/helm/helm) 與 Amazon EKS。 GitHub  
+ Amazon EKS 儲存庫上的 GitHub 端對端加密，複製到您的本機電腦。 [End-to-end ](https://github.com/aws-samples/end-to-end-encryption-on-amazon-eks#readme)  
+ 從 Amazon EKS 儲存庫上複製的 GitHub 端對端加密取代 `policy.json`和 `trustpolicy.json` 檔案中的下列值： [End-to-end ](https://github.com/aws-samples/end-to-end-encryption-on-amazon-eks#readme) 
  + `<account number>` – 將 取代為您要部署解決方案之帳戶的 AWS 帳戶 ID。 
  + `<zone id>` – 將 取代為網域名稱的 Route 53 區域 ID。 
  + `<node_group_role>` – 將 取代為與 Amazon EKS 節點相關聯的 AWS Identity and Access Management (IAM) 角色名稱。
  + `<namespace>` – 將 取代為您部署 NGINX 傳入控制器和範例應用程式的 Kubernetes 命名空間。
  + `<application-domain-name>` – 將 取代為來自 Route 53 的 DNS 網域名稱。

**限制**
+ 此模式不會描述如何輪換憑證，只會示範如何在 Amazon EKS 上使用微服務憑證。 

## Architecture
<a name="set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt-architecture"></a>

下圖顯示此模式的工作流程和架構元件。

![使用 cert-manager 和 Let's Encrypt 在 Amazon EKS 上設定應用程式加密的工作流程。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/9aa3ee9e-73db-41f5-a467-b5c47fef496e/images/40692ede-6fb3-474e-8c9e-85c51529e8ad.png)


該圖顯示以下工作流程：

1. 用戶端傳送存取應用程式至 DNS 名稱的請求。

1. Route 53 記錄是 Network Load Balancer 的 CNAME。

1. Network Load Balancer 會將請求轉送至使用 TLS 接聽程式設定的 NGINX 傳入控制器。NGINX 傳入控制器與 Network Load Balancer 之間的通訊遵循 HTTPS 通訊協定。

1. NGINX 傳入控制器會根據用戶端對應用程式服務的請求，執行以路徑為基礎的路由。

1. 應用程式服務會將請求轉送至應用程式 Pod。應用程式旨在透過呼叫秘密來使用相同的憑證。

1. Pod 會使用 cert-manager 憑證執行範例應用程式。NGINX 傳入控制器與 Pod 之間的通訊使用 HTTPS。


| 
| 
| 注意：Cert-manager 會在自己的命名空間中執行。它使用 Kubernetes 叢集角色將憑證佈建為特定命名空間中的秘密。您可以將這些命名空間連接至應用程式 Pod 和 NGINX 傳入控制器。 | 
| --- |

## 工具
<a name="set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt-tools"></a>

**AWS 服務**
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) 是一種受管服務，可用來在 AWS 上執行 Kubernetes，而不需要安裝、操作和維護您自己的 Kubernetes 控制平面或節點。
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 會自動將您的傳入流量分配到多個目標、容器和 IP 地址。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 可透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一種可用性高、可擴展性強的 DNS Web 服務。

**其他工具**
+ [cert-manager](https://cert-manager.io/docs/installation/supported-releases/) 是 Kubernetes 的附加元件，可請求憑證、將憑證分發至 Kubernetes 容器，以及自動化憑證續約。
+ [NGINX 輸入控制器](https://kubernetes.github.io/ingress-nginx/)是 Kubernetes 和容器化環境中雲端原生應用程式的流量管理解決方案。

## 史詩
<a name="set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt-epics"></a>

### 使用 Route 53 建立和設定公有託管區域
<a name="create-and-configure-a-public-hosted-zone-with-route-53"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在 Route 53 中建立公有託管區域。 | 登入 AWS 管理主控台，開啟 Amazon Route 53 主控台，選擇**託管區域**，然後選擇**建立託管區域**。建立公有託管區域並記錄區域 ID。如需詳細資訊，請參閱 Amazon Route 53 文件中的[建立公有託管區域](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/CreatingHostedZone.html)。ACME DNS01 使用 DNS 提供者發佈挑戰，讓 cert-manager 發行憑證。此挑戰要求您證明控制網域名稱的 DNS，方法是將特定值放在該網域名稱下的 TXT 記錄中。在 Let's Encrypt 為您的 ACME 用戶端提供字符之後，您的用戶端會建立衍生自該字符和您帳戶金鑰的 TXT 記錄，並將該記錄放在 `_acme-challenge.<YOURDOMAIN>`。然後，讓我們加密查詢該記錄的 DNS。如果找到相符項目，您可以繼續發出憑證。 | AWS DevOps | 

### 設定 IAM 角色以允許 cert-manager 存取公有託管區域
<a name="configure-an-iam-role-to-allow-cert-manager-to-access-the-public-hosted-zone"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 cert-manager 的 IAM 政策。 | 需要 IAM 政策才能為 cert-manager 提供許可，以驗證您擁有 Route 53 網域。`policy.json` 範例 IAM 政策會在 Amazon EKS 儲存庫上複製的 GitHub 端對端加密的 `1-IAMRole`目錄中提供。 [End-to-end ](https://github.com/aws-samples/end-to-end-encryption-on-amazon-eks#readme) <br />在 AWS CLI 中輸入下列命令來建立 IAM 政策。<pre>aws iam create-policy \<br />  --policy-name PolicyForCertManager \<br />  --policy-document file://policy.json</pre> | AWS DevOps | 
| 建立 cert-manager 的 IAM 角色。 | 建立 IAM 政策後，您必須建立 IAM 角色。`trustpolicy.json` 範例 IAM 角色在 `1-IAMRole`目錄中提供。<br />在 AWS CLI 中輸入下列命令來建立 IAM 角色。<pre>aws iam create-role \<br />  --role-name RoleForCertManager \<br />  --assume-role-policy-document file://trustpolicy.json</pre> | AWS DevOps | 
| 將政策連接到角色。 | 在 AWS CLI 中輸入下列命令，將 IAM 政策連接至 IAM 角色。`AWS_ACCOUNT_ID` 將 取代為您 AWS 帳戶的 ID。<pre>aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/PolicyForCertManager \<br />  --role-name RoleForCertManager</pre> | AWS DevOps | 

### 在 Amazon EKS 中設定 NGINX 傳入控制器
<a name="set-up-the-nginx-ingress-controller-in-amazon-eks"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 NGINX 傳入控制器。 | `nginx-ingress` 使用 Helm 安裝最新版本的 。您可以在部署組態之前，根據您的需求修改`nginx-ingress`組態。此模式使用註釋且面向內部的 Network Load Balancer，該模式可在 `5-Nginx-Ingress-Controller`目錄中使用。 <br />從 `5-Nginx-Ingress-Controller`目錄執行下列 Helm 命令來安裝 NGINX 傳入控制器。<br />`helm install test-nginx nginx-stable/nginx-ingress  -f  5-Nginx-Ingress-Controller/values_internal_nlb.yaml` | AWS DevOps | 
| 確認已安裝 NGINX 傳入控制器。 | 輸入 `helm list` 命令。輸出應會顯示已安裝 NGINX 傳入控制器。 | AWS DevOps | 
| 建立 Route 53 A 記錄。 | A 記錄指向 NGINX 傳入控制器建立的 Network Load Balancer。[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt.html) | AWS DevOps | 

### 在 Amazon EKS 上設定 NGINX VirtualServer
<a name="set-up-nginx-virtualserver-on-amazon-eks"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 NGINX VirtualServer。 | NGINX VirtualServer 資源是一種負載平衡組態，是輸入資源的替代方案。建立 NGINX VirtualServer 資源的組態可在 `6-Nginx-Virtual-Server`目錄中的 `nginx_virtualserver.yaml` 檔案中取得。在 中輸入下列命令`kubectl`以建立 NGINX VirtualServer 資源。<br />`kubectl apply -f  nginx_virtualserver.yaml`請務必更新 `nginx_virtualserver.yaml` 檔案中的應用程式網域名稱、憑證秘密和應用程式服務名稱。 | AWS DevOps | 
| 確認已建立 NGINX VirtualServer。 | 在 中輸入下列命令`kubectl`，以確認已成功建立 NGINX VirtualServer 資源。<br />`kubectl get virtualserver`確認資料`Host`欄符合您應用程式的網域名稱。 | AWS DevOps | 
| 部署已啟用 TLS 的 NGINX Web 伺服器。 | 此模式使用已啟用 TLS 的 NGINX Web 伺服器做為應用程式，以測試end-to-end加密。部署測試應用程式所需的組態檔案可在 `demo-webserver`目錄中取得。 <br />在 中輸入下列命令`kubectl`以部署測試應用程式。<br />`kubectl apply -f nginx-tls-ap.yaml` | AWS DevOps | 
| 確認測試應用程式資源已建立。 | 在 中輸入下列命令`kubectl`，以確認已建立測試應用程式所需的資源：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt.html) | AWS DevOps | 
| 驗證應用程式。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt.html) | AWS DevOps | 

## 相關資源
<a name="set-up-end-to-end-encryption-for-applications-on-amazon-eks-using-cert-manager-and-let-s-encrypt-resources"></a>

**AWS 資源**
+ [使用 Amazon Route 53 主控台建立記錄](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating.html) (Amazon Route 53 文件）
+ [在 Amazon EKS 上使用 Network Load Balancer 搭配 NGINX 輸入控制器 ](https://aws.amazon.com/blogs/opensource/network-load-balancer-nginx-ingress-controller-eks/)(AWS 部落格文章）

**其他資源**
+ [Route 53](https://cert-manager.io/docs/configuration/acme/dns01/route53/) (cert-manager 文件）
+ [設定 DNS01 挑戰提供者](https://cert-manager.io/docs/configuration/acme/dns01/) （憑證管理員文件）
+ [讓我們加密 DNS 挑戰](https://letsencrypt.org/docs/challenge-types/#dns-01-challenge) （讓我們的加密文件）