Giới thiệu.
Nói đến Active Directory, bạn sẽ nghĩ ngay tới Microsoft, vì MS chính là người tạo nên AD. Bản thân mình cũng hay dùng AD với mục đích chính SSO (Single Sign On), 1 account đăng nhập mọi service trong hệ thống (tính cả windows và linux).
Tuy nhiên với Windows OS thì có 1 bất lợi khá lớn là nó dùng resource khá nhiều, nên nhiều khi để chạy lên đầy đủ service Windows có thể tốn nhiều thời gian hơn. Vì vậy mình cần 1 hướng thay thế khác.
Và thật may mắn khi samba từ version 4 đã support AD. Bài viết cài đặt Domain Controller (ADDC) với Samb này dành cho bạn nào thích dùng AD mà ngại bản quyền và mức độ ngốn resource của Windows.
Trước khi bắt đầu, bạn nên có những kỹ năng sau.
-
- Compile application from source.
- Linux basic administration
- Log debugging.
Cấu hình
-
- OS: Debian 10 (buster)
- SAMBA: 4.11
- BIND9: 9.11
- NTP: 4.2
- ISC-DHCP: 4.4
Cài đặt những app cần thiết.
Trong bài viết này mình sẽ cài đặt SAMBA và BIND từ source, lý do là bản cài đặt từ distro ko có support tính năng DLZ và mit-krb5, để cài đặt được từ source bạn phải có những thư viện quan trọng.
Câu lệnh
# apt-get install -y acl attr autoconf bison build-essential debhelper dnsutils docbook-xml docbook-xsl \ flex gdb krb5-kdc krb5-user libacl1-dev libaio-dev libarchive-dev libattr1-dev libblkid-dev libbsd-dev \ libkrb5-dev libcap-dev libcups2-dev libgnutls28-dev libgpgme-dev libjson-perl libldap2-dev libncurses5-dev \ libpam0g-dev libpopt-dev libssl-dev libreadline-dev liblmdb-dev libicu-dev libtracker-sparql-2.0-dev libjson-c-dev \ libjansson-dev nettle-dev perl perl-modules-5.28 python3-all-dev python3-crypto lmdb-utils libtasn1-bin \ libparse-yapp-perl ldb-tools python3-dbg python3-dnspython python3-gpg python3-markdown python3-ply \ python3-dev xsltproc zlib1g-dev iputils-ping ca-certificates wget iproute2 gnupg2 binutils pkg-config procps
Chờ cho toàn bộ app và thư viện được cài đặt, tiếp theo download 2 bộ source của SAMBA và BIND9
# wget https://downloads.isc.org/isc/bind9/9.11.24/bind-9.11.24.tar.gz -O /usr/src/bind-9.11.24.tar.gz \ && tar xvzf /usr/src/bind-9.11.24.tar.gz -C /usr/src \ && rm -f /usr/src/bind-9.11.24.tar.gz \ && wget https://download.samba.org/pub/samba/stable/samba-4.11.15.tar.gz -O /usr/src/samba-4.11.15.tar.gz \ && tar xvzf /usr/src/samba-4.11.15.tar.gz -C /usr/src \ && rm -f /usr/src/samba-4.11.15.tar.gz
Bạn nhớ kiểm tra xem trong thư mục /usr/src xem đã có 2 directory với tên là samba-xxx và bind-xxx.
Cài đặt BIND9 (DNS service).
Trước khi cài đặt, chúng ta cần tạo 1 user mới đi chung với service này, mục đích là khởi động dịch vụ với user mới này.
# adduser --system --home /var/named --group --disabled-login --disabled-password named
Sau khi xong, ta bắt đầu cài đặt. Câu lệnh:
# cd /usr/src/bind-9.11.24 \ && ./configure --enable-threads --with-libtool --with-dlopen=yes --prefix=/usr \ --sysconfdir=/etc/bind --with-gssapi=/usr --with-lmdb=/usr --with-openssl=/usr \ --mandir=/usr/share/man --infodir=/usr/share/info --with-python=python3 \ --with-randomdev=/dev/urandom --with-dlz-filesystem=yes --with-dlz-ldap=yes \ --with-zlib --with-openssl --enable-filter-aaaa \ && make && make install && cd ~
Cài đặt sẽ mất 1 khoản thời gian để hoàn thành nên bạn đi kiếm gì uống đi nha.
Sau khi hoàn thành, chúng ta nên kiểm tra xem app đã được cài đặt thành công hay không. Sử dụng
# which named
hoặc
# named -V
Cấu hình BIND9.
Để service chạy ok, chúng ta nên bắt đầu cấu hình nó. Đây là bản cài đặt từ source nên tất cả file cấu hình đều sẽ không có, bạn phải tạo mới hoàn toàn.
BIND service sẽ yêu cầu file cấu hình cơ bản, vị trí /etc/bind/named.conf. Chúng ta tạo file named và cấu hình nó. Câu lệnh:
# tee -a /etc/bind/named.conf > /dev/null << EOT acl local { localhost; 127.0.0.1; }; acl trusted { }; # Global Configuration Options options { # Misc configuration auth-nxdomain yes; directory "/var/named"; pid-file "/var/named/run/named.pid"; session-keyfile "/var/named/run/session.key"; notify no; empty-zones-enable no; dnssec-validation yes; dnssec-enable yes; #tkey-gssapi-keytab "/var/lib/samba/private/dns.keytab"; minimal-responses yes; max-cache-size 16M; recursive-clients 50; # IP addresses and network ranges allowed to query the DNS server: allow-query { local; trusted; }; # IP addresses and network ranges allowed to run recursive queries: # (Zones not served by this DNS server) allow-recursion { local; trusted; }; # Forward queries that cannot be answered from own zones # to these DNS servers: forwarders { 8.8.8.8; 8.8.4.4; }; # Disable zone transfers allow-transfer { none; }; }; # Root Servers # (Required for recursive DNS queries) zone "." { type hint; file "named.root"; }; # localhost zone zone "localhost" { type master; file "master/localhost.zone"; }; # 127.0.0. zone. zone "0.0.127.in-addr.arpa" { type master; file "master/0.0.127.zone"; }; # Samba DNS_DLZ. #include "/var/lib/samba/bind-dns/named.conf"; EOT
Sau đó chúng ta nên tạo directory run để chứa pid và session file (thường nếu chạy service dưới quyền khác root sẽ hay bị lỗi permission denied, vì thế tốt nhất là lưu file pid vào chỗ mà mình có thể quản lý), thêm 1 directory nữa tên master để chứa file cấu hình zone.
# sudo -u named mkdir /var/named/master /var/named/run
Kế tiếp, chúng ta cần cấu hình localhost zone, mục đích là cho server có thể hiểu chính nó. Câu lệnh:
# sudo -u named tee -a /var/named/master/localhost.zone > /dev/null << EOT \$TTL 3D \$ORIGIN localhost. @ 1D IN SOA @ root ( 2013050101 ; serial 8H ; refresh 2H ; retry 4W ; expiry 1D ; minimum ) @ IN NS @ IN A 127.0.0.1 EOT
và
# sudo -u named tee -a /var/named/master/0.0.127.zone > /dev/null << EOT \$TTL 3D @ IN SOA localhost. root.localhost. ( 2013050101 ; Serial 8H ; Refresh 2H ; Retry 4W ; Expire 1D ; Minimum TTL ) IN NS localhost. 1 IN PTR localhost. EOT
Và cuối cùng là root.zone
# wget -q -O /var/named/named.root http://www.internic.net/zones/named.root
Tới đây ta phải set lại permission của tất cả các file vừa mới tạo.
# chown root:named /etc/bind/named.conf /var/named/named.root /var/named/master/localhost.zone /var/named/master/0.0.127.zone \ && chmod 640 /etc/bind/named.conf /var/named/named.root /var/named/master/localhost.zone /var/named/master/0.0.127.zone
Hiện tại, BIND được cấu hình mà chưa cho phép IP nào có thể chạy query, câu lệnh dưới đây sẽ cho phép bạn thêm 1 dãy IP vào bên trong BIND service.
# sed -i 's/trusted {/&\n <network>\/<netmask>;/g' /etc/bind/named.conf
Ví dụ:
# sed -i 's/trusted {/&\n 10.63.0.0\/24;/g' /etc/bind/named.conf
Tới đây thì bạn đã xong phần cấu hình cho BIND, kế tiếp tạo 1 file service trong systemd, file này có tác dụng quản lý service BIND.
# tee -a /lib/systemd/system/bind9.service > /dev/null << EOT [Unit] Description=BIND Domain Name Server After=network.target Wants=nss-lookup.target Before=nss-lookup.target [Service] ExecStart=/usr/sbin/named -4 -f -u named ExecReload=/usr/sbin/rndc reload ExecStop=/usr/sbin/rndc stop [Install] WantedBy=multi-user.target EOT
Giờ ta enable cái service và start nó lên.
# systemctl enable bind9.service && systemctl start bind9.service
Cài đặt SAMBA
Chúng ta đã download và extract source, nên giờ chúng ta chỉ cần install samba mà thôi. Câu lệnh.
# cd /usr/src/samba-4.11.15 \ && ./configure --with-system-mitkrb5 --with-experimental-mit-ad-dc \ --with-systemd --enable-fhs --datarootdir=/usr/share \ --sysconfdir=/etc --prefix=/usr --libdir=/usr/lib --localstatedir=/var \ --pythondir=/usr/lib/python3.7/site-packages \ --pythonarchdir=/usr/lib/python3.7/site-packages \ && make && make install && cd ~
Nhớ kiểm tra xem SAMBA đã được cài ok hay chưa nhé.
# samba -b
Giờ mình chỉ cần tạo thêm file service dành cho systemd.
# tee -a /lib/systemd/system/samba-ad-dc.service > /dev/null << EOT [Unit] Description=Samba Active Directory Domain Controller After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/usr/sbin/samba -D PIDFile=/var/run/samba/samba.pid ExecReload=/bin/kill -HUP $MAINPID [Install] WantedBy=multi-user.target EOT
Sau khi tạo xong file service, tiện thể cho enable service đó luôn
# systemctl enable samba-ad-dc.service
Tuy nhiên chỉ enable thôi, chưa start ngay nhé, vì mình cần phải setup DC trước.
Cài đặt NTP service
Package này cũng được cài thằng từ debian repo.
# apt-get install -y ntp
Sau đó ta chỉ cần start ntp service lên và kiểm tra xem thời gian có chính xác không.
# date
Các bước chuẩn bị trước khi tạo hoặc tham gia DOMAIN.
Trước khi chúng ta tạo mới hoặc tham gia DOMAIN, tất cả các bước liên quan sao nên được hoàn thành, để tránh bị xung dột.
Thực hiện câu lệnh dưới đây rồi kill tất cả process có liên quan.
# ps ax | egrep "samba|smbd|nmbd|winbindd"
Xóa file /etc/krb5.conf, nếu có.
# rm -f /etc/krb5.conf
Xóa file database của samba, nếu có.
# rm -f $(find / -regextype posix-extended -regex '.*\.(ldb|tdb)$') \ && rm -f /etc/samba/smb.conf
Cài đặt DOMAIN mới (dành cho domain mới hoàn toàn).
Để cài đặt Domain controller trên server mới hoàn toàn, dưới đây sẽ là câu lệnh phù hợp cho bạn.
# samba-tool domain provision --server-role=dc --use-rfc2307 --dns-backend=BIND_DLZ --realm=<full domain> --domain=<domain> --adminpass=<password> -d3
Sau khi hoàn thành tạo domain mới, bạn nên thực hiện thêm câu lệnh dưới đây.
# cp /var/lib/samba/private/krb5.conf /etc/krb5.conf \ && chown -R root:named /var/lib/samba/bind-dns
Bạn có thể start samba service lúc này hoặc có thể tiến tới mục tiếp theo.
Tham gia vào DOMAIN hiện tai.
Để cài đặt Domain controller trên server hiện tại, trước tiên, chúng ta phải cấu hình file krb5.conf
# tee -a /etc/krb5.conf > /dev/null << EOT [libdefaults] default_realm = OUTSOURCEIT-INT.BIZ dns_lookup_realm = false dns_lookup_kdc = true EOT
Kế tiếp, chúng ta thực hiện việc join domain của server hiện tại, sau câu lệnh này bản thân server này cũng sẽ trở thành DC, thực thi:
kinit <domain admin user> \ && samba-tool domain join <Domain> DC --dns-backend=BIND9_DLZ --krb5-ccache=/tmp/krb5cc_0 -d3
Tiếp tục, ta cần chỉnh quyền của thư mục bind-dns để DNS service có thể truy cập thông tin từ đây.
# chown -R root:named /var/lib/samba/bind-dns
Cài đặt DHCP service
Cài đặt DHCPD
Package này đã có sẵn trong REPO nên ta chỉ cần thực thi:
# apt-get install isc-dhcp-server \ && systemctl stop isc-dhcp-server.service
Cấu hình DHCPD service.
Bạn có thể xem 1 số tài liệu về setting DHCP server, ở đây mình chỉ hướng dẫn cách để DHCP có thể update dns name của client lên DNS server.
Đầu tiên bạn phải tạo 1 user cho phép dhcp gởi thông tin về DNS của client vào AD, sau đó setting thêm user này ko bao giờ bị expire luôn.
# samba-tool user create dhcpduser --description="Unprivileged user for TSIG-GSSAPI DNS updates via ISC DHCP server" --random-password \ && samba-tool user setexpiry dhcpduser --noexpiry \ && samba-tool group addmembers DnsAdmins dhcpduser
Sau đó xuất thông tin người dùng dhcpduser ra keytab, khi dùng keytab thì khi chạy sẽ ko cần password.
# samba-tool domain exportkeytab --principal=dhcpduser@<full domain> /etc/dhcpduser.keytab \ && chown root:root /etc/dhcpduser.keytab \ && chmod 400 /etc/dhcpduser.keytab
Kế tiếp, bạn download file này “dhcp-dyndns” rồi giải nén và lưu vào /usr/local/bin, nhớ chmod 775 file thực thi này nhé.
# chmod 755 /usr/local/bin/dhcp-dyndns.sh
Tới đây thì bạn đã có thể start service DHCPD.
Các bước thực hiện sau khi tạo hoặc tham gia DOMAIN
Sau khi hoàn thành cài đặt domain, bạn nên bổ sung thêm 1 số config vào SAMBA để:
-
- Bạn có thể đăng nhập vào domain server dưới danh nghĩa DOmain account.
- Ngăn chặn tính năng CUPS (printer mangement).
- Cho phép update DNS từ SAMBA tới BIND
Thực thi:
sed -i 's/\[global\]/&\n\ \tallow dns updates = nonsecure\ \tdisable spoolss = Yes\ \tdns update command = \/usr\/sbin\/samba_dnsupdate --use-samba-tool\ \tprintcap name = \/dev\/null\ \ttemplate homedir = \/home\/%D\/%U\ \ttemplate shell = \/bin\/bash\ \twinbind refresh tickets = Yes\ \twinbind use default domain = Yes\ \tserver role check:inhibit = Yes\ \tidmap_ldb:use rfc2307 = Yes\ /g' /etc/samba/smb.conf
Tinh chỉnh BIND để cho phép DNS service truy cập thông tin record từ SAMBA, câu lệnh
sed -i 's/#tkey-gssapi-keytab/tkey-gssapi-keytab/g' /etc/bind/named.conf \ && sed -i 's/#include/include/g' /etc/bind/named.conf
Đến đây thì mọi thứ đã hoàn thành, cái bạn cần làm bây giờ là start tất cả service có liên quan.
Khởi động dịch vụ.
DHCP service
# systemctl start isc-dhcp-server.service
Domain service
# systemctl start samba-ad-dc.service
DNS service.
# systemctl restart bind9
Tác giả: Nhã Phạm (zazxxxlh)