본문 바로가기
정보보안/이론

[KITRI] Day15. 공개키를 통한 인증방법

by 민-Zero 2020. 5. 14.

SSH Server의 공개키와 비밀키는

Private /etc/ssh/ssh_host_rsa_key

Public /etc/ssh/ssh_host_rsa_key.pub

의 위치에 저장되어 있는것을 확인했었다. 클라이언트 에서는 서버에 접속할때 서로 공개키를 교환하는데 

이때 클라이언트는 접속했던 서버의 공개키를 ~/.ssh 위치에 known_hosts라는 파일에 저장한다.

자신이 직접 클라이언트가 되어 자신의 서버에 ssh로 접속을 하면 내가 구동중인 서버의 키를 받아와 known_hosts에 저장하고 있는것을 확인할 수 있다. 

 

공개키 인증방식의 접속

클라이언트가 사용하는 시스템의 공개키 설정파일은 /etc/ssh/ssh_config이다. 해당 파일을 열어봤을때

# IdentityFile ~/.ssh/identity

# IdentityFile ~/.ssh/id_rsa 개인이 사용하는 비밀키 위치이다. pub 붙어있는것은 공개키

# IdentityFile ~/.ssh/id_dsa

# Port 22 접속하는 포트번호의 디폴트값

등의 설정을 확인할 수 있다.

 

공개키를 통해 클라이언트와 서버가 접속을 하기 위해서는 서버와 클라이언트가 서로 공개키를 교환하고 접속을 수행한다. 클라이언트는 접속할 서버의 인증서(공개키, Public)를 계정의 홈디렉토리에 known_hosts에 저장해야 한다. 서버는 ~/.ssh/authorized_keys 라는 파일로 접속하려는 클라이언트의 공개키 ~/.ssh/id_rsa.pub가 저장되어야한다.

 

서버에 암호 인증이나 공개키인증으로 접근할 경우 인증 순서는 우선 공개키를 확인한뒤 암호 인증을 수행하게 된다. 공개키인증은 해당 서버에서 접속하려는 계정의 홈디렉토리 아래의 ~/.ssh/authorized_keys에 등록되어 있는지 확인 후 인증 허용한다. 만약 인증서가 없다면 비밀번호를 통한 인증으로 넘어가게 된다.

 

두개의 서버로 공개키 인증 확인

client는 centos5를 이용하고 server는 centos8을 이용하여 테스트 하자.

 

서버의 개인키, 공개키를 확인해보면

/etc/ssh 디렉토리에 존재하는 것을 확인할 수 있다. pub가 붙은 키가 공개키 이고 다른 하나가 개인키 이다.

이때 공개키는 1줄로 이루어져 있다. 1줄로 이루어져 있지 않으면 인식하지 못한다.

 

그럼 클라이언트에서 해당 서버로 ssh접속을 시도하게 되면 해당 공개키를 받아가게 된다. 그럼 이제 다음부터는 암호인증을 서버에게 허락받게 된것이다.

클라이언트의 홈디렉토리에서 .ssh/known_hosts 를 확인하면 서버의 공개키와 동일한 키를 받아간 것을 확인할 수 있다.

 

이번에는 클라이언트에서 키를 생성하고 서버에 전달하여 서버에 접근시 키를 사용해 접근가능하도록 하자.

 

클라이언트

ssh-keygen -b 2048 -t rsa 는 rsa를 사용하는 2048bits 크기의 키를 생성하는 명령어로 해당 공개키가 인증서 역할을 수행 하게된다. 키를 생성할때 입력을 요구하는 부분이 있는데 각 부분은

Enter file in which to save the key (/root/.ssh/id_rsa): <- 인증키가 생성될 위치를 입력받는 곳이고 아무것도 입력하지 않는다면 괄호안에 지정된 기본위치에 저장된다.

Enter passphrase (empty for no passphrase): 공개키 즉, 인증서로 사용될 키의 암호를 입력하는 부분이다.

ls 명령어를 통해 .ssh 디렉토리를 확인하면 사용자의 개인키와 공개키가 생성된것을 확인할 수 있다. 인증서의 역할을 수행할 수 있게 된것이다.

 

이제 클라이언트의 인증서를 서버에 등록하기 위해 scp를 사용해 키를 전송하도록 한다.

 

SSH 프로토콜을 이용한 scp(보안 복사) 명령어

1. LocalHost(원본) -> RemoteHost(복사본)

scp 경로/원본 사용자@RemoteHost(IP):경로/복사본

 

2. RemoteHost(원본) -> LocalHost(복사본)

scp 사용자@RemoteHost(IP):경로/원본 경로/복사본

 

scp를 확인해보기 위해 클라이언트에서 test_file이라는 이름으로 간단한 내용을 넣어 생성후 scp를 통해 서버로 전송한다.

 

그럼 서버에 /root 디렉토리로 전송했으므로 해당 위치에서 확인해 보면 전송한 파일이 똑같이 전송된 것을 확인할 수 있다. 그럼 scp를 활용하여 공개키를 전송하자

 

서버

공개키 접속을 허락하기 위해 서버에도 .ssh 디렉토리를 생성한후 소유자 이외에는 해당 키를 확인하면 안되므로 700권한을 주어 생성하도록 한다.

 

클라이언트

scp를 통해 공개키를 서버에 전달한다. 이때 서버는 authorized_keys에 등록된 공개키만을 허용하므로 authorized_keys라는 이름으로 저장되도록 전송해준다.

 

그럼 해당 클라이언트는 서버에 인증받은 클라이언트가 되므로 키를 사용한 인증을 받게 되며 ssh로 접근시 인증서를 통해 인증을 받기 때문에 암호인증 없이 로그인 가능해진다. 만약 키를 생성할때 클라이언트에서 인증서 암호를 설정 했다면 로그인시 id에 따른 비밀번호 대신 인증서의 비밀번호를 물어보게 된다.

 

그리고 ssh로 접근할때 보안설정의 일환으로 패스워드를 통한 root접근을 금지할 수 있다.

/etc/ssh/sshd_config  60번쨰 줄의 옵션을 no로 변경하고 service sshd restart를 수행하면

패스워드를 통한 인증방식이 금지된다. 

해당 방법은 모든 계정에 대해 패스워드 인증 방식이 막히지만 루트만 막고 싶다면 39행 

PermitRootLogin을 복사해 밑에 PermitRootLogin without-password 로 설정을 변경하면 된다.

 

----------------------------------------------------------------------------------------------

window에서 putty로 공개키 방식을 통해 접속하기

1. windows에서 PuttyGen 이용해서 공개키/비밀키 쌍 생성

kmy_public.pub /kmy_private

공개키를 옮겼을때 불필요한 코맨트 부분을 지우고, 모든 공백을 없애서 1줄로 만든다. 그다음에 맨앞에 ssh-rsa AAAB3Ndkasvns 이런식으로 어떤 알고리즘 사용했는지 명시해준다.

 

2. Windows에서 winscp을 이용해서 공개키를 CentOS에 전송

 

3. Centos에서 전송받은 공개키를 .ssh/authorized_keys에 저장

 

4. windows에서 Putty에서 공개키 인증방식으로 접속할 수 있도록 비밀키를 적용한 세션 정보를 생성하여 접속한다.

 

 

 

댓글