วันอังคารที่ 10 พฤศจิกายน พ.ศ. 2569

Ubuntu - Keycloak

 

คู่มือการติดตั้ง Keycloak SSO บน Ubuntu Server 24.04 LTS

เชื่อมต่อ Microsoft Active Directory พร้อมระบบ Two-Factor Authentication (2FA)

เอกสาร: Installation & Configuration Guide
ระบบ: Keycloak Identity and Access Management
Operating System: Ubuntu Server 24.04 LTS
Database: PostgreSQL
Directory Service: Microsoft Active Directory
Authentication: SSO + MFA / 2FA
สถานะ: Draft สำหรับนำไปติดตั้งจริง


1. วัตถุประสงค์

เอกสารฉบับนี้จัดทำขึ้นเพื่อกำหนดขั้นตอนการติดตั้งระบบ Single Sign-On (SSO) ด้วย Keycloak บน Ubuntu Server 24.04 LTS โดยเชื่อมต่อกับ Microsoft Active Directory เพื่อใช้เป็นศูนย์กลางในการ Authentication ของผู้ใช้งานภายในองค์กร

ระบบจะรองรับความสามารถดังต่อไปนี้

  1. Single Sign-On (SSO)
  2. Active Directory / LDAP Integration
  3. Two-Factor Authentication (2FA)
  4. Multi-Factor Authentication (MFA)
  5. OpenID Connect (OIDC)
  6. SAML 2.0
  7. User and Group Management
  8. Centralized Authentication
  9. Role-Based Access Control (RBAC)

2. System Architecture

2.1 ภาพรวมระบบ

Microsoft Active Directory จะทำหน้าที่เป็นแหล่งข้อมูลบัญชีผู้ใช้งานหลัก ส่วน Keycloak จะทำหน้าที่เป็น Identity Provider (IdP) สำหรับตรวจสอบตัวตนและจัดการการเข้าสู่ระบบ

โครงสร้างการทำงาน:

Microsoft Active Directory
↓ LDAPS (TCP 636)
Keycloak SSO Server
↓
2FA Verification
↓
OIDC / SAML 2.0
↓
ERP / Web Application / VPN / Internal Systems

2.2 ข้อมูล Server (ตัวอย่าง)


รายการค่า
Operating SystemUbuntu Server 24.04
Hostnamesso.example.com
IP Address192.168.1.20
CPU4 vCPU
RAM8 GB
Storage50 GB
Keycloak26.x (กำหนดรุ่นที่ผ่านการทดสอบ)
DatabasePostgreSQL
Web ServerNginx
AD Server192.168.1.10
LDAP Port636

หมายเหตุ: IP Address และ Domain เป็นตัวอย่าง ให้เปลี่ยนตามสภาพแวดล้อมจริง

3. Prerequisites

ก่อนเริ่มติดตั้งต้องเตรียมข้อมูลดังต่อไปนี้

  • Ubuntu Server 24.04 LTS
  • สิทธิ์ sudo
  • Static IP Address
  • DNS Record สำหรับ sso.example.com
  • Microsoft Active Directory ที่สามารถเข้าถึงจาก Keycloak Server
  • Service Account สำหรับ LDAP Bind
  • CA Certificate สำหรับตรวจสอบ LDAPS Certificate
  • SSL Certificate สำหรับ HTTPS

3.1 Firewall Ports

PortProtocolวัตถุประสงค์
443TCPHTTPS / SSO
80TCPHTTP Redirect / Let's Encrypt
636TCPLDAPS
389TCPLDAP (ไม่แนะนำสำหรับ Production)
5432TCPPostgreSQL (Internal Only)
8080TCPKeycloak Internal Only

ไม่ควรเปิด PostgreSQL และ Keycloak Management Interface ให้เข้าถึงจาก Internet โดยตรง

4. ติดตั้ง Ubuntu และ Docker

4.1 Update Ubuntu

sudo apt update
sudo apt upgrade -y
sudo apt install -y curl wget vim \
  ca-certificates gnupg ufw

4.2 ติดตั้ง Docker


sudo apt install -y docker.io docker-compose-v2

sudo systemctl enable docker
sudo systemctl start docker

docker --version
docker compose version

4.3 ตั้งค่า Time Synchronization


sudo timedatectl set-timezone Asia/Bangkok
sudo timedatectl set-ntp true

timedatectl status

การตั้งเวลาให้ตรงกันมีความสำคัญต่อการตรวจสอบ TOTP และการทำงานของระบบ Authentication

5. ติดตั้ง Keycloak และ PostgreSQL

5.1 สร้าง Directory


sudo mkdir -p /opt/keycloak
sudo chown -R $USER:$USER /opt/keycloak

cd /opt/keycloak

5.2 สร้างไฟล์ Environment

สร้างไฟล์ .env

sudo vi .env

กำหนดค่าตัวอย่าง:

env
KEYCLOAK_VERSION=26.8.0

POSTGRES_DB=keycloak
POSTGRES_USER=keycloak
POSTGRES_PASSWORD=CHANGE_TO_STRONG_PASSWORD

KC_BOOTSTRAP_ADMIN_USERNAME=kcadmin
KC_BOOTSTRAP_ADMIN_PASSWORD=CHANGE_TO_STRONG_ADMIN_PASSWORD

เปลี่ยน Password ทุกค่าก่อนนำไปใช้งานจริง และห้ามนำไฟล์นี้ขึ้น Git Repository

sudo chmod 600 .env

หมายเหตุ: ให้ตรวจสอบรุ่น Keycloak ที่ต้องการใช้งานและ Compatibility ก่อน Deploy จริง โดยควร Pin รุ่นที่ผ่านการทดสอบ ไม่ใช้ tag latest

5.3 สร้าง Docker Compose

สร้างไฟล์:

sudo vi docker-compose.yml

กำหนดค่า:

yaml
services:

  postgres:
    image: postgres:16
    container_name: keycloak-db
    restart: unless-stopped

    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

    volumes:
      - postgres_data:/var/lib/postgresql/data

    networks:
      - keycloak-network

  keycloak:
    image: quay.io/keycloak/keycloak:${KEYCLOAK_VERSION}

    container_name: keycloak
    restart: unless-stopped

    command:
      - start
      - --db=postgres
      - --hostname=https://sso.example.com
      - --http-enabled=true
      - --proxy-headers=xforwarded

    environment:
      KC_DB: postgres
      KC_DB_URL_HOST: postgres
      KC_DB_URL_DATABASE: ${POSTGRES_DB}
      KC_DB_USERNAME: ${POSTGRES_USER}
      KC_DB_PASSWORD: ${POSTGRES_PASSWORD}

      KC_BOOTSTRAP_ADMIN_USERNAME: ${KC_BOOTSTRAP_ADMIN_USERNAME}
      KC_BOOTSTRAP_ADMIN_PASSWORD: ${KC_BOOTSTRAP_ADMIN_PASSWORD}

    ports:
      - "127.0.0.1:8080:8080"

    depends_on:
      - postgres

    networks:
      - keycloak-network

volumes:
  postgres_data:

networks:
  keycloak-network:
    driver: bridge

สำหรับ Production ต้องตั้งค่า HTTPS ที่ Reverse Proxy ให้ถูกต้อง พร้อมกำหนด hostname และ trusted proxy ตามสภาพแวดล้อมจริง

5.4 Start Services

sudo docker compose pull

sudo docker compose up -d

sudo docker compose ps

ตรวจสอบ Log:

sudo docker compose logs -f keycloak

ทดสอบการเข้าถึง:

sudo curl -I http://127.0.0.1:8080

6. ตั้งค่า Nginx Reverse Proxy และ HTTPS

ติดตั้ง Nginx:


sudo apt install -y nginx

สร้าง Configuration:

sudo nano /etc/nginx/sites-available/keycloak

ตัวอย่าง Configuration:

nginx
server {
    listen 80;
    server_name sso.example.com;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name sso.example.com;

    ssl_certificate /etc/letsencrypt/live/sso.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sso.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

เปิดใช้งาน:


sudo ln -s /etc/nginx/sites-available/keycloak \
  /etc/nginx/sites-enabled/keycloak

sudo nginx -t

sudo systemctl reload nginx

ต้องติดตั้ง SSL Certificate ที่ถูกต้องก่อนเปิดใช้งาน Configuration นี้

7. เชื่อมต่อ Microsoft Active Directory

7.1 เตรียมข้อมูล Active Directory

ตัวอย่างข้อมูล:

รายการค่า
Domainexample.local
Domain Controller192.168.1.10
LDAP URLldaps://192.168.1.10:636
Base DNDC=example,DC=local
Users OUOU=Users,DC=example,DC=local
Bind Accountsvc_keycloak@example.local
Username AttributesAMAccountName
User Object Classuser

ควรใช้ Service Account ที่มีสิทธิ์อ่านข้อมูล Directory เท่าที่จำเป็น ไม่ใช้ Domain Administrator

7.2 ตรวจสอบ LDAPS

ติดตั้ง LDAP Utilities:

sudo apt install -y ldap-utils

ทดสอบการเชื่อมต่อ:

sudo ldapsearch -H ldaps://192.168.1.10:636 \
  -x \
  -D "svc_keycloak@example.local" \
  -W \
  -b "DC=example,DC=local" \
  "(sAMAccountName=testuser)"

หมายเหตุ: ต้องติดตั้งและ Trust CA Certificate ของ Active Directory บน Keycloak Container ก่อนใช้งานจริง หากใช้ Internal CA

ควรใช้ FQDN ของ Domain Controller ให้ตรงกับชื่อใน Certificate

7.3 ตั้งค่า User Federation ใน Keycloak

เข้าสู่ระบบ:

https://sso.example.com

จากนั้นดำเนินการดังนี้

  1. เข้าสู่ Administration Console
  2. เลือก Realm ที่ต้องการ
  3. เลือก User Federation
  4. คลิก Add LDAP Providers
  5. กำหนดค่าการเชื่อมต่อ

ค่าที่แนะนำ:

ConfigurationValue
VendorActive Directory
Connection URLldaps://dc01.example.local:636
Bind TypeSimple
Bind DNsvc_keycloak@example.local
Users DNOU=Users,DC=example,DC=local
Username LDAP AttributesAMAccountName
RDN LDAP Attributecn
UUID LDAP AttributeobjectGUID
User Object Classesperson, organizationalPerson, user
Search ScopeSubtree
Edit ModeREAD_ONLY

กด Test Connection และ Test Authentication

หากผ่านการทดสอบให้กด Save

7.4 Synchronize Users

หลังจากเชื่อมต่อ AD สำเร็จ

  1. เข้า User Federation
  2. เลือก LDAP Provider
  3. ใช้ Synchronize all users
  4. ตรวจสอบจำนวน User ที่นำเข้ามา
  5. ตรวจสอบ Username, Email และ Group Mapping

การตั้งค่า LDAP Federation ควรทดสอบกับกลุ่มผู้ใช้ขนาดเล็กก่อนนำไปใช้จริง

8. ตั้งค่า Two-Factor Authentication (2FA)

Keycloak รองรับ TOTP สำหรับแอปพลิเคชัน เช่น

  • Google Authenticator
  • Microsoft Authenticator
  • FreeOTP

และรองรับ WebAuthn / FIDO2

8.1 ตั้งค่า OTP Policy

เข้าสู่ Keycloak Admin Console

เลือก:


Authentication
  → Policies
  → OTP Policy

กำหนดค่าตัวอย่าง:

SettingValue
OTP TypeTime Based
OTP AlgorithmSHA256
Digits6
Token Period30 Seconds
Look Around Window1

ตรวจสอบความเข้ากันได้ของ Authenticator ที่เลือกก่อนกำหนด Algorithm

8.2 บังคับให้ผู้ใช้ลงทะเบียน 2FA

ไปที่:

text

Authentication
  → Required Actions

เปิดใช้งาน:

text
Configure OTP

จากนั้นกำหนดให้ผู้ใช้ต้องลงทะเบียน OTP ก่อนใช้งาน

8.3 Authentication Flow

กำหนด Authentication Flow ให้มีขั้นตอนดังนี้

  1. Username / Password
  2. ตรวจสอบ Credentials ผ่าน Active Directory
  3. ตรวจสอบ OTP
  4. Authentication Success
  5. ส่ง Token ให้ Application

ควรทดสอบ Flow กับ User Group ที่กำหนดก่อนบังคับใช้กับผู้ใช้ทุกคน

9. ตั้งค่า SSO ให้ Application

Keycloak รองรับ Protocol หลักสองประเภท:

OpenID Connect (OIDC)

เหมาะกับ:

  • Web Application
  • Modern Application
  • API
  • Mobile Application

SAML 2.0

เหมาะกับ:

  • Enterprise Application
  • ระบบ ERP
  • ระบบที่รองรับ SAML Service Provider

การสร้าง Application:

text
Clients
  → Create Client
  → Select OpenID Connect
  → Configure Client ID
  → Configure Redirect URI
  → Save

กำหนด Redirect URI ให้ตรงกับ Application จริง และหลีกเลี่ยง Wildcard ที่กว้างเกินจำเป็น

10. Security Hardening

ก่อนใช้งาน Production ควรดำเนินการดังนี้

  • เปิดใช้งาน HTTPS ทุกการเชื่อมต่อ
  • ใช้ LDAPS แทน LDAP แบบไม่เข้ารหัส
  • จำกัดสิทธิ์ Service Account
  • จำกัดการเข้าถึง Admin Console
  • เปิด MFA สำหรับ Administrator
  • ใช้ PostgreSQL แยกจาก Public Network
  • ตั้งค่าการสำรองข้อมูล PostgreSQL
  • ตั้งค่าการเก็บ Audit Logs
  • ป้องกัน Brute Force Login
  • ใช้ Firewall จำกัด Port
  • ทดสอบ Account Lockout และ Recovery
  • จัดทำแผน High Availability และ Disaster Recovery

11. Testing & Validation

Test CaseExpected Result
Login ด้วย AD Accountผ่าน
Login ด้วย Password ผิดไม่ผ่าน
Login ด้วย User ที่ถูก Disable ใน ADไม่ผ่าน
Login ด้วย TOTP ถูกต้องผ่าน
Login ด้วย TOTP ผิดไม่ผ่าน
Login Application ผ่าน SSOผ่าน
Logout จากระบบSession ถูกจัดการตาม Policy
AD Server ไม่พร้อมใช้งานระบบแจ้งข้อผิดพลาด
LDAP Certificate ไม่ถูกต้องปฏิเสธการเชื่อมต่อ

12. Backup and Recovery

ควรสำรองข้อมูลต่อไปนี้:

  1. PostgreSQL Database
  2. Keycloak Configuration
  3. Realm Export
  4. Client Configuration
  5. SSL Certificates
  6. LDAP CA Certificates
  7. Docker Compose และ Environment Configuration

ควรเก็บ Backup แยกจากเครื่อง Production และทดสอบ Restore เป็นระยะ

13. สรุป

การติดตั้ง Keycloak บน Ubuntu Server 24.04 LTS และเชื่อมต่อกับ Microsoft Active Directory ช่วยให้องค์กรสามารถรวมศูนย์การจัดการ Authentication ได้

ระบบรองรับ SSO, LDAP Federation, OIDC, SAML และ 2FA ทำให้สามารถนำไปใช้เป็นระบบ Identity Provider กลางสำหรับ Application ต่าง ๆ ภายในองค์กร

Recommended Solution:

  • Identity Provider: Keycloak
  • Operating System: Ubuntu 24.04 LTS
  • Database: PostgreSQL
  • Directory: Microsoft Active Directory
  • Directory Protocol: LDAPS
  • SSO Protocol: OIDC / SAML 2.0
  • MFA: TOTP / WebAuthn
  • Reverse Proxy: Nginx
  • SSL: TLS Certificate

14. Official References

  1. Keycloak Official Website
    https://www.keycloak.org/
  2. Keycloak Server Administration Guide
    https://www.keycloak.org/docs/latest/server_admin/
  3. Keycloak LDAP / Active Directory Integration
    https://www.keycloak.org/docs/latest/server_admin/#_ldap
  4. Keycloak OTP Policy
    https://www.keycloak.org/docs/latest/server_admin/#_otp
  5. Keycloak Production Configuration
    https://www.keycloak.org/server/configuration-production
  6. Ubuntu Server Documentation
    https://documentation.ubuntu.com/server/

End of Document

ไม่มีความคิดเห็น:

แสดงความคิดเห็น