SSH 공개키 인증을 사용하여 접속하기

이동빈·2021년 8월 3일
9
post-thumbnail

1. 공개키 암호화란?

공개 키 암호 방식은 암호 방식의 한 종류로 사전에 비밀 키를 나눠가지지 않은 사용자들이 안전하게 통신할 수 있도록 한다.
공개 키 암호 방식에서는 공개 키와 비밀 키가 존재하며, 공개 키는 누구나 알 수 있지만 그에 대응하는 비밀 키는 키의 소유자만이 알 수 있어야 한다.
공개 키는 보안 타협 없이 공개적으로 배포가 가능하다.
공개 키 암호를 구성하는 알고리즘은 대칭 키 암호 방식과 비교하여 비대칭 암호라고 부르기도 한다.
위키백과

공개키-개인키(비밀키)가 한 쌍으로 이루어져 있는 키 쌍이라 합니다.
공개키는 누구나 가질 수 있고, 개인키는 개인이나 중요한 사람만이 가지고 있습니다.

이런 특성을 이용하여 공개키 방식으로 암호화 및 인증에 사용됩니다.

메시지를 공개키로 암호화하면 개인키를 가지고 있는 사람만이 메시지를 복호화하여 메시지를 확인 할 수 있습니다. 개인키를 탈취당하지 않는 이상, 암호화된 메시지가 유출되어도 다른 사람이 절대 읽을 수 없습니다.

2. SSH 공개키 접속

SSH는 기본적으로 사전에 설정된 패스워드를 입력하여 접속하지만, 공개키 암호화에 사용되는 키 쌍을 가지고 접속할 수 있는 기능을 제공합니다.

사전에 자신의 공개키를 서버에 나눠주고, SSH 접속 시 개인키를 이용하여 사용자를 증명하는 원리로 로그인하게 됩니다.

아래는 ssh 접속 과정을 나타낸 시퀀스 다이어그램 입니다.

3. SSH 공개키 접속 방법

3.1 및 3.2는 공개키를 이용한 SSH 접속 방법을 설명하기 앞서 기본적으로 알아야할 사전지식입니다.

3.1 SSH 클라이언트 (사용자)

  • 클라이언트 키 쌍

    • ssh-keygen 명령어를 이용하여 공개키 및 개인키 생성
    • 키 쌍을 생성하게 되면 기본적으로 아래 경로에 생성됨
      • ~/.ssh/id_rsa (개인키)
      • ~/.ssh/id_ras.pub (공개키)
    • 서버의 authorized_keys 파일에 공개키를 등록해야 함.
  • ~/.ssh/known_hosts 파일

    • 사용자가 처음 서버에 로그인 할 때, 연결을 진행하면 서버의 공개키가 해당 파일에 기록됨

3.2 SSH 서버 (호스트)

  • 서버 키 쌍

    • 서버에서 openssh-server를 설치하는 과정에 자동 생성
      • /etc/ssh/ssh_host_ras_key (개인키)
      • /etc/ssh/ssh_host_ras_key.pub (공개키)
    • 클라이언트가 서버에 처음 연결 시도 시 해당 공개키를 클라이언트에게 제공. 클라이언트는 known_hosts 파일에 서버의 공개키를 저장
  • ~/.ssh/authorized_keys 파일

    • 해당 파일에 로그인할 클라이언트의 공개키가 기록되어있어야 함

3.3 SSH 공개키 접속

3.3.1 클라이언트 키 쌍 생성

  • 아래 명령어를 이용하여 RSA 알고리즘 키 쌍 생성
  • $ ssh-keygen -t rsa
  • 별 다른 설정이 필요하지 않으므로, 엔터를 계속 누르면 현재 로그인되어있는 사용자의 홈디렉토리 .ssh 폴더 밑에 키 쌍이 생성 됨

3.3.2 공개키 전송

  • 리눅스계열에서는 공개키를 복사하는 명령어 ssh-copy-id 를 사용

    • $ ssh-copy-id USER@remote-host
    • 예) $ ssh-copy-id lee@192.168.0.15
    • -i 옵션을 사용하지 않으면, 현재 로그인 되어있는 계정의 .ssh/id_rsa.pub 파일을 전송 (기본값)
    • 공개키 파일이 다른 경로에 있다면 -i 옵션을 이용하여 별도의 경로를 지정해야 함
      • $ ssh-copy-id -i /home/test/key/key.pub lee@192.168.0.15
  • 윈도우에서는 sshcat을 이용한 명령어 조합을 이용

    • type $env:공개키경로 | ssh USER@remote-host "cat >> .ssh/authorized_keys"
    • 예) type $env:C:\Users\LDB.ssh\id_rsa.pub | ssh lee@192.168.0.15 "cat >> .ssh/authorized_keys"

3.3.3 로그인

  • 공개키 방식으로 SSH 접속 시 -i 옵션 생략 시, 아래 경로에 있는 개인키로 접속을 시도

    • 윈도우: USER_NAME\.ssh\id_rsa
    • 리눅스: USER_NAME/.ssh/id_rsa
  • 만약 개인키의 위치가 다르거나 AWS의 pem 파일인 경우 -i 옵션 이용

    • $ssh -i KEY_PATH\key.pem USER@remote-host
    • $ssh -i KEY_PATH\id_rsa USER@remote-host

3.3.4 키 파일 권한 문제 (Permissions are too open)

개인키를 windows <-> linux간 FTP로 복사하다가 발생하는 권한 문제입니다.
ssh에 사용되는 각 종 파일들 (설정파일,공개키,개인키 등)은 보안적인 이슈로 인해 아래 사진과 같이 권한이 정해져있습니다.

위 사진을 보면 Mandatory Permission 이라고 정해진 권한이 있는데, 개인키 파일과 설정파일은 꼭 600으로 설정이 되어있어야 한다는 뜻입니다. (600은 소유자만 읽고 쓸 수 있는 권한)
만약 600이 아니라면 chmod 명령어를 통해 권한을 수정하면 됩니다.

만약 윈도우에서 발생했다면 해당 파일에 대한 상속 권한을 비활성화 시키고, 현재 윈도우 계정만 개인키 파일에 접근할 수 있도록 설정을 변경해줍니다.

자세한 방법은 윈도우10 SSH 접속시 PEM 파일 퍼미션 에러 해결방법 글을 참고하시면 됩니다.

[참고]
1. https://serverfault.com/questions/935666/ssh-authentication-sequence-and-key-files-explain
2. https://superuser.com/questions/215504/permissions-on-private-key-in-ssh-folder

profile
호기심 많은 개발자

2개의 댓글

comment-user-thumbnail
2023년 2월 22일

감사합니다!.

답글 달기
comment-user-thumbnail
2024년 10월 24일

잘봤습니다

답글 달기