Cài đặt Domain Controller (ADDC) với Samba

Cài đặt Domain controller với samba

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

# 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)