Ubuntu에서 SFTP(SSH File Transfer Protocol) 서버를 구축하고 설정하는 방법입니다.
SFTP는 OpenSSH 패키지에 기본으로 포함되어 있어 별도의 FTP 서버 프로그램(vsftpd 등)을 설치할 필요 없이 SSH를 통해 안전하게 암호화된 파일 전송을 제공합니다.
아래 단계에 따라 SFTP 전용 사용자 계정과 전용 디렉터리를 안전하게 구성할 수 있습니다.
1. OpenSSH Server 설치 및 확인
기본적으로 OpenSSH가 설치되어 있어야 합니다. 설치되어 있지 않다면 아래 명령어로 설치 후 실행합니다.
Bash
sudo apt update
sudo apt install openssh-server -y
sudo systemctl enable --now ssh
2. SFTP 전용 사용자 그룹 및 계정 생성
보안을 위해 SSH SSH 셸(터미널) 접속은 차단하고, SFTP 전용 디렉터리에만 접근할 수 있는 계정을 생성합니다.
Bash
# 1. sftp 전용 사용자 그룹 생성
sudo groupadd sftpgroup
# 2. sftp 전용 사용자 생성 (셸 접속 차단: -s /bin/false)
sudo useradd -m -g sftpgroup -s /bin/false sftpuser
# 3. 비밀번호 설정
sudo passwd sftpuser
3. SSH daemon 설정 (sshd_config)
OpenSSH 설정 파일을 수정하여 SFTP 전용 환경 및 Chroot Jail(사용자가 자신의 지정 디렉터리 상위로 이동하지 못하도록 격리)을 설정합니다.
Bash
sudo nano /etc/ssh/sshd_config
설정 파일 최하단으로 이동한 뒤, 아래 내용을 추가합니다:
Plaintext
# SFTP 전용 그룹 설정
Match Group sftpgroup
# 내장 SFTP 서브시스템 사용
Subsystem sftp internal-sftp
# 사용자의 상위 디렉터리 접근 차단 (격리)
ChrootDirectory /home/%u
# SSH 터미널 접속 및 포트 포워딩 차단
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
주의: 기존 설정 중
Subsystem sftp /usr/lib/openssh/sftp-server라인이 있다면 주석 처리(#)해도 됩니다.Match Group절 아래 선언된Subsystem sftp internal-sftp가 적용됩니다.
설정 저장 후 (Ctrl+O -> Enter -> Ctrl+X), SSH 서비스를 재시작합니다.
Bash
sudo systemctl restart ssh
4. Chroot 디렉터리 권한 설정 (매우 중요)
OpenSSH의 ChrootDirectory 기능이 정상 작동하려면 경로상의 모든 상위 디렉터리 소유권이 root여야 하고, 타인의 쓰기 권한이 없어야 합니다.
권한이 맞지 않으면 접속 시 client_loop: send disconnect: Broken pipe 오류가 발생합니다.
Bash
# 1. Chroot 루트 디렉터리의 소유권을 root로 변경
sudo chown root:root /home/sftpuser
sudo chmod 755 /home/sftpuser
# 2. 파일 업로드가 가능한 전용 하위 디렉터리 생성 및 권한 부여
sudo mkdir -p /home/sftpuser/upload
sudo chown sftpuser:sftpgroup /home/sftpuser/upload
sudo chmod 755 /home/sftpuser/upload
이제 sftpuser는 /home/sftpuser 디렉터리 자체에는 파일을 새로 쓸 수 없지만, /upload 폴더 안에서는 자유롭게 파일을 업로드/다운로드/삭제할 수 있습니다.
5. 방화벽(UFW) 설정 및 접속 테스트
방화벽 허용
SFTP는 SSH 포트(기본 22번)를 사용합니다.
Bash
sudo ufw allow 22/tcp
접속 테스트
터미널에서 SFTP 접속 테스트:
Bash
sftp sftpuser@<서버_IP_주소>
SSH 접속 차단 확인 (정상 작동 테스트):
Bash
ssh sftpuser@<서버_IP_주소>
# 접속이 거부되거나 internal-sftp 전용 연결 메시지가 뜨며 종료되어야 정상입니다.
요약 구조
- 포트:
22(SSH 기본 포트) - Chroot 루트:
/home/sftpuser(소유자:root:root) - 업로드 경로:
/home/sftpuser/upload(소유자:sftpuser:sftpgroup)
Leave a Reply