Linux 서버 FTP Server 구성 가이드
Linux FTP Server 구성 가이드입니다. vsftpd 설치, chroot_local_user, user_list 허용 방식, PAM ftpusers, passive port와 로그 확인을 정리했습니다.
Linux 서버 FTP Server 구성 가이드: vsftpd, chroot, 접속 제한
FTP 서버 실습은 단순히 vsftpd를 설치하고 접속되는지만 보는 것으로 끝내면 위험하다. FTP는 기본 프로토콜 자체가 평문 전송을 사용하므로 운영 환경에서는 SFTP 또는 FTPS를 우선 검토해야 한다. 그래도 Linux 서비스 구성 학습 목적으로 FTP를 다룬다면 계정 범위, chroot, user list, PAM, 방화벽, 로그까지 함께 확인해야 한다.
설명의 bc_app 계정 실습을 기준으로, Rocky/RHEL 계열에서 vsftpd를 구성하는 절차로 정리한다.
vsftpd 관련 파일
| 파일 | 용도 |
|---|---|
/usr/sbin/vsftpd | vsftpd daemon binary |
/etc/vsftpd/vsftpd.conf | 주 설정 파일 |
/etc/pam.d/vsftpd | PAM 인증 제어 |
/etc/vsftpd/user_list | 허용 또는 차단 사용자 목록 |
/etc/vsftpd/ftpusers | 보통 FTP 접속을 금지할 시스템 계정 목록 |
/var/log/xferlog | 전송 로그 |
1. 패키지 설치와 서비스 확인
sudo dnf install -y vsftpd ftp lftp
rpm -qi vsftpd
sudo systemctl enable --now vsftpd
sudo systemctl status vsftpd --no-pager
ss -lntp | grep ':21'2. 실습 계정과 디렉터리 생성
FTP chroot에서 흔한 오류는 사용자의 home directory가 writable인 상태다. 보수적으로 home은 root 소유로 두고, 실제 업로드 디렉터리만 사용자에게 쓰기 권한을 준다.
sudo useradd -m -d /srv/ftp/bc_app -s /sbin/nologin bc_app
sudo passwd bc_app
sudo mkdir -p /srv/ftp/bc_app/upload
sudo chown root:root /srv/ftp/bc_app
sudo chmod 755 /srv/ftp/bc_app
sudo chown bc_app:bc_app /srv/ftp/bc_app/upload
sudo chmod 750 /srv/ftp/bc_app/upload/sbin/nologin 사용자를 FTP에 허용해야 하는 배포판에서는 shell 목록에 등록되어 있는지 확인한다.
grep -x /sbin/nologin /etc/shells || echo /sbin/nologin | sudo tee -a /etc/shells3. vsftpd.conf 기본 구성
먼저 기존 설정을 백업한다.
sudo cp -a /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak.$(date +%Y%m%d%H%M%S)실습용 기본 설정은 다음처럼 정리할 수 있다.
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=NO
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
xferlog_enable=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50100chroot_local_user=YES와 chroot_list_enable=YES를 같이 쓰면 chroot_list에 들어간 사용자는 chroot 예외가 된다. 즉 예시처럼 bc_app을 chroot 목록에 추가하면 오히려 chroot가 풀리는 동작을 볼 수 있다. 전체 사용자를 가두고 예외를 최소화하려면 chroot_list는 빈 파일로 시작한다.
sudo touch /etc/vsftpd/chroot_list
sudo chmod 600 /etc/vsftpd/chroot_list4. user_list로 허용 사용자 제한
userlist_deny=NO이면 user_list에 있는 사용자만 FTP 로그인이 허용된다.
echo "bc_app" | sudo tee /etc/vsftpd/user_list
sudo chmod 600 /etc/vsftpd/user_list
sudo systemctl restart vsftpd
sudo systemctl status vsftpd --no-pager반대로 userlist_deny=YES이면 목록에 있는 사용자가 차단된다. 운영 중에는 이 의미가 헷갈리기 쉬우므로 설정 파일에 주석을 남겨두는 것이 좋다.
5. PAM ftpusers 차단 확인
/etc/vsftpd/ftpusers에는 root 같은 시스템 계정을 넣어 FTP 접속을 막는다. PAM 설정에서 pam_listfile.so가 이 파일을 읽는지 확인한다.
grep -n "pam_listfile" /etc/pam.d/vsftpd
sudo sed -n '1,120p' /etc/vsftpd/ftpusers예시는 다음과 같은 형태다.
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed6. 방화벽 열기
FTP는 제어 채널 21/tcp와 passive port 범위를 같이 열어야 한다.
sudo firewall-cmd --add-service=ftp --permanent
sudo firewall-cmd --add-port=50000-50100/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all7. 클라이언트 접속 테스트
기본 접속과 chroot 동작을 확인한다.
ftp 192.168.10.193
lftp -u bc_app 192.168.10.193 -e 'pwd; ls; cd upload; put /etc/hosts -o hosts.test; ls; bye'접속 후 cd /를 실행했을 때 서버 전체의 /가 아니라 /srv/ftp/bc_app 내부만 보여야 chroot가 의도대로 동작하는 것이다.
8. 로그와 문제 확인
sudo journalctl -u vsftpd -n 80 --no-pager
sudo tail -n 50 /var/log/xferlog
sudo grep -nE 'chroot|userlist|pasv|listen' /etc/vsftpd/vsftpd.conf| 증상 | 확인할 항목 |
|---|---|
| 530 Login incorrect | user_list, ftpusers, PAM, shell 목록 |
| 500 OOPS: refusing to run with writable root inside chroot | 사용자 home directory 소유자와 권한 |
| 목록 조회 실패 | passive port, 방화벽, NAT 환경 |
| 로그인은 되지만 업로드 실패 | write_enable, upload directory 권한, SELinux context |
정리
vsftpd 실습의 핵심은 chroot_local_user, chroot_list_enable, userlist_deny의 의미를 정확히 분리해서 보는 것이다. chroot는 사용자가 볼 수 있는 파일 시스템 범위를 제한하고, user list와 PAM은 누가 접속할 수 있는지를 제한한다. FTP를 외부 운영에 그대로 쓰기보다는 SFTP/FTPS 전환을 우선 검토하고, 실습 환경에서도 계정과 방화벽 범위를 최소화해야 한다.