본문 바로가기

트러블슈팅

[AWS] ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey], no supported methods remain

문제 발생 배경

Springboot 웹 프로젝트를 Docker, Github Actions를 이용해 AWS EC2에 배포하려고 할 때 발생한 문제이다.

Github Actions 를 실행하기 위해 작성한 deploy.yml 파일 중 일부이다.

- name: AWS EC2에 ssh 접속 후 배포
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.AWS_IP }}
          port: 22
          username: ubuntu
          key: ${{ secrets.AWS_KEY }}
          script: |
            docker pull ${{ secrets.DOCKER_USER_NAME }}/${{ secrets.DOCKER_IMAGE_NAME }}-be
            docker-compose up -d

Github Actions의 secrets에 AWS EC2의 퍼블릭 IP 주소, AWS private key를 보관하여 AWS EC2에 ssh 접속하여 배포한다.

발생한 오류

Github Actions가 AWS EC2에 ssh 접속하는 과정에서 AWS_KEY를 인식하지 못해 발생한 문제이다.

해결 방법

이 오류의 주요 원인으로는

1. Github Secrets에 저장된 SSH private key가 올바르지 않음

2. AWS EC2의 ~/.ssh/authorized_keys 파일에 퍼블릭 키가 등록되지 않음

3. EC2 인스턴스에서 ubuntu 사용자의 SSH 접근 권한이 부족함

4. EC2의 SSH 설정 파일 (/etc/ssh/sshd_config)에서 PubkeyAuthentication이 비활성화됨

등이 될 수 있다.

나의 경우에는 1 -> 2 를 통해 해결할 수 있었다.

1. Github Secrets에 올바른 private key 등록하기

로컬에서 SSH 프라이빗 키를 확인한다.

cat ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

cat 명령으로 출력되는 ----BEGIN 부터 ---END ~ KEY ----- 까지 모두 복사해서 저장해야 한다.

내가 오류가 계속 발생했던 이유는 로컬의 ssh 프라이빗 키를 등록한 것이 아니라 EC2에서 위의 명령을 실행하여 저장했기 때문이었다.

로컬에서 사용하는 private key는 EC2 키페어가 아니라 직접 생성한 ssh 키이다.

2. EC2의 authorized_keys에 퍼블릭 키가 올바르게 등록되었는지 확인

Github Actions에서 사용하는 SSH 키의 public key가 EC2의 ~/.ssh/authorized_keys 에 저장되어 있어야 한다.

EC2에서 SSH 접속 후 퍼블릭 키를 확인해보자.

cat ~/.ssh/authorized_keys

등록되지 않았다면 퍼블릭 키를 다음 명령어로 추가해준다.

echo "ssh-rsa AAAAB3Nza... (your public key)" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

결론

Github에 등록하는 로컬의 private key와 EC2의 authorized_keys, 즉 public key의 차이를 알고 있어야 한다.

나는 두 키를 같다고 생각하여 발생한 문제였다.

참고한 글들

https://github.com/appleboy/ssh-action/issues/297

https://github.com/appleboy/ssh-action#setting-up-ssh-key

https://bk0625.tistory.com/94