# Работа с DNS

### Задачи
1. Установить и настроить авторитетного DNS сервера
0. Настроить DNS для работы в соответствии со стандартом RFC 2136
0. Установка и настройка рекурсивного DNS
0. Выпустить сертификат безопасности
0. Проверить сертификата безопасности

### Построение стенда
Схема виртуального лабораторного стенда
<center>
<div drawio-diagram="447"><img src="https://docs.resds.ru/uploads/images/drawio/2023-11/qfyNQqKsGLlxc8O3-drawing-3-1700758975.png"></div>

Рисунок 1. Схема стенда</center>


1. Создать виртуальные машины для работы

|Название виртуальной машины|Источник |Тип инстанса|Сети для внешнего подключения |
|-|-|-|-|
|web-server|Образ-Ubuntu-server20.04|small|external-net|
|dns-server|Образ-Ubuntu-server20.04|small|external-net|

Так же нужно проверить развернутую инфраструктуру на соответствие схеме на рисунке 1.

> В группах безопастности необходимо разрешить DNS


### 1. Установка и настройка авторитетного DNS сервера
Обновляем пакеты внутри системы до последней версии
```bash
sudo apt update
# Необязательно, но желательно
sudo apt full-upgrade -y
```
Устанавливаем сервер реализацию DNS сервера **PowerDNS**
```bash
sudo apt install pdns-server pdns-backend-sqlite3 sqlite3 -y
```
Настроить для работы c sqlite бд
```bash
sudo mkdir /var/lib/powerdns
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 < /usr/share/doc/pdns-backend-sqlite3/schema.sqlite3.sql
sudo chown -R pdns:pdns /var/lib/powerdns
```
Выключаем **systemd-resolved**
```bash
sudo systemctl disable --now systemd-resolved.service
```
Изменяем используемый dns-сервер на **172.17.1.10**
```bash
sudo rm -rf /etc/resolv.conf
echo "nameserver 172.17.1.10" |sudo tee /etc/resolv.conf 
```
Отредактировать **/etc/powerdns/pdns.conf**
```text
include-dir=/etc/powerdns/pdns.d
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
security-poll-suffix=
setgid=pdns
setuid=pdns
```
1. **include-dir=/etc/powerdns/pdns.d**: Эта строка указывает серверу PowerDNS загружать все конфигурационные файлы из директории */etc/powerdns/pdns.d*. Это позволяет разделять конфигурацию на несколько файлов для более удобного управления.
2. **launch=gsqlite3**: Эта строка определяет, какой бэкенд базы данных будет использоваться для хранения данных сервера DNS. В данном случае, указан бэкенд gsqlite3, что означает использование базы данных SQLite.
3. **gsqlite3-database=/var/lib/powerdns/pdns.sqlite3**: Здесь указывается путь к файлу базы данных SQLite, который будет использоваться сервером PowerDNS для хранения записей DNS.
4. **security-poll-suffix=**: Этот параметр связан с безопасностью и суффиксом для защиты от определенных видов атак. В данном случае, он не задан (пустое значение),  в данном случае это означает не использовать варианты защиты. 
5. **setgid=pdns** и **setuid=pdns**: Эти параметры устанавливают идентификатор группы и пользователя, от которого будет работать процесс PowerDNS. В этом случае, сервер будет запущен с правами группы *pdns* и пользователем *pdns* для обеспечения минимальных привилегий в целях безопасности.

<center>
  
[![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/mzBhswEPpRQmUNzE-image-1699866072682.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/mzBhswEPpRQmUNzE-image-1699866072682.png)

Рисунок 2. Пример конфига
</center>

Активируем демона dns-сервера
```bash
sudo systemctl enable --now pdns
```

Создаем зону по имени пользователя(для примера используется devops-course.test)
```bash
sudo pdnsutil create-zone {zone name} ns1.{zone name}
sudo pdnsutil add-record {zone name}. www A 127.0.0.1
```
[![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/FqyvWizy52BIoAHC-image-1699872591079.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/FqyvWizy52BIoAHC-image-1699872591079.png)

Проверьте работу сервера
```bash
nslookup www.devops-course.test {server ip}
```
> Запрос делается с пользователького пк
<center>

  [![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/SvG5lNsfdMLo08Eg-image-1699868148999.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/SvG5lNsfdMLo08Eg-image-1699868148999.png)

Рисунок 3. Пример ответ при адресе сервера 172.17.36.216
</center>

### 2. Настроить DNS для работы в соответствии со стандартом RFC 2136
Для работы по стандарту rfc2136, необходимо изменить конфигурацию работы PowerDNS, в конфигурационном файле необходимо добавить строки:
```text
dnsupdate=yes
allow-dnsupdate-from=172.16.0.0/12
```
1. **dnsupdate=yes** - это включает поддержку динамического обновления DNS-записей (DNSUPDATE), что позволяет клиентам обновлять записи на сервере DNS.
2. **allow-dnsupdate-from=172.16.0.0/12** - это определяет диапазон IP-адресов (в данном случае, подсеть) для разрешения выполнения динамических обновлений DNS. Только запросы, идущие от адресов в этой подсети (172.16.0.0 - 172.31.255.255), будут разрешены для выполнения обновлений.

<center>
  
[![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/VzDXgqfNSxYgnVO7-image-1699871124201.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/VzDXgqfNSxYgnVO7-image-1699871124201.png)

Рисунок 4. Конфигурация после обновления
</center>

Создать TSIG ключ с именем **dnsudpater**
```bash
sudo pdnsutil generate-tsig-key dnsupdater hmac-sha512
```
pdnsutil - это утилита для работы с PowerDNS.
generate-tsig-key - команда для создания нового ключа TSIG.
dnsupdater - это имя, которое будет присвоено сгенерированному ключу TSIG.
hmac-sha512 - это алгоритм хеширования, используемый для создания ключа.
<center>

[![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/D6xivSv0paAz4Xkl-image-1699872018873.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/D6xivSv0paAz4Xkl-image-1699872018873.png)

Рисунок 5. Пример корректного создания TSIG ключа
</center>

Посмотреть существующие ключи можно командой:
```bash
sudo pdnsutil list-tsig-keys
```
Для проверки работы rfc2136 добавим новую **A** запись **test** указывающую, на наш web-сервер
```bash
nsupdate <<!
server {ip dns-server} 53
zone {zone name}
update add test.{zone name} 3600 A {ip web-server}
key hmac-sha512:{key name} {tsig key}
send
!
```
> выполнять с устройства в сети 172.16.0.0/12
<center>
  
[![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/YUlHnMwp9K5J0dDF-image-1699872981687.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/YUlHnMwp9K5J0dDF-image-1699872981687.png)
</center>

Проверить, что запись добавилась
```bash
nslookup test.{zone name} {ip dns-server}
```
<center>

[![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/13fJn93rzIl5tTWV-image-1699873154926.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/13fJn93rzIl5tTWV-image-1699873154926.png)


</center>


### 3. Настройка рекурсивного DNS
  
  Так как наша конфигурация подразумевает совместную работы рекурсивного и авторитетного сервера на одном виртуальном сервере, нам необходимо разграничить их по портам, так для авторитетного сервера, будет использовать порт **5353**

Для этого в конфигурации авторитетного сервера необходимо изменить слушаемые порт добавив в конфигурационный файл строки
```text
local-port=5353
```
После изменения конфигурации необходимо перезапустить службу
```bash
sudo systemctl restart pdns
```
Проверьте, что теперь слушается только порт **5353**
```bash
ss -tulpan
```

Установите рекурсивный сервер DNS
```bash
sudo apt install pdns-recursor -y
```

Привести конфиг(*/etc/powerdns/recursor.conf*) рекурсивного DNS к виду:
```text
config-dir=/etc/powerdns
hint-file=/usr/share/dns/root.hints
include-dir=/etc/powerdns/recursor.d
local-address=0.0.0.0
local-port=53
lua-config-file=/etc/powerdns/recursor.lua
public-suffix-list-file=/usr/share/publicsuffix/public_suffix_list.dat
quiet=yes
security-poll-suffix=
setgid=pdns
setuid=pdns

# authoritative zone 
forward-zones={zone name}=127.0.0.1:5353
forward-zones-recurse={zone name}=127.0.0.1:5353

# also 
forward-zones+=.=1.1.1.1
forward-zones-recurse+=.=1.1.1.1
```

1. **config-dir=/etc/powerdns** - указывает на папку с дополнительными файлами конфигурации для PowerDNS Recursor.
0. **hint-file=/usr/share/dns/root.hints** - определяет местоположение файла с базовыми подсказками (hints) для поиска корневых серверов DNS.
0. **include-dir=/etc/powerdns/recursor.d** - указывает на папку, где Recursor будет искать дополнительные файлы конфигурации для обработки.
0. **local-address=0.0.0.0** и **local-port=53** - определяют, на каком адресе и порту будет слушать Recursor для входящих DNS-запросов.
0. **lua-config-file=/etc/powerdns/recursor.lua** - указывает на файл конфигурации Lua, который может содержать дополнительные пользовательские настройки для Recursor.
0. **quiet=yes** - включает режим тишины, что означает меньше вывода информации в логах или на консоль.
0. **forward-zones={zone name}=127.0.0.1:5353** и **forward-zones-recurse={zone name}=127.0.0.1:5353** - эти строки настраивают перенаправление запросов для конкретной зоны {zone name} на адрес *127.0.0.1* с портом *5353*. 
0. **forward-zones+=.=1.1.1.1** и **forward-zones-recurse+=.=1.1.1.1** - эти строки добавляют общее перенаправление запросов для всех неопределенныз явным образом зон на указанный IP-адрес (1.1.1.1). 


<center>
  
[![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/5ORNXdZlgUJfSUUQ-image-1699878001401.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/5ORNXdZlgUJfSUUQ-image-1699878001401.png)
</center>


Включаем и добавляем автозапуск демона
```bash
sudo systemctl enable pdns-recursor
sudo systemctl restart pdns-recursor
```
### 4. Выпуск сертификата безопасности

Переходим на узел веб сервера и используя команду генерируем самоподписанный сертификат для нашего будущего тестового сайта
```bash
openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN={Доменное имя}' -addext "subjectAltName = DNS:{Доменное имя}" -addext "keyUsage = digitalSignature, keyEncipherment" -addext "extendedKeyUsage = serverAuth"
```
<center>
  
  [![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/IGZ4Upm7Ix7dgaxn-image-1700130753080.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/IGZ4Upm7Ix7dgaxn-image-1700130753080.png)

  Пример создания сертификата
</center>


Для проверки созданного сертификата можно использовать команду
```bash
openssl x509 -in cert.pem -noout -text
```

### 5. Проверка сертификата безопасности
Для проверки мы установим nginx и установим на него ранее созданный сертификат. Нам необходимо начать с установки nginx

```bash
sudo apt update
sudo apt install nginx -y
```

После установки необходимо конфигурацию по умолчанию(*/etc/nginx/sites-available/default*) и привести ее к виду:
```nginx
server {
	listen 80 default_server;
	server_name {доменное имя};
	return 301 https://$host$request_uri;
}

server {

    listen 443 ssl http2;
    server_name {доменное имя};


    ssl_certificate           /home/cloudadmin/cert.pem;
    ssl_certificate_key       /home/cloudadmin/key.pem;

    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    access_log            /var/log/nginx/cloud.access.log;
    error_log             /var/log/nginx/cloud.error.log;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    location / {
        try_files $uri $uri/ =404;
    }

}
```
После этого можно проверить конфигурацию **nginx** и перезапустить демона
```bash
sudo nginx -t
sudo systemctl restart nginx
```

<center>

  [![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/brfr8BDVZXxiH1B5-image-1700132008927.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/brfr8BDVZXxiH1B5-image-1700132008927.png)

  Пример ответа при правильной конфигурации
</center>


После этого необходимо убедиться в наличии созданного вами доменного имени с помощью  утилиты **dig**
```bash
dig {доменное имя} @{адрес dns сервера}
```

<center>

  [![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/RsvzniE7YCxt7Gaj-image-1700131852966.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/RsvzniE7YCxt7Gaj-image-1700131852966.png)

  Пример валидного ответа
</center>


После этого Вам необходимо изменить DNS сервер на вашем устройстве, на созданный вами DNS сервер и попробовать открыть в браузере ваш домен 

<center>

  [![](https://docs.resds.ru/uploads/images/gallery/2023-11/scaled-1680-/3ByJRlX2PjK8HuWk-image-1700132172528.png)](https://docs.resds.ru/uploads/images/gallery/2023-11/3ByJRlX2PjK8HuWk-image-1700132172528.png)

  Пример выполненой работы
</center>