วัน: 20 พฤษภาคม 2023

Docker: Samba as an Active Directory Domain ControllerDocker: Samba as an Active Directory Domain Controller

การรัน Samba บน Mac M Series ผ่าน Docker เป็นทางเลือกในการพัฒนาโปรแกรมที่ใช้ login โดย Active Directory Domain Controller ที่จริง ๆ แล้วเป็นระบบใน Windows Server


การสร้าง Docker container เพื่อ run Samba

  1. สร้าง folder เก็บข้อมูลก่อน โดยคำสั่ง
    mkdir -p /Users/Shared/Portable/ad-samba-m
  2. ไปที่ folder
    cd /Users/Shared/Portable/ad-samba-m
  3. สร้างไฟล์
    touch docker-compose.yml
  4. ใส่เนื้อหา
    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-data
    
    • SAMBA_ADMIN_PASSWORD=Uv6VUzP3e6xe
      • คืออะไร: รหัสผ่านของ User Administrator ของโดเมน
      • ความสำคัญ: คุณต้องใช้รหัสนี้ในการ Login ผ่านเครื่องมือจัดการ AD หรือใช้ในการ Join Domain ของเครื่อง Client อื่น ๆ
      • Security: เนื่องจากรหัสนี้อยู่ในไฟล์ docker-compose.yml อย่าลืมระวังเรื่องการเผลอ Push ไฟล์นี้ขึ้น Public Repo นะครับ
    • SAMBA_DNS_FORWARDER=8.8.8.8
      • คืออะไร: คือการบอกให้ Samba AD (ซึ่งทำหน้าที่เป็น DNS Server ในตัว) ว่า “ถ้าหาชื่อเว็บหรือ Domain ไหนไม่เจอ ให้ไปถามใครต่อ”
      • ทำไมต้องมี: เมื่อคุณตั้งให้เครื่อง Client มาชี้ DNS ที่ Container นี้เพื่อให้รู้จัก phunsanit.local ถ้าแอปนั้นอยากจะออกไป Google ตัว Samba จะไม่รู้จัก มันจึงต้อง “ส่งต่อ” (Forward) คำถามนั้นไปที่ 8.8.8.8 เพื่อให้แอปยังใช้งานอินเทอร์เน็ตได้ปกตินั่นเองครับ
    • SAMBA_DOMAIN=phunsanit
      • ชื่อโดเมน มักจะใส่ในตัวแปรชื่อ DOMAIN หรือ SAMBA_DOMAIN
    • SAMBA_REALM=PHUNSANIT.LOCAL
      • คืออะไร: คือชื่อ Kerberos Realm
      • ความสำคัญ: ในโลกของ AD ตัว Realm คือชื่อโดเมนในระดับ Authentication ครับ มันจะใช้ร่วมกับชื่อ User เช่น [email protected]
      • Tip: ปกติควรตั้งให้ตรงกับ Domain Name ของคุณแต่เป็นตัวพิมพ์ใหญ่ครับ
  5. สร้างไฟล์
    touch entrypoint.sh
  6. ใส่เนื้อหา
    #!/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
    
  7. ติดตั้งและรัน
    docker compose up -d

การทดสอบ

docker logs -f ad-samba-m-dev


การเพิ่ม Users

ระบบมี Script สำหรับเพิ่ม Sample Users ให้รันคำสั่งนี้ใน Host

docker exec -it ad-samba-m-dev samba-tool user create username password123


อ่านเพิ่มเติม