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
Для работы сервиса нужно 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
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"
Содержимое 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