1. 시작하며
Jenkins를 활용한 CI/CD 파이프라인 설정 중 Publish over SSH 플러그인을 사용하여 서버 간 파일 전송 및 배포를 설정하려 했지만, 예상치 못한 인증 오류로 인해 막히는 경우가 종종 있습니다. 이번 포스트에서는 BapPublisherException
오류의 원인과 해결 방법을 공유합니다.
2. 문제점 발생
Main Server(192.168.0.25)에 설치된 Jenkins를 통해 Sub Server(192.168.0.47)로 배포를 진행하려고 했습니다. 이를 위해 Jenkins의 Publish over SSH 플러그인을 사용하여 SSH 통신을 설정했지만, 다음과 같은 오류가 발생했습니다.
jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [Sub Server SSH]. Message [Auth fail for methods 'publickey']]
문제점을 요약하면 다음과 같습니다.
- 공개키 및 개인키는 모두 정상적으로 생성하고 설정 완료
- Jenkins와 Sub Server 간 SSH 통신이 인증 단계에서 실패
- OpenSSH와 Jenkins 플러그인 간의 호환성 문제 의심
2.1 원인 분석
1) OpenSSH 8.8의 보안 정책 변경
- OpenSSH 8.8 이상에서는 SHA-1 해시 알고리즘을 사용하는 RSA 키를 기본적으로 지원하지 않습니다.
ssh-rsa
방식은 PubkeyAcceptedAlgorithms에서 제외되었으며, 대신 ECDSA 또는 ED25519 알고리즘 사용을 권장합니다.
2) Publish over SSH 플러그인의 한계
- Jenkins의 Publish over SSH 플러그인은 내부적으로 JSch 라이브러리를 사용합니다.
- JSch는 최신 암호화 알고리즘을 지원하지 않으며, 특히
rsa-sha2-256
및rsa-sha2-512
와 같은 최신 RSA 서명을 처리할 수 없습니다. - 결과적으로 RSA 키를 사용하면 인증이 실패하고,
BapPublisherException
오류가 발생합니다.
3. 문제점 해결
1) ECDSA 키 사용
문제를 해결하려면 RSA 키 대신 ECDSA 키를 사용해야 합니다. 아래 명령어를 통해 ECDSA 키를 생성합니다.
ssh-keygen -t ecdsa -b 521 -m PEM
t ecdsa
: ECDSA 키 생성b 521
: 521비트 키 생성 (최대 보안)m PEM
: PEM 형식으로 키 저장
2) 생성된 키 설정
- Sub Server에 공개키 등록
생성된 공개키를 Sub Server의~/.ssh/authorized_keys
파일에 추가합니다.
sudo nano ~/.ssh/authorized_keys
- Jenkins에 개인키 설정
Jenkins의 Manage Jenkins > Configure System > Publish over SSH 메뉴에서 Jenkins SSH Key로 이동하여 다음과 같이 설정합니다.
- Key: 생성된 개인키(
~/.ssh/id_ecdsa
)를 복사하여 입력 - Passphrase: 개인키 생성 시 입력한 암호 (비워둔 경우 공란 유지)
3) SSH 설정 및 통신 테스트
Jenkins에서 설정한 SSH 연결 정보와 키를 활용하여 통신 테스트를 진행합니다. 다음 과정을 따라 설정 및 테스트를 완료할 수 있습니다.
- SSH Server 정보 입력
- Name: 연결하려는 서버 이름(예:
Sub Server SSH
) - Hostname: Sub Server의 IP 주소(예: 192.168.0.47)
- Main Server와 Sub Server가 같은 네트워크를 사용하기 때문에 여기서는 사설 IP를 입력하였습니다.
- Username: Sub Server에 접속할 사용자 이름 (계정)
- Remote Directory: 파일이 전송될 서버의 디렉토리 경로(필요에 따라 설정, 빈칸으로 두어도 무방)
- 빈칸으로 둔 경우 해당 계정으로 접속한 디렉토리로 전송합니다. (예: /home/계정명)
- Name: 연결하려는 서버 이름(예:
- Jenkins의 Manage Jenkins > Configure System > Publish over SSH 메뉴에서 다음 정보를 입력합니다.
- 키와 연결 정보 확인
- SSH Server 정보를 입력한 후, Test Configuration 버튼을 눌러 연결 상태를 확인합니다. 설정이 정상적이라면
Success
메시지가 나타납니다.
4. 결론
이번 사례를 통해 Jenkins의 Publish over SSH 플러그인을 사용할 때, OpenSSH와 JSch의 호환성 문제로 인해 ECDSA 또는 ED25519 키를 사용하는 것이 필수적임을 확인했습니다. 요약하면 다음과 같습니다.
- OpenSSH 8.8 이상에서는 SHA-1 기반 RSA 키가 차단됩니다.
- ECDSA 521비트 키는 보안성과 호환성을 모두 충족합니다.
- Jenkins Publish over SSH 플러그인은 JSch 라이브러리의 한계로 최신 암호화 알고리즘을 완벽히 지원하지 않습니다.
5. 참고자료
'트러블 슈팅' 카테고리의 다른 글
[트러블 슈팅] RESTful API 설계: GET 메서드에서 Request Body를 사용해도 될까? (0) | 2025.01.13 |
---|---|
[트러블 슈팅] SSH 접속 오류: 포트 설정과 포트포워딩의 중요 (1) | 2025.01.05 |