# host c-mon-vmauth-vip.example.org is1-mon-vmauth-vip.example.org has address 10.0.77.120 # dig TXT is1-mon-vmauth-vip.example.org +short "250130. dmr. VIP for is1-mon-vmauth."
20. Пример организации получения TLS-сертификата для Virtual IP (VIP) на vmauth-узлах с автообновлением
1. VIP. Добавление записей в DNS для «основного» доменного имени
1.1. Добавление записей для Virtual IP
-
Добавьте в DNS-зону A-запись для нового Virtual IP с понятным именем. Например, для двух узлов
is1-mon-vmauth0[1-2]p
выбрано имя объединённое имяis1-mon-vmauth-vip
. -
Добавьте в DNS-зону TXT-запись с датой, своим логином, кратким описанием цели создания этого IP, заключёнными в кавычки: "250304. dmr. VIP for is1-mon-vmauth.example.org"
-
Добавьте в DNS-зону PTR-запись, соответствующую ранее добавленной A-записи.
1.2. Результат
-
В результате этих действий упрощается отладка. При распознавании
is1-vmauth.example.org
получим исчерпывающий ответ:
2. VIP. Добавление «host» для Virtual IP во FreeIPA
2.1. Создание «Узла»
-
Добавьте во FreeIPA, в разделе «Hosts», узел для VIP с именем, как у ранее добавленной в DNS A-записи.
is1-mon-vmauth-vip.example.org
-
Добавьте к «узлу» в поле «Описание» краткое описание цели создания узла. Например:
"250304. dmr. Для выпуска TLS-сертификата под vmauth в новом VictoriaMetrics-кластере. Так как Kerberos не нужен, то вместо создания «сервиса» было выбрано создание «узла»."
-
Добавьте к созданному «узлу»
is1-mon-vmauth-vip.example.org
два реальных узлаis1-mon-vmauth0[1-2]p.example.org
, между которыми будет мигрировать VIP.
3. VIP. Запрос TLS-сертификата для основного dns-имени Virtual IP
3.1. Переменные для скриптов и запроса сертификата
-
Задайте общие переменные. В большинстве случаев ничего менять не требуется:
REQUEST_SHORT_NAME='vip' TLS_DIR="/etc/pki/tls" TLS_KEY_FILE="${TLS_DIR}/private/${REQUEST_SHORT_NAME}.key" TLS_CERT_FILE="${TLS_DIR}/certs/${REQUEST_SHORT_NAME}.crt" SCRIPT_DIR="/usr/local/lib/certmonger" SCRIPT_BEFORE="${REQUEST_SHORT_NAME}-before-savecert" SCRIPT_AFTER="${REQUEST_SHORT_NAME}-after-savecert" FULL_SCRIPT_BEFORE=${SCRIPT_DIR}/${SCRIPT_BEFORE} FULL_SCRIPT_AFTER=${SCRIPT_DIR}/${SCRIPT_AFTER}
3.2. Скрипты для автовыполнения перед и после получения сертификата
-
Выполните этот сценарий на каждой машине, задействованной в обеспечении VIP, для создания двух скриптов, которые выполняются перед и после получения нового сертификата:
mkdir -p ${SCRIPT_DIR} cat << EOF > ${FULL_SCRIPT_BEFORE} #!/bin/bash set +e set -ux echo "The script ${SCRIPT_BEFORE} is launching..." KEY="${TLS_KEY_FILE}" CERT="${TLS_CERT_FILE}" # Your commands is here! cp \${KEY} "\${KEY}-\$(date +%y%m%d-%H%M%S).bak" cp \${CERT} "\${CERT}-\$(date +%y%m%d-%H%M%S).bak" # End of script echo "The script ${SCRIPT_BEFORE} has finished." EOF cat << EOF > ${FULL_SCRIPT_AFTER} #!/bin/bash # На сгенерированный ключ имеет права только root, # поэтому с помощью setfacl необходимо добавить право чтения # учётной записи, под которой работает сервис. set +e set -ux echo "The script ${SCRIPT_AFTER} is launching..." KEY="${TLS_KEY_FILE}" CERT="${TLS_CERT_FILE}" # Example for airflow #echo "airflow..." #/usr/bin/setfacl -m "u:airflow:r" \$KEY #/usr/bin/systemctl restart airflow-webserver # Example for nginx #echo "nginx..." #/usr/bin/setfacl -m "u:nginx:r" \$KEY #systemctl reload nginx # Your commands is here! /usr/bin/setfacl -m "u:vmauth:r" \$KEY systemctl restart vmauth # End of script echo "The script ${SCRIPT_AFTER} has finished." EOF FILES_PATH="${SCRIPT_DIR}/${REQUEST_SHORT_NAME}-*" chmod 700 ${FILES_PATH} chown root:root ${FILES_PATH}
3.3. Запрос TLS-сертификата для основного VIP-имени
-
Выполните запрос для основного имени заданного в переменной
VIP_HOSTNAME
:VIP_HOSTNAME='is1-mon-vmauth-vip.example.org' ipa-getcert request \ -I ${REQUEST_SHORT_NAME} \ --subject-name CN=${VIP_HOSTNAME} \ --principal host/${VIP_HOSTNAME} \ --keyfile "${TLS_KEY_FILE}" \ --certfile "${TLS_CERT_FILE}" \ --before-command="/bin/bash -c \"${FULL_SCRIPT_BEFORE} 2>&1 | /usr/bin/logger -t CERTMONGER\"" \ --after-command="/bin/bash -c \"${FULL_SCRIPT_AFTER} 2>&1 | /usr/bin/logger -t CERTMONGER\"" \ --key-owner root --key-perms 0600 \ --cert-owner root --cert-perms 0644 \ -w
stdout:Number of certificates and requests being tracked: 1. Request ID 'vip': status: MONITORING stuck: no key pair storage: type=FILE,location='/etc/pki/tls/private/vip.key',owner=root,perms=0600 certificate: type=FILE,location='/etc/pki/tls/certs/vip.crt',owner=root,perms=0644 CA: IPA issuer: CN=Certificate Authority,O=EXAMPLE.ORG subject: CN=is1-mon-vmauth-vip.example.org,O=EXAMPLE.ORG issued: 2025-03-04 17:22:17 MSK expires: 2027-03-05 17:22:17 MSK dns: is1-mon-vmauth-vip.example.org principal name: host/is1-mon-vmauth-vip.example.org@EXAMPLE.ORG key usage: digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment eku: id-kp-serverAuth,id-kp-clientAuth pre-save command: /bin/bash -c "/usr/local/lib/certmonger/vip-before-savecert 2>&1 | /usr/bin/logger -t CERTMONGER" post-save command: /bin/bash -c "/usr/local/lib/certmonger/vip-after-savecert 2>&1 | /usr/bin/logger -t CERTMONGER" track: yes auto-renew: yes
4. SAN. Добавление «Псевдонимов учётной записи» к «Узлу»
-
Добавьте к «узлу» псевдонимы для каждого SAN с префиксом host:
host/dev-vmauth.example.org host/prod-vmauth.example.org host/test-vmauth.example.org
5. SAN. Добавление записей в DNS для SAN (дополнительных dns-имён)
5.1. Добавление записей для альтернативных имён
-
Добавьте в DNS-зону
example.org
CNAME-запись для каждого альтернативного имени. Имя домена и символы точки не добавляйте.dev-vmauth → is1-mon-vmauth-vip prod-vmauth → is1-mon-vmauth-vip test-vmauth → is1-mon-vmauth-vip
5.2. Результат
-
В результате этих действий упрощается отладка. При распознавании
dev-vmauth.example.org
получим исчерпывающий ответ:# host dev-vmauth.example.org dev-vmauth.example.org is an alias for is1-mon-vmauth-vip.example.org. is1-mon-vmauth-vip.example.org has address 10.1.77.12 # dig TXT dev-vmauth.example.org +short is1-mon-vmauth-vip.example.org. "250130. nifantevea. VIP for is1-mon-vmauth*."
6. SAN. Запрос TLS-сертификата для всех дополнительных имён
При повторных перезапросах сертификата с дополнительными SAN, в командной строке необходимо перечислять все SAN, и те, что были, и новые. |
6.1. Перезапрос сертификата
-
Выполните на каждом vmauth-хосте:
ipa-getcert resubmit -i vip \ -D dev-vmauth.example.org \ -D prod-vmauth.example.org \ -D test-vmauth.example.org
6.2. Проверка успешности перезапроса
-
Выполните на каждом vmauth-хосте:
ipa-getcert list -i vip
Примерный ожидаемый вывод:Number of certificates and requests being tracked: 1. Request ID 'vip': status: MONITORING stuck: no key pair storage: type=FILE,location='/etc/pki/tls/private/vip.key',owner=root,perms=0600 certificate: type=FILE,location='/etc/pki/tls/certs/vip.crt',owner=root,perms=0644 CA: IPA issuer: CN=Certificate Authority,O=EXAMPLE.ORG subject: CN=is1-mon-vmauth-vip.example.org,O=EXAMPLE.ORG issued: 2025-03-04 17:31:28 MSK expires: 2027-03-05 17:31:28 MSK dns: dev-vmauth.example.org,prod-vmauth.example.org,test-vmauth.example.org,is1-mon-vmauth-vip.example.org principal name: host/is1-mon-vmauth-vip.example.org@EXAMPLE.ORG key usage: digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment eku: id-kp-serverAuth,id-kp-clientAuth pre-save command: /bin/bash -c "/usr/local/lib/certmonger/vip-before-savecert 2>&1 | /usr/bin/logger -t CERTMONGER" post-save command: /bin/bash -c "/usr/local/lib/certmonger/vip-after-savecert 2>&1 | /usr/bin/logger -t CERTMONGER" track: yes auto-renew: yes
6.3. Вывод пронумерованного отсортированного списка всех доменных имён, кроме 'is1i-mon-vmauth-vip.example.org'
-
Выполните на каждом vmauth-хосте:
ipa-getcert list -i vip | grep dns | sed -E 's/^\s*dns: //; s/,isbi-mon-vmauth-vip\.example\.org//' | tr ',' '\n' | sort | nl
Примерный вывод:1 dev-vmauth.example.org 2 prod-vmauth.example.org 3 test-vmauth.example.org