서버

SSH 동작 원리

southouse 2021. 9. 6. 15:11
728x90

Docker 환경 Jenkins에서 Slave 노드 구성을 하는데 SSH 연결 수립에 아래와 같은 문제가 생겨 원인을 찾던 중에 SSH 동작에서 왜 이런 에러가 발생하는지 궁금해서 SSH 동작 원리에 대해 공부하게 됐고, 이 문제에 대해서 해결할 수 있었다.

jenkins@a09ec2ec29aa:~/.ssh$ ssh jenkins@agent1
jenkins@agent1: Permission denied (publickey,keyboard-interactive).

SSH란?

시큐어 셸(Secure Shell, SSH)은 OSI 계층에서 애플리케이션 계층에 속하며 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 그 프로토콜을 가리킨다.

SSH 암호화 방식

SSH 동작에 있어서 사용되는 암호화 방식은 두 가지이다.

  • 대칭키 방식 → 데이터를 암호화하는 데 사용
  • 비대칭키 방식 → 서버 인증과 사용자 인증하는 데 사용

오늘은 인증 동작에 대해서만 작성하려고 한다.


서버 인증 동작 방식

  1. 서버에서 공개키와 비밀키를 생성한다.
  2. 클라이언트가 서버에 처음 접속 시도하면 서버의 공개키를 받아서 클라이언트에 있는 .ssh/known_hosts 파일에 저장한다.
  3. 클라이언트는 난수값을 생성하여 난수의 해시값을 만들어 저장한다.
  4. 난수 값을 서버의 공개키로 암호화하여 서버에 전송한다.
  5. 서버에서는 암호화된 데이터를 비밀키로 복호화하여 난수 값을 얻어 낸다.
  6. 난수 값으로 해시값을 만들어 클라이언트에 전송한다.
  7. 클라이언트에서 저장하고 있는 3번 단계의 해시값과 서버로부터 전달받은 6번 단계의 해시값을 비교해 서버를 인증하게 된다.

사용자 인증 동작 방식

서버 인증 동작 방식에서 매개체인 클라이언트와 서버만 서로 바뀌면 사용자 인증 동작 방식이다.

  1. 클라이언트에서 공개키와 비밀키를 생성한다.
  2. 클라이언트의 공개키를 서버의 .ssh/authorized_keys 파일에 저장한다.
  3. 서버는 난수값을 생성하여 난수의 해시값을 만들어 저장한다.
  4. 난수 값을 클라이언트의 공개키로 암호화하여 클라이언트에 전송한다.
  5. 클라이언트에서는 암호화된 데이터를 비밀키로 복호화하여 난수 값을 얻어 낸다
  6. 난수 값으로 해시값을 생성해 다시 서버에 전송한다.
  7. 서버에서 저장하고 있는 3번 단계의 해시값과 클라이언트로부터 전달받은 6번 단계의 해시값을 비교해 사용자 인증을 하게 된다.

사용자 인증 동작 방식으로, 실제로 필자가 Docker 환경 Jenkins SSH 구성에서 사용했던 방식이기도 하다.


더하여

필자는 Jenkins 환경에서 마스터 노드에서 슬레이브 노드에 key를 이용하여 SSH 접속을 하려고 했었다. 따라서, 마스터 노드는 클라이언트, 슬레이브 노드는 서버였었고, '사용자 인증 동작 방식' 에서 2번 단계 즉, 클라이언트가 서버에게 공캐키를 전달하여 서버에서 저장하는 과정에서 문제가 생겼다. 따라서 슬레이브 노드 컨테이너에 접속하여 .ssh/authorized_keys에 있는 공개키를 다시 클라이언트의 공개키로 설정하여 이 문제를 해결하였다.


Reference

https://bit.ly/3h5oOoS

300x250