본문 바로가기
IT Security/LINUX Basic

19. Linux - 공개키를 이용한 SSH 자동 접속

by Rosmary 2020. 5. 31.
728x90
반응형

 

리눅스는 사실, 검은 배경에 흰 글씨 뿐인 화면으로 인해 초반에 재미를 붙이기가 매우 까다로운 운영체제다. 하지만, 리눅스에 익숙해지는 순간, 집 밖에서도 열심히 putty나 Xshell과 같은 프로그램을 이용해, 리눅스에 접속하는 자기 자신의 모습을 보게 된다.

 

그런데, 이렇게 외부 접속을 위해 SSH를 사용하다보면, 비밀번호 입력마저도 번거로워지는 순간이 오게 된다. 계정 ID 입력하고, 비밀번호 입력하고 접속하는 그 과정마저도 시간이 아깝다고 느껴지는 경지에 다다르게 되면, 필자가 오늘 언급하고자 하는 비밀키와 공개키라는 녀석들을 이용해 계정 입력없이 리눅스에 접속하는 방법이 있다는 것도 슬슬 알게 되었을 것이다. 

 

이번 포스팅에서는 비밀키와 공개키를 이용한 리눅스 SSH 접속에 대해 알아본다.

 

 

1. 비밀키와 공개키.

 

컴퓨터가 비밀번호 없이 사용자를 인증할 수 있는 방법은 어떤 것이 있을까? 가장 손쉽게 생각할 수 있는 방법은, 컴퓨터 내에 저장된 특정 문자열과(예를 들어 123!@#)와 내가 입력한 문자열이 일치하는 경우, 해당 사용자의 접속을 허가해주는 것이다. 그러나 이 방법은, 컴퓨터가 악의적인 목적을 가진 누군가에게 털리는 순간, 암호화 되지 않은 비밀번호가 고스란히 노출되기 때문에 제 2의 피해로도 이어질 수 있다는 문제점이 있다.

 

따라서 컴퓨터에 저장하는 문자열을 한번 더 암호화하여 저장하는 방식이 나타나게 되는데, 이 방식은 크게 대칭 암호화 / 비대칭 암호화로 나뉜다.

 

대칭 암호화는 컴퓨터가 생겨나기 한참 전인 기원전에도 존재하던 개념이다. 카이사르가 자신의 군대에게 명령을 보낼 때, 해당 명령이 적군에게 탈취되는 경우를 가장하여, 암호화를 진행한 것이 시초라고 하며, 명령문의 알파벳을 특정 규칙에 맞게 변환하는 방식을 사용했다. 다음과 같이

 

ABCDEFG   ->  +3  -> DEFGHIJ

 

암호를 해독하는 해독반에서는, 암호화된 DEFGHIJ에서 -3 값만 빼면 원래의 ABCDEFG가 나타난다. 즉, 암호화에 사용하는 키 값(3)과 복호화에 사용하는 키 값(3)이 동일할 경우, 대칭 암호화 방식이라고 한다. 이 방식은 평문의 암호화가 매우 쉽다는 장점이 있지만, 적군이 마음먹고 해독하고자 한다면 내용 유출이 빠른 시간 내에 일어날 수 있다는 단점이 있다. 대칭 암호화는 다음과 같은 방식으로 발전하기도 했지만, 

 

ABCDEF   ->   +3+2   ->  DDFFHH 

 

여전히 시간만 들이면 쉽게 복호화 할 수 있다는 문제가 있었다.

 

이러한 이유로 나타난 것이, 비대칭 암호화 방식이다. 즉, 암호화 방식과 복호화 방식이 서로 다르며, 암호화 키를 이용해 복호화를 할 수 없기 때문에, 암호화 방식을 알아낸다고 해도 대칭 암호화 방식처럼 쉽게 복호화를 할 수 없다는 장점이 있다.  

 

공개키와 비밀키는, 각각 서버(리눅스)와 클라이언트(SSH 접속을 진행할 컴퓨터)에 파일 형식으로 저장되어 있다. 클라이언트에서 서버로 접속 시, 이 공개키와 비밀키가 일치하는지 확인하여, SSH 접속을 허용할지 말지 서버가 결정하게 된다.

 

 

 

2. SSH 접속 시, 비밀키와 공개키의 작동 방식

 

우선, 접속할 PC에는 비밀키가 존재해야하며, 접속할 서버, 즉 접속할 리눅스에는 PC 비밀키와 일치하는 공개키 값이 존재해야한다. 비밀키와 공캐키는 암호화 또는 복호화 키라고 생각하면 된다. PC에서 서버로 접속을 시도하면, 서버는 등록된 PC의 공개키를 이용해, 임의의 256bit 문자를 암호화 하여 PC로 전송한다. 서버로부터 암호화된 문자를 전송받은 PC는 자신이 가지고 있는 비밀키를 이용해 암호화된 문자를 복호화하고, 이 결과물을 서버로 돌려준다(물론, 그냥 돌려주는 것이 아니라 MD5 Hash 알고리즘에 의해 생성된 결과물이 보내진다. 내용이 복잡해지니 Hash 알고리즘에 대한 내용은 생략한다). 서버는, PC가 보내준 내용이 자신이 PC의 공개키로 암호화한 내용과 일치하는지 확인하고, 값이 일치한다면 PC의 접속을 허용하게 된다.

 

비밀키와 공개키는 일련의 잘 짜여진 연산과정을 통해 생성되는데, 하나의 비밀키는 하나의 공개키만을 가진다. 만약, A비밀키와 A'공개키가 존재하는데, B비밀키를 이용해 A'공개키로 암호화된 내용을 복호화하려고 한다면 100% 실패하게 된다. 

 

대략적인 내용은 살펴보았으니, 이제 실습을 진행해보자.

 

 

3.  비밀키와 공개키의 생성

 

비밀키와 공개키를 생성하는 방법은, 사용하는 프로그램이 무엇이냐에 따라 다르다. PuTTY의 경우, PuTTY 설치 시, 함께 설치되는 PuTTYgen이라는 프로그램을 통해 비밀키와 공개키를 생성할 수 있고, Xshell은 프로그램 내에 내장된 기능을 이용해 비밀키와 공개키를 생성할 수 있다. cmd에서 SSH 접속하는 경우에도 공개키와 비밀키를 생성할 수 있다. 

 

잠깐 언급했지만, 하나의 비밀키는 단 하나의 공개키만을 가지기 때문에, PuTTygen을 통해 만들어진 비밀키와 공개키를 이용하여 cmd에서 SSH 접속하는 것은 불가능하다.

 

(1) PuTTYgen

 

 

윈도우 검색창에서 puttygen이라고 입력한 뒤 실행하면, 위의 사진과 같은 화면이 뜬다(물론 Putty가 설치되어 있어야 한다). 일반적으로 SSH를 위해 생성하는 Key 타입은 RSA를 사용하며, 키의 크기는 2048을 많이 사용한다. 참고로 키 크기는 짝수 숫자를 입력하는데, 숫자가 낮을수록 암호/복호화 속도는 빠르지만 보안성이 낮고, 반대로 숫자가 클수록 암호/복호화 속도가 느린 반면 보안성이 높다. 필자는 키 크기를 512로 설정하여 진행하려고 한다.

 

 

Generate 버튼을 누르면, 빈 공간에 마우스를 움직이라는 문구가 나타나며, 창 내의 빈 공간에서 마우스를 움직일 때마다, 키 생성 진행 바가 점점 차오르는 것을 볼 수 있다.

 

 

키 생성이 완료되면 아래와 같은 화면이 나타난다.

 

가장 위의 빨간 네모 안의 내용은 생성된 공개키의 내용이다. 나중에 서버에 복사해서 붙여넣기 할 내용과 동일하다. 아래의 Key passphrase는 해당 키를 통해 접속할 때, 해당 키에 대한 비밀번호를 설정하는 란이다. 우리는 비밀번호 없이 로그인하기 위해 비밀키와 공개키를 생성했으므로, 이 항목은 입력하지 않고 건너뛴다. 마지막으로 생성된 공개키와 비밀키를 저장하는 버튼이 있는데, 이 버튼을 이용해 해당 키를 저장하도록 하자. 저장 위치나 파일명은 원하는대로 설정하면 된다.

 

저장이 완료되면, 위의 화면처럼 두 개의 파일이 나타나는데, 컴퓨터 위에 모자를 쓴 아이콘이 PuTTYgen으로 만들어진 비밀키이며, 남은 하나가 서버에 저장할 공개키이다.

 

** 필자는 PuTTYgen을 이용해서 공개키 파일을 생성하는 경우, 버튼 클릭보다 복사 붙여넣기를 더 권장한다. 그 이유는 버튼 클릭으로 생성된 공개키는 서버에서 사용할 수 있는 포맷이 아니라 변형된 포맷이기 때문에, 파일을 수정해야하는 귀찮음이 있기 때문이다. 

 

id_rsa.pub은 cmd의 ssh-keygen으로 만들어진 공개키며, pubkey는 PuTTYgen으로 만들어진 공개키다. 서버에서 인식하기 위해서는 공개키의 포맷이 ssh-rsa로 시작하며 모든 키 값이 한 줄로 작성되어 있어야 한다. 위의 스크린샷에서 id_rsa.pub은 이 기준을 만족하나, 버튼 클릭으로 생성된 공개키인 pubkey는 이 기준을 충족하기 위해 수정을 필수로 진행해 주어야 한다. 수정은 해당 파일을 메모장에서 열어 진행하면 된다. 

 

메모장 수정 후 저장

 

수정 전 파일 내용 및 수정 후 파일 내용

 

 

(2) Xshell

 

Xshell도 키 생성이 크게 어렵지 않다. Xshell 실행 후, 상단의 "도구" 탭에서 "사용자 키 생성 마법사"를 클릭하여 키를 생성하면 된다.

 

 

PuTTYgen과 마찬가지로, 키 유형과 길이를 설정한 뒤, 다음을 누르면 키 생성이 완료되며, 다음 버튼을 눌러 생성된 키 이름을 지정해주면 된다.

 

 

파일 이름과 함께 비밀번호를 입력하는 란도 제공되는데 PuTTYgen과 마찬가지로 무시하고 넘어가도 된다. 그럼 다음과 같이 공개키 내용이 출력된다. 

 

 

PuTTYgen과 달리, Xshell에서는 공개키만 파일 저장이 가능하며, 비밀키는 Xshell 프로그램 어딘가에 내장된다. 따라서 해당 키를 이용해 Xshell 외의 프로그램을 통해 SSH를 접속하는 것은 불가능하다.

 

 

(3) cmd

 

window에 OpenSSH 클라이언트가 설치(설치방법은 여기를 클릭하자)되어 있다면, cmd 창에서 비밀키와 공개키를 만드는 것 역시 가능하다. 단, 앞서 소개한 프로그램들과는 달리, 마우스 클릭이 아닌, 명령어 타이핑으로 키를 생성해야한다.

 

비밀키와 공개키를 생성하는 명령어는 ssh-keygen이다. ssh-keygen 명령어를 치면, 아래와 같이 키 생성에 필요한 설정 값을 입력할 수 있다.

 

 

ssh-keygen 명령어만으로 키를 생성하면, 파일명과 암호를 제외한 나머지 설정은 모두 기본값이 적용된다. 만약, PuTTYgen처럼 키 길이나 키 타입을 지정하고 싶다면, ssh-keygen 명령어 뒤에 옵션을 주면 된다. 옵션 종류는 ssh-keygen ?를 입력하면 확인할 수 있다.

 

키 길이는 -b, 키 타입은 -t 옵션을 이용해 지정할 수 있다.

참고로, cmd에서 생성된 키는 파일이 저장되는 위치를 지정함에 있어, 제약 사항이 존재한다. 생성된 비밀키와 공개키는 C:\Users\{윈도우 계정명}\.ssh 폴더에 저장되어야 한다(이는 ssh-keygen 명령어 입력 이후, 파일 저장 위치를 물어보는 란을 공백으로 입력하면 된다)

 

 

생성된 키는 .ssh 폴더에 존재하며, 오른쪽과 같이 publisher 아이콘 파일이 공개키다. 

 

 

 

4. 서버에 공개키 적용하기.

 

이제, 서버에 공개키를 적용해야한다. 공개키의 적용도 크게 어려운 내용은 없다. 우리가 만든 공개키의 내용만 복사해서, 리눅스 서버의 특정 이름을 가진 파일에 붙여넣기를 하면 끝이다.

 

그 전에, 리눅스에서 이와 관련된 설정에 대한 내용을 먼저 확인해봐야 한다. SSH 접속과 관련된 설정 파일은 /etc/ssh 폴더 아래에 있는 sshd_config라는 파일이다. 이 파일은 SSH 포트 번호, root 계정의 원격 접속을 허용할 것인지 등등 SSH 접속과 관련된 모든 사항을 관리하는 설정파일이라고 보면 된다. 지금 진행하는 비밀키 접속 역시, SSH 접속이므로 해당 파일에서 설정을 확인할 수 있다.

 

 

해당 파일은 root만 읽기와 쓰기가 가능한 파일이므로, root 계정으로 접속하던가, 아니면 sudo 권한을 가진 계정을 사용해야 한다. vi로 해당 파일을 열고 43번째 줄로 이동하면, 공개키를 통한 접속과 관련된 설정 내용이 존재한다.

 

 

43번째 줄은 공개키를 통한 인증을 진행할 것인지, 즉 공개키를 통한 접속을 허용할 것인지에 대해 묻는 내용인데, 주석처리되어 있어 작동하는 코드는 아니다. 리눅스에서 기본적으로 공개키를 통한 접속을 yes 값으로 설정해놓은듯 하며, 이 값은 변경하지 않아도 공개키 접속에 크게 문제는 없다. 하지만, 공개키를 이용한 SSH 접속을 막고 싶다면, 해당 줄의 주석(#)을 제거하고 yes 값을 no로 변경한 뒤, sshd 서비스를 재구동하면 된다(서비스와 관련된 이야기는 추후 다룰 예정이다)

 

48번째 줄은, Authorizedkeys File, 즉, 공개키가 저장되는 파일의 경로와 이름을 지정하는 설정 내용이다. 기본 값으로 계정 홈 디렉토리의 .ssh/authorized_keys로 지정되어 있다. 이 파일에 우리가 만든 공개키를 입력하고 저장하면, 추후 비밀키가 있는 컴퓨터에서는 비밀번호 없이도 리눅스 서버에 자동 접속이 가능하게 된다. 

 

추가로 45번째와 46번째 줄을 살펴보면, ssh는 공개키 확인 시, authorized_keys파일과 authorized_keys2 파일을 확인한다고 되어 있으며, 두 파일이 동시에 존재할 때 authorized_keys파일을 확인한다고 되어 있다. 크게 중요한 내용은 아니지만, 기본 설정이 이렇게 되어 있으니 참고하도록 하자.

 

sshd_config 파일의 설정 내용이 위와 동일하게 되어 있다면, root에서 접속할 사용자 계정으로 변경(Sudo를 사용한 경우는 제외)한 뒤, 홈 디렉토리로 이동한다. 홈 디렉토리로 이동한 뒤, .ssh 폴더를 생성해주고, .ssh 폴더로 이동하여 touch나 vi 명령어로 authorized_keys 파일을 만들어주면 된다. 

 

 

참고로, .ssh폴더는 폴더 앞에 점(.)이 찍혀있으며, 이는 숨김 폴더를 의미한다. 이 폴더까지 확인하기 위해서는 ls 명령어의 -a 옵션을 사용해야 한다. authorized_keys의 퍼미션은 보통 600으로 설정한다(위의 사진에는 잘못된 퍼미션 값이....)

 

.ssh폴더와 authorized_keys파일 생성 시, 주의점이 있는데, .ssh폴더의 퍼미션은 700, authorized_keys는 그룹과 other 퍼미션에 쓰기 권한이 제외되어 있어야한다. 만약, 이 퍼미션 값에서 벗어난 폴더와 파일이 존재한다면, 서버에서 공개키를 이용한 SSH 접속을 거부한다.

 

마지막으로, 이전 단계에서 생성한 공개키 내용을 authorized_keys 파일에 입력해주면 된다. 일일이 입력하는 것은 귀찮고 오타도 많이 나니, scp나 sftp를 이용해 공개키 파일을 리눅스 서버로 옮긴 뒤, 리다이렉션을 이용해 내용을 복사해주면 된다. 

 

 

 

cmd로 만든 공개키와 PuTTYgen으로 만든 공개키를 등록한 autorized_keys 파일의 내용

 

공개키 / 비밀키 적용 이후 비밀번호 입력 없이 로그인 되는 것을 확인할 수 있다

 

cmd에서 ssh-keygen 명령어를 통해 만든 비밀키, 공개키를 사용하는 경우, 공개키를 서버의 authorized_keys 파일에 등록만 해도, 자동 로그인을 곧장 사용할 수 있다. 

 

* 단, PuTTyGen으로 키를 생성한 경우, 생성한 비밀키(Private_key)를 Putty에 등록해주어야 한다.

저장한 비밀키 경로를 Browse 버튼으로 지정해주면 되며, 비밀키 지정이 완료되면 왼쪽 카테고리의 맨 위 "Session"을 클릭하고 IP 주소 입력한 뒤 접속하면 된다.

 


 

지금까지 공개키 / 비밀키 생성 및 등록을 통해, 리눅스 서버에 비밀번호 없이 SSH 접속하는 방법에 대해 알아보았다. 이번 포스팅을 작성하면서, 지금까지 언급하지 않았던 SFTP나 SCP에 대한 내용도 존재하는데, 이 부분은 필자가 포스팅을 마무리하는대로 링크를 걸어 확인할 수 있도록 조치할 예정이다.

 

FIN.

반응형

댓글