리눅스 - FTP, FTPS, SFTP 그리고 SSH

정현우·2021년 10월 9일
2

Linux Basic to Advanced

목록 보기
6/16

File Transfer

깊은 이해를 위해서는 네트워크 프로토콜 / TCP,IP / 암호화 - 암호화 양방향, 단방향, 대칭키(비공개키), 비대칭키(공개키) 의 기본 지식이 필요하다.

  • ps) TCP/IP는 패킷 통신 방식의 인터넷 프로토콜인 IP (인터넷 프로토콜)와 전송 조절 프로토콜인 TCP (전송 제어 프로토콜)이다. 인터넷 프로토콜 스위트

File Transfer Protocol

FTP

  • File Transfer Protocol

  • 최초의 FTP 클라이언트 애플리케이션들은 운영 체제가 그래픽 사용자 인터페이스를 갖추기 이전에 개발된 명령 줄 프로그램이었으며, 대부분의 윈도우, 유닉스, 리눅스 운영 체제에 현재도 기본 포함되어 있다.그 뒤로 수많은 FTP 클라이언트 및 오토메이션 유틸리티들이 데스크톱, 서버, 모바일 장치, 하드웨어용으로 개발되고 있으며, FTP는 웹 페이지 편집기와 같은 생산성 응용 프로그램들에 통합되고 있다.

  • FTP는 명령어를 전달하는 21 포트와 데이터를 전달하는 20(혹은 랜덤) 포트가 있다.

    • 능동 모드(액티브 모드): 서버가 자신의 데이터 포트인 20번 포트에서부터 클라이언트가 지정한 지점으로의 데이터 연결을 만든다. 클라이언트가 지정하는 포트는 주로 1023 보다 큰 번호가 매겨진 포트이다. 클라이언트가 방화벽, NAT(IP 마스킹) 등을 사용하는 환경일 때에 잘 동작하지 않을 수 있는데, 이때 수동 모드를 이용하면 된다.

    • 수동 모드(패시브 모드): 클라이언트가 서버가 지정한 서버 포트로 연결할 수 있게 한다. 이 때에는 보통 양쪽 포트 모두 1023 보다 큰 포트를 사용한다.

FTPS

  • ftp에 https 개념을 추가한 것이다. TLS/SSL을 거친다는 의미다. http와 https는 따로 다룰 예정이다. TLS/SSL 찍어먹기
  • ftp에다가 보조 데이터 채널을 덧붙인 것이 ftps다. 결국 TLS/SSL을 거치면 '공개키 암호화 방식' 등을 이용한 통신 라인을 거치며 ftp 포트로 주로 사용하는 20, 21 포트를 암호화를 한다는 의미이다.

  • 공개키 암호화 방식이라면 공개키가 노출되어도 각 서버가 가진 비공개 개인키로만 풀 수 있기때문에 문제가 없다. FTPS는 SFTP와 다르게 사람이 직접 통신을 이해하고 읽을 수 있습니다!

  • SSL/TLS는 강력한 인증 매커니즘 역할 -> 그 X.509 인증서 기능과 함께 제공 된다. 그리고 FTP 및 SSL / TLS 지원은 많은 인터넷 통신 프레임 워크에 내장되어 있다.

  • 모든 FTP 서버에서 SSL/TLS 지원을 사용할 수 있는 것은 아니다. 그리고 파일 이름 문자 집합(인코딩)에 대한 지침이 없다. 그리고 파일 또는 디렉토리 속성을 가져오고 변경하는 표준 방법이 없다. "표준이 없다"는 사용하는 이에 따라 방법이 너무 다양해서 도입 또는 협업할때 충돌 가능성이 농후하다.

  • FTPS는 보조 데이터 채널(SSL/TLS)의 사용을 요구하므로 방화벽 뒤에서 사용이 복잡해집니다.

SFTP / SSH

  • FTP에 Secure을 더한 버전, 기존 ftp의 보안 취약점 보안을 위해 TCP connection이후 Key교환을 통해 서로 신원을 확인 한 후, file transfer를 진행하는 것이다.

  • ssh 방식을 이용하여 안전하게 암호화된 구간에서 ftp 기능을 이용하는 접근방법이다. 사실 ssh 기반의 ftp인 것이 맞고, ssh는 ssl인증서를 사용한다는 점이 사전 포인트이다. sftp는 ssh를 활용해 확장한 것이고, ftps와 다르게 보조 데이터 채널이 필요가 없다!

  • ssh는 기본적으로 아래와 같은 프로토콜 계층을 가지고 있다.

  • 그리고 위와 같은 순서로 Handshake protocol 연결과정을 거친다! 클라이언트와 서버간에 session을 생성하여 인증 과정을 거치고 사용할 알고리즘을 결정하고, 서버와 클라이언트가 상호인증하며 암호화 MAC 알고리즘 키를 협상한다. 그리고 응용 데이터 전송 전에 사용한다.

  • 핵심은 '암호화 된 구간' 에서 'ftp' 기능 이용하는 것이 sftp라는 것이다.

  • 언급하였듯이, 보조 데이터 채널이 필요 없고 하나의 연결만 필요하다. 그리고 그 연결 구간은 안전하게 보호된다. 그리고 추가적으로 제공하는 파일 감금, 속성 조작, 권한 작업 등 과 같은 더 많은 기능이 포함되어 있다. 그리고 SFTP 구성 표준이 있다.

  • 통신할때 사람이 바로 이해하기 힘든 '이진 통신'에 관여한다. 그리고 ssh키 유효성 검사 및 관리는 복잡해질 수 있다. .NET, VCL에는 기본적으로 SSH/SFTP 지원이 포함되어 있지 않다.


SFTP 직접 사용하기

sftp 연결

  • sftp -P portnumber hostname@host_ip
  • 위 command로 sftp connection이 가능하다. 즉 tcp connection이 open된 상태가 된다. 물론 우린 sftp가 설치가 되어 있어야 한다. (sftp는 기본적으로 ssh를 사용하는 것을 상기하자!)

  • sftp로 타겟 서버의 sftp server에 tcp connection이 open된 상태이다.
  • 현재 타겟 서버의 ssh 인증을 공개키 암호화 방식으로 했고, 해당 경로에 있는 공개키의 내 암호를 입력하면 위와 같이 된다.

sftp with ssh

  • sftp가 기본적으로 ssh의 위에서 작동한다고 했다. ssh 키 기반으로 sftp를 접근해야하는 경우, 아래와 같이 사용하면 된다.
sudo sftp -i ~/.ssh/server_key.pem user@123.123.123.123
# -i 옵션뒤에 해당 서버 ssh 접속을 위한 pem 키가 있는 경로
# user @ server ip 로 접근 

sftp 사용하기

  • sftp에 접속하면 위와 같은 명령어들을 사용할 수 있다.

  • 내가 파일 올리려는 경로를 cd로 변경할 수 있다.
  • 이제 getput을 이용해 Download하고 Upload를 해보자! cd로 내가 다운 받고 싶은 파일 / 또는 디렉토리가 있는 곳으로 이동하고, get file_name 실시! => 디렉토리라면 -r 옵션을 붙여준다. get -r file_name

  • fetch ~ 그리고 다운로드 %, time 등이 나타난다. 완료되면 내 서버 기준으로, sftp를 호출한 경로에 해당 파일이 download가 된다.

  • 정상적으로 file download가 되었고, 해당파일로 바로 put을 해보자. sftp - remote server에서 get을 한 경로에서 다른 경로로 가서, put fule_name (역시 디렉토리는 -r옵션)

  • 성공적으로 upload도 진행했다! 사실 sftp로 파일 이동하는 것은 꽤 자주사용하고, 편한방법이다. 실제 현업에서도 ssh / sftp 는 아주 기본적인 명령어다.
  • 개인이 소규모로 작업하고, 작업하는 사람이 많이 없는 서버라면, 한 사람이 머저 마스터(또는 빌더)로써 버전관리들을 통합 관리 한 후, sftp로 한 번에 서버에 올리는 방법도 좋다! 특히 build과정이 필요없는 런타임 환경의 백엔드 환경들!
    • python, node(javascript) 등

출처

profile
도메인 중심의 개발, 깊이의 가치를 이해하고 “문제 해결” 에 몰두하는 개발자가 되고싶습니다. 그러기 위해 항상 새로운 것에 도전하고 노력하는 개발자가 되고 싶습니다!

0개의 댓글