Dodaj Keypair do istniejącej instancji EC2

240

Dostałem dostęp do konsoli AWS do konta z uruchomionymi 2 instancjami, których nie mogę zamknąć (w trakcie produkcji). Chciałbym jednak uzyskać dostęp SSH do tych instancji, czy można utworzyć nowy Keypair i zastosować go do instancji, aby móc włączyć SSH? Uzyskanie istniejącego pliku pem dla pary kluczy, w której utworzono instancje, nie jest obecnie opcją.

Jeśli nie jest to możliwe, czy jest jakiś inny sposób, aby dostać się do instancji?

Chris Wagner
źródło
Wypróbowałeś tutaj rozwiązanie: stackoverflow.com/questions/1454629/... ? ssh-addpowinien zrobić to, czego potrzebujesz.
Marc Bollinger
Miło jest nauczyć się funkcji ssh-add, ale to nie pomoże, ponieważ ten użytkownik faktycznie utworzył instancję za pomocą utworzonej pary kluczy. Instancje, o których mówię, zostały utworzone za pomocą innej pary kluczy, do której nie mam dostępu.
Chris Wagner
1
Może lepiej zadaj to pytanie na serverfault.com
Claude Vedovini,
4
Nie można zastosować pary kluczy do działającej instancji.
Rodney Quillo,

Odpowiedzi:

172

Nie można zastosować pary kluczy do działającej instancji. Możesz użyć nowej pary kluczy tylko do uruchomienia nowej instancji.

Aby odzyskać, jeśli jest to AMI rozruchowy EBS, możesz go zatrzymać, zrobić migawkę woluminu. Utwórz na tej podstawie nowy wolumin. I możesz użyć go ponownie, aby uruchomić starą instancję, utworzyć nowy obraz lub odzyskać dane.

Chociaż dane w efemerycznym magazynie zostaną utracone.


Ze względu na popularność tego pytania i odpowiedzi chciałem uchwycić informacje w linku opublikowanym przez Rodneya w jego komentarzu.

Podziękowania dla Erica Hammonda za tę informację .

Naprawianie plików w głównym katalogu EBS wystąpienia EC2

Możesz badać i edytować pliki w głównym woluminie EBS w instancji EC2, nawet jeśli znajdujesz się w katastrofalnej sytuacji, takiej jak:

  • Zgubiłeś klucz ssh lub zapomniałeś hasła
  • Popełniłeś błąd podczas edycji pliku / etc / sudoers i nie możesz już uzyskać dostępu do konta root za pomocą sudo, aby to naprawić
  • Z jakiegoś powodu twoja długo działająca instancja jest zawieszona, nie można się z nią skontaktować i nie uruchamia się poprawnie
  • Musisz odzyskać pliki z instancji, ale nie możesz się do niej dostać

Na fizycznym komputerze siedzącym przy biurku możesz po prostu uruchomić system za pomocą dysku CD lub pamięci USB, zamontować dysk twardy, sprawdzić i naprawić pliki, a następnie ponownie uruchomić komputer, aby wrócić do pracy.

Zdalna instancja EC2 wydaje się jednak odległa i niedostępna, gdy znajdujesz się w jednej z takich sytuacji. Na szczęście AWS zapewnia nam moc i elastyczność umożliwiającą odzyskanie takiego systemu, pod warunkiem, że uruchamiamy instancje rozruchowe EBS, a nie przechowujemy instancję.

Podejście do EC2 jest nieco podobne do rozwiązania fizycznego, ale zamierzamy przenieść i zamontować wadliwy „dysk twardy” (główny wolumin EBS) w innej instancji, naprawić go, a następnie przenieść z powrotem.

W niektórych sytuacjach może być po prostu łatwiej rozpocząć nową instancję EC2 i wyrzucić złą, ale jeśli naprawdę chcesz naprawić swoje pliki, oto podejście, które działało dla wielu:

Ustawiać

Zidentyfikuj oryginalne wystąpienie (A) i wolumin zawierający uszkodzony główny wolumin EBS za pomocą plików, które chcesz wyświetlić i edytować.

instance_a=i-XXXXXXXX

volume=$(ec2-describe-instances $instance_a |
  egrep '^BLOCKDEVICE./dev/sda1' | cut -f3)

Zidentyfikuj drugą instancję EC2 (B), której użyjesz do naprawy plików na oryginalnym woluminie EBS. To wystąpienie musi działać w tej samej strefie dostępności, co wystąpienie A, aby można było do niego dołączyć wolumin EBS. Jeśli nie masz już uruchomionej instancji, uruchom tymczasową.

instance_b=i-YYYYYYYY

Zatrzymaj uszkodzoną instancję A (czekając na jej całkowite zatrzymanie), odłącz główny wolumin EBS od instancji (czekając na jego odłączenie), a następnie podłącz wolumin do instancji B na nieużywanym urządzeniu.

ec2-stop-instances $instance_a
ec2-detach-volume $volume
ec2-attach-volume --instance $instance_b --device /dev/sdj $volume

ssh do instancji B i podłącz wolumin, aby uzyskać dostęp do jego systemu plików.

ssh ...instance b...

sudo mkdir -p 000 /vol-a
sudo mount /dev/sdj /vol-a

Napraw to

W tym momencie cały główny system plików z instancji A jest dostępny do przeglądania i edycji pod / vol-a w instancji B. Na przykład możesz:

  • Umieść poprawne klucze ssh w /vol-a/home/ubuntu/.ssh/authorized_keys
  • Edytuj i napraw / vol-a / etc / sudoers
  • Poszukaj komunikatów o błędach w / vol-a / var / log / syslog
  • Skopiuj ważne pliki z / vol-a /…

Uwaga: Uids w obu instancjach mogą nie być identyczne, więc zachowaj ostrożność, jeśli tworzysz, edytujesz lub kopiujesz pliki należące do użytkowników innych niż root. Na przykład użytkownik mysql w instancji A może mieć ten sam identyfikator UID, co użytkownik postfiksowy w instancji B, co może powodować problemy, jeśli użytkownik wyświetli pliki o jednej nazwie, a następnie przeniesie wolumin z powrotem do A.

Zakończyć

Po zakończeniu i zadowalaniu się plikami w / vol-a, odmontuj system plików (wciąż na instancji B):

sudo umount /vol-a
sudo rmdir /vol-a

Teraz z powrotem w systemie za pomocą ec2-api-tools kontynuuj przenoszenie woluminu EBS z powrotem do jego pierwotnej instancji A i ponownie uruchom instancję:

ec2-detach-volume $volume
ec2-attach-volume --instance $instance_a --device /dev/sda1 $volume
ec2-start-instances $instance_a

Mamy nadzieję, że naprawiłeś problem, instancja A wychodzi dobrze i możesz osiągnąć to, co pierwotnie zamierzałeś zrobić. Jeśli nie, być może będziesz musiał powtarzać te kroki, aż będzie działać.

Uwaga: Jeśli elastyczny adres IP został przypisany do instancji A po jej zatrzymaniu, konieczne będzie ponowne powiązanie go po ponownym uruchomieniu.

Zapamiętaj! Jeśli instancja B została tymczasowo uruchomiona tylko dla tego procesu, nie zapomnij go teraz zakończyć.

Rodney Quillo
źródło
czy możesz nam powiedzieć, jak to zrobić krok po kroku (lub wskazać na to). W moim przypadku mam działającą instancję i muszę się do niej zalogować ze zdalnej lokalizacji, w której nie mam klucza prywatnego.
Jus12
87

Chociaż nie możesz dodać pary kluczy bezpośrednio do działającej instancji EC2, możesz utworzyć użytkownika linux i utworzyć dla niego nową parę kluczy, a następnie użyć go tak, jak w przypadku pary kluczy oryginalnego użytkownika.

W twoim przypadku możesz poprosić właściciela instancji (który go utworzył) o wykonanie następujących czynności. Tak więc właściciel instancji nie musi dzielić się z tobą swoimi kluczami, ale nadal będziesz mógł ssh w tych instancjach. Te kroki zostały pierwotnie opublikowane przez Utkarsh Sengar (alias. @Zengr ) na stronie http://utkarshsengar.com/2011/01/manage-multiple-accounts-on-1-amazon-ec2-instance/ . Wprowadziłem tylko kilka drobnych zmian.

  1. Krok 1: domyślnie zaloguj się użytkownik „ubuntu” :

    $ ssh -i my_orig_key.pem [email protected]
    
  2. Krok 2: Utwórz nowego użytkownika, nazwiemy naszego nowego użytkownika „John” :

    [ubuntu@ip-11-111-111-111 ~]$ sudo adduser john
    

    Ustaw hasło dla „John” przez:

    [ubuntu@ip-11-111-111-111 ~]$ sudo su -
    [root@ip-11-111-111-111 ubuntu]# passwd john
    

    Dodaj „john” do listy sudoer poprzez:

    [root@ip-11-111-111-111 ubuntu]# visudo
    

    .. i dodaj na końcu pliku:

    john   ALL = (ALL)    ALL
    

    W porządku! Utworzono nowego użytkownika, teraz musisz wygenerować plik klucza, który będzie potrzebny do zalogowania, tak jak w kroku 1 my_orin_key.pem.

    Teraz wyjdź i wróć do Ubuntu, bez rootowania.

    [root@ip-11-111-111-111 ubuntu]# exit
    [ubuntu@ip-11-111-111-111 ~]$
    
  3. Krok 3: Tworzenie kluczy publicznego i prywatnego :

    [ubuntu@ip-11-111-111-111 ~]$ su john
    

    Wprowadź hasło utworzone dla „John” w kroku 2. Następnie utwórz parę kluczy. Pamiętaj, że hasło dla pary kluczy powinno mieć co najmniej 4 znaki.

    [john@ip-11-111-111-111 ubuntu]$ cd /home/john/
    [john@ip-11-111-111-111 ~]$ ssh-keygen -b 1024 -f john -t dsa
    [john@ip-11-111-111-111 ~]$ mkdir .ssh
    [john@ip-11-111-111-111 ~]$ chmod 700 .ssh
    [john@ip-11-111-111-111 ~]$ cat john.pub > .ssh/authorized_keys
    [john@ip-11-111-111-111 ~]$ chmod 600 .ssh/authorized_keys
    [john@ip-11-111-111-111 ~]$ sudo chown john:ubuntu .ssh
    

    W powyższym kroku John jest użytkownikiem, który stworzyliśmy, a Ubuntu jest domyślną grupą użytkowników.

    [john@ip-11-111-111-111 ~]$ sudo chown john:ubuntu .ssh/authorized_keys
    
  4. Krok 4: teraz wystarczy pobrać klucz o nazwie „John” . Używam scp do pobierania / wysyłania plików z EC2, oto jak możesz to zrobić.

    Nadal będziesz musiał skopiować plik przy użyciu użytkownika ubuntu , ponieważ masz tylko klucz do tej nazwy użytkownika. Musisz więc przenieść klucz do folderu ubuntu i przesłać go do 777.

    [john@ip-11-111-111-111 ~]$ sudo cp john /home/ubuntu/
    [john@ip-11-111-111-111 ~]$ sudo chmod 777 /home/ubuntu/john
    

    Teraz przejdź do terminala lokalnego komputera, gdzie masz plik my_orig_key.pem i zrób to:

    $ cd ~/.ssh
    $ scp -i my_orig_key.pem [email protected]:/home/ubuntu/john john
    

    Powyższe polecenie skopiuje klucz „John” do bieżącego katalogu roboczego na twoim komputerze lokalnym. Po skopiowaniu klucza na komputer lokalny powinieneś usunąć „/ home / ubuntu / john”, ponieważ jest to klucz prywatny.

    Teraz jeden lokalny komputer chmod john do 600.

    $ chmod 600 john
    
  5. Krok 5: Czas przetestować swój klucz :

    $ ssh -i john [email protected]
    

W ten sposób można skonfigurować wielu użytkowników do korzystania z jednej instancji EC2 !!

Oko
źródło
4
Jest to przydatne, ale jako ostatni krok nie powinieneś również usuwać klucza prywatnego ze zdalnego komputera? W ten sposób inne osoby mające dostęp do instancji nie będą mogły go również skopiować i użyć twojego klucza do zalogowania.
culix
To działa dla mnie. Ale jak mogę stąd przejść do użytkownika ubuntu, ponieważ pliki, nad którymi będę pracował, znajdują się w katalogu użytkowników ubuntu. Zabierze mnie to do grupy użytkowników John. Ubuntu 14.04.4 LTS
olyjosh
To mi nie zadziałało. Dało to nieprawidłowe uprawnienia. Musiałem stworzyć parę kluczy z konsoli ec2, a potem zaczęło działać
Mroczny rycerz
11

Na komputerze lokalnym uruchom polecenie:

ssh-keygen -t rsa -C "SomeAlias"

Po uruchomieniu tego polecenia zostanie wygenerowany plik z rozszerzeniem * .pub. Skopiuj zawartość tego pliku.

Na komputerze Amazon edytuj ~ / .ssh / uprawnione_klucze i wklej zawartość pliku * .pub (i najpierw usuń istniejącą zawartość).

Następnie możesz SSH przy użyciu innego pliku, który został wygenerowany z polecenia ssh-keygen (klucz prywatny).

Dan
źródło
Tak jak wspomniano @Dan, można zmienić dostęp do instancji edytując ten plik, ale nigdy nie będzie można zmienić pary kluczy powiązanych z instancją na poziomie metadanych. Nie zapomnij dodać nazwy pliku .pem na końcu klucza publicznego, np .:ssh-rsa AAAAB3NzaC1yc2EA...DsGt66 my-key-pair
Ricardo Mutti
7

Zdarzyło mi się to wcześniej (nie miałem dostępu do instancji EC2 utworzonej przez kogoś innego, ale miałem dostęp do konsoli internetowej AWS) i blogowałem odpowiedź: http://readystate4.com/2013/04/09/aws-gaining- ssh-access-to-an-ec2-instance-you-lost-access-to /

Zasadniczo możesz odłączyć dysk EBS, podłączyć go do EC2, do którego masz dostęp. Dodaj swój klucz pub SSH do ~ec2-user/.ssh/authorized_keysna tym podłączonym dysku. Następnie umieść go z powrotem w starej instancji EC2. krok po kroku w łączu za pomocą Amazon AMI.

Nie ma potrzeby tworzenia migawek ani tworzenia nowej sklonowanej instancji.

Mauvis Ledford
źródło
6

W moim przypadku wykorzystałem tę dokumentację do skojarzenia pary kluczy z moją instancją Elastic Beanstalk

Ważny

Musisz utworzyć parę kluczy Amazon EC2 i skonfigurować instancje Amazon EC2 wyposażone w elastyczną Beanstalk, aby używać pary kluczy Amazon EC2, zanim będziesz mieć dostęp do instancji Amazon EC2 wyposażonych w elastyczny Beanstalk. Możesz skonfigurować pary kluczy Amazon EC2 za pomocą konsoli zarządzania AWS. Aby uzyskać instrukcje dotyczące tworzenia pary kluczy dla Amazon EC2, zobacz Przewodnik dla początkujących dotyczący elastycznej chmury obliczeniowej Amazon.

Konfigurowanie instancji serwera Amazon EC2 za pomocą Elastic Beanstalk

Kamal Essajidi
źródło
1
Dzięki, @ kamal-essajidi! Dla innych korzystających z EB: gdy masz parę kluczy, możesz dodać ją do Elastic Beanstalk w Konfiguracja> Instancje> Para kluczy EC2.
Scott
4

Możesz po prostu dodać nowy klucz do instancji za pomocą następującego polecenia:

ssh-copy-id -i ~/.ssh/id_rsa.pub domain_alias

Możesz skonfigurować domain_alias w ~ / .ssh config

host domain_alias
  User ubuntu
  Hostname domain.com
  IdentityFile ~/.ssh/ec2.pem
karser
źródło
4

Nie znalazłem łatwego sposobu na dodanie nowej pary kluczy za pomocą konsoli, ale możesz to zrobić ręcznie.

Wystarczy ssh do swojej skrzynki EC2 z istniejącą parą kluczy. Następnie edytuj ~ / .ssh / autoryzowane_klucze i dodaj nowy klucz w nowym wierszu. Wyjdź i ssh przez nową maszynę. Sukces!

ninja123
źródło
3

W środowiskach Elasticbeanstalk można zastosować parę klucz-wartość do działającej instancji, takiej jak ta:

  • Utwórz parę klucz-wartość z EC2 -> Pary kluczy (w zakładce SIEĆ i BEZPIECZEŃSTWO)
  • Przejdź do Elasticbeanstalk i kliknij swoją aplikację
  • Przejdź do strony konfiguracji i zmodyfikuj ustawienia zabezpieczeń
  • Wybierz parę kluczy EC2 i kliknij Zastosuj
  • Kliknij przycisk Potwierdź, aby potwierdzić aktualizację. To zakończy środowisko i zastosuje kluczową wartość do twojego środowiska.
Kerem
źródło
1

Możesz faktycznie dodać parę kluczy poprzez stronę konfiguracji elastycznej fasoli. następnie ponownie uruchamia instancję dla Ciebie i wszystko działa.

Vishwas Vaishnav
źródło