INTEGRITY Документация

Интеграция с AWS

В этом руководстве описано, как настроить для каждого имени хоста authenticated origin pulls для безопасного подключения к AWS Application Load Balancer с использованием проверка mutual TLS.

Перед началом работы

1. Создание пользовательского сертификата

  1. Выполните следующую команду, чтобы создать закрытый ключ RSA длиной 4096 бит с шифрованием AES-256. Введите кодовую фразу, когда будет предложено.
openssl genrsa -aes256 -out rootca.key 4096
  1. Создайте корневой сертификат CA. При появлении запроса укажите информацию, которая должна быть включена в сертификат. Для поля Common Name поле используйте в качестве значения имя домена, а не имя хоста.
openssl req -x509 -new -nodes -key rootca.key -sha256 -days 1826 -out rootca.crt
  1. Создайте запрос на подпись сертификата (CSR). При появлении запроса укажите информацию, которая должна быть включена в запрос. Для поля Common Name поле используйте в качестве значения имя хоста.
openssl req -new -nodes -out cert.csr -newkey rsa:4096 -keyout cert.key
  1. Подпишите сертификат с помощью rootca.key и rootca.crt созданные на предыдущих шагах.
openssl x509 -req -in cert.csr -CA rootca.crt -CAkey rootca.key -CAcreateserial -out cert.crt -days 730 -sha256 -extfile ./cert.v3.ext
  1. Убедитесь, что файл расширений сертификата cert.v3.ext указывает следующее:
basicConstraints=CA:FALSE

2. Настройка AWS Application Load Balancer

  1. Загрузите rootca.cert к Бакет S3.
  2. Создание хранилища доверенных сертификатов в консоли EC2, указав S3 URI куда вы загрузили сертификат.
  3. Создайте инстанс EC2 и установите демон HTTPD. Выберите тип инстанса в соответствии с вашими потребностями: это может быть минимальный экземпляр, имеющий право на AWS Free Tier. Это руководство основано на примере с использованием t2.micro и Amazon Linux 2023.
sudo yum install -y httpd
sudo systemctl start httpd
  1. Создайте целевая группа для вашего Application Load Balancer.
    • Выберите Экземпляры в качестве целевого типа.
    • Укажите порт HTTP/80.
  2. После завершения настройки целевой группы убедитесь, что целевая группа является исправен.
  3. Настройка балансировщика нагрузки и listener.
    • Выберите Обращённый в интернет схема.
    • Переключите прослушиватель на порт 443 чтобы mTLS опция доступна, и выберите целевую группу, созданную на предыдущих шагах.
    • Для Серверный SSL/TLS-сертификат по умолчанию, выберите Импорт сертификата > Импорт в ACM, и добавьте закрытый ключ и тело сертификата.
    • В разделе Обработка клиентских сертификатов, выберите Проверить по хранилищу доверия.
  4. Сохраните настройки.
  5. (Необязательно) Выполните следующие команды, чтобы убедиться, что Application Load Balancing запрашивает клиентский сертификат.
openssl s_client -verify 5 -connect <your-application-load-balancer>:443 -quiet -state

Поскольку вы ещё не загрузили сертификат в Cloudflare, соединение должно завершиться ошибкой (read:errno=54, например).

Вы также можете выполнить curl --verbose и подтвердите Request CERT (13) присутствует в процессе SSL/TLS-рукопожатия:

curl --verbose https://<your-application-load-balancer>
...
* TLSv1.2 (IN), TLS handshake, Request CERT (13):
...

3. Настройте Cloudflare

  1. Загрузите сертификат который вы создали в Шаг 1 в Cloudflare. Следует использовать конечный сертификат, а не корневой CA.
MYCERT="$(cat cert.crt|perl -pe 's/\r?\n/\\n/'|sed -e 's/..$//')"
MYKEY="$(cat cert.key|perl -pe 's/\r?\n/\\n/'|sed -e's/..$//')"

request_body=$(< <(cat <<EOF
{
"certificate": "$MYCERT",
"private_key": "$MYKEY",
"bundle_method":"ubiquitous"
}
EOF
))

# Push the certificate

curl --silent \
"https://api.cloudflare.com/client/v4/zones/$ZONEID/origin_tls_client_auth/hostnames/certificates" \
--header "Content-Type: application/json" \
--header "X-Auth-Email: $MYAUTHEMAIL" \
--header "X-Auth-Key: $MYAUTHKEY" \
--data "$request_body"
  1. Привяжите сертификат к имени хоста которым следует его использовать.

Необходимые разрешения API-токена

Хотя бы одно из следующих права доступа токена требуется:
Включение или отключение имени хоста для аутентификации клиента
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames" \
	--request PUT \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"config": [
				{
						"enabled": true,
						"cert_id": "<CERT_ID>",
						"hostname": "<YOUR_HOSTNAME>"
				}
		]
	}'

Откат конфигурации Cloudflare

  1. Используйте PUT запрос чтобы отключить Authenticated Origin Pulls для этого имени хоста.

    Необходимые разрешения API-токена

    Хотя бы одно из следующих права доступа токена требуется:
    • SSL and Certificates Write
    Включение или отключение имени хоста для аутентификации клиента
    curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames" \
    	--request PUT \
    	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    	--json '{
    		"config": [
    				{
    						"enabled": false,
    						"cert_id": "<CERT_ID>",
    						"hostname": "<YOUR_HOSTNAME>"
    				}
    		]
    	}'
  2. (Необязательно) Используйте GET запрос чтобы получить список идентификаторов клиентских сертификатов. ID сертификата, который нужно удалить, понадобится вам на следующем шаге.

    Необходимые разрешения API-токена

    Хотя бы одно из следующих права доступа токена требуется:
    • SSL and Certificates Write
    • SSL and Certificates Read
    Список сертификатов
    curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames/certificates" \
    	--request GET \
    	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
  3. Используйте Удаление клиентского сертификата хоста конечную точку, чтобы удалить загруженный вами сертификат.

    Необходимые разрешения API-токена

    Хотя бы одно из следующих права доступа токена требуется:
    • SSL and Certificates Write
    Delete Hostname Client Certificate
    curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/origin_tls_client_auth/hostnames/certificates/$CERTIFICATE_ID" \
    	--request DELETE \
    	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"