제안하신 경우 이는 서버의 공개 키를 복사한 다음 SSH로 연결하는 것이 아닙니다.
그래서 AWS Linux 인스턴스를 만들고 SSH 키 쌍을 만들었고 자동으로 개인 키를 다운로드했습니다.
이제 다음과 같은 간단한 방법으로 AWS Linux 인스턴스에 연결할 수 있습니다.
ssh -i key_they_gave_me ec2-user@AWSinstanceIP
내 Linux 가상 머신에 이와 같은 것을 어떻게 설정합니까? 그렇다면 누군가 비밀번호를 요구하지 않고 개인 키를 사용하여 SSH로 접속할 수 있습니까?
편집: id_rsa.pub 복사에 대해 말하는 것이 아닙니다. 저는 이 작업을 수행하는 방법을 알고 있으며 AWS 인스턴스에서는 이를 필요로 하지 않습니다. 이것이 내가 원하는거야.
답변1
SSH는 빈 비밀번호를 허용합니다. ssh-keygen
비밀번호를 묻는 메시지가 표시되면 Enter를 누르기만 하면 복사할 수 있습니다 . 에서 man ssh-keygen
:
이 프로그램에는 비밀번호도 필요합니다. 암호는 비어 있을 수 있습니다. 즉, 암호가 없거나(호스트 키에 빈 암호가 있어야 함) 임의 길이의 문자열이 있을 수 있습니다.
이는 다양한 클라우드 서비스의 일부로 생성된 키에 대한 표준 동작입니다. Google이나 Microsoft 클라우드를 사용하는 경우에도 동일한 일이 발생하기를 바랍니다. 이는 안전하지 않은 것처럼 보일 수 있지만 대안도 그리 좋지 않습니다. 어떻게든 가상 머신에 액세스할 수 있도록 허용해야 합니다.
보안이 걱정되는 사람을 위해 ssh-keygen
공개 키를 변경하지 않고 개인 키의 비밀번호를 변경할 수 있는 기능도 있습니다.
ssh-keygen -p -f key_they_gave_me
개인적으로 저는 기본적으로 암호를 활성화하지만 암호 없는 키를 LUKS 볼륨에 저장합니다. SSH를 자주 사용할 예정이라면 기본 키 위에 비밀번호 없는 키를 설치합니다. 작업이 끝나면 제거하여 침입자가 여전히 비밀번호를 처리해야 합니다. 이렇게 하면 ssh-agent가 필요하지 않게 되는 동시에 키 보안에 대한 많은 제어가 가능해집니다.
답변2
AWS 인프라가 SSH 키를 생성하는 방법에 대해 문의하셨습니다. AWS에서 일하고 이 정보를 공개하도록 허용된 사람이 아닌 한(높은가능성 없음) 그러면 완전한 답변을 얻을 수 없습니다.
결론은 당신이 찾고 있는 대답은 전적으로 당신이 사용하는 가상화 백엔드에 달려 있다는 것입니다.
그런데 AWS가 공개한 정보에 따르면 이제 이전에 사용하던 방식 KVM
대신 자체 제작한 가상화 플랫폼을 사용하고 있다는 것입니다.XEN
따라서 AWS가 이를 어떻게 수행하는지 추측할 수 있거나 최소한 kvm 호스트를 통해 이를 수행하는 방법을 제공할 수 있습니다. 제가 아는 한, 가장 일반적인 방법은 virt-sysprep
로고가 있는 이미지에 사용하는 것입니다.qcow2
--ssh-inject
예
먼저 kvmhost에서 공개 키를 생성하세요 ssh-keygen
. 귀하의 사용자가 iamAguest
다음 위치에 새 공개 키를 저장했다고 가정합니다./home/iamAguest/.ssh/id_rsa.pub
virt-sysprep
그런 다음 실행 하여 다음 키를 이미지에 삽입 할 수 있습니다 .
virt-sysprep -a a_linux_image.qcow2 --run-command 'useradd iamAguest' --ssh-inject iamAguest:file:/home/iamAguest/.ssh/id_rsa.pub
그런 다음 해당 이미지를 사용하여 인스턴스를 배포하면 a_linux_image.qcow2
새로 생성된 키를 사용하여 SSH를 실행할 수 있습니다.
Amazon은 버튼 클릭만으로 이를 어떻게 수행합니까?
충분히 간단한 스크립트로 이 작업을 수행할 수 있지만 AWS 규모의 플랫폼에서는 의심할 여지 없이 상당히 복잡할 것입니다.
자신만의 kvm 인스턴스를 실행하는 경우 다음과 같이 간단한 방법을 사용하면 됩니다.
#!/usr/bin/bash
# get image and user from user input
image=$1
user=$2
# fail if no user input
if [ -z "$image" ] || [ -z "$user" ]; then
echo "you must enter a filepath to an image and a user name to run this"
echo "e.g: inject_ssh.bash <image> <user>"
exit 1
fi
# create ssh key for current logged in user with no passphrase
echo -e "/home/$user/.ssh/id_rsa\n\n" | ssh-keygen
# inject key into image
virt-sysprep -a $image --run-command "useradd $user" --ssh-inject $user:file:/home/$user/.ssh/id_rsa.pub
그러나 소비자 솔루션으로 제공하려는 경우 키 없이 깨끗한 이미지를 유지할 수 있도록 이미지를 먼저 복사하는 것이 가장 좋습니다. 스크립트에 더 많은 유효성 검사를 추가하는 것도 좋은 생각입니다. 이는 단순한 예일 뿐입니다.
답변3
실제로 방법을 찾았습니다. 사실 정말 쉽습니다.
machine1과 machine2가 있고 machine1의 사용자가 machine1이 아닌 다른 시스템에서도 machine2에 액세스할 수 있도록 허용하여 machine1의 키를 처리할 필요 없이 machine1에서 machine2에 액세스할 수 있기를 원한다고 가정합니다.
ssh-keygen
머신 2에서 수행합니다 . 그런 다음 cat /path/.ssh/id_rsa.pub >> /path/.ssh/authorized_keys
마지막 으로Permission.pem 파일로 chmod 600 /path/.ssh/authorized_keys
복사하여 id_rsa
machine1에 제공합니다.
이러한 방식으로 machine1은 machine2에 연결하여 작동할 수 있습니다 ssh -i permission.pem thatuser@machine2
. machine1의 사용자는 비밀번호 없이도 어떤 시스템에서든지 허가.pem을 갖고 machine2에 연결할 수 있습니다.
물론 이것은 안전하지 않지만 비밀번호를 사용할 수도 있습니다. 제가 알고 싶은 것은 이를 수행하는 방법에 대한 개념입니다. 이것이 대답했습니다.