Tüm kimlik dosyalarını otomatik olarak denememek için SSH'yi nasıl yapılandırabilirim?


90

Ssh kimlik dosyalarımı ~ / .ssh / klasörümün içine yerleştiriyorum. Muhtemelen içinde 30 dosya var.

Sunuculara bağlandığımda kullanılacak bir kimlik dosyasını belirleyeceğim.

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

Ancak, bir kimlik dosyası belirtmezsem ve bunun gibi bir şey kullanırsam:

ssh user123@example.com

Hatayı alıyorum

Too many authentication failures for user123

Bunun sebebi, eğer hiçbir kimlik dosyası belirtilmemişse ve ssh kimlik dosyalarını bulabiliyorsa hepsini deneyecek.

Ayrıca düzenleyebileceğimi de biliyorum ~/.ssh/config dosya ve şöyle bir şey belirtin:

Host example.com
PreferredAuthentications keyboard-interactive,password

bu bağlantının bilinen kimlik dosyalarını denemesini önlemek için.

Yani, kimliğimi dosyaları dışına taşıyabilirim ~/.ssh/ dizininde veya config dosyasında kimlik dosyası kimlik doğrulamasını devre dışı bırakmak istediğim her ana bilgisayarı belirtebilirim, ancak SSH'ye varsayılan olarak kimlik dosyalarını aramasını değil satın almasını söylemenin bir yolu var mı? Veya arayacaklarını belirtmek için?


3
Re "Bunun nedeni ..." - kullanımı ssh -v kesin olarak bulmak için.
grawity

Yanıtlar:


84

Kullanabilirsiniz IdentitiesOnly=yes ile birlikte seçenek IdentityFile (görmek ssh_config man sayfası ). Bu şekilde, hangi dosyaları araması gerektiğini belirleyebilirsiniz.

Bu örnekte, ssh sadece ssh_config dosyalarında verilen kimlikleri + komut satırında listelenen 4 kimliği arayın (aracı tarafından sağlanan kimlikleri dikkate alınmayacaktır):

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

Formlar -i ve -o IdentityFile= değiştirilebilir.


7
bir örnek güzel olurdu
rubo77

Öyle değil mi: IdentitiesOnly yes ("=" olmadan)?
Dimitrios Mistriotis

2
@DimitriosMistriotis ssh_config man sayfasına göre, ya kabul edilebilir: 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

76

user76528 adlı kullanıcının kısa cevabı doğru, ancak henüz bu sorunun vardı ve biraz detaylandırmanın yararlı olacağını düşündüm. "Kimlik dosyası yapılandırma seçeneğini neden görmezden geliyorsun?"

Öncelikle, ssh_config içindeki diğer tüm seçeneklerin aksine, ssh ilk kullanmaz IdentityFile bulur. Bunun yerine IdentityFile seçenek, bu dosyayı kullanılan kimliklerin listesine ekler. Birden fazla yığabilirsiniz IdentityFile seçenekler ve ssh istemcisi, hepsini kabul edene veya bağlantıyı reddetmedikçe hepsini deneyecektir.

İkincisi, bir ssh aracısı kullanıyorsanız, ssh_config'in IdentityFile (veya -i) seçeneğinde belirtmemiş olsanız bile, ssh aracıdaki anahtarları otomatik olarak kullanmaya çalışacaktır. Bu almak için ortak bir neden Too many authentication failures for user hata. Kullanmak IdentitiesOnly yes seçeneği bu davranışı devre dışı bırakacaktır.

Birden fazla sisteme birden fazla kullanıcı olarak ssh, koyarak koyarak öneririz IdentitiesOnly yes ssh_config genel bölümünüze yerleştirin ve IdentityFile uygun Ana Bilgisayar alt bölümleri dahilinde.


4
güzel bir şekilde açıkladı, teşekkür ederim. 'IdentitiesOnly' parametresinin ne demek olduğu belli değil. TakeOnlyWhatIExplicitlySpecifyThenFailoverToPassword . Ve görünüşe göre, ./ssh/id_rsa anahtarı hala listelenir.
lImbus

koymak IdentitiesOnly yes ssh_config global bölümünde benim için ne yaptı. Teşekkürler!
jamix

Detaylı yorum için teşekkür ederiz. Eskiden kullandım (newline için '\') Host * \ IdentityFile ~/.ssh/mykey Bir yapılandırma seçeneği olarak ve ilk başta belirli bir site için farklı bir girişe sahip olması garip görünüyordu; Host special \ IdentityFile ~/.ssh/specialkey \ IdentitiesOnly yes tedarik etmeye devam etti mykey yerine specialkey. IdentityFile girişlerinin bir değerlendirme sırasına göre istiflendiğini ve en son tanımlananın kullanılacağını fark edinceye kadar kesinlikle belirsizdi. Çıkarma IdentityFile ~/.ssh/mykey sorunu çözdü ve doğru, tek anahtar kullanıldı.
Ryder

Bunu denemeden önce, farkettim ki git pull/push emirler aracımda yüklü olan her bir kimliği deniyordu. Bir noktada çok fazla anahtarım olana kadar sorun olmadı.
sdkks

17

Genelde böyle yaparım:

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

Seçenekler aşağıdaki gibidir:

  • -o IdentitiesOnly=yes - SSH’ye yalnızca CLI üzerinden sağlanan ve $HOME/.ssh veya ssh-agent ile
  • -F /dev/null - kullanımını engeller $HOME/.ssh/config
  • -i ~/path/to/some_id_rsa - açıkça bağlantı için kullanmak istediğiniz anahtar

Örnek

$ 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$

Yukarıdaki çıktıda dikkat edin ssh yalnızca my_id_rsa CLI üzerinden özel anahtar ve bir sunucuya bağlanmak için onu kullanır.

Özellikle bu bölümler:

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

ve:

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
Teşekkürler, bu tek tam çözüm. Görünüşe göre, -F /dev/null diğer cevaplardaki eksik parça.
leden

9

Çok sayıda anahtarınızın olduğu senaryoda, sürekli olarak "Çok Fazla Kimlik Doğrulama Hatası" hatası ile karşılaşacaksınız. Bir şifreniz varsa ve sadece giriş yapmak için şifreyi kullanmak istiyorsanız, işte bunu nasıl yaptığınız.

SADECE parola doğrulamayı kullanmak ve Genel-anahtar kullanmamak ve biraz yanıltıcı "klavye-etkileşimli" (parola içeren bir üst ayardır) kullanmamak için, komut satırından bunu yapabilirsiniz:

ssh -o PreferredAuthentications=password user@example.com

6

IdentityFile kullanın ancak parola yinelemelerini önlemek için ssh-agent'ı kullanın.

Kullanmanın kabul edilen çözümü IdentitiesOnly yes demek ki, ssh-agent’tan asla yararlanamayacaksınız, bu da anahtarınızı yüklerken parolanız için tekrarlanan istemlerle sonuçlanacaktır.

Kullanmaya devam etmek ssh-agent ve 'Çok fazla kimlik doğrulama hatası' hatasını önlemek için şunu deneyin:

  1. Anahtarları otomatik olarak içine alan etkileşimli konsol başlangıç ​​komut dosyalarını kaldırın ssh-agent.

  2. eklemek AddKeysToAgent yes müşterinizin ssh config için. Bu, ilk bağlandığınızda parola girmenizi ister, ancak anahtarı aracınıza ekleyin.

  3. kullanım ssh-add -D 'çok fazla kimlik doğrulama' hatası aldığınızda. Bu sadece ssh-agent önbelleğinizi 'sıfırlar' (siler). Ardından aynı oturumda tekrar bağlantıyı deneyin. Sizden bir parola istenir ve kabul edildikten sonra ajanınıza eklenir. Temsilcinizde yalnızca bir anahtar bulunduğundan, bağlanmanıza izin verilir. ssh-agent sonra aynı oturum sırasında gelecekteki bağlantılar için hala orada isyan önlemek için orada.

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

Anahtarlığa eklenen anahtarları kabul edecek mi?
vfclists

1

Ssh istemcisi ve ssh-aracı, adı istemciye SSH_AUTH_SOCK ortam değişkeni tarafından belirtilen bir Unix etki alanı soketi üzerinden iletişim kurar (başlangıçta aracı tarafından ayarlanır).

Böylece, müşterinin tek bir çağrılmasının etmeni sorgulamasını önlemek için bu değişken açıkça boş bir dize gibi geçersiz bir şeye ayarlanabilir;

$ SSH_AUTH_SOCK= ssh user@server

Bunun gibi bir müşteri çağrısı, aracıyla iletişim kuramaz ve sunucuya yalnızca ~ / .ssh / dosyasındaki dosyalar veya komut satırında -i kullanarak belirtilen herhangi bir kimliği sunabilir.

debug1: pubkey_prepare: ssh_get_authentication_socket: Connection refused

0

Cevap her zaman oldu (neredeyse):

Host *
PreferredAuthentications keyboard-interactive,password

Benim için çalıştı.


8
Hangi ortak anahtarların kullanılacağı nasıl sınırlandırılacağı sorusu soruldu. Bu cevap, genel anahtar kimlik doğrulamasını tamamen devre dışı bırakır.
chrishiestand

1
Ben + 1'ledim, çünkü cevap verdiğim cevap buydu, teşekkürler @Henry Grebler
matiu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.