การรัน Samba ( Active Directory ) บน Mac M Series ( M1 /M2 / M3 ) ผ่าน Docker เป็นทางเลือกในการพัฒนาโปรแกรมที่ใช้ login โดย Active Directory Domain Controller ( AD ) ที่จริง ๆ แล้วเป็นระบบใน Windows Server
การสร้าง Docker container เพื่อ run Samba ( Active Directory )
- สร้าง folder เก็บข้อมูลก่อน โดยคำสั่ง
mkdir -p /Users/Shared/Portable/ad-samba-m - ไปที่ folder
cd /Users/Shared/Portable/ad-samba-m - สร้างไฟล์
touch docker-compose.yml - ใส่เนื้อหา
services: ad-samba-m: build: . cap_add: - SYS_ADMIN # Required for Samba AD DC container_name: ad-samba-m-dev dns: - 127.0.0.1 environment: - SAMBA_ADMIN_PASSWORD=Uv6VUzP3e6xe - SAMBA_DNS_FORWARDER=8.8.8.8 - SAMBA_DOMAIN=phunsanit - SAMBA_REALM=PHUNSANIT.LOCAL ports: - "135:135" # RPC - "139:139" # NetBIOS - "3268:3268" # GC - "3269:3269" # GC SSL - "389:389" # LDAP TCP - "389:389/udp" # LDAP UDP - "445:445" # SMB - "464:464" # Kerberos Change Pwd TCP - "464:464/udp" # Kerberos Change Pwd UDP - "53:53" # DNS TCP - "53:53/udp" # DNS UDP - "636:636" # LDAPS - "88:88" # Kerberos TCP - "88:88/udp" # Kerberos UDP restart: unless-stopped volumes: - data:/var/lib/samba - ./config:/etc/samba volumes: data: name: ad-samba-dataSAMBA_ADMIN_PASSWORD=Uv6VUzP3e6xe- คืออะไร: รหัสผ่านของ User
Administratorของโดเมน - ความสำคัญ: คุณต้องใช้รหัสนี้ในการ Login ผ่านเครื่องมือจัดการ AD ( เช่น RSAT ) หรือใช้ในการ Join Domain ของเครื่อง Client อื่น ๆ
- Security: เนื่องจากรหัสนี้อยู่ในไฟล์
docker-compose.ymlอย่าลืมระวังเรื่องการเผลอ Push ไฟล์นี้ขึ้น Public Repo นะครับ
- คืออะไร: รหัสผ่านของ User
SAMBA_DNS_FORWARDER=8.8.8.8- คืออะไร: คือการบอกให้ Samba AD (ซึ่งทำหน้าที่เป็น DNS Server ในตัว) ว่า “ถ้าหาชื่อเว็บหรือ Domain ไหนไม่เจอ ให้ไปถามใครต่อ”
- ทำไมต้องมี: เมื่อคุณตั้งให้เครื่อง Client ( หรือแอป ) มาชี้ DNS ที่ Container นี้เพื่อให้รู้จัก
phunsanit.localถ้าแอปนั้นอยากจะออกไป Google (google.com) ตัว Samba จะไม่รู้จัก มันจึงต้อง “ส่งต่อ” (Forward) คำถามนั้นไปที่8.8.8.8( Google DNS ) เพื่อให้แอปยังใช้งานอินเทอร์เน็ตได้ปกตินั่นเองครับ
SAMBA_DOMAIN=phunsanit- ชื่อโดเมน (
phunsanit) มักจะใส่ในตัวแปรชื่อDOMAINหรือSAMBA_DOMAIN( ขึ้นอยู่กับ Image ที่เลือกใช้ )
- ชื่อโดเมน (
SAMBA_REALM=PHUNSANIT.LOCAL- คืออะไร: คือชื่อ Kerberos Realm ( มักเป็นตัวพิมพ์ใหญ่ทั้งหมด )
- ความสำคัญ: ในโลกของ AD ตัว Realm คือชื่อโดเมนในระดับ Authentication ครับ มันจะใช้ร่วมกับชื่อ User เช่น
[email protected] - Tip: ปกติควรตั้งให้ตรงกับ Domain Name ของคุณแต่เป็นตัวพิมพ์ใหญ่ครับ
- สร้างไฟล์ ( Updated Logic )
touch entrypoint.sh - ใส่เนื้อหา
#!/bin/bash set -e # Define variables DOMAIN=${SAMBA_DOMAIN:-SAMDOM} REALM=${SAMBA_REALM:-SAMDOM.EXAMPLE.COM} ADMIN_PASSWORD=${SAMBA_ADMIN_PASSWORD:-Password123!} DNS_FORWARDER=${SAMBA_DNS_FORWARDER:-8.8.8.8} # Check if Samba is already provisioned # Check if Samba is already provisioned if [[ ! -f /etc/samba/smb.conf ]] || [[ ! -f /var/lib/samba/private/sam.ldb ]]; then echo "Provisioning Samba AD DC..." # Remove default smb.conf if it exists rm -f /etc/samba/smb.conf # Provision the domain samba-tool domain provision \ --server-role=dc \ --use-rfc2307 \ --dns-backend=SAMBA_INTERNAL \ --realm="$REALM" \ --domain="$DOMAIN" \ --adminpass="$ADMIN_PASSWORD" \ --option="dns forwarder = $DNS_FORWARDER" # Copy kerberos config if [ -f /var/lib/samba/private/krb5.conf ]; then cp /var/lib/samba/private/krb5.conf /etc/krb5.conf fi # --- Add Sample Users --- echo "Creating sample users..." # Function to create user if not exists create_user() { local username="$1" local password="$2" samba-tool user create "$username" "$password" || true # Ignore error if exists echo "Created user: $username" } # Add users (Username Password) create_user "phunsait" "Password123!" create_user "pitt.p" "Password123!" create_user "plusmagi" "Password123!" echo "Samba AD DC provisioned successfully with sample users." else echo "Samba AD DC already provisioned." fi # Start Samba exec samba -i -M standard - ติดตั้งและรัน
docker compose up -d
การทดสอบ
docker logs -f ad-samba-m-dev
การเพิ่ม Users ( User Management )
ระบบมี Script สำหรับเพิ่ม Sample Users ให้รันคำสั่งนี้ใน Host
docker exec -it ad-samba-m-dev samba-tool user create username password123
อ่านเพิ่มเติม
About the author