ข้อกำหนดสิทธิ์การเรียกใช้งาน 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 ต้องการสิทธิ์ดังต่อไปนี้:
- สิทธิ์อ่านและเขียนไดเรกทอรีใบรับรอง: มีสิทธิ์อ่านและเขียนในไดเรกทอรีที่เก็บไฟล์ใบรับรองเป้าหมาย (
.crt), ไฟล์ CA chain (ถ้ามี) และไฟล์คีย์ส่วนตัว (.key) เพื่อให้สามารถเขียนใบรับรองใหม่และสร้างข้อมูลสำรอง.bakได้ - รันคำสั่ง reload:
after_scriptสคริปต์ต่อไปนี้จะถูกสร้างขึ้นตามค่าเริ่มต้น เพื่อใช้รีโหลด nginx หลังอัปเดตใบรับรอง:
nginx -t && nginx -s reload
ข้อแนะนำการให้สิทธิ์ขั้นต่ำ:
- เปิดเฉพาะไดเรกทอรีใบรับรองเป้าหมาย ไม่ให้สิทธิ์อ่านเขียนทั้ง
/etc/nginx - ผ่าน sudoers ให้สิทธิ์อย่างแม่นยำเฉพาะ
nginx -tและnginx -s reloadไม่ให้ root shell เต็มรูปแบบ
Apache HTTP Server
clmBot ต้องการสิทธิ์ดังต่อไปนี้:
- สิทธิ์อ่านเขียนไดเรกทอรีใบรับรอง: มีสิทธิ์อ่านเขียนต่อไดเรกทอรีที่เก็บ
SSLCertificateFile,SSLCertificateChainFile,SSLCertificateKeyFile - รันคำสั่งรีสตาร์ทบริการ:
after_scriptสร้างสคริปต์หนึ่งรายการต่อไปนี้โดยค่าเริ่มต้น (ขึ้นอยู่กับดิสทริบิวชัน):
systemctl restart httpd.service
systemctl restart apache2.service
ข้อแนะนำสิทธิ์ขั้นต่ำ:
- เปิดให้เข้าถึงเฉพาะไดเรกทอรีใบรับรองเป้าหมาย ไม่ให้สิทธิ์ครอบคลุมทั้งไดเรกทอรีการกำหนดค่า Apache
- ผ่าน sudoers ให้สิทธิ์
restartเฉพาะกับชื่อบริการ Apache ที่ระบบปัจจุบันใช้งานจริงเท่านั้น
Tomcat
clmBot ต้องการสิทธิ์ดังต่อไปนี้:
- สิทธิ์อ่านและเขียนไดเรกทอรีใบรับรอง: มีสิทธิ์อ่านและเขียนไดเรกทอรีที่เก็บไฟล์ใบรับรอง/คีย์ส่วนตัวแบบ PEM หรือไฟล์ JKS keystore
- การรันสคริปต์หยุดและเริ่มบริการ:
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 ต้องมีสิทธิ์ดังต่อไปนี้:
- รันด้วยบัญชีผู้ดูแลระบบ: เรียกใช้
powershell.exe -NoProfile -ExecutionPolicy Bypassเพื่อนำเข้า PFX ชั่วคราวและอัปเดตการผูกไซต์ IIS - สิทธิ์อ่านและเขียนไดเรกทอรีใบรับรอง: การสร้างและล้างไฟล์ 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) รับฟังต้องสอดคล้องกับนโยบายไฟร์วอลล์ของโฮสต์