หยุดไคลเอ็นต์ ssh จากการเสนอกุญแจสาธารณะทั้งหมดที่หาได้หรือไม่


32

เช่นเดียวกับผู้ดูแลระบบส่วนใหญ่ฉันใช้ openssh ตลอดเวลา ฉันมีคีย์ ssh ประมาณโหลฉันชอบที่จะมีคีย์ ssh ที่แตกต่างกันสำหรับแต่ละโฮสต์ อย่างไรก็ตามสิ่งนี้ทำให้เกิดปัญหาเมื่อฉันเชื่อมต่อกับโฮสต์เป็นครั้งแรกและทั้งหมดที่ฉันมีคือรหัสผ่าน ฉันต้องการเพียงแค่เชื่อมต่อกับโฮสต์โดยใช้รหัสผ่านไม่มีคีย์ ssh ในกรณีนี้ อย่างไรก็ตามลูกค้า ssh จะเสนอกุญแจสาธารณะทั้งหมดในของฉัน~/.ssh/(ฉันรู้สิ่งนี้จากการดูผลลัพธ์ของssh -v) เนื่องจากฉันมีจำนวนมากฉันจะถูกตัดการเชื่อมต่อเนื่องจากการรับรองความถูกต้องล้มเหลวมากเกินไป

มีวิธีบอกลูกค้า ssh ของฉันไม่ให้คีย์ ssh ทั้งหมดหรือไม่


2
ทำไมคุณต้องการคีย์ที่แตกต่างกันสำหรับแต่ละโฮสต์ คีย์อาจใช้ร่วมกันข้ามโฮสต์ภายในโดเมนการจัดการเดียว เห็นได้ชัดว่าคุณจะต้องใช้หนึ่งคีย์สำหรับเครื่องทำงานและอีกอันสำหรับเครื่องส่วนตัวของคุณ แต่อะไรคือตรรกะเบื้องหลังการใช้คีย์แยกสำหรับแต่ละเครื่องในที่ทำงาน
Alex Holst

@AlexHolst ฉันใช้กุญแจหลายอัน ฉันมีค่าเริ่มต้นที่เข้ารหัสไว้ (ซึ่งต้องให้ฉันป้อนรหัสผ่าน) สำหรับโครงสร้างพื้นฐานภายใน ฉันมีอีกอันหนึ่งที่ไม่ได้เข้ารหัส (ไม่มีรหัสผ่าน) ซึ่งฉันใช้สำหรับบริการเฉพาะอย่างหนึ่งซึ่งฉันไม่สามารถใช้ตัวแทนหรือต้องการพิมพ์รหัสผ่านทุกนาที ฉันมีคนอื่นสำหรับการเชื่อมต่อที่ไม่ได้เป็นส่วนหนึ่งของโครงสร้างพื้นฐานภายในของเรา มันเป็นวิธีปฏิบัติที่ดีเพราะถึงแม้จะเป็นเรื่องยากสำหรับคนที่จะกู้คืนกุญแจส่วนตัวจากกุญแจสาธารณะ แต่ก็สามารถทำได้ เช่น Debian openssh ข้อผิดพลาดบางอย่างปีที่ผ่านมา ...
Huygens

@Huygens ฉันชอบที่จะเห็นเอกสารการวิเคราะห์ความเสี่ยงของคุณซึ่งทำให้ได้ข้อสรุปที่คุณต้องใช้หลายปุ่ม SSH แต่การมีปุ่มข้อความที่ชัดเจนนั้นใช้ได้ คุณสามารถโพสต์ลิงค์ได้หรือไม่?
Alex Holst

@AlexHolst คุณไม่จำเป็นต้องเป็น "โดยตรง" ก่อนอื่นคำตอบของฉันคือเกี่ยวกับเหตุผลที่มีคู่คีย์หลายคู่ ฉันคิดว่าฉันให้คุณหลาย ๆ หลังจากนั้นเราทุกคนต้องจัดการกับนิสัยใจคอและสิ่งที่ไม่ ฉันมีระบบทดสอบที่ฉันไม่สามารถใช้แอพที่กำลังขุดข้อมูลผ่าน SSH โดยไม่ได้รับแจ้งอย่างต่อเนื่องสำหรับรหัสผ่านที่สำคัญทำให้ซอฟต์แวร์ไม่สามารถใช้งานได้ ดูเหมือนว่าจะเป็นข้อผิดพลาดเนื่องจากรุ่นที่เข้ากันไม่ได้หรือสิ่งที่ไม่ ฉันได้รับอีเมลแจ้งเตือนสำหรับการเข้าสู่ระบบ SSH ใด ๆ และฉันเป็นผู้เดียวที่เข้าสู่กล่องนั้น ดังนั้นความเสี่ยงจึงเป็นที่ยอมรับได้
Huygens

คำตอบ:


31

นี่เป็นพฤติกรรมที่คาดหวังตามหน้า man ของssh_config:

 IdentityFile
         Specifies a file from which the user's DSA, ECDSA or DSA authentica‐
         tion identity is read.  The default is ~/.ssh/identity for protocol
         version 1, and ~/.ssh/id_dsa, ~/.ssh/id_ecdsa and ~/.ssh/id_rsa for
         protocol version 2.  Additionally, any identities represented by the
         authentication agent will be used for authentication.  

         [...]

         It is possible to have multiple identity files specified in configu‐
         ration files; all these identities will be tried in sequence.  Mul‐
         tiple IdentityFile directives will add to the list of identities
         tried (this behaviour differs from that of other configuration
         directives).

โดยทั่วไปการระบุIdentityFiles เพิ่งเพิ่มคีย์ในรายการปัจจุบันที่เอเจนต์ SSH แสดงให้กับลูกค้าแล้ว

ลองลบล้างพฤติกรรมนี้ด้วยสิ่งนี้ที่ด้านล่างของ.ssh/configไฟล์ของคุณ:

Host *
  IdentitiesOnly yes

นอกจากนี้คุณยังสามารถแทนที่การตั้งค่านี้ในระดับโฮสต์เช่น:

Host foo
  User bar
  IdentityFile /path/to/key
  IdentitiesOnly yes

4
นอกจากนี้คุณยังสามารถใช้ssh -o "IdentitiesOnly true" -v -A user@hostสิ่งที่ฉันใช้เพื่อเข้าสู่ระบบที่ไม่มีกุญแจของฉัน แต่ฉันต้องการที่จะนำเสนอการส่งต่อตัวแทน ( -vสำหรับการดีบักแบบ verbose)
eckes

1
@ เครื่องหมายที่เป็นคำแนะนำที่ดี แต่ไม่ควรyes(และไม่ใช่true) ใช่ไหม
aexl

IdentitiesOnlyอาจไม่ได้ช่วยเสมอคุณอาจต้องยกเว้นโฮสต์โดยเฉพาะ ดูsuperuser.com/questions/859661/…
aexl

38

แม้ว่าคนอื่น ๆ จะพูดถึงเรื่องนี้ด้วยโซลูชันที่ใช้การกำหนดค่า แต่ก็มีค่าที่ชี้ให้เห็นว่าคุณสามารถทำได้เพียงครั้งเดียวเท่านั้นในบรรทัดคำสั่งด้วย:

ssh -o 'PubkeyAuthentication no' myhostname.mydomain

3
สมบูรณ์แบบ .. ทางออก IMHO
drAlberT

1
ถูกต้องสิ่งนี้ควรเป็นคำตอบที่ยอมรับได้
JM Becker

11

ทำตามวิธีแก้ปัญหาของ James Sneeringer คุณอาจต้องการตั้งค่า ssh_config ตามบรรทัดของ:

Host *.mycompany.com
  IdentityFile .ssh/id_dsa_mycompany_main

Host *.mycustomer.com
  IdentityFile .ssh/id_dsa_mycustomer

Host *
  RSAAuthentication no #this should be up top, avoid ssh1 at all costs
  PubkeyAuthentication no

หากคุณเชื่อมต่อกับรหัสเฉพาะกับหลาย ๆ เครื่องที่ไม่ได้อยู่ในโดเมนทั่วไปให้พิจารณาให้ CNAME ทั้งหมดใน DNS ของคุณเอง ฉันทำสิ่งนี้กับระบบลูกค้าทั้งหมด


2

เช่นเดียวกับโซลูชันของ user23413 คุณสามารถปิดใช้งานการรับรองความถูกต้องของคีย์สาธารณะทั้งหมดสำหรับโฮสต์เฉพาะ (หรือรูปแบบไวด์การ์ด):

Host *.example.org
RSAAuthentication no        # SSHv1
PubkeyAuthentication no     # SSHv2

-1

หากคุณชี้ไปที่ไฟล์คีย์ที่มี ssh -i / path / to / key มันจะใช้ไฟล์นั้นแม้ว่าจะมีคนอื่นโหลดเข้าสู่เอเจนต์และคุณจะไม่ได้รับแจ้งให้ใส่รหัสผ่าน คุณยังสามารถแก้ไข ~ / .ssh / config และโฆษณาบางอย่างเช่นนี้ ...

โฮสต์ foo.example.com
IdentityFile .ssh / id_rsa_foo.example.com

คุณสามารถทำ ...

โฮสต์ * .example.org
IdentityFile .ssh / id_rsa_example.org


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