You are on page 1of 8

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

--- Nha Pham (zazxxxlh) ---

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 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ừ distro ko có support
tính năng DLZ (BIND9) và mit-krb5 (SAMBA4).

Để 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 libicu-dev \
libncurses5-dev libpam0g-dev libpopt-dev libssl-dev libreadline-dev liblmdb-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

Sau khi cài đặt hoàn tất, ta sẽ download 2 bộ source của SAMBA và BIND9 và giải nén, câu lệnh:

# 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, ta nên tạo một user mới, mục đích là khởi động dịch vụ DNS với user này.

# adduser --system --home /var/named --group --disabled-login --disabled-password


named

Sau đó, ta bắt đầu cài BIND9, 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 nhé.

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.


Ta cài BIND9 từ source nên sẽ không tồn tại file configuration sẵn như install từ repo, vì vậy ta sẽ tạo lại
file config mới.

File cấu hình chính /etc/bind/named.conf. 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, ta cần cấu hình zone localhost, mục đích là cho server có thể hiểu chính nó (localhost), 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

Tiếp, localhost reverse


# 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.61.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


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 ~

Tiếp tục kiếm gì uống nhé, cài đặt sẽ mất một khoản thời gian đó. Sau khi hoàn thành, nhớ kiểm tra xem
SAMBA đã được cài thành công hay chưa, câu lệ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 cài thằng từ debian repo nên cũng không có gì đặt biệt.

# 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 đột khi tạo hoặc join Domain.

Thực hiện câu lệnh dưới đây rồi kill tất cả process nếu câu lệnh trả về giá trị.

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


Trường hợp bạn tạo một Domain 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=BIND9_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 tại.


Trước tiên, chúng ta phải cấu hình file krb5.conf, câu lệnh.

# 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 chỉnh quyền của thư mục bind-dns để DNS service có thể truy cập thông tin của record.

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

You might also like