Skip to content

8. SSH 인증키와 프록시


1. SSH 인증키(공개키와 비공개키) 생성하기

001


  • 위의 그림과 같이 [My Server]에서 [Target Server]로 SSH 접속을 하려면 기본적으로 [Target Server]의 비밀번호를 입력해야 하지만, SSH 인증키를 이용하면 이를 생략할 수 있다.


002


  • 먼저, [My Server]에서 인증키(공개키 및 비공개키)를 생성한 후 [Target Server]에 공개키를 저장한다.
  • 그런 다음 SSH 접속을 하면 다음과 같은 단계를 거쳐 인증이 된다.


1] [My Server]에서 [Target Server]로 SSH 연결을 초기화한다.

2] [Target Server]에서 랜덤 메시지를 생성한 후 [My Server]로 랜덤 메시지를 보낸다.

3] [My Server]에서 랜덤 메시지를 비밀키로 암호화한 후 [Target Server]로 암호화된 랜덤 메시지를 보낸다.

4] [Target Server]에서 암호화된 랜덤 메시지를 [My Server]의 공개키로 복호화하고, 이때 [Target Server]가 생성했던 랜덤 메시지와 동일하면 [My Server]로 인증 확인을 보낸다.

5] [My Server]와 [Target Server]는 세션키를 교환하고, 이후 통신을 할 수 있게 된다.


  • [My Server]에서 인증키를 생성하기 위해 먼저 ~/.ssh 디렉터리를 확인한다.


ls ~/.ssh


  • 이때 만약 ~/.ssh 디렉터리가 없다면 다음과 같이 생성하고 권한을 설정한다.


mkdir ~/.ssh
chmod 700 ~/.ssh
ls ~/.ssh


  • 인증키를 생성하려면 다음과 같이 ssh-keygen 명령을 실행하면 된다


ssh-keygen -t 암호화방식 -f ~/.ssh/생성할인증키이름 -C "코멘트"
ssh-keygen -t rsa -f ~/.ssh/target -C "SAEMC"


  • 위와 같이 인증키를 생성하면 targettarget.pub 파일이 생성된다.
  • 여기서 target은 비공개키이고, target.pub은 공개키인데, 이 공개키를 [Target Server]에 저장해야 한다.
  • cat 명령을 통해 target.pub의 내용을 출력하여 확인한 후 해당 내용을 복사한다.


cat ~/.ssh/target.pub


  • [Target Server]에 비밀번호를 입력하는 등으로 접속한 후 동일하게 ~/.ssh 디렉터리를 확인한다.
  • 마찬가지로 ~/.ssh 디렉터리가 없는 경우 디렉터리를 생성한 후 권한을 설정해야 한다.


ls ~/.ssh


  • 또한 만약 authorized_keys 파일이 없다면 다음과 같이 생성하고 권한을 설정한다.


touch ~/.ssh/authorized_keys
chmod 700 ~/.ssh/authorized_keys


  • [My Server]에서 복사했던 내용을 authorized_keys에 붙여넣는다.


vim ~/.ssh/authorized_keys
([My Server] ~/.ssh/target.pub 내용 복사)


  • [My Server]에서 인증키를 이용한 SSH 접속을 하려면 다음과 같이 입력한다.


ssh -i 비공개키파일경로 TargetServer유저이름@TargetServer아이피주소 -p TargetServerSSH포트
ssh -i ~/.ssh/target target@target.com -p 1234


2. SSH 프록시 사용하기

003


  • 위의 그림과 같이 [My Server]에서 [Target Server]로 접속하는데 보안 문제로 항상 [Proxy Server]를 거쳐야 하는 경우가 있다.
  • 이런 경우 매번 [My Server]에서 [Proxy Server]로 접속한 후, [Proxy Server]에서 [Target Server]로 접속해야 하기 때문에 상당히 번거롭다.
  • 이를 해결하기 위해서는 SSH 프록시 기능을 이용하면 되는데, 이때 위와 동일하게 인증키를 생성하여 비밀번호를 생략할 수 있도록 한다.


004


  • 인증키는 [My Server]에서 [Proxy Server], 그리고 [Proxy Server]에서 [Target Server]의 관계처럼 생성하지 않는다.
  • 위의 그림처럼 [My Server]에서만 인증키(공개키 및 비공개키)를 생성한 후 [Proxy Server] 및 [Target Server]에 공개키를 저장하면 된다.


  • 먼저 [My Server]에서 [Proxy Server] 및 [Target Server]와의 인증키를 다음과 같이 생성한 후 각 공개키(~/.ssh/proxy.pub~/.ssh/target.pub)의 내용을 각 서버의 authorized_keys 파일에 복사하여 저장한다.
  • 현재의 경우 [My Server]에서 각 서버와의 인증키를 각각 생성해서 각 서버에 서로 다른 공개키를 저장한다.
  • 하지만 인증키 한 개만 생성한 후 각각 서버에 동일한 공개키를 저장할 수 있는데, 이런 경우 공개키의 유출이 있는 경우 모든 서버의 보안에 대해 보장할 수 없다.
  • 그래서 다음의 과정부터는 각각 서버에 대해 인증키를 서로 다르게 생성하는 경우이다.


ssh-keygen -t rsa -f ~/.ssh/proxy -C "proxy"
ssh-keygen -t rsa -f ~/.ssh/target -C "target"


  • 위의 코드에서는 ~/.ssh/proxy~/.ssh/tartget에 대해 코멘트를 proxytarget으로 지정했다.
  • 마지막으로 [My Server]에서 config 파일을 생성한 후 다음과 같이 작성한다.


vim ~/.ssh/config
Host ProxyServer실행시사용할이름
HostName ProxyServer의아이피주소
Port ProxyServer의SSH포트
User ProxyServer의유저이름
IdentityFile ProxyServer와의비공개키

Host TargetServer실행시사용할이름
HostName TargetServer의아이피주소
Port TargetServer의SSH포트
User TargetServer의유저이름
IdentityFile TargetServer와의비공개키
ProxyCommand ssh -W %h:%p ProxyServer실행시사용할이름
Host PROXY
HostName proxy.com
Port 4321
User proxy
IdentityFile ~/.ssh/proxy

Host TARGET
HostName target.com
Port 1234
User target
IdentityFile ~/.ssh/target
ProxyCommand ssh -W %h:%p PROXY


  • 이때 하단의 ProxyCommand에 입력되는 -W 옵션은 클라이언트의 표준 입력 및 출력을 프록시 서버(PROXY)의 호스트(%h)와 포트(%p)를 통해 타겟으로 전달되도록 요청한다.
  • 이를 config 파일이 아닌 명령어줄에서 위와 동일하게 사용하려면 다음과 같이 작성해야 하는데, 이때 -o 옵션에는 수많은 옵션이 포함될 수 있고 현재는 ProxyCommand 옵션을 사용한 것이다.


ssh -o ProxyCommand="ssh proxy@proxy.com -p 4321 -i ~/.ssh/proxy -W %h:%p" \
  target@target.com -p 1234 -i ~/.ssh/target


  • 위의 명령어줄과는 별개로 config 파일을 설정하면 [My Server]에서 간단하게 각 서버에 접속할 수 있다.


ssh PROXY  # Proxy Server로 접속
ssh TARGET # Target Server로 접속

References