ตัวอย่างโมดูล PAM แสดงให้เห็นถึงการรับรองความถูกต้องแบบสองปัจจัยสำหรับการเข้าสู่ระบบเซิร์ฟเวอร์ผ่าน SSH, OpenVPN ฯลฯ ...
โครงการนี้ไม่ได้เกี่ยวกับการเข้าสู่ระบบ Google, Facebook หรือระบบปัจจัยที่สอง TOTP/HOTP อื่น ๆ แม้ว่าพวกเขาจะแนะนำให้ใช้แอพ Google Authenticator
ระบุรหัสผ่านครั้งเดียวที่ใช้ HMAC (HOTP) ใน RFC 4226 และรหัสผ่านแบบครั้งเดียวตามเวลา (TOTP) ที่ใช้ใน RFC 6238
./bootstrap.sh
./configure
make
sudo make installหากคุณไม่สามารถเข้าถึง "sudo" คุณต้องกลายเป็น "รูท" ด้วยตนเองก่อนที่จะเรียก "ทำให้ติดตั้ง"
เพื่อความปลอดภัยสูงสุดตรวจสอบให้แน่ใจว่ามีการร้องขอทั้งรหัสผ่านและ OTP แม้ว่ารหัสผ่านและ/หรือ OTP นั้นไม่ถูกต้อง ซึ่งหมายความว่า อย่างน้อยที่สุด ของ pam_unix.so (หรือโมดูลอื่น ๆ ที่ใช้ในการตรวจสอบรหัสผ่าน) และ pam_google_authenticator.so ควรตั้งค่าตาม required ไม่ใช่ requisite อาจไม่เจ็บที่จะ required มีทั้งคู่ แต่อาจขึ้นอยู่กับส่วนที่เหลือของการกำหนดค่า PAM ของคุณ
หากคุณใช้ HOTP (ตัวนับตามตามเวลา) ให้เพิ่มตัวเลือก no_increment_hotp เพื่อให้แน่ใจว่าตัวนับไม่เพิ่มขึ้นสำหรับความพยายามที่ล้มเหลว
เพิ่มบรรทัดนี้ในไฟล์กำหนดค่า PAM ของคุณ:
auth required pam_google_authenticator.so no_increment_hotp
เรียกใช้ไบนารี google-authenticator เพื่อสร้างคีย์ลับใหม่ในไดเรกทอรีโฮมไดเรกทอรีของคุณ การตั้งค่าเหล่านี้จะถูกเก็บไว้ใน ~/.google_authenticator
หากระบบของคุณรองรับไลบรารี "libqrencode" คุณจะแสดง QRCode ที่คุณสามารถสแกนได้โดยใช้แอปพลิเคชัน "Google Authenticator" Android
หากระบบของคุณไม่มีไลบรารีนี้คุณสามารถติดตาม URL ที่เอาต์พุต google-authenticator หรือคุณต้องป้อนคีย์ลับตัวอักษรและตัวเลขด้วยตนเองลงในแอปพลิเคชัน Android "Google Authenticator"
ไม่ว่าในกรณีใดหลังจากที่คุณได้เพิ่มคีย์ให้คลิกและโฮลด์จนกว่าเมนูบริบทจะแสดง จากนั้นตรวจสอบว่าค่าการตรวจสอบของคีย์ตรงกับ (คุณลักษณะนี้อาจไม่สามารถใช้ได้ในแอปพลิเคชัน Android ทั้งหมด)
ทุกครั้งที่คุณเข้าสู่ระบบของคุณตอน google-authenticator คุณจะได้รับแจ้งสำหรับรหัส TOTP ของคุณ และรหัสผ่านบัญชี UNIX ปกติของคุณ
ในระหว่างกระบวนการเปิดตัวครั้งแรกคุณอาจพบว่าผู้ใช้บางคนไม่ได้สร้างคีย์ลับ หากคุณยังต้องการให้พวกเขาสามารถเข้าสู่ระบบได้คุณสามารถผ่านตัวเลือก "nullok" ในบรรทัดคำสั่งของโมดูล:
auth required pam_google_authenticator.so nullok
หากระบบของคุณเข้ารหัสไดเรกทอรีบ้านจนกว่าผู้ใช้ของคุณจะป้อนรหัสผ่านคุณจะต้องจัดเรียงรายการในไฟล์การกำหนดค่า PAM เพื่อถอดรหัสไดเรกทอรีโฮม ตำแหน่งที่ไม่ได้มาตรฐาน:
auth required pam_google_authenticator.so secret=/var/unencrypted-home/${USER}/.google_authenticator
จะเป็นตัวเลือกที่เป็นไปได้ ตรวจสอบให้แน่ใจว่าได้ตั้งค่าสิทธิ์ที่เหมาะสม คุณต้องบอกผู้ใช้ของคุณให้ย้ายไฟล์. google_authenticator ไปยังตำแหน่งนี้ด้วยตนเอง
นอกเหนือจาก "$ {user}" ตัวเลือก secret= ยังรับรู้ทั้ง "~" และ ${HOME} เป็นมือสั้นสำหรับไดเรกทอรีบ้านของผู้ใช้
เมื่อใช้ตัวเลือก secret= คุณอาจต้องการตั้งค่าตัวเลือก user= หลังบังคับให้โมดูล PAM เปลี่ยนไปใช้รหัสผู้ใช้ที่มีรหัสฮาร์ดเฉพาะก่อนที่จะทำการดำเนินการไฟล์ใด ๆ เมื่อใช้ตัวเลือก user= คุณจะต้องไม่รวม "~" หรือ "$ {home}" ในชื่อไฟล์
ตัวเลือก user= อาจมีประโยชน์หากคุณต้องการตรวจสอบสิทธิ์ผู้ใช้ที่ไม่มีบัญชี UNIX แบบดั้งเดิมในระบบของคุณ
ดู "ไดเรกทอรีบ้านที่เข้ารหัส" ด้านบน
แทนที่พรอมต์โทเค็นเริ่มต้น หากคุณต้องการรวมช่องว่างไว้ในพรอมต์ให้ห่อข้อโต้แย้งทั้งหมดในวงเล็บเหลี่ยม:
auth required pam_google_authenticator.so [authtok_prompt=Your secret token: ]
บังคับให้โมดูล PAM เปลี่ยนไปใช้รหัสผู้ใช้ที่เข้ารหัสยากก่อนที่จะทำการดำเนินการไฟล์ใด ๆ ใช้กันทั่วไปกับ secret=
ตัวเลือกที่อันตราย!
โดยค่าเริ่มต้นโมดูล PAM ต้องการให้ไฟล์ความลับต้องเป็นเจ้าของการเข้าสู่ระบบของผู้ใช้ใน (หรือหาก user= ระบุไว้เป็นเจ้าของโดยผู้ใช้รายนั้น) ตัวเลือกนี้ปิดใช้งานการตรวจสอบ
ตัวเลือกนี้สามารถใช้เพื่ออนุญาตให้ Daemons ไม่ทำงานเป็นรูทเพื่อยังคงจัดการไฟล์การกำหนดค่าที่ผู้ใช้ไม่ได้เป็นเจ้าของเช่นผู้ใช้เป็นเจ้าของเอง
ตัวเลือกที่อันตราย!
โดยค่าเริ่มต้นโมดูล PAM ต้องการไฟล์ความลับที่จะอ่านได้โดยเจ้าของไฟล์ (โหมด 0600 โดยค่าเริ่มต้น) ในสถานการณ์ที่ใช้โมดูลในการกำหนดค่าที่ไม่ได้รับการกำหนดค่าผู้ดูแลระบบอาจต้องใช้สิทธิ์ไฟล์ที่ผ่อนปรนมากขึ้นหรือการตั้งค่าเฉพาะสำหรับกรณีการใช้งานของพวกเขา
เปิดใช้งานข้อความบันทึก verbose เพิ่มเติมใน syslog
ไคลเอนต์ PAM บางตัวไม่สามารถแจ้งให้ผู้ใช้มากกว่ารหัสผ่าน ในการแก้ไขปัญหานี้โมดูล PAM นี้รองรับการซ้อน หากคุณผ่านตัวเลือก forward_pass คุณสามารถค้นหาโมดูลโมดูล pam_google_authenticator ผู้ใช้สำหรับทั้งรหัสผ่านระบบและรหัสการยืนยันในพรอมต์เดียว จากนั้นส่งต่อรหัสผ่านระบบไปยังโมดูล PAM ถัดไปซึ่งจะต้องกำหนดค่าด้วยตัวเลือก use_first_pass
ในทางกลับกันโมดูล pam_google_authenticator ยังรองรับทั้งตัวเลือก use_first_pass มาตรฐานและตัวเลือก try_first_pass แต่ผู้ใช้ส่วนใหญ่ไม่จำเป็นต้องตั้งค่าเหล่านั้นใน pam_google_authenticator
หากคุณค้นพบว่ารหัส TOTP ของคุณไม่ได้ผลนี่เป็นผลมาจากนาฬิกาบนเซิร์ฟเวอร์ของคุณที่แตกต่างจากอุปกรณ์ Android ของคุณ โมดูล PAM พยายามชดเชยเวลาเบ้ คุณสามารถสอนมันเกี่ยวกับปริมาณความเบ้ที่คุณกำลังประสบอยู่โดยพยายามบันทึกไว้สามครั้งติดต่อกัน ตรวจสอบให้แน่ใจว่าคุณรออายุ 30 (แต่ไม่นาน) เพื่อให้คุณได้รับรหัส TOTP ที่แตกต่างกันสามรหัส
ผู้ดูแลระบบบางคนชอบเวลาที่เบ้ไม่ได้ปรับโดยอัตโนมัติเนื่องจากการทำเช่นนั้นส่งผลให้เกิดการกำหนดค่าระบบที่ปลอดภัยน้อยกว่าเล็กน้อย หากคุณต้องการปิดการใช้งานคุณสามารถทำได้ในบรรทัดคำสั่งโมดูล:
auth required pam_google_authenticator.so noskewadj
อย่าเพิ่มเคาน์เตอร์สำหรับความพยายาม HOTP ที่ล้มเหลว โดยปกติคุณควรตั้งค่าสิ่งนี้ดังนั้นการพยายามรหัสผ่านที่ล้มเหลวโดยผู้โจมตีโดยไม่มีโทเค็นจะไม่ล็อคผู้ใช้ที่ได้รับอนุญาต
อนุญาตให้ผู้ใช้เข้าสู่ระบบโดยไม่มี OTP หากยังไม่ได้ตั้งค่า OTP
PAM ต้องการคำตอบ SUCCESS อย่างน้อยหนึ่งคำตอบจากโมดูลและ nullok ทำให้โมดูลนี้ IGNORE ซึ่งหมายความว่าหากตัวเลือกนี้ถูกใช้อย่างน้อยหนึ่งโมดูลจะต้องประสบ SUCCESS วิธีหนึ่งในการทำเช่นนี้คือการเพิ่ม auth required pam_permit.so ถึงจุดสิ้นสุดของการกำหนดค่า PAM
โดยค่าเริ่มต้นโมดูล PAM จะไม่สะท้อนรหัสการตรวจสอบเมื่อผู้ใช้ป้อน ในบางสถานการณ์ผู้ดูแลระบบอาจต้องการพฤติกรรมที่แตกต่างกัน ผ่านตัวเลือก echo_verification_code ไปยังโมดูลเพื่อเปิดใช้งานเสียงสะท้อน
หากคุณต้องการรหัสการตรวจสอบที่ใช้ตัวนับแทนการใช้เวลาให้ใช้ไบนารี google-authenticator เพื่อสร้างคีย์ลับในไดเรกทอรีโฮมไดเรกทอรีของคุณด้วยตัวเลือกที่เหมาะสม ในโหมดนี้การเบ้นาฬิกาไม่เกี่ยวข้องและตัวเลือกขนาดหน้าต่างตอนนี้ใช้กับจำนวนรหัสที่เกินกว่ารหัสปัจจุบันที่จะได้รับการยอมรับเพื่อลดปัญหาการซิงโครไนซ์
หากมีอยู่และไม่ใช่ศูนย์ให้กำหนดระยะเวลาของเกรซในระหว่างที่จะไม่ร้องขอรหัสการตรวจสอบที่สอง ลองตั้งค่าวินาทีเป็น 86400 เพื่ออนุญาตให้เต็มวันระหว่างการร้องขอรหัส หรือ 3600 เป็นเวลาหนึ่งชั่วโมง
สิ่งนี้ใช้งานได้โดยการเพิ่ม (ที่อยู่ IP, Timestamp) คู่ไปยังไฟล์ความปลอดภัยหลังจากเข้าสู่ระบบการเข้าสู่ระบบครั้งเดียวครั้งเดียวที่ประสบความสำเร็จ มีการติดตามที่อยู่ IP ที่แตกต่างกันสิบรายการเท่านั้น
ตัวเลือกที่อันตราย!
ด้วยตัวเลือกนี้ผู้โจมตีที่มีความสามารถในการกรอกระบบไฟล์ (เซิร์ฟเวอร์น้ำท่วมด้วยคำขอเว็บหรือหากพวกเขามีบัญชีเพียงแค่เติมดิสก์ขึ้น) สามารถบังคับสถานการณ์ที่สามารถนำคำสั่งครั้งเดียวซ้ำได้ ครั้งเดียว ".
โดยค่าเริ่มต้นหากตัวเลือก grace_period ถูกกำหนดโมดูล PAM ต้องใช้พื้นที่ว่างบางส่วนในการจัดเก็บที่อยู่ IP และการประทับเวลาของการเข้าสู่ระบบล่าสุด สามารถป้องกันการเข้าถึงหากเซิร์ฟเวอร์ไม่มีพื้นที่ว่างหรือในกรณีที่มีข้อผิดพลาดในการอัปเดตไฟล์ ด้วยตัวเลือก allow_readonly คุณสามารถเพิกเฉยต่อข้อผิดพลาดใด ๆ ที่อาจเกิดขึ้นได้ระหว่างการอัปเดตไฟล์กำหนดค่า