[Rocky] 05. FTP(vsftpd) 서버 구성
카테고리: ROCKY
🔔 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.
댓글 남기기