리눅스 FTP 서버 구축 실습 정리

사용자 권한 설계부터 보안 사고 대응 관점까지
멀티클라우드 환경을 배우면서 느낀 점은 하나였다. 서버를 다룬다는 것은 명령어를 아는 것이 아니라, 운영 사고를 이해하는 일이라는 것이다.
이번 글에서는 리눅스 서버에서 FTP(vsftpd)를 구성하면서 단순히 “접속되게 만드는 것”이 아니라, 사용자 권한을 어떻게 나누는지, 왜 익명 접속을 막아야 하는지, 관리자는 왜 예외로 두는지, 그리고 이 설정이 언제 어떻게 깨질 수 있는지까지 함께 정리해본다.
1. 실습 환경과 목표
실습 환경
- OS: Rocky Linux (RHEL 계열)
- FTP 서버: vsftpd
- 인증 방식: 리눅스 로컬 사용자(PAM)
목표 구성
- 익명 FTP 접속 불가
- 일반 사용자는 홈 디렉토리만 접근 가능
- 특정 사용자(charlie)는 FTP 접속 차단
- 관리자 계정(joe)은 모든 디렉토리 접근 가능
- 홈 디렉토리 내 업로드/다운로드 허용
실무 서버에서 바로 쓰는 기본 보안 구조를 목표로 했다.
2. 사용자 계정 설계 – FTP 계정은 OS 계정이다
vsftpd는 기본적으로 리눅스 사용자 계정 기반 인증을 사용한다. 따라서 FTP 계정을 따로 만드는 것이 아니라, OS 계정을 그대로 활용한다.
useradd alfa
useradd bravo
useradd charlie
useradd delta
useradd echo
useradd joe
여러 사용자를 생성해야 했기 때문에, 비밀번호는 자동화 방식으로 동일하게 설정했다.
echo "P@ssw0rd" | passwd --stdin alfa
이 방식은 실습뿐 아니라 대량 계정 생성 시 실무에서도 자주 사용된다.
3. 관리자 계정 분리 – root 대신 wheel 그룹 사용
관리자 계정인 joe는 wheel 그룹에 추가했다.
usermod -aG wheel joe
- root 직접 사용은 보안 사고 위험이 크다
- RHEL 계열에서
wheel그룹은 관리자 표준 - sudo 권한을 통해 통제 가능한 관리자 운영이 가능하다
권한은 강하게 주되, 직접 노출은 피하는 구조다.
4. vsftpd 기본 보안 설정
설정 파일은 /etc/vsftpd/vsftpd.conf를 수정한다.
1) 익명 접속 차단
anonymous_enable=NO
FTP에서 가장 위험한 요소는 익명 접속이다. 로그 추적도 불가능하고, 책임 주체도 없다. 익명 접속 차단은 FTP 보안의 출발점이다.
2) 로컬 사용자 접속 및 쓰기 허용
local_enable=YES
write_enable=YES
- 로컬 사용자만 FTP 접속 허용
- 업로드/다운로드 가능하도록 쓰기 허용
단, 쓰기 권한은 반드시 chroot와 함께 사용해야 한다.
5. 홈 디렉토리 격리 (chroot)
chroot_local_user=YES
allow_writeable_chroot=YES
이 설정의 의미는 단순하다.
일반 사용자는 자신의 홈 디렉토리 밖으로 절대 나갈 수 없다
/etc, /var, /usr 같은 시스템 디렉토리에 접근하지 못하도록 막는다.
allow_writeable_chroot=YES는 “홈 디렉토리에서 파일 업로드를 허용하겠다”는 운영자의 책임 선언이다.
6. 관리자 예외 처리 – chroot_list
관리자 joe는 홈 디렉토리에 갇히면 안 된다. 따라서 chroot 예외로 지정한다.
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
파일 내용
joe
이 구조는 화이트리스트 방식이다.
- 기본은 전부 차단
- 예외만 명시적으로 허용
보안 사고를 줄이는 정석적인 운영 패턴이다.
7. 특정 사용자 FTP 차단 – user_list
charlie는 OS 계정은 유지하되, FTP만 차단한다.
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=YES
파일 내용
charlie
이 방식의 장점은 운영 정책과 OS 계정 정책을 분리할 수 있다는 점이다.
8. 홈 디렉토리 권한 설정
FTP 업로드/다운로드를 위해 디렉토리 권한을 설정한다.
chmod 755 /home/alfa
- 소유자: 읽기/쓰기/실행
- 실행(x) 권한은 디렉토리 접근에 필수
권한 하나만 잘못 줘도 FTP 접속은 되는데 파일 작업이 안 되는 문제가 발생한다.
9. 방화벽과 서비스 활성화
firewall-cmd --permanent --add-service=ftp
firewall-cmd --reload
systemctl restart vsftpd
포트 번호 대신 서비스 단위로 개방하는 것이 관리에 유리하다.
10. 이 설정이 깨질 수 있는 현실적인 시나리오
① chroot + 쓰기 권한 조합 오류
- 잘못된 권한 설정 시 탈출 시도 가능
- 과거 CVE 취약점 다수 존재
② 관리자 예외 관리 누락
- 새 관리자 추가 시 chroot_list 미반영
- 장애 대응 불가 → 운영 리스크
③ FTP 자체의 구조적 한계
- 계정 정보 평문 전송
- Passive 포트 다수 개방
- NAT/방화벽 환경에서 불안정
그래서 실무에서는 FTP 대신 SFTP를 사용한다.
11. 로그로 사고를 추적하는 방법
FTP 로그:
/var/log/vsftpd.log
- 로그인 실패
- 업로드 기록
- 차단 사용자 접속 시도
운영자는 항상 이렇게 본다.
문제가 발생한 시각 ±10분
로그는 사고의 증거이자 운영자의 무기다.
마무리하며
이번 FTP 실습에서 얻은 가장 큰 교훈은 이것이다.
서버 설정은 기능을 만드는 일이 아니라, 사고를 가정하고 통제하는 일이다.
'서버 구축·실습' 카테고리의 다른 글
| Azure 부하분산기 실습 — 새로고침할 때마다 서버1, 서버2가 번갈아 나오는 구조 직접 만들어봤다 (0) | 2026.02.23 |
|---|---|
| Azure 첫 실습 — AWS만 하던 사람이 느낀 충격적인 차이점 (0) | 2026.02.19 |
| 리눅스 NFS 서버 구축 실습 정리: exportfs 옵션 이해부터 nobody 권한 매핑까지 (0) | 2026.01.24 |
| 리눅스 웹 서버 구축 실습 기록 – 방화벽과 Apache를 직접 설정해 보며 (0) | 2026.01.24 |
| 리눅스 웹 서버 구축 실습 정리: 방화벽 설정부터 Apache 실행까지 서버 운영의 전체 흐름 이해하기 (0) | 2026.01.19 |