Dosya adına göre ssh-agent'tan kimlik seçin


9

Sorun: 20-30 kadar ssh-agentkimliğim var. Çoğu sunucu kimlik doğrulamasını reddeder Too many failed authentications, çünkü SSH genellikle giriş yapmak için 20 farklı anahtar denememe izin vermez.

Şu anda, her ana bilgisayar için kimlik dosyasını IdentityFileve IdentitiesOnlyyönergesini kullanarak manuel olarak belirtiyorum, böylece SSH çalışan tek bir anahtar dosyasını deneyecek.

Ne yazık ki, orijinal anahtarlar artık kullanılamaz olduğunda bu işlem durur. ssh-add -lher anahtar dosya için doğru yolları bana gösterir ve bu dosyalar içindeki yollarla eşleşir .ssh/config, ancak çalışmaz. Görünüşe göre, SSH girintiyi dosya adına göre değil, ortak anahtar imzasıyla seçer, bu da SSH'nin ortak anahtarı ayıklayabilmesi için orijinal dosyaların kullanılabilir olması gerektiği anlamına gelir.

Bununla birlikte iki tane sorun var:

  • anahtarları tutan flash sürücüyü çıkarır çıkarmaz çalışmayı durdurur
  • anahtar dosyaları uzak ana bilgisayarda bulunmadığından aracı yönlendirmeyi işe yaramaz hale getirir

Elbette, ortak anahtarları kimlik dosyalarımdan çıkarabilir ve bilgisayarımda ve genellikle oturum açtığım her uzak bilgisayarda depolayabilirim. Yine de bu istenen bir çözüm gibi görünmüyor.

İhtiyacım olan şey, SSH'nin içine koyduğum uzak bir ana bilgisayarda bile , doğru anahtarı kullanarak .ssh/configveya geçirerek doğru anahtarı seçebilmem için dosya adına göre ssh- -i /path/to/original/keyagent'dan bir kimlik seçme olasılığıdır . Tam yolu belirtmeme bile gerek kalmadan anahtarları "takma adlandırabilirsem" daha iyi olurdu.


1
Neden birçok ssh kimliğine ihtiyacınız var? Güvenliği ihlal edilmiş bir özel anahtarın tüm hesaplarınıza erişmesini önlemek istiyorsanız, neden hepsini tek bir flash sürücüde tutuyorsunuz? Birden fazla ssh kimliğini yönetmeyle ilgili sorunları ilk kez duymuyorum ama neden ihtiyaç duyulduğunu sorma şansım olmadı.
Dmitri Chubarov

Asla hepsi bir flash sürücüde demedi.
leoluk

3
@DmitriChubarov Birden fazla ssh kimliği için olası bir uygulama authorized_keys, kullanılan anahtara bağlı olarak, doğrudan kabuk erişimine izin vermeden farklı komutlar yürüten bir dosyadır.
Tobias Kienzler

Yanıtlar:


8

Sanırım kendi sorumu cevaplamam gerekecek çünkü dosya adına göre bir kimlik istemenin hiçbir yolu yok gibi görünüyor.

Aracın sahip olduğu .ssh/fingerprintsher anahtar için bir ortak anahtar dosyası oluşturan hızlı ve kirli bir Python komut dosyaları yazdım . Daha sonra kullanarak gizli anahtar içermeyen bu dosyayı belirtebilirim IdentityFileve SSH SSH aracısından doğru kimliği seçer. Mükemmel çalışıyor ve aracıyı istediğim kadar özel anahtar için kullanmama izin veriyor.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Dumps all public keys held by ssh-agent and stores them in ~/.ssh/fingerprints/, so that
they can be identified using the IdentityFile directive.

"""

import sys, os
import stat
import re
import envoy

RE_MATCH_FILENAME = re.compile(r'([^\\/:*?"<>|\r\n]+)\.\w{2,}$', re.IGNORECASE)

if os.getuid() == 0:
    USERNAME = os.environ['SUDO_USER']
else:
    USERNAME = os.environ['USER']

def error(message):
    print "Error:", message
    sys.exit(1)

def main():
    keylist = envoy.run('ssh-add -L').std_out.strip('\n').split('\n')

    if len(keylist) < 1:
        error("SSH-Agent holds no indentities")

    for key in keylist:
        crypto, ckey, name = key.split(' ')
        filename = os.path.join(os.environ['HOME'], '.ssh/fingerprints',
                  RE_MATCH_FILENAME.search(name).group(1)+'.pub')

        with open(filename, 'w') as f:
            print "Writing %s ..." % filename
            f.write(key)

        envoy.run('chmod 600 %s' % filename)
        envoy.run('chown %s %s' % (USERNAME, filename))


if __name__ == '__main__':
    main()

İyi iş, yakında bunu deneyeceğim
Tobias Kienzler

3

Çalıştırmak

ssh-add -L | gawk ' { print $2 > $3 ".pub" } '

tüm ortak anahtar dosyalarını otomatik olarak oluşturmak için uzak makinede (sizin anahtarınızdaki ortak anahtarların .ssh/configadlandırıldığı privateKeyFileName.pubve tutarsız hiçbir yolun olmadığı varsayılırsa). Çağrı chown $USER .ssh/*sizin için sudodurum.


1

Kabul edilen çözümden alıp, ilk sunucuya erişmek için kullanılan kimliği tekrar kullanmak istediğinizi varsayarsak, şöyle bir şey:

Host github.com
    IdentitiesOnly yes
    IdentityFile ~/.ssh/authorized_keys

yeterlidir.


bu benim için işe yaramıyor. Kimlik dosyasında yalnızca bir ortak anahtar varsa - çalışır, ancak birden çok olduğunda çalışmaz.
ygrek
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.