8. SSH 인증키와 프록시
1. SSH 인증키(공개키와 비공개키) 생성하기
- 위의 그림과 같이 [My Server]에서 [Target Server]로 SSH 접속을 하려면 기본적으로 [Target Server]의 비밀번호를 입력해야 하지만, SSH 인증키를 이용하면 이를 생략할 수 있다.
- 먼저, [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
디렉터리를 확인한다.
- 이때 만약
~/.ssh
디렉터리가 없다면 다음과 같이 생성하고 권한을 설정한다.
- 인증키를 생성하려면 다음과 같이
ssh-keygen
명령을 실행하면 된다
- 위와 같이 인증키를 생성하면
target
과target.pub
파일이 생성된다. - 여기서
target
은 비공개키이고,target.pub
은 공개키인데, 이 공개키를 [Target Server]에 저장해야 한다. cat
명령을 통해target.pub
의 내용을 출력하여 확인한 후 해당 내용을 복사한다.
- [Target Server]에 비밀번호를 입력하는 등으로 접속한 후 동일하게
~/.ssh
디렉터리를 확인한다. - 마찬가지로
~/.ssh
디렉터리가 없는 경우 디렉터리를 생성한 후 권한을 설정해야 한다.
- 또한 만약
authorized_keys
파일이 없다면 다음과 같이 생성하고 권한을 설정한다.
- [My Server]에서 복사했던 내용을
authorized_keys
에 붙여넣는다.
- [My Server]에서 인증키를 이용한 SSH 접속을 하려면 다음과 같이 입력한다.
2. SSH 프록시 사용하기
- 위의 그림과 같이 [My Server]에서 [Target Server]로 접속하는데 보안 문제로 항상 [Proxy Server]를 거쳐야 하는 경우가 있다.
- 이런 경우 매번 [My Server]에서 [Proxy Server]로 접속한 후, [Proxy Server]에서 [Target Server]로 접속해야 하기 때문에 상당히 번거롭다.
- 이를 해결하기 위해서는 SSH 프록시 기능을 이용하면 되는데, 이때 위와 동일하게 인증키를 생성하여 비밀번호를 생략할 수 있도록 한다.
- 인증키는 [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/proxy
와~/.ssh/tartget
에 대해 코멘트를proxy
와target
으로 지정했다. - 마지막으로 [My Server]에서
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]에서 간단하게 각 서버에 접속할 수 있다.