หมวดหมู่: Docker

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


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