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/vsftpdvsftpd daemon binary
/etc/vsftpd/vsftpd.conf주 설정 파일
/etc/pam.d/vsftpdPAM 인증 제어
/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/shells

3. 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=50100

chroot_local_user=YESchroot_list_enable=YES를 같이 쓰면 chroot_list에 들어간 사용자는 chroot 예외가 된다. 즉 예시처럼 bc_app을 chroot 목록에 추가하면 오히려 chroot가 풀리는 동작을 볼 수 있다. 전체 사용자를 가두고 예외를 최소화하려면 chroot_list는 빈 파일로 시작한다.

sudo touch /etc/vsftpd/chroot_list
sudo chmod 600 /etc/vsftpd/chroot_list

4. 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=succeed

6. 방화벽 열기

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-all

7. 클라이언트 접속 테스트

기본 접속과 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 incorrectuser_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 전환을 우선 검토하고, 실습 환경에서도 계정과 방화벽 범위를 최소화해야 한다.

문서 링크

BGM EVER