Membangun domain nameserver menggunakan BINDMembangun domain nameserver menggunakan BIND Modifikasi dari "Secure BIND template" Rob Thomas http://www.cymru.com/~robt Pengenalan Kita mungkin belum tahu secara mendalam mengenai DNS, tetapi bila kita menggunakan internet untuk mengirimkan email ataupun browsing kealamat favorit, secara tidak langsung kita menggunakan DNS untuk menemukan alamat-alamat tersebut, sebenarnya alamat yang mudah diingat oleh manusia ini hanyalah merupakan sarana kemudahan bagi kita dibandingkan apabila kita harus mengingat alamat IP yang gampang diingat oleh komputer tetapi susah diingat oleh manusia. BIND (Berkeley Internet Name Domain) merupakan perangkat lunak DNS yang didistribusikan dihampir setiap komputer UNIX (termasuk Linux), walaupun ada beberapa alternatif lainnya dengan kemampuan dan fitur yang ditawarkan. BIND apabila dikonfigurasikan secara benar akan lebih meningkatkan nilainya daripada default install dari apa yang didistribusikan oleh vendor. Disini saya akan mengajak rekan-rekan untuk melihat BIND lebih kedalam. BIND mempunyai sejarah sebagai target "empuk" para cracker di internet. Walaupun sudah dikonfigurasikan secara benar, informasi yang disediakan BIND masih bisa digunakan untuk mencari informasi host-host dari suatu domain yang bersangkutan, misalnya zone-transfer yang tidak dibatasi dapat "membocorkan" daftar komputer-komputer yang terdaftar di suatu domain. Sebagai referensi silahkan pinjam buku di perpus mengenai BIND karangan Cricket Liu, atau bisa baca di online-book tim. Tutorial pendek ini diinspirasikan oleh "perjuangan" Jhe (zainal@lug.stikom.edu) pada acara sarasehan "Membangun DNS dengan BIND", apa yang akan tak jabarkan disini adalah sedikit tambahan dari materi yang dibawakan Jhe, dan tentunya diharapkan dapat diimplementasikan untuk sarana belajar DNS dengan BIND. Permulaan, diasumsikan bahwa komputer yang akan dikonfigurasikan ini sudah harus diamankan sebelumnya dan patch terbaru dari vendor sudah diinstall. BIND Versi yang digunakan adalah versi 9, versi ini dipilih karena sudah mendukung berbagai fitur, diantaranya "split-view/split-dns/split-brain" dan beberapa fitur-fitur lebih dibandingkan dengan versi-versi sebelumnya. Versi mulai dari 9.1.3 mempunyai 2 Resource Records (RR) CHAOS class, yaitu version.bind dan authors.bind, yang keduanya bertipe TXT. version.bind berisi informasi mengenai versi dari BIND dan authors.bind akan berisi informasi mengenai pemilik BIND 9.x, walaupun fungsi asli dari kedua RR TXT tersebut untuk memberikan informasi bagi admin, namun bisa disalahgunakan untuk mengetahui versi dari target BIND, disarankan untuk membatasi RR ini menggunakan fitur view dari versi 9. Silahkan ambil versi BIND yang terakhir di http://www.isc.org/products/bind Konfigurasi dasar Disarankan untuk meletakkan proses BIND kedalam chroot, dimana semua proses dari named akan "dipaksa" kedalam suatu direktori yang bisa diartikan dengan penjara, karena proses ini tidak akan mempengaruhi sistem dari sisi keamanannya bila bobol (mohon baca manualnya chroot). Untuk mengkonfigurasikan BIND supaya mendukung chroot (defaultnya tidak), silahkan ambil dokumen lokal Chroot-BIND-HOWTO. pertama konfigurasikan BIND layaknya domain biasa, kemudian kita akan melangkah ke bagaimana mengkonfigurasikan BIND supaya dapat meminimalkan resiko keamanan. named.conf Berikut ini cuplikan isi konfigurasi awalnya: /////////////////////////////////////////////////////////////// // // Baris yang diawali dengan karakter / ini merupakan komentar options { // dimana kita akan meletakkan named berada directory "/var/named"; // forward only; // forwarders { // 202.155.0.10; // 202.155.0.15; // }; }; zone "." in { type hint; file "db.cache"; }; zone "0.0.127.in-addr.arpa" in { type master; file "db.0.0.127.in-addr.arpa"; notify no; }; zone "stikom.edu" in { type master; file "db.stikom.edu"; }; zone "19.155.202.in-addr.arpa" in { type master; file "db.19.155.202.in-addr.arpa"; }; // bila kita bertindak sebagai slave domainlain // cantumkan disini // zone "domainlain.com" in { // type slave; // file "db.domainlain.com"; // masters { // 128.82.3.4; // }; // }; // // zone "0/25.3.82.128.in-addr.arpa" in { // type slave; // file "db.0_25.3.82.128.in-addr.arpa"; // masters { // 128.82.3.4; // }; // }; // /////////////////////////////////////////////////////////////////// Konfigurasi diatas merupakan konfigurasi yang paling mendasar dari BIND dengan menggunakan konfigurasi diatas, BIND sudah bisa digunakan untuk melayani request dari komputer lain. Tujuan dari tutorial ini adalah melakukan optimalisasi BIND dari sisi kinerja, manajemen maupun keamanannya, untuk itu berdasarkan fitur yang sudah ditawarkan oleh versi 9 ini, kita akan menggunakan fitur 'view' untuk memisahkan antara jaringan internal kita dengan jaringan diluar kita, dengan maksud supaya DNS server kita tidak digunakan sebagai resolver komputer atau DNS dari luar jaringan kita, dan membatasi request zone-transfer, yang tentunya ini akan mengurangi beban di server maupun bandwidth yang digunakan oleh DNS server. Urutan dari view disini sangat penting, first-match akan diberlakukan terhadap asal komputer yang meminta berada, akan kita bagi dua view, external-in dan internal-in, external-in akan digunakan oleh klien dari luar domain dan diasumsikan mereka akan bertanya hanya seputar domain kita saja dan internal-in adalah klien dari domain kita sendiri yang bisa kita percaya. Untuk itu kita letakkan internal-in di awal konfigurasi kemudian diikuti external-in yang kita batasi hanya bisa meminta informasi mengenai domain kita, hanya komputer di dalam domain kita saja yang akan kita layani recursive-requestnya. Diperlukan suatu kontrol terhadap domain mana saja yang boleh melakukan zone-transfer melalui DNS server kita, disini kita akan menutup semua request zone-transfer dari manapun, untuk membatasinya akan kita gunakan fitur acl, kita namakan "xfernet": acl "xfernet" { none; }; Sekarang kita akan mendefinisikan wilayah dari jaringan kita yang bisa dipercaya dengan menggunakan acl "trustednet", hanya dari acl ini request recursive akan dilayani, localnets akan diambilkan dari network interface dimana BIND berada. acl "trustednet" { localnets; localhost; }; IANA menetapkan beberapa netblok yang tidak bisa dipakai di internet, karena netblok itu masih dalam status eksperimental, reserved ataupun multicast, dan kita bisa merujuk dari netblok tersebut dan menolak request apabila ada yang datang dari netblok tersebut, untuk lebih lanjut silahkan lihat http://www.iana.org/assignments/ipv4-address-space. Pada BIND versi 8 dan 9, sudah mempunyai fitur logging yang bisa dimodifikasi sesuai keinginan kita, dari fitur ini kita bisa menentukan log berdasarkan kategori dan tingkatnya, hal ini akan membantu kita menganalisa kinerja maupun keamanan DNS, secara spesifik yang akan kita monitor adalah debugging output dari BIND , negative-caching, security dan statistik, yang lain bisa ditambahkan sesuai kondisi yang ingin dimonitor. Biasanya Service Provider upstream menyediakan DNS server yang bisa kita gunakan untuk meneruskan query yang tidak ada didalam cache, untuk itu kita bisa memanfaatkannya, karena kemungkinan besar, round-trip time yang dihasilkan antara melakukan query dari upstream DNS dibandingkan langsung ke root-servers yang tertera di "hint" akan lebih pendek, bila upstream DNS tidak bisa menemukan jawabannya, baru kita bisa langsung bertanya kepada root-servers. forward first; forwarders { 202.155.0.10; 202.155.0.15; }; Option max-cache-size dapat digunakan untuk membatasi banyaknya cache dan zone yang bisa disimpan kedalam memori, bila kurang akan mempunyai dampak cache-hit-rate yang rendah dan traffic DNS yang tinggi. Untuk mengetahui batas yang aman dan terbaik, monitor kinerja DNS selama satu minggu dan ambil alokasi memori terbaik dari operasi tersebut. datasize 20M; max-cache-size 15M; Ada dua view yang akan dipakai, internal-in dan external-in, yang pertama adalah view untuk jaringan lokal, jaringan lokal boleh melakukan recursive-query melalui nameserver kita dan external-in akan akan membatasi request dengan jawaban diseputar domain kita. Setelah dimodifikasi, berikut ini hasilnya /////////////////////////////////////////////////////////////// // // Baris yang diawali dengan 2 karakter ini merupakan komentar // Konfigurasikan Access Control List (ACL) acl "xfernet" { none; // tolak semua akses zone-transfer ke domain kita // apabila kita punya domain server lain selain disini // tuliskan alamat IP nya disini! }; acl "trustednet" { localnets; // letakkan alamat IP network kita disini localhost; // semua alamat IP ini boleh melakukan recursive // query ke nameserver kita, dan otomatis // akan menolak komputer diluar yang akan // "menunggangi" kita. }; acl "bogusnet" { // tolak request dari netblock yang belum dipakai di internet, // daftar-daftar netblock dibawah ini merupakan daftar // yang ditentukan oleh IANA.ORG sebagai test, experimental // dan reserved netblock dan tidak akan dipakai di internet // namun perlu dicek secara reguler apakah sudah diserahkan // ke salah satu registrar di internet, PENTING. 0.0.0.0/8; 1.0.0.0/8; 2.0.0.0/8; 5.0.0.0/8; 7.0.0.0/8; 10.0.0.0/8; 23.0.0.0/8; 27.0.0.0/8; 31.0.0.0/8; 36.0.0.0/8; 37.0.0.0/8; 39.0.0.0/8; 41.0.0.0/8; 42.0.0.0/8; 49.0.0.0/8; 50.0.0.0/8; 58.0.0.0/8; 59.0.0.0/8; 60.0.0.0/8; 69.0.0.0/8; 70.0.0.0/8; 71.0.0.0/8; 72.0.0.0/8; 73.0.0.0/8; 74.0.0.0/8; 75.0.0.0/8; 76.0.0.0/8; 77.0.0.0/8; 78.0.0.0/8; 79.0.0.0/8; 82.0.0.0/8; 83.0.0.0/8; 84.0.0.0/8; 85.0.0.0/8; 86.0.0.0/8; 87.0.0.0/8; 88.0.0.0/8; 89.0.0.0/8; 90.0.0.0/8; 91.0.0.0/8; 92.0.0.0/8; 93.0.0.0/8; 94.0.0.0/8; 95.0.0.0/8; 96.0.0.0/8; 97.0.0.0/8; 98.0.0.0/8; 99.0.0.0/8; 100.0.0.0/8; 101.0.0.0/8; 102.0.0.0/8; 103.0.0.0/8; 104.0.0.0/8; 105.0.0.0/8; 106.0.0.0/8; 107.0.0.0/8; 108.0.0.0/8; 109.0.0.0/8; 110.0.0.0/8; 111.0.0.0/8; 112.0.0.0/8; 113.0.0.0/8; 114.0.0.0/8; 115.0.0.0/8; 116.0.0.0/8; 117.0.0.0/8; 118.0.0.0/8; 119.0.0.0/8; 120.0.0.0/8; 121.0.0.0/8; 122.0.0.0/8; 123.0.0.0/8; 124.0.0.0/8; 125.0.0.0/8; 126.0.0.0/8; 127.0.0.0/8; 169.254.0.0/16; 172.16.0.0/12; 192.0.2.0/24; 192.168.0.0/16; 197.0.0.0/8; 201.0.0.0/8; 221.0.0.0/8; 222.0.0.0/8; 223.0.0.0/8; 224.0.0.0/3; }; logging { category lame-servers { null; }; category cname { null; }; // default-level dari debugging output // rotate 3 file max 20Mbytes each channel named_debug { file "/var/chroot/named/log/named.debug.log" versions 3 size 20m; severity debug 4; print-time yes; print-category yes; }; category default { default_syslog; default_debug; named_debug; }; // log masalah pada sistem operasi ke named.os.log channel os_info { severity debug; file "/var/chroot/named/log/named.os.log" versions 3 size 5m; print-time yes; print-category yes; }; category os { os_info; default_syslog; named_debug; }; // Log semua transaksi, penting: banyaknya file log yang disimpan // harus dibatasi dan diperbaharui (rotate) secara berkala // karena file ini akan cenderung berukuran besar, // gunakan fitur ini dengan hati-hati dan fungsikan hanya // untuk menganalisa kinerja DNS // channel query_info { // severity info; // file "/var/chroot/named/log/named.query.log" versions 3 size 50m; // print-time yes; // print-category yes; // }; // category queries { query_info; named_debug; }; // approval dan denial requests, pisahkan sendiri channel security_info { severity debug; file "/var/chroot/named/log/named.security.log" versions 3 size 5m; print-time yes; print-category yes; }; category security { security_info; default_syslog; default_debug; }; // negative-caching logs channel cache_info { severity debug; file "/var/chroot/named/log/named.cache.log" versions 3 size 5m; print-time yes; print-category yes; }; category ncache { cache_info; default_syslog; default_debug; }; // masalah serius yang berhubungan dengan proses BIND channel panic_info { severity debug; file "/var/chroot/named/log/named.panic.log" versions 3 size 5m; print-time yes; print-category yes; }; category panic { panic_info; default_syslog; default_debug; }; // informasi statistik channel stats_info { severity debug; file "/var/chroot/named/log/named.stats.log" versions 3 size 5m; print-time yes; print-category yes; }; category statistics { stats_info; }; channel response_info { null; }; category response-checks { response_info; }; }; options { // dimana kita akan meletakkan chrooted-named berada directory "/var/chroot/named/namedb"; pid-file "/var/chroot/named/named.pid"; // kumpulan file-file statistik untuk mendiagnosa // kinerja BIND statistics-file "/var/chroot/named/named.stat"; // memstatistics-file "/var/chroot/named/named.memstat"; dump-file "/var/chroot/named/named.dump"; zone-statistics yes; // Safety nets datasize 50M; // max-cache-size 45M; // Tanya ke DNS ISP, dan bila tidak ketemu, cari sendiri. forward first; forwarders { 202.155.0.10; 202.155.0.15; }; // Hal ini akan memperlambat update dari master // ke slave, karena slave akan menggunakan mekanisme // REFRESH yang tertera di RR SOA, tapi hal ini bisa diatasi // juga dengan memberikan nilai REFRESH lebih kecil dari // biasanya, your call. notify no; // Gunakan fitur ini untuk mengirimkan multiple answer // pada waktu proses zone-transfer berjalan, efisien. transfer-format many-answers; // Konfigurasikan maksimum lamanya zone-transfer bisa // berlangsung (60 menit), modifikasi bila domain yang // ditangani cukup besar. max-transfer-in 60; // Gunakan ini bila kita menggunakan alamat IP statis interface-interval 0; allow-transfer { // zone-transfer dibatasi hanya pada alamat yang tertera // di acl "xfer", saat ini tidak ada satupun komputer yang // boleh melakukan zone-transfer dari komputer ini xfernet; }; allow-query { // Konfigurasi ini akan mencegah komputer diluar domain kita // memanfaatkan kita sebagai free DNS server. trustednet; }; blackhole { // blackhole adalah suatu fenomena fiktif dimana bila seseorang // dikirim melaluinya dapat menempuh jarak jauh dalam waktu // yang sangat pendek, tetapi disini mereka akan berakhir di // /dev/null. bogusnet; }; }; view "internal-in" { // view buat jaringan internal, kita mengijinkan komputer di // domain kita untuk meminta informasi domain kita sendiri // maupun domain diluar kita secara recursive. match-clients { trustednet; }; recursion yes; additional-from-cache yes; additional-from-auth yes; zone "." in { // rootservers cache type hint; file "db.cache"; }; zone "0.0.127.in-addr.arpa" in { // query untuk network 127/8, tanpa zone-transfer type master; file "master-in/db.0.0.127.in-addr.arpa"; notify no; allow-query { any; }; allow-transfer { none; }; }; zone "255.in-addr.arpa" in { type master; file "master-in/db.255.in-addr.arpa"; notify no; allow-query { any; }; allow-transfer { none; }; }; zone "stikom.edu" in { type master; file "master-in/db.stikom.edu"; }; zone "19.155.202.in-addr.arpa" in { type master; file "master-in/db.19.155.202.in-addr.arpa"; }; // bila kita bertindak sebagai slave domainlain // cantumkan disini // zone "domainlain.com" in { // type slave; // file "slave-in/db.domainlain.com"; // masters { // 128.82.3.4; // }; // // allow-query { // any; // }; // // }; // // zone "0/25.3.82.128.in-addr.arpa" in { // type slave; // file "slave-in/db.0_25_3.82.128.in-addr.arpa"; // masters { // 128.82.3.4; // }; // // }; }; // view external-in, dari komputer luar ke nameserver kita // tidak melayani recursive dan zone-transfer view "external-in" in { match-clients { any; }; recursion no; additional-from-cache no; additional-from-auth no; zone "." in { type hint; file "db.cache"; }; zone "stikom.edu" in { type master; file "master-ex/db.stikom.edu"; allow-query { any; }; }; zone "19.155.202.in-addr.arpa" in { type master; file "master-ex/db.19.155.202.in-addr.arpa"; allow-query { any; }; }; // cantumkan slave disini bila kita berfungsi sebagai // slave dari domainlain.com // zone "domainlain.com" in { // type slave; // file "slave-ex/db.domainlain.com"; // masters { // 128.82.3.4; // }; // // allow-query { // any; // }; // // }; // // zone "0/25.3.82.128.in-addr.arpa" in { // type slave; // file "slave-ex/db.0_25.3.82.128.in-addr.arpa"; // masters { // 128.82.3.4; // }; // // allow-query { // any; // }; // // }; }; // Buat view untuk semua komputer yang menggunakan class CHAOS // hanya membolehkan komputer dari localhost saja yang bisa // mengetahui versi dari BIND view "external-chaos" chaos { match-clients { any; }; recursion no; zone "." { type hint; file "/dev/null"; }; zone "bind" { type master; file "db.bind"; allow-query { trustednet; }; allow-transfer { none; }; }; }; // ////////////////////////////////////////////////// File db.bind file ini digunakan untuk melacak request CHAOS TXT dari version.bind dan authors.bind. Kita juga bisa mengubah output dari versi BIND melalui file ini juga, $TTL 1D $ORIGIN bind. @ 1D CHAOS SOA localhost. root.localhost. ( 2001013101 ; serial 3H ; refresh 1H ; retry 1W ; expiry 1D ) ; minimum CHAOS NS localhost. version.bind. CHAOS TXT "BIND 9.1.3+robhacks" authors.bind. CHAOS TXT "are better coders than I. :)" Kesimpulan BIND merupakan DNS server yang paling sering dipakai dan digunakan oleh berbagai Service Provider untuk melayani layanan DNS, apabila dikonfigurasikan dan diimplementasikan secara benar akan bernilai lebih dan berguna sebagai sarana belajar DNS. Have fun! Referensi: Securing BIND: How to prevent your DNS server from being hacked http://rr.sans.org/DNS/sec_BIND.php Securing BIND http://www.psionic.com/papers/whitep01.html Rob Thomas, Secure BIND template http://www.cymru.com/Documents/secure-bind-template.html INPO: Rob Thomas Mia Familia, STIKOM Linux User Group, "Geek Tested, Mother Approved" Kylie, for staying up late :) feedback? mail: info_AT_lug_DOT_stikom_DOT_edu