Jenkins Publish over SSH 플러그인을 제대로 설치도 하고 서버에 공개키 세팅해 주고, Jenkins에 개인키 설정까지 다 마쳤는데, 인증이 언젠가부터 안되는 분들 계시죠? Jenkins에서 BapPublisherException 발견하셨나요? 저도 원인 파악하느라 고생을 했는데, 공유합니다.
목차
Test Configuration 실행하면 BapPublisherException 예외발생
혹시 아래와 같은 명령어로 인증서 만드셨나요? 그런데 예외가 발생하지는 않으셨나요?
만약에 오류를 만나지 않으셨다면, 아마 사용하는 서버의 OpenSSH 버전이 8.8보다 낮을 가능성이 있습니다.
ssh-keygen -t rsa -b 4096 -m PEM
ShellScript분명 SHA256까지 적용이 됐는데 말이죠. 심지어 키 크기까지 4096bit로 잡아줬는데, Test Configuration 눌렀는데 아래와 같은 오류 메시지가 나왔나요?
jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [My Server]. Message [Auth fail]]
일단 생각하시는대로 키는 제대로 생성된 게 맞습니다. 그런데 왜 안돼냐 말이죠! 그건 Jsch 때문인데, 자세한 내용 살펴보겠습니다.
OpenSSH 8.8 SHA-1 미지원 결정
우선 OpenSSH 8.8부터 SHA-1 해시 알고리즘을 사용하는 RSA 시그니처를 지원하지 않기로 결정했습니다. SHA-1은 해시 충돌이 발생할 수 있습니다. 암호학적으로 부서졌다는 거죠. 한마디로 요약하면 보안상 안전하지 않으니, 앞으로는 허용하지 않겠다는 거겠죠.
그런데 Publish over SSH는 JCraft에서 만든 Jsch라는 라이브러리를 사용하여 개발했습니다. 문제는 Jsch 라이브러리가 최신 기술들을 반영하고 있지 않다는 겁니다. rsa-sha2-256이나 rsa-sha2-512를 사용할 수도 없고, ed25519도 지원하지 않습니다. 그래서 Publish over SSH를 사용해서 연결을 테스트 하면 서버에 아래와 같은 로그가 찍히며 인증이 되지 않습니다. 맞습니다. OpenSSH에서 거부하는 장면입니다. 인증키를 SHA-2인 SHA256으로 생성해도 SHA-1으로 처리되는 순간입니다.
Dec 19 16:32:51 instance-20210904-0100 sshd[148076]: userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]
해결책: ECDSA 사용하기
OpenSSH 8.8 배포 설명에서는 ecdsa나 ed25519를 대신 사용하라고 권장하고 있습니다. 다행이 Jsch에서 ecdsa를 지원합니다. 아래와 같이 개인키/공개키 쌍을 생성해서 사용하면 제대로 인증이 되는 것을 확인할 수 있습니다.
ssh-keygen -t ecdsa -b 521 -m PEM
ShellScript일단 당분간 큰 문제가 없는 한 ecdsa를 이용하면 되지 않을까 싶습니다. Publish over SSH 깃헙에도 해당 이슈가 아직 열려있습니다. 관심 있는 분들의 기여가 있다면 또 개선이 되지 않을까 싶습니다.
문제 해결에 도움이 된 링크 공유
OpenSSH 8.8 릴리즈 문서와 Github Publish over SSH의 인증 오류 관련 이슈를 참고했습니다.
감사합니다 덕분에 해결했어요
도움이 되셨다니, 다행입니다^^