21.07.2023

Из далекого 2010

Когда человек бегает по кругу пытаясь успеть кучу важных вещей, у него нет времени подумать. Но достаточно остановиться чтобы увидеть, что эти вещи не такие уж и важные. И потом оказывается, что бежать та и не нужно. Достаточно идти, только нужно знать направление. А старые "важные" вещи просто сбивают с пути.

Настройка BIND9 для работы с LEGO по RFC2136 TSIG для TEGU

Давеча решил скрестить lego и bind9. Чтобы все это дело хорошо работало с Tegu.

Что имеем:

Ubuntu 23.04

BIND 9.18.12

lego 4.9.1-1

Создание TSIG.


tsig-keygen supa-dupa-plex-mega-key-name

Вывод:

key "supa-dupa-plex-mega-key-name" {

algorithm hmac-sha256;

secret "Bt8ScaBQzs2Kn0U4qkVNGWiZg6/fxMYqkgNf7IWUpf8=";

};

Добавляем в /etc/bind/named.conf:

// TSIG for LEGO

key "supa-dupa-plex-mega-key-name" {

    algorithm hmac-sha256;

    secret "Bt8ScaBQzs2Kn0U4qkVNGWiZg6/fxMYqkgNf7IWUpf8=";

};

// Разрешаем подключения только на 953 порт и только с 127.0.0.1(localhost) с ключом.

controls {

inet 127.0.0.1 port 953

allow { 127.0.0.1; } keys { "supa-dupa-plex-mega-key-name"; };

};

Разрешаем нашему ключу supa-dupa-plex-mega-key-name обновлять данные в нашей зоне, вот вся зона в /etc/bind/named.conf.local:

zone "example.com" {

    type master;

    file "db.example.com";

    update-policy {

        grant supa-dupa-plex-mega-key-name name _acme-challenge.mx.example.com. TXT;

    };

};

Настройка LEGO.

Устанавливаем:

apt-get install lego

Создаем сервис systemd:

Для работы сервиса нужно 2 файла:
/etc/systemd/system/lego-mx.example.com.service
/etc/systemd/system/lego-mx.example.com.timer

Первый - сам сервис, второй - таймер который его запускает.

Для удобства внутри файла сервиса есть несколько вариантов:

Запрос сертификата с stage сервера:

#ExecStart=lego --server="https://acme-staging-v02.api.letsencrypt.org/directory" --accept-tos --email="user@example.com" --key-type="rsa4096" --domains="mx.example.com" --dns="rfc2136" run

Запрос сертификата с боевого сервера:

#ExecStart=lego --accept-tos --email="user@example.com" --key-type="rsa4096" --domains="mx.example.com" --dns="rfc2136" run

Запрос перевыпуска существующего сертификата с боевого сервера:

#ExecStart=lego --accept-tos --email="user@example.com" --domains="mx.example.com" --dns="rfc2136" renew

Выбрать нужно что-то одно и раскомментировать.

Полученные сертификаты сохранятся по пути WorkingDirectory=/opt/lego а лежать будут в /opt/lego/.lego/certificates/

Мы копируем их в каталог сертификатов Tegu - /opt/tegu/certs/ автоматически в рамках сервиса:

ExecStartPost=cp /opt/lego/.lego/certificates/mx.example.com.crt /opt/tegu/certs/

ExecStartPost=cp /opt/lego/.lego/certificates/mx.example.com.key /opt/tegu/certs/

И назначим им права доступа, также в рамках сервиса:

ExecStartPost=chown mail:mail /opt/tegu/certs/mx.example.com.crt

ExecStartPost=chown mail:mail /opt/tegu/certs/mx.example.com.key


Переменные окружения и связка с BIND

Имя ключа TSIG, алгоритм шифрования и сам секрет указываем в переменных:

Environment="RFC2136_TSIG_KEY=supa-dupa-plex-mega-key-name"

Environment="RFC2136_TSIG_ALGORITHM=hmac-sha256"

Environment="RFC2136_TSIG_SECRET=Bt8ScaBQzs2Kn0U4qkVNGWiZg6/fxMYqkgNf7IWUpf8="

Также рекомендую указать следующие значения для более стабильного получения сертификата.

Environment="RFC2136_PROPAGATION_TIMEOUT=3600"

Environment="RFC2136_POLLING_INTERVAL=300"

Environment="RFC2136_SEQUENCE_INTERVAL=600"

Environment="RFC2136_NAMESERVER=127.0.0.1"


Содержимое lego-mx.example.com.service:

[Unit]

Description=Lego mx.example.com


[Service]

Type=oneshot

WorkingDirectory=/opt/lego

# Uncomment if need request certs STAGE SERVER

#ExecStart=lego --server="https://acme-staging-v02.api.letsencrypt.org/directory" --accept-tos --email="user@example.com" --key-type="rsa4096" --domains="mx.example.com" --dns="rfc2136" run

# Uncomment if need request certs

#ExecStart=lego --accept-tos --email="user@example.com" --key-type="rsa4096" --domains="mx.example.com" --dns="rfc2136" run

# Uncomment if need renew certs

#ExecStart=lego --accept-tos --email="user@example.com" --domains="mx.example.com" --dns="rfc2136" renew

ExecStartPost=cp /opt/lego/.lego/certificates/mx.example.com.crt /opt/tegu/certs/

ExecStartPost=cp /opt/lego/.lego/certificates/mx.example.com.key /opt/tegu/certs/

ExecStartPost=chown mail:mail /opt/tegu/certs/mx.example.com.crt

ExecStartPost=chown mail:mail /opt/tegu/certs/mx.example.com.key

PrivateTmp=true

Environment="RFC2136_NAMESERVER=127.0.0.1"

Environment="RFC2136_TSIG_KEY=supa-dupa-plex-mega-key-name"

Environment="RFC2136_TSIG_ALGORITHM=hmac-sha256"

Environment="RFC2136_TSIG_SECRET=Bt8ScaBQzs2Kn0U4qkVNGWiZg6/fxMYqkgNf7IWUpf8="

Environment="RFC2136_PROPAGATION_TIMEOUT=3600"

Environment="RFC2136_POLLING_INTERVAL=300"

Environment="RFC2136_SEQUENCE_INTERVAL=600"


[Install]

WantedBy=multi-user.target

Содержимое lego-mx.example.com.timer:

[Unit]

Description=Run LEGO

Requires=lego-mx.example.com.service


[Timer]

OnCalendar=weekly

Persistent=true


[Install]

WantedBy=timers.target


Запускаем:

systemctl enable lego-mx.example.com.timer

systemctl enable lego-mx.example.com.service

systemctl start lego-mx.example.com.timer