[Rocky] 05. FTP(vsftpd) 서버 구성

Date:     Updated:

카테고리:

태그:


🔔 vsftpd 설정 파일



파일명 설명
/etc/vsftpd/vsftpd.conf vsftpd 환경 설정 파일
/etc/vsftpd/ftpusers 로그인 금지 계정 설정 파일
/etc/vsftpd/user_list userlist_deny 설정에 따른 계정 허용여부 설정 파일
/usr/sbin/vsftpd vsftpd binary 파일
/etc/xinetd.d/vsftpd xinetd mode 환경 설정 파일
/etc/pam.d/vsftpd vsftpd PAM 인증 파일


🔔 vsftpd 환경 설정 (/etc/vsftpd/vsftpd.conf)



■ 익명 계정 접속 설정

파일명 설 명
anonymous_enable=YES(or NO) 익명 접속 허용 여부
anon_mkdir_write_enable=YES(or NO) 익명 사용자의 디렉터리 생성 허용 여부
anon_upload_enable=NO(or YES) 익명 사용자의 업로드 허용 여부
anon_other_write_enable=NO(or YES) 익명 사용자의 디렉터리 생성/업로드 이외의 쓰기 권한이 필요한 삭제, 이름변경 등의 허용 여부
anon_world_readable_only=YES(or NO) 익명 사용자 계정(ftp) 소유의 읽기 권한의 파일만 다운로드 허용 여부
no_anon_password=NO(or YES) 익명 사용자 접속 시 password 없이 로그인을 허용 할 것인지 여부
anon_max_rate=0(전송률, B/s) 익명 사용자의 다운로드 최대 전송률을 지정(0=무제한)
anon_umask=077(권한설정) 익명 사용자를 통해 생성되는 파일 및 디렉터리의 기본 권한
anon_root=/var/ftp/(홈 디렉터리 경로) 익명 사용자의 홈 디렉터리 지정
ftp_username=ftp 익명 사용자의 계정 지정(default=ftp)


■ 일반 계정 접속 설정

파일 설명
local_enable=YES(or NO) 로컬 계정 사용자 접속 허용 여부
write_enable=YES(or NO) 쓰기 권한 허용 여부
local_umask=022 vsftpd를 통해 생성되는 파일 및 디렉터리의 기본 권한
dirlist_enable=YES(or NO) LIST 명령의 허용 여부
download_enable=YES(or NO) 다운로드 허용 여부
force_dot_files=NO(or YES) 숨김파일 출력 허용 여부
userlist_enable=NO(or YES) userlist_list의 파일에 명시된 계정만 접근 허용 여부
userlist_file=/var/vsftpd/user_list(경로) userlist 파일의 경로 지정
file_open_mode=0666 업로드 된 파일의 권한 지정
deny_file={.exe,.mp3}(파일명) 업/다운로드를 금지할 파일 지정
hide_file={.pdf,.jpg}(파일명) 숨김 파일/디렉터리를 지정(단, 경로를 알고 있으면 직접 다운로드 가능)


■ 접속 제한 설정

파일 설명
max_clients=50 최대 접속 사용자 수 설정
max_per_ip=2 한 호스트당 접속 허용 횟수 설정
one_process_model=NO 접속마다 하나씩의 프로세스로 동작 여부 설정
idle_session_timeout=120 FTP 연결 유지 시간 설정(FTP명령 전달의 여부로 확인)
data_connection_time=300 FTP 연결 유지 시간 설정(FTP data전송 여부로 확인)
connect_timeout=60 FTP 연결 유지 시간 설정(접속 여부로 확인)
accept_timeout=60 Passive Mode 접속 제한 시간 설정
local_max_rate=0 최대 전송률 설정(0 → 무제한)
ftp_banner=welcome 서버에 접속할 때 보여줄 배너 내용 설정
tcp_wrappers=YES tcp_wrapper 적용 여부


■ 보안 설정

파일명 설명
chroot_local_user=YES 로컬 사용자의 홈디렉터리에 chroot 적용 여부
chroot_list_enable=YES 상위 경로 이동을 허용할 사용자 계정 리스트 사용 여부
chroot_list_file=/etc/vsftpd/chroot_list 상위 경로 이동을 허용할 사용자 계정 리스트파일 지정
hide_ids=NO 다른 계정의 소유권을 ftp 계정 소유권으로 대체할 것인지 여부(NO=대체)
ls_recuse_enable=YES ls -R 명령 허용 여부
connect_from_port_20=YES 20번 port를 이용한 데이터 연결 허용 여부
ascii_upload_enable=YES ASCII 형태로 업로드 허용 여부
ascii_download_enable=YES ASCII 형태로 다운로드 허용 여부
pam_service_name=vsftpd PAM인증 모듈 파일 지정


■ 연결 설정

파일명 설 명
listen vsftpd를 standalone Mode로 실행 함
listen_port vsftpd의 제어 연결포트 지정
pasv_enable Passive Mode 지원 여부
pasv_min_port Passive Mode 동작에서 선택할 port의 최소범위 지정(default=0)
pasv_max_port Passive Mode 동작에서 선택할 port의 최대범위 지정(default=0)
ftp_data_port Active Mode에서 사용할 port번호 지정


■ 연결 설정

파일명 설 명
xferlog_enable=YES(or NO) vsftpd의 로그를 로그파일에 기록할 것인지 여부
xferlog_file=/var/log/vsftpd.log(경로) vsftpd의 로그파일 지정
xferlog_std_format=NO(or YES) 파일 송/수신 로그를 xferlog로 저장할 것인지의 여부


🔔 FTP(vsftpd) 서버 구성



■ vsftpd 설치

$ dnf -y install vsftpd


■ vsftpd 설정

$ vi /etc/vsftpd/vsftpd.conf

# 12번 라인: [NO]로 값이 설정되어 있는지 확인 (익명 사용 금지)
anonymous_enable=NO

# 100, 101번 라인: 주석 해제 (chroot 활성화)
chroot_local_user=YES
chroot_list_enable=YES

# 103번 라인: 주석 해제 (chroot 리스트 파일)
chroot_list_file=/etc/vsftpd/chroot_list

# 109번 라인: 주석 해제
ls_recurse_enable=YES

# 114번 라인: IPv4만 listen하는 경우 YES로 설정
# IPv4와 IPv6 모두 listen 하는 경우 NO로 설정
listen=NO

# 123번 라인: IPv6을 listen하지 않는 경우 NO로 설정
# IPv4와 IPv6 모두 listen 하는 경우 YES로 설정
listen_ipv6=YES

# 마지막에 추가 
# root 디렉토리 지정 
# 지정하지 않으면 사용자의 홈 디렉토리가 FTP 홈 디렉토리가 됨
local_root=public_html

# 로컬 시간 사용
use_localtime=YES

# seccomp 필터를 위해 끄기 (로그인이 안되면 이 라인 추가)
seccomp_sandbox=NO


$ vi /etc/vsftpd/chroot_list

# 홈 디렉터리로 이동할 수 있는 사용자 추가
rocky


$ systemctl enable --now vsftpd


■ SELinux가 활성화된 경우 boolean 설정을 변경

setsebool -P ftpd_full_access on


■ Firewalld가 실행 중인 경우 FTP 서비스 포트를 허용

$ firewall-cmd --add-service=ftp
success


$ firewall-cmd --runtime-to-permanent
success


🔔 FTP 클라이언트 (Rocky Linux)



■ FTP 클라이언트 설치

$ dnf -y install lftp


■ FTP 사용법

# lftp [option] [hostname]
$ lftp -u test dlp.test.srv
Password:     # login user password
lftp test@dlp.test.srv:~>

# FTP 서버의 현재 디렉토리 표시
lftp test@dlp.test.srv:~> pwd
ftp://test@dlp.test.srv

# localhost에 현재 디렉토리 표시
lftp test@dlp.test.srv:~> !pwd
/root

# FTP 서버의 현재 디렉토리에 있는 파일 표시
lftp test@dlp.test.srv:~> ls
drwxr-xr-x    2 1000     1000           23 Jul 15 01:33 public_html
-rw-r--r--    1 1000     1000          399 Jul 15 16:32 test.py

# localhost의 현재 디렉토리에 있는 파일 표시
lftp test@dlp.test.srv:~> !ls -l
total 12
-rw-rw-r-- 1 root root 10 Jul 15 14:30 redhat.txt
-rw-rw-r-- 1 root root 10 Jul 15 14:59 test2.txt
-rw-rw-r-- 1 root root 10 Jul 15 14:59 test.txt

# 디렉토리 이동
lftp test@dlp.test.srv:~> cd public_html
lftp test@dlp.test.srv:~/public_html> pwd
ftp://test@dlp.test.srv/%2Fhome/test/public_html

# FTP 서버에 파일 업로드
# [-a]는 ascii 모드를 의미합니다(디폴트는 바이너리 모드입니다)
lftp test@dlp.test.srv:~> put -a redhat.txt
22 bytes transferred
Total 2 files transferred
lftp test@dlp.test.srv:~> ls
drwxr-xr-x    2 1000     1000           23 Jul 15 01:33 public_html
-rw-r--r--    1 1000     1000           10 Jul 15 17:01 redhat.txt
-rw-r--r--    1 1000     1000          399 Jul 15 16:32 test.py
-rw-r--r--    1 1000     1000           10 Jul 15 17:01 test.txt

# 일부 파일을 FTP 서버에 업로드
lftp test@dlp.test.srv:~> mput -a test.txt test2.txt
22 bytes transferred
Total 2 files transferred
lftp test@dlp.test.srv:~> ls
drwxr-xr-x    2 1000     1000           23 Jul 15 01:33 public_html
-rw-r--r--    1 1000     1000          399 Jul 15 16:32 test.py
-rw-r--r--    1 1000     1000           10 Jul 15 17:06 test.txt
-rw-r--r--    1 1000     1000           10 Jul 15 17:06 test2.txt

# [get/mget]을 사용할 때 localhost에서 파일을 덮어쓰도록 권한 설정
lftp test@dlp.test.srv:~> set xfer:clobber on 

# localhost에 파일을 다운로드
# [-a]는 ascii 모드를 의미합니다(디폴트는 바이너리 모드입니다)
lftp test@dlp.test.srv:~> get -a test.py
416 bytes transferred

# 일부 파일을 localhost에 다운로드
lftp test@dlp.test.srv:~> mget -a test.txt test2.txt
20 bytes transferred
Total 2 files transferred

# FTP 서버의 현재 디렉토리에 디렉토리 생성
lftp test@dlp.test.srv:~> mkdir testdir
mkdir ok, 'testdir' created
lftp test@dlp.test.srv:~> ls
drwxr-xr-x    2 1000     1000           23 Jul 15 01:33 public_html
-rw-r--r--    1 1000     1000          399 Jul 15 16:32 test.py
-rw-r--r--    1 1000     1000           10 Jul 15 17:06 test.txt
-rw-r--r--    1 1000     1000           10 Jul 15 17:06 test2.txt
drwxr-xr-x    2 1000     1000            6 Jul 15 17:16 testdir
226 Directory send OK.

# FTP 서버의 현재 디렉토리에서 디렉토리 제거
lftp test@dlp.test.srv:~> rmdir testdir
rmdir ok, 'testdir' removed
lftp test@dlp.test.srv:~> ls
drwxr-xr-x    2 1000     1000           23 Jul 15 01:33 public_html
-rw-r--r--    1 1000     1000          399 Jul 15 16:32 test.py
-rw-r--r--    1 1000     1000           10 Jul 15 17:06 test.txt
-rw-r--r--    1 1000     1000           10 Jul 15 17:06 test2.txt

# FTP 서버에서 파일 제거
lftp test@dlp.test.srv:~> rm test2.txt
rm ok, 'test2.txt' removed
lftp test@dlp.test.srv:~> ls
drwxr-xr-x    2 1000     1000           23 Jul 15 01:33 public_html
-rw-r--r--    1 1000     1000          399 Jul 15 16:32 test.py
-rw-r--r--    1 1000     1000           10 Jul 15 17:06 test.txt

# FTP 서버에서 일부 파일 제거
lftp test@dlp.test.srv:~> mrm redhat.txt test.txt
rm ok, 2 files removed
lftp test@dlp.test.srv:~> ls
drwxr-xr-x    2 1000     1000           23 Jul 15 01:33 public_html

# ![command]로 명령 실행
lftp test@dlp.test.srv:~> !cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
.....
.....
test:x:1001:1001::/home/test:/bin/bash

# exit
lftp test@dlp.test.srv:~> quit
221 Goodbye. 


ROCKY 카테고리 내 다른 글 보러가기

댓글 남기기