ทำไมเราต้องจำกัดสิทธิ์การใช้งาน Crontab
เวลาเราทำงานกับระบบ Linux (ระบบปฏิบัติการที่นิยมใช้รันโปรแกรมบนเซิร์ฟเวอร์) เรามักจะใช้ Crontab (เครื่องมือตั้งเวลาทำงานอัตโนมัติ) เพื่อสั่งให้สคริปต์ทำงานตามเวลาที่กำหนด เปรียบได้กับการตั้งนาฬิกาปลุกให้คอมพิวเตอร์ทำงานบางอย่างเองโดยที่เราไม่ต้องไปกดเองทุกครั้ง
แต่ในสภาพแวดล้อมการทำงานจริง การปล่อยให้ทุกคนในทีมตั้งเวลาทำงานเองได้หมดอาจกลายเป็นช่องโหว่ความปลอดภัย (จุดที่อาจถูกผู้ไม่หวังดีเข้ามาโจมตีระบบ) หากมีคนใส่คำสั่งที่ผิดพลาดหรือคำสั่งที่เป็นอันตรายลงไป ระบบทั้งหมดอาจล่มหรือข้อมูลอาจเสียหายได้ทันที
ดังนั้นการ Restrict Cron Access (การจำกัดสิทธิ์การใช้งานเครื่องมือตั้งเวลา) จึงเป็นมาตรฐานความปลอดภัยที่สำคัญมาก เราต้องควบคุมให้เฉพาะคนที่ได้รับอนุญาตเท่านั้นที่แตะต้องส่วนนี้ได้ เหมือนกับการให้กุญแจห้องเซิร์ฟเวอร์เฉพาะคนที่จำเป็นต้องเข้าใช้งานจริงเท่านั้น
รู้จักกับไฟล์ที่ใช้ควบคุมสิทธิ์ cron.allow และ cron.deny
ระบบ Linux มีไฟล์หลักสองไฟล์ที่ทำหน้าที่เหมือนสมุดรายชื่อคนเข้างาน (ไฟล์ที่ระบุว่าใครทำอะไรได้บ้าง) คือ /etc/cron.allow และ /etc/cron.deny ซึ่งทั้งสองไฟล์นี้จะทำงานร่วมกันเพื่อคัดกรองผู้ใช้งาน
ไฟล์ cron.allow คือรายชื่อคนที่ "อนุญาต" ให้ใช้งานได้ ส่วน cron.deny คือรายชื่อคนที่ "ห้าม" ใช้งาน โดยปกติถ้าไม่มีไฟล์เหล่านี้เลย ทุกคนในระบบจะสามารถใช้งานได้ แต่ถ้าเราสร้างไฟล์ cron.allow ขึ้นมา ระบบจะเปลี่ยนพฤติกรรมทันที
กฎเหล็กที่ต้องจำคือหากไฟล์ cron.allow มีตัวตนอยู่ ระบบจะอนุญาตเฉพาะคนที่มีชื่ออยู่ในไฟล์นี้เท่านั้น ส่วนคนอื่นจะถูกตัดสิทธิ์ทิ้งทั้งหมด แม้ว่าชื่อเขาจะไม่ได้อยู่ในไฟล์ cron.deny ก็ตาม เป็นการคุมแบบWhitelist (การระบุเฉพาะสิ่งที่ยอมรับ) ที่ปลอดภัยที่สุด
ขั้นตอนการตั้งค่าให้ผู้ใช้งานเฉพาะราย
ในการตั้งค่าเราต้องเข้าไปที่เซิร์ฟเวอร์และแก้ไขไฟล์ด้วยสิทธิ์ root (บัญชีผู้ดูแลระบบสูงสุด) ซึ่งมีขั้นตอนที่ไม่ซับซ้อนแต่ต้องทำอย่างระมัดระวัง เพื่อป้องกันไม่ให้คนอื่นเข้าถึงงานสำคัญของเราได้
- ล็อกอินเข้าสู่เซิร์ฟเวอร์ด้วยบัญชีที่มีสิทธิ์ sudo (สิทธิ์ในการทำคำสั่งระดับผู้ดูแล)
- สร้างไฟล์
/etc/cron.allowแล้วใส่ชื่อผู้ใช้ที่ต้องการให้ใช้งานลงไป - สร้างไฟล์
/etc/cron.denyแล้วใส่ชื่อผู้ใช้ที่ต้องการบล็อกลงไปเพื่อความชัดเจน
# สร้างไฟล์อนุญาตและระบุชื่อผู้ใช้งาน rose
echo "rose" > /etc/cron.allow
# สร้างไฟล์ห้ามใช้งานและระบุชื่อผู้ใช้งาน rod
echo "rod" > /etc/cron.deny
บรรทัดแรกใช้คำสั่ง echo เพื่อเขียนชื่อ rose ลงไปในไฟล์ /etc/cron.allow ซึ่งเป็นการบอกระบบว่าคนนี้ใช้งานได้ บรรทัดที่สองทำเช่นเดียวกันกับไฟล์ /etc/cron.deny เพื่อระบุชื่อ rod ว่าห้ามใช้งาน
ผลลัพธ์คือผู้ใช้ rose จะสามารถเรียกใช้คำสั่ง crontab -e เพื่อแก้ไขตารางเวลาได้ตามปกติ ส่วนผู้ใช้ rod เมื่อพยายามเรียกใช้งาน ระบบจะตอบกลับมาว่าไม่ได้รับอนุญาตให้เข้าถึงโปรแกรมนี้
การทดสอบว่าตั้งค่าสำเร็จหรือไม่
หลังจากตั้งค่าเสร็จแล้ว เราต้องตรวจสอบให้แน่ใจว่าระบบทำงานตามที่เราต้องการจริงๆ เพราะถ้าเราตั้งค่าพลาดอาจทำให้คนสำคัญทำงานไม่ได้ หรือเปิดช่องให้คนที่ไม่ควรเข้าถึงเข้ามาใช้งานได้
เราจะใช้คำสั่ง su (คำสั่งเปลี่ยนผู้ใช้งาน) เพื่อจำลองการเป็นผู้ใช้คนนั้นๆ แล้วลองสั่งให้ระบบแสดงรายการงานที่ตั้งไว้ หากการตั้งค่าถูกต้อง ผลลัพธ์ที่ได้รับจะแตกต่างกันตามสิทธิ์ที่ได้รับ
การทำแบบนี้ช่วยให้เรามั่นใจว่าความปลอดภัยของระบบเป็นไปตามมาตรฐานที่วางไว้ และลดความเสี่ยงที่อาจเกิดขึ้นจากการตั้งเวลาทำงานอัตโนมัติที่ไม่ได้รับอนุญาต
# ทดสอบว่าเป็น rose แล้วดูรายการงาน
su - rose -c "crontab -l"
# ทดสอบว่าเป็น rod แล้วดูรายการงาน
su - rod -c "crontab -l"
บรรทัดแรกคือการเปลี่ยนเป็นผู้ใช้ rose ชั่วคราวเพื่อรันคำสั่ง crontab -l (คำสั่งดูรายการงานที่ตั้งไว้) บรรทัดที่สองทำแบบเดียวกันกับ rod เพื่อดูผลการบล็อก
สำหรับ rose ถ้ายังไม่มีงานจะขึ้นว่า "no crontab for rose" ซึ่งถือว่าใช้งานได้ปกติ แต่สำหรับ rod จะต้องขึ้นข้อความเตือนว่า "You (rod) are not allowed to use this program" ซึ่งแสดงว่าการจำกัดสิทธิ์สำเร็จแล้ว
ข้อควรระวังและจุดที่มือใหม่มักพลาด
จุดที่มือใหม่พลาดบ่อยที่สุดคือการลืมไปว่า cron.allow มีอำนาจเหนือกว่า cron.deny เสมอ หากคุณใส่ชื่อคนไว้ในทั้งสองไฟล์ ระบบจะยึดตาม cron.allow เป็นหลักและอนุญาตให้คนนั้นใช้งานได้
อีกเรื่องคือสิทธิ์การเข้าถึงไฟล์ (Permission) ถ้าไฟล์ /etc/cron.allow ถูกตั้งค่าให้คนอื่นแก้ไขได้ ระบบอาจมองว่าไม่ปลอดภัยและเพิกเฉยต่อไฟล์นั้น ทำให้ทุกคนกลับมาใช้งานได้เหมือนเดิมโดยไม่ตั้งใจ
แนะนำให้ตรวจสอบไฟล์ด้วยคำสั่ง ls -la เสมอเพื่อให้แน่ใจว่าไฟล์เป็นของ root และมีสิทธิ์การอ่านเขียนที่ถูกต้อง อย่าลืมว่าถ้าไฟล์ cron.allow หายไป ระบบจะกลับไปใช้ค่าเริ่มต้นที่อนุญาตให้ทุกคนใช้งานได้ทันที
สรุปการนำไปใช้งานจริง
การจำกัดสิทธิ์ Crontab เป็นเรื่องของระเบียบวินัยในการจัดการเซิร์ฟเวอร์ เมื่อคุณต้องดูแลโปรเจกต์ที่มีผู้ใช้งานหลายคน การป้องกันไม่ให้คนอื่นรันสคริปต์แปลกปลอมจะช่วยให้ระบบของคุณมีเสถียรภาพมากขึ้น
ลองนึกภาพว่าคุณกำลังดูแลเซิร์ฟเวอร์ของบริษัทที่มีทีมงาน 5 คน แต่มีเพียงแค่คุณและหัวหน้าทีมที่ควรจะแก้ไขเวลาทำงานของระบบได้ การใช้วิธีนี้จะทำให้คุณนอนหลับได้สนิทขึ้น เพราะรู้ว่าไม่มีใครแอบมาแก้ไขงานอัตโนมัติของคุณได้
การบริหารจัดการสิทธิ์คือหัวใจสำคัญของโปรแกรมเมอร์มืออาชีพ ไม่ว่าจะเป็นเรื่องของโค้ดหรือระบบปฏิบัติการ การเข้าใจจุดนี้จะทำให้คุณก้าวจากคนที่เขียนโค้ดได้ มาเป็นคนที่ดูแลระบบได้อย่างมั่นใจครับ
ที่มา: Restrict Cron Access — DEV Community