LINUX(Server)

FTP

천천히, 한 걸음씩 2024. 4. 26. 10:31

FTP

* FTP  ( File Transfer Protocol )

- 파일 전송 프로토콜
- 대량/대용량 파일을 전송하는데 특화
- TCP방식으로 동작하며 20,21번 포트를 사용

21번 포트 - 접속 및 명령어 전달시 사용 ( Command Port )
20번 포트 - 데이터 전송시 사용 ( Data Port )

- FTP 동작방식은 Active(능동)모드와 Passive(수동) Mode가 있다.
  동작방식은 클라이언트가 접속할 때 결정한다.


* VSFTP ( Very Secure FTP )

- GNU GPL라이센스 관리하에 배포되는 FTP 서버용 프로그램
- 보안기능이나 성능이 매우뛰어나 대부분의 배포판에
  기본으로 채택되어 사용된다.
  
 
  
! ftp 서버 구축

@Server-A

#setenforce 0
#service iptables stop

#yum install -y vsftpd // ftp 서버용 패키지

#vi /etc/vsftpd/vsftpd.conf
-----------------------------
설정 값 변경 ( 지금은 변경 x )

:wq
-----------------------------

#useradd ftpuser // ftp용 계정 생성
#passwd ftpuser
111
111

#cd /var/ftp    // ftp 계정의 홈디렉터리
#mkdir fileShare    // 공유 디렉터리 생성
#chmod 777 fileShare    // 권한 변경
#cd ./fileShare
#touch Server_file{1..10}  // 테스트용 공유파일 생성


#service vsftpd start // 서비스 시작
#chkconfig vsftpd on



@Client-Linux

#setenforce 0
#service iptables stop

#cd ~ // 실습을 위해 홈디렉터리로 이동
#touch Client_Linux_file{1..5}  // 테스트(공유)용 파일 생성

#yum install -y ftp // ftp 클라이언트 프로그램 설치


#ftp 100.100.100.100 // ftp 서버 접속

계정명 : anonymous
비밀번호 : enter (없음) // anonymous계정으로 서버 접속


ftp>pwd // "/" 추후에 실습


ftp>dir // 현재 위치는 /var/ftp
fileShare pub

ftp>cd fileShare // 공유 디렉터리로 이동

ftp>dir
공유 파일 목록

ftp>get Server_file1 // 1개의 파일 다운로드
( ftp접속을 시도한 디렉터리위치 )
ftp>mget Server_file2 Server_file3  // 복수의 파일 다운로드
( mget 파일명 파일명 .. )

ftp>put Client_Linux_file1 // 업로드 불가
( anonymous는 업로드 기본설정 x )

ftp>exit // 로그 아웃

#ls // 다운받은 파일확인



#ftp 100.100.100.100 // ftp 서버 접속

계정명 : ftpuser
비밀번호 : 111  // local계정으로 서버 접속


ftp>pwd // /home/ftpuser
  로컬 사용자의 ftp 서버 접속
  처음위치는 로컬 사용자의 홈디렉터리

ftp>cd /var/ftp/fileShare // 공유 디렉터리로 이동

ftp>dir
공유 파일 목록

ftp>get Server_file4 // 1개의 파일 다운로드
( ftp접속을 시도한 디렉터리위치 )
ftp>mget Server_file5 Server_file6  // 복수의 파일 다운로드
( mget 파일명 파일명 .. )

ftp>put Client_Linux_file1 // 단일파일 업로드 ( o )
( 로컬 계정은 업로드 기본설정 o )

ftp>put Client_Linux_file2 Client_Linux_file3 // 복수의 파일 업로드 ( o )
( mput 파일명 파일명 .. )

ftp> dir // 업로드 된 파일 확인

ftp>exit // 로그 아웃

#ls // 다운받은 파일확인


@Client-Window

-> 웹 브라우저
-> https://filezilla-project.org //파일질라 공식홈페이지
-> 화면 중앙에 Donwload Filezilla Client 클릭
-> 다운로드
-> 설치 마법사 ( 설치 진행 )

-> 바탕화면에 테스트용 파일 생성
Client_Linux_file1.txt   // 메모장
Client_Linux_file2.txt   // 메모장

-> Filezila 프로그램 실행

호스트   : 100.100.100.100
계정     : anonymous
비밀번호 : x
포트     : x

-> 연결 // anonymous계정으로 로그인한 상태

왼쪽 (로컬사이트-클라이언트) 오른쪽 (리모트사이트-파일서버)

fileShare에서
원하는 파일을
왼쪽(클라이언트)의 바탕화면으로
drag & drop (o)

User->Desktop에 있는
Client_Window_file1~2.txt를
파일서버의 fileShare로 
drag & drop ( x ) // anonymous계정의 기본설정은
   다운로드 ( o )
   업로드   ( x )


-> Filezila 프로그램 실행

호스트   : 100.100.100.100
계정     : ftpuser
비밀번호 : 111
포트     : x

-> 연결 // localUser(ftpuser)계정으로 로그인한 상태

왼쪽 (로컬사이트-클라이언트) 오른쪽 (리모트사이트-파일서버)

(/home/ftpuser에 위치)
/var/ftp/fileShare로 이동

fileShare에서
원하는 파일을
왼쪽(클라이언트)의 바탕화면으로
drag & drop (o)

User->Desktop에 있는
Client_Window_file1~2.txt를
파일서버의 fileShare로 
drag & drop ( o ) // local 계정의 기본설정은
   다운로드 ( o )
   업로드   ( o )




* 설정 파일 변경

@Server-A

#vi /etc/vsfptd/vsftpd.conf
---------------------------------
12번행 anoymous_enable=YES // anonymous 계정 로그인 허용  
15번행 local_enbale=YES // local 계정 로그인 허용
17번행 write_enable=YES // 파일 업로드 권한 허용
22번행 local_umask=xxx // 파일 업로드시 적용될 UMASK값
   (추가 anon_umask=xxx // anonymous파일 업로드시 적용될 UMASK값)

28번행 anon_upload_enable // anonymous계정에게
파일 업로드 권한 부여
32번행 anon_mkdir_write_enable // anonymous계정에게
디렉터리 생성 권한 부여
60번행 idle_session_timout=600 // ftp 접속후 아무입력없을시
세션 종료 ( 단위 : 초 )
86번행 ftpd_banner=원하는 메세지 // Banner 메세지 설정
    보안적 관점으로 의미가 있다.

:wq
-----------------------------------


* /etc/vsftpd/ftpusers

- ftp 접속을 '차단'할 계정 정보 파일

@Server-A

#useradd ftp-user1 // 테스트 계정 생성
#useradd ftp-user2
#useradd ftp-user3

#passwd ftp-user1
111
111

#passwd ftp-user2
111
111

#passwd ftp-user3
111
111

@Client-Linux ( 세션 3개 생성 )

#ftp 100.100.100.100
ftp-user1 ( 로그인 o )
111

#ftp 100.100.100.100
ftp-user2 ( 로그인 o )
111

#ftp 100.100.100.100
ftp-user3 ( 로그인 o )
111


@Server-A
#vi /etc/vsftpd/ftpusers
------------------------
하단에 접속을 차단할 계정을 추가

ftp-user2
ftp-user3

:wq
-------------------------

@Client-Linux ( 세션 3개 생성 )
#ftp 100.100.100.100
ftp-user1 ( 로그인 o )
111

#ftp 100.100.100.100
ftp-user2 ( 로그인 x )
111

#ftp 100.100.100.100
ftp-user3 ( 로그인 x )
111

// 계정을 바꾸어가면서 실습해보세요.



* /etc/vsftpd/user_list

- FTP 접속 계정 허용/차단 설정
- /etc/vsftpd/vsfptd.conf 설정에 따라서 동작

( 실습을 위해 ftpusers파일에
       ftp-user2, ftp-user3계정 삭제 후 진행 )


! 실습

@Server-A

#vi /etc/vsftpd/vsftpd.conf
----------------------------
119번행 userlist_enable=YES  //user_list파일을 사용
(설정 변경 x)

:wq!
----------------------------

#vi /etc/vsftpd/user_list
-----------------------------
~~ 하단에 추가 ~~

ftp-user1 // 로그인 불가
ftp-user3 // 로그인 불가

:wq
---------------------------

#service vsftpd restart

@Client-Linux

#ftp 100.100.100.100

ftp-user1 // 로그인 x
ftp-user2 // 로그인 o
ftp-user3 // 로그인 x


@Server-A

#vi /etc/vsftpd/vsftpd.conf
----------------------------
119번행 userlist_enable=YES   // user_list파일을 사용
120번행 (추가)userlist_deny=NO // userlist파일을 
   허용 목록으로 사용

:wq!
----------------------------

#vi /etc/vsftpd/user_list
-----------------------------
(설정변경x)

ftp-user1 // 로그인 허용
ftp-user3 // 로그인 허용

:wq
---------------------------

#service vsftpd restart


@Client-Linux

#ftp 100.100.100.100

ftp-user1 // 로그인 o
ftp-user2 // 로그인 x
ftp-user3 // 로그인 o



* chroot

- 프로그램이 인식하는 최상위 디렉터리 ( / )를
  변경하여 보안을 강화하는 방법
  
! 실습

@Server-A
#vi /etc/vsftpd/vsftpd.conf
---------------------------
(97번행)#chroot_local_user=YES //변경x , 확인만
//chroot 적용 x
:q
---------------------------


@Client_Linux
   세션1(root)   세션2(root)     세션3(root)
#ftp 100.100.100.100   #ftp 100.100.100.100  #ftp 100.100.100.100
ftp-user1 ftp-user2   ftp-user3
111 111   111

ftp>pwd ftp>pwd  ftp>pwd
/home/ftp-user1 /home/ftp-user2  /home/ftp-user3

ftp>cd /     ftp>cd / ftp>cd /
성공 성공 성공

ftp>cd /etc     ftp>cd /etc ftp>cd /etc
성공 성공 성공

// 보안적으로 굉장한 취약점을 가지고 있다.


@Server-A
#vi /etc/vsftpd/vsftpd.conf
---------------------------
(97번행)chroot_local_user=YES // 주석해지
//chroot 적용 o
:wq
---------------------------
#service vsftpd restart

@Client_Linux
   세션1(root)   세션2(root)     세션3(root)
#ftp 100.100.100.100   #ftp 100.100.100.100  #ftp 100.100.100.100
ftp-user1 ftp-user2   ftp-user3
111 111   111

ftp>pwd ftp>pwd  ftp>pwd
   / /  / (Server-A의 /가 아니라
 가상의 /공간)

ftp>cd /     ftp>cd / ftp>cd /
실패 실패 실패

ftp>cd /etc     ftp>cd /etc ftp>cd /etc
실패 실패 실패


@Server-A
#vi /etc/vsftpd/vsftpd.conf
---------------------------
(97번행)chroot_local_user=YES // 주석해지 ,
(98번행)chroot_list_enable=YES // 주석해지 ,  chroot_list 파일을 활성화
(100번행)chroot_list_file=/etc/vsftpd/chroot_list // 주석해지 ,
chroot_list파일의 경로와
이름을 지정
:wq
---------------------------

#vi /etc/vsftpd/chroot_list
--------------------------
ftp-user2 // ftp-user2만 chroot 적용x
  나머지 계정은 chroot가 적용

:wq
-------------------------

#service vsftpd restart

@Client_Linux
   세션1(root)   세션2(root)     세션3(root)
#ftp 100.100.100.100   #ftp 100.100.100.100  #ftp 100.100.100.100
ftp-user1 ftp-user2   ftp-user3
111 111   111

ftp>pwd ftp>pwd  ftp>pwd
   / /home/ftp-user2 / (ftp-user2만 chroot 적용 x)

ftp>cd /     ftp>cd / ftp>cd /
실패 성공 실패

ftp>cd /etc     ftp>cd /etc ftp>cd /etc
실패 성공 실패

//chroot_list유저를 변경하면서 실습해보세요.


* Active Mode & Passive Mode


! 실 습
@Server-A
#cd /home/ftp-user1
#chmod 777 /home/ftp-user1
#touch file{1..10} // 테스트 파일 생성


① Passive Mode
@Server-A
#watch -d -n 0.1 "netstat -ntp"  // 네트워크 상태를 확인하는 명령어


@Client_Linux
#ftp 100.100.1001.100
ftp-user1
111

~ Server-A의 상태 확인 ~

Local Foreign
100.100.100.100:21 100.100.100.200:?



ftp> get file1

~ Server-A의 상태 확인 ~

Local Foreign
100.100.100.100:21 100.100.100.200:? // 제어
100.100.100.100:? 100.100.100.200:? // 파일전송

ftp> get file2
 get file3
 get file4
 ...
 ...
// 서버와 클라이언트의 포트 확인
서버 1024~ , 클라이언트 1024~


100.100.100.100:21 100.100.100.200:? // 제어
100.100.100.100:? 100.100.100.200:? // 파일전송  
100.100.100.100:? 100.100.100.200:? // 파일전송  
100.100.100.100:? 100.100.100.200:? // 파일전송  
   
 
② Active Mode
( 클라이언트 재접속 )

서버 -> 클라이언트 데이터 전송방향으로 
클라이언트쪽에서도 방화벽을 해지해야 한다.

#setenforce 0
#service iptables stop

#ftp 100.100.100.100
ftp-user1
111

~ Server-A의 상태 확인 ~

Local Foreign
100.100.100.100:21 100.100.100.200:?


ftp> passive // Active Mode로 변경




ftp> get file21

~ Server-A의 상태 확인 ~

Local Foreign
100.100.100.100:21 100.100.100.200:? // 제어
100.100.100.100:20 100.100.100.200:? // 파일전송

ftp> get file22
 get file23
 get file24
 ...
 ...
// 서버와 클라이언트의 포트 확인
서버 20 , 클라이언트 1024~


100.100.100.100:21 100.100.100.200:? // 제어
100.100.100.100:20 100.100.100.200:? // 파일전송  
100.100.100.100:20 100.100.100.200:? // 파일전송  
100.100.100.100:20 100.100.100.200:? // 파일전송  
 

3) Passive 모드에서 데이터 전송포트 지정

@Server-A
#vi /etc/vsftpd/vsfptd.conf
---------------------------------
~ 제일하단에 추가 ~~

pasv_enable=YES // 수동모드 사용 ( 기본값 )
pasv_min_port=xxxx // 1023~ , ex) 3000 
pasv_max_port=xxxx //    ex) 3010 

:wq!
---------------------------------

#service vsftpd restart
#watch -d -n 0.1 "netstat -ntp"



@Client-Linux
#ftp 100.100.1001.100
ftp-user1
111

~ Server-A의 상태 확인 ~

Local Foreign
100.100.100.100:21 100.100.100.200:?



ftp> get file41

~ Server-A의 상태 확인 ~

Local Foreign
100.100.100.100:21 100.100.100.200:? // 제어
100.100.100.100:3000~3010 100.100.100.200:? // 파일전송

ftp> get file42
 get file43
 get file44
 ...
 ...
// 서버와 클라이언트의 포트 확인
서버 1024~ , 클라이언트 1024~


100.100.100.100:21 100.100.100.200:? // 제어
100.100.100.100:3000 ~ 3010 100.100.100.200:? // 파일전송  
100.100.100.100:3000 ~ 3010 100.100.100.200:? // 파일전송  
100.100.100.100:3000 ~ 3010 100.100.100.200:? // 파일전송  
 
 
+@제어포트 변경하기

@Server-A
#vi /etc/vsftpd/vsfptd.conf
---------------------------------
~ 제일하단에 추가 ~~

pasv_enable=YES // 수동모드 사용 ( 기본값 )
pasv_min_port=xxxx // 1023~ , ex) 3000 
pasv_max_port=xxxx //    ex) 3010 

~ 제일하단에 추가 ~~
listen_port=xxxx // 제어포트 변경 ex)2121

:wq!
---------------------------------

#service vsftpd restart
#watch -d -n 0.1 "netstat -ntp" 

@Client-Linux
#ftp 100.100.100.100  //로그인 불가


#ftp 100.100.100.100 2121 //포트를 입력해야 로그인 가능
ftp-user1
111

~ ServerA에서 연결된 포트 확인 ~

'LINUX(Server)' 카테고리의 다른 글

DNS  (0) 2024.04.28
NFS  (2) 2024.04.27
DHCP  (0) 2024.04.25
Samba  (0) 2024.04.24
NC , Telnet , SSH , VNC  (1) 2024.04.23