Пример организации получения TLS-сертификата для Virtual IP (VIP) на vmauth-узлах с автообновлением

Добавление записей в DNS для «основного» доменного имени

Добавление записей для Virtual IP

  1. Добавьте в DNS-зону A-запись для нового Virtual IP с понятным именем.

  2. Для двух узлов is1-mon-vmauth0[1-2]p выбрано имя is1-mon-vmauth-vip.

  3. Добавьте в DNS-зону TXT-запись с датой, своим логином, кратким описанием цели создания этого IP, заключёнными в кавычки. "250304. dmr. VIP for is1-mon-vmauth."

  4. Добавьте в DNS-зону PTR-запись, соответствующую ранее добавленной A-записи.

Результат

  1. В результате этих действий упрощается отладка. При распознавании is1-vmauth.example.org получим исчерпывающий ответ:

    # 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."

Добавление «host» для Virtual IP во FreeIPA

Создание «Узла»

  1. Добавьте во FreeIPA, в разделе «Hosts», узел для VIP с именем, как у ранее добавленной в DNS A-записи.

    is1-mon-vmauth-vip.example.org

  2. Добавьте к «узлу» в поле «Описание» краткое описание цели создания узла. Например:

    250304. nifantiev. Для выпуска TLS-сертификата под vmauth в новом VictoriaMetrics-кластере. Так как Kerberos не нужен, то вместо создания «сервиса» было выбрано создание «узла».

  3. Добавьте к созданному «узлу» is1-mon-vmauth-vip.example.org два реальных узла is1-mon-vmauth0[1-2]p.example.org , между которыми будет мигрировать VIP.

Запрос TLS-сертификата для основного dns-имени Virtual IP

Переменные для скриптов и запроса сертификата

  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}

Скрипты для автовыполнения перед и после получения сертификата

  1. Выполните этот сценарий для создания двух скриптов, которые выполняются перед и после получения нового сертификата:

    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}

Запрос TLS-сертификата для основного VIP-имени

  1. Выполните запрос для основного имени заданного в переменной VIP_HOSTNAME:

    VIP_HOSTNAME='isbi-mon-vmauth-vip.data.corp'
    
    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
    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=DATA.CORP
            subject: CN=isbi-mon-vmauth-vip.data.corp,O=DATA.CORP
            issued: 2025-03-04 17:22:17 MSK
            expires: 2027-03-05 17:22:17 MSK
            dns: isbi-mon-vmauth-vip.data.corp
            principal name: host/isbi-mon-vmauth-vip.data.corp@DATA.CORP
            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