เลือกสไตล์
บทที่ 1 · ภาพรวม

01Samba AD DC คืออะไร และเตรียมเครื่องก่อนติดตั้ง

ทำความรู้จัก Domain Controller บน Linux ที่แทน Windows Server AD ได้ พร้อมเตรียมเครื่องและวางแผนพารามิเตอร์ให้ถูกตั้งแต่แรก

Samba ADUbuntu 26.04เตรียมเครื่อง

Samba AD DC คืออะไร

Samba Active Directory Domain Controller คือการทำให้เครื่อง Linux เป็น Domain Controller แบบเดียวกับ Windows Server ได้ โดยรวมบริการหลักของ Active Directory ไว้ในตัวเดียว ทำให้ Windows และ Linux เข้ามา join domain, ตรวจสอบตัวตน และรับ Group Policy ได้

องค์ประกอบหน้าที่พอร์ต
LDAPฐานข้อมูล directory (user, group, computer)389 / 636
Kerberosตรวจสอบตัวตน (authentication)88
DNSให้ client หา domain controller ผ่าน SRV record53
SMB/CIFSแชร์ SYSVOL/NETLOGON + Group Policy445
💡 มี Samba AD แล้วไม่ต้องมี OpenLDAP แยก

Active Directory สร้างอยู่บน LDAP + Kerberos + DNS อยู่แล้ว เมื่อตั้ง Samba AD DC จึงได้ LDAP directory ในตัวทันที ไม่ต้องติดตั้ง slapd (OpenLDAP) เพิ่ม และไม่ควรรันคู่กัน จัดการทุกอย่างผ่าน samba-tool

เตรียมเครื่องก่อนติดตั้ง (Prerequisites)

  • OS: Ubuntu Server 26.04 LTS ติดตั้งเสร็จ เข้าใช้งานผ่าน SSH ได้
  • สิทธิ์: ผู้ใช้ที่มี sudo
  • อินเทอร์เน็ต: ต้องต่อเน็ตได้เพื่อ apt ติดตั้งแพ็กเกจ
  • IP: เตรียมตั้งเป็น static (DC ห้ามให้ IP เปลี่ยนตาม DHCP)
  • วางแผนชื่อ: ตัดสินใจ Realm, NetBIOS, และ hostname ของ DC ให้เรียบร้อย

พารามิเตอร์ที่ใช้ในคู่มือนี้

รายการค่าอธิบาย
RealmAD.ITTRAINING.LOCALชื่อโดเมน DNS (ตัวพิมพ์ใหญ่)
NetBIOS DomainADชื่อโดเมนสั้น (ชื่อที่ Windows เก่าใช้)
DC Hostname / FQDNdc01 / dc01.ad.ittraining.localชื่อเครื่อง Domain Controller
IP (static)192.168.64.85/24gateway 192.168.64.1
DNS backendSAMBA_INTERNALใช้ DNS ในตัว Samba (ง่ายสุด)
⚠ กฎเหล็กของ DNS

Domain Controller ต้องใช้ ตัวเองเป็น DNS server และ client ทุกเครื่องที่จะ join ต้องตั้ง DNS ชี้มาที่ IP ของ DC (192.168.64.85) เท่านั้น ไม่งั้นจะหา domain ไม่เจอ

✦ จบบทที่ 1
บทที่ 2 · เชื่อมต่อ

02เชื่อมต่อ SSH และตรวจสอบสถานะเครื่อง

ทดสอบว่าต่อเครื่องได้ และเก็บข้อมูลพื้นฐาน (OS, IP, sudo, DNS) ก่อนเริ่มติดตั้งจริง

SSHตรวจเครื่อง

1) ทดสอบการเชื่อมต่อจากเครื่องควบคุม

ก่อน SSH เข้าไป ตรวจว่าเครื่องปลายทางเปิดพอร์ต 22 อยู่จริง

Step 1
ตรวจว่าพอร์ต SSH (22) ของ 192.168.64.85 เปิดอยู่ ด้วย nc (netcat)
$ nc -z -w5 192.168.64.85 22
Terminal — เครื่องควบคุม (Mac) $ nc -z -w5 192.168.64.85 22 Connection to 192.168.64.85 port 22 [tcp/ssh] succeeded!
จากเครื่องจริงทดสอบพอร์ต 22 — เชื่อมต่อได้ พร้อม SSH เข้าเครื่อง
คำสั่ง / ออปชันหน้าที่
nc -zสแกนพอร์ตแบบไม่ส่งข้อมูล (zero-I/O) แค่เช็คว่าเปิดไหม
-w5timeout 5 วินาที ถ้าต่อไม่ได้จะเลิกรอ

2) เก็บข้อมูลเครื่อง (Reconnaissance)

SSH เข้าไปแล้วตรวจ OS, network, สิทธิ์ sudo และ DNS เพื่อยืนยันว่าพร้อมติดตั้ง

john@server — SSH john@server:~$ grep PRETTY_NAME /etc/os-release PRETTY_NAME="Ubuntu 26.04 LTS" john@server:~$ ip -br addr show enp0s1 enp0s1 UP 192.168.64.85/24 john@server:~$ ip route | grep default default via 192.168.64.1 dev enp0s1 proto dhcp john@server:~$ getent hosts archive.ubuntu.com >/dev/null && echo DNS_OK DNS_OK
จากเครื่องจริงเครื่องเป็น Ubuntu 26.04, IP 192.168.64.85 (DHCP), DNS ใช้ได้
คำสั่ง / ออปชันหน้าที่
grep PRETTY_NAME /etc/os-releaseอ่านชื่อ/เวอร์ชัน OS จากไฟล์มาตรฐาน /etc/os-release
ip -br addrแสดง IP ของการ์ดเน็ตแบบย่อ (brief)
ip route | grep defaultดู default gateway ที่เครื่องใช้ออกเน็ต
getent hosts <host>ทดสอบว่า resolve ชื่อโดเมนได้ (DNS ทำงาน)
💡 ทำไมต้องตรวจ sudo

การติดตั้ง Samba AD ต้องใช้สิทธิ์ root เกือบทุกคำสั่ง ตรวจก่อนว่าใช้ sudo ได้ จะได้ไม่ติดปัญหากลางทาง

✦ จบบทที่ 2
บทที่ 3 · ตั้งชื่อเครื่อง

03ตั้ง hostname เป็น dc01 และแก้ /etc/hosts

Domain Controller ต้องมีชื่อและ FQDN ที่ถูกต้อง และ hostname ต้อง resolve เป็น IP จริงไม่ใช่ 127.0.1.1

hostnameFQDN/etc/hosts

ทำไมต้องตั้งชื่อให้ถูก

Samba AD ผูกชื่อ DC เข้ากับ DNS และ Kerberos ถ้า hostname ไม่นิ่งหรือ resolve ผิด (เช่น ชี้ไป 127.0.1.1 ตามค่าเริ่มต้นของ Ubuntu) จะมีปัญหาตอน provision และตอน client หา DC

Step 1
เปลี่ยน hostname ของเครื่องเป็น dc01
$ sudo hostnamectl set-hostname dc01
Step 2
เขียน /etc/hosts ใหม่ ให้ FQDN ชี้ไปที่ IP จริง (ไม่ใช่ 127.0.1.1)
127.0.0.1 localhost
192.168.64.85 dc01.ad.ittraining.local dc01
::1 localhost ip6-localhost ip6-loopback
john@dc01 — SSH john@dc01:~$ hostnamectl --static dc01 john@dc01:~$ hostname -f dc01.ad.ittraining.local john@dc01:~$ cat /etc/hosts 127.0.0.1 localhost 192.168.64.85 dc01.ad.ittraining.local dc01 ::1 localhost ip6-localhost ip6-loopback
จากเครื่องจริงhostname = dc01 และ hostname -f = dc01.ad.ittraining.local ถูกต้อง
คำสั่ง / ออปชันหน้าที่
hostnamectl set-hostname dc01ตั้งชื่อเครื่องถาวร (เขียนลง /etc/hostname)
hostnamectl --staticแสดงชื่อเครื่องปัจจุบัน
hostname -fแสดง FQDN (ชื่อเต็มพร้อมโดเมน) — ต้องได้ dc01.ad.ittraining.local
บรรทัดใน /etc/hostsแม็พ FQDN + ชื่อสั้น เข้ากับ IP จริง เพื่อให้ resolve ถูกก่อนที่ DNS จะพร้อม
⚠ ลบบรรทัด 127.0.1.1

Ubuntu มักมีบรรทัด 127.0.1.1 <hostname> อยู่ ต้องเอาออก เพราะ DC ต้องให้ชื่อตัวเอง resolve เป็น IP จริง (192.168.64.85) ไม่ใช่ loopback

กัน cloud-init รีเซ็ต hostname (สำคัญมาก)

Ubuntu Server มีตัวชื่อ cloud-init ที่ทำงานใหม่ ทุกครั้งที่บูต ค่าเริ่มต้นของมันคือ preserve_hostname: false — แปลว่ามันจะ เขียน hostname กลับเป็นค่าเดิม (เช่น server) ทับ dc01 ทุกครั้งที่ reboot เราจึงต้องสั่งปิดพฤติกรรมนี้ ไม่งั้นชื่อที่ตั้งจะไม่อยู่ถาวร

Step 3
บอก cloud-init ว่าอย่ายุ่งกับ hostname — ตั้ง preserve_hostname: true
$ echo 'preserve_hostname: true' | sudo tee -a /etc/cloud/cloud.cfg
คำสั่ง / ออปชันหน้าที่
preserve_hostname: trueสั่ง cloud-init ให้คง hostname ที่เราตั้ง ไม่เขียนทับตอนบูต
/etc/cloud/cloud.cfgไฟล์ตั้งค่าหลักของ cloud-init
tee -aต่อบรรทัดเข้าไปท้ายไฟล์ (append) ด้วยสิทธิ์ root
🔥 เหตุผล — ถ้าข้ามขั้นนี้

hostname จะเด้งกลับเป็น server ทุก reboot ทำให้ record ใน AD/DNS/Kerberos ที่ผูกกับชื่อ dc01.ad.ittraining.local ไม่ตรงกับเครื่อง → DC ทำงานผิดพลาด นี่คือสาเหตุจริงที่ทำให้การติดตั้งครั้งก่อน “หาย” หลังรีบูต

✦ จบบทที่ 3
บทที่ 4 · แพ็กเกจ

04ติดตั้งแพ็กเกจ Samba AD และ Kerberos

ลง Samba, Kerberos client, winbind และเครื่องมือ DNS พร้อมตั้งค่า realm ล่วงหน้าแบบไม่ต้องตอบคำถาม

aptsambakrb5

ติดตั้งแพ็กเกจที่จำเป็น

Step 1
ตั้งค่า realm ของ Kerberos ล่วงหน้า (preseed) เพื่อให้ตัวติดตั้งไม่ถามกลางคัน
$ echo "krb5-config krb5-config/default_realm string AD.ITTRAINING.LOCAL" \
    | sudo debconf-set-selections
Step 2
อัปเดตรายการแพ็กเกจ แล้วติดตั้งทั้งหมดแบบไม่โต้ตอบ (noninteractive)
$ sudo apt-get update
$ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
    samba smbclient krb5-user winbind \
    libnss-winbind libpam-winbind dnsutils ldb-tools
john@dc01 — SSH # ... (ดาวน์โหลดและติดตั้งแพ็กเกจ) ... First installation detected, adding winbind to /etc/nsswitch.conf... No services need to be restarted. john@dc01:~$ samba --version Version 4.23.6-Ubuntu-4.23.6+dfsg-1ubuntu2.1 john@dc01:~$ which samba smbd samba-tool /usr/sbin/samba /usr/sbin/smbd /usr/bin/samba-tool
จากเครื่องจริงติดตั้ง Samba 4.23.6 สำเร็จ — samba-tool พร้อมใช้งาน
คำสั่ง / ออปชันหน้าที่
sambaตัว Samba หลัก (มี samba-tool และ service samba-ad-dc)
smbclientเครื่องมือ client ทดสอบเข้าถึง SMB share
krb5-userเครื่องมือ Kerberos (kinit, klist)
winbindเชื่อม identity ของ AD กับระบบ Linux
libnss-winbind / libpam-winbindให้ NSS/PAM รู้จัก user ของ AD
dnsutilsคำสั่ง host / nslookup / dig สำหรับทดสอบ DNS
ldb-toolsเครื่องมือจัดการฐานข้อมูล LDB (เบื้องหลัง AD)
DEBIAN_FRONTEND=noninteractiveบอก apt ว่าอย่าถามคำถามระหว่างติดตั้ง
debconf-set-selectionsป้อนคำตอบ (realm) ล่วงหน้าให้ตัวติดตั้ง
✦ จบบทที่ 4
บทที่ 5 · Service

05ปิด service ที่ชนกัน และเปิด samba-ad-dc

โหมด AD DC ใช้ service รวมชื่อ samba-ad-dc ต้องปิด smbd/nmbd/winbind แบบเดี่ยวไม่ให้แย่งพอร์ตกัน

systemdsamba-ad-dc

ทำไมต้องปิด smbd / nmbd / winbind

เมื่อเป็น Domain Controller, Samba จะรันทุกอย่าง (SMB, LDAP, KDC, DNS) ผ่าน service เดียวคือ samba-ad-dc ถ้าปล่อยให้ smbd, nmbd, winbind แบบเดี่ยวทำงานด้วย จะแย่งพอร์ตกันและ DC ทำงานผิดพลาด

Step 1
ปิดและ mask service เดี่ยวทั้งสามตัว (mask = ห้ามสตาร์ตเด็ดขาด)
$ sudo systemctl disable --now smbd nmbd winbind
$ sudo systemctl mask smbd nmbd winbind
Step 2
ปลดล็อก (unmask) service รวม samba-ad-dc ให้พร้อมใช้
$ sudo systemctl unmask samba-ad-dc
john@dc01 — SSH john@dc01:~$ for u in smbd nmbd winbind samba-ad-dc; do \ john@dc01:~$ echo -n "$u: "; systemctl is-enabled $u; done smbd: masked nmbd: masked winbind: masked samba-ad-dc: enabled
จากเครื่องจริงsmbd/nmbd/winbind = masked, samba-ad-dc = enabled — ถูกต้อง
คำสั่ง / ออปชันหน้าที่
systemctl disable --nowปิด service ทันที + ไม่ให้สตาร์ตตอน boot
systemctl maskล็อก service ไม่ให้สตาร์ตได้เลย (แม้ service อื่นเรียก)
systemctl unmaskปลดล็อกให้ service กลับมาสตาร์ตได้
systemctl is-enabledตรวจสถานะว่า service ถูก enable/mask อยู่ไหม
✦ จบบทที่ 5
บทที่ 6 · Provision

06สร้าง Domain ด้วย samba-tool domain provision

ขั้นตอนหัวใจ — สร้างฐานข้อมูล Active Directory, schema, Kerberos realm และ DNS zone ทั้งหมดในคำสั่งเดียว

samba-toolprovisionKerberos

สร้าง Domain

⚠ ถ้าเครื่องเคย provision มาก่อน

ตรวจ /etc/samba/smb.conf เดิมก่อน ถ้าเคยมี AD DC อยู่ (เช่น realm อื่น) การ provision ใหม่จะ เขียนทับ domain เดิม — ในการติดตั้งจริงเราเจอ realm เก่า ITTRAINING.LAB ค้างอยู่ ต้องย้าย smb.conf เดิมออกและยืนยันก่อนทำต่อ

Step 1
ย้าย smb.conf เดิมออก (provision ต้องเริ่มจากไม่มีไฟล์นี้)
$ sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.orig
Step 2
รัน provision สร้าง domain — ระบุ realm, domain, บทบาท DC, DNS backend และรหัส Administrator
$ sudo samba-tool domain provision \
    --use-rfc2307 \
    --realm=AD.ITTRAINING.LOCAL \
    --domain=AD \
    --server-role=dc \
    --dns-backend=SAMBA_INTERNAL \
    --adminpass='ChangeMe#AD2026!' \
    --option="dns forwarder = 192.168.64.1"
john@dc01 — SSH # ... schema/forest updates ... Applied Domain Update 88: 434bb40d-dbc9-4fe7-81d4-... Applied Domain Update 89: a0c238ba-9e30-4ee6-80a6-... # provision สำเร็จ — สร้าง domain AD.ITTRAINING.LOCAL แล้ว
จากเครื่องจริงschema/forest/domain updates ลงครบ — provision สำเร็จ
Step 3
คัดลอกไฟล์ Kerberos ที่ provision สร้าง ไปเป็นค่าระบบ
$ sudo cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
john@dc01 — /etc/krb5.conf john@dc01:~$ cat /etc/krb5.conf [libdefaults] default_realm = AD.ITTRAINING.LOCAL dns_lookup_realm = false dns_lookup_kdc = true
จากเครื่องจริงkrb5.conf ถูกสร้างด้วย realm AD.ITTRAINING.LOCAL
คำสั่ง / ออปชันหน้าที่
--use-rfc2307เก็บ UID/GID ให้ Linux ใช้ร่วมกับ AD ได้ (POSIX attributes)
--realmชื่อ Kerberos realm / DNS domain (ตัวพิมพ์ใหญ่)
--domainชื่อ NetBIOS domain (สั้น)
--server-role=dcตั้งบทบาทเป็น Domain Controller
--dns-backend=SAMBA_INTERNALใช้ DNS ในตัว Samba (ตั้งง่ายสุด)
--adminpassรหัสผ่านของ Administrator (ต้องซับซ้อนตามนโยบาย)
--option="dns forwarder=..."ให้ DNS ของ DC ส่งต่อคำถามภายนอกไปที่ gateway
✦ จบบทที่ 6
บทที่ 7 · DNS & Start

07ตั้ง DNS ให้ชี้ตัวเอง แล้วสตาร์ต samba-ad-dc

ปิด systemd-resolved, ให้เครื่องใช้ DNS ของ Samba เอง แล้วเปิดบริการ DC พร้อมตรวจพอร์ตที่เปิด

DNSresolv.confports

ตั้ง DNS ให้ DC ใช้ตัวเอง

DC ต้อง resolve ชื่อโดเมนของตัวเองได้ จึงต้องปิด systemd-resolved (ที่จองพอร์ต 53) แล้วชี้ /etc/resolv.conf มาที่ Samba DNS (127.0.0.1)

Step 1
ปิด systemd-resolved และเขียน resolv.conf ให้ชี้ตัวเอง
$ sudo systemctl disable --now systemd-resolved
$ sudo rm -f /etc/resolv.conf
# เขียนใหม่:
search ad.ittraining.local
nameserver 127.0.0.1
Step 2
สตาร์ต service samba-ad-dc
$ sudo systemctl restart samba-ad-dc
john@dc01 — SSH john@dc01:~$ systemctl is-active samba-ad-dc active john@dc01:~$ sudo ss -tlnp | grep -E ":(53|88|389|445|636|3268)" 0.0.0.0:53 (DNS) 0.0.0.0:88 (Kerberos) 0.0.0.0:389 (LDAP) 0.0.0.0:445 (SMB) 0.0.0.0:636 (LDAPS) 0.0.0.0:3268 (GC)
จากเครื่องจริงsamba-ad-dc = active และพอร์ต AD ครบทุกตัว
คำสั่ง / ออปชันหน้าที่
systemctl disable --now systemd-resolvedปิดตัว resolve เดิมของ Ubuntu ที่จองพอร์ต 53
nameserver 127.0.0.1ให้เครื่องถาม DNS จาก Samba ในตัวเอง
dns forwarderคำถามที่ไม่ใช่โดเมนภายใน จะถูกส่งต่อไป 192.168.64.1
ss -tlnpแสดงพอร์ต TCP ที่เปิดฟังอยู่ พร้อมชื่อโปรเซส

พอร์ตของ Active Directory

พอร์ตบริการ
53DNS
88Kerberos (authentication)
389 / 636LDAP / LDAPS
445SMB (SYSVOL, GPO)
464kpasswd (เปลี่ยนรหัส Kerberos)
3268 / 3269Global Catalog
✦ จบบทที่ 7
บทที่ 8 · Static IP

08ตั้ง Static IP และทำให้พร้อมใช้จริง

Domain Controller ต้องมี IP คงที่ — ตั้ง static ด้วย Netplan พร้อมตั้ง timezone และเปิด service ตอน boot

Netplanstatic IPtimezone

ทำไม DC ต้อง Static IP

ถ้า IP ของ DC เปลี่ยน (เพราะ DHCP) client ทั้งหมดจะหา DC ไม่เจอทันที เพราะ DNS/SRV record ชี้ IP เดิม จึงต้องล็อก IP เป็น static

Step 1
เขียน Netplan ให้ enp0s1 เป็น static ที่ IP เดิม (192.168.64.85)
network:
  version: 2
  ethernets:
    enp0s1:
      dhcp4: false
      addresses: [192.168.64.85/24]
      routes:
        - to: default
          via: 192.168.64.1
      nameservers:
        addresses: [127.0.0.1]
        search: [ad.ittraining.local]

กัน cloud-init เขียน network ทับ static (สำคัญมาก)

cloud-init จะสร้างไฟล์ /etc/netplan/50-cloud-init.yaml เป็น DHCP ทุกครั้งที่บูต และเพราะเลข 50 มากกว่า 00 ไฟล์ของ cloud-init จึง ทับค่า static ของเรา → IP เด้งกลับเป็น DHCP ต้องปิดไม่ให้ cloud-init จัดการ network

Step 2
ปิด network config ของ cloud-init แล้วลบไฟล์ DHCP เดิม
$ sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg <<'EOF'
network: {config: disabled}
EOF
$ sudo rm -f /etc/netplan/50-cloud-init.yaml
คำสั่ง / ออปชันหน้าที่
99-disable-network-config.cfgไฟล์สั่ง cloud-init ให้ปิดการจัดการ network
network: {config: disabled}บอก cloud-init ว่าไม่ต้องยุ่งกับ netplan อีก
rm 50-cloud-init.yamlลบไฟล์ DHCP ที่ cloud-init เคยสร้าง ไม่ให้มา override static
🔥 เหตุผล — ถ้าข้ามขั้นนี้

ทุก reboot IP จะกลับเป็น DHCP (และอาจได้เลขใหม่) → client หา DC ไม่เจอ และ DNS/SRV ที่ชี้ IP เดิมจะผิด นี่คืออีกสาเหตุที่ทำให้การติดตั้งครั้งก่อน “หาย” หลังรีบูต

Step 3
ตรวจไวยากรณ์แล้ว apply (แนะนำรันแบบ detached กันหลุด SSH)
$ sudo netplan generate    # ตรวจไวยากรณ์
$ sudo netplan apply
john@dc01 — SSH (หลัง apply) john@dc01:~$ ip -br addr show enp0s1 enp0s1 UP 192.168.64.85/24 john@dc01:~$ ip route | grep default default via 192.168.64.1 dev enp0s1 proto static john@dc01:~$ systemctl is-active samba-ad-dc active
จากเครื่องจริงIP เป็น static (proto static) และ DC ยังทำงานปกติหลังเปลี่ยน network
คำสั่ง / ออปชันหน้าที่
dhcp4: falseปิด DHCP ใช้ IP คงที่แทน
routes: to default via ...กำหนด default gateway
netplan generateตรวจไวยากรณ์ YAML ก่อน apply (กันพัง)
netplan applyสั่งใช้ค่า network ใหม่
proto staticยืนยันว่า route มาจากการตั้งค่า static ไม่ใช่ DHCP
⚠ apply Netplan ผ่าน SSH

การ apply network ขณะต่อ SSH อยู่ อาจทำให้หลุดชั่วขณะ แนะนำรันแบบ detached (nohup netplan apply &) แล้วต่อ SSH ใหม่เพื่อตรวจ — เพราะ IP เดิมจึงกลับเข้าได้เสมอ

✦ จบบทที่ 8
บทที่ 9 · OU & User

09สร้าง OU และ User ตัวแรก

พิสูจน์ว่า DC ใช้งานได้จริง ด้วยการสร้างหน่วยงาน (OU) และ user แล้วทดสอบ login ด้วย Kerberos

samba-toolOUuser

สร้างโครงสร้างและ User

Step 1
สร้าง OU (Organizational Unit) ชื่อ IT
$ sudo samba-tool ou create "OU=IT,DC=ad,DC=ittraining,DC=local"
Step 2
สร้าง user ชื่อ somchai ไว้ใน OU=IT
$ sudo samba-tool user create somchai 'Somchai#2026' \
    --userou="OU=IT" --given-name=Somchai --surname=Jaidee
john@dc01 — SSH john@dc01:~$ sudo samba-tool user list Administrator Guest krbtgt somchai john@dc01:~$ echo 'Somchai#2026' | kinit somchai@AD.ITTRAINING.LOCAL # [OK] somchai ได้ Kerberos ticket (TGT)
จากเครื่องจริงสร้าง user somchai และ login ด้วย Kerberos สำเร็จ
คำสั่ง / ออปชันหน้าที่
samba-tool ou create "OU=IT,DC=ad,..."สร้างหน่วยงาน (OU) ตาม Distinguished Name
samba-tool user createสร้าง user ใน AD (พร้อมชื่อ-นามสกุล)
--userou="OU=IT"ระบุให้ user อยู่ใน OU ที่สร้างไว้
samba-tool user listแสดงรายชื่อ user ทั้งหมดใน domain
kinit user@REALMขอ Kerberos ticket — ถ้าได้ TGT แปลว่า login ได้จริง
✅ ติดตั้งครบขั้นตอน

ติดตั้ง Samba AD DC ครบแล้ว — แต่ยังเหลือขั้น สำคัญที่สุด: reboot เพื่อทดสอบว่าตั้งค่า “อยู่ถาวร” ไหม (บทถัดไป) ก่อนถือว่าใช้งานจริงได้

✦ จบบทที่ 9
บทที่ 10 · Reboot Test

10ทดสอบความถาวร — reboot แล้วต้องไม่หาย

ขั้นที่สำคัญที่สุดสำหรับใช้งานจริง: reboot เครื่องแล้วยืนยันว่า hostname, static IP และ DC ยังอยู่ครบ ไม่ถูก cloud-init เขียนทับ

rebootcloud-initpersist

ทำไมต้องทดสอบ reboot

การติดตั้งอาจดู “สำเร็จ” ตอนแรก แต่ถ้าไม่กัน cloud-init ค่าสำคัญจะ เด้งกลับหลังบูต ทำให้ DC พังโดยไม่รู้ตัว การ reboot แล้วเช็คจึงเป็นวิธียืนยันว่าตั้งค่า “อยู่ถาวร” จริง (บทที่ 3 และ 8 คือขั้นที่กันไว้)

cloud-init เคยรีเซ็ตอะไรเรากันไว้ด้วย (บทไหน)
hostname → serverpreserve_hostname: true (บท 3)
network → DHCPปิด network config + ลบ 50-cloud-init.yaml (บท 8)
Step 1
reboot เครื่อง
$ sudo reboot
Step 2
login ใหม่ แล้วเช็ก 3 อย่าง — ต้องยังถูกต้องทั้งหมด
$ hostname
$ ip -br a show enp0s1
$ systemctl is-active samba-ad-dc
john@dc01 — หลัง reboot john@dc01:~$ hostname dc01 john@dc01:~$ ip -br a show enp0s1 enp0s1 UP 192.168.64.85/24 john@dc01:~$ systemctl is-active samba-ad-dc active
ผลที่ควรได้หลัง reboot: hostname=dc01, IP=static (ไม่มีคำว่า dynamic), DC=active — ตั้งค่าอยู่ถาวรแล้ว
คำสั่งตรวจต้องได้ / อธิบาย
hostnameต้องได้ dc01 (ไม่ใช่ server) = preserve_hostname ทำงาน
ip -br a show enp0s1ต้องเป็น 192.168.64.85/24 และ ไม่มีคำว่า dynamic = static อยู่
systemctl is-active samba-ad-dcต้องได้ active = DC สตาร์ตเองตอนบูต
✅ ผ่าน = ใช้งานจริงได้

ถ้าทั้ง 3 ค่ายังถูกต้องหลัง reboot แปลว่าติดตั้ง “อยู่ถาวร” จริง พร้อมใช้งาน — ไปเรื่องที่ 2 เพื่อ join client และตรวจเชิงลึก

🔥 ถ้ายังเด้งกลับ

hostname กลับเป็น server → ยังไม่ได้ตั้ง preserve_hostname (บท 3) · IP กลับเป็น dynamic → ยังไม่ได้ปิด cloud-init network (บท 8) กลับไปทำสองขั้นนั้นให้ครบแล้ว reboot ใหม่

✦ จบบทที่ 10 · จบการติดตั้ง
บทที่ 1 · ตรวจสอบ

01ตรวจว่า DC ใช้งานได้จริง (Health Check)

ชุดคำสั่งตรวจสุขภาพ DC ที่รันเองได้ทุกเมื่อ — ตรวจฐานข้อมูล, DNS, Kerberos และ SMB

dbcheckkinitDNS

7 จุดตรวจบนตัว DC

#คำสั่งผลที่ควรได้
1systemctl is-active samba-ad-dcactive
2sudo samba-tool dbcheck --cross-ncs0 errors
3sudo samba-tool domain info 127.0.0.1ชื่อ domain/DC ถูก
4host -t SRV _ldap._tcp.ad.ittraining.local→ dc01:389
5kinit administrator + klistได้ TGT
6smbclient //localhost/sysvol -U administratorls ได้
7sudo samba-tool user listเห็น users
john@dc01 — Health Check john@dc01:~$ sudo samba-tool dbcheck --cross-ncs Checking 3843 objects Checked 3843 objects (0 errors) john@dc01:~$ sudo samba-tool domain info 127.0.0.1 Domain : ad.ittraining.local DC name : dc01.ad.ittraining.local Netbios domain : AD john@dc01:~$ host -t SRV _ldap._tcp.ad.ittraining.local ... has SRV record 0 100 389 dc01.ad.ittraining.local.
จากเครื่องจริงdbcheck = 0 errors, domain info ถูก, SRV record ชี้ dc01 — DC สมบูรณ์
คำสั่ง / ออปชันหน้าที่
samba-tool dbcheck --cross-ncsตรวจความสมบูรณ์ของฐานข้อมูล AD ทุก partition — ต้องได้ 0 errors
samba-tool domain infoแสดงข้อมูล domain/forest/DC/site
host -t SRVตรวจ DNS SRV record ที่ client ใช้หา DC
klistแสดง Kerberos ticket ที่ถืออยู่
💡 ตัวชี้วัดสำคัญสุด

ถ้า ข้อ 2 (dbcheck = 0 errors) และ ข้อ 5 (kinit ได้ TGT) ผ่าน แปลว่า LDAP directory และ Kerberos ทำงานสมบูรณ์ — หัวใจของ AD

✦ จบบทที่ 1
บทที่ 2 · Join Client

02นำ Client เข้า Domain (พิสูจน์ใช้งานจริง)

ทดสอบจากเครื่อง client จริง — ตั้ง DNS ให้ชี้ DC แล้ว join domain ทั้ง Windows และ Linux

joinWindowsrealmd
⚠ สิ่งที่สำคัญที่สุด

Client ทุกเครื่องที่จะ join ต้องตั้ง DNS = 192.168.64.85 (IP ของ DC) ก่อนเสมอ ไม่งั้นจะหา domain ไม่เจอ

ตรวจจาก Client ว่าเจอ DC

# บน client (ตั้ง DNS = 192.168.64.85 ก่อน)
nslookup -type=SRV _ldap._tcp.ad.ittraining.local 192.168.64.85

Windows

Step 1
ตั้ง DNS ของการ์ดเน็ตเป็น 192.168.64.85
Step 2
System → Domain → ใส่ AD.ITTRAINING.LOCAL แล้ว join, ใส่รหัส Administrator
Step 3
รีบูตแล้ว login ด้วย AD\somchai

Linux (Ubuntu client)

$ sudo apt install -y realmd sssd sssd-tools adcli
$ sudo realm join AD.ITTRAINING.LOCAL -U administrator
$ id somchai@ad.ittraining.local
คำสั่ง / ออปชันหน้าที่
nslookup -type=SRVทดสอบว่า client หา DC ผ่าน DNS SRV ได้
realm joinพา Ubuntu เข้า domain (ใช้ sssd เบื้องหลัง)
id user@domainตรวจว่า client มองเห็น user จาก AD
✦ จบบทที่ 2
บทที่ 3 · Join Windows

3นำ Windows 10/11 เข้า Domain (ละเอียด)

ตั้งแต่เตรียมเครื่อง Windows, ตั้ง IP/DNS, ทดสอบว่าเห็น DC, join domain, login ด้วย user บน AD จนถึงยืนยันผล — ทำตามได้ทันที

Windows 10/11DNSJoin Domain

เตรียมเครื่อง Windows ก่อน (Prerequisites)

รายการต้องเป็น
Windows EditionPro / Enterprise / Education เท่านั้น — Home join domain ไม่ได้
เครือข่ายอยู่วงเดียวกับ DC (ต้อง ping 192.168.64.85 ได้)
DNSต้องชี้ที่ 192.168.64.85 (IP ของ DC) — สำคัญที่สุด
เวลา (นาฬิกา)ตรงกับ DC ต่างไม่เกิน 5 นาที (Kerberos บังคับ)
🔥 Windows Home ใช้ไม่ได้

Windows รุ่น Home ตัดฟีเจอร์ join domain ออก ต้องเป็น Pro / Enterprise / Education เท่านั้น เช็ครุ่นได้ที่ Settings → System → About

Step 1 — ตั้ง DNS ให้ชี้ DC (สำคัญที่สุด)

Windows หา Domain Controller ผ่าน DNS SRV record ถ้า DNS ไม่ได้ชี้มาที่ DC เครื่องจะ หา domain ไม่เจอ เลย join ไม่ได้ — ต้องตั้ง DNS เป็น IP ของ DC ก่อนเสมอ

วิธี A — ผ่าน GUI

1.1
Settings → Network & Internet → เลือกการ์ด (Ethernet/Wi-Fi) → คลิก Edit ที่หัวข้อ DNS server
1.2
เลือก Manual → เปิด IPv4 → ช่อง Preferred DNS ใส่ 192.168.64.85 → Save

วิธี B — ผ่าน PowerShell (เปิดแบบ Administrator)

# ดูชื่อการ์ดก่อน
PS> Get-NetAdapter
# ตั้ง DNS ให้ชี้ DC (เปลี่ยน "Ethernet" ตามชื่อการ์ด)
PS> Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 192.168.64.85
คำสั่งหน้าที่
Get-NetAdapterดูรายชื่อการ์ดเน็ต (เอาชื่อไปใส่ InterfaceAlias)
Set-DnsClientServerAddressตั้ง DNS server ของการ์ดให้เป็น IP ของ DC
⚠ DNS ต้องเป็น DC เท่านั้น

อย่าใส่ 8.8.8.8 เป็น DNS ตัวแรก — client จะ resolve domain ภายในไม่เจอ ให้ใช้ 192.168.64.85 เพียงตัวเดียว (DC จะ forward คำถามภายนอกให้เอง)

Step 2 — ทดสอบว่า Client เห็น DC

ก่อน join ต้องมั่นใจว่า Windows หา DC ผ่าน DNS เจอจริง

PS> nslookup -type=SRV _ldap._tcp.ad.ittraining.local
PS> ping dc01.ad.ittraining.local
PowerShell — ทดสอบหา DC PS C:\Users\panya> nslookup -type=SRV _ldap._tcp.ad.ittraining.local Server: dc01.ad.ittraining.local Address: 192.168.64.85 _ldap._tcp.ad.ittraining.local SRV service location: port = 389, svr hostname = dc01.ad.ittraining.local
ตัวอย่างผลลัพธ์เจอ SRV record ชี้ dc01:389 = DNS ถูกต้อง พร้อม join
💡 อ่านผล

ถ้าเห็น svr hostname = dc01.ad.ittraining.local แปลว่า Windows หา DC เจอผ่าน DNS แล้ว ถ้าขึ้น "can't find" = DNS ยังไม่ได้ชี้ DC (กลับไป Step 1)

Step 3 — ตรวจเวลาให้ตรง (Kerberos)

Kerberos ยอมให้เวลาต่างกันได้ไม่เกิน 5 นาที ถ้าเวลาเพี้ยนจะ join ไม่ได้ (error เกี่ยวกับ clock skew)

# ตั้ง time zone ให้ตรง แล้ว sync เวลา
PS> w32tm /resync
💡 ตั้ง timezone

Settings → Time & Language → Date & Time → เปิด "Set time automatically" และเลือก Time zone ให้ตรง (เช่น Bangkok UTC+7)

Step 4 — Join Domain

วิธี A — ผ่าน GUI

4.1
กด Win+R พิมพ์ sysdm.cpl → แท็บ Computer Name → ปุ่ม Change...
4.2
เลือก Member of → Domain ใส่ ad.ittraining.local → OK
4.3
ใส่บัญชีที่มีสิทธิ์ join: user Administrator รหัสที่ตั้งตอน provision
4.4
ขึ้น "Welcome to the ad.ittraining.local domain"Restart เครื่อง

วิธี B — ผ่าน PowerShell (Administrator)

PS> Add-Computer -DomainName ad.ittraining.local -Credential AD\Administrator -Restart
ส่วนความหมาย
-DomainName ad.ittraining.localชื่อ domain ที่จะเข้าร่วม
-Credential AD\Administratorบัญชีที่มีสิทธิ์ join (จะเด้งให้ใส่รหัส)
-Restartรีสตาร์ตอัตโนมัติหลัง join สำเร็จ

Step 5 — Login ด้วย Domain User

ที่หน้า login เลือก Other user แล้วพิมพ์ชื่อผู้ใช้บน AD ได้ 2 รูปแบบ:

รูปแบบตัวอย่าง
NetBIOS\usernameAD\somchai
UPN (user@domain)somchai@ad.ittraining.local

ใส่รหัสของ user นั้น (เช่น somchai = P##ssw00rd) → เข้าใช้งานได้

Step 6 — ยืนยันว่า Join สำเร็จ

C:\> whoami                              # ต้องขึ้น ad\
C:\> systeminfo | findstr /C:"Domain"    # ต้องเห็น ad.ittraining.local
Command Prompt — ยืนยัน join C:\Users\somchai> whoami ad\somchai C:\Users\somchai> systeminfo | findstr Domain Domain: ad.ittraining.local
ตัวอย่างผลลัพธ์whoami = ad\somchai และ Domain = ad.ittraining.local → join สำเร็จ

ตรวจจากฝั่ง DC ได้ด้วยว่ามีชื่อเครื่องเข้ามา:

$ sudo samba-tool computer list      # (รันบน DC) ต้องเห็นชื่อเครื่อง Windows

แก้ปัญหา Join Windows ที่พบบ่อย

อาการสาเหตุ / วิธีแก้
"An Active Directory Domain Controller could not be contacted"DNS ไม่ได้ชี้ DC → กลับไป Step 1 ตั้ง DNS = 192.168.64.85
join ไม่ได้ แม้ ping DC ได้DNS ผิด (ping ใช้ชื่อ IP ได้ แต่ join ต้องใช้ SRV จาก DNS ของ DC)
ไม่มีปุ่ม/ตัวเลือก DomainWindows เป็นรุ่น Home → ต้อง Pro ขึ้นไป
error เรื่องเวลา (clock skew)เวลาเครื่องต่างจาก DC เกิน 5 นาที → sync เวลา (Step 3)
credential ไม่ผ่านใช้ AD\Administrator + รหัสที่ตั้งตอน provision
✦ จบบทที่ 3 · Join Windows
บทที่ 4 · Join Linux

4นำ Linux เข้า Domain ด้วย realmd + SSSD

วิธีมาตรฐานของ distro สำหรับให้เครื่อง Linux เข้าร่วม AD — join ง่ายด้วย realm พร้อมตั้งค่า login, home directory, sudo และการออกจาก domain

realmdSSSDadcli

ภาพรวม — realmd + SSSD ทำอะไร

realmd เป็นตัวช่วย ค้นหา (discover) และ join domain แบบอัตโนมัติ ส่วน SSSD (System Security Services Daemon) ทำหน้าที่ตรวจสอบตัวตนและดึงข้อมูล user/group จาก AD มาให้ระบบ Linux ใช้ — เป็นวิธีที่ Ubuntu/RHEL แนะนำ (อีกวิธีคือ winbind ดูบทถัดไป)

เตรียมเครื่องก่อน (Prerequisites)

รายการต้องเป็น
DNSชี้ที่ 192.168.64.85 (IP ของ DC) — สำคัญที่สุด
เวลาsync ตรงกับ DC (Kerberos ต่างไม่เกิน 5 นาที)
hostnameตั้ง FQDN ให้เรียบร้อย เช่น client01.ad.ittraining.local

Step 1 — ตั้ง DNS ให้ชี้ DC

ตั้งใน Netplan ให้ nameserver เป็น IP ของ DC แล้วตรวจว่าเห็น SRV record

$ sudo tee /etc/netplan/99-dns.yaml >/dev/null <<'EOF'
network:
  version: 2
  ethernets:
    enp0s1:
      nameservers:
        addresses: [192.168.64.85]
        search: [ad.ittraining.local]
EOF
$ sudo chmod 600 /etc/netplan/99-dns.yaml && sudo netplan apply
$ host -t SRV _ldap._tcp.ad.ittraining.local     # ต้องเจอ dc01

Step 2 — ติดตั้งแพ็กเกจ

$ sudo apt update
$ sudo apt install -y realmd sssd sssd-tools libnss-sss libpam-sss \
    adcli samba-common-bin oddjob oddjob-mkhomedir packagekit
แพ็กเกจหน้าที่
realmddiscover / join / leave domain
sssd, sssd-toolsตัวจัดการ auth & identity ของ AD ฝั่ง Linux
libnss-sss / libpam-sssให้ NSS/PAM รู้จัก user ของ AD (login ได้)
adcliเครื่องมือ join AD (realmd เรียกใช้เบื้องหลัง)
oddjob-mkhomedirสร้าง home directory อัตโนมัติตอน login ครั้งแรก

Step 3 — ค้นหา Domain (discover)

$ realm discover ad.ittraining.local
client01 — realm discover john@client01:~$ realm discover ad.ittraining.local ad.ittraining.local type: kerberos server-software: active-directory required-package: sssd, adcli, samba-common-bin
ตัวอย่างผลลัพธ์เจอ domain แบบ active-directory = พร้อม join

Step 4 — Join Domain

$ sudo realm join -U administrator ad.ittraining.local
ส่วนความหมาย
realm joinพาเครื่องเข้าร่วม domain (สร้าง sssd.conf + join ให้อัตโนมัติ)
-U administratorบัญชีที่มีสิทธิ์ join (จะถามรหัส)

Step 5 — ยืนยัน & ทดสอบ User

$ realm list                                # ดูสถานะ domain ที่ join
$ id somchai@ad.ittraining.local            # เห็น uid/gid/groups จาก AD
$ getent passwd somchai@ad.ittraining.local
client01 — id (AD user) john@client01:~$ id somchai@ad.ittraining.local uid=1451801104(somchai@ad.ittraining.local) gid=1451800513(domain users@ad.ittraining.local) groups=1451800513(domain users@ad.ittraining.local)
ตัวอย่างผลลัพธ์ระบบเห็น user จาก AD แล้ว = join สำเร็จ
💡 รูปแบบชื่อ login

ค่าเริ่มต้นของ SSSD ต้อง login ด้วยชื่อเต็ม somchai@ad.ittraining.local ถ้าอยากใช้ชื่อสั้น somchai ดูหัวข้อ "ตั้งค่า SSSD เพิ่มเติม" ด้านล่าง

Step 6 — เปิดสร้าง Home Directory อัตโนมัติ

ให้สร้าง /home/<user> เองตอน login ครั้งแรก

$ sudo pam-auth-update --enable mkhomedir

Step 7 — จำกัดผู้ที่ login ได้ (permit / deny)

โดยดีฟอลต์หลัง join มักอนุญาตเฉพาะที่กำหนด — ควบคุมด้วย realm

$ sudo realm permit somchai@ad.ittraining.local        # อนุญาตเฉพาะคน
$ sudo realm permit -g 'domain admins@ad.ittraining.local'  # อนุญาตทั้งกลุ่ม
$ sudo realm permit --all                              # อนุญาตทุกคนในโดเมน
$ sudo realm deny --all                                # ปิดทุกคน (แล้ว permit ทีละคน)

Step 8 — ให้ AD User/Group ใช้ sudo

$ echo '%domain\ admins@ad.ittraining.local ALL=(ALL:ALL) ALL' \
    | sudo tee /etc/sudoers.d/ad-admins
$ sudo chmod 440 /etc/sudoers.d/ad-admins
💡 ชื่อกลุ่มมีเว้นวรรค

กลุ่ม "domain admins" มีเว้นวรรค ต้อง escape ด้วย \ ใน sudoers (%domain\ admins@...)

ตั้งค่า SSSD เพิ่มเติม (/etc/sssd/sssd.conf)

ปรับให้ใช้งานสะดวกขึ้น เช่น login ด้วยชื่อสั้น และกำหนด home/shell

[domain/ad.ittraining.local]
use_fully_qualified_names = False     # login ด้วย somchai (ไม่ต้องมี @domain)
fallback_homedir = /home/%u           # ที่อยู่ home
default_shell = /bin/bash             # shell เริ่มต้น
$ sudo systemctl restart sssd         # รีสตาร์ตหลังแก้ config

ออกจาก Domain (leave)

$ sudo realm leave ad.ittraining.local

แก้ปัญหาที่พบบ่อย (Linux realm join)

อาการสาเหตุ / วิธีแก้
realm discover ไม่เจอDNS ไม่ได้ชี้ DC → ตั้ง nameserver = 192.168.64.85 (Step 1)
join แล้ว login ไม่ได้ยังไม่ได้ realm permit ผู้ใช้ หรือยังไม่เปิด mkhomedir
id user ไม่เจอsudo systemctl restart sssd แล้วลองใหม่
error เรื่องเวลาเวลาเครื่องต่างจาก DC เกิน 5 นาที → sync เวลา
✦ จบบทที่ 4 · Join Linux
บทที่ 5 · Winbind

5อีกวิธี — Samba Domain Member (winbind)

วิธีตามเอกสารทางการของ Samba ที่ใช้ winbind แทน SSSD — เหมาะเมื่อต้องการให้เครื่องเป็น domain member ที่แชร์ไฟล์ด้วย Samba

winbindnet ads joinidmap
📚 ที่มา

เรียบเรียงเป็นภาษาไทยจาก Samba Wiki — Setting up Samba as a Domain Member (wiki.samba.org) โดยคงความหมายเดิม และปรับตัวอย่างให้ตรงกับ realm ของเรา (AD.ITTRAINING.LOCAL / workgroup AD)

เตรียมก่อน (Prerequisites)

ตามเอกสาร Samba ต้องเตรียม DNS, Kerberos, /etc/hosts และเวลาให้พร้อมก่อน join

# /etc/krb5.conf
[libdefaults]
    default_realm = AD.ITTRAINING.LOCAL
    dns_lookup_realm = false
    dns_lookup_kdc = true
# ตรวจว่า DNS หา DC เจอ
$ host -t SRV _ldap._tcp.ad.ittraining.local
$ getent hosts client01        # /etc/hosts ต้องมี FQDN ของเครื่องเอง

ติดตั้ง Samba + winbind

$ sudo apt install -y samba winbind libnss-winbind libpam-winbind smbclient krb5-user

ตั้งค่า /etc/samba/smb.conf

[global]
   realm = AD.ITTRAINING.LOCAL
   workgroup = AD
   security = ads

   winbind use default domain = yes
   winbind refresh tickets = yes
   template shell = /bin/bash
   template homedir = /home/%U

   idmap config * : backend = tdb
   idmap config * : range = 3000-7999
   idmap config AD : backend = rid
   idmap config AD : range = 10000-999999
ค่าความหมาย
security = adsให้เครื่องเป็น domain member ของ Active Directory
idmap config * (backend=tdb)ช่วง UID/GID สำหรับ user ในเครื่อง (default)
idmap config AD (backend=rid)แปลง SID ของ AD เป็น UID/GID แบบคงที่ (คำนวณจาก RID)
winbind use default domain = yesให้ใช้ชื่อสั้น somchai ได้ (ไม่ต้อง AD\somchai)

Join Domain

$ sudo net ads join -U administrator
# หรือ Samba 4.15+ :
$ sudo samba-tool domain join ad.ittraining.local MEMBER -U administrator

ตั้ง /etc/nsswitch.conf

passwd:  files winbind
group:   files winbind

เริ่ม Service

$ sudo systemctl restart smbd nmbd winbindd
⚠ อย่าเปิด service samba บน domain member

ตามเอกสาร Samba: service samba ใช้กับ Domain Controller เท่านั้น ส่วน domain member ให้ใช้ smbd nmbd winbindd

ยืนยัน (winbind)

$ sudo wbinfo --ping-dc      # ทดสอบเชื่อมต่อ DC
$ wbinfo -u                  # รายชื่อ user จาก AD
$ wbinfo -g                  # รายชื่อ group จาก AD
$ getent passwd somchai      # NSS เห็น user ไหม
$ id somchai
member01 — wbinfo john@member01:~$ sudo wbinfo --ping-dc checking the NETLOGON dc connection to "dc01" succeeded john@member01:~$ wbinfo -u administrator somchai
ตัวอย่างผลลัพธ์winbind ต่อ DC ได้และเห็น user จาก AD

ให้ AD User login + สร้าง Home

$ sudo pam-auth-update --enable mkhomedir   # สร้าง home อัตโนมัติตอน login

realmd/SSSD กับ winbind — เลือกอันไหน

realmd + SSSD (บท 4)winbind (บทนี้)
ติดตั้ง/ตั้งค่าง่าย (realm join สั่งเดียว)ตั้ง smb.conf เอง
เหมาะกับLinux client ทั่วไปเครื่องที่แชร์ไฟล์ด้วย Samba
เอกสารทางการ Samba✔ แนะนำโดย samba.org
✦ จบบทที่ 5 · Winbind
บทที่ 6 · Security

06ความปลอดภัยและการแก้ปัญหา

สิ่งที่ต้องทำหลังติดตั้ง (เปลี่ยนรหัส) และตารางแก้ปัญหาที่พบบ่อย

hardentroubleshoot

ทำทันทีหลังติดตั้ง

Step 1
เปลี่ยนรหัส Administrator ของ AD
$ sudo samba-tool user setpassword Administrator
Step 2
เปลี่ยนรหัส OS ของผู้ใช้ที่ใช้ติดตั้ง
$ passwd
🔒 อย่าลืมเปลี่ยนรหัส

รหัสชั่วคราวที่ตั้งตอนติดตั้ง (Administrator, user ทดสอบ) ควรเปลี่ยนทันทีก่อนใช้งานจริง

ตารางแก้ปัญหาที่พบบ่อย

อาการตรวจ / แก้
samba-ad-dc ไม่ startjournalctl -u samba-ad-dc, ตรวจ smbd/nmbd ว่า mask แล้ว
resolve โดเมนไม่ได้/etc/resolv.conf ต้อง nameserver 127.0.0.1, systemd-resolved ต้อง disable
kinit ล้มเหลว (clock skew)เวลาเครื่องต้องตรง — ตรวจ timedatectl (synchronized: yes)
client หา DC ไม่เจอclient ต้องตั้ง DNS = 192.168.64.85 (IP ของ DC)
dbcheck เจอ errorsudo samba-tool dbcheck --cross-ncs --fix
john@dc01 — ตรวจเวลา john@dc01:~$ timedatectl | grep -E "synchronized|Time zone" Time zone: Asia/Bangkok (+07, +0700) System clock synchronized: yes
จากเครื่องจริงเวลา sync แล้ว — Kerberos ต้องการเวลาที่ตรงกัน
✦ จบบทที่ 6
บทที่ 1 · User Management

01จัดการ User ด้วย samba-tool

สร้าง ดู แก้ไข รีเซ็ตรหัส เปิด/ปิด ลบ ย้าย รวมถึงจัดการ Group และ OU — ครบทุกคำสั่งที่ใช้บ่อยในงานจริง

samba-toolusergroupOU

1) สร้าง User (create)

Syntax: sudo samba-tool user create <username> '<password>' [ออปชัน]

$ sudo samba-tool user create panya 'P##ssw00rd' \
    --userou="OU=IT" \
    --given-name=Panya --surname=Johnjaran \
    --use-username-as-cn
ออปชันหน้าที่
<username> (arg แรก)ชื่อ login — ใช้ตอน kinit และเข้าระบบ (สำคัญสุด)
'<password>' (arg สอง)รหัสผ่าน (ต้องซับซ้อน) — ครอบด้วย single quote กันอักขระพิเศษ
--userou="OU=IT"สร้างไว้ใน OU ที่กำหนด (OU ต้องมีอยู่ก่อน)
--given-name / --surnameชื่อ-นามสกุลที่แสดง (display name) — ไม่ใช่ username
--use-username-as-cnแนะนำ — ตั้ง CN = username กัน CN ชนกัน
--mail-address=...กำหนดอีเมลของ user
--random-passwordให้ระบบสุ่มรหัสที่ซับซ้อนให้ (แสดงออกมา)
--must-change-at-next-loginบังคับผู้ใช้เปลี่ยนรหัสเองตอน login ครั้งแรก
💡 ใส่ --use-username-as-cn ทุกครั้ง

โดยดีฟอลต์ CN = "given-name + surname" ซึ่งชนกันง่ายถ้าตั้งชื่อ-นามสกุลซ้ำ การใช้ --use-username-as-cn ทำให้ CN = username เสมอ (unique) — ดูรายละเอียดปัญหานี้ในบทถัดไป

2) ดูรายชื่อ & รายละเอียด (list / show)

$ sudo samba-tool user list          # รายชื่อ user ทั้งหมด
$ sudo samba-tool user show panya    # รายละเอียด (DN, UPN, CN)
john@dc01 — samba-tool user list john@dc01:~$ sudo samba-tool user list Administrator Guest krbtgt somchai panya
ตัวอย่างผลลัพธ์รายชื่อ user ทั้งหมดใน domain (Administrator/Guest/krbtgt เป็นของระบบ)

3) รีเซ็ต & ตั้งค่ารหัสผ่าน (setpassword / setexpiry)

$ sudo samba-tool user setpassword panya                          # ถามรหัสใหม่แบบ interactive
$ sudo samba-tool user setpassword panya --newpassword='NewP@ss123'
$ sudo samba-tool user setpassword panya --must-change-at-next-login
$ sudo samba-tool user setexpiry panya --noexpiry                 # รหัสไม่หมดอายุ
$ sudo samba-tool user setexpiry panya --days=90                  # หมดอายุใน 90 วัน
คำสั่งหน้าที่
setpassword <user>เปลี่ยนรหัสผ่าน (ถ้าไม่ใส่ --newpassword จะถามแบบ interactive)
--must-change-at-next-loginให้ผู้ใช้เปลี่ยนรหัสเองตอน login ครั้งถัดไป
setexpiry --noexpiryตั้งให้รหัสไม่หมดอายุ
setexpiry --days=Nตั้งให้รหัสหมดอายุใน N วัน

4) เปิด / ปิด / ลบ บัญชี (enable / disable / delete)

$ sudo samba-tool user disable panya    # ปิดบัญชีชั่วคราว (login ไม่ได้)
$ sudo samba-tool user enable panya     # เปิดใช้อีกครั้ง
$ sudo samba-tool user delete panya     # ลบถาวร
⚠ delete = ลบถาวร

user delete ลบทันทีและกู้คืนยาก ถ้าแค่อยากระงับชั่วคราวให้ใช้ user disable แทน

5) ย้าย OU & เปลี่ยนชื่อ (move / rename)

$ sudo samba-tool user move panya "OU=Sales,DC=ad,DC=ittraining,DC=local"
$ sudo samba-tool user rename panya --surname=Kaewsai    # (บางเวอร์ชัน)
คำสั่งหน้าที่
user move <user> <OU ปลายทาง>ย้าย user ไปอยู่ OU อื่น (ระบุด้วย DN เต็ม)
user rename <user> [--surname=..]แก้ชื่อ/นามสกุล/CN (รองรับใน Samba รุ่นใหม่)

6) จัดการ Group

$ sudo samba-tool group add sales                  # สร้าง group
$ sudo samba-tool group addmembers sales panya     # เพิ่มสมาชิก
$ sudo samba-tool group listmembers sales          # ดูสมาชิก
$ sudo samba-tool group removemembers sales panya  # เอาออก
$ sudo samba-tool group list                       # รายชื่อ group

7) จัดการ OU

$ sudo samba-tool ou create "OU=Sales,DC=ad,DC=ittraining,DC=local"
$ sudo samba-tool ou list
$ sudo samba-tool ou delete "OU=Sales,DC=ad,DC=ittraining,DC=local"

สรุปคำสั่งที่ใช้บ่อย (Cheat Sheet)

งานคำสั่ง
สร้าง usersamba-tool user create <u> '<pw>' --use-username-as-cn
ดูรายชื่อsamba-tool user list
ดูรายละเอียดsamba-tool user show <u>
เปลี่ยนรหัสsamba-tool user setpassword <u>
ปิด/เปิดบัญชีsamba-tool user disable|enable <u>
ลบ usersamba-tool user delete <u>
สร้าง/จัดการ groupsamba-tool group add|addmembers|listmembers
สร้าง/ลบ OUsamba-tool ou create|list|delete
ทดสอบ loginkinit <u> แล้ว klist
✦ จบบทที่ 1
บทที่ 2 · Troubleshooting

02ปัญหาการสร้าง User ที่เจอจริง & วิธีแก้

รวม error ที่เจอจริงตอนสร้างและทดสอบ user พร้อมสาเหตุและวิธีแก้ทีละเคส — เข้าใจแล้วจะไม่ติดซ้ำ

errorkinitCNpassword

เคส 1 — kinit: Client not found

john@dc01 — kinit error john@dc01:~$ echo 'panya' | kinit panya@ad.ittraining.local kinit: Client 'panya@ad.ittraining.local' not found in Kerberos database while getting initial credentials
ปัญหาที่เจอจริงkinit หา principal ไม่เจอ
🔍 สาเหตุ (มี 2 อย่าง)

1. username ผิด — ตอนสร้างใช้ samba-tool user create somchai ... --given-name=panya ทำให้ username จริงคือ somchai ส่วน panya เป็นแค่ given-name (ชื่อที่แสดง)
2. realm ตัวเล็กpanya@ad.ittraining.local ต้องเป็นตัวพิมพ์ใหญ่ Kerberos realm case-sensitive

วิธีแก้

$ kinit somchai                       # ใช้ username ที่ถูกต้อง (arg แรกตอน create)
$ kinit panya@AD.ITTRAINING.LOCAL     # ถ้าสร้าง user panya แล้ว — realm ตัวใหญ่
$ kinit panya                         # ไม่ใส่ realm = ใช้ default (ตัวใหญ่) อัตโนมัติ
💡 จำ 2 กฎ

① arg แรกของ user create = username (ไม่ใช่ given-name)   ② Kerberos realm = ตัวพิมพ์ใหญ่เสมอ (AD.ITTRAINING.LOCAL)

เคส 2 — Entry CN=... already exists

john@dc01 — CN already exists john@dc01:~$ sudo samba-tool user create panya 'P##ssw00rd' \ --userou="OU=IT" --given-name=Panya --surname=Johnjaran ERROR(ldb): Failed to add user 'panya': Entry CN=Panya Johnjaran,OU=IT,DC=ad,DC=ittraining,DC=local already exists
ปัญหาที่เจอจริงCN ชนกับ user ที่มีอยู่แล้ว
🔍 สาเหตุ

CN (ชื่อ object ในไดเรกทอรี) ดีฟอลต์ = "given-name + surname" และเทียบแบบ ไม่สนตัวเล็ก/ใหญ่ — user somchai ที่สร้างก่อนหน้ามี CN = "panya johnjaran" อยู่แล้ว การสร้าง panya ที่มี CN = "Panya Johnjaran" จึงชนกันใน OU=IT เดียวกัน

วิธีแก้ — ให้ CN = username

$ sudo samba-tool user create panya 'P##ssw00rd' --userou="OU=IT" \
    --given-name=Panya --surname=Johnjaran --use-username-as-cn
✅ ผล

--use-username-as-cn ทำให้ CN = panya (ตรงกับ username) จึงไม่ชนกับใคร — สร้างสำเร็จ

เคส 3 — Password does not meet complexity

ตัวอย่าง — password complexity john@dc01:~$ sudo samba-tool user create test 'abc' ERROR: Failed to add user 'test': Password does not meet the complexity requirements
ตัวอย่าง error ที่พบบ่อยรหัสสั้น/ไม่ซับซ้อนพอ
🔍 สาเหตุ

AD บังคับรหัสผ่านต้องซับซ้อน: ยาว ≥ 7 ตัว และมีอย่างน้อย 3 ใน 4 หมวด (ตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็ก / ตัวเลข / อักขระพิเศษ) — รหัสอย่าง abc หรือ panya จึงไม่ผ่าน

วิธีแก้

# 1) ใช้รหัสที่ซับซ้อน เช่น
$ sudo samba-tool user create test 'P##ssw00rd' --use-username-as-cn

# 2) (เฉพาะ lab เท่านั้น) ปิดเงื่อนไขความซับซ้อน
$ sudo samba-tool domain passwordsettings set --complexity=off
$ sudo samba-tool domain passwordsettings show
⚠ อย่าปิด complexity บน production

การปิด complexity ทำให้รหัสอ่อนแอ ใช้ได้เฉพาะเครื่อง lab เท่านั้น บนงานจริงให้คงไว้เสมอ

สรุป: Error ↔ วิธีแก้

Errorสาเหตุวิธีแก้
Client not found (kinit)username ผิด / realm ตัวเล็กใช้ username ที่ถูก + realm ตัวใหญ่ (หรือ kinit ไม่ใส่ realm)
Entry CN=... already existsCN (ชื่อแสดง) ชนกันเพิ่ม --use-username-as-cn
Password complexityรหัสสั้น/ไม่ซับซ้อนใช้รหัสซับซ้อน (lab: ปิด complexity)
✦ จบบทที่ 2 · จบเรื่องจัดการ User
บทที่ 1 · Group Policy

01Group Policy (GPO) บน Samba AD

สร้างและผูก GPO เพื่อบังคับนโยบายกับเครื่อง/ผู้ใช้ในโดเมน พร้อมตัวอย่างจริง "แมป Network Drive อัตโนมัติ" (H:\ S:\ P:\)

GPOGPMCMap Drive
📚 ที่มา

เรียบเรียงเป็นภาษาไทยจาก Samba Wiki — Group Policy (wiki.samba.org) โดยคงความหมายเดิม

ภาพรวม — GPO ทำงานยังไงบน Samba

หัวข้อรายละเอียด
เก็บที่ไหนใน SYSVOL บน DC (อ้างอิงผ่าน LDAP groupPolicyContainer)
จัดการด้วยอะไรGPMC (RSAT) จาก Windows เป็นหลัก + samba-tool gpo สำหรับ CLI
ผูกกับSite / Domain / OU
⚠ Samba ไม่มี GUI แก้ GPO เอง

ต้องใช้ Group Policy Management Console (GPMC) จากเครื่อง Windows ที่ join domain แล้วในการสร้าง/แก้ไขนโยบาย

เตรียม — ติดตั้ง RSAT (GPMC) บน Windows

A
ใช้ Windows ที่ join domain แล้ว (ดูเรื่อง 2 บท 3) → Settings → Optional features → Add → ติดตั้ง "RSAT: Group Policy Management Tools"

หรือผ่าน PowerShell (Administrator)

PS> Add-WindowsCapability -Online -Name Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0

Step 1 — เปิด GPMC

1
Login Windows ด้วย AD\Administrator → กด Win+R พิมพ์ gpmc.msc

Step 2 — สร้าง GPO และผูกกับ OU

2.1
ใน GPMC ขยาย Forest → Domains → ad.ittraining.local → คลิกขวาที่ OU (เช่น OU=IT) → "Create a GPO in this domain, and Link it here..."
2.2
ตั้งชื่อ GPO เช่น "Map Drives" → OK
2.3
คลิกขวาที่ GPO → Edit เพื่อเข้าไปแก้ไขนโยบาย

Step 3 — ตัวอย่างจริง: แมป Network Drive (H:\ S:\ P:\)

หัวข้อยอดนิยม — ให้ทุกเครื่องในแผนกได้ไดรฟ์เครือข่ายอัตโนมัติตอน login

3.1
ใน Group Policy Management Editor → User Configuration → Preferences → Windows Settings → Drive Maps → คลิกขวา New → Mapped Drive
3.2
ตั้งค่า: Action = Create, Location = \\dc01\share, Drive Letter = H:
3.3
(ทางเลือก) แท็บ Common → Item-level targeting เพื่อให้แมปเฉพาะบางกลุ่ม/OU (เช่น drive S: เฉพาะแผนก Sales)
ช่องความหมาย
Action = Createสร้างการแมปไดรฟ์ใหม่
Locationเส้นทาง UNC ของ share (เช่น \\dc01\share)
Drive Letterอักษรไดรฟ์ที่ต้องการ (H:, S:, P:)
Item-level targetingเงื่อนไขว่าใครจะได้แมปนี้ (ตามกลุ่ม/OU/ชื่อผู้ใช้)

Step 4 — จัดการ GPO ด้วย samba-tool (CLI)

$ sudo samba-tool gpo listall                       # ดู GPO ทั้งหมด + GUID
$ sudo samba-tool gpo create "Map Drives" -U Administrator
$ sudo samba-tool gpo setlink "OU=IT,DC=ad,DC=ittraining,DC=local" {GUID} -U Administrator
$ sudo samba-tool gpo admxload -U Administrator      # ติดตั้ง ADMX templates
dc01 — samba-tool gpo listall john@dc01:~$ sudo samba-tool gpo listall GPO : {31B2F340-016D-11D2-945F-00C04FB984F9} display name : Default Domain Policy GPO : {6AC1786C-016F-11D2-945F-00C04fB984F9} display name : Default Domain Controllers Policy
ตัวอย่างผลลัพธ์ดู GPO ทั้งหมดพร้อม GUID (ใช้ GUID ไปผูก/แก้ไขต่อ)
💡 ตรวจลำดับ argument

รูปแบบ argument ของ gpo setlink ต่างกันตามเวอร์ชัน ตรวจได้ด้วย samba-tool gpo setlink --help — หรือผูกผ่าน GPMC (Step 2) จะชัวร์กว่า

Step 5 — Apply & ทดสอบบน Client

PS> gpupdate /force      # ดึง GPO ใหม่ทันที
PS> gpresult /r          # ดูว่าเครื่องได้รับ GPO อะไรบ้าง
PS> net use              # เห็นไดรฟ์ที่ถูกแมป (H:, S:, P:)
⚠ SYSVOL replication

ถ้ามี DC เดียวไม่ต้องกังวล แต่ถ้ามีหลาย DC ต้อง sync SYSVOL เอง (Samba ยังไม่ replicate SYSVOL อัตโนมัติ) — ตอน admxload ให้ใช้ -H ระบุ DC ที่ถูกต้อง

✦ จบบทที่ 1 · Group Policy
บทที่ 2 · File Server

02แชร์ไฟล์ให้ AD User (Samba File Server)

สร้าง share บนเครื่อง domain member ที่ผู้ใช้และกลุ่มจาก AD เข้าถึงได้ พร้อมคุมสิทธิ์ด้วย Windows ACLs

Samba shareWindows ACLswinbind
📚 ที่มา

เรียบเรียงเป็นภาษาไทยจาก Samba Wiki — Setting up a Share Using Windows ACLs (wiki.samba.org) โดยคงความหมายเดิม ปรับให้ตรงกับโดเมน AD.ITTRAINING.LOCAL

Prerequisites

เครื่องที่จะเป็น file server ต้องเป็น domain member (winbind) อยู่ก่อน (ดูเรื่อง 2 บท 5) และ wbinfo -u ต้องเห็น user จาก AD

Step 1 — เปิด Windows ACLs ใน smb.conf [global]

[global]
   # ... (ค่า domain member เดิม เช่น security = ads, idmap ...) ...
   vfs objects = acl_xattr
   map acl inherit = yes
   store dos attributes = yes      # จำเป็นเฉพาะ Samba เวอร์ชันก่อน 4.9
ค่าหน้าที่
vfs objects = acl_xattrเก็บ Windows ACL ไว้ใน extended attribute (ให้สิทธิ์แบบ Windows ทำงาน)
map acl inherit = yesให้ ACL สืบทอดลงโฟลเดอร์ย่อยแบบ Windows
store dos attributes = yesเก็บ DOS attribute (Samba ใหม่เปิดให้อยู่แล้ว)

Step 2 — สร้าง Share

[Data]
   path = /srv/samba/Data/
   read only = no
⚠ อย่าใส่ share parameter อื่นเพิ่ม

ตามเอกสาร Samba เมื่อคุมสิทธิ์ด้วย Windows ACLs ให้ตั้ง share สั้น ๆ แค่นี้ อย่าเพิ่ม valid users/force user ฯลฯ เพราะจะไปตีกับ ACL

Step 3 — สร้างโฟลเดอร์ + ตั้งเจ้าของเริ่มต้น

$ sudo mkdir -p /srv/samba/Data/
$ sudo chown root:"Domain Admins" /srv/samba/Data/
$ sudo chmod 0770 /srv/samba/Data/
💡 กลุ่มเจ้าของ

ใช้ "Domain Admins" ตามปกติ (ถ้าใช้ idmap backend เป็น ad เอกสารจะใช้ "Unix Admins" แทน)

Step 4 — Reload Samba

$ sudo smbcontrol all reload-config

Step 5 — ตั้งสิทธิ์ (ACL) จาก Windows

5.1
Login เครื่อง Windows ด้วย AD\Administrator
5.2
เปิด Computer Management → System Tools → Shared Folders → Shares
5.3
คลิกขวา share DataProperties → แท็บ Security → ปุ่ม Edit / Add เพื่อเพิ่มกลุ่ม/ผู้ใช้ AD แล้วกำหนดสิทธิ์ (Read/Modify/Full)

Step 6 — ทดสอบ

# จาก Windows: เปิด Explorer พิมพ์  \\member01\Data
# จาก Linux:
$ smbclient -L member01 -U 'AD\somchai'
$ smbclient //member01/Data -U 'AD\somchai'
client — smbclient john@client:~$ smbclient -L member01 -U 'AD\somchai' Sharename Type Comment --------- ---- ------- Data Disk AD file share
ตัวอย่างผลลัพธ์เห็น share Data และเข้าถึงได้ด้วย user จาก AD

ทางเลือกง่าย — คุมสิทธิ์ด้วย valid users (POSIX)

ถ้าไม่อยากตั้ง ACL จาก Windows คุมสิทธิ์ใน smb.conf ตรง ๆ ด้วยกลุ่ม AD ก็ได้ (ง่ายกว่าแต่ยืดหยุ่นน้อยกว่า)

[Data]
   path = /srv/samba/Data
   read only = no
   valid users = @"AD\Domain Users"     # ใครเข้าได้บ้าง
   write list = @"AD\IT"                # กลุ่มที่เขียนได้
✦ จบบทที่ 2 · File Server
บทที่ 3 · ภาพรวม

03ภาพรวมระบบ End-to-End (DC ↔ Client ↔ File Share ↔ GPO)

เห็นภาพรวมทั้งระบบในหน้าเดียว — DC เป็นศูนย์กลาง, client ยืนยันตัวตน, รับ GPO, และเข้าถึงไฟล์แชร์ พร้อม checklist ทำตามทั้งระบบ

ArchitectureEnd-to-End
Samba AD DC — End-to-End Architecture dc01 · Domain Controller 192.168.64.85 · ad.ittraining.local LDAP 389 · Kerberos 88 · DNS 53 · SMB 445 SYSVOL = ที่เก็บ GPO (Group Policy) รวมทุกบริการ AD ไว้ในเครื่องเดียว ① ยืนยันตัวตน: DNS 53 → Kerberos 88 → LDAP 389 ② GPO (SYSVOL) 🪟 Windows Client join domain (เรื่อง 2 · บท 3) รับ GPO → แมป H:\ S:\ P:\ auth ผ่าน Kerberos 🗄️ File Server (member) Samba domain member (winbind) share \\member\Data + ACL AD user เข้าถึงไฟล์ 🐧 Linux Client realmd/SSSD หรือ winbind login ด้วย AD user (บท 4-5) id user@domain ③ เข้าถึงไฟล์ผ่าน SMB 445 → \\member\Data
แผนภาพระบบDC เป็นศูนย์กลาง — client ยืนยันตัวตน (①), รับ GPO (②), และเข้าถึงไฟล์แชร์ (③)

อ่าน Diagram นี้ยังไง

  • dc01 (สีส้ม) = ศูนย์กลาง รวม LDAP + Kerberos + DNS + SMB และเก็บ GPO ไว้ใน SYSVOL
  • Windows Client (สีน้ำเงิน) = join domain แล้วรับ GPO (เช่นแมปไดรฟ์) และยืนยันตัวตนผ่าน Kerberos
  • File Server (สีเขียวน้ำเงิน) = เครื่อง Samba domain member ที่แชร์ไฟล์ให้ AD user เข้าถึง
  • Linux Client (สีเขียว) = join ด้วย realmd/SSSD หรือ winbind แล้ว login ด้วย user จาก AD

3 เส้นทางหลักในระบบ

เส้นทางทำอะไรโปรโตคอล/พอร์ตบทที่เกี่ยวข้อง
① Authclient ยืนยันตัวตนกับ DCDNS 53 → Kerberos 88 → LDAP 389เรื่อง 2 · บท 3-5
② GPODC ส่งนโยบายให้ client (แมปไดรฟ์)SMB 445 (SYSVOL)เรื่อง 4 · บท 1
③ File accessclient เข้าถึง share บน File ServerSMB 445เรื่อง 4 · บท 2

ทำตามทั้งระบบ (End-to-End Checklist)

ลำดับการสร้างทั้งระบบ พร้อมคำสั่งหลักของแต่ละขั้น

1
ติดตั้ง DC (เรื่อง 1)
$ sudo samba-tool domain provision --realm=AD.ITTRAINING.LOCAL \
    --domain=AD --server-role=dc --dns-backend=SAMBA_INTERNAL
2
สร้าง OU และ user (เรื่อง 3)
$ sudo samba-tool ou create "OU=IT,DC=ad,DC=ittraining,DC=local"
$ sudo samba-tool user create somchai 'P##ssw00rd' --use-username-as-cn
3
Join Windows client (เรื่อง 2 · บท 3)
PS> Add-Computer -DomainName ad.ittraining.local -Credential AD\Administrator -Restart
4
Join Linux client (เรื่อง 2 · บท 4)
$ sudo realm join -U administrator ad.ittraining.local
5
ตั้ง File Server (เรื่อง 4 · บท 2)
$ sudo net ads join -U administrator          # join เป็น member
$ sudo smbcontrol all reload-config           # โหลด share ใหม่
6
สร้าง GPO แมปไดรฟ์ (เรื่อง 4 · บท 1)
$ sudo samba-tool gpo create "Map Drives" -U Administrator
# แล้วแก้ไข Drive Maps ผ่าน GPMC บน Windows
7
ทดสอบจาก client
PS> gpupdate /force        # ดึง GPO
PS> net use               # เห็นไดรฟ์ที่ถูกแมป
# เปิด \\member01\Data ทดสอบเข้าถึง share

คำสั่งสำคัญของแต่ละส่วน (อธิบาย)

ส่วนคำสั่งหน้าที่
DCsamba-tool domain provisionสร้าง Domain Controller (LDAP/Kerberos/DNS/SMB)
DCsamba-tool user / group / ouจัดการ user, group, OU ใน AD
DCsamba-tool gpoสร้าง/ผูก/ดู GPO
WindowsAdd-Computer / gpupdate /forcejoin domain / ดึง GPO ใหม่
Linuxrealm join / id user@domainjoin domain / ตรวจว่าเห็น AD user
File Servernet ads join / wbinfo -ujoin เป็น member / ตรวจ user จาก AD
ทุกเครื่อง (client)host -t SRV _ldap._tcp.ad.ittraining.localตรวจว่าหา DC ผ่าน DNS เจอ (ต้องตั้ง DNS = DC ก่อน)
⚠ กฎเหล็กที่ทุกส่วนต้องมี

ทุก client/server ต้องตั้ง DNS ชี้ที่ DC (192.168.64.85) ก่อนเสมอ — ไม่งั้นทั้ง auth, GPO และ file share จะหา DC ไม่เจอ

✦ จบบทที่ 3 · จบเรื่อง GPO & File Sharing
IT Training Co., Ltd.
Linux Advanced Workshop · Samba AD DC บน Ubuntu Server 26.04 · ittraining.co.th