ค้นหาเว็บไซต์

วิธีกำหนดค่าและใช้ 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 หากคุณมีคำถามหรือความคิดเห็นใดๆ ที่จะแบ่งปัน โปรดใช้แบบฟอร์มคำติชมด้านล่างนี้