ตั้ง Active Directory Domain Controller ด้วย Samba 4 บน Ubuntu 16.04

นอกจากจะคอนฟิกแชร์ไฟล์ให้เครื่องอื่นที่รัน Windows สามารถเข้ามา Map Drive เพื่อเก็บไฟล์ไว้บนเซิร์ฟเวอร์ลีนุกซ์ได้แล้ว

Samba 4 ยังสามารถคอนฟิกให้เป็น Active Directory Domain Controller เพื่อควบคุมสิทธิ์ เช่นเก็บ Username, Password สำหรับการล็อกอินก่อนใช้งานเครื่อง Windows ที่เป็นสมาชิก (member) ของ Domain ได้

ลองมาดูวิธีการติดตั้งและคอนฟิกกัน

เนื่องจากปัญหาเรื่องแพ็คเกจใน Yum repo ของทั้ง CentOS 6 และ CentOS 7 ซึ่งยังไม่มีแพ็คเกจ rpm อย่างเป็นทางการ ในการคอนฟิกเป็น Domain Controller ในที่นี้จะขอเปลี่ยนมาใช้ Ubuntu 16.04

ชุดซอฟต์แวร์ที่เลือกตอนติดตั้ง Ubuntu 16.04

[*] standard system utilities
[*] OpenSSH server

ตอนติดตั้ง Ubuntu แนะนำให้ใส่ชื่อ hostname แบบเต็ม คือมีทั้งชื่อเครื่องและชื่อโดเมนเนม เราจะใช้ชื่อนี้ในการคอนฟิก Kerberos และ Samba

ข้อมูลเครื่องที่ใช้ในการทดลองติดตั้ง Samba 4

admin@samba4:~$ hostnamectl
   Static hostname: samba4.example.com
         Icon name: computer-vm
           Chassis: vm
        Machine ID: ...
           Boot ID: ...
  Operating System: Ubuntu 16.04.1 LTS
            Kernel: Linux 4.4.0-38-generic
      Architecture: x86-64

IP ของเครื่องเซิร์ฟเวอร์คือ 192.168.56.16

ทดลอง ping ชื่อ hostname ต้อง ping ได้

admin@samba4:~$ ping samba4.example.com
PING samba4.example.com (127.0.1.1) 56(84) bytes of data.
64 bytes from samba4.example.com (127.0.1.1): icmp_seq=1 ttl=64 time=0.015 ms
64 bytes from samba4.example.com (127.0.1.1): icmp_seq=2 ttl=64 time=0.021 ms
64 bytes from samba4.example.com (127.0.1.1): icmp_seq=3 ttl=64 time=0.020 ms
^C

กด [Ctrl]+[c] เพื่อยกเลิกการ ping

ติดตั้งแพ็คเกจ samba

ใช้คำสั่ง apt install เพื่อติดตั้งแพ็คเกจ samba krb5-config winbind

admin@ubuntu:~$ sudo apt install samba krb5-config winbind

ติดตั้งไปสักพัก จะมีหน้าจอคอนฟิก Kerberos Authentication ขึ้นมา

คอนฟิกชื่อ realm ของ Kerberos ให้ใส่ชื่อโดเมนเนมของเครื่อง แต่พิมพ์เป็นตัวพิมพ์ใหญ่ เช่นในเครื่องที่กำลังคอนฟิกนี้ชื่อโดเมนเนมคือ example.com ก็ให้ใส่ชื่อ Realm เป็น EXAMPLE.COM

┌──────────────────┤ Configuring Kerberos Authentication ├─
│ When users attempt to use Kerberos and specify a principal or
│ without specifying what administrative Kerberos realm that 
│ belongs to, the system appends the default realm. The default 
│ also be used as the realm of a Kerberos service running on the 
│ machine. Often, the default realm is the uppercase version of 
│ DNS domain.
│
│ Default Kerberos version 5 realm:
│
│ EXAMPLE.COM___________________________________________________
│ 
│                                 <Ok> 
│ 
└────────────────────────────────────────────────────

ใส่ชื่อเซิร์ฟเวอร์ของ Kerberos ในที่นี้ Kerberos รันอยู่บนเครื่องเดียวกัน ก็ให้ใส่ชื่อเครื่องลงไป

┌────────────────┤ Configuring Kerberos Authentication ├─
│ Enter the hostnames of Kerberos servers in the EXAMPLE.COM 
│ realm separated by spaces. 
│ 
│ Kerberos servers for your realm: 
│ 
│ samba4.example.com__________________________________________
│ 
│                                  <Ok> 
│ 
└───────────────────────────────────────────────────

ใส่ชื่อเครื่อง (hostname) ของเซิร์ฟเวอร์ ที่ใช้ในการบริหารจัดการ Kerberos (เช่นการเปลี่ยนรหัสผ่าน)

┌──────────────────┤ Configuring Kerberos Authentication ├─
│ Enter the hostname of the administrative (password changing) 
│ the EXAMPLE.COM Kerberos realm. 
│ 
│ Administrative server for your Kerberos realm: 
│ 
│ samba4.example.com___________________________________________
│ 
│                                   <Ok>
│ 
└────────────────────────────────────────────────────

หลังจาก apt ติดตั้งแพ็คเกจแล้วเสร็จ ให้ย้ายไฟล์ smb.conf เดิมไปเป็นชื่ออื่น เช่น smb.conf.org เพราะเราจะใช้คำสั่ง samba-tool ในการสร้างคอนฟิกไฟล์ใหม่

admin@ubuntu:~$ sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.org

รันคำสั่ง samba-tool เพื่อสร้างไฟล์ smb.conf ขึ้นมาใหม่ ค่าที่ใส่โดยดีฟอลต์จะอยู่ในวงเล็บสี่เหลี่ยม [] โดยส่วนใหญ่สามารถกดปุ่ม [Enter] ผ่านไปได้เลย

admin@ubuntu:~$ sudo samba-tool domain provision
Realm [EXAMPLE.COM]:
 Domain [EXAMPLE]:
 Server Role (dc, member, standalone) [dc]:
 DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]:
 DNS forwarder IP address (write 'none' to disable forwarding) [192.168.56.1]:
Administrator password: # ใส่รหัสผ่าน Administrator ของ AD Domain
Retype password:        # ใส่รหัสผ่านอีกครั้ง
Looking up IPv4 addresses
More than one IPv4 address found. Using 192.168.56.16
Looking up IPv6 addresses
No IPv6 address will be assigned
Setting up secrets.ldb
Setting up the registry
Setting up the privileges database
Setting up idmap db
Setting up SAM db
Setting up sam.ldb partitions and settings
Setting up sam.ldb rootDSE
Pre-loading the Samba 4 and AD schema
Adding DomainDN: DC=example,DC=com
Adding configuration container
Setting up sam.ldb schema
Setting up sam.ldb configuration data
Setting up display specifiers
Modifying display specifiers
Adding users container
Modifying users container
Adding computers container
Modifying computers container
Setting up sam.ldb data
Setting up well known security principals
Setting up sam.ldb users and groups
Setting up self join
Adding DNS accounts
Creating CN=MicrosoftDNS,CN=System,DC=example,DC=com
Creating DomainDnsZones and ForestDnsZones partitions
Populating DomainDnsZones and ForestDnsZones partitions
Setting up sam.ldb rootDSE marking as synchronized
Fixing provision GUIDs
A Kerberos configuration suitable for Samba 4 has been generated at /var/lib/samba/private/krb5.conf
Once the above files are installed, your Samba4 server will be ready to use
Server Role:       active directory domain controller
Hostname:          samba4
NetBIOS Domain:    EXAMPLE
DNS Domain:        example.com
DOMAIN SID:        S-1-5-21-...-...-...

หมายเหตุ หากตอนรัน samba-tool แล้วขึ้นข้อความ error แบบด้านล่างนี้ แปลว่าคุณใส่รหัสผ่านของ Administrator ง่ายเกินไป ไม่เป็นไปตามเงื่อนไขขั้นต่ำที่ตั้งไว้ ให้รันคำสั่ง samba-tool อีกครั้งแต่ระบุรหัสผ่านให้ยากขึ้น

ERROR(ldb): uncaught exception - 0000052D: Constraint violation - check_password_restrictions: the password does not meet the complexity criteria!
 File "/usr/lib/python2.7/dist-packages/samba/netcmd/__init__.py", line 175, in _run
 return self.run(*args, **kwargs)
 File "/usr/lib/python2.7/dist-packages/samba/netcmd/domain.py", line 442, in run
 nosync=ldap_backend_nosync, ldap_dryrun_mode=ldap_dryrun_mode)
 File "/usr/lib/python2.7/dist-packages/samba/provision/__init__.py", line 2172, in provision
 skip_sysvolacl=skip_sysvolacl)
 File "/usr/lib/python2.7/dist-packages/samba/provision/__init__.py", line 1795, in provision_fill
 next_rid=next_rid, dc_rid=dc_rid)
 File "/usr/lib/python2.7/dist-packages/samba/provision/__init__.py", line 1453, in fill_samdb
 "KRBTGTPASS_B64": b64encode(krbtgtpass.encode('utf-16-le'))
 File "/usr/lib/python2.7/dist-packages/samba/provision/common.py", line 55, in setup_add_ldif
 ldb.add_ldif(data, controls)
 File "/usr/lib/python2.7/dist-packages/samba/__init__.py", line 225, in add_ldif
 self.add(msg, controls)

copy ไฟล์ krb5.conf ไปไว้ใน /etc

admin@ubuntu:~$ sudo cp /var/lib/samba/private/krb5.conf /etc

ใช้คำสั่ง systemctl restart เพื่อรีสตาร์ตเซอร์วิส smbd และ samba-ad-dc

admin@ubuntu:~$ sudo systemctl restart smbd samba-ad-dc

ใช้คำสั่ง samba-tool ระบุออปชัน domain level show เพื่อแสดงสถานะของ Domain Controller

admin@ubuntu:~$ sudo samba-tool domain level show
Domain and forest function level for domain 'DC=example,DC=com'

Forest function level: (Windows) 2008 R2
Domain function level: (Windows) 2008 R2
Lowest function level of a DC: (Windows) 2008 R2

ตัวอย่างโปรเซสของ Samba 4 ที่คอนฟิกรันเป็น Active Directory Domain Controlller

admin@ubuntu:~$ ps -ef
UID    PID  PPID  C STIME TTY   TIME CMD
...
root  8442     1  0 11:21 ? 00:00:00 /usr/sbin/nmbd -D
root  8585     1  0 11:21 ? 00:00:00 /usr/sbin/winbindd
root  8588  8585  0 11:21 ? 00:00:00 /usr/sbin/winbindd
root  8826  8585  0 11:27 ? 00:00:00 /usr/sbin/winbindd
root  8827  8585  0 11:27 ? 00:00:00 /usr/sbin/winbindd
root  8946     1  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8947  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8948  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8949  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8950  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8951  8946 13 11:30 ? 00:00:02 /usr/sbin/samba -D
root  8952  8947  0 11:30 ? 00:00:00 /usr/sbin/smbd -D --option=serve
root  8953  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8954  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8955  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8957  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8959  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8960  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8961  8946  0 11:30 ? 00:00:00 /usr/sbin/samba -D
root  8965  8952  0 11:30 ? 00:00:00 /usr/sbin/smbd -D --option=serve
root  8967  8952  0 11:30 ? 00:00:00 /usr/sbin/smbd -D --option=serve

เพิ่ม user ใน Active Directory

ใช้คำสั่ง samba-tool user add ระบุชื่อ username ที่ต้องการเพิ่ม

admin@ubuntu:~$ sudo samba-tool user add alice
New Password:
Retype Password:
ERROR(ldb): Failed to add user 'alice': - 0000052D: Constraint violation - check_password_restrictions: the password does not meet the complexity criteria!

หากขึ้นข้อความ error แบบด้านบน แสดงว่าตั้งรหัสผ่าน (password) ง่ายเกินไป ต้องรันคำสั่งใหม่ แล้วระบุรหัสให้ยากขึ้น

admin@ubuntu:~$ sudo samba-tool user add alice
New Password:
Retype Password:
User 'alice' created successfully

คอนฟิก Windows 7 ให้เข้าเป็นสมาชิก (join) Domain

แก้ไข DNS server ของเครื่อง Windows 7 ให้ชี้มาที่ IP ของเซิรฟ์เวอร์ที่รัน Samba 4

s01-change-dns

คลิกขวาที่ไอคอน Computer แล้วเลือก Properties หรือเข้าเมนู Control Panel -> System and Security -> System

คลิก (1) Change settings แล้วคลิกปุ่ม (2) Change แล้วเลือก (3) Member of เป็น Domain ใส่ชื่อโดเมนเป็น EXAMPLE.COM แล้วกดปุ่ม OK

s02-change-domain

ใส่ Administrator และรหัสผ่านที่ตั้งไว้ตอนรันคำสั่ง samba-tool domain provision

s03-enter-administrative-password

หากใส่ถูกต้องจะขึ้นข้อความ Welcome to the EXAMPLE.COM domain

s04-welcome-to-the-domain

กดปุ่ม OK จะมีข้อความขึ้นให้รีสตาร์ตเครื่อง กดปุ่ม OK เพื่อรีสตาร์ต

s05-restart

หน้าจอ Windows 7 หลังจากเป็นสมาชิก Domain

s06-press-ctrl-alt-delete-to-log-on

กดปุ่ม [Ctrl] + [Alt] + [Delete] เพื่อเข้าสู่หน้าจอ Log on

หากไม่เคย Log on เข้า Domain มาก่อน จะขึ้นหน้าจอให้ล็อกเข้าเครื่องตัวเอง (ชื่อเครื่อง WIN7)

ต้องกดปุ่ม Switch User

s07-switch-user

ใส่ Username และ Password ที่สร้างไว้ด้วยคำสั่ง samba-tool user add

s08-log-on-to-domain

หากใส่ถูกต้อง ก็สามารถล็อกอินเข้าเครื่องได้

s09-preparing-your-desktop

ตัวอย่างข้อมูล Domain ที่เครื่อง Windows 7 เป็นสมาชิกอยู่

s10-domain

ลองไปคอนฟิกกันดูนะครับ แต่แนะนำให้ทดสอบในเครือข่าย (network) แยกต่างหากจากระบที่ใช้งานอยู่ เพราะอาจมีปัญหาเรื่อง NetBIOS Domain

ได้ผลลัพธ์หรือติดปัญหาอะไรสามารถโพสต์ถามได้นะครับ

ข้อมูลอ้างอิง

Leave a Reply

Your email address will not be published.