โมดูล Yubico PAM มอบวิธีง่ายๆ ในการผสานรวม YubiKey เข้ากับโครงสร้างพื้นฐานการตรวจสอบสิทธิ์ผู้ใช้ที่มีอยู่ของคุณ PAM ถูกใช้โดย GNU/Linux, Solaris และ Mac OS X สำหรับการตรวจสอบผู้ใช้ และโดยแอปพลิเคชันพิเศษอื่นๆ เช่น NCSA MyProxy
โมดูลนี้ใช้งานได้กับระบบที่มีผู้ใช้หลายราย โหมดการทำงานหลักคือทำการตรวจสอบออนไลน์โดยใช้บริการตรวจสอบความถูกต้องของ YubiKey (เช่น YubiCloud หรือบริการส่วนตัวที่กำหนดค่าโดยใช้พารามิเตอร์ 'urllist')
ในเวอร์ชัน 2.6 การตรวจสอบแบบออฟไลน์ยังทำได้ผ่านการใช้ HMAC-SHA1 Challenge-Response ที่พบใน YubiKey 2.2 และใหม่กว่า สิ่งนี้ได้แนะนำการขึ้นต่อกันของ libykpers-1 จากแพ็คเกจ ykpersonalize ผ่าน --without-cr
เพื่อ configure
เพื่อหลีกเลี่ยงการพึ่งพานี้
ชุมชนการพัฒนาได้รับการประสานงานผ่านหน้าโครงการ GitHub
โครงการนี้ได้รับอนุญาตภายใต้ใบอนุญาต BSD ดูไฟล์ COPYING สำหรับถ้อยคำที่แน่นอน สำหรับช่วงปีลิขสิทธิ์ใดๆ ที่ระบุเป็น YYYY-ZZZZ ในแพ็คเกจนี้ โปรดทราบว่าช่วงดังกล่าวจะระบุทุกๆ ปีในช่วงเวลาปิดนั้น
ข้ามไปยังส่วนถัดไปหากคุณใช้เวอร์ชันแพ็คเกจอย่างเป็นทางการ
คุณสามารถตรวจสอบแหล่งที่มาโดยใช้ Git ด้วยคำสั่งต่อไปนี้:
$ git โคลน https://github.com/Yubico/yubico-pam.git
สิ่งนี้จะสร้างไดเร็กทอรี yubico-pam
ต้องติดตั้ง Autoconf, automake, libtool, asciidoc, xsltproc และ docbook-xsl เพื่อสร้างแผนผังซอร์สที่คอมไพล์ได้
สร้างระบบบิลด์โดยใช้:
$ ซีดี yubico-pam $ autoreconf --install
คุณจะต้องติดตั้ง libykclient (ykclient.h, libykclient.so) และ libpam-dev (security/pam_appl.h, libpam.so) ในทางกลับกันจะต้องมี cURL ซึ่งคุณต้องติดตั้งและ libyubikey
การรับรองความถูกต้องออฟไลน์ Challenge-Response ต้องใช้ libykpers-1 จากโครงการ ybikey-personalization:
การทดสอบตัวเองต้องใช้ Perl พร้อมติดตั้งโมดูล Net::LDAP::Server
ระบบบิลด์ใช้ Autoconf เพื่อตั้งค่าการทำงานของระบบบิลด์:
./กำหนดค่า
ใช้ --without-ldap เพื่อปิดใช้งานการสนับสนุน ldap
จากนั้นสร้างโค้ด รันการทดสอบตัวเอง และติดตั้งไบนารี:
ทำการตรวจสอบการติดตั้ง
มีแพ็คเกจอยู่แล้วใน Fedora/EPEL ของ yubico-pam ที่สามารถติดตั้งได้โดยใช้ yum:
$ sudo yum ติดตั้ง pam_yubico
มี Ubuntu PPA (Personal Package Archive) สำหรับ yubico-pam ที่สามารถติดตั้งได้โดยใช้คำสั่งต่อไปนี้บนแพลตฟอร์ม Ubuntu ที่ทันสมัยพอสมควร:
$ sudo add-apt-repository ppa:yubico/stable $ sudo apt-get อัปเดต $ sudo apt-get ติดตั้ง libpam-yubico
ดูไฟล์ /usr/share/doc/libpam-yubico/README.Debian
หลังการติดตั้ง
yubico-pam และแพ็คเกจ Yubico ที่รองรับมีพอร์ต FreeBSD ที่สอดคล้องกัน ในการติดตั้ง:
$ ซีดี /usr/ports/security/pam_yubico $ ทำให้การติดตั้งสะอาด
ดูบันทึกการกำหนดค่าขั้นสูงได้ที่นี่
ติดตั้งในการตั้งค่า PAM ของคุณโดยเพิ่มบรรทัดลงในไฟล์ที่เหมาะสมใน /etc/pam.d/
:
รับรองความถูกต้องเพียงพอ pam_yubico.so id=[รหัสไคลเอ็นต์ API ของคุณ] ดีบัก
และย้าย pam_yubico.so ไปที่ /lib/security/ (หรือที่ใดก็ตามที่มีโมดูล PAM อยู่ในระบบของคุณ):
mv /usr/local/lib/security/pam_yubico.so /lib/security/
สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสารประกอบโครงการ
พารามิเตอร์โมดูล PAM ที่รองรับคือ:
ไฟล์รับรองความถูกต้อง | เพื่อระบุตำแหน่งของไฟล์ที่เก็บการแมปรหัสโทเค็น YubiKey กับชื่อผู้ใช้ |
รหัส | รหัสไคลเอ็นต์ API ของคุณในเซิร์ฟเวอร์ตรวจสอบ Yubico หากคุณต้องการใช้บริการ YubiCloud เริ่มต้น ไปที่นี่ |
สำคัญ | เพื่อระบุรหัสลูกค้าของคุณในรูปแบบ base64 รหัสไคลเอ็นต์เรียกอีกอย่างว่าคีย์ API และให้ความสมบูรณ์ในการสื่อสารระหว่างไคลเอ็นต์ (คุณ) และเซิร์ฟเวอร์ตรวจสอบความถูกต้อง หากคุณต้องการใช้บริการ YubiCloud เริ่มต้น โปรดไปที่นี่ |
แก้ปัญหา | เพื่อเปิดใช้งานเอาต์พุตการดีบัก |
debug_file | ชื่อไฟล์ที่จะเขียนการดีบัก ไฟล์จะต้องมีอยู่และเป็นไฟล์ปกติ stdout เป็นค่าเริ่มต้น |
โอเคเสมอ | เพื่อเปิดใช้งานความพยายามในการรับรองความถูกต้องทั้งหมดให้สำเร็จ (หรือที่เรียกว่าโหมดการนำเสนอ) |
try_first_pass | ก่อนที่จะแจ้งให้ผู้ใช้ใส่รหัสผ่าน โมดูลจะพยายามใช้รหัสผ่านของโมดูลที่ซ้อนกันก่อนหน้านี้ก่อน ในกรณีที่เป็นไปตามโมดูลนี้เช่นกัน |
use_first_pass | อาร์กิวเมนต์ use_first_pass บังคับให้โมดูลใช้รหัสผ่านโมดูลแบบสแต็กก่อนหน้า และจะไม่แจ้งเตือนผู้ใช้ - หากไม่มีรหัสผ่านหรือรหัสผ่านไม่เหมาะสม ผู้ใช้จะถูกปฏิเสธการเข้าถึง |
เสมอ_พร้อมท์ | หากตั้งค่าไว้ อย่าพยายามค้นหาเพื่อดูว่าผู้ใช้มีการกำหนดค่า YubiKey หรือไม่ แต่ให้ถามไม่ว่าจะอย่างไรก็ตาม สิ่งนี้มีประโยชน์ในกรณีที่เปิดใช้งาน ldap_bind_as_user แต่โมดูลนี้ถูกใช้เพื่ออ่านรหัสผ่านของผู้ใช้ (ในสถานการณ์การตรวจสอบสิทธิ์ YubiKey+OTP) |
ว่างเปล่า | หากตั้งค่าไว้ อย่าล้มเหลวเมื่อไม่มีโทเค็นที่ประกาศสำหรับผู้ใช้ในไฟล์การแมปการให้สิทธิ์หรือใน LDAP ซึ่งสามารถใช้เพื่อทำให้การตรวจสอบสิทธิ์ YubiKey เป็นตัวเลือก เว้นแต่ผู้ใช้จะเชื่อมโยงโทเค็น |
ldap_starttls | หากตั้งค่าไว้ ให้ออกคำสั่ง STARTTLS ไปยังการเชื่อมต่อ LDAP ก่อนที่จะพยายามเชื่อมโยง นี่เป็นการตั้งค่าทั่วไปสำหรับเซิร์ฟเวอร์ที่ฟังเฉพาะพอร์ต 389 แต่ยังต้องใช้ TLS |
ldap_bind_as_user | หากตั้งค่าไว้ ให้ใช้ผู้ใช้ที่เข้าสู่ระบบเพื่อเชื่อมโยงกับ LDAP นี่จะใช้รหัสผ่านที่ผู้ใช้ให้ไว้ผ่าน PAM หากตั้งค่าไว้ จะต้องตั้งค่า ldapdn และ uid_attr ด้วย การเปิดใช้งานสิ่งนี้จะทำให้ 'ldap_bind_user' และ 'ldap_bind_password' ถูกละเว้น |
รายการ URL | รายการเทมเพลต URL ที่จะใช้ สิ่งนี้ถูกกำหนดโดยการเรียก ykclient_set_url_bases รายการควรอยู่ในรูปแบบ: |
URL | ไม่ควรใช้ตัวเลือกนี้ โปรดใช้ตัวเลือกรายการ URL แทน ระบุเทมเพลต URL ที่จะใช้ ซึ่งตั้งค่าโดยการเรียก ybikey_client_set_url_template ซึ่งมีค่าเริ่มต้นเป็น: |
คาปาธ | ระบุเส้นทางที่เก็บใบรับรอง X509 ซึ่งจำเป็นหากใช้ 'https' หรือ 'ldaps' ใน 'url' และ 'ldap_uri' ตามลำดับ |
คาอินโฟ | ตัวเลือกเพื่ออนุญาตให้ใช้บันเดิล CA แทนเส้นทาง |
พร็อกซี | ระบุพร็อกซีเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ตรวจสอบ รูปแบบที่ถูกต้องคือ http://, https://,sock4://,sock4a://,sock5:// หรือsock5h:// Socks5h ขอให้พร็อกซีทำการแก้ไข DNS หากไม่มีการระบุรูปแบบหรือพอร์ต พอร์ตพร็อกซี HTTP 1080 จะถูกนำมาใช้ |
verbose_otp | อาร์กิวเมนต์นี้ใช้เพื่อแสดง OTP (รหัสผ่านครั้งเดียว) เมื่อมีการป้อน เช่น เพื่อเปิดใช้งานเทอร์มินัลสะท้อนของอักขระที่ป้อน คุณไม่ควรใช้สิ่งนี้ หากคุณใช้การตรวจสอบสิทธิ์แบบสองปัจจัย เพราะนั่นจะแสดงรหัสผ่านของคุณบนหน้าจอ สิ่งนี้ต้องการบริการที่ใช้โมดูล PAM เพื่อแสดงฟิลด์ที่กำหนดเอง ตัวเลือกนี้ไม่สามารถใช้กับ OpenSSH ได้ |
ldap_uri | ระบุ URI เซิร์ฟเวอร์ LDAP (เช่น ldap://localhost) |
ldapserver | ระบุโฮสต์เซิร์ฟเวอร์ LDAP (ใช้พอร์ต LDAP เริ่มต้น) เลิกใช้แล้ว ใช้ "ldap_uri" แทน |
ldapdn | ระบุ dn ที่จัดเก็บผู้ใช้ (เช่น ou=users,dc=domain,dc=com) |
ldap_clientcertfile.ldap_clientcertfile | เส้นทางไปยังไฟล์ใบรับรองไคลเอ็นต์ที่จะใช้เมื่อพูดคุยกับเซิร์ฟเวอร์ LDAP โปรดทราบว่าจำเป็นต้องตั้งค่า 'ldap_clientkeyfile' ด้วยเช่นกัน |
ldap_clientkeyfile | เส้นทางไปยังคีย์ที่จะใช้กับใบรับรองไคลเอ็นต์เมื่อพูดคุยกับเซิร์ฟเวอร์ LDAP โปรดทราบว่าจำเป็นต้องตั้งค่า 'ldap_clientcertfile' ด้วยเช่นกัน |
ldap_bind_user | ผู้ใช้พยายามผูก LDAP เป็น |
ldap_bind_password | รหัสผ่านที่จะใช้ในการผูก LDAP |
ldap_filter | ตัวกรอง LDAP ที่จะใช้สำหรับการพยายามค้นหาออบเจ็กต์ที่ถูกต้องใน LDAP ในสตริงนี้ |
ldap_cacertfile | ไฟล์ใบรับรอง CA สำหรับการเชื่อมต่อ LDAP |
user_attr | ระบุแอตทริบิวต์ LDAP ที่ใช้ในการจัดเก็บชื่อผู้ใช้ (เช่น cn) |
yubi_attr | ระบุแอตทริบิวต์ LDAP ที่ใช้จัดเก็บ YubiKey ID |
yubi_attr_prefix | ระบุคำนำหน้าของค่าของแอตทริบิวต์ LDAP ในกรณีของแอตทริบิวต์ทั่วไป ใช้เพื่อจัดเก็บ ID หลายประเภท |
token_id_length | ความยาวของ ID นำหน้า OTP (นี่คือ 12 หากใช้ YubiCloud) |
โหมด | โหมดการทำงาน ใช้ "ไคลเอนต์" สำหรับการตรวจสอบออนไลน์กับบริการตรวจสอบความถูกต้องของ YubiKey เช่น YubiCloud หรือใช้ "การตอบสนองต่อความท้าทาย" สำหรับการตรวจสอบความถูกต้องแบบออฟไลน์โดยใช้ YubiKeys พร้อมการกำหนดค่า HMAC-SHA-1 Challenge-Response ดู man-page ykpamcfg(1) สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการกำหนดค่าการตรวจสอบ Challenge-Response แบบออฟไลน์ |
chalresp_path | ไดเร็กทอรีที่ใช้จัดเก็บไฟล์ท้าทายในกรณีของการกำหนดค่าทั้งระบบ (ตรงกันข้ามกับไฟล์ท้าทายที่เก็บอยู่ในโฮมไดเร็กตอรี่ของผู้ใช้) ตำแหน่งนี้ควรสามารถอ่านและเขียนได้โดย root เท่านั้น โปรดดู |
mysql_server | ชื่อโฮสต์/ที่อยู่ของเซิร์ฟเวอร์ mysql ที่จะใช้สำหรับการแมป |
mysql_port | พอร์ตเครือข่ายของเซิร์ฟเวอร์ mysql |
mysql_user | User สำหรับการเข้าถึงฐานข้อมูล mysql |
mysql_password | รหัสผ่านสำหรับผู้ใช้ mysql |
mysql_database | ฐานข้อมูล mysql ที่จะใช้ |
หากคุณใช้ "debug" คุณอาจพบว่าการสร้างไฟล์บันทึกที่สามารถเขียนได้ทั่วโลกมีประโยชน์:
touch /var/run/pam-debug.log
chmod go+w /var/run/pam-debug.log
บันทึก | โปรดจำไว้ว่า การเข้าถึงระบบทางกายภาพมักจะทำให้สามารถหลบเลี่ยงการควบคุมความปลอดภัยได้ หากผู้โจมตีสามารถเข้าถึงระบบของคุณได้ (เช่น แล็ปท็อปที่เหลืออยู่ในห้องพักของโรงแรม) และสามารถบูตเข้าสู่โหมดผู้ใช้คนเดียวได้ พวกเขาสามารถปิดการใช้งาน yubico-pam ในการกำหนดค่าระบบของคุณได้ |
ต้องทำการแมประหว่างรหัสโทเค็น YubiKey และรหัสผู้ใช้ที่แนบมาด้วย มีสองวิธีในการดำเนินการนี้ ไม่ว่าจะรวมไว้ในไฟล์เดียวหรือทีละไฟล์ โดยที่ผู้ใช้สามารถสร้างการแม็ปในโฮมไดเร็กทอรีของตนได้ หากมีการใช้ไฟล์การแมปการอนุญาตจากส่วนกลาง การแมปโฮมไดเร็กทอรีของผู้ใช้จะไม่ถูกใช้ และสิ่งที่ตรงกันข้ามจะเกิดขึ้นหากใช้การแมปโฮมไดเร็กทอรีของผู้ใช้ ไฟล์การแมปการอนุญาตส่วนกลางจะไม่ถูกใช้
สร้าง /etc/yubikey_mappings
ไฟล์จะต้องมีชื่อผู้ใช้และรหัสโทเค็น YubiKey คั่นด้วยเครื่องหมายทวิภาค (รูปแบบเดียวกับไฟล์ passwd) สำหรับผู้ใช้แต่ละรายที่คุณต้องการอนุญาตให้เข้าสู่ระบบโดยใช้ YubiKey
การแมปควรมีลักษณะเช่นนี้ หนึ่งรายการต่อบรรทัด:
<ชื่อผู้ใช้แรก>:<โทเค็น YubiKey ID1>:<โทเค็น YubiKey ID2>:…. <ชื่อผู้ใช้ที่สอง>:<โทเค็น YubiKey ID3>:<โทเค็น YubiKey ID4>:….
ตอนนี้เพิ่ม authfile=/etc/yubikey_mappings
ลงในบรรทัดการกำหนดค่า PAM ของคุณ ดังนั้นดูเหมือนว่า:
รับรองความถูกต้องเพียงพอ pam_yubico.so id=[รหัสไคลเอ็นต์ API ของคุณ] authfile=/etc/yubikey_mappings
ผู้ใช้แต่ละคนสร้างไฟล์ ~/.yubico/authorized_yubikeys
ภายในโฮมไดเร็กตอรี่ของตน และวางการแมปในไฟล์นั้น โดยไฟล์จะต้องมีบรรทัดเดียวเท่านั้น:
<ชื่อผู้ใช้>:<โทเค็น YubiKey ID1>:<โทเค็น YubiKey ID2>
นี่เป็นแนวคิดเดียวกันกับไฟล์ SSH allowance_keys
คุณสามารถรับรหัสโทเค็น YubiKey ได้หลายวิธี วิธีหนึ่งคือการลบอักขระ 32 ตัวสุดท้ายของ OTP (รหัสผ่านครั้งเดียว) ที่สร้างด้วย YubiKey ของคุณ อีกประการหนึ่งคือการใช้เครื่องคิดเลข modhex
ป้อน YubiKey OTP ของคุณแล้วแปลงรหัสโทเค็น YubiKey ของคุณคือ 12 ตัวอักษรและแสดงรายการเป็น:
Modhex เข้ารหัส: XXXXXXX
ไม่แน่ใจว่าบิตสุดท้ายหมายถึงอะไรใช่ไหม ต่อไปนี้เป็นวิธีรับสำเนา OTP ของคุณ
เปิดเทอร์มินัล
กดปุ่มของ YubiKey มันจะส่งออก OTP ลงในเชลล์:
$ cccccccgklgcvnkcvnnegrnhgrjkhlkfhdkclfncvlgj
bash: cccccccgklgcvnkcvnnegrnhgrjkhlkfhdkclfncvlgj: command not found
สามารถวางลงในหน้า Modhex_Calculator ได้
สิ่งนี้ต้องการให้คุณเปิดใช้งานโมดูล pam โดยเปิด 'debug' เมื่อได้รับแจ้งให้ใส่ YubiKey ให้กดปุ่ม โมดูล pam จะพิมพ์ข้อมูลการดีบัก รวมถึง OTP และ ID ของโทเค็นของคุณไปยังเชลล์ — คัดลอก ID ลงในไฟล์ปรับแต่งของคุณ และคุณควรจะพร้อมใช้งาน
YubiKey สำหรับ `ผู้ใช้ของคุณ': [pam_yubico.c:pam_sm_authenticate(867)] Conv ส่งคืน 44 ไบต์ [pam_yubico.c:pam_sm_authenticate(885)] กำลังข้าม 0 ไบต์แรก ความยาวคือ 44, token_id ตั้งค่าเป็น 12 และโทเค็น OTP จะเป็น 32 เสมอ [pam_yubico.c:pam_sm_authenticate(892)] OTP: ccccccclabcabkhbdncicglfltnukadfoifadfhhhhfe ID: cccccclabcab
ผู้ใช้ที่มี SELinux ในโหมดบังคับใช้ (ค่าเริ่มต้นบน Fedora 17+) อาจประสบปัญหาการเข้าสู่ระบบกับบริการต่างๆ รวมถึงบริการที่ได้รับการตรวจสอบผ่าน polkit-agent-helper-1, sshd และการเข้าสู่ระบบ
นี่เป็นเอกสารใน Red Hat bugzilla รวมถึงวิธีแก้ปัญหาสำหรับ ssh (สามารถสร้างไฟล์ที่เทียบเท่าสำหรับบริการอื่น ๆ ได้) ระบบในโหมด 'อนุญาต' จะสร้างคำเตือน AVC แต่การรับรองความถูกต้องจะสำเร็จ
เพื่อตรวจสอบว่าคุณมี SELinux บังคับใช้หรือไม่รันคำสั่ง sestatus
หากคุณต้องการใช้ YubiKey เพื่อตรวจสอบสิทธิ์คุณในการเข้าสู่ระบบคอนโซล Linux ให้เพิ่มสิ่งต่อไปนี้ที่ด้านบนของ /etc/pam.d/login
:
รับรองความถูกต้องเพียงพอ pam_yubico.so id=[รหัสไคลเอ็นต์ API ของคุณ] ดีบัก
ดูตัวอย่างส่วนขยายสคีมา Active Directory ของ Michael Ludvig สำหรับการจัดเก็บแอตทริบิวต์รหัสสาธารณะ YubiKey / การเชื่อมโยงกับบัญชีผู้ใช้เฉพาะ: https://github.com/mludvig/yubikey-ldap/tree/master/microsoft-schema
สร้างไฟล์ '/etc/pam.d/openvpn':
ต้องมีการรับรองความถูกต้อง pam_yubico.so ldap_uri=ldap://contoso.com debug id=[รหัส API ของคุณ] yubi_attr=YubiKeyID ldapdn=DC=contoso,DC=com ldap_filter=(&(sAMAccountName=%u)(objectClass=user)(memberOf=CN=somegroup,DC=contoso,DC=com)) [ldap_bind_user=CN=binduser,OU=บัญชีบริการ,DC=contoso,DC=com] ldap_bind_password=bind_password try_first_pass ต้องใช้บัญชี pam_yubico.so
สร้างไฟล์ 'openvpn.conf'
ปลั๊กอิน openvpn-plugin-auth-pam.so openvpn