Skip to main content

ข้อกำหนดสิทธิ์การทำงานของ clmBot

เมื่อ clmBot ดำเนินการต่ออายุใบรับรองอัตโนมัติ จำเป็นต้องอ่านและเขียนไฟล์ใบรับรองเป้าหมาย และหลังจากอัปเดตแล้วต้อง reload หรือ restart บริการมิดเดิลแวร์ที่เกี่ยวข้อง บทความนี้อธิบายการกำหนดค่าสิทธิ์ขั้นต่ำที่แนะนำในสถานการณ์มิดเดิลแวร์ประเภทต่าง ๆ

คำอธิบาย

คำสั่ง reload / restart ของมิดเดิลแวร์ถูกกำหนดไว้ในฟิลด์ servers[].after_script ของ config.yaml ผู้ใช้สามารถปรับเปลี่ยนได้ตามสภาพแวดล้อมจริง clmBot ไม่จำเป็นต้องทำงานด้วยบัญชีสิทธิ์สูง เช่น root หรือ Administrator เป็นเวลานาน


หลักสิทธิ์ขั้นต่ำ​

แนะนำให้ใช้บัญชีระบบเฉพาะ (เช่น clmbot) เพื่อรัน clmBot และปฏิบัติตามหลักการต่อไปนี้:

  • ให้สิทธิ์บัญชีดังกล่าวเฉพาะในการอ่านการกำหนดค่า clmBot ไดเรกทอรีบันทึก และจุดติดตั้งใบรับรองเป้าหมายเท่านั้น
  • ให้สิทธิ์เขียนเฉพาะไฟล์ใบรับรอง ไฟล์คีย์ส่วนตัว และไดเรกทอรีที่เกี่ยวข้องซึ่งดูแลโดย clmBot เท่านั้น
  • อนุญาตให้ดำเนินการเฉพาะคำสั่ง reload / restart ของมิดเดิลแวร์ที่ผ่านการตรวจสอบแล้วเท่านั้น ไม่ให้สิทธิ์ NOPASSWD: ALL หรือสิทธิ์ root เต็มรูปแบบ
  • before_script และ after_script ต้องผ่านการตรวจสอบโดยมนุษย์ และสิทธิ์ที่จำเป็นในสคริปต์ควรได้รับอนุญาตทีละรายการ

แนวทางที่ไม่แนะนำ:

  • ให้ clmBot ทำงานในฐานะ root หรือ Administrator ในระยะยาว
  • เปิดสิทธิ์เข้าถึงไดเรกทอรีคอนฟิกมิดเดิลแวร์ ไดเรกทอรีใบรับรอง หรือสิทธิ์ควบคุมบริการระบบทั้งหมดแก่ clmBot
  • ให้สิทธิ์ดำเนินการแบบไม่จำกัดแก่ bash, powershell.exe, systemctl

ข้อกำหนดสิทธิ์ของมิดเดิลแวร์แต่ละตัว​

nginx​

clmBot ต้องการสิทธิ์ต่อไปนี้:

  1. สิทธิ์อ่านและเขียนไดเรกทอรีใบรับรอง: มีสิทธิ์อ่านและเขียนบนไดเรกทอรีที่เก็บไฟล์ใบรับรองเป้าหมาย (.crt), ไฟล์ CA chain (ถ้ามี) และไฟล์คีย์ส่วนตัว (.key) เพื่อให้สามารถเขียนใบรับรองใหม่และสร้างข้อมูลสำรอง .bak
  2. รันคำสั่ง reload: after_script จะสร้างสคริปต์ต่อไปนี้โดยค่าเริ่มต้น เพื่อใช้โหลด nginx ใหม่หลังจากอัปเดตใบรับรอง:
nginx -t && nginx -s reload

ข้อแนะนำการให้สิทธิ์ขั้นต่ำ:

  • เปิดเฉพาะไดเรกทอรีใบรับรองเป้าหมายเท่านั้น ไม่ให้สิทธิ์อ่านเขียนทั้ง /etc/nginx
  • ให้สิทธิ์ผ่าน sudoers อย่างเจาะจงสำหรับ nginx -t และ nginx -s reload ไม่ให้ root shell เต็มรูปแบบ

Apache HTTP Server​

clmBot จำเป็นต้องมีสิทธิ์ดังต่อไปนี้:

  1. สิทธิ์อ่านเขียนไดเรกทอรีใบรับรอง: มีสิทธิ์อ่านเขียนในไดเรกทอรีที่เก็บ SSLCertificateFile, SSLCertificateChainFile, SSLCertificateKeyFile
  2. ดำเนินการคำสั่งรีสตาร์ทบริการ: after_script จะสร้างสคริปต์ใดสคริปต์หนึ่งต่อไปนี้ตามค่าเริ่มต้น (ขึ้นอยู่กับรุ่นที่แจกจ่าย):
systemctl restart httpd.service
systemctl restart apache2.service

ข้อแนะนำการให้สิทธิ์ขั้นต่ำ:

  • เปิดเฉพาะไดเรกทอรีใบรับรองเป้าหมาย ไม่ให้สิทธิ์ครอบคลุมไดเรกทอรีการกำหนดค่า Apache ทั้งหมด
  • ผ่าน sudoers ให้สิทธิ์ restart เฉพาะกับชื่อบริการ Apache ที่ระบบปัจจุบันใช้งานจริงเท่านั้น

Tomcat​

clmBot ต้องการสิทธิ์ดังต่อไปนี้:

  1. สิทธิ์อ่านและเขียนไดเรกทอรีใบรับรอง: มีสิทธิ์อ่านและเขียนไดเรกทอรีที่เก็บไฟล์ใบรับรอง/คีย์ส่วนตัว PEM หรือไฟล์ JKS keystore
  2. เรียกใช้สคริปต์หยุดและเริ่มทำงาน: after_script สร้างสคริปต์ต่อไปนี้ตามค่าเริ่มต้น:
export JAVA_HOME="<java_home>" && "<catalina_base>/bin/shutdown.sh" && "<catalina_base>/bin/startup.sh"

ข้อแนะนำการให้สิทธิ์ขั้นต่ำ:

  • ควรให้ clmBot ใช้กลุ่มธุรกิจเดียวกันกับ Tomcat และให้สิทธิ์อ่านเขียนเฉพาะโฟลเดอร์ keystore หรือไดเรกทอรีใบรับรองเป้าหมายเท่านั้น
  • อนุญาตให้เรียกใช้งานเฉพาะ shutdown.sh และ startup.sh ของอินสแตนซ์ Tomcat ที่เกี่ยวข้องเท่านั้น ไม่ให้สิทธิ์ทั้งไดเรกทอรี /opt
  • สภาพแวดล้อม Tomcat หลายอินสแตนซ์ควรแยกการให้สิทธิ์ตามอินสแตนซ์

IIS​

สถานการณ์ IIS ต้องอาศัยสคริปต์ Windows PowerShell เพื่อนำเข้า PFX และอัปเดตการผูก HTTPS จำเป็นต้องใช้สิทธิ์ผู้ดูแลระบบ

clmBot ต้องมีสิทธิ์ดังต่อไปนี้:

  1. เรียกใช้งานด้วยบัญชีผู้ดูแลระบบ: รัน powershell.exe -NoProfile -ExecutionPolicy Bypass เพื่อนำเข้า PFX ชั่วคราวและอัปเดตการผูกไซต์ IIS
  2. สิทธิ์อ่านเขียนไดเรกทอรีใบรับรอง: สำหรับการสร้างและลบไฟล์ PFX ชั่วคราว

ข้อแนะนำการให้สิทธิ์ขั้นต่ำ:

  • ใช้บัญชีบริการ Windows เฉพาะ และให้สิทธิ์เฉพาะที่จำเป็นสำหรับจัดการการผูกไซต์ IIS เป้าหมายเท่านั้น
  • นโยบายการรัน PowerShell และสิทธิ์โมดูลควรตรวจสอบแยกตามเกณฑ์ความปลอดภัยพื้นฐานของโฮสต์

ตัวอย่างการกำหนดค่า Linux sudoers​

ตัวอย่างต่อไปนี้แสดงเฉพาะระดับความละเอียดของการให้สิทธิ์ กรุณาปรับพาธจริงตามโฮสต์เป้าหมาย

nginx:

clmbot ALL=(root) NOPASSWD: /usr/sbin/nginx -t
clmbot ALL=(root) NOPASSWD: /usr/sbin/nginx -s reload

Apache:

clmbot ALL=(root) NOPASSWD: /bin/systemctl restart apache2.service

Tomcat:

clmbot ALL=(tomcat) NOPASSWD: /opt/apache-tomcat/bin/shutdown.sh
clmbot ALL=(tomcat) NOPASSWD: /opt/apache-tomcat/bin/startup.sh

ตัวอย่างสิทธิ์ของไดเรกทอรีใบรับรอง:

chown -R root:clmbot /etc/ssl/example
chmod 0750 /etc/ssl/example
chmod 0640 /etc/ssl/example/site.crt /etc/ssl/example/ca.crt
chmod 0640 /etc/ssl/example/site.key

หากต้องการอนุญาตให้ clmBot เขียนและสำรองไฟล์ข้างต้น สามารถใช้ ACL เพื่อกำหนดสิทธิ์อย่างแม่นยำ:

setfacl -m u:clmbot:rwx /etc/ssl/example
setfacl -m u:clmbot:rw- /etc/ssl/example/site.crt
setfacl -m u:clmbot:rw- /etc/ssl/example/ca.crt
setfacl -m u:clmbot:rw- /etc/ssl/example/site.key

รายการตรวจสอบสิทธิ์ก่อนเปิดใช้งาน​

คำแนะนำ

ก่อนการติดตั้ง clmBot แนะนำให้ตรวจสอบการตั้งค่าสิทธิ์ต่อไปนี้ทีละรายการ

  • clmBot ใช้บัญชีเฉพาะสำหรับการทำงานหรือไม่ แทนที่จะเป็น root หรือผู้ดูแลระบบ
  • config.yaml อนุญาตให้เฉพาะบัญชีที่จำเป็นอ่านและเขียนเท่านั้นหรือไม่
  • ไฟล์ใบรับรองที่แต่ละ servers[].format ชี้ไปเปิดสิทธิ์อ่านและเขียนเฉพาะที่จำเป็นเท่านั้นหรือไม่
  • ไดเรกทอรีที่เก็บไฟล์ใบรับรองอนุญาตให้สร้างและล้างไฟล์สำรอง .bak ได้หรือไม่
  • before_script และ after_script ได้รับการตรวจสอบโดยเจ้าหน้าที่แล้วหรือไม่
  • sudoers มีเฉพาะคำสั่งที่แม่นยำเท่านั้นหรือไม่ ไม่ใช่ ALL, bash หรือ systemctl แบบเต็ม
  • สิทธิ์ reload หรือ restart ของ nginx / Apache / Tomcat ครอบคลุมเฉพาะอินสแตนซ์เป้าหมายเท่านั้นหรือไม่
  • ที่อยู่และพอร์ตที่เซอร์วิสโหมด (clm-bot server) รับฟังสอดคล้องกับนโยบายไฟร์วอลล์ของโฮสต์หรือไม่