Şifremi tekrar tekrar yazmak zorunda kalmadan SSH pub anahtarımı bir sunucu listesine nasıl dağıtabilirim?


26

Kısa süre önce bir sunucu listesine kullanıcı adı / şifre erişimi verildi ve SSH ortak anahtarımı bu sunuculara yaymak istedim, böylece daha kolay giriş yapabilirim.

Böylece açık:

  • Bunu otomatikleştirmek için kullanabileceğim uzak sunucularda önceden var olan hiçbir ortak anahtar yok
  • Bu, ilk kez bu sunuculara giriş yaptığım zamandır ve onlara erişmek için kimlik bilgilerimi sürekli girmek zorunda kalmak istemem
  • Ben ssh-copy-idde bir for döngüsü kullanarak şifremi tekrar tekrar yazmak istemiyorum .

1
Tüm sunucular için aynı kullanıcı adı ve şifre mi?
roaima

@roaima - evet! Bu ayrıntı beni de şaşırttı, ama bu özel veri merkezi kurulumları ve işlerini bu şekilde yapıyorlar.
slm

@ ott-- - Q’yu iki kez kontrol edin. ssh-copy-idParolamı tekrar tekrar pompalamak için açıkça bir döngü yapmak istemediğimi açıkça belirtiyorum .
slm


2
Bu config yönetimi için mükemmel bir kullanım durumudur. Kuklaya, aşçıya, tuza veya tuza bak.
Spuder

Yanıtlar:


31

Aksine tip daha şifreniz birden çok kez sen yararlanabilir psshve -Abir kez bunun için istemi anahtarı ve sonra listedeki tüm sunuculara şifreyi beslenirler.

NOT: Bu yöntemi kullanmak ssh-copy-id, kullanmanıza izin vermez , bu nedenle, SSH pub anahtar dosyanızı uzak hesabınızın dosyasına eklemek için kendi yönteminizi kullanmanız gerekir ~/.ssh/authorized_keys.

Örnek

İşte işi yapan bir örnek:

$ cat ~/.ssh/my_id_rsa.pub                    \
    | pssh -h ips.txt -l remoteuser -A -I -i  \
    '                                         \
      umask 077;                              \
      mkdir -p ~/.ssh;                        \
      afile=~/.ssh/authorized_keys;           \
      cat - >> $afile;                        \
      sort -u $afile -o $afile                \
    '
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7

Yukarıdaki komut dosyası genellikle şöyle yapılandırılmıştır:

$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'

Yüksek seviye psshdetaylar

  • cat <pubkey> ortak anahtar dosyasını çıktılar pssh
  • pssh-ISTDIN üzerinden veri almak için bu anahtarı kullanır
  • -l <remote user> Uzak sunucunun hesabı (IP dosyasındaki sunucularda aynı kullanıcı adına sahip olduğunuzu varsayıyoruz)
  • -Asöyler psshşifreniz ve sonra bağlanır hepsi sunucular için yeniden kullanmak
  • -ipsshherhangi bir çıktının dosyalarda saklamak yerine STDOUT'a göndermesini söyler (varsayılan davranışı)
  • '...cmds to add pubkey...'- bu olan bitenin en zor kısmı, bu yüzden bunu kendi başıma çözeceğim (aşağıya bakınız)

Komutlar uzak sunucularda çalıştırılıyor

psshHer sunucuda çalışacak komutlar şunlardır :

'                                         \
  umask 077;                              \
  mkdir -p ~/.ssh;                        \
  afile=~/.ssh/authorized_keys;           \
  cat - >> $afile;                        \
  sort -u $afile -o $afile                \
'
Sırayla:
  • uzak kullanıcının umask değerini 077 olarak ayarlayın, bu, yaratacağımız herhangi bir dizin veya dosyanın izinlerini buna göre ayarlayacağı şekilde olacaktır:

    $ ls -ld ~/.ssh ~/.ssh/authorized_keys
    drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
    -rw------- 1 remoteuser remoteuser  771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
  • dizini yaratın ~/.sshve zaten varsa, bizi uyarmasını önemsemeyin

  • bir değişken ayarlamak $afileauthorized_keys dosyasına yolu ile
  • cat - >> $afile - STDIN’den girdi alın ve onaylanmış_key dosyası ekleyin
  • sort -u $afile -o $afile - benzersiz olarak legal_keys dosyasını sıralar ve kaydeder

NOT: Bu son bit, aynı sunuculara karşı yukarıdakileri birden çok kez çalıştırdığınız durumu ele almaktır. Bu, pubkey anahtarınızın birden fazla kez eklenmesini engeller.

Tek kenelere dikkat edin!

Ayrıca, tüm bu komutların tekli tırnak içine alınmış olmasına dikkat edin. Bu önemlidir, çünkü $afileuzak sunucuda yürütülene kadar değerlendirilmek istemiyoruz .

'               \
   ..cmds...    \
'

Yukarıdakileri genişlettim, bu yüzden burada okumak daha kolay, ancak genellikle hepsini şöyle tek satırda çalıştırıyorum:

$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'

Bonus malzemesi

Kullanarak psshdosyaları oluşturmak zorunda kalmayı bırakabilir ve ya kullanarak dinamik içerik sunabilir ya -h <(...some command...)da başka birinin psshanahtarlarını kullanarak bir IP listesi oluşturabilirsiniz -H "ip1 ip2 ip3".

Örneğin:

$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...

Yukarıdakiler, dosyamdan bir IP listesi çıkarmak için kullanılabilir ~/.ssh/config. Elbette printfdinamik içerik oluşturmak için de kullanabilirsiniz :

$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....

Örneğin:

$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09

Ayrıca seqbiçimlendirilmiş sayı dizileri oluşturmak için de kullanabilirsiniz !

Referanslar ve benzeri araçlar pssh

psshYukarıda yaptığım gibi kullanmak istemiyorsanız, mevcut başka seçenekler de var.


2
Üç küçük ekleme: (1) psshbir Python betiğidir ve yüklenebilir pip install pssh. (2) Ayrıca üretebilir sshaynı anda çalışan bütün sunucularda tuşları ssh-keygenaracılığıyla pssh. (3) Anahtarları oluşturduktan sonra, tüm halka açık anahtarları bir halkadaki yerel makineye authorized_keyskopyalayarak, ortak bir şekilde birleştirerek ve her makineye kopyalayarak "herkese herkese" anahtarlarını dağıtabilirsiniz . ssh_agent/ ssh_addşifreleri ile yardımcı olabilir.
lcd047

@ lcd047 - teşekkürler, bugün bunları daha sonra A'ya dahil edeceğim!
slm

1
Bence bu senaryo catödülün işe yaramaz kullanımı (eski) için uygun: bir dosyanın içeriğiyle bir boru hattı başlatmak için girişi o dosyadan yeniden yönlendirebilirsiniz.
Marc van Leeuwen

1
@MarcvanLeeuwen - Aynı fikirdeyim ama gelecekteki aramalarla bu anahtarın nasıl geçtiğini net bir şekilde anlayabilen herkes için daha kolay olmasını istedim pssh.
slm

1
@MarcvanLeeuwen: Böyle yaparsan artık işe yaramaz cat ~/.ssh/*.pub | .... Yine de bu durumda istediğiniz ne olabilir veya olmayabilir.
lcd047

7

Alternatif kullanarak xargs, sshpassve ssh-copy-id:

Kimlik bilgilerinizin, credentials.txt biçiminde yaşadığını varsayarsak user:password@server:

$ cat credentials.txt
root:insecure@192.168.0.1
foo:insecure@192.168.0.2
bar:realsecure@192.168.0.3

Yapabilirsin:

tr ':@' '\n' < credentials.txt \
| xargs -L3 sh -c 'sshpass -p $1 ssh-copy-id $0@$2'

Not: Kullanımdan sonra credentials.txt dosyasını kaldırmayı unutmayın !


2
Ve tüm sunucular için aynı kullanıcı adı ve şifre ise, doğrudan doğrudan kod yazabilir ve yalnızca IP Adreslerinin bir listesini okuyabilirsiniz :-)
Falco

6

ClusterSSH size her makinede bir pencere ve tüm pencereleri kontrol etmek için ortak bir pencere sunar.

10 makineden bahsediyorsak bu işe yarayacak. 100 makineden bahsediyorsak, birçok pencere olacak.

ClusterSSH'nin güzelliği, bir makine geri kalanı gibi% 100 değilse, pencereyi tıklamanız ve tüm makinelere tuş vuruşlarını göndermeye geri dönmeden önce yalnızca bu makineye tuş vuruşları göndermenizdir.


6

Ansible'ı kullanmak oldukça basittir. Sadece <USER>gerçek giriş adı ile değiştirin

$ cd /path/to/public/key

$ cat<<END > hosts
  host1.example.com
  10.10.10.10
  END

$ ansible -i hosts all --ask-pass -u <USER> -m authorized_key \
      -a "user=<USER> key='$(cat id_rsa.pub)'"        


-1

Burada iki seçeneğiniz var:

  • Tüm sunucuların IP adreslerini içeren bir dosya oluşturabilir, ardından aşağıdakini yapabilirsiniz.

    while read -r ip;do
      ssh-copy-id -i .ssh/id_rsa.pub $ip
    done < servers.txt

Varsayalım servers.txtki IP / hostnames ile dosya

  • Tüm IP / host adlarınızı bir döngüye koyabilir ve ssh-copy-idaşağıdaki gibi çalışabilirsiniz :

    for i in hostname1 hostname2
      do ssh-copy-id -i .ssh/id_rsa.pub $i
    done

Bu, OP'lerin gereksinimlerine tamamen aykırıdır: "Şifremi ssh-copy-idbir for döngüsü içinde kullanarak tekrar tekrar yazmak da istemiyorum ."
OldTimer

OP fiziksel olarak tüm sunuculara kopyalamaya istekli olmadığı sürece başka bir yol olduğunu sanmıyorum.
Tolga Ozses,
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.