Simple & Async API to add, update and remove DNS records to/from MS Windows DNS Server
Currently tested on Rocky Linux 8.5
Run all the below commands as root user
dnf module install -y python39
dnf module reset -y redis
dnf module install -y redis:6
dnf module reset -y nginx
dnf module install -y nginx:1.20
dnf install -y gcc krb5-devel gssntlmssp python39-develClone the repo from main branch
git clone --depth 1 https://github.com/xtonousou/dienes.git /opt/dienesCreate service account
useradd --system --no-create-home --comment "Dienes Service Account" dienesCreate celery directories and apply permissions
mkdir -vp /var/log/dienes /var/run/dienes
chown -R dienes:nginx /opt/dienes
chown -R dienes:dienes /var/log/dienes /var/run/dienespython3 -m pip install -r requirements.txtRedis have to run locally alongside with dienes server
yes | cp -v etc/redis/redis.conf /etc/redis.conf
systemctl enable --now redisIf there is no Hashicorp Vault available, read the documentation here to install it.
Enable a kv2 engine with name secret and create the required secrets defined in the schema etc/hashicorp_vault/vault_schema.
Then, create the proper ACL named dienes_ro which is defined in etc/hashicorp_vault/vault.hcl.
Finally, create the token that will be used by dienes
vault login # login with your root token
vault token create -type=service -renewable=true -orphan=true -display-name="Dienes API Server" -policy=dienes_ro -ttl=87600hCopy the conf.sample.yml to conf.yml and edit accordingly.
The required changes are:
vault:
token: TOKEN_HERE
host: https://vault.domain.tld:8200
api:
cors:
origins:
- "http://localhost"
- "https://localhost"
- "http://localhost:8000"
- "https://localhost:8000"
allowed_hosts:
- localhost
- dienes.domain.tldGenerate SSL certificates for nginx
mkdir -pv /etc/nginx/ssl/certs /etc/nginx/ssl/keys
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/ssl/keys/nginx-selfsigned.key -out /etc/nginx/ssl/certs/nginx-selfsigned.crt
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096Run the following command to disable the default site that comes with the nginx package
sed -i 's@ default_server@@' /etc/nginx/nginx.confCopy the preconfigured nginx vhost dienes.conf
yes | cp -v etc/nginx/dienes.conf /etc/nginx/conf.d/dienes.confConfigure the vhost accordingly /etc/nginx/conf.d/dienes.conf
server_name dienes.domain.tld; # change the server name
Copy the Systemd service files from etc/systemd/ to /etc/systemd/system/
yes | cp -v etc/systemd/* /etc/systemd/system/Copy the env files from etc/default/ to /etc/default/
yes | cp -v etc/default/* /etc/default/Finally, enable and run the services
systemctl daemon-reload
systemctl enable dienes.socket dienes dienes-worker dienes-beat nginx
systemctl restart dienes.socket dienes dienes-worker dienes-beat nginxLogs are located at /var/log/dienes and at /var/log/nginx and at system's journal.
journalctl -f -u dienes
journalctl -f -u dienes-beat
journalctl -f -u dienes-workerTo run development servers, run the below commands on two different shells
API server
uvicorn api:dienes --host 0.0.0.0 --port 10051Worker
celery -A worker worker -l info -BPython client (for benchmark)
Copy the client client.sample.py to client.py first and then edit the credentials inside the file.
python3 client.pyOptionally, the library faker can be used to test sample records
from faker import Faker
faker = Faker()
dienes_url = 'http://localhost:8000/dns/record/ipv6/add'
for i in range(256):
data = {
'fqdn': '{name}.green.local'.format(name=get_random_string(8)),
'ip': faker.ipv6(),
}
r = requests.post(dienes_url, auth=(dienes_username, dienes_password, ), json=data)
print(r.json())Removing DNS server records with PowerShell
$Zones = Get-DnsServerZone | Where-Object ZoneName -Like "*.local"
foreach ($Zone in $Zones) {
$Records = Get-DnsServerResourceRecord -ZoneName $Zone.ZoneName
foreach ($Record in $Records) {
Remove-DnsServerResourceRecord -ZoneName $Zone.ZoneName -Type 1 -Name $Record.HostName
}
}Removing DNS server zones with PowerShell
$Zones = Get-DnsServerZone | Where-Object ZoneName -Like "*.ip6.arpa"
foreach ($Zone in $Zones) {
Remove-DnsServerZone -Name $Zone.ZoneName -Force
}
$Zones = Get-DnsServerZone | Where-Object ZoneName -Like "*.in-addr.arpa"
foreach ($Zone in $Zones) {
Remove-DnsServerZone -Name $Zone.ZoneName -Force
}