0. 들어가며

서버를 관리하면서 SFTP(Secure File Transfer Protocol)를 사용하다 보면, 아래와 같이 SFTP 세션이 종료된 후에도 SSH(Secure Shell) 세션이 끊어지지 않고 유지되는 현상을 경험할 수 있습니다.

ps -ef | grep ssh
root     115547    1079  0 13:19 ?        00:00:00 sshd: testuser [priv]
testuser  115549 115547  0 13:19 ?        00:00:00 sshd: testuser@notty
root     116144    1079  0 15:19 ?        00:00:00 sshd: testuser [priv]
testuser  116147 116144  0 15:19 ?        00:00:00 sshd: testuser@notty
root     1787023    1079  0 17:19 ?        00:00:00 sshd: testuser [priv]
testuser  1787043 1787023  0 17:19 ?        00:00:00 sshd: testuser@notty
......................중략...............................

이는 서버의 리소스를 낭비할 뿐 아니라, 불필요한 보안 위협을 초래할 수도 있습니다. 이 글에서는 이러한 SSH 세션이 끊어지지 않는 현상의 발생 원인과 이를 해결하기 위한 서버 및 클라이언트 측의 해결 방안을 다루겠습니다.

1. 발생원인

SFTP는 SSH 프로토콜을 기반으로 작동하는 파일 전송 프로토콜로, SSH 세션을 통해 암호화된 파일 전송을 수행합니다. 그러나 SFTP 세션이 종료되었음에도 불구하고 SSH 세션이 여전히 활성화된 상태로 남아 있는 경우가 발생할 수 있습니다. 이러한 현상이 발생하는 이유는 다음과 같습니다.

1-1. SFTP와 SSH 세션의 기능적 분리

SFTP와 SSH는 서로 다른 목적을 가진 두 개의 프로토콜입니다. SFTP는 주로 파일 전송에 중점을 두고 있으며, SSH는 원격 명령 실행 및 시스템 관리에 사용됩니다. SFTP 세션이 SSH 프로토콜을 통해 통신하지만, SFTP 작업이 종료된다고 해서 SSH 세션이 자동으로 종료되는 것은 아닙니다. 이는 SSH 세션이 SFTP 외에도 다른 작업을 수행할 수 있도록 설계되어 있기 때문입니다. 예를 들어, 사용자가 SSH 터널링이나 추가적인 명령어 실행을 위해 SSH 세션을 계속 유지해야 할 필요가 있을 수 있습니다.

1-2. 서버의 세션 관리 설정

서버 측에서 SSH 세션을 유지하거나 종료하는 설정이 명확히 정의되어 있지 않으면, SFTP 작업이 끝난 후에도 SSH 세션이 계속 열려 있는 상황이 발생할 수 있습니다. 일반적으로 SSH 세션의 타임아웃은 sshd_config 파일에서 ClientAliveInterval 및 ClientAliveCountMax와 같은 옵션으로 설정할 수 있습니다. 그러나 이러한 설정이 SFTP 세션에 적절히 적용되지 않거나, 세션이 명시적으로 종료되지 않도록 설정되어 있다면 SSH 세션이 계속 유지될 수 있습니다.

1-3. 클라이언트 측의 세션 관리

클라이언트 측에서 SFTP를 사용한 후, SSH 세션을 수동으로 종료하지 않는 경우도 문제의 원인이 될 수 있습니다.

일부 클라이언트 애플리케이션은 SFTP 전송이 완료된 후에도 SFTP세션만 종료한 뒤 SSH 세션을 명시적으로 종료하지 않습니다. 이로 인해 SFTP 세션이 종료된 후에도 SSH 세션이 계속 활성화된 상태로 남게 됩니다.

1-4. SSH 터널링 및 포트 포워딩

SSH 터널링 및 포트 포워딩을 사용하고 있는 경우, 터널링 작업이 계속 유지되기 때문에 SSH 세션이 종료되지 않을 수 있습니다. SFTP는 파일 전송이 끝나면 세션이 종료될 수 있지만, 터널링이 여전히 필요하다면 SSH 세션은 유지되어야 합니다. 이 경우 SFTP 세션이 종료되더라도 SSH 세션이 계속 열려 있는 것은 정상적인 동작입니다. 

2. 해결방안

SSH 세션이 끊어지지 않는 문제를 해결하기 위해서는 서버와 클라이언트 양측에서 적절한 설정을 통해 세션을 관리해야 합니다. 다음은 이 문제를 해결하기 위한 구체적인 방안입니다.

2-1. 서버 해결방안

서버 측에서 SSH 세션이 불필요하게 유지되지 않도록 설정할 수 있습니다. 이를 위해 다음과 같은 조치를 취할 수 있습니다.

 

1. sshd_config 파일 설정: SSH 세션 타임아웃을 설정하여, 일정 시간이 지나면 세션이 자동으로 종료되도록 합니다. ClientAliveInterval과 ClientAliveCountMax 옵션을 사용하여 설정할 수 있습니다. 예를 들어, 특정 시간 동안 응답이 없으면 세션을 종료하도록 설정할 수 있습니다.

vi /etc/ssh/sshd_config

ClientAliveInterval 600        # 10분마다 클라이언트의 응답을 확인
ClientAliveCountMax 3          # 응답이 없으면 3번 시도 후 세션 종료

2. Match 블록 사용: 특정 사용자나 그룹에 대해서만 타임아웃 설정을 적용할 수 있습니다. 예를 들어, SFTP 전용 사용자는 타임아웃을 짧게 설정하고, 관리용 SSH 세션은 더 길게 유지하도록 설정할 수 있습니다.

vi /etc/ssh/sshd_config

Match User sftp_user
	ClientAliveInterval 600        # 10분마다 클라이언트의 응답을 확인
	ClientAliveCountMax 3          # 응답이 없으면 3번 시도 후 세션 종료

 

2-2. 클라이언트 해결방안

클라이언트 측에서도 SSH 세션이 불필요하게 유지되지 않도록 관리할 수 있습니다.

 

SSH 세션 수동 종료: SFTP 전송이 완료된 후, 클라이언트 측에서 SSH 세션을 명시적으로 종료하는 습관을 들입니다. 이는 간단하지만 확실한 방법입니다. 일반적인 SFTP클라이언트 프로그램은 자동으로 SSH세션이 종료되지만, 코딩된 프로그램의 경우 SSH세션을 종료하지 않는 경우가 간혹 발생합니다. 서버 환경에 따라 SSH서버의 옵션이 정상적으로 동작하지 않는경우도 있기때문에, 이에 대해 습관을 들이는게 가장 좋은 방법입니다.

3.결론

SFTP 사용 시 SSH 세션이 끊어지지 않는 현상은 SFTP와 SSH 프로토콜의 기능적 차이, 서버 및 클라이언트 측 설정의 미비 등 여러 가지 이유로 발생할 수 있습니다. 이 문제를 해결하기 위해서는 서버 측에서의 적절한 세션 관리 설정과 클라이언트 측에서의 명시적인 SSH 세션 종료가 필요합니다. 그러나, 서버 설정의 경우에 서버 구성에 따라 ClientAliveInterval과 같은 세션설정이 정상적으로 적용되지 않는 경우가 있으므로, 클라이언트측에서 설정하는것이 가장 바람직해보이며, 이를 통해 불필요한 SSH 세션이 남아 있는 것을 방지하고, 서버 리소스를 효율적으로 관리할 수 있습니다.

'System > System' 카테고리의 다른 글

TLS/SSL 인증서에 대한 정리  (0) 2024.04.05

+ Recent posts