Skip to main content

ข้อกำหนดสิทธิ์การเรียกใช้งาน clmBot

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

คำอธิบาย

คำสั่ง 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) รับฟังต้องสอดคล้องกับนโยบายไฟร์วอลล์ของโฮสต์