ApacheでACM for Nitro Enclavesを使用する手順

インスタンスの用意

まず、EC2のインスタンスを用意します。インスタンスタイプに指定があるので、こちらを参考にしてください。 高度な設定にあるNitro Enclaveを有効化することを忘れないようにしてください。

また、すでにあるインスタンスでも条件を満たしていれば可能です。作成したあとでも、アクション→インスタンスの設定から指定のインスタンスタイプとNitro Enclaveを有効化することで利用可能になります。

IAMロールの作成

インスタンスに設定するためのIAMロールを作成します。

信頼関係は以下のようにします。以下の設定で作成できたら、インスタンスに割り当ててください。 新しくインスタンスを作成する場合、IAMロールを作ってからインスタンスを作成する方が手間が省けます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

作成したロールのARNは今後必要になるので、どこかにメモしておくといいでしょう。

ドメイン

まず、Route53にホストゾーンがある前提で話を進めます。 サブドメインを作ったら、ACMで証明書を発行します。

なかなか発行されない場合は、CNAMEが登録されているか確認してみてください。

なお、ACMの証明書はワイルドカードのドメインでも大丈夫です。

ACMのARNも今後必要になります。

IAMロールとACMの紐付け

ここはCloudShellで作業します。プロファイル設定を済ませておきましょう。

できたら、以下のコマンドを実行します。

aws ec2 --region ap-northeast-1 associate-enclave-certificate-iam-role --certificate-arn {ACMのARN} --role-arn {IAMロールのARN}

末尾に--profile {プロファイル名}を追加することで、プロファイルを指定することができます。追加しなければデフォルトのプロファイルが使用されます。

実行に成功すると以下のような出力が返されます。(実際の値は省略)

{
    "CertificateS3BucketName": "",
    "CertificateS3ObjectKey": "",
    "EncryptionKmsKeyId": ""
}

ここの値もメモしたら、次に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": "{IAMロールのARN}"
    }
  ]
}

以上の操作ができたら、インスタンスを再起動してください。

インスタンス内での操作

以下のコマンドで必要なもの(Nitro CLI、Apache、ACM for Nitro Enclaves)をインストール・有効化します。

$ sudo amazon-linux-extras enable aws-nitro-enclaves-cli
$ sudo yum install httpd mod_ssl -y
$ sudo yum install aws-nitro-enclaves-acm -y

Apacheの設定

とくに言うことはないですが、まずはいつも通りの設定をしていただければと思います。{ドメイン}.conf等が主流だと思いますが、後述する設定ファイルのデフォルトだとhttpd-acm.confになっています。

公式では以下の設定が書いてありますので、参考にしてみてください。ここのkeyやcrtのpathは後で勝手に書き変わります。

インデントを開けるとうまく置き換わらないので注意が必要です。

<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>

ACM for Nitro Enclavesの設定

以下のコマンドのように、設定ファイルをコピーする。

$ sudo cp /etc/nitro_enclaves/acm-httpd.example.yaml /etc/nitro_enclaves/acm.yaml

次に、設定ファイルの以下の部分を自分のものに編集する。

- label: httpd-acm-token
    # Configure a managed token, sourced from an ACM certificate.
    source:
      Acm:
        # The certificate ARN
        # Note: this certificate must have been associated with the
        #       IAM role assigned to the instance on which ACM for
        #       Nitro Enclaves is run.
        certificate_arn: "{ACMのARN}"
    target:
      Conf:
        # Path to the server configuration file to be written by
        # the ACM service whenever the certificate configuration changes
        # (e.g. after a certificate renewal). The SSLCertificateKeyFile and
        # optionally the SSLCertificateFile directives shall be populated.
        path: /etc/httpd/conf.d/httpd-acm.conf
        # Configuration file owner (i.e. the user httpd is configured to run as).
        user: apache
    # Attestation period (seconds)
    refresh_interval_secs: 43200

labelのところはなんでも大丈夫です。また、configのpathも先ほど作成したようにに変えてください。

また、この要素を複数記述することも可能です。(実際のファイルのコメントアウト参照)

起動

以上が設定できたら、各サービスを起動します。

# 起動
$ sudo systemctl start nitro-enclaves-acm
$ sudo systemctl start httpd

# 自動起動有効化
$ sudo systemctl enable nitro-enclaves-acm
$ sudo systemctl enable httpd

# 再起動
$ sudo systemctl restart nitro-enclaves-acm
$ sudo systemctl restart httpd

# 状態確認
$ sudo systemctl status nitro-enclaves-acm
$ sudo systemctl status httpd

先ほど書いたconfの中が変わっていたら成功です。 アクセスすると、Amazon発行の証明書が適用されていることが確認できます。 うまく反映されない場合はインスタンスの再起動を試してみてください。

ちなみに、nitro-enclaves-acmが動くとファイルの所有者がapacheに変わります。

さらに-r--r-----になり書き込み権限がなくなるので、修正を行いたい場合にはchmodでいちいち変える必要があります。

うまくいかない場合はログを見てどこでつまづいているのか確認して、修正してください。

以上がApacheでACM for Nitro Enclavesを使う手順になります。

公式の記事も参考にしてみてください。

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