Server/Linux

Linux // FTP

깨래 2018. 4. 3. 18:03

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 을 이용 )