SSH를 사용하여 SCP 및 SFTP로 파일을 안전하게 전송하는 방법
SCP와 SFTP를 사용하여 SSH를 통해 안전하게 파일을 전송하는 방법, 실용적인 명령어, 키 인증, 그리고 더 안전한 서버 측 접근 제어를 포함합니다.
SCP와 SFTP를 사용한 SSH 기반 안전한 파일 전송 방법
로컬 시스템과 원격 시스템 간의 파일 전송은 시스템 관리 및 개발의 기본 요구 사항입니다. 그러나 표준 FTP나 R-명령어와 같은 암호화되지 않은 프로토콜을 사용하면 민감한 데이터가 가로채기 및 공격에 노출됩니다. SSH(Secure Shell) 프로토콜은 SCP(Secure Copy Protocol)와 SFTP(SSH File Transfer Protocol)라는 두 가지 강력하고 암호화된 파일 전송 방법을 제공합니다.
이 가이드에서는 SCP를 사용해야 하는 경우, SFTP를 사용해야 하는 경우, 그리고 실제로 안전한 파일 전송을 덜 안전하게 만드는 일반적인 실수를 피하는 방법을 설명합니다.
기본 이해: SSH
SCP와 SFTP는 모두 SSH(일반적으로 포트 22에서 실행)를 기본 전송 계층으로 활용합니다. 두 프로토콜 중 하나를 사용하여 전송을 시작하면 SSH는 먼저 클라이언트와 서버 간에 안전하고 암호화된 터널을 설정합니다. 인증 자격 증명과 파일 내용을 포함한 모든 데이터는 이 터널을 통해 전송되므로 두 방법 모두 레거시 파일 전송 프로토콜에 비해 매우 안전한 대안이 됩니다.
SSH 기반이 제공하는 주요 기능:
- 암호화: 모든 데이터는 종단 간 암호화됩니다.
- 인증: 비밀번호 인증과 훨씬 더 안전한 공개/개인 키 쌍 인증을 모두 지원합니다.
- 무결성: 암호화 해싱을 사용하여 전송 중 파일이 변경되지 않도록 보장합니다.
SCP(Secure Copy Protocol)
SCP는 원격 복사 프로토콜(rcp)을 기반으로 하지만 SSH의 보안으로 래핑된 네트워크 프로토콜입니다. 단순성과 속도를 위해 설계되어 특히 스크립팅이나 자동화에서 빠르고 비대화식 전송에 이상적입니다.
SCP 기능 및 특성
- 단순성: 표준 Unix
cp명령어와 매우 유사한 구문을 사용합니다. - 속도: 단순한 일회성 복사의 경우 종종 빠르지만, 성능은 SSH 구현, 암호, 네트워크 및 파일 세트에 따라 다릅니다.
- 비대화식: 일단 시작되면 세션을 관리하거나 전송 상태를 중단할 수 있는 기능 없이 전송이 완료될 때까지 실행됩니다.
실용적인 SCP 명령어
SCP의 일반 구문은 scp [옵션] [소스] [대상]입니다.
1. 로컬에서 원격 서버로 파일 복사
로컬 파일을 원격 사용자의 홈 디렉토리로 푸시하려면:
scp /path/to/local/file.txt user@remote_host:/home/user/destination/
2. 원격에서 로컬 시스템으로 파일 복사
서버에서 현재 디렉토리로 파일을 가져오려면:
scp user@remote_host:/var/log/system.log .
# 참고: '.'은 현재 로컬 디렉토리를 나타냅니다.
3. 전체 디렉토리 복사(재귀적)
-r(재귀적) 플래그를 사용하여 디렉토리와 모든 내용을 복사합니다:
scp -r /path/to/local/folder/ user@remote_host:/data/backups/
4. 비표준 포트 지정
SSH 데몬이 22가 아닌 다른 포트에서 실행되는 경우 -P 플래그(대문자 P 참고)를 사용합니다:
scp -P 2222 local_file.zip user@remote_host:/tmp/
SCP 참고 사항: 기존 SCP 프로토콜 동작은 파일 이름 및 경로 처리 위험이 있습니다. 일부 최신 OpenSSH 클라이언트는 기본적으로
scp에 SFTP를 내부적으로 사용하지만, 모든 클라이언트나 서버가 동일하게 작동하는 것은 아닙니다. 새로운 워크플로우의 경우 특별히 SCP 호환성이 필요하지 않다면 SFTP 또는 SSH를 통한 rsync를 선호하세요.
SFTP(SSH File Transfer Protocol)
SFTP는 SSH의 하위 시스템으로, 더 풍부하고 대화식인 파일 관리 환경을 제공합니다. 순수한 복사 도구인 SCP와 달리 SFTP는 상태 저장 프로토콜로, 동일한 SSH 보호 연결을 통해 파일 나열, 삭제, 이름 변경 및 디렉토리 생성을 허용합니다.
SFTP 기능 및 특성
- 대화식 세션: 전송은 전용 대화식 셸 세션 내에서 발생합니다.
- 견고성: 세션 내에서 개별 전송의 검색, 재개 및 관리를 지원합니다.
- 전체 관리: 세션 명령어(
put,get,lcd,lmkdir)를 사용하여 원격 및 로컬 파일을 나열(ls), 디렉토리 변경(cd) 및 조작할 수 있습니다. - 보안: 전송에 SSH를 사용하며 현대적인 대화식 파일 전송에 더 나은 기본값입니다.
실용적인 SFTP 명령어
1. SFTP 연결 시작
원격 서버에 대한 대화식 세션 시작:
sftp user@remote_host
특정 포트를 사용하는 경우:
sftp -P 2222 user@remote_host
2. SFTP 대화식 명령어
연결되면 기본적으로 원격 환경에서 작동합니다. 명령어를 사용하여 전송 및 디렉토리를 관리합니다:
| 명령어 | 설명 | 예시 |
|---|---|---|
ls |
원격 파일 나열 | ls -l |
cd |
원격 디렉토리 변경 | cd /var/www/html |
put |
파일 업로드 (로컬 → 원격) | put local_data.zip |
get |
파일 다운로드 (원격 → 로컬) | get server_backup.tar.gz |
lcd |
로컬 디렉토리 변경 | lcd /Users/me/downloads |
lpwd |
로컬 작업 디렉토리 출력 | lpwd |
mkdir |
원격 디렉토리 생성 | mkdir new_project |
quit |
SFTP 세션 종료 | quit |
예시: SFTP 세션 내 업로드 및 다운로드
$ sftp [email protected]
sftp> cd /data/backups
sftp> lcd /home/local/reports
sftp> put daily_report.csv # 파일 업로드
Uploading daily_report.csv to /data/backups/daily_report.csv
daily_report.csv 100% 512KB 4.3MB/s 00:00
sftp> get configuration.yaml # 파일 다운로드
Fetching /data/backups/configuration.yaml to configuration.yaml
configuration.yaml 100% 20KB 1.1MB/s 00:00
sftp> quit
SCP vs. SFTP: 적절한 도구 선택
두 프로토콜 모두 안전하지만 서로 다른 운영 요구 사항을 충족합니다:
| 기능 | SCP(Secure Copy Protocol) | SFTP(SSH File Transfer Protocol) |
|---|---|---|
| 메커니즘 | 단순 복사 프로토콜 (비대화식) | 대화식 파일 관리 프로토콜 (상태 저장) |
| 사용 사례 | 빠른 단일 파일 전송; 스크립팅/자동화 | 복잡한 전송; 디렉토리 관리; 대화식 세션 |
| 속도 | 단순 복사에 종종 좋음 | 일반적으로 충분히 빠르며 더 많은 파일 관리 기능 제공 |
| 재개 | 제한적; 강력한 재개 동작을 위해 다른 도구 사용 | 더 제어된 전송 작업 지원하지만 클라이언트 재개 동작은 다양함 |
| 보안 상태 | 호환성 도구; 기존 프로토콜에 설계 문제 있음 | SSH를 통한 관리형 파일 전송에 더 나은 기본값 |
SCP를 사용해야 하는 경우: 단순한 파일 전송에 최대 속도가 필요하고 비대화식이 선호되는 스크립트 내에서 명령어를 실행할 때 SCP를 사용하세요.
SFTP를 사용해야 하는 경우: 사실상 모든 수동 파일 전송, 여러 파일을 관리해야 하거나, 디렉토리를 변경해야 하거나, 세션 견고성과 현대적인 보안 기능이 필요할 때 SFTP를 사용하세요.
안전한 파일 전송을 위한 모범 사례
SCP 또는 SFTP를 사용하는 것은 첫 번째 단계에 불과합니다. 원격 환경을 보호하려면 SSH 서버의 적절한 보안 구성이 필수적입니다.
1. SSH 키 인증 우선시
비밀번호 기반 인증은 무차별 대입 공격에 취약합니다. 파일 전송 인증에는 항상 공개/개인 SSH 키 쌍을 사용하세요. 키를 사용하면 자동화 또는 수동 전송 중 비밀번호 손상 위험이 제거됩니다.
키 생성(필요한 경우):
ssh-keygen -t ed25519 -C "file-transfer"
전송에 특정 키 사용:
scp -i ~/.ssh/my_transfer_key file.txt user@remote_host:/tmp/
# 또는
sftp -i ~/.ssh/my_transfer_key user@remote_host
2. 루트 로그인 비활성화
root 사용자를 사용한 직접 파일 전송을 절대 허용하지 마세요. 전송은 항상 전용 권한이 낮은 사용자 계정으로 수행해야 합니다. 관리 액세스가 필요한 경우 원격 시스템에서 로컬로 sudo를 사용하여 전송 후 파일을 적절한 위치로 이동할 수 있습니다.
3. ChrootDirectory를 사용한 액세스 제한 (SFTP)
외부 또는 신뢰할 수 없는 사용자에게 SFTP 액세스를 제공하는 시스템의 경우 sshd_config 파일 내에서 ChrootDirectory 제한을 구현하세요. 이렇게 하면 SFTP 사용자를 특정 디렉토리로 잠가 파일 시스템의 나머지 부분을 탐색하지 못하게 합니다.
/etc/ssh/sshd_config의 예시 구성 스니펫:
Match User sftp_external_user
ForceCommand internal-sftp
ChrootDirectory /var/sftp/%u
AllowTcpForwarding no
X11Forwarding no
4. 권한 제한
전송에 사용되는 사용자 계정이 작업에 필요한 최소 권한만 갖도록 하세요(최소 권한 원칙). 사용자가 /data/uploads에만 파일을 업로드해야 하는 경우 /etc/config의 파일을 삭제할 수 없도록 해야 합니다.
결론
대화식으로 파일을 탐색, 업로드, 다운로드 또는 관리해야 하는 경우 SFTP를 기본값으로 사용하세요. 서버를 신뢰하고 클라이언트 동작을 이해하는 단순한 호환성 사례에는 SCP를 사용하세요. 두 경우 모두 명령어를 SSH 키, 최소 권한 계정 및 엄격한 디렉토리 권한과 함께 사용하세요.