ในบทความนี้เราจะพิจารณาการกำหนดค่าทีละขั้นตอนของการยืนยันตัวตน SSO (Single Sign-On) แบบโปร่งใสสำหรับ Zabbix 4.0 (หรือใหม่กว่า) ใน Active Directory โดยใช้ Kerberos
ผลลัพธ์สุดท้ายคือผู้ใช้จะได้รับการยืนยันตัวตนบนหน้าหลัก Zabbix โดยอัตโนมัติโดยไม่ต้องป้อนข้อมูลประจำตัว เพื่อทำเช่นนี้ ผู้ใช้ต้องเข้าสู่ระบบ Windows ภายใต้บัญชีโดเมน Active Directory ที่ระบุใน Zabbix นอกจากนี้ ผู้ใช้ต้องกำหนดค่าเบราว์เซอร์ (ต้องเปิดใช้งานการรองรับ Kerberos และตั้งค่าเว็บไซต์ intranet ที่เชื่อถือได้ใน IE)
ตัวอย่างสภาพแวดล้อม:
- Ubuntu Server 18.04 LTS;
- โดเมน Active Directory ระดับฟังก์ชัน 2008 (หรือสูงกว่า)
- Zabbix Server 4.0.11, Apache2 เป็นเว็บเซิร์ฟเวอร์ (คู่มือการติดตั้ง Zabbix)
หมายเหตุ ในการนำ SSO ไปใช้ จะใช้ Apache2 พร้อมโมดูล libapache2-mod-auth-kerb ในบทความนี้ Nginx จะไม่ได้พูดถึง แต่มี spnego-http-auth-nginx-module ที่ต้องเปิดใช้งานแยกต่างหากเมื่อคอมไพล์ Nginx
การยืนยันตัวตน Zabbix LDAP บน Active Directory
ก่อนอื่น คุณต้องผูกผู้ใช้โดเมนกับ Zabbix ในการทำเช่นนี้ เพียงสร้างผู้ใช้ใน Zabbix ด้วยชื่อเข้าสู่ระบบเดียวกับที่พวกเขามีในโดเมน AD ตัวอย่างเช่น หากชื่อเข้าสู่ระบบ (แอตทริบิวต์ sAMAccountName) คือ user_5 ผู้ใช้ใน Zabbix ต้องมีชื่อเข้าสู่ระบบเดียวกัน

ทำเช่นนี้สำหรับผู้ใช้แต่ละคนที่จะใช้ Zabbix
จากนั้นสร้างบัญชีผู้ใช้แยกต่างหากใน Active Directory เพื่อผูก Zabbix กับโดเมนของคุณ ในทางปฏิบัติ คุณสามารถใช้บัญชีโดเมนใดๆ ได้ แต่ดีกว่าที่จะสร้างบัญชีบริการแยกต่างหาก ในกรณีของผม จะเป็น zabbix_admin ในการสร้างผู้ใช้ใน AD ผมจะใช้ cmdlet PowerShell New-ADUser:
New-ADUser -Name "zabbix_admin" -GivenName "zabbix_admin" -Surname "zabbix_admin" -SamAccountName "zabbix_admin" -AccountPassword (Read-Host -AsSecureString "Password:") -DisplayName "zabbix_admin" -Enabled $true
รันคำสั่งที่แสดงด้านบนในคอนโซล PowerShell และตั้งรหัสผ่านผู้ใช้ ผู้ใช้ใหม่จะอยู่ภายใต้คอนเทนเนอร์ Users ในรูทของโดเมนของคุณ
มาตั้งค่าการยืนยันตัวตน LDAP ใน Zabbix ในหน้าตัว Zabbix ไปที่แท็บการตั้งค่า LDAP ใน Administration -> Authentication ติ๊ก Enable LDAP authentication และกรอกฟิลด์ต่อไปนี้:
- LDAP host:
ldap://dc1.domain.local - Port:
389 - Base DN:
DC=domain, DC=local - Search attribute:
sAMAccountName - Bind DN:
CN=zabbix_admin,OU=Users,DC=domain,DC=local
คุณสามารถอ่านคำอธิบายของพารามิเตอร์ใดๆ ในส่วน LDAP authentication ของเอกสาร Zabbix: https://www.zabbix.com/documentation/current/manual/web_interface/frontend_sections/administration/authentication.

ก่อนเสร็จสิ้นการกำหนดค่า ตรวจสอบว่าการตั้งค่าของคุณถูกต้องโดยการทดสอบล็อกอิน (ปุ่ม Test) ระบุชื่อผู้ใช้ (เราสร้างบัญชีไว้ก่อนหน้านี้) และรหัสผ่าน AD

หากการทดสอบสำเร็จ ให้บันทึกการตั้งค่าและเปลี่ยนประเภทการยืนยันตัวตนใน Zabbix จาก Internal เป็น LDAP

เปิดใช้งานการยืนยันตัวตน HTTP (HTTP Settings -> Enable HTTP authentication)

การยืนยันตัวตน LDAP กำหนดค่าเสร็จแล้ว
เคล็ดลับ หากเซิร์ฟเวอร์ LDAP ของคุณไม่พร้อมใช้งาน คุณจะไม่สามารถเข้าถึง Zabbix ได้ ในการกลับสู่การยืนยันตัวตนภายใน ให้เปิด MySQL และรันคำสั่งต่อไปนี้:
update zabbix.config set authentication_type='0' where configid='1';
ตั้งค่าการยืนยันตัวตนแบบโปร่งใส (Single Sign On) ใน Zabbix (Apache2, krb5-user)
ก่อนอื่น ให้ระบุชื่อ FQDN ของเซิร์ฟเวอร์ใน /etc/hostname ที่ต้องตรงกับระเบียน DNS ในโดเมนของคุณ ในกรณีของผม คือ zabbix.domain.local
นอกจากนี้ ให้เขียน FQDN ของเซิร์ฟเวอร์สำหรับที่อยู่ IP ท้องถิ่นและที่อยู่ IP ของเซิร์ฟเวอร์ใน /etc/hosts
127.0.0.1 localhost zabbix.domain.local 10.1.1.10 zabbix.domain.local
เพื่อให้การยืนยันตัวตน Kerberos ทำงานถูกต้อง ให้ซิงโครไนซ์เวลากับโดเมนคอนโทรลเลอร์ ติดตั้งแพ็กเกจ ntpdate และผูกกับโดเมนคอนโทรลเลอร์
apt-get install ntp ntpdate
ntpdate dc.domain.local
Chrony ใช้ซิงโครไนซ์เวลาใน CentOS 8 แพ็กเกจ ntp และ ntpdate ไม่พร้อมใช้งานในที่เก็บอย่างเป็นทางการ
ตอนนี้คุณต้องสร้างไฟล์ keytab บนโดเมนคอนโทรลเลอร์ Keytab คือไฟล์ที่มี SPN และคีย์ที่เข้ารหัส Keytab ใช้สำหรับการยืนยันตัวตนแบบ Kerberos
- เข้าสู่ระบบบนโดเมนคอนโทรลเลอร์และรันคอมมานด์โพร้อมท์ในฐานะผู้ดูแลระบบ ไปที่ C:\
- ป้อนคำสั่งต่อไปนี้:
ktpass -princ HTTP/zabbix.domain.local@DOMAIN.LOCAL -mapuser zabbix_admin -pass STRONGPASS -crypto ALL -ptype KRB5_NT_PRINCIPAL -out zabbix.keytab -setupn –setpass - คัดลอกไฟล์ C:\zabbix.keytab ไปที่ไดเรกทอรี /etc/apache2/ บนเซิร์ฟเวอร์ Zabbix
ติดตั้งแพ็กเกจ Kerberos และโมดูลสำหรับ apache2:
#apt install krb5-user libapache2-mod-auth-kerb
กำหนดค่า krb5-user แก้ไข /etc/krb5.cnf:
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = DOMAIN.LOCAL default_keytab_name = /etc/apache2/zabbix.keytab dns_lookup_kdc = false dns_lookup_realm = false forwardable = true ticket_lifetime = 24h [realms] DOMAIN.LOCAL = { kdc = dc.domain.local default_domain = DOMAIN.LOCAL admin_server = dc.domain.local } [domain_realm] .domain.local = DOMAIN.LOCAL domain.local = DOMAIN.LOCAL
ระบุโดเมนของคุณ ในบางที่ชื่อโดเมนเขียนเป็นตัวพิมพ์ใหญ่ ปฏิบัติตามกฎนี้
หมายเหตุ ดูบรรทัดที่มีพาธไฟล์ keytab "default_keytab_name = /etc/apache2/zabbix.keytab" และให้แน่ใจว่าไฟล์มีอยู่ที่นั่น ให้สิทธิ์อ่านกับ www-data และรัน: chown www-data:www-data /etc/apache2/zabbix.keytab
ตรวจสอบว่าการยืนยันตัวตน Kerberos ทำงานใน Linux:
kinit -kV -p HTTP/zabbix.domain.local –t /etc/apache2/zabbix.keytab

คุณอาจเห็นข้อผิดพลาดนี้:
kinit: Client 'HTTP/zabbix.domain.local@DOMAIN.LOCAL’ not found in Kerberos database while getting initial credentials
ในกรณีนี้ ลองยืนยันตัวตนโดยใช้ข้อมูลประจำตัวของผู้ใช้อื่น:
kinit -pV LOGIN
หากการยืนยันตัวตนสำเร็จ ปัญหาอยู่ที่ไฟล์ keytab ของคุณ ตรวจสอบว่าคุณสร้างมันถูกต้อง ตรวจสอบว่าคุณป้อนคำสั่งสร้าง keytab ถูกต้อง
ตรวจสอบว่ามีระเบียน SPN สำหรับบัญชีบริการ Zabbix อยู่ใน AD หรือไม่ ใส่คำสั่งต่อไปนี้บนโดเมนคอนโทรลเลอร์:
setspn -l zabbix_admin
คุณจะเห็นข้อความแบบนี้ ต้องอยู่ในรูปแบบ HTTP/zabbix.domain.local หากไม่มีระเบียน ให้เพิ่ม
setspn -a HTTP/zabbix.domain.local zabbix_admin

ตรวจสอบว่าชื่อเข้าสู่ระบบของผู้ใช้เปลี่ยนเป็น HTTP/zabbix.domain.local

หากยังไม่เปลี่ยน ให้เปลี่ยนด้วยตนเอง
จากนั้นแก้ไขไฟล์กำหนดค่า apache2 — /etc/apache2/sites-available/000-default.conf
เพิ่มส่วนต่อไปนี้ภายใต้บรรทัด ServerName zabbix.domain.local:
<Location /> AuthType Kerberos AuthName "Kerberos authenticated" KrbAuthRealms DOMAIN.LOCAL #KrbServiceName HTTP/zabbix.domain.local KrbServiceName Any Krb5Keytab /etc/apache2/zabbix.keytab KrbMethodNegotiate On KrbSaveCredentials on KrbLocalUserMapping on Require valid-user </Location>
หาก KrbServiceName ไม่ตรงกับชื่อที่ระบุในไฟล์ keytab จะเกิดข้อผิดพลาด ดังนั้นคุณสามารถตั้งค่าเป็น Any ระหว่างการทดสอบ หลังจากแน่ใจว่าระบบทำงาน ให้ระบุชื่อบริการที่ถูกต้อง คุณสามารถตรวจสอบได้โดยใช้:
klist -le /etc/apache2/zabbix.keytab
วิธีกำหนดค่าเบราว์เซอร์สำหรับการยืนยันตัวตน Kerberos
เพื่อให้ Internet Explorer ใช้การยืนยันตัวตน Kerberos บน Zabbix คุณจะต้องเพิ่ม URL ของมันเข้าไปในไซต์ Local Intranet Google Chrome ใช้การตั้งค่า Internet Explorer ดังนั้นคุณไม่ต้องกำหนดค่าแยกต่างหาก
หมายเหตุ URL ของไซต์ Zabbix ของคุณต้องไม่ได้อยู่ในรายการ Trusted sites มิฉะนั้น Kerberos จะไม่ทำงาน ไซต์ต้องระบุเฉพาะในไซต์ Intranet
เปิด Options -> Security ใน IE

คลิก Sites ใน Local intranet ติ๊กตัวเลือกที่แสดงในภาพหน้าจอด้านล่างและคลิก Advanced

ป้อน URL เซิร์ฟเวอร์ Zabbix ของคุณ

ไปที่แท็บ Advanced และติ๊ก Enable Integrated Windows Authentication

นอกจากนี้ คุณยังสามารถใส่ URL Zabbix เข้าโซน Local Intranet โดยใช้ Group Policies (Computer Configuration -> Administrative Templates -> Windows Components -> Internet Explorer -> Internet Control Panel -> Security Page -> Site to Zone Assignment List ใช้รหัสโซน 1 สำหรับไซต์ intranet)

เพิ่ม URL ของเซิร์ฟเวอร์ Zabbix ของคุณไปยังพารามิเตอร์ต่อไปนี้ของ about:config สำหรับ Mozilla Firefox:
network.automatic-ntlm-auth.trusted-uris network.negotiate-auth.delegation-uris network.negotiate-auth.trusted-uris

หากคุณพบปัญหาใดๆ ดูบทความโดยละเอียดเกี่ยวกับการกำหนดค่า Kerberos ในเบราว์เซอร์
หลังจากนั้น การกำหนดค่าเสร็จสิ้น หากคุณพยายามเข้าถึง URL เซิร์ฟเวอร์ Zabbix คุณจะได้รับการยืนยันตัวตนโดยอัตโนมัติและไม่ได้รับแจ้งให้ป้อนรหัสผ่าน
การดีบักและแก้ไขปัญหาการยืนยันตัวตน Kerberos ใน Apache
หากคุณมีปัญหา ให้เปิดโหมดดีบักใน apache2:
เพิ่มส่วนต่อไปนี้ก่อนแท็กปิด </VirtualHost> ใน /etc/apache2/sites-available/000-defaults.conf:
LogLevel trace8

รีสตาร์ท apache และตรวจสอบข้อผิดพลาดของโมดูล Kerberos ในไฟล์ error.log
เพื่อความสะดวก ใช้คำสั่งนี้เพื่อกรองรายการตามที่อยู่ IP:
tail -f /var/log/apache2/error.log | grep ‘Your IP address’
เพื่อทำงานกับและวินิจฉัย Kerberos คุณสามารถใช้คำสั่ง kinit และ klist
kinit เป็นเครื่องมือสำหรับรับและแคชตั๋ว Kerberos ตัวอย่าง:
kinit –V -k -t /etc/apache2/zabbix.keytab –p HTTP/zabbix.domain.local@DOMAIN.LOCAL
หากคุณสร้างไฟล์ keytab ถูกต้อง คำสั่งจะรันและคุณจะได้รับข้อความว่าการยืนยันตัวตนสำเร็จ
ใช้ klist เพื่อดูตั๋ว Kerberos ที่แคชไว้:
klist -a