

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EKS で実行されているアプリケーションの相互 TLS 認証を設定する
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks"></a>

*Mahendra Revanasiddappa (Amazon Web Services)*

## 概要
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-summary"></a>

証明書ベースの相互 Transport Layer Security (TLS) は、サーバーとクライアント間の双方向ピア認証を提供するオプションの TLS コンポーネントです。相互 TLS では、クライアントはセッションネゴシエーションプロセス中に X.509 証明書を提供する必要があります。サーバーは、この証明書を使用してクライアントを識別し、認証します。

相互 TLS は、モノのインターネット (IoT) アプリケーションの一般的な要件であり、企業間 (B2B) アプリケーションや[オープンバンキング](https://docs.aws.amazon.com/wellarchitected/latest/financial-services-industry-lens/open-banking.html)などの標準に使用できます。

このパターンでは、NGINX Ingress Controller を使用して Amazon Elastic Kubernetes Service (Amazon EKS) クラスターで実行されているアプリケーションの相互 TLS を設定する方法を説明します。イングレスリソースに注釈を付けることで、NGINX イングレスコントローラーのビルトイン相互 TLS 機能を有効にできます。NGINX コントローラーの相互 TLS アノテーションについて詳しくは、Kubernetes ドキュメントの「[クライアント証明書認証](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#client-certificate-authentication)」を参照してください。

**重要**  
このパターンでは、自己署名証明書を使用します。このパターンはテストクラスターでのみ使用し、本番環境では使用しないことをお勧めします。このパターンを本番環境で使用する場合は、「[AWS Private Certificate Authority (AWS Private CA) (AWS Private CA)](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)」または既存のパブリックキーインフラストラクチャ (PKI) 標準を使用してプライベート証明書を発行できます。

## 前提条件と制限事項
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-prereqs"></a>

**前提条件**
+ アクティブな Amazon Web Services (AWS)アカウント。
+ 既存の Amazon EKS クラスター。
+ AWS コマンドラインインターフェイス(AWS CLI) バージョン 1.7 以降。macOS、Linux、または Windows にインストールされ、設定されている。
+ Amazon EKS クラスターにアクセスするためにインストールして設定した kubectl コマンドラインユーティリティ。詳細については、Amazon EKS ドキュメントの「[kubectl のインストール](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)」を参照してください。
+ アプリケーションをテストするための既存のドメインネームシステム (DNS) 名。

**制限事項**
+ このパターンでは、自己署名証明書を使用します。このパターンはテストクラスターでのみ使用し、本番環境では使用しないことをお勧めします。

## アーキテクチャ
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-architecture"></a>

![Amazon EKS で実行されているアプリケーションの相互 TLS 認証の設定](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/ae2761e3-7ed2-4c2a-ba54-a4ddce8a1e7e/images/cefc60f9-2f29-4052-b7ae-df4eb6395e1c.png)


テクノロジースタック
+ Amazon EKS
+ Amazon Route 53
+ kubectl

## ツール
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-tools"></a>
+ 「[Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)」は、AWS で Kubernetes を実行する際に役立ち、独自の Kubernetes コントロールプレーンまたはノードをインストールまたは維持する必要はありません。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) は、高可用性でスケーラブルな DNS Web サービスです。
+ 「[Kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)」は、Amazon EKS クラスターを操作するために使用するコマンドラインユーティリティです。

## エピック
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-epics"></a>

### 自己署名証明書を生成します
<a name="generate-the-self-signed-certificates"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  CA キーと証明書を生成します。 | 次のコマンドを実行して、証明機関 (CA) キーと証明書を生成します。<pre>openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=Test Cert Authority'</pre> | DevOps エンジニア | 
| サーバーキーと証明書を生成し、CA 証明書で署名します。 | サーバーキーと証明書を生成し、次のコマンドを実行して CA 証明書で署名します。<pre>openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN= <your_domain_name> ' && openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt</pre>`<your_domain_name>` は、必ず既存のドメイン名に置き換えてください。 | DevOps エンジニア | 
|  クライアントキーと証明書を生成し、CA 証明書で署名します。 | クライアントキーと証明書を生成し、次のコマンドを実行して CA 証明書で署名します。<pre>openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=Test' && openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt</pre> | DevOps エンジニア | 

### NGINX イングレスコントローラーをデプロイします。
<a name="deploy-the-nginx-ingress-controller"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon EKS クラスターに NGINX イングレスコントローラーをデプロイします。 | 次のコマンドを使用して、NGINX イングレスコントローラをデプロイします。<pre>kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/aws/deploy.yaml</pre> | DevOps エンジニア | 
|  NGINX Ingress Controller サービスが実行中であることを確認します。 | 以下のコマンドを使用して、NGINX イングレスコントローラサービスが実行されていることをを確認します。<pre>kubectl get svc -n ingress-nginx</pre>サービスアドレスのフィールドに Network Load Balancer のドメイン名が含まれていることを確認してください。 | DevOps エンジニア | 

### Amazon EKS クラスターにネームスペースを作成して、相互 TLS をテストします。
<a name="create-a-namespace-in-the-amazon-eks-cluster-to-test-mutual-tls"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon EKS クラスターにネームスペースを作成します。 | 次のコマンドを実行して、Amazon EKS クラスターに `mtls` という名前の名前空間を作成します。<pre>kubectl create ns mtls</pre><br />これにより、相互 TLS をテストするためのサンプルアプリケーションがデプロイされます。 | DevOps エンジニア | 

### サンプルアプリケーションのデプロイとサービスを作成します。
<a name="create-the-deployment-and-service-for-the-sample-application"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Kubernetes デプロイメントとサービスを mtls 名前空間に作成します。 | `mtls.yaml` という名前のファイルを作成します。ファイルに次のコードを貼り付けます。<pre>kind: Deployment<br />apiVersion: apps/v1<br />metadata:<br />  name: mtls-app<br />  labels:<br />    app: mtls<br />spec:<br />  replicas: 1<br />  selector:<br />    matchLabels:<br />      app: mtls<br />  template:<br />    metadata:<br />      labels:<br />        app: mtls<br />    spec:<br />      containers:<br />      - name: mtls-app<br />        image: hashicorp/http-echo<br />        args:<br />          - "-text=mTLS is working"<br /><br /><br />---<br /><br />kind: Service<br />apiVersion: v1<br />metadata:<br />  name: mtls-service<br />spec:<br />  selector:<br />    app: mtls<br />  ports:<br />    - port: 5678 # Default port for image</pre><br /> 次のコマンドを実行して、`mtls` 名前空間に Kubernetes デプロイとサービスを作成します。<pre>kubectl create -f mtls.yaml -n mtls</pre> | DevOps エンジニア | 
| Kubernetes デプロイが作成されていることを確認します。 | デプロイが作成され、1 つのポッドが使用可能になっていることを確認するには、次のコマンドを実行します。<pre>kubectl get deploy -n mtls</pre> | DevOps エンジニア | 
| Kubernetes サービスが作成されていることを確認します。 | 次のコマンドを実行して、Kubernetes サービスが作成されたことを確認します。<pre>kubectl get service -n mtls</pre> | DevOps エンジニア | 

### mtls 名前空間にシークレットを作成します。
<a name="create-a-secret-in-the-mtls-namespace"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| イングレスリソースにシークレットを作成します。 | 以下のコマンドを実行して、前に作成した証明書を使用して NGINX Ingress コントローラーのシークレットを作成します。<pre>kubectl create secret generic mtls-certs --from-file=tls.crt=server.crt --from-file=tls.key=server.key --from-file=ca.crt=ca.crt -n mtls </pre><br />シークレットには、サーバーを識別するためのクライアント用のサーバー証明書と、クライアント証明書を検証するためのサーバー用の CA 証明書があります。 | DevOps エンジニア | 

### mtls 名前空間に Ingress リソースを作成します。
<a name="create-the-ingress-resource-in-the-mtls-namespace"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| mtls 名前空間にイングレスリソースを作成します。 | `ingress.yaml` という名前のファイルを作成します。ファイルに次のコードを貼り付けます (`<your_domain_name>` を既存のドメイン名に置き換えます)。<pre>apiVersion: networking.k8s.io/v1<br />kind: Ingress<br />metadata:<br />  annotations:<br />    nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"<br />    nginx.ingress.kubernetes.io/auth-tls-secret: mtls/mtls-certs<br />  name: mtls-ingress<br />spec:<br />  ingressClassName: nginx<br />  rules:<br />  - host: "*.<your_domain_name>"<br />    http:<br />      paths:<br />      - path: /<br />        pathType: Prefix<br />        backend:<br />          service:<br />            name: mtls-service<br />            port:<br />              number: 5678<br />  tls:<br />  - hosts:<br />    - "*.<your_domain_name>"<br />    secretName: mtls-certs</pre><br />次のコマンドを実行して、`mtls` ネームスペースに Ingress リソースを作成します。<pre>kubectl create -f ingress.yaml -n mtls</pre><br />つまり、NGINX Ingress コントローラーはトラフィックをサンプルアプリケーションにルーティングできます。 | DevOps エンジニア | 
| Ingress リソースが作成されていることを確認します。 | 次のコマンドを実行して、Ingress リソースが作成されたことを確認します。<pre>kubectl get ing -n mtls</pre>Ingress リソースのアドレスに、NGINX Ingress コントローラー用に作成されたロードバランサーが表示されていることを確認してください。 | DevOps エンジニア | 

### ホスト名がロードバランサーを指すように DNS を設定します。
<a name="configure-dns-to-point-the-hostname-to-the-load-balancer"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| NGINX Ingress コントローラーのロードバランサーを指す CNAME レコードを作成します。 | AWS マネジメントコンソールにサインインし、Amazon Route 53 コンソールを開いて、NGINX イングレスコントローラーのロードバランサーに `mtls.<your_domain_name>` を指す正規名 (CNAME) レコードを作成します。<br />詳細については、Route 53 ドキュメントの「[Route 53 コンソールを使用したレコードの作成](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating.html)」を参照してください。 | DevOps エンジニア | 

### アプリケーションをテストする
<a name="test-the-application"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 証明書なしで相互 TLS セットアップをテストする。 | 以下のコマンドを実行してください。<pre>curl -k https://mtls.<your_domain_name> </pre><br />「400 必要な SSL 証明書は送信されませんでした」というエラー応答が表示されるはずです。 | DevOps エンジニア | 
| 証明書を使用して相互 TLS セットアップをテストします。 | 以下のコマンドを実行してください。<pre>curl -k https://mtls.<your_domain_name> --cert client.crt --key client.key</pre><br />「mTLS は動作しています」という応答が返されるはずです。 | DevOps エンジニア | 

## 関連リソース
<a name="configure-mutual-tls-authentication-for-applications-running-on-amazon-eks-resources"></a>
+ 「[Amazon Route 53 コンソールを使用したレコードの作成](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating.html)」
+ 「[Amazon EKS の NGINX 入力コントローラーでのNetwork Load Balancer の使用](https://aws.amazon.com/blogs/opensource/network-load-balancer-nginx-ingress-controller-eks/)」
+ 「[クライアント証明書認証](https://kubernetes.github.io/ingress-nginx/examples/auth/client-certs/)」