키 쌍 (p1)과 연결된 실행중인 Amazon EC2 Linux 인스턴스가 있고 개인 키를 홈 데스크톱으로 다운로드했습니다. 이제 직장에서 업무용 데스크탑에 키 페어 (p2)를 생성하고 AWS 콘솔을 통해 퍼블릭 키를 Amazon으로 가져 왔습니다.
집에서는 authorized_keys
AMI 인스턴스 (현재 집에서만 액세스 할 수 있음)에 추가 할 키 쌍 p2의 공개 키를 추가하고 싶습니다 . 그러나 p2의 공개 키를 가져 와서 잊어 버렸으므로 Amazon 에서이 공개 키를 어떻게 내보낼 수 있습니까?
답변
좋은 퍼즐, 고마워! 한 가지 답변이 있습니다.
-
키 쌍 p2를 지정하여 새로운 임시 EBS 부팅 t1.micro 인스턴스 A를 시작하십시오. 다른 인스턴스 B가 이미 실행 중이고 액세스 권한이있는 가용 영역을 지정하십시오. (필요한 경우 임시 시작).
-
몇 분 동안 실행 상태에있는 인스턴스 A를 중지 (종료하지 않음)하여 공개 키를 authorized_keys 파일에 저장할 수 있습니다.
-
중지 된 인스턴스 A에서 루트 EBS 볼륨을 분리하십시오. 실행중인 인스턴스 B에 연결하고 마운트하십시오.
-
마운트 된 파일 시스템에서 공개 키를 복사하십시오.
-
EBS 볼륨을 분리하고 삭제하십시오. 임시 인스턴스 A를 종료하십시오.
답변
그러나 올바른 ssh-keygen 명령은 다음과 같습니다.
ssh-keygen -y -f /path/to/privatekey > /path/to/publickey
답변
이미 EBS 볼륨을 사용하여 ssh 공개 키를 얻는 하나의 답변을 제공했지만 공개 키를 콘솔 출력으로 보내는 사용자 데이터 스크립트로 임시 EC2 인스턴스를 시작하여 얻을 수있는 또 다른 방법이 있습니다. 단계는 다음과 같습니다.
다음 코드를 output-ssh-key.userdata
로컬 컴퓨터 의 파일에 저장하십시오 . 이 명령을 로컬로 실행하지 마십시오!
#!/bin/bash -ex
exec> >(tee /var/log/user-data.log|logger -t user -s 2>/dev/console) 2>&1
adminkey=$(GET instance-data/latest/meta-data/public-keys/ |
perl -ne 'print $1 if /^0=[^a-z0-9]*([-.@\w]*)/i')
cat <<EOF
SSHKEY:========================================================================
SSHKEY:HERE IS YOUR PUBLIC SSH KEY FOR KEYPAIR "$adminkey":
SSHKEY:$(cat /home/ubuntu/.ssh/authorized_keys)
SSHKEY:========================================================================
SSHKEY:Halting in 50min ($(date --date='+50 minutes' +"%Y-%m-%d %H:%M UTC"))
EOF
sleep 3000
halt
위 파일을 사용자 데이터 스크립트로 사용하여 스톡 Ubuntu 10.04 LTS 인스턴스를 실행하십시오. 공개 ssh 키를 검색하려는 키 쌍을 지정하십시오.
ec2-run-instances \
--key YOURKEYPAIRHERE \
--instance-type t1.micro \
--instance-initiated-shutdown-behavior terminate \
--user-data-file output-ssh-key.userdata \
ami-ab36fbc2
퍼블릭 ssh 키가 표시 될 때까지 인스턴스에서 콘솔 출력을 계속 요청하십시오. run-instances 명령에서 리턴 된 인스턴스 ID를 지정하십시오.
ec2-get-console-output YOURINSTANCEID | grep SSHKEY: | cut -f3- -d:
2-10 분 안에 다음과 같이 출력됩니다 :
========================================================================
HERE IS YOUR PUBLIC SSH KEY FOR KEYPAIR "erich":
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6rn8cl41CkzaH4ZBhczOJZaR4xBBDI1Kelc2ivzVvCB
THcdJRWpDd5I5hY5W9qke9Tm4fH3KaUVndlcP0ORGvS3PAL4lTpkS4D4goMEFrwMO8BG0NoE8sf2U/7g
aUkdcrDC7jzKYdwleRCI3uibNXiSdeG6RotClAAp7pMflDVp5WjjECDZ+8Jzs2wasdTwQYPhiWSiNcfb
fS97QdtROf0AcoPWElZAgmabaDFBlvvzcqxQRjNp/zbpkFHZBSKp+Sm4+WsRuLu6TDe9lb2Ps0xvBp1F
THlJRUVKP2yeZbVioKnOsXcjLfoJ9TEL7EMnPYinBMIE3kAYw3FzZZFeX3Q== erich
========================================================================
Halting in 50min (2011-12-20 05:58 UTC)
임시 인스턴스는 한 시간 안에 자동으로 종료되지만 실행 비용이 2 센트 이상 청구되지 않도록하려면 직접 종료 할 수 있습니다.
답변
개인 SSH 키가있는 경우 다음 ssh-keygen 명령 을 실행하여 공개 키 구성 요소를 다시 생성 할 수 있습니다 .
ssh-keygen -i -f /path/to/private-key > /path/to/public-key
AWS 콘솔과 API는 EC2 인스턴스를 시작할 때 2 개의 키 페어 푸시를 지원하지 않습니다. 이것은 시스템 관리자가 다른 방법을 통해 수행해야하는 연습입니다.
이미 인증 된 ID 키에 액세스 할 수 있으면 다음 ssh-copy-id 명령을 간단히 수행 할 수 있습니다 .
ssh-copy-id -i /path/to/public-key user@EC2-instance
그러면 지정된 공개 키가 서버와 ~user/.ssh/authorized_keys
파일에 자동으로 복사되어 파일에 대한 적절한 권한이 보장됩니다.
보다 우아한 방법은 구성 관리 프로세스에 추가 ID 키를 포함시키는 것입니다. 필자의 경우 노드 의 Puppet 구성에 추가 키를 추가 해야합니다.
참고로 개인 취향은 있지만 직장과 집 위치에 별도의 키를 포함시키는 것보다 더 나은 SSH 키 관리 방법을 사용합니다. 이전 질문 에서 언급했듯이 사용하는 컴퓨터가 아닌 USB 드라이브에 키를 보관합니다.
답변
또 다른 옵션은 user_data에 루트에 다른 ssh 키를 추가하는 짧은 스크립트를 추가하는 것입니다.
#!/bin/bash
touch ~/.ssh/authorized_keys
chmod 400 ~/.ssh/authorized_keys
echo "<KEY>" >> ~/.ssh/authorized_keys
그런 다음 ssh -l root -i <KEYFILE> URL
ec2_user, ubuntu 사용자의 authorized_keys에서 키를 읽거나 호출 하여 루트로 시스템에 로그인 할 수 있습니다 .
기계를 공개적으로 접근 할 수있게하고 외부에서 포트 22에 접근 할 수 있어야합니다.