kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

OS

FTP 개념 및 VSFTP passive 설정

까마기 2015. 7. 28. 15:01
반응형

FTP는 다른 서비스와는 달리 2가지 모드로 동작합니다. (Active / Passive)

웹 브라우저는 일반적으로 Passive mode로 설정되어 있고, Filezilla 등과 같은 FTP 클라이언트 프로그램들은 일반적으로 Active mode가 기본값으로 설정되어 있습니다.

 

1. Active mode

- 클라이언트에서 서버의 21번 포트로 접속 후 클라이언트가 사용할 두 번째 포트를 서버에 알려줍니다. 
- 서버는 클라이언트로 서버로 부터 Ack를 보내고, 서버의 20번 포트는 클라이언트가 알려준 두 번째 포트로 접속을 시도합니다.

○ Active Mode 의 문제점
: 일반적인 TCP/IP의 특징인 ‘클라이언트가 서버에 접속을 시도하는 것’이 아니라 ‘서버가 클라이언에 접속을 시도한다’는 것이며, 이 때문에 만약 클라이언트 PC등에 방화벽이 설치되어 있거나 FTP를 잘 이해하지 못하는 공유기 등을 사용하여 외부에서의 접속을 허용하지 않는다면 세 번째 프로세스가 작동하지 않게 되어 FTP 접속이 제대로 되지 않는 문제점이 있고, 이러한 경우 FTP 접속은 되지만 이후 데이터 목록을 받아오지 못하여 에러가 발생하게 됩니다.

 

Active Mode는 클라이언트에서 서버측 21번 포트로 접속시도 하고 데이터 포트는 서버에서 클라이언트로 접속하여 데이터를 보내는 방식이다.

 

2. Passive mode

○ Active Mode의 문제점을 해결하기 위한 대한으로 디자인된 Passive Mode

- 클라이언트에서  서버의 21번 포트로 접속을 시도하면, 서버에서는 사용할 두번째 포트를 클라이언트에게 알려줍니다.
- 클라이언트는 다른 포트를 열어 서버가 알려준 이 포트로 접속을 시도합니다.

○ Passive Mode 의 문제점
: Passive 모드에서는 두 번째 data포트로서 Active 모드가 사용했던 20번을 사용하지 않고 대신 1024 이후의 임의의 비 특권 포트를 사용하게 되고, 따라서 Passive 모드는 서버에서 클라이언트로 연결을 시도하는 Active 모드의 문제점을 해결하기는 했지만, 서버의 비 특권포트(1024 ~ 65535)를 방화벽에서 모두 열어 두어야 한다는 또 다른 문제점이 야기되었습니다. 그러나 proftpd등 대부분의 ftp 데몬에서는 클라이언트가 Passive Mode로 접속 시 사용할 수 있는 포트를 제한설정 할 수 있는 기능을 지원하므로 이의 문제점을 미봉책이나마 어느 정도는 해결할 수 있습니다.

 

Passive 모드는 클라이언트에서 서버쪽 21번 포트로 접속 시도 하고 데이터 포트도 클라이언트에서 서버의 임의의 포트로 접속하여 데이터를 받아오는 방식이다.

 

3. 리눅스 vsftp 설치 및 구동

 

yum install vsftp -y

/etc/init.d/vsftpd start

chkconfig vsftpd on

netstat -nlp

 

vi /etc/vsftpd/vsftpd.conf

 

pasv_enable = YES

pasv_min_port=50020

pasv_max_port=50030

pasv_promiscuous=YES

port_enable=YES

ftp_data_port=50020

listen_port=50021

 

:wq

 

- 테스트

useradd 유저명

passwd 유저명

:

:

 

- iptables 허용

tcp 50020:50030

50021

 

 

알FTP 또는 filezilla 로 접속 테스트

xxx.xxx.xxx.xxx 

port : 50021

id:

pw:

기본적으로 FTP서버에 대해서 알아야할 사항이 있습니다.

1. FTP는 두개의 PORT를 사용한다는 것입니다.   하나는 COMMAND PORT이며, 다른 하나는 DATA PORT입니다.

2. FTP는 TCP를 기반으로 만들어져 있습니다.    UDP를 사용하지 않습니다.

 

위의 두 가지 사항을 토대로 두가지 모드의 차이점을 설명하겠습니다.

차이점 중 눈여겨 볼 사항으로는 데이터전송 포트부분과 전송방향에 대한 부분입니다.

 

 

1. ACTIVE mode(능동형)

 

전통적으로 21번 port를 server ftp port로 알고 있습니다.

이는 command를 위한 port이고

실제 data를 전송하기 위해서는 data전송을 위한 port를 사용합니다.

보통 data전송 port는 20번 port를 사용합니다.

 

클라이언트는 1024번 이상의 빈 port를 골라서 command port로 사용하고

해당포트에 +1을 더한 port를 data port로 사용합니다.

 

예를 들어)

1. 클라이언트가 서버 ftp에 접속하려고 1080번 port를 이용하여 서버 ftp에

   접속 요청을 날립니다. 이때 +1더한 1081번 port의 정보를 같이 서버에 보냅니다.

2. 서버 ftp의 21번 포트에서 해당 클라이언트의 요청을 수락하고 21번 command port는

   1080번과 20번 data port는 1081번과 connection을 맺습니다.

3. 클라이언트에서 데이터를 요청하면

   서버측에서 클라이언트로 해당 데이터를 넣어줍니다.

 

 

2. PASSIVE mode(수동형)

 

passive mode 일때 서버의 command port는 21번이며

data port는 1024번 이상의 사용하지 않는 port 중 하나를 사용합니다.

 

클라이언트는 1024번 이상의 빈 port를 골라서 command port로 사용하고

해당포트에 +1을 더한 port를 data port로 사용합니다.

 

예를 들어)

1. 클라이언트가 서버 ftp에 접속하려고 1080번 port를 이용하여 서버 ftp에

   접속 요청을 날립니다. 이때 +1더한 1081번 port의 정보를 같이 서버에 보냅니다.

2. 서버 ftp의 21번 port에서 해당 클라이언트의 요청을 수락하고 21번 command port는

   1080번과 connection을 이루며

   서버측의 1024이상의 빈 port와 클라이언트의 1081번 port와 connection을 맺습니다.

3. 클라이언트에서 데이터를 요청하고

   클라이언트가 서버에서 데이터를 가져옵니다.

 

 

------------------------------------------------------------------------------

 

위의 내용을 보시면 active mode의 경우 

서버가 -> 클라이언트에 데이터를 넣어주고

 

passive mode의 경우

클라이언트가 -> 서버에서 데이터를 가져옵니다.

 

간혹 active mode로 전송이 이루어지지 않으면 passive로 하라고 하는데

active mode의 경우는  서버가 클라이언트에 접속을 하는 방식이니까

 

[서버] --> [클라이언트쪽 방화벽(필터링:대부분 80port 만 허용)] --> [클라이언트]

 

클라이언트 앞에 방화벽이 있다면 접속이 되지 않을 것입니다.

하지만 passive mode의 경우는 클라이언트가 서버에 접속을 하니

클라이언트의 방화벽과는 무관하게 접속이 잘이루어 집니다.

 

간혹 ftp 클라이언트 프로그램으로 ftp에 접속하면 잘 되는데 브라우저로 ftp서버에 접속하면 잘되지 않는 경우가 있습니다.

이는 브라우저의 default 방식이 passive mode 방식이고 클라이언트 프로그램의 default 방식이 active mode 방식이기 때문입니다.

 

서버측 입장에서는 passive mode를 좋아하지 않습니다.

실제로도 passive mode를 꺼두는 경우가 많은데 해킹의 위협이 많이 있기 때문입니다.

서버에서 클라이언트로 접속할때는 위험이 적지만 클라이언트가 서버로 직접 접속할 때의 위험도는 상당히 커지기 때문입니다.

 

  

 

 

1) FTP 데이터 연결 설정을 위해 먼저 클라이언트 데이터 전송 프로세스가 소동 개방 작업을 수행한다. 수동 개방 작업은 데이터 전송 프로세스를 위한 임시 포트설정, 자신의 호스트 IP 주소와 임시 포트 번호를 소켓 주소로 가지는 클라이언트 소켓 생성, 그리고 생성된 클라이언트 소켓으로의 메시지 도착에 대한 관찰 동작을 포함한다.

 2) 클라이언트 데이터 전송 프로세스의 수동 개방 작업이 완료되면 클라이언트 제어 프로세스는 미리 설정된 제어 연결을 통해 클라이언트 데이터 전송 프로세스를 위한 포트 번호를 서버 제어 프로세스에게 전달한다. 포트 번호 전달을 위한 명령은 PORT이다.

 3) 서버 제어 프로세스는 설정될 데이터 연결을 통한 파일 전송을 담당할 자식 서버 데이터 전송 프로세스를 생성하고, 클라이언트 데이터 전송 프로세스의 소켓 주소를 전달한다. 생성된 자식 서버 데이터 전송 프로세스는 자신의 호스트 IP 주소와 영구 포트 번호 20번을 수켓 주소로 가지는 서버 데이터 연결 소켓을 생성하고, 생성된 서버 연결 소켓과 클라이언트 데이터 소켓간 TCP 연결 설정을 요청하는 능동 개방 작업을 수행한다.

 4) 클라이언트 데이터 전송 프로세스가 클라이언트 데이터 소켓으로부터 TCP 연결 설정 요청 메시지를 수신하면 데이터 연결 설정이 완료된다. 

 

 

==========================================================================================================================================

 

FTP(File Transfer Protocol) 작동 모드

 

기본적으로 FTP Session 의 구성은 FTP Client  Server 간의 통신으로 SYN Packet, ACK Packet으로 이루어진다. Active Mode의 경우 Firewall은 시스템 구성에 있어 문제를 발생시킬 수 있다. 그 이유는 Firewall 사용시 FTP Server Firewall을 통해 클라이언트와 통신을 이루어야 하므로, 이러한 추가되는 상황까지 분석해야 하며 이러한 불편함을 덜고자 Passive Mode가 필요하게 되었다.

 

 

 

Active Mode

- 클라이언트에서 서버로 접근을 시도하는 방법 (서버측 21, 20번 개방 필요)

 

클라이언트가 서버 쪽 21포트에 연결을 하면 서버 쪽에서 능동적으로 클라이언트의 불특정포트에 접속을 시도하게 된다 이때 방화벽이나 NAT가 있다면 커넥션이 제대로 성공이 안되고 된다고 하더라도 ls 와 같은 명령어를 주었을 때 list failed가 된다.

1. Client Command Port ( TCP n , n(ex.1026)>1023 )에서 FTP Server Command Port(TCP 21)으로 접속/응답  à Client Data Port 정보 전달

2. Client 에서 제공한 정보를 기반으로 Server Data Port (TCP 20)에서 FTP Client Data Port (TCP n(ex.1026)+1)로 접속 및 응답

 

 방화벽 설정 시 유의 사항

 Server  : TCP 21번에 대한 Client 접속 허용

 Client  : Server 측의 모든 접속 허용 (보안 상에 문제 있음)

 

 

Passive Mode

- 서버가 클라이언트로 접근을 시도하는 방법 (서버측 21번 개방 필요)

 

전통적인 FTP 방식인 Active Mode에서 방화벽을 사용할 경우에는 포트를 하나만 열어주는 경우가 대부분인 상황이 발생되는데 이런 경우에 최근 나타난 Passive Mode를 이용하여 접속을 하면 데이터에도 접속할 수 있는 방식

1. Client Command Port (TCP n, n(ex.1026)>1023)에서 FTP Server Command Port (TCP 21)으로 접속/응답    → Server Data Port 정보를 Client 에게 전달

2. Server 에서 제공한 정보를 기반으로 Client Data Port (TCP n(ex.1026)+1)에서 FTP Server Data Port로 접속.(임의포트로 지정)

 

- 접속환경이 주로 Server측 공인 IP이고 접속 자는 클라이언트 유동 or 가상 IP

Client에서 21port 접속하고 Passive로 전환을 요청 시 서버는 1023보다 큰 특정포트를

클라이언트에게 알려주고 알려준 포트를 사용하여 Listening을 하며 대기

 

 

 방화벽 설정 시 유의 사항

 Server  : TCP 21, TCP n번에 대한 Client 접속 허용

      제공되는 FTP 서버에서 Passive Port에 대한 설정 가능 여부 확인

Client  : 없음

 

 

============================================================================

vsFTP란?

- vsftp는 보안 부분을 특히 강조한 데몬으로 Redhat, Suse, Open-BSD에서 기본 FTP로 채택하고 있으며 보안, 빠른 퍼포먼스, 안정성을 주요 특징으로 소개하고 있다.

또한, config 파일의 설정 문법도 아주 간단해서 FTP 서버 관리를 쉽게 할 수 있다.

 

※ 지원기능

- 가상 IP 별 별도의 환경 설정 기능(설정 파일의 listen_address 이용)

- 가상 사용자 설정, chroot를 이용한 사용자 설정

- 전송 대역폭 지정 가능

- PAM 지원 (v1.2부터 PAM을 통한 wtmp에 로그인 로그를 남긴다.)

- xferlog 표준 로그 파일보다 상세한 자체 로그 파일 형식 지원

- stendalone 방식과 inetd(xinetd)를 통한 운영 모두 지원

- IP별 다른 환경 파일 지정 기능(tcp_wrappers와 함께 사용할 경우)

 

※ TIP

- SSH 터널링을 사용하여 접속시 Bad IP Deny 메시지가 나올 경우 vsftpd.conf에 pasv_promiscuous=YES 추가한다.

- FTP 유저의 홈디렉토리의 소유권을 root.root로 셋팅해야 익명접속이 가능하다.

- /var/ftp/pub 폴더  권한을 777로 변경하면 접속이 안된다. vsFTP에서 vs는 Very Secure의 약자입니다. 보안이 강화된 FTP 서비스로 /var/ftp/pub 디렉토리에 모든 권한을 주게 될 경우 보안상 위험하기 때문에 접속이 불가능하다.

 

※ 접속자 확인

root@localhost# ps -ef |grep vsftpd

root@localhost# fuser -v ftp/tcp

( 참고 : v1.2 이상 부터 PAM을 통해 wtmp에 접속 로그를 남기기 때문에 last 명령어로 접속 여부를 확인 할 수 있다. )

①  환경설정

 

root@localhost# vi /etc/vsftpd.conf

root@localhost# mkdir /usr/share/empty

- vsFTP 는 empty 라는 디렉토리를 필요로 한다. 기본구성은 /usr/share/empty 다.

 

 

② 사용자 생성

- vsFTP 를 운영하기 위해서는 nobody 사용자가 필요

root@localhost# usradd -M nobody

root@localhost# grep nobody /etc/passwd

nobody:x:99:99:Nobody:/:/bin/bash

 

- Anonymous FTP 에서 사용할 ftp 계정 생성

root@localhost# mkdir /var/ftp

root@localhost# useradd -d /var/ftp ftp

root@localhost# chown root.root /var/ftp

- 반드시 ftp 유저의 홈디렉토리의 권한을 root.root 로 셋팅해야 익명접속이가능하다.

root@localhost# chmod og-w /var/ftp

 

③ 접속 제한

root@localhost# vi /etc/pam.d/vsftpd

auth required /lib/security/pam_listfile.so

item=user sense=deny file=/etc/ftpusers onerr=succeed <==(1)

auth required /lib/security/pam_pwdb.so shadow nullok

auth required /lib/security/pam_shells.so

account required /lib/security/pam_pwdb.so

session required /lib/security/pam_pwdb.so

- 이 파일은 /etc/ftpusers에 등록된 유저명은 접근하지 못하도록 설정할 수 있는 부분이다. (sense=deny)

- ftpusers 파일이 없다면 생성해 주면 된다. ( /etc/passwd 파일을 참조해 작성하면 된다.)

 

root@localhost# vi /etc/ftpusers

- FTP 접속을 허용하지 않을 ID를 등록한다. (또는 vsftpd.ftpusers)

- /var/log/messages에 다음과 같은 로그가 남는다.

Aug 16 22:21:52 truefeel vsftpd: PAM-listfile: Refused user xxxxxxxx for service vsftpd

 

④ etc

root@localhost# vi /etc/xinetd.d/vsftp ::: disable = yes

root@localhost# /etc/rc.d/init.d/xinetd restart

root@localhost# /usr/local/sbin/vsftpd &

 

※ vsftpd.conf 

 

① 기본 설정

ftpd_banner=Welcome to acsecret FTP service.

- FTP 서버 접속할 때 로긴 메시지 (default=버전번호). 한글 사용 가능

- dirmessage_enable=YES 새로운 디렉토리에 들어갔을 때 뿌려줄 환경 메시지를 저장한 파일명

 

listen=YES Standalone 으로 운영할 때 listen=YES.

- connect_from_port_20=YES Standalone 일때 포트 변경을 원할 경우 설정.

listen_port=2121 기본 포트외 다른 포트를 사용한다. 

 

② 서버 동작

idle_session_timeout=600 (default=300초).

- 클라이언트에서 아무런 명령이 없을 경우, 세션을 끝낼 때까지의 대기시간.

data_connection_timeout=120 (default=60초).

- data connection 을 끊을 대기 시간.

ls_recurse_enable=YES

- 디렉토리 내용 출력시 캐쉬 사용여부. (클라언트 ftp 접속 프로그램 에서도 지정 가능)

pam_service_name=vsftpd

- PAM 파일명을 지정 (설치할 때 /etc/pam.d/vsftpd 명으로 복사함)

 

③ 접속 권한

local_enable=YES (default = NO).

- 로컬 계정 사용자의 접속 허용 여부

anonymous_enable=YES (default = YES).

- anonymous 사용자의 접속 허용 여부

userlist_enable=YES

- /etc/vsftpd.user_list 에 있는 사용자에 대해 접근을 허가 설정.

 

deny_email_enable=YES

- 익명 접속시 패스워드에 일반 이메일 주소를 거부 여부 (vsftpd.banned_emails에 지정된 이메일 주소만 허용)

banned_email_file=/etc/vsftpd.banned_emails

 

- chroot

chroot_local_user=YES (default=NO). 접속시 로컬 사용자의 홈디렉토리를 /로 변경

사용자의 홈디렉토리를 벗어나지 못하도록 제한하기 위한 설정. 제한이 필요할 경우 , YES 로 바꾼 후 제한할 사용자 ID 를 chroot_list_file= 에 설정한 파일에 지정한다. chroot_local_user 옵션만 YES를 하면 모든 로컬 유저에게 자신의 홈 디렉터리의 상위 디렉터리로의 접근이 제한된다. 

ex) /home/secuday -> '/' 이런식으로 보인다.

 

* CentOS 7 주의할점

chroot_local_user=YES 옵션만 활성화한 후에 일반 유저로 로그인 시 "vsftpd.service: control process exited, code=exited status=2" 메세지가 뜨면서 로그인이 되질 않는다.

 

vsftpd.conf 설정파일에 아래 라인 추가 후 서비스 재시작 후 확인

allow_writeable_chroot=YES 

=================================================================================================

 

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd/chroot_list

- 접속시 사용자 홈디렉토리를 /로 변경할 사용자 목록 허용. chroot 제한(적용)이 필요할 경우, YES 로 바꾼후 제한을 적용할 사용자 ID 를 root_list_file= 에 설정한 파일에 지정한다.

- 주의할 것은 chroot_local_user=YES 와 chroot_list_enable=YES 를 함께 사용할 경우, /etc/vsftpd.chroot_list에 포함된 사용자 ID 만 제한없이 홈디렉토리를 벗어날 수 있다. (반대로 작용)

 

chroot_local_user=YES , chroot_list_enable=YES , chroot_list_file=파일명 

즉 3개 옵션을 모두 활성화 했을 경우에  Change root list 파일에 (/etc/vsftpd/chroot_list)에 적용할 로컬 유저를 추가하지 않으면, chroot_local_user=YES 옵션만 활성화한 것과 동일하게 적용된다.

(/etc/passwd에 등록되어있는 로컬사용자의 홈디렉토리는 / 로 표시되며 이 이상의 상위디렉토리로의 이동은 불가능하다.)

 

* 주의할점 

1) selinux 활성화 시

getsebool -a | grep ftp

setsebool allow_ftpd_full_access on

 

2) selinux 비활성화시

설정 필요없음

 

④ 파일 권한

local_umask=022 (default = 077).

- 로컬 계정 사용자용 umask

write_enable=YES (defualt = NO).

- write 명령어 허용 여부

 

ascii_upload_enable=YES

- ASCII 파일 업로드 가능.

ascii_download_enable=YES

- ASCII 파일 다운로드 가능

 

- 익명사용자

anon_upload_enable=YES (default = NO).

- anonymous 사용자가 파일을 업로드 할수 있는지 여부. 허용시 업로드 할수있는 디렉토리를 생성해 주어야 한다.

anon_mkdir_write_enable=YES (default = NO).

- anonymous 사용자의 디렉토리 생성 허용 여부. chown_upload=YES 익명유저가 업로드한 파일의 소유권을 자동변경.

chwon_username=acsecret 소유권을 변경하기 원하는 유저명으로 기입

 

 

⑤ log

session_support=YES

- wtmp 에 로그 남기기 (YES 로 해야만 last 명령어로 접속 여부 확인 가능)

 

xferlog_file=/var/log/vsftpd.log

- 파일 전송 로그 파일명

xferlog_enable=YES (default=YES).

- 파일 전송 로그를 남길 것인지 여부

xferlog_std_format=YES (defalut=YES).

- xferlog 표준 포맷으로 로그를 남길지 여부. xferlog 표준 포맷은 로그인, 디렉토리 생성등의 로그를 남기지 않지만 vsftpd 스타일 로그는 이를 포함한 보다 상세한 로그를 남긴다.

 

vsftpd 스타일 로그 예

Sun Jul 12 01:38:32 2003 [pid 31200] CONNECT: Client \"127.0.0.1\"

Sun Jul 12 01:38:34 2003 [pid 31199] [truefeel] FAIL LOGIN: Client \"127.0.0.1\"

 

 

⑥ 추가 설정

- pasv mode 설정

pasv_enable=NO 사무실에서 공유기를 통해서 접속을 하는데 ls 등이 자주 먹통이 되면 설정.

pasv_promiscuous=YES

pasv_min_port=30000

pasv_max_port=30999

 

- 가상유저

guest_enable=YES

guest_username=virftp 가상 유저의 실제 할당 계정

user_sub_token=$USER 서로 다른 홈 디렉토리를 부여하기 위해 셋팅

local_root=/home/virftp/$USER

virftp_use_local_privs=YES 설정하지 않으면 기본 적으로 anonymous 의 권한을 가지고 파일을 생성하지 못한다.

 

- xinetd 를 통하지 않고 standalone으로 동작할 때만 사용 가능)

max_clients=100 최대 접속자 수

max_per_ip=3 IP 당 접속 수

 

 

⑦ 전송속도 제한 (0은 제한없음, 단위는 초당 bytes)

local_max_rate=200000 계정 사용자의 전송량 제한

anon_max_rate=100000 anonymous 사용자의 전송속도 제한

trans_chunk_size=0 지정한 byte 단위로 나눠서 전송 저장한다. 0은 vsftpd 가 알아서 판단한다. (v1.1.3 이상에서 trans_chunk_size 옵션이 있다.)

anonymous 사용자와 일반 계정 사용자로 나눠서 bandwidth 를 설정 하도록 옵션을 제공한다. 이 설정은 전송되는 상황을 더 쉽게 파악할수 있도록 해준다.

anon_max_rate=10000, trans_chunk_size=0 로 설정하여 chunk size 를 vsftpd 가 판단하도록 한다.

 

vsftpd 는 chunk size 를 제한한 rate(10000) 보다 큰 50000 byte 가 적당하다고 판단했다면 1~4 초 사이에는 전송된 파일 크기는 0 으로 표시될 것이다.

5 초가 되어야 파일 크기는 50000 으로 보일 것이다. (5초 이후에도 마찬가지다)

 

이때 trans_chunk_size=5000 으로 했다면 전송된 파일 크기를 바로바로 확인할 수 있다. (size 는 최소 4096~65536 의 값을 설정해야 적용이 된다.)

 

- proftpd 의 RateReadFreeBytes 와 RateReadHardBPS 같은 역할을 하는 옵션은 없다.

RateReadFreeBytes bandwidth 제한 없이 전송할 수 파일 크기

RateReadHardBPS RateReadFreeBytes 보다 파일이 클때, 위의 지정한 파일크기 까지는 제한없이 전송. 그 다음 크기부터는 제한한 bandwidth로 파일 전송

 

 

⑧ 가상유저 서비스

- 가상유저 FTP 란 로컬 시스템에 실제로 존재하지 않는 유저로 FTP 로그인을 허락하고 운영하는 환경이다.

- 로컬 시스템에 계정을 추가하지 않고도 FTP 만을 위한 사용자를 추가, 삭제할 수 있는 FTP 시스템이다.

- 사용자 들에게 FTP 만 제공해야 될때 아주 유용하게 사용할 수 있다.

 

 

* 가상유저 데이터베이스 생성

FTP 가상유저를 생성하기 위해 가상유저와 패스워드가 담긴 DB 파일을 만들어야 되는데 간단히 사용자 ID 와 비밀번호가 입력된 텍스트 파일을db_load 유틸을 이용해 DB 포맷으로 변환해 줌으로써 가상유저가 사용할 사용자 DB 파일을 만들수 있다. 홀수줄은 FTP 가상유저 ID 가 되고 짝수줄은 바로 윗줄에 명시된 FTP 가상유저의 비밀번호가 된다.

 

root@localhost# cat vir_user.txt

myid

1234

 

DB 포멧으로 변환하기 위해 db_load 유틸을 사용하는데 db4-utils 이라는 RPM 패키지에 포함되어 있다.

db_load 유틸을 설치하지 않았으면 db4-utils RPM 패키지를 다운받아 설치하라.

/etc 디렉토리안에 넣고, root 이외의 사용자는 파일을 볼수없게 퍼미션을 600 으로 변경

root@localhost# db_load -T -t hash -f vir_user.txt ~/vsftpd_login.db

root@localhost# mv ~/vsftpd_login.db /etc/

root@localhost# chmod 600 /etc/vsftpd_login.db

root@localhost# ls -l

-rw------- 1 root rootl 12288 01월 07 16:39 /etc/vsftpd_login.db

 

 

* 사용자 인증에 사용할 PAM 파일 생성

이제 가상 유저들의 ID와 비밀번호가 정확한지 체크한후 FTP 로그인을 허락하기 위한 PAM 을 만들 것이다.

root@localhost# vi /etc/pam.d/vsftpd

auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login account required \

/lib/security/pam_userdb.so db=/etc/vsftpd_login

* 가상유저 계정 생성과 가상유저들이 사용할 디렉토리 생성.

virftp 계정을 가상 유저들의 실제 계정으로 추가하고 /home/virftp 디렉토리를 가상 FTP의 홈디렉토리로 지정을 할 것이다.

 

root@localhost# useradd -d /home/virftp virftp

root@localhost# cp /etc/hosts /home/virftp/

root@localhost# chown virftp.virftp hosts

root@localhost# ls -l

drwx------ 4 virftp virftp 4096 01월 07 16:39 /home/virftp

-rw-r--r-- 1 virftp virftp 146 01월 07 16:39 /home/virftp/hosts

 

* 가상 FTP 환경설정 파일 세팅

이제 마지막으로 가상 FTP 를 사용하기 위한 환경설정 파일을 작성할 것이다.

vsftpd_vitual.conf 라는 파일에 다음의 내용을 넣어 /etc 디렉토리에 생성한다.

listen=YES standalone 모드로 설정하기 위해 listen_port=2121 listen_port 를 추가하고 vsftpd 서버를 재실행 한다.

root@localhost#connect_from_port_20=YES

 

local_enable=YES   →   가상 유저도 로컬사용자 이다.

anonymous_enable=NO   →   익명접속 막음

chroot_local_user=YES   →   홈 디렉토리 이외는 접속 불능

write_enable=YES   →   파일 생성 가능

local_umask=022

xferlog_enable=YES    →   접속 로그 생성

xferlog_file=/var/log/vsftpd.log

pam_service_name=vsftpd    →   pam 파일 이름

pasv_min_port=30000

pasv_max_port=30999

 

guest_enable=YES    →   반드시 ok

guest_username=virftp    →   가상 유저의 실제 할당 계정

user_sub_token=$USER    →   서로 다른 홈 디렉토리를 부여하기 위해 셋팅

local_root=/home/virftp/$USER

 

virftp_use_local_privs=YES    →   설정하지 않으면 기본 적으로 anonymous 의 권한을 가지고 파일을 생성하지 못한다.

dirmessage_enable=YES

 

 

* 위와같이 설정이 되었다면 /home/virftp 에 가상유저별 홈디렉토리를 생성해야한다.

root@localhost# mkdir /home/virftp/{myid,yourid}

root@localhost# chown virftp.virftp /home/virftp/*

root@localhost# ls -l /home/virftp/

-rw-r--r-- 1 virftp virftp 146 01월 07 16:39 hosts

drw-r-xr-x 1 virftp virftp 4096 01월 07 16:39 myid

drw-r-xr-x 1 virftp virftp 4096 10월 27 16:39 yourid

 

* vsftpd 실행

가상유저 FTP 를 운영하기 위해서는 vsftpd 를 Standalone 방식으로 작동시켜야 된다.

vsftpd 실행시에 /etc/vsftpd_virftp.conf 파일을 환경설정 파일로 지정하자.

root@localhost# ftp localhost

user :

passwd :

 

반응형