본문으로 바로가기

Day-28 공개키 기반 인증

category Linux 2017. 1. 20. 09:16

공개 키 기반 인증 설정


   Server-A <----------> Client-Linux
(SSH Server)              (Client-Linux)

 

- 패스워드 인증 방식은 악의적으로 패스워드를 알아낸 경우 서버 접속을 막을 수 없다.
- 공개 키 기반인증은 서버에 계정이 있는 클라이언트가 공개키와 개인키를 생성해서 공개키를 서버에 저장하고

  개인키는 자신의 컴퓨터에 보관해 이 두개의 키를 이용해 인증에 사용한다.

 

Server-A

 

#yum -y install openssh openssh-server openssh-clients openssh-askpass

 

Client-Linux


#yum -y install openssh-clients       //클라이언트 패키지 설치
#useradd ssh-user1                        //계정 생성
#passwd ssh-user1                         //패스워드 지정 설정
$su - ssh-user1

 

- 공개 키/ 개인 키 생성 (-t 암호화 알고리즘 지정)
$ssh-keygen -t rsa

 

Enter file in which to save the key (/home/ssh-user1/.ssh/id_rsa): 키 생성 경로 정해주기 (Enter)
Enter passphrase (empty for no passphrase): 공개키 인증 값 (암호) 123123
Enter same passphrase again: 암호 재 입력


- 개인 키에 사용할 패스워드 지정, 입력하지 않을 경우 접속시 개인 키 암호를 물어보지 않는다.
- 암호를 설정하지 않으면 개인키가 노출되었을 경우 공개 키를 이용한 인증도 무력화 된다.

 

Your identification has been saved in /home/ssh-user1/.ssh/id_rsa.
Your public key has been saved in /home/ssh-user1/.ssh/id_rsa.pub.
- 일련의 완료 문구 (공개키와 개인키가 만들어 졌다)

 

 

 

$ll /home/ssh-user1/.ssh

 

[ssh-user1@Clinet-Linux ~]$ ll /home/ssh-user1/.ssh
합계 8
-rw-------. 1 ssh-user1 ssh-user1 1743 2017-01-18 19:30 id_rsa        //개인키 600
-rw-r--r--. 1 ssh-user1 ssh-user1  404 2017-01-18 19:30 id_rsa.pub  //공개키 644

 

$cat /home/ssh-user1/.ssh/id_rsa.pub

암호화된 키값 ssh-user1@Client-Linux

 

Server-A
$useradd ssh-user1
$passwd ssh-user1

 

Client-Linux
$ssh-copy-id ssh-user1@100.100.100.110
- ssh-copy-id를 이용해 공개 키를 ssh서버의 사용자 ssh-user1를 지정해  복사하면 /home/ssh-user1/.ssh/authorized_keys란 이름으로 복사된다.

 

- scp /home/ssh-user1/.ssh/id_rsa.pub ssh-user1@100.100.100.110:~/.ssh/authorized_keys 라고 해야하는 것을

  $ssh-copy-id ssh-user1@100.100.100.110로 쓴다

 

 


Server-A
#su - ssh-user1
$pwd
/home/ssh-user1/
$cd /home/ssh-user1/.ssh                   // ssh-user1의 .ssh 디렉토리로 이동
$ls                                                       // 목록 출력
authorized_keys                                  // 공개 키 복사 확인

 

/home/ssh-user1/.ssh/authorized_keys 와 /home/ssh-user1/.ssh 값이 같다.

 

Server-A
#vi /etc/ssh/sshd_config                 // ssh서버 설정 파일

 

 48 #PubkeyAuthentication yes -> 48 PubkeyAuthentication yes
      - 공개키 인증을 허용하는 옵션(yes)
 49 #AuthorizedKeysFile     .ssh/authorized_keys  ->  AuthorizedKeysFile     .ssh/authorized_keys
      - ssh 클라이언트가 서버의 계정에 공개키를 저장할때 그 디렉토리와 키의 이름을 지정한다.

 66 PasswordAuthentication yes -> 66 PasswordAuthentication no
     - 공개 키 기반 인증을 위해 패스워드 인증 설정은 no로 변경

 

#service ssh restart

 

Client-Linux
#su - ssh-user1                              //스위칭
$ssh ssh-user1@100.100.100.110  //서버A 접속
Enter passphrase for key '/home/ssh-user1/.ssh/id_rsa': (개인키암호입력) 123123
[ssh-user1@Server-A ~]$  접속 완료

 

 

 

 

 

 SSH-AGENT, SSH-ADD를 사용한 자동 인증
- 개인 키 암호를 메모리에 저장해서 재 접속 시 패스워드 입력없이 접속 하도록 도와주는 프로그램

  ssh-agent - 개인 키의 패스워드를 보관하기 위해 사용되는 백그라운드 프로그램
  ssh-add - 실행되고 있는 ssh-agent에 키를 추가하기 위해 사용되는 프로그램
 

Client-Linux (ssh-user1)

$eval $(ssh-agent)
Agent pid 2536
- 명령어 eval이 shell에게 ssh-agent의 출력을 쉘명령어로서 실행하라고 전달하면 ssh-agent는 개인키의 패스워드를

  보관하기 위해 메모리에 백그라운드 프로세스로 존재


$ssh-add
Enter passphrase for /home/ssh-user1/.ssh/id_rsa:
Identity added: /home/ssh-user1/.ssh/id_rsa (/home/ssh-user1/.ssh/id_rsa)
- 명령어  ssh-add를 이용하여 개인 키 패스워드를 ssh-add에 추가

 

$ssh-add -l
2048 7d:72:61:88:f6:48:dc:d7:65:4c:f6:88:a8:9c:59:e1 /home/ssh-user1/.ssh/id_rsa (RSA)
- 목록을 확인하기 위해 명령어 ssh-add -l을 사용하면 ssh-agent가 현재 보관중인 키의 지문 (fingerprint)을 알 수 있다.

 

 

$ ssh ssh-user1@100.100.100.110
Last login: Tue Jan 17 23:07:07 2017 from 100.100.100.130
- 패스워드를 묻지 않고 접속됨


Server-A (root)
# vi /etc/ssh/sshd_config

 

13 Port 22
- SSH서버의 포트를 변경하기 위해 사용하는 옵션
- 포트를 변경함으로써 무작위로 22번 포트를 공격하는 Brute-force공격이나 nmap과 같은 스캐닝 툴로부터 방어하기 위해 사용할 수 있다.

 

15 ListenAddress 0.0.0.0
- 서버에 네트워크 인터페이스가 하나 이상일때 (ip주소가 1개 이상일때) SSH 서버스를 제공할 IP를 지정

 

21 Protocol 2
- SSHv1은 이미 중간자 공격 (Man in the Middle Attack)에 노출됐으므로 SSHv1은 사용하지 않고 SSHv2만 사용하게 설정한다.
 
42 PermitRootLogin yes
- SSH서버는 기본적으로 root 계정 접속을 허용하고 있는데 이것을 금지하고 일반 사용자로만 접속하게 설정하는 것이 좋다.

 

56 HostbasedAuthentication no
- 이미 취약점이 많이 발견된 오래된 인증 방식으로 사용하지 않음

 

65 PermitEmptyPasswords no
66 PasswordAuthentication no

 

119 ClientAliveInterval 0
- 일정한 시간 동안 클라이언트로부터 데이터 전송이 없는 경우 초 단위로 세션을 끊기 위해 사용


120 ClientAliveCountMax 3
- ClientAliveInterval 설정된 시간이 지났을때 몇번 재시도 할지 설정하기 위해 사용

  ex) ClientAliveInterval 100 ClientAliveCountMax 3 --->  100초 * 3번 = 300초 동안 응답이 없으면 세션 연결 해제
 
126 #ChrootDirectory none -> ChrootDirectory /home/u%

- 접속하는 사용자의 접근 가능한 최종 디렉토리를 자신의 홈디렉토리 제한 하는 설정

 

디버깅 모드 (ssh 동작할때 클라이어느와 서버가 통신하는 과정 확인 가능)


#ssh -v   // 동작과정 출력
#ssh -vv  // 더 자세하게 동작과정 출력
#ssh -vvv // 더더 자세하게 동작과정 출력

'Linux' 카테고리의 다른 글

Day-30 DHCP  (0) 2017.01.23
Day-29 DHCP  (0) 2017.01.22
Day-27 SSH  (0) 2017.01.19
Day-26 NTP  (0) 2017.01.19
Day-25 Telnet, VNC, SSH  (0) 2017.01.18