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 동작에 있어서 사용되는 암호화 방식은 두 가지이다.
대칭키 방식
→ 데이터를 암호화하는 데 사용비대칭키 방식
→ 서버 인증과 사용자 인증하는 데 사용
오늘은 인증 동작에 대해서만 작성하려고 한다.
서버 인증 동작 방식
- 서버에서 공개키와 비밀키를 생성한다.
- 클라이언트가 서버에 처음 접속 시도하면 서버의 공개키를 받아서 클라이언트에 있는
.ssh/known_hosts
파일에 저장한다. - 클라이언트는 난수값을 생성하여 난수의 해시값을 만들어 저장한다.
- 난수 값을 서버의 공개키로 암호화하여 서버에 전송한다.
- 서버에서는 암호화된 데이터를 비밀키로 복호화하여 난수 값을 얻어 낸다.
- 난수 값으로 해시값을 만들어 클라이언트에 전송한다.
- 클라이언트에서 저장하고 있는
3번 단계의 해시값
과 서버로부터 전달받은6번 단계의 해시값
을 비교해 서버를 인증하게 된다.
사용자 인증 동작 방식
서버 인증 동작 방식에서 매개체인 클라이언트와 서버만 서로 바뀌면 사용자 인증 동작 방식이다.
- 클라이언트에서 공개키와 비밀키를 생성한다.
- 클라이언트의 공개키를 서버의
.ssh/authorized_keys
파일에 저장한다. - 서버는 난수값을 생성하여 난수의 해시값을 만들어 저장한다.
- 난수 값을 클라이언트의 공개키로 암호화하여 클라이언트에 전송한다.
- 클라이언트에서는 암호화된 데이터를 비밀키로 복호화하여 난수 값을 얻어 낸다
- 난수 값으로 해시값을 생성해 다시 서버에 전송한다.
- 서버에서 저장하고 있는
3번 단계의 해시값
과 클라이언트로부터 전달받은6번 단계의 해시값
을 비교해 사용자 인증을 하게 된다.
더하여
필자는 Jenkins 환경에서 마스터 노드에서 슬레이브 노드에 key를 이용하여 SSH 접속을 하려고 했었다. 따라서, 마스터 노드는 클라이언트
, 슬레이브 노드는 서버
였었고, '사용자 인증 동작 방식' 에서 2번 단계
즉, 클라이언트가 서버에게 공캐키를 전달하여 서버에서 저장하는 과정에서 문제가 생겼다. 따라서 슬레이브 노드 컨테이너에 접속하여 .ssh/authorized_keys
에 있는 공개키를 다시 클라이언트의 공개키로 설정하여 이 문제를 해결하였다.
Reference
300x250