Tips & Tricks AD → Linux Migration
So sánh · Triển khai · Migration · Full Linux · Chuẩn tài liệu hãng

Từ Windows Active Directory sang hạ tầng Linux

Bảng so sánh dịch vụ AD ↔ Linux · Hướng dẫn triển khai Samba AD DC & FreeIPA · Phương án migration khi đang chạy full Windows AD với client hỗn hợp Windows + Linux · Lộ trình chuyển đổi hoàn toàn sang client Linux. Mọi lệnh trích dẫn từ tài liệu chính thống của hãng (Samba, Red Hat, Canonical, ISC, Microsoft).

Windows Server AD DS Samba AD DC · FreeIPA SSSD · Kerberos · LDAP Có chú thích nguồn

Tổng quan & Cách đọc tài liệu

Hai "stack" thay thế AD trên Linux · Nguyên tắc chọn

Trên Linux không có một sản phẩm duy nhất làm được đúng mọi vai trò của Windows AD. Thay vào đó có hai stack chính, chọn theo loại client bạn sẽ giữ lại:

Samba AD Domain Controller
Bản sao AD trung thực nhất

Triển khai chính giao thức AD DC (LDAP + Kerberos + DNS + SYSVOL + SMB + FSMO). Client Windows join domain y hệt AD thật, quản lý GPO qua RSAT/GPMC.

Chọn khi còn nhiều client Windows hoặc muốn thay 1-1 Domain Controller.

Nguồn: wiki.samba.org

FreeIPA / Red Hat IdM
Identity gốc Linux

Ngăn xếp 389 DS + MIT Kerberos + Dogtag CA + BIND + SSSD + HBAC/sudo. Tối ưu cho máy Linux; hỗ trợ cross-forest trust với AD để chạy song song trong giai đoạn migration.

Chọn khi đích đến là client Linux (Phần IV).

Nguồn: freeipa.org · Red Hat IdM

3 giới hạn phải biết trước khi bỏ Windows AD:
  • AD CS (PKI): Samba AD DC không chạy được Certificate Services — cần dùng FreeIPA Dogtag, step-ca hoặc EJBCA riêng.
  • SYSVOL replication: Samba không hỗ trợ DFS-R gốc; nhiều DC phải đồng bộ SYSVOL bằng rsync/osync.
  • Sửa GPO: chỉ làm được bằng RSAT/GPMC trên máy Windows — không có công cụ CLI tương đương.
Nguồn: wiki.samba.org/FAQ · SysVol replication (DFS-R)
I

Bảng so sánh dịch vụ Windows AD ↔ Linux

Mọi vai trò trong "full AD" và giải pháp mã nguồn mở tương đương

Dịch vụ Windows AD Vai trò Linux tương đương Mức độ / Ghi chú
AD DS (Directory) Kho identity trung tâm Samba AD DC · FreeIPA (389 DS) Tương đương cao
LDAP Truy vấn thư mục 389 Directory Server · OpenLDAP · Samba LDAP LDAPv3, gần như 1-1
Kerberos KDC SSO / xác thực MIT Kerberos · Heimdal (tích hợp trong Samba/FreeIPA) Cần đồng hồ lệch < 5 phút
AD DNS Phân giải tên + SRV Samba INTERNAL_DNS · BIND9 (bind-dyndb-ldap / DLZ) Không hỗ trợ zone-transfer ra DNS non-AD (INTERNAL)
Group Policy (GPO) Áp cấu hình/khóa client SSSD GPO + ADSys (Win client) · FreeIPA HBAC/sudo/ID Views + Ansible (Linux) Không 1-1 — ghép nhiều công cụ
DHCP Cấp IP động ISC Kea DHCP ISC dhcpd đã EOL → dùng Kea
Time (W32Time) Đồng bộ giờ chrony Bắt buộc cho Kerberos. Không dùng ntpsec với Samba
AD CS (PKI) Cấp/thu hồi chứng chỉ FreeIPA Dogtag CA · step-ca · EJBCA Samba KHÔNG có — dịch vụ riêng
File server (SMB) Chia sẻ file Samba (file server / domain member) SMB2/3, ACL Windows
Print server Quản lý in ấn CUPS (+ Samba bridge cho client Windows) Mỗi queue CUPS = 1 SMB share
RADIUS / NPS 802.1X / VPN auth FreeRADIUS (backend AD/LDAP + ntlm_auth) PEAP/MSCHAPv2 cần domain-join + ntlm_auth
AD FS (Federation) SAML / OIDC SSO Keycloak User federation → LDAP/AD
WSUS Quản lý bản vá apt-mirror · dnf reposync+createrepo · Landscape · Foreman/Katello WSUS ngừng thêm tính năng từ 9/2024
GP Client (agent) Agent phía client SSSD (+ realmd để join) Caching, offline login
FSMO roles 5 vai trò master Samba AD DC (đủ 5 roles) samba-tool fsmo
Cột "Linux tương đương" liệt kê lựa chọn phổ biến nhất theo tài liệu hãng. Chi tiết lệnh triển khai từng dịch vụ ở Phần II; danh sách URL đầy đủ ở mục Nguồn tài liệu.
II

Triển khai các dịch vụ Linux tương đương

Step-by-step từ tài liệu Samba / Red Hat / Canonical / ISC

II.1 · Samba Active Directory Domain Controller (Ubuntu 24.04)

1. Cài package & dọn service xung đột

# Ubuntu 24.04 LTS — cài Samba AD DC và công cụ
sudo apt update
sudo apt install -y samba-ad-dc krb5-user bind9-dnsutils winbind smbclient

# Dừng & mask smbd/nmbd/winbind — dịch vụ samba-ad-dc tự quản lý chúng
sudo systemctl disable --now smbd nmbd winbind
sudo systemctl mask smbd nmbd winbind

# Xóa smb.conf và DB cũ để provision tạo mới sạch
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.orig
sudo rm -rf /var/lib/samba/private/*.ldb /var/lib/samba/private/*.tdb

Nguồn: ubuntu.com — Provision Samba AD Controller · wiki.samba.org — Managing Samba AD DC Service

2. Provision domain

sudo samba-tool domain provision \
  --server-role=dc \
  --use-rfc2307 \
  --realm=COMPANY.LOCAL \
  --domain=COMPANY \
  --dns-backend=SAMBA_INTERNAL \
  --adminpass='StrongAdminPassword123!'

# --realm     : Kerberos realm (VIẾT HOA, là FQDN của domain)
# --domain    : tên NetBIOS (tối đa 15 ký tự)
# --use-rfc2307: bật ánh xạ UID/GID Unix cho tài khoản Linux
# --dns-backend: SAMBA_INTERNAL (nhỏ) hoặc BIND9_DLZ (nhiều DC / zone ngoài)

Nguồn: wiki.samba.org — Setting up Samba as an AD DC

3. Cấu hình Kerberos, DNS resolver, chrony & khởi động

# Copy krb5.conf do provision sinh ra (KHÔNG symlink — thư mục private chỉ root đọc)
sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf

# Trỏ DNS resolver về chính DC (sửa /etc/resolv.conf hoặc netplan)
# nameserver 10.99.0.1   (IP của DC)
# search company.local

# Đồng bộ giờ — bắt buộc cho Kerberos (chrony, KHÔNG dùng ntpsec)
sudo apt install -y chrony

# Bật & khởi động dịch vụ AD DC
sudo systemctl unmask samba-ad-dc
sudo systemctl enable --now samba-ad-dc
sudo systemctl status samba-ad-dc

Nguồn: wiki.samba.org — Time Synchronisation

4. Kiểm tra sau cài

# Kerberos: lấy vé TGT
kinit [email protected] && klist

# Bản ghi SRV (quyết định việc client tìm thấy domain)
host -t SRV _ldap._tcp.company.local.
host -t SRV _kerberos._udp.company.local.

# SMB: phải thấy NETLOGON & SYSVOL
smbclient -L localhost -N

Nguồn: ubuntu.com — Provision Samba AD Controller

II.2 · FreeIPA / Red Hat IdM (Rocky/RHEL 9)

Yêu cầu trước: FQDN phân giải đúng (thuận + nghịch), IP tĩnh, entry trong /etc/hosts, IPv6 kernel bật, giờ đồng bộ. Log cài: /var/log/ipaserver-install.log.

1. Cài server (kèm DNS tích hợp)

sudo dnf install -y ipa-server ipa-server-dns

sudo ipa-server-install \
  --realm=COMPANY.LOCAL \
  --domain=company.local \
  --ds-password='DirMgrPass123' \
  --admin-password='AdminPass123' \
  --setup-dns \
  --forwarder=8.8.8.8 \
  -U

# Mở firewall
sudo firewall-cmd --permanent --add-service={freeipa-4,dns}
sudo firewall-cmd --reload

Nguồn: Red Hat — Installing Identity Management (RHEL 9) · freeipa.org — Quick Start

2. Thêm replica & enroll client

# Trên máy đã là client IPA, nâng lên replica (multi-master)
sudo ipa-replica-install --principal admin --admin-password 'AdminPass123'
sudo ipa-ca-install         # thêm vai trò CA (nếu muốn)

# Enroll một client Linux vào domain IPA
sudo dnf install -y ipa-client       # hoặc: apt install freeipa-client
sudo ipa-client-install \
  --domain=company.local \
  --realm=COMPANY.LOCAL \
  --server=ipa1.company.local \
  --principal=admin --password='AdminPass123' \
  --mkhomedir -U

Nguồn: freeipa.org — Replica Setup · freeipa.org — Client

3. HBAC + sudo = thay Group Policy

# Tắt rule allow_all mặc định, xây quyền tối thiểu
ipa hbacrule-disable allow_all

ipa hostgroup-add webservers --desc="Web servers"
ipa hostgroup-add-member webservers --hosts=web1.company.local
ipa group-add webadmins --desc="Web admins"

ipa hbacrule-add ssh_webadmins --desc="SSH web servers cho admin"
ipa hbacrule-add-user    ssh_webadmins --groups=webadmins
ipa hbacrule-add-host    ssh_webadmins --hostgroups=webservers
ipa hbacrule-add-service ssh_webadmins --hbacsvcs=sshd
ipa hbactest --user=alice --host=web1.company.local --service=sshd   # -> ALLOW

# sudo tập trung (thay cho /etc/sudoers cục bộ)
ipa sudorule-add sysadmin_reboot
ipa sudorule-add-user  sysadmin_reboot --groups=sysadmins
ipa sudorule-add-host  sysadmin_reboot --hostgroups=webservers
ipa sudorule-add-allow-command sysadmin_reboot --sudocmds='/usr/sbin/reboot'

Nguồn: FreeIPA workshop — HBAC · Sudo rules

II.3 · Dịch vụ hạ tầng phụ trợ (deploy nhanh + nguồn)

DHCP → ISC Kea
sudo apt install -y kea # hoặc dnf install isc-kea
sudo nano /etc/kea/kea-dhcp4.conf
sudo systemctl enable --now kea-dhcp4-server

JSON config, subnet4 + pools. Nguồn: kea.readthedocs.io

Time → chrony
sudo apt install -y chrony
# /etc/chrony/chrony.conf:
server 10.99.0.1 iburst
allow 192.168.1.0/24

Lệch < 5 phút cho Kerberos. Nguồn: chrony-project.org

DNS → BIND9
sudo apt install -y bind9 # dnf install bind
# Samba: SAMBA_INTERNAL hoặc BIND9_DLZ

Nguồn: isc.org/bind · Samba DNS Admin

NPS → FreeRADIUS
sudo apt install -y freeradius
# PEAP/MSCHAPv2 -> ntlm_auth -> AD

Cần domain-join + ntlm_auth. Nguồn: freeradius.org

AD CS → step-ca / Dogtag
step ca init # step-ca
# hoặc FreeIPA CA tích hợp (Dogtag)

Nguồn: smallstep.com/step-ca · FreeIPA CA

AD FS → Keycloak
docker run -e KEYCLOAK_ADMIN=admin \
  -e KEYCLOAK_ADMIN_PASSWORD=pass \
  quay.io/keycloak/keycloak start-dev

User Federation → LDAP/AD. Nguồn: keycloak.org

File/Print → Samba + CUPS
sudo apt install -y samba cups
lpadmin -p May_In -E -v smb://srv/queue

Nguồn: samba.org · Ubuntu CUPS

WSUS → mirror / Landscape
# RHEL reposync + createrepo
# Ubuntu apt-mirror | Canonical Landscape

Nguồn: Canonical Landscape · Red Hat local mirror

III

Migration khi đang chạy full Windows AD (client Windows + Linux)

Giữ hệ thống chạy liên tục · Không gián đoạn client

III.1 · Chọn 1 trong 2 chiến lược

Phương án A — Thay thế DC
Samba AD DC join làm DC bổ sung → chuyển FSMO → hạ Windows DC

Client Windows vẫn join domain bình thường (Samba nói đúng giao thức AD).

Client Linux join bằng realm join (SSSD).

GPO cũ tiếp tục dùng qua RSAT/GPMC.

Không có AD CS & DFS-R gốc (xem giới hạn).

➜ Khi CÒN NHIỀU client Windows.

Phương án B — Chạy song song (Trust)
Giữ Windows AD + dựng FreeIPA + cross-forest trust

Windows client & user ở nguyên trên AD.

Linux client join FreeIPA; user AD đăng nhập được nhờ trust.

Có sẵn PKI (Dogtag), HBAC, sudo tập trung cho Linux.

Vẫn phụ thuộc Windows AD cho tới Phần IV.

➜ Khi ĐÍCH ĐẾN là Linux, muốn tách dần.

III.2 · Các bước thực hiện (Phương án A — thay thế DC)

1 Kiểm tra sức khỏe AD trước khi động vào (trên Windows DC)
repadmin /replsummary          # tất cả DC phải 0 lỗi
dcdiag /v                      # sức khỏe DC: DNS, FSMO, replication

Sửa hết lỗi TRƯỚC khi thêm/bớt DC. Nguồn: Microsoft Learn — Diagnose AD replication failures

2 Join Samba làm Domain Controller bổ sung

Trước khi join: /etc/resolv.conf trỏ về Windows DC, giờ đồng bộ (lệch < 5 phút), host tự phân giải FQDN.

sudo samba-tool domain join company.local DC \
  --dns-backend=SAMBA_INTERNAL \
  -U'COMPANY\Administrator'

# Sau ~15 phút KCC tạo agreement — kiểm tra replication
sudo samba-tool drs showrepl

Nguồn: wiki.samba.org — Joining a Samba DC to an Existing AD · Verifying Replication

3 Chuyển 5 vai trò FSMO sang Samba
sudo samba-tool fsmo show      # xem ai đang giữ role

sudo samba-tool fsmo transfer --role=pdc            -Uadministrator
sudo samba-tool fsmo transfer --role=rid            -Uadministrator
sudo samba-tool fsmo transfer --role=infrastructure -Uadministrator
sudo samba-tool fsmo transfer --role=schema         -Uadministrator
sudo samba-tool fsmo transfer --role=naming         -Uadministrator

sudo samba-tool fsmo show      # xác nhận Samba đã giữ

Transfer (DC cũ còn online) ưu tiên hơn seize. Nguồn: wiki.samba.org — Transferring and Seizing FSMO Roles

4 Tích hợp client Linux vào domain (SSSD/realmd)
sudo apt install -y sssd-ad sssd-tools realmd adcli oddjob oddjob-mkhomedir

realm discover company.local
sudo realm join company.local -U Administrator

# Chỉ cho phép nhóm được đăng nhập
sudo realm permit -g '[email protected]'

# Kiểm tra
id [email protected]
kinit [email protected] && klist

Bật auto tạo home dir + offline login trong /etc/sssd/sssd.conf (cache_credentials=True). Nguồn: ubuntu.com — SSSD with Active Directory · realmd — AD Join Guide

5 (Tuỳ chọn) Áp Group Policy lên client Linux qua SSSD
# /etc/sssd/sssd.conf — bật GPO map quyền logon từ AD
[domain/company.local]
ad_gpo_access_control = permissive   # chạy thử; đổi 'enforcing' khi ổn

Bắt đầu bằng permissive để tránh khóa nhầm user, xem log rồi mới enforcing. Nguồn: sssd.io — AD GPO Integration

6 Hạ & loại bỏ Windows DC (sau khi ổn định 24h+)
# Trên Windows DC — demote (PowerShell)
Uninstall-ADDSDomainController -DemoteOperationMasterRole -Force

# Xác nhận vai trò đã ở Samba
netdom query fsmo

Nguồn: Microsoft Learn — Uninstall-ADDSDomainController · Transfer/seize FSMO roles

Kết thúc Phần III: domain company.local chạy trên Samba AD DC. Client Windows vẫn join & nhận GPO như cũ; client Linux xác thực qua SSSD. Chưa đổi gì phía người dùng cuối.
IV

Chuyển đổi hoàn toàn sang client Linux

Đích đến: FreeIPA + Ubuntu Desktop · Bỏ hẳn Windows

Trạng thái đích: identity trung tâm là FreeIPA/IdM (hoặc Samba AD DC + SSSD), toàn bộ máy trạm là Ubuntu Desktop join domain. Group Policy được thay bằng bộ HBAC + sudo + dconf (ADSys) + config management.

IV.1 · Ánh xạ Group Policy → công cụ Linux

Việc GPO hay làm Tương đương trên Linux Nguồn
Quyền đăng nhập / truy cập host FreeIPA HBAC · SSSD access_provider HBAC
Quyền quản trị (Restricted Groups) FreeIPA sudo rules sudo
Khóa desktop / cấm CLI / cấm đổi cài đặt dconf lockdown qua ADSys (GNOME) ADSys dconf
Map ổ đĩa mạng (Drive maps) pam_mount / autofs (CIFS) CIFS mount
Máy in triển khai qua GPO CUPS (lpadmin) + policy CUPS
Proxy hệ thống ubuntu-proxy-manager (ADSys) ADSys proxy
Password policy / lockout FreeIPA ipa pwpolicy-mod freeipa.org
Cấu hình phần mềm / script tùy biến Ansible / Puppet / Salt config mgmt

IV.2 · Quy trình chuyển 1 máy trạm Windows → Ubuntu

  1. 1.Sao lưu dữ liệu user khỏi profile Windows (Documents, Downloads, bookmark, mail). Lưu ý: dữ liệu mã hóa EFS không giải mã được trên Linux — phải giải mã trên Windows trước.
  2. 2.Cài Ubuntu Desktop 24.04 LTS lên máy trạm.
  3. 3.Join domain: ipa-client-install (nếu đích FreeIPA) hoặc realm join (nếu Samba AD DC).
  4. 4.Home directory + drive maps: bật auto-mkhomedir; map thư mục mạng bằng pam_mount/autofs.
  5. 5.Máy in: thêm queue qua CUPS (lpadmin).
  6. 6.Khóa desktop & proxy: cài ubuntu-adsys, đẩy dconf lockdown + proxy từ GPO template Ubuntu.
  7. 7.Khôi phục dữ liệu user vào ~/Documents, import bookmark/mail (Firefox/Evolution).
# B3 — join FreeIPA
sudo apt install -y freeipa-client
sudo ipa-client-install --domain=company.local --realm=COMPANY.LOCAL \
  --server=ipa1.company.local --mkhomedir -U

# B4 — tự tạo home dir khi đăng nhập lần đầu
sudo pam-auth-update --enable mkhomedir

# B4 — map ổ mạng (autofs CIFS), ví dụ /etc/auto.smb
# documents  -fstype=cifs,credentials=/etc/creds,uid=%U  ://fileserver/%U

# B5 — thêm máy in mạng qua CUPS
sudo lpadmin -p May_In_Tang3 -E -v smb://fileserver/HP_M404 -m everywhere

# B6 — khóa desktop qua ADSys (dconf)
sudo apt install -y ubuntu-adsys

Nguồn: FreeIPA Client · Red Hat — pam_mkhomedir · Ubuntu Autofs · ADSys docs

Điểm nghẽn cần lên kế hoạch riêng khi bỏ hẳn Windows:
  • Ứng dụng chỉ chạy Windows (.exe, phần mềm kế toán, thiết bị chuyên dụng) → cân nhắc Wine, VM Windows, hoặc bản web/Linux thay thế.
  • MS Office → LibreOffice / OnlyOffice / Microsoft 365 web (kiểm tra tương thích macro, template).
  • Dữ liệu EFS, chứng chỉ trong Windows cert store → export trước khi xóa máy.
  • Đào tạo người dùng cuối — chi phí lớn nhất thường là con người, không phải kỹ thuật.
V

Triển khai chi tiết dịch vụ + Policy + Tạo OU

Config đầy đủ copy-paste · Chặn USB / cài phần mềm / share · OU trên Linux

Phần V bổ sung cho Phần II bằng file cấu hình đầy đủ. Mọi ví dụ dùng domain company.local, LAN 192.168.1.0/24. Đổi tên interface (eth0/ens33), IP, MAC theo môi trường thực tế. Lệnh viết cho Ubuntu 24.04, có ghi chú khác biệt RHEL/Rocky 9.

V.1 · DHCP Server — ISC Kea

Cài đặt (repo chính thức ISC)

# Ubuntu 24.04 — thêm repo ISC Kea rồi cài dhcp4
curl -1sLf 'https://dl.cloudsmith.io/public/isc/kea-3-2/setup.deb.sh' | sudo -E bash
sudo apt install -y isc-kea-dhcp4-server

# RHEL/Rocky 9
# curl -1sLf 'https://dl.cloudsmith.io/public/isc/kea-3-2/setup.rpm.sh' | sudo -E bash
# sudo dnf install -y isc-kea-dhcp4

Nguồn: kb.isc.org — Kea packages

File /etc/kea/kea-dhcp4.conf (đầy đủ, có reservation)

{
  "Dhcp4": {
    "interfaces-config": { "interfaces": [ "eth0" ] },
    "lease-database": {
      "type": "memfile", "persist": true,
      "name": "/var/lib/kea/dhcp4.leases"
    },
    "valid-lifetime": 28800,
    "renew-timer": 14400,
    "rebind-timer": 21600,
    "option-data": [
      { "name": "domain-name-servers", "data": "192.168.1.10, 192.168.1.11" },
      { "name": "domain-name",         "data": "company.local" },
      { "name": "routers",             "data": "192.168.1.254" }
    ],
    "subnet4": [
      {
        "id": 1,
        "subnet": "192.168.1.0/24",
        "pools": [ { "pool": "192.168.1.100 - 192.168.1.200" } ],
        "reservations": [
          {
            "hw-address": "aa:bb:cc:dd:ee:ff",
            "ip-address": "192.168.1.50",
            "hostname": "printer.company.local"
          }
        ]
      }
    ],
    "loggers": [
      { "name": "kea-dhcp4",
        "output-options": [ { "output": "/var/log/kea/kea-dhcp4.log" } ],
        "severity": "INFO" }
    ]
  }
}

Khởi động & kiểm tra

# Kiểm tra cú pháp config trước
sudo kea-dhcp4 -t /etc/kea/kea-dhcp4.conf

sudo systemctl enable --now isc-kea-dhcp4-server
sudo systemctl status isc-kea-dhcp4-server
journalctl -u isc-kea-dhcp4-server -f     # theo dõi cấp lease

Nguồn: kea.readthedocs.io — DHCPv4 Server

V.2 · DNS Server — BIND9 (authoritative + forwarder)

# Cài đặt
sudo apt install -y bind9 bind9-utils      # RHEL: dnf install bind bind-utils

/etc/bind/named.conf.options

acl trusted_clients { localhost; 192.168.1.0/24; };

options {
    directory "/var/cache/bind";
    listen-on port 53 { any; };
    allow-query     { trusted_clients; };
    allow-recursion { trusted_clients; };
    recursion yes;
    forwarders { 8.8.8.8; 8.8.4.4; };
    forward first;
    dnssec-validation auto;
};

zone "company.local" IN {
    type primary;
    file "/etc/bind/zones/db.company.local";
    allow-update { none; };
};

zone "1.168.192.in-addr.arpa" IN {
    type primary;
    file "/etc/bind/zones/db.1.168.192";
    allow-update { none; };
};

Zone thuận /etc/bind/zones/db.company.local

$TTL 3600
@   IN  SOA ns1.company.local. admin.company.local. (
        2026070701 ; serial (YYYYMMDDnn — tăng mỗi lần sửa)
        12h 15m 4d 2h )
    IN  NS  ns1.company.local.
ns1 IN  A   192.168.1.10
dc1 IN  A   192.168.1.5
www IN  A   192.168.1.20

Zone nghịch + kiểm tra

# /etc/bind/zones/db.1.168.192 (PTR)
# 5   IN PTR dc1.company.local.
# 20  IN PTR www.company.local.

# Validate cú pháp + zone
sudo named-checkconf
sudo named-checkzone company.local /etc/bind/zones/db.company.local
sudo systemctl restart bind9        # RHEL: named

# Test
dig @localhost www.company.local +short
dig @localhost -x 192.168.1.20 +short

Nguồn: bind9.readthedocs.io — Zone files · isc.org/bind. Nếu thay AD DNS trực tiếp: cân nhắc Samba SAMBA_INTERNAL / BIND9_DLZ (xem Phần II.3).

V.3 · Đồng bộ giờ — Chrony (server + client)

Server LAN — /etc/chrony/chrony.conf

pool 0.ubuntu.pool.ntp.org iburst
server ntp.company.local iburst
allow 192.168.1.0/24
local stratum 10 orphan
rtcsync
makestep 0.1 3
driftfile /var/lib/chrony/drift

Client — trỏ về DC

server dc1.company.local iburst
server dc2.company.local iburst
rtcsync
makestep 0.1 3          # giữ lệch < 5 phút
driftfile /var/lib/chrony/drift
sudo systemctl enable --now chronyd
chronyc sources -v        # nguồn thời gian
chronyc tracking          # độ lệch hiện tại
sudo chronyc clients      # (trên server) client đang đồng bộ

Nguồn: ubuntu.com — Serve NTP with chrony · chrony-project.org — chrony.conf. Lệch giờ > 5 phút = Kerberos báo "clock skew too great".

V.4 · Samba File Server (domain member)

Cài + join domain

sudo apt install -y realmd samba samba-common-bin samba-dsdb-modules \
  samba-vfs-modules winbind krb5-user

sudo hostnamectl hostname fileserver.company.local

# Join làm MEMBER (winbind), không phải DC
sudo realm join -v --membership-software=samba --client-software=winbind \
  company.local -U Administrator

sudo systemctl enable --now winbind smbd nmbd

/etc/samba/smb.conf — global + share (ACL theo nhóm AD)

[global]
   workgroup = COMPANY
   security = ads
   realm = COMPANY.LOCAL
   kerberos method = secrets and keytab
   winbind use default domain = no
   idmap config * : backend = tdb
   idmap config * : range = 10000-999999
   idmap config COMPANY : backend = rid
   idmap config COMPANY : range = 2000000-2999999
   template shell = /bin/bash
   usershare max shares = 0          # CẤM user tự tạo share (xem V.9)

[data]
   path = /srv/data
   read only = no
   valid users = +"COMPANY\Finance Team"   # nhóm AD dùng dấu '+'
   vfs objects = acl_xattr recycle
   acl_xattr:ignore system acls = yes
sudo testparm -s                       # kiểm tra cú pháp
sudo systemctl restart smbd nmbd winbind
wbinfo -u | head           # liệt kê user AD
getent passwd 'COMPANY\administrator'  # phân giải user AD → UID

Nguồn: ubuntu.com — Samba member server · samba.org — smb.conf(5)

V.5 · Print Server — CUPS (+ chia sẻ qua Samba)

sudo apt install -y cups
sudo systemctl enable --now cups

# Bật quản trị từ xa + chia sẻ máy in
sudo cupsctl --remote-admin --share-printers

# Thêm máy in mạng (driverless IPP)
sudo lpadmin -p HP_M404 -E -v ipp://192.168.1.50/ipp/print -m everywhere -o media=A4
sudo lpadmin -d HP_M404          # đặt làm mặc định
lpstat -p -v                     # kiểm tra
sudo ufw allow 631/tcp           # Web UI: http://<server>:631

Chia sẻ cho client Windows — thêm vào smb.conf:

[global]
   printing = cups
   printcap name = cups
   load printers = yes

[printers]
   path = /var/spool/samba
   printable = yes
   browsable = yes
   guest ok = no

Nguồn: ubuntu.com — CUPS print server · ubuntu.com — Samba print server

V.6 · FreeRADIUS — 802.1X PEAP/MSCHAPv2 backend AD

PEAP/MSCHAPv2 không dùng được nếu chỉ bind LDAP. Server RADIUS phải join AD (winbind) để gọi ntlm_auth xác thực mật khẩu.
sudo apt install -y freeradius freeradius-utils samba winbind
sudo realm join company.local -U Administrator     # nếu chưa join

# /etc/freeradius/3/mods-available/mschap — trỏ ntlm_auth về winbind
mschap {
    use_mppe = yes
    require_encryption = yes
    ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --allow-mschapv2 \
      --username=%{mschap:User-Name} --domain=COMPANY \
      --challenge=%{mschap:Challenge:-00} \
      --nt-response=%{mschap:NT-Response:-00}"
}

# /etc/freeradius/3/mods-available/eap — chọn PEAP → inner MSCHAPv2
eap { default_eap_type = peap
      peap { default_eap_type = mschapv2
             virtual_server = inner-tunnel } }
# Khai báo switch/AP trong /etc/freeradius/3/clients.conf
# client 192.168.1.2 { secret = SuperSecret123! }

sudo freeradius -X          # chạy debug, xem Access-Accept
sudo systemctl enable --now freeradius
# Test MSCHAP nội bộ:
radtest -t mschap user 'MatKhau' 127.0.0.1:18120 0 testing123

Nguồn: freeradius.org — AD / ntlm_auth MSCHAP · EAP-PEAP tutorial

Policy siết endpoint

V.7 · Chặn USB (ổ lưu trữ di động)

Cách 1 — USBGuard (khuyến nghị)
sudo apt install -y usbguard
sudo usbguard generate-policy \
  > /etc/usbguard/rules.conf
# chặn class lưu trữ 08:
reject with-interface { 08:*:* }
sudo systemctl enable --now usbguard

Cho/khoá theo allow-list từng thiết bị. Kiểm soát tốt nhất.

Cách 2 — chặn kernel module
# /etc/modprobe.d/
# block-usb-storage.conf
blacklist usb-storage
install usb-storage /bin/false
# Ubuntu:
sudo update-initramfs -u -k all
# RHEL: dracut --force

Nhẹ, chặn toàn bộ; kém linh hoạt (không allow-list).

Cách 3 — udev rule
# /etc/udev/rules.d/
# 99-block-usb.rules
SUBSYSTEM=="usb",
ATTRS{idVendor}=="1234",
OPTIONS+="ignore_device"
sudo udevadm control --reload

Chặn theo Vendor/Product ID (lsusb). Thô hơn USBGuard.

Client Windows (join Samba AD DC): dùng GPO Removable Storage AccessDeny read/Deny write, link vào OU (xem V.10). Nguồn: RHEL — USBGuard · usbguard.github.io

V.8 · Chặn tự ý cài phần mềm

Cách 1 — polkit (chặn PackageKit cho non-admin)

# /etc/polkit-1/rules.d/00-deny-packagekit.rules
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.packagekit.package-install" ||
        action.id == "org.freedesktop.packagekit.package-remove"  ||
        action.id == "org.freedesktop.packagekit.package-update") {
        return polkit.Result.NO;
    }
});
# Áp dụng & test
sudo systemctl restart polkit
pkcheck -a "org.freedesktop.packagekit.package-install" -u $(whoami)   # → no

Chặn cài/gỡ/update qua GNOME Software, apt/dnf-PackageKit cho user thường; admin (sudo) vẫn cài được. Nguồn: freedesktop — polkit

Cách 2 — khoá desktop qua dconf (chặn terminal, repo lạ)

# /etc/dconf/db/local.d/00_lock-software
[org/gnome/software]
allow-user-repos=false
[org/gnome/desktop/lockdown]
disable-command-line=true

# /etc/dconf/db/local.d/locks/00_lock-software  (khoá không cho user đổi)
/org/gnome/software/allow-user-repos
/org/gnome/desktop/lockdown/disable-command-line

sudo dconf update

Đẩy tập trung qua ADSys (Ubuntu + Samba AD GPO). Client Windows: AppLocker / Software Restriction Policy qua GPO. Nguồn: GNOME — dconf lockdown · Microsoft — AppLocker

Cách 3 "thô": gỡ user khỏi nhóm sudo/wheel (sudo deluser user sudo) — user không elevate được cho bất kỳ việc gì. Ưu tiên polkit để kiểm soát chọn lọc.

V.9 · Chặn user tự ý share folder

# 1) Samba: cấm usershare (net usershare add sẽ bị từ chối)
# trong [global] của /etc/samba/smb.conf:
   usershare max shares = 0
sudo testparm -s && sudo systemctl restart smbd

# 2) Desktop: tắt chia sẻ file GNOME/Nautilus
sudo systemctl disable --now gnome-user-share.service 2>/dev/null
sudo apt purge -y nautilus-share gnome-user-share

# 3) Chặn service không dùng + firewall cổng SMB/NFS
sudo systemctl mask nfs-server
sudo ufw deny 445/tcp
sudo ufw deny 2049/tcp
sudo chmod 700 /var/lib/samba/usershares

Kết quả: user thường không tạo được share mới; chỉ share do admin định nghĩa trong smb.conf tồn tại. Nguồn: samba.org — smb.conf(5) usershare

V.10 · Tạo OU trên Linux & áp policy theo OU

OU là khái niệm của AD/LDAP. Trên Samba AD DC có OU thật (samba-tool ou) — dùng khi còn client Windows + GPO. Trên FreeIPA KHÔNG có OU — thay bằng hostgroup/usergroup + automember + HBAC/sudo.

A · Samba AD DC — OU thật + link GPO

# Tạo OU
sudo samba-tool ou create "OU=Sales,DC=company,DC=local"
sudo samba-tool ou create "OU=Desktops,DC=company,DC=local"
sudo samba-tool ou list --full-dn

# Chuyển user / máy tính vào OU
sudo samba-tool user move jdoe        "OU=Sales,DC=company,DC=local"
sudo samba-tool computer move PC01    "OU=Desktops,DC=company,DC=local"

# Liệt kê GPO đã tạo
sudo samba-tool gpo list
sudo samba-tool gpo info <GPO-GUID>
Link GPO vào OU chỉ làm bằng GPMC (RSAT trên Windows): GPMC → chuột phải OU SalesLink an Existing GPO → chọn GPO "USB Block"/"Software Lockdown". Không có công cụ CLI Linux tương đương.

Client Linux áp GPO của OU qua SSSD

# /etc/sssd/sssd.conf  [domain/company.local]
ad_gpo_access_control = permissive   # test trước → đổi 'enforcing'
sudo systemctl restart sssd
sudo journalctl -u sssd -f           # xem GPO cho phép/chặn

Nguồn: samba.org — samba-tool(8) · wiki.samba.org — Group Policy

B · FreeIPA — "OU" = hostgroup + automember + HBAC

# Nhóm host (thay vai trò OU cho máy Linux)
ipa hostgroup-add sales-hosts --desc="May phong Sales"
ipa hostgroup-add-member sales-hosts --hosts=pc01.company.local

# Tự động gán host theo tên FQDN
ipa automember-add --type=hostgroup sales-hosts
ipa automember-add-condition --type=hostgroup sales-hosts \
  --key=fqdn --inclusive-regex='^sales[0-9]+\.company\.local$'
ipa automember-rebuild --type=hostgroup

# Áp quyền theo nhóm (thay GPO): HBAC + sudo
ipa hbacrule-add sales-login
ipa hbacrule-add-host    sales-login --hostgroups=sales-hosts
ipa hbacrule-add-user    sales-login --groups=sales-users
ipa hbacrule-add-service sales-login --hbacsvcs=sshd

FreeIPA không có GPO khoá desktop — dconf/USBGuard vẫn đẩy bằng Ansible/ADSys, còn quyền đăng nhập/sudo do HBAC quản. Nguồn: freeipa.org — Automember · HBAC

Nguyên tắc triển khai policy: luôn chạy permissive/audit trước, kiểm tra log, rồi mới enforcing. Test trên 1 máy pilot mỗi OU trước khi áp rộng. Ghi lại allow-list USB & whitelist phần mềm để tránh khoá nhầm.

Nguồn tài liệu chính thống

Toàn bộ lệnh & quy trình trích từ tài liệu hãng

Lưu ý phiên bản: Cú pháp lệnh có thể đổi theo phiên bản Samba/FreeIPA/RHEL. Luôn đối chiếu tài liệu hãng ở đúng phiên bản bạn cài trước khi chạy trên production. Test toàn bộ trên lab trước.
Zalo