ACM for Nitro Enclaves が Apache HTTP ウェブサーバーのサポートを開始したので試してみる

# ACM for Nitro Enclaves が Apache HTTP ウェブサーバーのサポートを開始

https://aws.amazon.com/jp/about-aws/whats-new/2022/09/aws-certificate-manager-nitro-enclaves-supports-apache-http-webservers/


# ドキュメント

https://docs.aws.amazon.com/ja_jp/enclaves/latest/user/nitro-enclave-refapp.html


# やってみる

ドキュメントに従って試してみました。

## EC2

いずれかの方法でEC2を準備します。

a.AWS Marketplace から Nitro Enclaves AMI 用の ACM を使用する。
b.RPM パッケージを使用して Nitro Enclaves 用の ACM とウェブサーバーをインストールする。

こんかいは、b.の方法で実施します。

利用可能なインスタンスタイプを指定します。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances

![スクリーンショット 2022-09-26 19.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/4b1df18e-7f05-4065-26c3-d89d6b45dc2b.png)

Nitro Enclave を有効化します。

![スクリーンショット 2022-09-26 19.06.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e1e3d293-2aa4-85da-6f6d-ff1c48208daf.png)

SSH などで入り、Amazon Linux Extras リポジトリから Nitro Enclaves 用の ACM をインストールします。

```
# aws-nitro-enclaves-cliAmazon Linux Extras ライブラリでトピックを有効にします。
$ sudo amazon-linux-extras enable aws-nitro-enclaves-cli

# Apache と SSLモジュールをインストールします。
$ sudo yum -y install httpd mod_ssl

# Amazon Linux Extras ライブラリから Nitro Enclaves 用の ACM をインストールします。
$ sudo yum install aws-nitro-enclaves-acm -y
```

## IAM ロールを準備する

次の信頼関係を付与したIAMロールを準備します。

```json:IAMロール：信頼関係
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

IAMロールとACM証明書を紐付けます。

```json
$ aws ec2 --region ap-northeast-1 associate-enclave-certificate-iam-role --certificate-arn <certificate_ARN> --role-arn <role_ARN>

{
    "CertificateS3BucketName": "aws-ec2-enclave-certificate-ap-northeast-1-prod",
    "CertificateS3ObjectKey": "arn:aws:iam::XXXXXXXXXXXX:role/acm-role/arn:aws:acm:ap-northeast-1:XXXXXXXXXXXX:certificate/XXX-XXX-XXX-XXX",
    "EncryptionKmsKeyId": "XXX-XXX-XXX-XXX-XXX"
}
```

証明書と暗号化キーにアクセスするIAMポリシーを作成しロールに付与する。

```json:IAMポリシー：許可
{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
        "s3:GetObject"
        ],
        "Resource": ["arn:aws:s3:::<CertificateS3BucketName>/*"]
    },
    {
        "Effect": "Allow",
        "Action": [
            "kms:Decrypt"
        ],
        "Resource": "arn:aws:kms:ap-northeast-1:*:key/<EncryptionKmsKeyId>"
    },
    {
         "Effect": "Allow",
         "Action": "iam:GetRole",
         "Resource": "arn:aws:iam::<123456789012>:role/<acm-role>"
    }
  ]
}
```

EC2にIAMロールをアタッチする。

```
#インスタンスプロファイルを作成する。
$ aws iam create-instance-profile --instance-profile-name acm-instance-profile

#IAMロールにインスタンスプロファイルを追加する。
$ aws iam add-role-to-instance-profile --instance-profile-name acm-instance-profile --role-name acm-role

#EC2インスタンスにインスタンスプロファイルをアタッチする。
$ aws ec2 --region ap-northeast-1 associate-iam-instance-profile --instance-id <instance_id> --iam-instance-profile Name=acm-instance-profile
```

## Nitro Enclaves に ACM を使用するように Web サーバーを構成する

Nitro Enclaves の構成ファイルをリネームする。

```
$ sudo mv /etc/nitro_enclaves/acm-httpd.example.yaml /etc/nitro_enclaves/acm.yaml
```

リネームした構成ファイルを開き、`certificate_arn`にACM証明書のarnを記述し、保存する。

```yaml:/etc/nitro_enclaves/acm.yaml
certificate_arn:"<ACM証明書のarn>"
```

Apache HTTPサーバーのの構成ファイルを編集する。

```yaml:/etc/httpd/conf.d/httpd-acm.conf
<VirtualHost *:443>
ServerName <www.example.com>
SSLEngine on
SSLProtocol -all +TLSv1.2
SSLCertificateKeyFile "/etc/pki/tls/private/localhost.key"
SSLCertificateFile "/etc/pki/tls/certs/localhost.crt"
</VirtualHost>
```

Apache HTTP サーバーの構成ファイルをリネームする。
```
$ sudo mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/httpd-acm.conf
```

ACM for Nitro Enclaves サービスを開始し、インスタンスの起動時に自動的に開始されるようにする。

```
$ sudo systemctl start nitro-enclaves-acm.service
$ sudo systemctl enable nitro-enclaves-acm
```

テストする。

```
$ curl https://www.example.com
```