깊은 이해를 위해서는 네트워크 프로토콜 / TCP,IP / 암호화 - 암호화 양방향, 단방향, 대칭키(비공개키), 비대칭키(공개키) 의 기본 지식이 필요하다.
File Transfer Protocol
최초의 FTP 클라이언트 애플리케이션들은 운영 체제가 그래픽 사용자 인터페이스를 갖추기 이전에 개발된 명령 줄 프로그램이었으며, 대부분의 윈도우, 유닉스, 리눅스 운영 체제에 현재도 기본 포함되어 있다.그 뒤로 수많은 FTP 클라이언트 및 오토메이션 유틸리티들이 데스크톱, 서버, 모바일 장치, 하드웨어용으로 개발되고 있으며, FTP는 웹 페이지 편집기와 같은 생산성 응용 프로그램들에 통합되고 있다.
FTP는 명령어를 전달하는 21 포트와 데이터를 전달하는 20(혹은 랜덤) 포트가 있다.
능동 모드(액티브 모드): 서버가 자신의 데이터 포트인 20번 포트에서부터 클라이언트가 지정한 지점으로의 데이터 연결을 만든다. 클라이언트가 지정하는 포트는 주로 1023 보다 큰 번호가 매겨진 포트이다. 클라이언트가 방화벽, NAT(IP 마스킹) 등을 사용하는 환경일 때에 잘 동작하지 않을 수 있는데, 이때 수동 모드를 이용하면 된다.
수동 모드(패시브 모드): 클라이언트가 서버가 지정한 서버 포트로 연결할 수 있게 한다. 이 때에는 보통 양쪽 포트 모두 1023 보다 큰 포트를 사용한다.
공개키 암호화 방식이라면 공개키가 노출되어도 각 서버가 가진 비공개 개인키로만 풀 수 있기때문에 문제가 없다. FTPS는 SFTP와 다르게 사람이 직접 통신을 이해하고 읽을 수 있습니다!
SSL/TLS는 강력한 인증 매커니즘 역할 -> 그 X.509 인증서 기능과 함께 제공 된다. 그리고 FTP 및 SSL / TLS 지원은 많은 인터넷 통신 프레임 워크에 내장되어 있다.
모든 FTP 서버에서 SSL/TLS 지원을 사용할 수 있는 것은 아니다. 그리고 파일 이름 문자 집합(인코딩)에 대한 지침이 없다. 그리고 파일 또는 디렉토리 속성을 가져오고 변경하는 표준 방법이 없다. "표준이 없다"는 사용하는 이에 따라 방법이 너무 다양해서 도입 또는 협업할때 충돌 가능성이 농후하다.
FTPS는 보조 데이터 채널(SSL/TLS)의 사용을 요구하므로 방화벽 뒤에서 사용이 복잡해집니다.
FTP에 Secure을 더한 버전, 기존 ftp의 보안 취약점 보안을 위해 TCP connection이후 Key교환을 통해 서로 신원을 확인 한 후, file transfer를 진행하는 것이다.
ssh 방식을 이용하여 안전하게 암호화된 구간에서 ftp 기능을 이용하는 접근방법이다. 사실 ssh 기반의 ftp인 것이 맞고, ssh는 ssl인증서를 사용한다는 점이 사전 포인트이다. sftp는 ssh를 활용해 확장한 것이고, ftps와 다르게 보조 데이터 채널이 필요가 없다!
그리고 위와 같은 순서로 Handshake protocol 연결과정을 거친다! 클라이언트와 서버간에 session을 생성하여 인증 과정을 거치고 사용할 알고리즘을 결정하고, 서버와 클라이언트가 상호인증하며 암호화 MAC 알고리즘 키를 협상한다. 그리고 응용 데이터 전송 전에 사용한다.
핵심은 '암호화 된 구간' 에서 'ftp' 기능 이용하는 것이 sftp라는 것이다.
언급하였듯이, 보조 데이터 채널이 필요 없고 하나의 연결만 필요하다. 그리고 그 연결 구간은 안전하게 보호된다. 그리고 추가적으로 제공하는 파일 감금, 속성 조작, 권한 작업 등 과 같은 더 많은 기능이 포함되어 있다. 그리고 SFTP 구성 표준이 있다.
통신할때 사람이 바로 이해하기 힘든 '이진 통신'에 관여한다. 그리고 ssh키 유효성 검사 및 관리는 복잡해질 수 있다. .NET, VCL에는 기본적으로 SSH/SFTP 지원이 포함되어 있지 않다.
sftp -P portnumber hostname@host_ip
sudo sftp -i ~/.ssh/server_key.pem user@123.123.123.123
# -i 옵션뒤에 해당 서버 ssh 접속을 위한 pem 키가 있는 경로
# user @ server ip 로 접근
get file_name
실시! => 디렉토리라면 -r 옵션을 붙여준다. get -r file_name
put fule_name
(역시 디렉토리는 -r옵션)