วิธีการบังคับให้ลูกค้า ssh ใช้รหัสผ่านรับรองความถูกต้องเท่านั้น?


375

ถ้าฉันใช้ pubkey auth จากเช่น: Ubuntu 11.04 ฉันจะตั้งค่าไคลเอนต์ ssh ให้ใช้รหัสผ่านเฉพาะการรับรองความถูกต้องกับเซิร์ฟเวอร์ได้อย่างไร? (ต้องการเพียงเพราะการทดสอบรหัสผ่านบนเซิร์ฟเวอร์ที่ฉันเริ่มต้นเข้าสู่ระบบด้วยรหัส)

ฉันพบวิธี:

mv ~/.ssh/id_rsa ~/.ssh/id_rsa.backup
mv ~/.ssh/id_rsa.pub ~/.ssh/id_rsa.pub.backup

และตอนนี้ฉันได้รับพร้อมท์สำหรับรหัสผ่าน แต่มีวิธีการที่เป็นทางการหรือไม่?

คำตอบ:


578

ฉันต้องการสิ่งนี้เมื่อเร็ว ๆ นี้เช่นกันและเกิดขึ้นกับสิ่งนี้:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no example.com

คุณต้องตรวจสอบให้แน่ใจว่าลูกค้าไม่ได้กำหนดค่าให้ไม่อนุญาตการตรวจสอบรหัสผ่าน


4
ฉันต้องการบังคับใช้รหัสผ่านเพื่อให้ปรากฏในสภาพแวดล้อมที่ใช้ Kerberos สำหรับการรับรองความถูกต้องอัตโนมัติและคำสั่งที่คล้ายกันใช้ได้สำหรับฉันในสถานการณ์เฉพาะนั้น: ssh -o GSSAPIAuthentication=no example.com
IllvilJa

21
ดี เท่านั้น-o PubkeyAuthentication=noก็เพียงพอในกรณีของฉัน
mivk

10
เพื่อใช้เป็นแล็ปท็อปเพื่อน osx ฉันต้องใช้: -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no แทน
กุยโด้

4
มันไม่ได้ผลสำหรับฉัน มันคงพูดว่า: สิทธิ์ที่ถูกปฏิเสธ (publickey) และอย่าเสนอพรอมต์รหัสผ่าน
reinierpost

7
@reierierpost อาจเป็นเพราะโฮสต์ ssh ปิดใช้งานPasswordAuthenticationอยู่ อันที่จริงฉันมาที่นี่เพราะฉันต้องการทดสอบว่าการปิดการใช้รหัสผ่านให้ทำงานอย่างถูกต้องในโฮสต์ของฉัน
RubberDuck

169

ฉันได้ค้นพบทางลัดเพื่อจุดประสงค์นี้:

ssh user:@example.com

หมายเหตุเครื่องหมายโคลอน ( :) และรหัสผ่านว่างเปล่าหลังจากนั้น


2
ยังไม่มีเอกสาร อันที่จริงฉันอ่านผ่านซอร์สโค้ดของ OpenSSH ไปแล้วเพื่อประโยชน์ (ขั้นตอนการแยกวิเคราะห์ของมันค่อนข้างจะเป็นความลับและตอนเช้าที่นี่ :)) แรงจูงใจเบื้องต้นของฉัน: ลูกค้าจำนวนมากพร้อมท์ให้ใส่รหัสผ่านหากคุณให้รหัสผ่านที่ว่างเปล่าเช่นmysql -u user -p
Halil Özgür

43
ดูเหมือนว่ามันจะไม่ทำงานอีกต่อไปอย่างน้อยก็ไม่ใช่ในกรณีของฉัน sshไคลเอนต์พยายามสุ่มคีย์ส่วนตัวที่ไม่เกี่ยวข้องเพื่อรับรองความถูกต้องกับเซิร์ฟเวอร์ที่ติดตั้งใหม่และเก็บไว้ในการปฏิเสธเนื่องจากจำนวนสูงสุดของการพยายามเข้าถึงโดยไม่ต้องขอรหัสผ่าน ในการบังคับใช้การพิสูจน์ตัวตนด้วยรหัสผ่านสำหรับการเชื่อมต่อครั้งแรกนี้ฉันต้องใช้-o PreferredAuthentications=passwordไวยากรณ์กลอุบายโคลอนที่ไม่มีผลกระทบที่เห็นได้ชัดเจน ดังนั้นในขณะที่เคล็ดลับนี้อาจจะคุ้มค่าที่จะลองอย่างใดอย่างหนึ่งไม่ควรพึ่งพามันเป็นพฤติกรรมที่สอดคล้องกัน
WhiteWinterWolf

2
@ HalilÖzgür: ข่าวเศร้ามันง่ายมากที่จะจำและพิมพ์;)!
WhiteWinterWolf

3
@ Qualitycuno ในฐานะ WhiteWinterWolf กล่าวว่ามันไม่ทำงานบนบางแพลตฟอร์มอีกต่อไปโชคไม่ดี
Halil Özgür

2
ตรวจสอบให้แน่ใจว่าคุณไม่มี PasswordAuthentication no ในไฟล์ ssh_config ของคุณ!
Braiam

32

เช่นเดียวกับวิธีการโพสต์โดย scoopr คุณสามารถตั้งค่าต่อตัวเลือกโฮสต์ในไฟล์การกำหนดค่าไคลเอนต์ ssh ของคุณ

ใน.sshไดเรกทอรีของคุณสร้างไฟล์ชื่อconfig(หากยังไม่มีอยู่) และตั้งค่าการอนุญาต600คุณสามารถสร้างหัวข้อที่ขึ้นต้นด้วย

host <some hostname or pattern>

จากนั้นตั้งค่าต่อตัวเลือกโฮสต์หลังจากนั้นตัวอย่างเช่น

host bob.specific.foo
user fred

host *.home.example
user billy
port 9191

เพื่อให้คุณสามารถมี

host server.to.test
PubkeyAuthentication=no

ในไฟล์นั้นแล้วเพียงแค่

ssh server.to.test

และตัวเลือกจะถูกหยิบขึ้นมา


ขอบคุณสำหรับคำตอบนี้ ฉันสร้างรายการของฉัน~/.ssh/configและเพิ่มPubkeyAuthentication no
Craig London

2
ใช้งานไม่ได้สำหรับฉัน
reinierpost

11

เมื่อเร็ว ๆ นี้ฉันต้องการสิ่งนี้ แต่ไม่มีตัวเลือกใดทำงานด้านบนssh -vแสดงให้เห็นว่าตัวเลือกบรรทัดคำสั่งที่ส่งผ่าน-oสวิตช์ถูกลบล้างโดยค่าที่ระบุใน~/.ssh/configไฟล์ของฉัน

สิ่งนี้ใช้ได้ผล:

ssh -F /dev/null <username>@<host>

จากsshหน้าคน:

 -F configfile
     Specifies an alternative per-user configuration file.  If a
     configuration file is given on the command line, the system-wide
     configuration file (/etc/ssh/ssh_config) will be ignored. The default 
     for the per-user configuration file is ~/.ssh/config.

ให้เครดิตกับคำตอบนี้: ฉันจะทำให้ ssh ละเว้น. ssh / config ได้อย่างไร


1
สิ่งนี้ไม่ตอบคำถาม คุณสามารถเก็บกุญแจไว้ในตัวแทนได้ตลอดเวลาและวิธีการของคุณจะไม่ป้องกันไม่ให้ลูกค้าใช้งาน
Jakuje

หืมวิธีใดที่จะแก้ไขปัญหานั้นและสิ่งที่ฉันพูดถึงในคำตอบของฉัน
adeelx

2
นอกจากนี้หากคุณมีกุญแจในตำแหน่งมาตรฐาน (ตามคำถาม) พวกมันจะถูกนำมาใช้โดยไม่คำนึงว่าจะมีการกำหนดค่าหรือไม่ ฉันจะไปกับหนึ่งในวิธีการที่กล่าวถึงในคำตอบแรก
Jakuje

ไม่เป็นความจริงมากผมเพิ่งผ่านการทดสอบมันออกมาบน Lubuntu ฉัน 14.04 และแม้ว่าฉันมีคีย์ของฉันในตำแหน่งมาตรฐานคีย์ไม่ได้ใช้ถ้าฉันระบุ~/.ssh/config เอาต์พุตช่วยในกรณีนี้มันแสดงให้เห็นอย่างชัดเจนว่าเนื่องจากฉันมีรายการ catch-all ใน ssh config ของฉันมันเลือกที่จะใช้กุญแจสาธารณะมากกว่าเคารพตัวเลือกที่ส่งผ่านสวิตช์เหมือนในคำตอบเดิม -F /dev/nullssh -v*-o
adeelx

1
ตำแหน่งมาตรฐาน~/.ssh/id_rsaระบุไว้ในหน้าคู่มือ เส้นทางเหล่านี้จะฮาร์ดโค้ดในไคลเอนต์ เพียงให้แน่ใจว่าคุณให้ผู้ใช้ที่ถูกต้องเมื่อทำการทดสอบ
Jakuje

4

ฉันลองคำตอบเหล่านี้สองสามข้อ แต่ssh -vยังคงแสดงกุญแจสาธารณะของฉันดึงออกมาจากไดเรกทอรีบ้านของฉัน อย่างไรก็ตามการระบุไฟล์ข้อมูลปลอมเป็นการหลอกลวงสำหรับฉัน:

ssh -i /dev/null host

ฉันต้องทำเช่นนี้อย่างถาวร (เพื่อหลีกเลี่ยงเซิร์ฟเวอร์ SSH หักในชั้นที่ติด PDU APC - อยู่ไกลห่างจากสิ่งเหล่านี้ถ้าคุณดูแลเกี่ยวกับการรักษาความปลอดภัย - ดังนั้นฉันจบลงด้วยการวางตัวเลือกลงในไฟล์ config ของฉัน:

Host apc1 apc2
KexAlgorithms +diffie-hellman-group1-sha1
IdentityFile /dev/null

2

@scoopr และ @Halil Özgürไม่ได้ผลสำหรับฉัน

สิ่งนี้ใช้ได้กับฉัน:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com

ที่มา: http://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html


13
คำถามเกี่ยวกับการตรวจสอบลูกค้าด้วยรหัสผ่าน คำตอบนี้เกี่ยวกับการตรวจสอบว่าเซิร์ฟเวอร์โฮสต์คีย์ตรงกับหนึ่งในโฮสต์ที่รู้จักหรือไม่ ผลก็คือการตอบคำถามที่แตกต่างกัน
Anigel

2

และต้องแน่ใจว่าไม่มีการBatchMode=yesใช้งานใน. ssh / config ไม่เช่นนั้นคุณจะไม่มีโอกาสได้รับพรอมต์รหัสผ่านแบบโต้ตอบ


0

ฉันอาจจะเป็นคนเดียวในโลกที่มีปัญหานี้ แต่ฉันได้sshจากระบบปฏิบัติการอื่นที่ใช้งาน (choco ssh ใน Windows ใน cygwin shell) ที่เห็นผ่านwhich ssh

ดังนั้นทางออกคือ

 /usr/bin/ssh user@example.com

หมายเหตุเส้นทางเต็ม ฉันทำสิ่งนี้หลังจากฉันทำงานแล้วcyg-get openssh

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