Tag Archive Active Directory Domain Controller

Byphunsanit

Docker: Samba as an Active Directory Domain Controller

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


การสร้าง Docker container เพื่อ run Samba ( Active Directory )

  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 ( เช่น RSAT ) หรือใช้ในการ 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 ( 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 ของคุณแต่เป็นตัวพิมพ์ใหญ่ครับ
  5. สร้างไฟล์ ( Updated Logic )
    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 ( User Management )

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

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


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