ฉันจะกำหนดค่า SSH เพื่อให้ไม่ลองไฟล์ข้อมูลประจำตัวทั้งหมดโดยอัตโนมัติได้อย่างไร


101

ฉันใส่ไฟล์ข้อมูล ssh ไว้ในโฟลเดอร์ ~ / .ssh / ฉันอาจมีไฟล์ประมาณ 30 ไฟล์

เมื่อฉันเชื่อมต่อกับเซิร์ฟเวอร์ฉันจะระบุไฟล์ข้อมูลประจำตัวที่จะใช้กับสิ่งที่ชอบ

ssh -i ~ / .ssh / client1-identity client1@10.1.1.10

อย่างไรก็ตามหากฉันไม่ได้ระบุไฟล์ระบุตัวตนและใช้สิ่งนี้:

ssh user123@example.com

ฉันได้รับข้อผิดพลาด

มีการตรวจสอบสิทธิ์ล้มเหลวมากเกินไปสำหรับ user123

ฉันเข้าใจว่าเป็นเพราะหากไม่มีการระบุไฟล์ข้อมูลประจำตัวและ ssh สามารถค้นหาไฟล์ข้อมูลประจำตัวได้มันจะลองทั้งหมด

ฉันยังเข้าใจว่าฉันสามารถแก้ไข~/.ssh/configไฟล์และระบุสิ่งที่ชอบ:

โฮสต์ example.com
PreferredAuthentications แป้นพิมพ์แบบโต้ตอบรหัสผ่าน

เพื่อป้องกันไม่ให้การเชื่อมต่อนั้นลองใช้ไฟล์ข้อมูลประจำตัวที่รู้จัก

ดังนั้นฉันเดาว่าฉันสามารถย้ายไฟล์ข้อมูลประจำตัวของฉันนอก~/.ssh/ไดเรกทอรีหรือฉันสามารถระบุแต่ละโฮสต์ที่ฉันต้องการปิดการรับรองความถูกต้องของไฟล์ประจำตัวสำหรับไฟล์ config แต่มีวิธีใดที่จะบอกให้ SSH ซื้อค่าเริ่มต้น ไฟล์ตัวตน? หรือเพื่อระบุสิ่งที่มันจะค้นหา?


4
เรื่อง "ฉันเข้าใจว่าเป็นเพราะ ... " - ใช้ssh -vเพื่อหาคำตอบอย่างแน่นอน
grawity

คำตอบ:


101

คุณสามารถใช้IdentitiesOnly=yesตัวเลือกพร้อมกับIdentityFile(ดูssh_config man page ) ด้วยวิธีนี้คุณสามารถระบุไฟล์ที่ควรค้นหา

ในตัวอย่างนี้ SSH จะเพียง แต่มองในตัวตนที่ให้ไว้ในไฟล์ ssh_config + ที่ 4 คนที่ระบุไว้ในบรรทัดคำสั่ง (ตัวตนที่มีให้โดยนายหน้าจะถูกละเว้น):

ssh -o IdentitiesOnly=yes \
    -o IdentityFile=id1.key \
    -o IdentityFile=id2.key \
    -i id3.key \
    -i id4.key \
    user123@example.com

รูปแบบ-iและ-o IdentityFile=สามารถใช้แทนกันได้



1
ไม่ใช่: IdentitiesOnly yes(ไม่มี "=") ใช่ไหม
Dimitrios Mistriotis

3
@DimitriosMistriotis ตามหน้า man ssh_config ก็ยอมรับได้:Configuration options may be separated by whitespace or optional whitespace and exactly one '='; the latter format is useful to avoid the need to quote whitespace when specifying configuration options using the ssh, scp, and sftp -o option.
Nick Anderegg

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

79

คำตอบสั้น ๆ ของ user76528 นั้นถูกต้อง แต่ฉันเพิ่งมีปัญหานี้และคิดว่าการทำอย่างประณีตบางอย่างจะมีประโยชน์ คุณอาจสนใจวิธีนี้หากคุณสงสัยว่า "เหตุใด ssh จึงเพิกเฉยตัวเลือกการกำหนดค่า identityfile ของฉัน"

ประการแรกซึ่งแตกต่างจากตัวเลือกอื่น ๆ ทั้งหมดใน ssh_config, ssh ไม่ได้ใช้ตัวแรกIdentityFileที่พบ แต่IdentityFileตัวเลือกจะเพิ่มไฟล์นั้นลงในรายการตัวตนที่ใช้ คุณอาจสแต็คหลายIdentityFileตัวเลือกและลูกค้า ssh จะลองพวกเขาทั้งหมดจนกว่าเซิร์ฟเวอร์จะยอมรับหนึ่งหรือปฏิเสธการเชื่อมต่อ

ประการที่สองหากคุณใช้ ssh-agent ssh จะพยายามใช้ปุ่มในตัวแทนโดยอัตโนมัติแม้ว่าคุณจะไม่ได้ระบุไว้ในตัวเลือก IdentityFile (หรือ -i) ของ ssh_config นี่เป็นสาเหตุทั่วไปที่คุณอาจได้รับToo many authentication failures for userข้อผิดพลาด การใช้IdentitiesOnly yesตัวเลือกนี้จะปิดการทำงานของพฤติกรรมนี้

หากคุณเป็นผู้ใช้หลายคนต่อหลายระบบฉันขอแนะนำให้ใส่IdentitiesOnly yesในส่วนส่วนกลางของคุณใน ssh_config และนำแต่ละIdentityFileส่วนไว้ในส่วนย่อยของโฮสต์ที่เหมาะสม


5
อธิบายเป็นอย่างดีขอบคุณ มันไม่ได้เป็นที่เห็นได้ชัดว่าพารามิเตอร์ 'IdentitiesOnly' หมายถึงTakeOnlyWhatIExplicitlySpecifyThenFailoverToPassword และเห็นได้ชัดว่าคีย์. / ssh/id_rsa ยังคงอยู่ในรายการ
lImbus

การใส่IdentitiesOnly yesในส่วนส่วนกลางของ ssh_config เป็นสิ่งที่ทำเพื่อฉัน ขอบคุณ!
jamix

1
ขอบคุณสำหรับความคิดเห็นอย่างละเอียด ผมเคยใช้ ( '\' สำหรับการขึ้นบรรทัดใหม่) Host * \ IdentityFile ~/.ssh/mykeyเป็นตัวเลือกการกำหนดค่าและเป็นครั้งแรกมันดูเหมือนแปลกที่มีรายการที่แตกต่างกันสำหรับเว็บไซต์ที่เฉพาะเจาะจงเช่นHost special \ IdentityFile ~/.ssh/specialkey \ IdentitiesOnly yesยังคงจัดหาแทนmykey specialkeyแน่นอนว่ามันไม่ชัดเจนจนกว่าฉันจะรู้ว่า (จากคำตอบของคุณ) ว่ารายการ IdentityFile จะเรียงซ้อนกันในลำดับการประเมินผลและรายการที่กำหนดไว้ล่าสุดจะถูกใช้ การลบการIdentityFile ~/.ssh/mykeyแก้ไขปัญหาและใช้คีย์เดียวที่ถูกต้อง
ไรเดอร์

1
ก่อนที่ฉันจะลองสิ่งนี้ฉันสังเกตเห็นว่าgit pull/pushคำสั่งของฉันกำลังพยายามระบุตัวตนของทุกคนในตัวแทนของฉัน มันไม่เป็นปัญหาจนกระทั่งมาถึงจุดหนึ่งฉันมีกุญแจเยอะ
sdkks

21

โดยทั่วไปแล้วฉันชอบ:

$ ssh -o IdentitiesOnly=yes -F /dev/null -i ~/path/to/some_id_rsa root@server.mydom.com

ตัวเลือกมีดังนี้:

  • -o IdentitiesOnly=yes- บอก SSH ให้ใช้เฉพาะคีย์ที่ให้ผ่าน CLI และไม่มีจาก$HOME/.sshหรือผ่านทาง ssh-agent
  • -F /dev/null - ปิดการใช้งาน $HOME/.ssh/config
  • -i ~/path/to/some_id_rsa - รหัสที่คุณต้องการใช้สำหรับการเชื่อมต่ออย่างชัดเจน

ตัวอย่าง

$ ssh -v -o IdentitiesOnly=yes -F /dev/null -i ~/my_id_rsa root@someserver.mydom.com
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /dev/null
debug1: Connecting to someserver.mydom.com [10.128.12.124] port 22.
debug1: Connection established.
debug1: identity file /Users/sammingolelli/my_id_rsa type 1
debug1: identity file /Users/sammingolelli/my_id_rsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH_5*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA f5:60:30:71:8c:a3:da:a3:fe:b1:6d:0b:20:87:23:e1
debug1: Host 'someserver' is known and matches the RSA host key.
debug1: Found key in /Users/sammingolelli/.ssh/known_hosts:103
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammingolelli/my_id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Authenticated to someserver.mydom.com ([10.128.12.124]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
Last login: Tue Dec  8 19:03:24 2015 from 153.65.219.15
someserver$

โปรดสังเกตในผลลัพธ์ข้างต้นที่sshมีการระบุmy_id_rsaคีย์ส่วนตัวผ่าน CLI เท่านั้นและใช้เพื่อเชื่อมต่อกับ someserver

เฉพาะส่วนเหล่านี้:

debug1: identity file /Users/sammingolelli/my_id_rsa type 1
debug1: identity file /Users/sammingolelli/my_id_rsa-cert type -1

และ:

debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammingolelli/my_id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).

1
ขอบคุณนี่เป็นทางออกที่สมบูรณ์แบบเท่านั้น เห็นได้ชัดว่า-F /dev/nullเป็นชิ้นส่วนที่ขาดหายไปในคำตอบอื่น ๆ
led

10

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

หากต้องการใช้การตรวจสอบรหัสผ่านเท่านั้นและไม่ใช้รหัสสาธารณะและไม่ใช้ "keyboard-interactive" ที่ทำให้เข้าใจผิด (ซึ่งเป็น superset รวมถึงรหัสผ่าน) คุณสามารถทำได้จากบรรทัดคำสั่ง:

ssh -o PreferredAuthentications=password user@example.com

7

ใช้ IdentityFile แต่ให้ใช้ ssh-agent ต่อไปเพื่อหลีกเลี่ยงข้อความรหัสผ่าน Reprompts

โซลูชันที่ได้รับการยอมรับในการใช้IdentitiesOnly yesหมายความว่าคุณจะไม่สามารถใช้ประโยชน์จาก ssh-agent ได้ซึ่งจะส่งผลให้มีข้อความรหัสผ่านซ้ำ ๆ เมื่อใส่รหัสของคุณ

หากต้องการใช้ต่อไปssh-agentและหลีกเลี่ยงข้อผิดพลาด 'การตรวจสอบสิทธิ์ล้มเหลวมากเกินไป' ให้ลองทำดังนี้:

  1. นำสคริปต์คอนโซลเริ่มต้นใด ๆ ssh-agentโต้ตอบที่โหลดคีย์โดยอัตโนมัติใน

  2. เพิ่มAddKeysToAgent yesการกำหนดค่า SSH ของลูกค้าของคุณ สิ่งนี้จะแจ้งให้คุณใส่ข้อความรหัสผ่านในการเชื่อมต่อครั้งแรก แต่จากนั้นเพิ่มรหัสลงในตัวแทนของคุณ

  3. ใช้ssh-add -Dเมื่อคุณได้รับข้อผิดพลาด 'การรับรองความถูกต้องมากเกินไป' นี่เป็นการ 'รีเซ็ต' (ลบ) แคช ssh-agent ของคุณ จากนั้นลองเชื่อมต่ออีกครั้งภายในเซสชันเดียวกัน คุณจะได้รับแจ้งให้ป้อนข้อความรหัสผ่านและเมื่อได้รับการยอมรับจะมีการเพิ่มรหัสผ่านลงในตัวแทนของคุณ เนื่องจากคุณมีคีย์เดียวในตัวแทนของคุณคุณจะได้รับอนุญาตให้เชื่อมต่อ ssh-agent ยังคงมีอยู่สำหรับการเชื่อมต่อในอนาคตในช่วงเซสชั่นเดียวกันเพื่อหลีกเลี่ยง reprompts

    Host ex example.com
       User joe
       HostName example.com
       PreferredAuthentications publickey,password
       IdentityFile /path/to/id_rsa
       AddKeysToAgent yes
    

จะยอมรับกุญแจที่เพิ่มเข้ากับพวงกุญแจหรือไม่
vfclists

2

ไคลเอ็นต์ ssh และการssh-agentสื่อสารผ่านซ็อกเก็ตโดเมน Unix ที่มีชื่อที่ระบุให้กับลูกค้าโดยSSH_AUTH_SOCKตัวแปรสภาพแวดล้อม (ตั้งค่าโดยตัวแทนเมื่อเริ่มต้น)

ดังนั้นเพื่อป้องกันการเรียกใช้ครั้งเดียวของไคลเอนต์จากการสอบถามตัวแทนตัวแปรนี้สามารถตั้งค่าอย่างชัดเจนเป็นสิ่งที่ไม่ถูกต้องเช่นสตริงที่ว่างเปล่า;

$ SSH_AUTH_SOCK= ssh user@server

การเรียกใช้ไคลเอ็นต์เช่นนี้จะล้มเหลวในการสื่อสารกับเอเจนต์และสามารถเสนอตัวตนที่มีให้เป็นไฟล์ใน~/.ssh/หรือที่ระบุในบรรทัดคำสั่งที่ใช้-iกับเซิร์ฟเวอร์

debug1: pubkey_prepare: ssh_get_authentication_socket: Connection refused

นี่คือคำตอบที่ดี มันง่ายและใช้งานได้เมื่อคุณใช้คำสั่งที่ใช้ SSH "ภายใต้ประทุน" เช่น git น่าเสียดายที่ฉันไม่สามารถลงคะแนนมากกว่านี้
rsuarez

1

คุณมีคำตอบตลอด (เกือบ):

Host *
PreferredAuthentications keyboard-interactive,password

ทำงานให้ฉัน


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

1
ฉัน +1 เพราะเป็นคำตอบที่ฉันได้ไปขอบคุณขอบคุณ @Henry Grebler
matiu

1

เพิ่มที่ส่วนท้ายของ~/.ssh/configไฟล์เพื่อป้องกันการใช้คีย์สำหรับเซิร์ฟเวอร์ที่ไม่ใช่ config:

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