⚡ 개요
리눅스 운영 서버에서 운영중인 웹 서비스에서 SFTP 접속 관련 이슈가 발생했고, 원인 분석 및 수정을 어떻게 했는지 내용을 정리 하려고 한다.
⚡이슈 및 수정 내용 정리
이슈가 발생 했고 운영 서버의 로그를 확인해본 결과, connection 관련 null 이라는 Exception만 찍히고 있었다. 😭
해당 부분의 로그 설정이 printStackTrace 로 되어 있었고, 이로 인해서 리눅스 환경에서 로그를 찍지 않고 리턴된 값에 대해서만 찍고 있었다.
물론 개발 서버에서 SFTP 관련 테스트 및 로그 보강등 추가적인 작업을 했지만 운영 서버에 반영을 할 수 없는 상황이라서 connection 관련해서 null이 반환 되는지 찾아보고 처리하는 방법 밖에 없었다.
내부에서는 JAVA에서 SFTP 연결에 사용하는 라이브러리로 JSch 라이브러리를 사용하고 있다.사용 방법은 매우 간단하다.
// 접속값 셋팅
session = new JSch().getSession("User Name", "IP", "PORT");
session.setPassword("PassWord");
// 설정 작업
Properties config = new Properties();
confing.put("설정 내용", "설정값")
session.setConfig(config);
// 연결
session.connect();
// SFTP 채널 Open 및 연결
Channel channel = session.openChannel("sftp");
channel.connect();
예시 샘플 소스이다.
운영 단계에서는 추가적인 설정 및 내용들이 있고 라이브러리 내부에는 많은 내용이 숨겨져 있겠지만, 연결할때 위와 같이 쉽게 셋팅이 가능하다. 위와 같이 셋팅을 했는데 정상적으로 연결이 되지 않는다면 네트워크 보안 이슈일 가능성이 매우 높다.
기본적으로 SFTP 포트가 열려 있는지, IP에 Ping이 날라가는지, 접속 계정에 권한이 없다거나, 오타 발생등.. 로그를 확인 한다면 바로 확인이 가능하지만 확인이 불가능한 상태에서 여러가지의 변수를 하나씩 확인 해보는 수밖에 없었다.
쉽게 확인 가능한 오타 및 계정 권한, Ping, 포트 확인의 경우는 바로 확인이 되었고 문제가 없다는것이 확인 되었다.
근데 운영 서버에서 직접 SFTP 서버에 붙을때 바로 붙지 않고 시간이 걸리는것을 캐치했고 혹시 타임 아웃이 걸리는것은 아닌가 하고 내용을 확인 해보았다.
리눅스에서 openssh-server 패키지를 설치했고, sshd_confing 설정을 하는 부분에 클라이언트 호스트 주소를 DNS로 해석하는 옵션이 존재하는데 이부분을 사용중이라서 문제가 되고 있었다.
UseDNS yes
ㄴ 클라이언트 호스트 주소를 DNS 해석
해당 옵션을 사용하게 되는 경우 SFTP를 연결할때 DNS 를 찾고 연결을 하려고 시도를 한다. 이 과정에서 기본 session TimeOut 시간 이상 만큼 소요가 되고 실제 SFTP에 연결을 할떄는 TimeOut이 발생하게 된다.
운영서버에서는 도메인을 사용하지 않는데 해당 옵션이 켜져있는 상태였고, 해당 옵션을 끄고 실행하니 정상적으로 붙는 부분을 확인 할수 있었다.
만약 해당 옵션 말고 다른 옵션을 사용해서 TimeOut이 발생 한다면 커넥션을 하는 부분에서 TimeOut 추가가 가능하다.(TimeOut의 시간은 ms(밀리초) 이다.😁)
⚡생각
해당 이슈에 대해서 원인 분석 및 해결을 하면서 내부 SFTP 관련 리팩터링 작업을 같이 진행 했으며 추가적으로 로그 보강, 설정 파일에 대한 내용 체크등을 다시 한번 해보게 되었다. 또한 다른 SFTP 관련 라이브러리에 대해서도 찾아보고 테스트 진행중이다.
혹시라도 증상이 발생하더라도 로그를 정상적으로 찍었다면 로그를 확인해서 처리가 가능하다고 생각한다. 설정 관련된 부분은 다른분들이 정리를 잘 해놓으신게 있어서 이슈가 발생했을때 찾아보면 될거 같다.
⚡참조
'Spring' 카테고리의 다른 글
[Spring] Spring Event 기능 구현하기 ApplicationEventPublisher 이용하기 (0) | 2023.08.05 |
---|---|
[JPA] Spring Boot 에서 QueryDsl 사용 방법 정리 (0) | 2023.06.24 |
[Spring Boot] QueryDsl Qclass 에 대한 내용 정리 (0) | 2023.04.23 |
[Spring Boot] spring boot + mybatis 사용 방법 정리 (0) | 2023.04.15 |
[Spring Boot] application.yml 설정 파일 우선순위에 대한 내용 정리 (1) | 2023.03.07 |