Proses Pemasangan PowerDNS Admin di Ubuntu | UNIX LINUX EXPLORE
Edit

Proses Pemasangan PowerDNS Admin di Ubuntu

PowerDNS-Admin adalah antarmuka administrasi berbasis web untuk PowerDNS. Tidak seperti aplikasi front-end lama lainnya untuk PowerDNS, yang sering menulis langsung ke basis data PowerDNS, aplikasi ini menggunakan antarmuka pemrograman aplikasi PowerDNS yang diperkenalkan di PowerDNS 3.x dan 4.x.


1. Persyaratan Sistem

  • Server DNS PowerDNS yang berfungsi dengan baik
  • Server database MariaDB atau MySQL server.
  • Git untuk mendapatkan kode sumber.
  • Lingkungan pengembangan bahasa Python.
  • Pustaka pengembangan untuk MariaDB, SASL, LDAP, dan SSL.
  • Server web aplikasi Python uWSGI.
  • Server web Nginx sebagai proxy terbalik ke aplikasi web;
Langkah pertama yang harus dikerjakan adalah membuat kata sandi acak untuk pengguna basis data (disarankan 16 karakter). Ikuti script di bawah ini untuk membuat kata sandi acak.


$ pwgen -cns 16 1
Buat juga kunci aplikasi rahasia Flask secara acak (disarankan 24 karakter).


$ pwgen -cns 24 1

2. Database

Terlepas dari PowerDNS yang menyimpan datanya dalam basis data MariaDB, PowerDNS-Admin menggunakan basis datanya sendiri untuk menyimpan pengguna, hak akses, dan berbagai informasi lainnya tentang domain (zona) yang dikelola.

Untuk membuat basis data yang digunakan oleh aplikasi PowerDNS-Admin, mulailah sesi interaktif dengan hak akses root di server database anda.


$ mysql -u root -p
Enter password: ********
Perintah di atas adalah untuk melakukan Login ke server database MariaDB, gunakan kata sandi yang telah anda buat sebelumnya. Setelah anda berhasil masuk ke database MariaDB, lanjutkan dengan perintah SQL berikut.


mysql> CREATE DATABASE powerdnsadmin;
mysql> GRANT ALL PRIVILEGES ON powerdnsadmin.* TO 'powerdnsadmin'@'localhost'
                IDENTIFIED BY '********';
mysql> FLUSH PRIVILEGES;
mysql> quit


3. Proses Instalasi PowerDNS Admin

Sebelum anda menjalankan proses instalasi PowerDNS Admin, instal terlebih dahulu dependensi yang diperlukan oleh PowerDNS Admin, seperti contoh di bawah ini.


$ sudo apt-get install libsasl2-dev libldap2-dev libmariadbclient-dev
Pada sistem operasi Ubuntu, PowerDNS Admin tidak tersedia di repositori defaultnya, anda harus mengunduhnya dari situs resmi atau melalui Github. Berikut adalah contoh menginstall PowerDNS Admin dari repositori Github.


$ cd /usr/local/lib
$ sudo git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git
$ sudo chown -R www-data:www-data PowerDNS-Admin
Jalankan perintah sudo untuk menggunakan web server, pada artikel ini kami menggunakan NGINX.


$ sudo -u www-data -Hs
Buat lingkungan Python virtual baru bernama flask dan aktifkan.


$ cd /usr/local/lib/PowerDNS-Admin
$ virtualenv --python=python2.7 flask
$ source ./flask/bin/activate
Anda sekarang dapat mengecek bahwa Anda bekerja di lingkungan virtual python dengan melihat prompt perintah sistem anda. Jika anda telah berhasil masuk ke lingkungan virtual python, menu shell anda akan terlihat seperti di bawah ini.


(flask) $
Pada lingkungan virtual python, instal paket Python yang diperlukan PowerDNS Admin.


(flask) $ pip install -r requirements.txt
(flask) $ pip install mysql


4. Proses Konfigurasi PowerDNS Admin

Untuk mulai konfigurasi PowerDNS admin, langkah pertama adalah anda copy/salin contoh konfigurasi dan edit.


(flask) $ cp config_template.py config.py

Script file config.py
import os
basedir = os.path.abspath(os.path.dirname(__file__))

# BASIC APP CONFIG
WTF_CSRF_ENABLED = True
SECRET_KEY = 'We are the world'
BIND_ADDRESS = '127.0.0.1'
PORT = 9393
LOGIN_TITLE = "PDNS"

# TIMEOUT - for large zones
TIMEOUT = 10

# LOG CONFIG
LOG_LEVEL = 'DEBUG'
LOG_FILE = 'logfile.log'
# For Docker, leave empty string
#LOG_FILE = ''

# Upload
UPLOAD_DIR = os.path.join(basedir, 'upload')

# DATABASE CONFIG
#You'll need MySQL-python
SQLA_DB_USER = 'powerdnsadmin'
SQLA_DB_PASSWORD = 'powerdnsadminpassword'
SQLA_DB_HOST = 'mysqlhostorip'
SQLA_DB_NAME = 'powerdnsadmin'

#MySQL
SQLALCHEMY_DATABASE_URI = 'mysql://'+SQLA_DB_USER+':'\
    +SQLA_DB_PASSWORD+'@'+SQLA_DB_HOST+'/'+SQLA_DB_NAME
#SQLite
#SQLALCHEMY_DATABASE_URI = 'sqlite:////path/to/your/pdns.db'
SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository')
SQLALCHEMY_TRACK_MODIFICATIONS = True

## LDAP CONFIG
#LDAP_TYPE = 'ldap'
#LDAP_URI = 'ldaps://your-ldap-server:636'
#LDAP_USERNAME = 'cn=dnsuser,ou=users,ou=services,dc=duykhanh,dc=me'
#LDAP_PASSWORD = 'dnsuser'
#LDAP_SEARCH_BASE = 'ou=System Admins,ou=People,dc=duykhanh,dc=me'
## Additional options only if LDAP_TYPE=ldap
#LDAP_USERNAMEFIELD = 'uid'
#LDAP_FILTER = '(objectClass=inetorgperson)'

## AD CONFIG
#LDAP_TYPE = 'ad'
#LDAP_URI = 'ldaps://your-ad-server:636'
#LDAP_USERNAME = 'cn=dnsuser,ou=Users,dc=domain,dc=local'
#LDAP_PASSWORD = 'dnsuser'
#LDAP_SEARCH_BASE = 'dc=domain,dc=local'
## You may prefer 'userPrincipalName' instead
#LDAP_USERNAMEFIELD = 'sAMAccountName'
## AD Group that you would like to have accesss to web app
#LDAP_FILTER = 'memberof=cn=DNS_users,ou=Groups,dc=domain,dc=local'

# Github Oauth
GITHUB_OAUTH_ENABLE = False
GITHUB_OAUTH_KEY = 'G0j1Q15aRsn36B3aD6nwKLiYbeirrUPU8nDd1wOC'
GITHUB_OAUTH_SECRET = '0WYrKWePeBDkxlezzhFbDn1PBnCwEa0vCwVFvy6iLtgePlpT7WfUlAa9sZgm'
GITHUB_OAUTH_SCOPE = 'email'
GITHUB_OAUTH_URL = 'http://127.0.0.1:5000/api/v3/'
GITHUB_OAUTH_TOKEN = 'http://127.0.0.1:5000/oauth/token'
GITHUB_OAUTH_AUTHORIZE = 'http://127.0.0.1:5000/oauth/authorize'

#Default Auth
BASIC_ENABLED = True
SIGNUP_ENABLED = True

# POWERDNS CONFIG
PDNS_STATS_URL = 'http://172.16.214.131:8081/'
PDNS_API_KEY = 'you never know'
PDNS_VERSION = '3.4.7'

# RECORDS ALLOWED TO EDIT
RECORDS_ALLOW_EDIT = ['A', 'AAAA', 'CNAME', 'SPF', 'PTR', 'MX', 'TXT']

# EXPERIMENTAL FEATURES
PRETTY_IPV6_PTR = False

a. Pengaturan Dasar
  • Aktifkan perlindungan CSRF (Cross-Site Request Forgery) untuk formulir HTML. Default-nya adalah Benar.
  • Tetapkan kunci rahasia untuk menandatangani cookie browser pengguna demi perlindungan sesi pengguna.
  • Alamat dan port tempat antarmuka web aplikasi untuk mendengarkan permintaan masuk.

# BASIC APP CONFIG
WTF_CSRF_ENABLED = True
SECRET_KEY = 'We are the world'
BIND_ADDRESS = '127.0.0.1'
PORT = 9393
LOGIN_TITLE = "PDNS"

b. Koneksi ke database


# DATABASE CONFIG
#You'll need MySQL-python
SQLA_DB_USER = 'powerdnsadmin'
SQLA_DB_PASSWORD = 'powerdnsadminpassword'
SQLA_DB_HOST = 'mysqlhostorip'
SQLA_DB_NAME = 'powerdnsadmin'
Script di atas membutuhkan kata sandi acak yang telah anda buat pada bagian sebelumnya.

Buat direktori untuk rootCA
r

c. Nonaktifkan Koneksi LDAP

Pada artikel ini kami tidak memiliki atau tidak menggunakan LDAP, jadi kami menonaktifkannya dengan mengomentari entri yang relevan.


#LDAP_URI = 'ldaps://your-ldap-server:636'
#LDAP_USERNAME = 'cn=dnsuser,ou=users,ou=services,dc=duykhanh,dc=me'
#LDAP_PASSWORD = 'dnsuser'
#LDAP_SEARCH_BASE = 'ou=System Admins,ou=People,dc=duykhanh,dc=me'
## Additional options only if LDAP_TYPE=ldap
#LDAP_USERNAMEFIELD = 'uid'
#LDAP_FILTER = '(objectClass=inetorgperson)'

## AD CONFIG

d. Koneksi Server API PowerDNS

Beginilah cara aplikasi web terhubung ke antarmuka API server PowerDNS. Pengaturan harus sesuai dengan konfigurasi server REST-API PowerDNS Anda.


# POWERDNS CONFIG
PDNS_STATS_URL = 'http://172.16.214.131:8081/'
PDNS_API_KEY = 'you never know'
PDNS_VERSION = '3.4.7'
Jenis DNS yang diizinkan. Default (‘A’, ‘AAAA’, ‘CNAME’, ‘SPF’, ‘PTR’, ‘MX’, ‘TXT’) sangat minim. Daftar semua jenis rekaman DNS yang didukung PowerDNS tersedia dalam dokumentasi server PowerDNS.

Kami merekomendasikan hal berikut:
  • A (memetakan nama host ke alamat IPv4).
  • AAAA (memetakan nama host ke alamat IPv6).
  • CERT (untuk menyimpan sertifikat SSL/TLS di DNS).
  • CNAME (alias nama host).
  • MX (server pertukaran email).
  • NAPTR (pemetaan terbalik nomor telepon ke alamat VoIP).
  • NS (name server yang bertanggung jawab atas domain).
  • OPENPGPKEY (menyimpan kunci PGP di DNS).
  • PTR (pemetaan terbalik alamat IP ke nama host).
  • SPF (Sender Policy Framework terhadap spam email).
  • SSHFP (untuk menyimpan sidik jari kunci publik SSH di DNS).
  • SRV (memetakan koneksi layanan di domain).
  • TLSA (sertifikat SSL/TLS yang diizinkan untuk disajikan layanan kepada klien).
  • TXT (menyimpan teks di DNS).
Hal-hal berikut ini mungkin juga digunakan di domain kami, tetapi tidak boleh diedit oleh pengguna, karena dikelola di tempat lain.
  • CDNSKEY (berkaitan dengan DNSSEC).
  • CDS (berkaitan dengan DNSSEC).
  • DNSKEY (berkaitan dengan DNSSEC, dikelola oleh pdnsutil).
  • KEY (berkaitan dengan DNSSEC).
  • NSEC, NSEC3, NSEC3PARAM (berkaitan dengan DNSSEC, dikelola oleh pdnsutil).
  • RRSIG (berkaitan dengan DNSSEC, dikelola oleh pdnsutil).
  • SOA (Start Of Authority, mendefinisikan domain dalam DNS).
  • TKEY, TSIG (kunci untuk menandatangani dan mengautentikasi komunikasi antara server DNS yang sah dan klien).

# RECORDS ALLOWED TO EDIT
RECORDS_ALLOW_EDIT = ['A', 'AAAA', 'CNAME', 'SPF', 'PTR', 'MX', 'TXT']

e. Inisialisasi database

Buat rekaman basis data.


(flask) $ ./create_db.py
Kita buat pengguna administratif:


(flask) $ ./start.py
Setelah anda menjalankan script "start.py" buka google chrome dan ketikkan angka http://192.0.2.41:9393 untuk membuat akun pengguna pertama Anda, yang secara otomatis akan memiliki hak akses administratif.

Keluar melalui peramban Anda dan hentikan server dengan menekan CTRL-C di sesi Anda.


5. Konfigurasi uWSGI

Buat konfigurasi aplikasi uWSGI di /etc/uwsgi/apps-available/powerdns-admin.ini dengan konten berikut.


; PowerDNS-Admin
[uwsgi]
plugins = python27

;uid=www-data
;gid=www-data

chdir = /usr/local/lib/PowerDNS-Admin/
pythonpath = /usr/local/lib/PowerDNS-Admin/
virtualenv = /usr/local/lib/PowerDNS-Admin/flask

mount = /pdns=run.py
manage-script-name = true
callable = app

vacuum = true
harakiri = 20
post-buffering = 8192

;socket = /run/uwsgi/app/%n/%n.socket
;chown-socket = www-data

;pidfile = /run/uwsgi/app/%n/%n.pid

;daemonize = /var/log/uwsgi/app/%n.log

enable-threads =
Baris yang diberi komentar sudah didefinisikan dalam pengaturan default di seluruh sistem. Buat tautan simbolik untuk mengaktifkan.


$ cd /etc/uwsgi/
$ sudo ln -s apps-available/powerdns-admin.ini apps-enabled/
Sejarang kita mulai menjalankan uwsgi:


$ sudo service uwsgi start powerdns-admin


6. Konfigurasi NGINX

Buat file /etc/nginx/webapps/powerdns-admin.conf, contoh scriptnya seperti di bawah ini.


#
# PowerDNS-Admin
# a web-based user interface to PowerDNS API server
#

location /dns {
    try_files $uri @powerdns-admin;
}

location @powerdns-admin {
   include uwsgi_params;
   uwsgi_pass unix:/run/uwsgi/app/powerdns-admin/powerdns-admin.socket;
}

location /dns/static/ {
   alias /usr/local/lib/PowerDNS-Admin/app/static/;
}
Sertakan berkas dalam definisi server Nginx yang sesuai.


# PowerDNS-Admin
include     webapps/powerdns-admin.conf;
Jalankan dan restart ulang konfigurasi Nginx:


$ sudo service nginx conftest && sudo service nginx reload


7. Pembaruan Dinamis

Kemungkinan alamat IPv4 publik Anda berubah dari waktu ke waktu. Kami harus memastikan bahwa jika ini terjadi, catatan DNS kami diperbarui secepat mungkin ke alamat baru.

Karena kami menjalankan server DNS kami sendiri, kami dapat melakukannya langsung di server, atau lebih tepatnya di basis data MySQL-nya. Permintaan MySQL untuk melakukan ini terlihat seperti ini.


UPDATE `records` SET content = "<NEW IP ADDRESS>", change_date "<TIME_NOW>"
    WHERE `type` = "A" AND `content` = "<OLD IP ADDRESS>";
Ini menggantikan alamat IPv4 pada setiap catatan host (A) di semua domain yang menjadi kewenangan kami. Untuk melakukan ini secara otomatis, skrip kecil dapat dimulai sebagai cronjob setiap lima menit, yang melakukan hal berikut.
  • Periksa alamat IP publik.
  • Bandingkan dengan alamat yang diketahui.
  • Jika berbeda, perbarui catatan basis data, jika tidak keluar.
  • Keluar.
a. Memperbarui/upate Skrip Shell


#!/bin/bash
#
# PowerDNS Dynamic IP Updates

# Host to query for stored public IP address
KNOWN_HOST=www.example.net

# Router to query for current IP
ROUTER_IP=192.0.2.1
ROUTER_USER=pdns_updater
ROUTER_SSH_KEY=$HOME/.ssh/pdns_updater_rsa
ROUTER_IFC=sfp1
# Display IP Address on MicroTik Routers
ROUTER_CMD=":put [/ip address get [find interface=\"$ROUTER_IFC\"] address];"

# Our domain name master server to ask stored IP
DNS_MASTER=2001:db8::41

# MySQL server
MYSQL_HOST=localhost
MYSQL_USER=pdns_updater
MYSQL_PASSWORD=********
MYSQL_DB=pdns

# Ask router for current interface IP
READ_WAN_IP=`ssh $ROUTER_USER@$ROUTER_IP -i $ROUTER_SSH_KEY $ROUTER_CMD`

# Strip netmask ("/24") from IP
CURRENT_IP=`expr "$READ_WAN_IP" : '\([0-9\.]*\)'`

# Get current DNS address
DNS_IP=`dig +short @${DNS_MASTER} $KNOWN_HOST A`

# Compare the IPs
if [ $CURRENT_IP == $DNS_IP ]; then
	#echo "*** IPs are the same :) ***"
	exit
else
	echo "*** ALERT! Our WAN IP has changed! ***"
	echo "Old IP Address: $DNS_IP"
	echo "New IP Address: $CURRENT_IP"

	# Update all records in PowerDNS database which use the old IP
	mysql -u $MYSQL_USER -p${MYSQL_PASSWORD} -h $MYSQL_HOST $MYSQL_DB -e \
	   "UPDATE \`records\` 
	    	SET \`content\` = \"$CURRENT_IP\", \`change_date\`=\"`date +%s`\"
        	WHERE \`type\` = \"A\" AND \`content\` = \"$DNS_IP\";" \
    && echo "All DNS records with the old IP where updated." \
    || echo "*** Update of DNS records failed! ***"
fi

b. Database User

Buat pengguna database pdns_updater dengan serangkaian hak istimewa yang sangat ketat.


CREATE USER 'pdns_updater'@'localhost'
    IDENTIFIED BY '********';
GRANT SELECT (`type`, `content`), UPDATE (`content`, `change_date`)
    ON `pdns`.`records` TO 'pdns_updater'@'localhost';
FLUSH PRIVILEGES;

c. Buat jadwal update crontab

Untuk menentukan cronjob yang menjalankan proses update setiap lima menit sekali.

Buat direktori untuk rootCA
$ crontab -e
*/5 * * * * /$HOME/bin/pdns_update.sh


8. Publikasikan Kunci Server SSH

Dengan menerbitkan kunci publik server SSH Anda di DNS, klien yang terhubung dapat memverifikasi identitas server tanpa perlu mendistribusikan dan memperbarui kunci publik server Anda di semua klien. Anda harus sudah menyiapkan server DNS aman DNSSEC untuk domain server.


sshfp -s server.example.net
# server.example.net SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2
server.example.net IN SSHFP 1 1 5E677..............................21447
Jika Anda menggunakan server PowerDNS dengan antarmuka web poweradmin, tambahkan catatan sebagai berikut.

Name                                        Type                    Content

server.example.net                    SSHFP                1 1 5E677…………………………21447


Kesimpulannya, menginstal PowerDNS dan PowerDNS-Admin di Ubuntu adalah proses sederhana yang melibatkan penambahan repositori PowerDNS, menginstal paket PowerDNS, dan mengonfigurasi database. Setelah terinstal, Anda dapat menggunakan perintah dig untuk menanyakan server DNS, dan antarmuka PowerDNS-Admin untuk mengelolanya.