วิธีกำหนดค่าและใช้ PAM ใน Linux
Linux-PAM (ย่อมาจาก Pluggable Authentication Modules ซึ่งพัฒนามาจากสถาปัตยกรรม Unix-PAM) เป็นชุดไลบรารีที่ใช้ร่วมกันที่มีประสิทธิภาพซึ่งใช้ในการตรวจสอบสิทธิ์ผู้ใช้กับแอปพลิเคชัน (หรือบริการ) แบบไดนามิก ) ในระบบ Linux
โดยจะรวมโมดูลการตรวจสอบสิทธิ์ระดับต่ำหลายโมดูลเข้ากับ API ระดับสูงที่ให้การสนับสนุนการตรวจสอบสิทธิ์แบบไดนามิกสำหรับแอปพลิเคชัน สิ่งนี้ช่วยให้นักพัฒนาสามารถเขียนแอปพลิเคชันที่ต้องมีการรับรองความถูกต้อง โดยไม่ขึ้นอยู่กับระบบการตรวจสอบความถูกต้องพื้นฐาน
Linux รุ่นใหม่หลายรุ่นรองรับ Linux-PAM (ต่อไปนี้จะเรียกว่า “PAM ”) เป็นค่าเริ่มต้น ในบทความนี้ เราจะอธิบายวิธีกำหนดค่า PAM ขั้นสูงในระบบ Ubuntu และ CentOS
ก่อนที่เราจะดำเนินการต่อไป โปรดทราบว่า:
- ในฐานะผู้ดูแลระบบ สิ่งที่สำคัญที่สุดคือการทำความเข้าใจว่าไฟล์การกำหนดค่า PAM กำหนดการเชื่อมต่อระหว่างแอปพลิเคชัน (บริการ) และโมดูลการรับรองความถูกต้องแบบเสียบได้ (PAM) ที่ทำหน้าที่ตรวจสอบความถูกต้องจริงอย่างไร คุณไม่จำเป็นต้องเข้าใจการทำงานภายในของ PAM
- PAM มีศักยภาพในการเปลี่ยนแปลงความปลอดภัยของระบบ Linux ของคุณอย่างจริงจัง การกำหนดค่าที่ผิดพลาดสามารถปิดการเข้าถึงระบบของคุณได้บางส่วนหรือทั้งหมด ตัวอย่างเช่น การลบไฟล์การกำหนดค่าภายใต้ /etc/pam.d/* โดยไม่ได้ตั้งใจ และ/หรือ /etc/pam.conf อาจทำให้คุณไม่สามารถเข้าถึงไฟล์การกำหนดค่าได้ ระบบของตัวเอง!
วิธีตรวจสอบโปรแกรมโดยคำนึงถึง PAM
หากต้องการใช้งาน PAM แอปพลิเคชัน/โปรแกรมจะต้อง “ทราบ PAM“; จำเป็นต้องเขียนและเรียบเรียงโดยเฉพาะเพื่อใช้ PAM หากต้องการทราบว่าโปรแกรมเป็นแบบ “PAM-aware ” หรือไม่ ให้ตรวจสอบว่าโปรแกรมได้รับการคอมไพล์ด้วยไลบรารี PAM โดยใช้ คำสั่ง ldd หรือไม่
ตัวอย่างเช่น sshd:
sudo ldd /usr/sbin/sshd | grep libpam.so
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007effddbe2000)
วิธีกำหนดค่า PAM ใน Linux
ไฟล์การกำหนดค่าหลักสำหรับ PAM คือ /etc/pam.conf และไดเรกทอรี /etc/pam.d/ มีไฟล์การกำหนดค่า PAM สำหรับ แอปพลิเคชัน/บริการที่รับรู้โดย PAM แต่ละรายการ PAM จะเพิกเฉยต่อไฟล์หากมีไดเร็กทอรีอยู่
ไวยากรณ์สำหรับไฟล์คอนฟิกูเรชันหลักมีดังนี้ ไฟล์นี้ประกอบด้วยรายการกฎที่เขียนในบรรทัดเดียว (คุณสามารถขยายกฎได้โดยใช้อักขระหลีก “\ ”
) และความคิดเห็นจะขึ้นต้นด้วย “# ”
ทำเครื่องหมายและขยายไปยังจุดสิ้นสุดบรรทัดถัดไป
รูปแบบของแต่ละกฎคือการรวบรวมโทเค็นที่คั่นด้วยช่องว่าง (สามรายการแรกไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่) เราจะอธิบายโทเค็นเหล่านี้ในหัวข้อต่อๆ ไป
service type control-flag module module-arguments
ที่ไหน :
- บริการ: ชื่อแอปพลิเคชันจริง
- ประเภท: ประเภทโมดูล/บริบท/อินเทอร์เฟซ
- control-flag: ระบุพฤติกรรมของ PAM-API หากโมดูลล้มเหลวในการทำงานการตรวจสอบสิทธิ์
- โมดูล: ชื่อไฟล์สัมบูรณ์หรือชื่อพาธแบบสัมพันธ์ของ PAM
- โมดูล-อาร์กิวเมนต์: รายการโทเค็นที่คั่นด้วยช่องว่างเพื่อควบคุมการทำงานของโมดูล
ไวยากรณ์ของแต่ละไฟล์ใน /etc/pam.d/ คล้ายกับไวยากรณ์ของไฟล์หลัก และประกอบด้วยบรรทัดในรูปแบบต่อไปนี้:
type control-flag module module-arguments
นี่คือตัวอย่างคำจำกัดความของกฎ (ไม่มีโมดูลอาร์กิวเมนต์) ที่พบในไฟล์ /etc/pam.d/sshd ซึ่งไม่อนุญาตให้เข้าสู่ระบบที่ไม่ใช่รูทเมื่อ /etc/nologin แข็งแกร่ง> มีอยู่:
account required pam_nologin.so
ทำความเข้าใจกลุ่มการจัดการ PAM และแฟล็กควบคุม
งานการตรวจสอบสิทธิ์ PAM จะถูกแยกออกเป็นสี่กลุ่มการจัดการอิสระ กลุ่มเหล่านี้จัดการคำขอบริการแบบจำกัดของผู้ใช้ทั่วไปในด้านต่างๆ
โมดูลเชื่อมโยงกับประเภทกลุ่มการจัดการประเภทใดประเภทหนึ่งต่อไปนี้:
- บัญชี: ให้บริการสำหรับการตรวจสอบบัญชี: รหัสผ่านของผู้ใช้หมดอายุหรือไม่; ผู้ใช้รายนี้ได้รับอนุญาตให้เข้าถึงบริการที่ร้องขอหรือไม่.
- การตรวจสอบสิทธิ์: ตรวจสอบสิทธิ์ผู้ใช้และตั้งค่าข้อมูลรับรองผู้ใช้
- รหัสผ่าน: รับผิดชอบในการอัปเดตรหัสผ่านผู้ใช้และทำงานร่วมกับโมดูลการตรวจสอบสิทธิ์
- เซสชัน: จัดการการดำเนินการที่ดำเนินการเมื่อเริ่มต้นเซสชันและสิ้นสุดเซสชัน
ไฟล์อ็อบเจ็กต์ที่โหลดได้ PAM (โมดูล) จะอยู่ในไดเร็กทอรีต่อไปนี้: /lib/security/ หรือ /lib64/security ขึ้นอยู่กับ สถาปัตยกรรม.
ธงควบคุม ที่สนับสนุนคือ:
- จำเป็น: ความล้มเหลวจะส่งคืนการควบคุมไปยังแอปพลิเคชันทันทีโดยระบุลักษณะของความล้มเหลวของโมดูลแรก
- จำเป็น: โมดูลทั้งหมดเหล่านี้จำเป็นเพื่อให้ libpam คืนความสำเร็จให้กับแอปพลิเคชัน
- เพียงพอ: เนื่องจากโมดูลก่อนหน้านี้ทั้งหมดประสบความสำเร็จ ความสำเร็จของโมดูลนี้จะนำไปสู่การคืนสู่แอปพลิเคชันทันทีและประสบความสำเร็จ (ความล้มเหลวของโมดูลนี้จะถูกละเว้น)
- เป็นทางเลือก: โดยทั่วไปความสำเร็จหรือความล้มเหลวของโมดูลนี้จะไม่ได้รับการบันทึก
นอกเหนือจากคำสำคัญข้างต้นแล้ว ยังมีค่าสถานะควบคุมที่ถูกต้องอีกสองค่า:
- รวมและสแต็กย่อย: รวมบรรทัดทั้งหมดของประเภทที่กำหนดจากไฟล์การกำหนดค่าที่ระบุเป็นอาร์กิวเมนต์ของการควบคุมนี้
วิธีจำกัดการเข้าถึงรูทไปยังบริการ SSH ผ่าน PAM
ตามตัวอย่าง เราจะกำหนดค่าวิธีใช้ PAM เพื่อปิดใช้งานการเข้าถึงระบบของผู้ใช้รูทผ่าน SSH และโปรแกรมเข้าสู่ระบบ ที่นี่ เราต้องการปิดการใช้งานการเข้าถึงระบบของผู้ใช้รูท โดยจำกัดการเข้าถึงการเข้าสู่ระบบและบริการ sshd
เราสามารถใช้โมดูล /lib/security/pam_listfile.so ซึ่งให้ความยืดหยุ่นอย่างมากในการจำกัดสิทธิ์ของบัญชีเฉพาะ เปิดและแก้ไขไฟล์สำหรับบริการเป้าหมายในไดเร็กทอรี /etc/pam.d/ ดังที่แสดง
sudo vim /etc/pam.d/sshd
OR
sudo vim /etc/pam.d/login
เพิ่มกฎนี้ในทั้งสองไฟล์
auth required pam_listfile.so \
onerr=succeed item=user sense=deny file=/etc/ssh/deniedusers
อธิบายโทเค็นในกฎข้างต้น:
- auth: เป็นประเภทโมดูล (หรือบริบท)
- จำเป็น: เป็นธงควบคุมซึ่งหมายความว่าหากใช้โมดูล โมดูลนั้นจะต้องผ่าน ไม่เช่นนั้นผลลัพธ์โดยรวมจะล้มเหลว ไม่ว่าสถานะของโมดูลอื่นจะเป็นอย่างไร
- pam_listfile.so: เป็นโมดูลที่ให้วิธีการปฏิเสธหรืออนุญาตบริการตามไฟล์ที่กำหนดเอง
- onerr=succeed: อาร์กิวเมนต์ของโมดูล
- item=user: อาร์กิวเมนต์ของโมดูลที่ระบุสิ่งที่อยู่ในไฟล์และควรได้รับการตรวจสอบ
- sense=deny: อาร์กิวเมนต์ของโมดูลที่ระบุการดำเนินการที่จะดำเนินการหากพบในไฟล์ หากไม่พบรายการในไฟล์ ระบบจะขอให้ดำเนินการตรงกันข้าม
- file=/etc/ssh/deniedusers: อาร์กิวเมนต์ของโมดูลที่ระบุไฟล์ที่มีหนึ่งรายการต่อบรรทัด
ต่อไป เราต้องสร้างไฟล์ /etc/ssh/deniedusers และเพิ่มชื่อ root ในนั้น:
sudo vim /etc/ssh/deniedusers
บันทึกการเปลี่ยนแปลงและปิดไฟล์ จากนั้นตั้งค่าสิทธิ์ที่จำเป็น:
sudo chmod 600 /etc/ssh/deniedusers
จากนี้ไป กฎข้างต้นจะบอก PAM ให้ศึกษาไฟล์ /etc/ssh/deniedusers และปฏิเสธการเข้าถึง SSH และบริการเข้าสู่ระบบสำหรับผู้ใช้ที่อยู่ในรายการ
วิธีการกำหนดค่า PAM ขั้นสูงใน Linux
หากต้องการเขียนกฎ PAM ที่ซับซ้อนมากขึ้น คุณสามารถใช้ control-flags ที่ถูกต้องในรูปแบบต่อไปนี้:
type [value1=action1 value2=action2 …] module module-arguments
โดยที่ valueN สอดคล้องกับโค้ดส่งคืนจากฟังก์ชันที่เรียกใช้ในโมดูลซึ่งมีการกำหนดบรรทัดไว้ คุณสามารถค้นหาค่าที่รองรับได้จากคู่มือผู้ดูแลระบบ PAM แบบออนไลน์ ค่าพิเศษเป็นค่าเริ่มต้น ซึ่งหมายความว่าค่า N ทั้งหมดไม่ได้กล่าวถึงอย่างชัดเจน
actionN สามารถใช้รูปแบบใดรูปแบบหนึ่งต่อไปนี้:
- ละเว้น: หากใช้การกระทำนี้กับโมดูลจำนวนมาก สถานะการส่งคืนของโมดูลจะไม่สนับสนุนโค้ดส่งคืนที่แอปพลิเคชันได้รับ
- ไม่ดี: บ่งชี้ว่าโค้ดส่งคืนควรถือเป็นตัวบ่งชี้ถึงความล้มเหลวของโมดูล หากโมดูลนี้เป็นโมดูลแรกในสแต็กที่ล้มเหลว ค่าสถานะจะถูกใช้สำหรับค่าของสแต็กทั้งหมด
- ตาย: เทียบเท่ากับแย่ แต่อาจยุติสแต็กโมดูลและ PAM จะกลับสู่แอปพลิเคชันทันที
- ตกลง: นี่เป็นการสั่ง PAM ว่าผู้ดูแลระบบคิดว่าโค้ดส่งคืนนี้ควรมีส่วนสนับสนุนโค้ดส่งคืนของโมดูลเต็มสแต็กโดยตรง
- เสร็จสิ้น: เทียบเท่ากับ ตกลง แต่อาจยุติสแต็กโมดูลและ PAM จะกลับสู่แอปพลิเคชันทันที
- N (จำนวนเต็มที่ไม่ได้ลงนาม): เทียบเท่ากับ ตกลง แต่อาจข้ามโมดูล N ถัดไปในสแต็ก
- รีเซ็ต: การดำเนินการนี้จะล้างหน่วยความจำทั้งหมดของสถานะของโมดูลสแต็ก และรีสตาร์ทด้วยโมดูลสแต็กถัดไป
แต่ละคำหลักทั้งสี่คำ: จำเป็น; จำเป็น; เพียงพอ; และเป็นทางเลือก มีนิพจน์ที่เทียบเท่าในแง่ของไวยากรณ์ [...]
ซึ่งช่วยให้คุณสามารถเขียนกฎที่ซับซ้อนมากขึ้นได้ ดังนี้:
- จำเป็น: [success=ok new_authtok_reqd=ok ละเว้น=ignore default=bad]
- สิ่งที่จำเป็น: [success=ok new_authtok_reqd=ok ละเว้น=ignore default=die]
- เพียงพอ: [success=done new_authtok_reqd=done default=ignore]
- ไม่บังคับ: [success=ok new_authtok_reqd=ok default=ignore]
ต่อไปนี้เป็นตัวอย่างจากระบบ CentOS 7 ที่ทันสมัย ลองพิจารณากฎเหล่านี้จากไฟล์ /etc/pam.d/postlogin PAM:
#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
session [success=1 default=ignore] pam_succeed_if.so service !~ gdm* service !~ su* quiet
session [default=1] pam_lastlog.so nowtmp showfailed
session optional pam_lastlog.so silent noupdate showfailed
นี่คือตัวอย่างการกำหนดค่าจากไฟล์ PAM /etc/pam.d/smartcard-auth:
#%PAM-1.0
This file is auto-generated.
User changes will be destroyed the next time authconfig is run.
auth required pam_env.so
auth [success=done ignore=ignore default=die] pam_pkcs11.so nodebug wait_for_card
auth required pam_deny.so
account required pam_unix.so
account sufficient pam_localuser.so
account sufficient pam_succeed_if.so uid < 1000 quiet
account required pam_permit.so
password required pam_pkcs11.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
สำหรับข้อมูลเพิ่มเติม โปรดดูหน้าคู่มือ pam.d:
man pam.d
สุดท้ายนี้ คำอธิบายที่ครอบคลุมของไวยากรณ์ไฟล์การกำหนดค่าและโมดูล PAM ทั้งหมดมีอยู่ในเอกสารประกอบสำหรับ Linux-PAM
สรุป
PAM เป็น API ระดับสูงที่ทรงพลังซึ่งอนุญาตให้ใช้โปรแกรมที่ต้องอาศัยการตรวจสอบสิทธิ์ผู้ใช้จริงกับแอปพลิเคชันในระบบ Linux มันทรงพลังแต่ท้าทายมากในการทำความเข้าใจและใช้งาน
ในบทความนี้ เราได้อธิบายวิธีกำหนดค่าคุณสมบัติขั้นสูงของ PAM ใน Ubuntu และ CentOS หากคุณมีคำถามหรือความคิดเห็นใดๆ ที่จะแบ่งปัน โปรดใช้แบบฟอร์มคำติชมด้านล่างนี้