
■ FTP (File Transfer Protocol) 파일 전송 프로토콜
FTP는 인터넷상의 컴퓨터들간에 파일을 교환하기 위한 표준 프로토콜로서 가장 간단한 방법이기도 하다. 화면에 표시할 수 있는 웹 페이지와 관련 파일들을 전송하는 HTTP, 전자우편을 전송하는 SMTP 등과 같이, FTP 역시 인터넷의 TCP/IP 응용 프로토콜 중의 하나이다. FTP는 웹 페이지 파일들을 인터넷상에서 모든 사람이 볼 수 있도록 하기 위해 저작자의 컴퓨터로부터 서버로 옮기는 과정에서 사용된다. 또한, 다른 서버들로부터 자신의 컴퓨터로 프로그램이나 파일들을 다운로드 하는 데에도 많이 사용된다.
■ Anonymous FTP (anonymous File Transfer Protocol) ; 익명 FTP
인터넷에서 FTP를 사용할 때 anonymous FTP는 사용자들이 서버에 자신을 식별시키지 않고서도 파일에 접근할 수 있는 방법을 제공한다. 보통의 FTP 사이트들은 오직 적법한 사용자 아이디와 패스워드를 가진 사람만이 이용할 수 있는데 반해, anonymous FTP는 파일을 보거나 다운로드하기 위해 해당 서버에서 부여된 사용자 아이디나 패스워드가 없더라도 작업이 가능하기 때문에 anonymous 라고 부른다.
FTP(File Transfer Protocol) 프로그램의 종류
wu-ftpd : 예전 RedHat Linux에서 사용하던 기본 FTP 프로그램
vsftpd : 현재 많이 사용되고 있는 기본 FTP 프로그램
proftpd : 현재 많이 사용되고 있는 기본 FTP 프로그램
기타 : gssftp, tftp, sftp...
FTP 서버 구성 절차
(ㄱ) 패키지 설치
# yum install httpd vsftpd ftp -y

(ㄴ) 서비스 구성
# vi /etc/vsftpd/vsftpd.conf
# vi /etc/vsftpd/*

(ㄷ) 서비스 기동
# systemctl enable --now vsftpd.service

(ㄹ) 방화벽 등록
# firewall-cmd --permanent --add-service=ftp
# firewall-cmd --reload

(ㅁ) SELinux(?)
[실습] 초기 FTP 서버 설정 점검 //설치, 포트, 파일 확인
[실습] vsftpd FTP 서버 구축 //위 작업을 통해서 진행했다.

[EX] FTP 서버 사용자 접근 제어
/etc/vsftpd/{ftpusers,user_list} 사용자 제어 userlist_enable=YES userlist_deny=NO
# echo 'oracle' > /etc/vsftpd/user_list

[EX] FTP 클라이언트 프로그램 - filezilla & ftp CMD
(GUI) filezilla, (CLI) ftp CMD

[참고] FTP 업로드/다운로드 절차
# ftp 192.168.10.20 21
사용자로 로그인(ID/PASS)

(ㄱ) 업로드/다운로드 포인터 맞추기(cd/lcd)
ftp> cd /tmp /* cd : change directory */
ftp> lcd /root /* lcd: local change directory */

(ㄴ) 편리한 기능 설정(bin/hash/prompt)
ftp> bin /* 전송모드: binary, ascii */
ftp> hash /* 파일전송: Hash(#) 표시 */
ftp> prompt /* 대화형모드 ON/OFF */

(ㄷ) 업로드/다운로드(mget/mput/get/put)
ftp> put server2.txt
ftp> get server2.txt
ftp> mput server* (mput: Multiful put)
ftp> mget server* (mget: Multiful get)


(ㄹ) 확인/해제(ls/dir/bye/quit)
ftp> ls (ls or dir)
ftp> !ls (>!CMD)
ftp> quit (quit or bye)


[실습] 세션 타임 아웃 설정
idle_session_timeout
The timeout, in seconds, which is the maximum time a remote
client may spend between FTP commands. If the timeout triggers,
the remote client is kicked off.
Default: 300 (5분) //명령어를 하나도 안치고 버티는 시간
data_connection_timeout
The timeout, in seconds, which is roughly the maximum time we
permit data transfers to stall for with no progress. If the
timeout triggers, the remote client is kicked off.
Default: 300 (5분) //데이터 전송시간이 5분동안 진행이 안되면 끊어진다.
# vi /etc/vsftpd/vsftpd.conf
idle_session_timeout=9000
data_connection_timeout=9000

[EX] banner 메시지 출력(banner_file=/etc/vsftpd/banner.txt)


[EX] greeting 메시지 출력(ftpd_banner="Welcome To My Server")

[EX] 일반사용자 chroot 구성하기
FTP 사용자의 chroot 구성은 FTP 사용자가 서버에 로그인 한 경우에 자신의 홈디렉토리를 /(root) 디렉토리 인것 처럼 인식이 되어 자신의 홈 디렉토리 아래에 있는 디렉토리만 이동이 가능한 것이다.
위로 올라갈수 있는 최상위 디렉토리
- Anonymous FTP : /var/ftp
- Real FTP : /
* chroot_local_user=YES
* allow_writeable_chroot=YES
* chroot_list_enable=YES
* chroot_list_file=/etc/vsftpd/chroot_list
# echo 'root' >> /etc/vsftpd/chroot_list

chroot_local_user, allow_writeable_chroot 설정만 해도 FTP 사용자에 대한 chroot 구성이 된다.
하지만 이 경우 root 사용자도 chroot 구성이 되어, root 사용자도 /root 디렉토리 위쪽으로 이동할 수 없게 된다. root 사용자도 인증하여 접속하는 사용자이기 때문이다.
따라서, 이 문제를 해결하기 위해서 chroot_list_enable=YES, chroot_list_file=<파일이름> 설정을 지정하여 root 사용자는 이 설정에서 제외 시켜야 한다.
또한, chroot_list_file=<파일이름> 파일안에 정의된 사용자는 chroot 설정에서 제외된다.
[EX] FTP 서버에 접근 사용자 제한
(userlist_deny=YES) 두개의 파일 중 한개의 파일에라도 사용자가 정의되어 있으면 FTP 로그인 할 수 없다.
- /etc/vsftpd/ftpusers
- /etc/vsftpd/user_list
(userlist_deny=NO) user_list 파일에 존재하는 사용자만 FTP 로그인을 할 수 있다.
- /etc/vsftpd/ftpusers
- /etc/vsftpd/user_list

[EX] anonymous FTP 구성
anonymous_enable=YES
■ FTP 서비스(EX: vsftpd)
- 익명 FTP 서버(Anonymous FTP Server) : 파일 다운로드(/var/ftp)
- FTP 서버(Real User FTP Server) : 파일 다운로드/업로드(/home/$USER)
● # cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES /* 익명 FTP 서버 사용 유무 설정 */
.....
anon_upload_enable=YES /* 익명 사용자가 업로드 기능을 사용할 수 있도록 할것인지 설정 */
.....
anon_mkdir_write_enable=YES /* 익명 사용자가 업로드시 디렉토리를 생성할 수 있도록 할것인지 설정 */
[EX6] FTP 포트 변경
* listen_port=2121
vsFTP 서버에서 사용하는 FTP 서버용 포트는 기본값으로 21로 지정되어 있다.
"listen_port" 키워드를 사용하여 FTP 서버용 포트를 다른 포트로 지정할 수 있다.
이 설정을 사용하는 경우는 기본적인 포트번호를 다른것으로 변경해서 사용해야 하는 환경에서 유용하다.


[EX] 클라이언트 최대 연결 수 지정
# max_clients=3
● vsFTP 서버에서 FTP 서버에 접속할 수 있는 사용자 수는 기본값으로 unlimit 이다.
● vsFTP 서버에서 max_clients를 사용하여 최대로 접속할 수 있는 클라이언트의 개수를 제한할 수 있다.
● 이 설정은 서버에서 반드시 설정할 것을 권장한다.

[EX] IP당 최대 연결 수 지정
# max_per_ip=3

[EX] 익명 FTP 업로드 가능 설정
# cd /var/ftp/pub
# mkdir -m 603 incoming (-rw-----wx root root)
# useradd -d /var/ftp/pub/incoming -r -s /sbin/nologin ftpupload
# vi /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES
chown_uploads=YES
chown_username=ftpupload
[EX] 파일 다운로드 전용 FTP 서버 구성(파일 경로/이름을 알고 있는 경우에만 다운로드 가능)

# cd /var/ftp/pub
# mkdir -m 751 download (# mkdir download ; chmod 751 download)
# cd download
# mkdir -m 751 os
# cd os
# mkdir -m 751 centos
# cd centos
# cp /etc/passwd centos5.img
[EX] FTP 보안

* 접근 제어 - 네트워크/호스트, 사용자
- 호스트 접근 제어 -> firewalld
- 사용자 접근 제어 -> /etc/vsftpd/{user_list,ftpusers}
* userlist_deny=NO
* /etc/vsftpd/user_list
* 자원제어
- max_clients
- max_per_ip
- idle_session_timeout
- data_connection_timeout
* 패치/패키지 업데이트
# yum list | grep vsftpd
# rpm -qa | grep vsftpd
# yum -y update vsftpd
* 보안 권고문
■ security blog: http://scarybeastsecurity.blogspot.com/
■ security advisories: http://www.scary.beasts.org/security/
■ ProFTPd suffers serious security hole(http://www.iss.net/threats/ThreatList.php) - Sep 2003
■ wu-ftpd suffers serious security hole
(http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0466) - Jul 2003.
■ lukemftpd (as a random example from many), via trust of realpath(), suffers serious security hole
ftp://ftp.netbsd.org/pub/NetBSD/security/advisories/NetBSD-SA2003-011.txt.asc)- Aug 2003.
* chroot 구성
* ftp -> sftp/ftps
FTP는 연결(Connection)을 이루는 포트와 데이터를 전송하는 포트가 있다. 2개의 포트를 사용하는 서비스이다. 포트를 서비스에 사용하는 방식은 2가지가 있는데 (ㄱ)패시브 모드(Passvie Mode)와 액티브 모드(Active Mode)로 구분한다. 기본은 액티브 모드 상태이다. 동작 모드를 변화 시키기위해서는 ftp 명령어의 -p 옵션이나 ftp 명령어의 서브 프롬프트에서 "passive" 명령어를 사용하면 된다. 동작은 다음과 같다.

* FTP 로그 분석
- /var/log/secure : 인증 실패 기록
- /var/log/xferlog: 파일 업로드/다운로드 기록
- active mode
1) 클라이언트는 서버의 21번 포트로 접속한 후에 자신이 사용할 두 번째 포트를 서버에 미리 알려줍니다.
2) 서버는 클라이언트의 요청에 응답합니다. (acks)
3) 서버의 20번 데이터 포트는 클라이언트가 알려준 두 번째 포트로의 접속을 시도합니다.
4) 클라이언트가 서버의 요청에 응답합니다. (acks)
위 과정에서 액티브 모드는 “클라이언트가 서버에 접속을 하는 것이 아닌 서버가 클라이언트에 접속을 하는 것”을 확인할 수 있습니다
만일 FTP 클라이언트에 방화벽이 설치되어 있는 등 외부에서의 접속을 허용하지 않는 상황이라면 FTP 접속이 정상적으로 이루어지지 않을 것입니다. 접소기 되더라도 데이터 목록을 받아오지 못하게 되는 경우도 있고요.
해결법
* 방화벽에서 20번 포트도 열어주기
* passive 모드로 변경
- passive mode
1) 클라이언트가 커맨드 포트로 접속을 시도합니다. (Passive 모드 연결)
2) 서버에서는 사용할 두 번째 포트를 클라이언트에게 알려줍니다.
3) 클라이언트는 다른 포트를 열어 서버가 알려준 포트로 접속을 시도합니다.
4) 서버가 클라이언트의 요청에 응답합니다. (acks)
위에서 살펴본 Active 모드의 단점을 해결하기 위한 Passive 모드를 살펴봅시다.
역시나 아래 그림에서 사용된 커맨드 포트와 데이터 포트는 서버 설정에서 변경할 수 있습니다.
특히 Passive 모드에서는 데이터 포트 번호를 특별하게 지정하지 않는 경우 1024 ~ 65535번 중에서 사용 가능한 임의 포트를 사용하게 됩니다.
포트 번호를 지정할 때는 10001 ~ 10005번과 같이 범위를 지정할 수도 있습니다.
FTP Client FTP Server FTP Client
----- main ----- ----- server1 ----- ----- server2 -----
# tail -f secure
# tail -f xferlog
fedora 사용자 user01 사용자
# ftp server1 -------------> <-------------- # ftp server1
/test/file1.txt --- upload --> /tmp --- download --> /test
---------------- ------------------- -------------------(main)
(server2)

Sep 12 16:05:22 로그 기록 시간(09월 12일 16시05분 22초)
linux249 로그가 생성된 서버
vsftpd 로그를 생성한 주체
pam_unix ..... 로그 메세지(server2)
(server1)

/var/log/xferlog: 파일 업로드/다운로드 기록
o
전송 방향(Direction)
• i : incoming(파일을 업로드)
• o : outgoing(파일을 다운로드)
• d : delete(파일을 서버에서 삭제)
r
사용자 파일 접근 방식
• r : real(인증된 사용자)
• a : anonymous(익명사용자)

