พยายามรับ SSH ด้วยรหัสสาธารณะ (ไม่มีรหัสผ่าน) + ตัวตรวจสอบสิทธิ์ Google ทำงานบน Ubuntu 14.04.1


20

ฉันใช้ Ubuntu 14.04.1 (พร้อม OpenSSH 6.6 และ libpam-google-authenticator 20130529-2)

ฉันกำลังพยายามตั้งค่าการเข้าสู่ระบบ SSH โดยที่กุญแจสาธารณะรับรองความถูกต้อง (ไม่มีรหัสผ่าน) และผู้ใช้จะได้รับแจ้งให้ใส่รหัสจาก Authenticator ของ Google

การติดตาม / ปรับคำแนะนำเหล่านี้ทำให้ฉันได้รับพรอมต์รหัสผ่านและพรอมต์ Google Auth:

ฉันติดตั้งแพคเกจแก้ไขไฟล์/etc/ssh/sshd_configและของฉันแล้ว/etc/pam.d/ssh

ใน/etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
AuthenticationMethods  publickey,keyboard-interactive
UsePAM yes

และที่ด้านล่างของ/etc/pam.d/ssh:

auth required pam_google_authenticator.so nullok # (I want to give everyone a chance to set up their 2FA before removing "nullok")

ฉันรู้ว่า PAM นั้นขึ้นอยู่กับคำสั่งซื้อ แต่sshd_configยังใช่ไหม

ผมทำอะไรผิดหรือเปล่า? ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม

คำตอบ:


28

ทำงานได้ดีก่อนอื่น:

apt-get install libpam-google-authenticator

ใน/etc/pam.d/sshdฉันมีการเปลี่ยนแปลง / เพิ่มบรรทัดต่อไปนี้ (ที่ด้านบน):

# @include common-auth
auth required pam_google_authenticator.so

และใน/etc/ssh/sshd_config:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

ทำงานได้ดีและฉันได้รับพรอมต์ "รหัสยืนยัน" หลังจากการตรวจสอบสิทธิ์ด้วยรหัสสาธารณะ ฉันไม่แน่ใจว่าฉันจะอนุญาตให้ใช้การรับรองความถูกต้องด้วยรหัสผ่าน + โทเค็นหรือคีย์ + โทเค็นได้อย่างไรเนื่องจากฉันได้ลบวิธีการตรวจสอบรหัสผ่านอย่างมีประสิทธิภาพจาก PAM

ใช้ Ubuntu 14.04.1 LTS (GNU / Linux 3.8.0-19- ทั่วไป x86_64) กับ ssh -v: OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 ม.ค. 2014


ดังนั้นเพื่อลูกหลานของฉันฉันตระหนักถึงปัญหาของฉัน ฉันพยายามPasswordAuthentication noด้วยเหมือนกัน แต่นั่นไม่ได้ ปัญหาคือ / คือฉันมี / มีControlMaster autoและControlPathคำสั่งในไฟล์ ~ / .ssh / config ฉันต้องการให้แน่ใจว่าฉันไม่ได้ล็อคตัวเองดังนั้นฉันจะเปิดเซสชัน SSH ไว้เสมอ เนื่องจากคอมพิวเตอร์ของฉันจะนำมาใช้ซ้ำฉันจึงเข้ามาโดยไม่ต้องมีระบบขอโทเค็น ฉันทำเครื่องหมายคำตอบของคุณถูกต้องเนื่องจากมีคนติดตามมันจะได้รับการตั้งค่าการทำงานแน่นอน ขอบคุณ!
JT

2
ฉันใช้ CentOS 7. ฉันมีPasswordAuthentication no, ChallengeResponseAuthentication yes, AuthenticationMethods publickey,keyboard-interactiveและในUsePAM yes sshd_configมันตรวจสอบความถูกต้องของคีย์แล้วขอโทเค็น Google Authenticator ของฉันแล้วขอรหัสผ่านของฉันด้วย ทำให้ฉันทำทั้งสามอย่าง - ไม่สามารถข้ามได้ ฉันได้ลองAuthenticationMethods publickey,keyboard-interactive:pamตามที่แนะนำโดย man page แต่นั่นก็ไม่ได้เปลี่ยนแปลงอะไรเลย ความคิดใด ๆ
นิควิลเลียมส์

6
@NickWilliams ฉันมีปัญหาเดียวกัน สิ่งที่แก้ไขได้สำหรับฉันก็คือฉันต้องชื่นชม@include common-authบรรทัดที่คำตอบแสดง ฉันแค่คิดว่ามันเป็นความคิดเห็นสำหรับpam_google_authenticatorบรรทัดใน /etc/pam.d/sshd ในตอนแรก
freb

5
ขอขอบคุณ! โซลูชันของฉันไม่เหมือนกันทุกประการ (ฉันต้องการแสดงความคิดเห็นauth substack password-auth) แต่ความคิดเห็นของคุณแก้ไขปัญหาของฉันได้!
นิควิลเลียมส์


7

ผมจนสามารถที่จะได้รับการทำงานนี้โดยการวางที่ด้านบนของauth [success=done new_authtok_reqd=done default=die] pam_google_authenticator.so nullok/etc/pam.d/sshd

ตามหน้าpam.d man :

  • success=done หมายความว่าหากลงชื่อเข้าใช้ Google Authenticator จะไม่มีการรับรองความถูกต้องอีกต่อไปซึ่งหมายความว่าจะไม่มีการถามรหัสผ่านเพิ่มเติม
  • default=die หมายความว่าหาก Google Authenticator ปฏิเสธการพยายามลงชื่อเข้าใช้การรับรองความถูกต้องจะล้มเหลวทันทีให้ข้ามการแจ้งรหัสผ่าน

ดังนั้นการ[success=done new_authtok_reqd=done default=die]เรียงลำดับของการผสมผสานระหว่างค่าsufficientและrequisiteการควบคุมเนื่องจากเราต้องการพฤติกรรมจากทั้งสอง: ถ้าสำเร็จให้ยุติทันที (เพียงพอ) และหากล้มเหลวก็ยุติทันที (จำเป็น)

โปรดทราบว่าnullokอาร์กิวเมนต์สำหรับ pam_google_authenticator.so หมายความว่าหาก~/.google_authenticatorไม่พบไฟล์สำหรับผู้ใช้การพิสูจน์ตัวตนแบบพับลิกคีย์จะดำเนินการตามปกติ สิ่งนี้มีประโยชน์หากฉันต้องการล็อคบัญชีย่อยของฉันด้วย 2FA เท่านั้น


6

คำตอบของ Linus Kendall ควรทำงานกับระบบเก่า แต่ในเครื่อง Linux รุ่นใหม่มันเป็นปัญหา บนเว็บเซิร์ฟเวอร์ที่ใช้ลินุกซ์ arch ของฉันว่าการกำหนดค่าส่งผลให้ฉันขอรหัสรับรองความถูกต้องและรหัสผ่านของฉันหลังจากได้รับคีย์ ssh ของฉัน (เช่นฉันต้องการทั้งหมด 3)

ทางออกที่ง่ายกว่าที่ป้องกันปัญหานี้และควรทำงานกับทุกระบบคือเปลี่ยนรายการ/etc/pam.d/sshdเป็น:

auth sufficient pam_google_authenticator.so

จากนั้นให้ทำการแก้ไขเดียวกันกับ `` / etc / ssh / sshd` ที่ Linus พูดถึง:

ChallengeResponseAuthentication yes
UsePAM yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no

ที่ควรถามโทเค็นตัวตรวจสอบความถูกต้องของคุณหลังจากเซิร์ฟเวอร์ยอมรับรหัสสาธารณะของคุณ ไม่ควรถามรหัสผ่านของคุณ

หมายเหตุด้านข้างหากคุณต้องการมีบัญชีผู้ใช้ SFTP คุณอาจต้องเลี่ยงผ่านตัวตรวจสอบความถูกต้องของ Google เพื่อให้สามารถใช้งานได้ นี่คือข้อเสนอแนะของวิธีการทำอย่างปลอดภัยโดยใช้คุก SFTP ในetc/ssh/sshd_config:

Subsystem sftp internal-sftp
Match User ftp-user
  PasswordAuthentication yes
  AuthenticationMethods password
  ChrootDirectory /path/to/ftp/dir
  ForceCommand internal-sftp

คุณจะต้องทำการอนุญาตบน / path / to / ftp / dir root เขียนเท่านั้น (เช่น. chown root:root /path/to/ftp/dir, chmod 755 /path/to/ftp/dirผู้ปกครองทั้งหมดข้างบนไดเรกทอรีนั้นยังต้องการสิทธิ์ที่ปลอดภัย. วิธีที่ฉันมักจะทำคือการสร้างไดเรกทอรี chroot /home/shared/user, สร้าง ไดเรกทอรีในนั้น (เช่น 'data') จากนั้นติดตั้งไดเรกทอรีใดที่ฉันต้องการแชร์เช่นนี้sudo mount -o bind /path/to/ftp/dir /home/shared/user/data

หากคุณทำตามขั้นตอนเหล่านี้ทั้งหมดคุณจะมีการเข้าสู่ระบบกุญแจสาธารณะ + google authenticator สำหรับผู้ใช้ ssh ของคุณและบัญชี sftp ที่ป้องกันด้วยรหัสผ่านที่ใช้งานได้สำหรับการถ่ายโอนข้อมูล


มันใช้งานได้ดี และด้วยเหตุผลบางอย่างฉันรู้สึกไม่สบายใจที่จะพูดถึงการตรวจสอบสิทธิ์ทั่วไปนี่จึงเหมาะกว่าโซลูชันของ Linus
ลุคซาปาน

ขอบคุณมาก! เสียคืนดีบัก ssh สงสัยว่าทำไมฉันยังต้องพิมพ์รหัสผ่านหลังจาก pubkey + authcode ……
felix021
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.