Linux // FTP
FTP ( File Transfer Protocol )
1) TCP/IP 프로토콜 기반의 서버와 클라이언트 간에 파일 전송 시 사용되는 프로토콜
2) 대용량 / 대량의 파일 전송에 특화되어 있는 프로토콜
3) 초기 FTP는 Telnet과 동일하게 로그인 과정에서 평문으로 데이터가 전송되어 보안에 취약했으나, FTPS( FTP 와 SSL ), SFTP ( FTP 와 SSH ) 등 보안을 강화한 프로토콜이 생김
4) TCP 20 / 21 번을 사용 ( 20 - 데이터 전송 시 사용 data port ) ( 21 - 접속 및 제어를 위한 명령어 전달 command port )
5) 연결 방식에 따라 Active 모드와 Passive 모드가 있음
Active mode
> 서버가 클라이언트에게 접속하는 방식. 방화벽 또는 isp에서 외부에서의 접속을 허용하지 않을 시 정상적인 동작 불가능
Passive mode
> 클라이언트에서 임의포트를 이용해 FTP 서버의 포트 21번으로 연결을 시도. 그 후, 서버는 클라이언트에게 서버의 어느 포트 (1024 이후) 를 사용해 데이터 전송을 할 지 알려줌. 클라이언트는 서버가 알려준 포트로 접속을 시도하고 서버는 클라이언트에게 정상 수신을 의미하는 메시지를 보냄. 즉 서버의 20번 포트는 사용되지 않음
> 서비스 제공을 위해 1024번 이후의 포트를 모두 개방해야 함. ( 1024 이후 포트 또한 모두 필터링 불가능 )
VSFTP ( Very Secure FTP )
> GNU GPL 라이선스 관리하에 배포되고 있는 FTP 서버용 프로그램
> 안정적이고 속도가 빠르며 보안에 뛰어남 ( http://vsftpd.beasts.org )
1. VSFTP 기본 설정
# yum -y install vsftpd // vsftpd 패키지 설치
# rpm -qa |grep vsftpd // 정상 설치 되었는지 확인
# service vsftpd start // vsftpd 서비스 데몬 시작
# chkconfig vsftpd on // 부팅 후 자동 시작되도록 설정
# chkconfig --list vsftpd // 동작 Run level 확인
# vim /etc/vsftpd/vsftpd.conf // vsftp 서버의 기본 설정 파일
1) 익명 접속 설정 옵션
- anonymous_enable = yes // 익명로그인허용여부
- anon_upload_enalbe = no // 익명의 사용자 업로드 허용여부
- anon_mkdir_write_enable = no // 쓰기 권한이 있을 시 새로운 디렉토리생성 권한 허용여부
- deny_email_enable = no // /etc/vsftpd/baned-emails 파일에 존재하는 anonymous@와 같은 형태의 로그인 불허
- banned_email_file = /etc/vsftpd/baned-emails // 로그인을 불허하고자 하는 이메일을 작성
- secure_email_list_enable // 익명 로그인 유효한 이메일 적용여부 설정 ( 적용시 /etc/vsftpd.email_passwords 파일 참조)
- email_password_file = /etc/vsftpd.email_passwords // 로그인 가능한 이메일 패스워드를 저장하고 있는 파일
- anon_other_write_enable = no // 파일 업로드및 디렉토리 생성 권한 설정
- anon_world_reasable_only = yes anonymous // 권한의 읽기전용 파일 다운로드 허용
- no_anon_password = no // 익명 접속시 password 묻지 않고 로그인 허용
- anon_max_rate = 0 // 다운로드 최대 전송율 지정으로 단위는 bps
- anon_umask = 077
- anon_root = 경로 // 익명 접속시 사용할 홈디렉토리 설정
- ftp_username = ftp // 익명 ftp에 사용될 사용자명 지정으로 기본값은 ftp
2) 실명 로그인 접속 설정 옵션
- local_enable = no // /etc/passwd 파일에 명시되어 있는 계정사용 (기본값 no로 익명연결로 허용되어 있음.)
- wirte_enable = no // 데이터 업로드 허용
- local_umask = 022
- dirlist_enable = yes // LIST 명령의 허용여부 설정
- dirmessage_enable = no // 사용자가 새로운 디렉토리로 이동하였을 경우 해당 디렉토리에 있는 메세지 파일을 보여줌.(파일명 .message)
- message_file = .message // dirmessage_enable = yes 일 경우 적용되는 옵션
- download_enable = yes // 다운로드 허용여부
- force_dot_files = no // 점으로 시작되는 파일과 디렉토리를 출력되도록 설정
- guest_enable = no // 실제 계정에는 없는 가상계정으로 로그인 허용 (가상계정_패스워드 = /etc/vsftpd_login.db) guest_username과 연동
- guest_username = ftp // guest_enable = yes 일 경우 사용
- text_userdb_names = no // 디렉토리및 파일 목록에서 사용자와 그룹의 ID가 숫자 대신에 텍스트 이름으로 보여지도록 설정 (보안상 활성화 금지)
- userlist_enable = no userlist_file // 명시된 계정들로만 로그인 허용
- userlist_deny = /etc/vsftpd.user_list // userlist_enable 의 옵션과는 반대로 접속 거부할 계정 명시
- userlist_file = /etc/vsftpd/user_list // userlist_enable = yes 일 경우 로그인 가능한 유저 목록을 명시
- file_open_mode = 0666 // 파일 업로드시 퍼미션 지정
- listen = no // standalone 동작 설정
- listen_port = 21
- user_config_dir = /etc/vsftpd_user_conf // 가상유저마다 각기 다른 vsftpd.conf 설정을 적용
- virtual_use_local_privs = no // 가상사용자 권한설정
- deny_file // 업/다운로드를 금지할 파일형태를 지정. (예: deny_file={*.exe,*.pdf,*.mp3})
- hide_file // 숨김디렉토리/파일 지정 (예: hide_file={*.exe,*.conf,*.mpeg})
단, 파일 위치를 알고있다면 직접 다운로드할 수 있음
3) 접속제어 설정 옵션
- one_process_model = no // 익명 접속자에게 하나의 프로세스가 작동되도록 함
- max_clients = 100 // vsftpd 서버에 접속할 수 있는 최대 클라이언트수 지정
- max_per_ip = 0 // 호스트로 접속할 때 최대 접속수 지정 (0값은 무제한을 의미)
- local_max_rate = 0 // 파일 전송 최대 속도를 제한하는 옵션
- idle_session_timeout = 300 // 세션종료 설정 기본값 300초
- ftpd_banner = Welcome to FTP server
- tcp_wrappers // /etc/allow 와 /etc/deny 파일에서 vsftpd 서버에 접근할 수 있는 IP 지정
- accept_timeout = 60 // 수동모드에서 서버에 접속할때까지의 시간 설정
4) 보안 관련 설정 옵션
- chroot_local_user = no // 로컬경로에 대한 chroot를 적용할 것인지에 대한 설정
- chroot_list_enable = no // 사용자가 로그인시 chroot를 적용할 것인지에 대한 설정
- chroot_list_file = /etc/vsftpd/chroot-list // chroot를 적용할 사용자계정을 설정
- chown_uploads = no // 익명으로 업로드된 파일에 대해서 지정된 사용자의 소유권으로 설정
- chown_username = root // chown_uploads 에 대한 사용자 지정
- nopriv_user = nobody // 서버를 일반권한으로 작동
- async_abor_enable = no // 파일전송시 취소하였을 경우 취소되지 않는 경우 해결하는데 사용하지만 보안상 no로 설정
- ascii_download_enable/ ascii_upload_enable = no // 파일전송을 ascii 모드로 작동할지 설정
- ls_recurse_enable = no // ls -R 명령 사용여부 설정 (DoS공격의 취약성으로 사용에 주의)
- hide_ids = no // 디렉토리 목록에서 uid와 gid를 보여주지 않고 모두 ftp로 표시
- chmod_enable = yes // 실명 접속에서만 사용가능한 명령
- pam_service_name = ftp // PAM을 이용하여 사용자 인증을 할 때 인증파일을 지정하는 옵션
- check_shell = yes // 사용자 로그인시 /etc/shell 파일에서 체크할지 설정
실습!
1) /etc/vsftpd/vsftpd.conf 설정
annonymous_enable = YES // 익명 사용자에게 다운로드 허용
anon_upload_enable = YES // 익명 사용자에게 업로드 허용
write_enable=YES // 익명 사용자에게 업로드 허용 후 실제 파일 쓰기 기능을 허용해야 파일을 저장할 수 있는 업로드가 가능
anon_mkdir_write_enable=YES // 익명 사용자들이 파일 업로드 시 특정 디렉토리 생성을 허용하기 위해 사용
chown_uploads=YES // 익명 사용자들이 업로드한 모든 파일의 소유권을 변경
chown_username=ftp // 익명 사용자들이 업로드한 파일의 소유자를 ftp로 지정
anon_umask=077 // 익명 사용자가 업로드한 파일의 기본 권한 지정
mkdir /var/ftp/upload // 파일 업로드를 허용할 경우 기본적으로 파일을 저장할 디렉토리를 생성해줘야 함
chown root:ftp /var/ftp/upload // 업로드 디렉토리의 소유권을 변경
chmod 773 /var/ftp/up/load // 파일 업로드를 할 수 있도록 허가권 부여
service vsftpd restart // 변경사항 적용
2) 파일 복사
Server-A
#cp /etc/passwd /var/ftp/pub/down_test1 // 다운로드 테스트에 필요한 파일 복사
Client-Linux
#cd /tmp
#cp /etc/passwd ./ // 업로드에 사용될 파일을 복사
# yum -y install ftp // ftp 접속을 위해 클라이언트 패키지 설치
# ftp 100.100.100.110 ( ip addr | URL ) // ftp 서버에 IP를 이용하여 접속
ID : anonymous
password : 없음 (Enter)
login 성공!
> 미리 만들어둔 down_test1 파일을 다운로드 하는 모습 < ( get 명령어 사용 )
> 가지고 있던 passwd 파일을 업로드 하는 모습 < ( put 명령어 사용 )
( 여러개의 파일을 다운받으려면 mget 명령어를 이용하고, 여러개의 파일을 업로드 하려면 mput 을 이용 )