IT/리눅스마스터1급

ftp 란

알콩달콩아빠 2018. 2. 12. 11:30
728x90
반응형

안녕하세요


뚱보 프로그래머 입니다.


ftp란 무엇일까요


FTP 서버

1. FTP 개요

ftp는 네트워크 서비스 중에서 매우 중요한 부분으로 남아있는 서비스이다. 웹의 등장으로 상대적으로 중요성이 줄어들었지만 아직도 대용량의 파일을 대량 전송하는 데는 ftp 만한 것이 없다. 요즈음은 웹브라우저 안으로 ftp 클라이언트가 통합되는 경향을 보이고 있다. 넷스케이프에서도 주소에 ftp:// ~~ 하고 입력하면 ftp 서비스를 이용할 수 있다. 하지만 여러 개의 문서를 동시에 전송받는 다든지, 파일 전송을 쉽게 재시작 한다든지 여러 가지 ftp 만의 장점이 있다

 

1) FTP 프로토콜

FTP 프로토콜은 TCP/IP가 구현되기 전부터 정의되어 있었다. 연결에 두개의 채널을 사용하는데 한 채널은 명령과 응답용이고, 다른 하나는 데이터와 데이터 파일용이다 명령과 제어를 위한 채널은 항상 열린 상태이지만 데이터 교환을 위한 채널은 필요할 때만 열린다. /etc/services 파일을 보면 20 번 포트는 ftp-data , 21 번 포트는 ftp 라고 서비스명이 지정되어 있다클라이언트는 임의의 포트에서 서버쪽 21번 포트로 접속을 하고 데이터 전송은  서버쪽 20 번 포트에서 클라이언트의 또 다른 임의의 포트로 연결하여 이루어진다.

 

2) FTP 서비스의 종류

ftp 서비스는 두 가지로 나눌 수 있는데, 시스템에 계정을 가진 사용자들을 위한 일반적인 ftp 와 익명의 모든 사람들에게 개방되어 있는 anonymous ftp 가 그것 이다.

 

3) ftp 서버의 선택

오랜 역사를 갖는 FTP 서버는 wu-ftpd 이다. Washington University 에서 제작되어 붙여진 이름이다. 오랜 역사를 갖고 있지만 새로운 기능들이 결핍되어 있고, 보안상의 취약점들이 발견이 되었다. 개발자들은 wu-ftp를 보완하기 보다는 새로운 ftp 서버를 개발하는 것이 낫다고 보고 Pro-FTPD 를 내놓았다. 많은 배포판이 proftp를 채용하고 있다. proftp는 처음부터 향상된 보안과 새로운 기능을 제공할 목적으로 개발되었다. 아파치 웹서버와 유사한 설정파일형식을 제공하여 한 개의 설정파일로 관리할 수 있으며, 시스템의 성능이나 부하를 고려하여 standalone 방식이나 inetd 방식을 선택할 수 있다 기타 로깅, 가상 호스팅, PAM 인증 등 다른 많은 기능을 지원하여 인기를 얻고 있다.

 

2. ProFTP

1) ProFTP의 특징

1] 단일한 환경 설정 파일 제공

/etc/proftpd/conf/proftpd.conf 파일하나로 모든 환경의 설정이 가능하고, 파일의 내용,형식은 아파치의 환경 설정 파일과 유사하므로 설정이 쉽다.

 

2] 접속자의 활동 제한 가능

.ftpaccess 설정 파일을 디렉토리 안에 만들어서, 사용자의 접근을 제한할 수 있다.

 

3] 다중 가상 ftp 서버 운용 가능

 

4] 보안 강화

보안상 문제점이 많은 SITE EXEC 명령이 존재하지 않는다. 즉 외부프로그램을 실행하지 않는다.

 

5] 퍼미션 적용

퍼미션을 적용하여 디렉토리나 파일들을 숨길 수 있다.

 

2) 기본 ProFTP 서버 실행

[root @edu00 linux]#ls /var/ftp

incoming/ pub/

[root @edu00 linux]#vi /etc/passwd

ftp 서버의 홈 디렉토리, 즉 경로를 확인한다.

[root @edu00 linux]#vi /etc/proftpd/conf/proftpd.conf

ftp 서버의 주 설정파일이며, 사용자가 특별하게 변경을 할 필요는 없지만 설정을 변경하고자 할 경우에는 이 파일을 수정한다. 특히 이 파일에서 FTP 서버가 inetd 방식인지 standalone 방식인지를 확인해야 한다. 확인하는 옵션은 ServerType 키워드이다.

[root @edu00 linux]#vi /etc/proftpd/conf/proftpd.xinetd

만약 FTP 서버가 standalone 방식으로 구동된다면 위 파일의 disable = yes disable = no로 변경하고 inetd 방식으로 지정되어 있으면 이 파일을 /etc/xinetd.d 디렉토리로 복사하여 사용한다.

[root @edu00 linux]#/etc/init.d/proftpd restart

[root @edu00 linux]#vi /var/ftp/welcome.msg

서버에 대한 정보나 안내 사항등을 기록하는 파일로 접속시 일반 사용자들이 보는 메시지이다.

[root @edu00 linux]#vi /var/ftp/pub/.message

해당 디렉토리에 대한 설명을 작성하는 파일로 해당 디렉토리를 소개하고 정보를 제공한다.

[root @edu00 linux]#vi /var/ftp/incoming/.message

[root @edu00 linux]#cd /var/ftp

[root @edu00 ftp]#chown root.daemon incoming

[root @edu00 ftp]#chmod 1773 incoming 

[root @edu00 ftp]#chmod 755 pub

[root @edu00 ftp]#chown ftp.ftp pub

[root @edu00 ftp]#/etc/init.d/proftpd restart

[root @edu00 ftp]#ncftp 192.168.1.2

 

3) ProFTP 설치

1] ProFTP 서버 사이트

어떤 응용 프로그램을 설치하기 위해서는 가장 먼저 응용 프로그램의 소스를 구해야 한다. 그리고 네트워크 관리자나 시스템 관리자는 항상 새로운 버전의 응용 프로그램을 확인해야 한다. 그래야 시스템을 좀 더 안전하게 관리할 수 있기 때문이다. 다음은 소스를 구할 수 있는 사이트들이다.

http://www.proftpd.org

ftp://linux.sarang.net/mirror/network/daemon/ftp/proftpd

 

2] 소스 설치

(1) 소스 파일 압축 해제

#bzip2 -d proftpd-1.2.1.tar.bz2 --directory=/usr/local

#tar xvf proftpd-1.2.1.tar --directory=/usr/local

 

(2) 설치 options

--prefix=PREFIX          

컴퓨터의 아키텍쳐와 무관하게 설치될 파일들의 위치를 지정하는 옵션으로 기본값은 /usr/local이다.

 

--exec-prefix=EPREFIX

아키텍쳐에 의존적인 파일들이 설치될 위치를 지정한다.

 

--bindir=DIR

바이너리 파일들이 설치될 디렉토리를 지정한다.

 

--disable-FEATURE

--enable-FEATURE=no와 동일한 기능을 하며, 특정 속성을 제거한다.

 

--with-modules=LIST

추가적인 모듈을 포함할때 사용하는 옵션으로 각 옵션은 콜론(:)으로 구분한다.

 

--enable-autoshadow

시스템이 쉐도우 패스워드를 사용할 때, 쉐도우 패스워드를 실시간으로 인식하게 할 때 사용한다.

 

--enable-shadow

강제적으로 쉐도우 패스워드를 사용하도록 컴파일한다.

 

--enable-pam

PAM을 지원하도록 컴파일한다.

 

(3) module 설정

기본적으로 제공하는 모듈들이 있고, 3rd party에서 제공하는 여러 모듈들이 존재한다. 예를 들어 PAM(Pluggable Authentication Modules)을 사용할 수 있도록 하는 mod_pam, 로그를 기록할 수 있도록 하는 mod_log 등의 기본적인 모듈이 존재하는가 하면, 포스트그레스 SQL을 지원하는 mod_pgsql, 사용자별로 디스크 할당량을 조절할 수 있는 mod_quota, 업로드와 다운로드의 비율을 지정할 수 있는 mod_ratio 등의 3rd party 모듈들이 존재한다.

기본적인 모듈들은 configure 실행시에 포함을 시킬 수 있지만, 그 외의 모듈들은 다음을 따른다.

#./configure --with-modules=mod_module1:mod_module2:mod_module3

다음은 기본적인 모듈들에 대한 설명이다.

모듈

설명

mod_auth

ftp에서 사용자 인증 모듈 명령(user, pass, acct, rein )을 포함하고 있다.

mod_core

핵심이 되는 지시어에 대한 모듈과 RFC 959에 지정된 ftp 명령어 등과

mdtm, size 등의 추가적인 명령어에 대한 것을 포함한다.

mod_log

유닉스 형태의 메시지를 로그로 남기기 위한 인터페이스 제공

mod_ls

ftp list, nlst, stat 등의 명령을 포함

mod_site

Site, help, chmod 등의 명령을 포함

mod_unixpw

기본적인 유닉스 패스워드 시스템과의 인터페이스를 포함

mod_xfer

전송 명령(stor, retr, appe, rest, abor, type, stru, mode, allo, smnt, stou )을 포함

이 외에도 운영체제가 지원할 경우 자동적으로 포함되는 mod_pam 등이 있고, 추가적인 모듈은 proftpd-1.2.1/contrib. 디렉토리의 README 파일을 확인한다.

 

(4) 컴파일을 위한 설정

#./configure --prefix=/usr/local/proftpd --with-modules=mod_quota:mod_ratio

설치 디렉토리를 /usr/local/proftpd로 지정하고, 디렉토리별로 디스크 공간을 제한할 수 있는 mod_quota 모듈과, 업로드와 다운로드의 비율을 지정할 수 있는 mod_ratio 모듈을 사용할 수 있도록 Makefile을 구성한다.

 

(5) 컴파일

#make

#proftpd -l

컴파일이 모두 끝난 후 지정한 모듈이 모두 포함되어 있는지를 검사한다.

#make install

의도했던 모듈들이 정상적으로 포함되어 있다면 make install 명령을 내려 /usr/local/proftpd 디렉토링에 설치한다.

 

3] RPM 패키지를 이용한 설치

RPM 패키지를 이용한 설치는 소스를 이용한 설치에 비해 간단하지만 주의할 점이 있다. 먼저 –core- 파일을 설치해야 한다는 것이다.

[root @edu00 linux]#rpm -Uvh proftpd-core-*.i686.rpm

반드시 *core* 파일을 먼저 설치해야 한다.

[root @edu00 linuxl#rpm -Uvh proftpd-xinetd-*.i386.rpm

위의 ftp 데몬은 xinetd용으로 설치된다.

만약에 standalone 방식으로 설치하고자 한다면 다음과 같이 한다.

[root @edu00 linuxl#rpm -Uvh proftpd-standalone.*.i386.rpm

 

4) 실행 및 종료

설치 과정이 정상적으로 종료되면 /usr/local/proftpd 디렉토리로 이동해서 ls 명령을 실행한다. bin, etc, man, sbin, var 등의 디렉토리가 보일 것이다. bin 디렉토리에는 ftpcount, ftpwho 명령이 존재하고, etc 디렉토리에는 proftpd.conf라는 설정 파일이 존재한다. 그리고 실제 proftpd 명령은 sbin 디렉토리에 존재한다.

 

1] ProFTPD 기동

ftp 서버 데몬인 proftpd를 시작하기 위해서는 특별한 작업이 필요한 것은 아니다. 단순히 sbin 디렉토리에 있는 proftpd를 실행하면 된다.

#proftpd

만약 특정 메시지가 출력되면 데몬이 정상적으로 가동되지 않는 것이고, 아무런 메시지가 출력되지 않는다면 제대로 가동이 된것이다. 만약 실행이 되지 않고 오류가 발생하면 etc/proftpd.conf 파일의 내용을 수정하면 된다.

다음의 명령을 실행하여 데몬이 정상적으로 가동중인지 확인한다.

#ps –ef | grep ‘proftpd’

다음은 데몬의 옵션을 보기 위해 proftpd –h를 실행한 결과이다.  

[root @edu00 linux]#cd /usr/local/bin

[root @edu00 bin]#./proftpd -n

데몬을 백그라운드에서 실행시키지 않고 모든 출력을 화면으로 보내도록 한다.

 

[root @edu00 bin]#./proftpd -d [level]

디버그 레벨을 가동시키는 것으로, 0-5단계까지가 있으며, 5단계가 자세히 출력한다.

 

[root @edu00 bin]#./proftpd –c [config-file]

etc/proftpd.conf 파일 이외의 설정 파일을 지정한다.

 

[root @edu00 bin]#./proftpd –p [01]

영구적인 패스워드를 지원할지 않을지를 결정한다.

 

[root @edu00 bin]#./proftpd -l

컴파일되어 포함된 모듈들의 리스트를 출력한다.

 

[root @edu00 bin]#./proftpd -t

지정된 설정 파일의 구문을 검사한다.

 

[root @edu00 bin]#./proftpd –v

버젼 번호를 출력하고, 데몬은 가동시키지 않는다.

 

[root @edu00 bin]#./proftpd -vv

자세한 버전 번호와 기타 정보를 출력하고, 데몬은 가동되지 않는다.

 

2] 종료

ftp 데몬의 가동을 중단시키기 위해서는 단순히 ps 명령을 이용해서 proftpd PID(Process ID)를 안 후 kill 명령을 이용해도 되지만, 그렇게 되면 서비스를 받고 있는 사용자는 갑작스러운 서비스 중단에 당황할 수 있다. 그러한 이유로 제공되는 유틸리티가 sbin/ftpshut이다.

ftpshut 명령은 더 이상의 사용자가 접속하지 못하도록 막기도 하고, 이미 연결되어 사용중인 이용자들에게 메시지를 출력해서 사용자가 서비스 중단에 따른 준비를 할 수 있도록 여유를 준다.

 

다음은 ftp 서비를 중단하기 위한 하나의 예이다.

[root @edu00 linux]#ps -aux | grep proftpd

[root @edu00 linux]#kill -9 PID(proftpd)

 

ftpshut 명령의 사용법은 아래와 같다.

[root @edu00 linux]#/sbin/ftpshut [-l min] [-d min] time [warning-message]

ftpshut 명령은 ftp 서버가 종료할 때 superuser ftp 이용자에게 공지할 수 있는 기회를 제공한다.

time : 서버를 다운시킬 시간

now : 명령을 내리는 즉시 서버를 종료

+ n  : n분후에 서버를 종료

HHMM : 24시간 단위로 서버를 종료

-l   : 지정된 시간(min) 내에 접속하는 사용자를 차단

-d  : 현재 접속중인 사용자들에 대해 강제로 접속을 중단

     

다음은 ftpshut 명령의 사용예이다.

[root @edu00 linux]#ftpshut -l 20 +30

30분후 ftp 서버 종료, 종료 20분 전부터 사용자의 접근 차단, 사용자 접속시 메세지 출력하고 사용자와의 세션을 끊어버린다.

 

[root @edu00 linux]#ftpshut -d 10 +30

30분후 ftp 서버 종료, 서버 종료 10분전에는 연결된 모든 사용자와의 접속을 강제로 중단한다.

 

주의해야 할 것은 proftpd standalone 형태로 가동되어야 ftpshut 명령에 의해 셧다운된다는 것이다.

만약 inetd 방식으로 ftp 서버를 가동중이라면 아무런 소용이 없다.

ftpshut 명령을 내리면 /etc/shutmsg 파일이 생성되는데, 이 파일에는 ftp 데몬이 셧다운될 시간과

메시지가 기록되는데, 이 파일에 magic cookie값을 사용할 수있다. 또한 /etc/shutmsg 파일이 있으면

사용자가 ftp로 접속할 수 없는 상황이 발생한다. ftp 싸이트를 재개방하려면 /etc/shutmsg 파일을 삭제

해야 한다.

 

3] ftp commands

bin 디렉토리에는 ftpwho 명령과 ftpcount 명령이 존재한다. 파일 이름이 의미하듯이 ftpwho 명령의 경우에는 현재 ftp 서버에 연결된 각 사용자들의 정보를 출력해준다. 그리고 ftpcount 명령은 현재 ftp 서버에 접속 중인 사용자가 몇 명인지 출력한다.

 

5) 설정 파일들

1] 접근 금지 설정

/etc/proftpd/conf/ftpusers

RPM 패키지를 이용하여 설치할 경우 /etc/proftpd/ftpusers라는 파일로 존재하며 이 파일에는 일반 사용자 계정을 기록하는 것이 아니라 시스템 계정을 기록함으로써 시스템 사용상 필요한 계정들을 이용해 ftp로 접속하지 못하게 한다. 만약 ftp 접속을 허용하지 않을 사용자가 있다면 해당 사용자의 UID를 이 파일에 기록함으로써 사용자의 접근을 차단할 수 있다. ftp의 접속을 허락하는 파일이 아니라, 접속을  차단하기 위한 계정 목록을 저장하는 파일이다.

 

2]  proftpd 설정 파일

/etc/proftpd/conf/proftpd.conf

ServerName    "ProFTPD Default Installation"

ServerName 지시자는 클라이언트가 ftp 서버에 접속하였을 때 서버 버전 다음에 보여지는 서버의 이름 같은 문자열을 출력하기 위한 것이다. 서버의 이름은 다른 것으로 변경할 수 있지만 ftp 데몬의 이름과 버전 명은 변경할 수 없다.

 

ServerIdent     [off | on strings]

만약 데몬의 이름과 버전 번호가 출력되지 않게 하려면 ServerIdent 지시자를 사용한다. 옵션 값은 off로 주게 되면 데몬의 이름이나 버전 정보 없이 “hostname FTP server ready”라는 메시지만을 출력하게 되고, on과 함께 원하는 문자열을 추가하게 되면 “strings”만이 클라이언트에게 보여지게 된다.

 

ServerType               standalone

ServerType 지시자는 proftpd 데몬을 standalone으로 운영할 것인지 아니면 inetd의 도움을 받아서 운영할 것인지를 결정하는 것이다. standalone 방식은 항상 데몬으로 존재하며, 빠른 속도를 보이기 때문에 사용자의 접속이 많거나 자주 발생하는 곳에서는 빠르게 처리하는 반면에 시스템 자원을 차지한다. inetd 방식은 접속 요청이 있을 때만 프로세스가 실행되어서, 시스템의 자원을 효율적으로 운영할 수 있지만 반응 속도가 느릴 수도 있다.

 

DefaultServer             on

DefaultServer 지시자는 둘 이상의 ftp 서버를 한 시스템에서 가동하거나 가상 ftp 서버를 이용할 때 기본적으로 이용되는 것으로, 클라이언트가 접속해 올 때 포트의 지정이 없거나 특정 가상 호스트를 지정하지 않은 경우 현재의 서버 설정사항이 적용된 서버로 클라이언트의 요청을 처리하게 되며, 하나의 서버만이 지정될 수 있다.

 

Port                          21

Port 지시어는 ftp 서버가 standalone 방식으로 동작할 때 서비스할 포트 번호를 지정하는 것으로, FTP의 기본 포트는 21(/etc/services)이다. 만약 다른 임의의 포트(다른 프로그램에서 사용하고 있지 않는 포트)를 사용할 경우, 반드시 사용자에게 접근 포트의 번호를 알려주어야 한다. 그렇지 않으면 사용자는 접근을 할 수 없게 된다. 또한 inetd 방식으로 실행되는 ftp 서버에서는 Port 지시자는 아무런 의미가 없다. 또한 가상 ftp 사이트를 생성할 때에는 반드시  다른 포트 번호를 사용해야 한다.

 

Umask                      022

Umask 지시자는 파일이나 디렉토리가 새롭게 생성될 때 적용할 마스크 값을 지정한다. 만약 Umask proftpd.conf 파일내에 지정되지 않았다면 서버에서 지정된 값이 사용될 수 있다. Umask 022일 경우 디렉토리를 생성할 때 퍼미션은 755로 적용된다.

 

MaxInstances            30

MaxInstances 지시자는 standalone 모드로 동작중일 때 최대로 생성될 수 있는 proftpd의 자식 프로세스의 최대값을 설정하는 것으로, inetd 모드에서는 의미가 없으므로 주석처리 해준다. 하나의 proftpd는 한 명의 사용자 연결을 지원하기 때문에 동시 접속자 수를 제한하는 기능도 있다. 사용자 수가 초과될 경우에는 로그에 기록하고 사용자와의 접속을 차단하게 된다. 이 지시어의 장점으로는 계속되는 접속으로 인해 시스템 자원의 고갈을 막아 외부의 공격(Dos 공격)에 대한 방어 기능을 할 수 있다.

 

User                         nobody

Group                       nobody

User 지시다와 Group 지시자는 서버 데몬이 실행될 때 어떤 권한으로 작동할 것인지 사용자와 그룹의 소유권을 지정해주는 지시자이다. 일반적으로 둘 다 nobody로 설정된 사용자의 권한(/etc/passwd, /etc/group 참조)를 이용해서 실행하게 된다. 하지만 유닉스 계열의 데몬 중에는 슈퍼 유저의 권한을 요구하는 작업을 수행하기 위해 root 권한을 획득할 필요가 있다. root 권한을 획득한 후 작업을 완료하고, root의 권한을 넘겨주고, User 지시자와 Group 지시자에 지정된 UID GID를 이용해서 계속적으로 작업을 진행하게 된다. 그래서 해커의 공격 대상이 되기도 하는데, 되도록 권한이 적은 nobody로 설정하는 것이 좋다. 특히 소스를 컴파일하여 설치하면 Group의 기본값이 nogroup으로 설정되어 있는데, 에러가 나는 경우가 있으므로 반드시 nobody로 수정하여준다.

 

<Directory /*>

  AllowOverwrite       on

</Directory>

디렉토리별 접근 권한 지정을 하는 부분으로 <Directory /*> </Directory>로 둘러쌓여 있고, 그 내부에는 AllowOverwrite라는 지시자가 있어서 ftp 클라이언트가 자신의 홈 디렉토리 내에서 파일 덮어쓰기가 가능하다는 것을 의미한다. <Directory> 지시자는 지정된 디렉토리와 지정된 디렉토리의  하위 디렉토리에서만 특정 지시어를 적용시키기 위한 블록을 설정하는 부분으로, 속성의 상속이 이루어진다. 만약 <Limit>라는 지시자를 <Directory> 지시자 내에 사용한다면 그 기능을 제대로 발휘하지 못하게 된다. 위의 설정에서 windcard(*)를 사용했는데, 이는 해당 레벨의 모든 디렉토리와 그 하위 디렉토리에 대한 설정 내용을 적용할 때 사용하며, 특정 디렉토리를 지정하는 설정보다 우선적으로 적용된다. 항상 절대 경로를 사용해야 하며, 심볼릭 링크도 사용할 수 없다.

 

사용자별 설정

기본 설정 내용에는 포함되어 있지 않지만 사용자의 권한에 따른 접속 방법이 있다.

만약 시스템에 계정을 가진 사용자가 있고, 이 사용자가 외부에서 ftp로 접속하고자 할 경우 위에 제시한 설정 파일에는 이와 관련된 어떠한 지시자도 제공되지 않고 있기 때문에 시스템 계정으로 접속한 사용자는 루트 디렉토리(/)에서부터 권한이 있는 디렉토리는 어디든 이동할 수 있다. 뿐만 아니라 읽기 권한만 존재한다면 어떤 파일이라도 복사가 가능하다. 이렇게 각각의 사용자가 자신의 디렉토리를 벗어나 다른 디렉토리로 이용하는 것을 금지하고자 한다면 DefaultRoot라는 지시자를 사용한다. 이 지시자는 ftp로 로그인한 사용자들의 기본적인 홈 디렉토리를 지정하게 된다.

다음은 예이다.

DefaultRoot          /home/edu00          users,!staff

위의 설정은 edu00이라는 사용자만이 ftp를 통해서 로그인할 수 있다. 만약 다른 사용자가 로그인을 하게 되면 “421 Service not available, remote server has closed connection”이라는 메시지를 출력하고, 로그인을 막게 된다.

DefaultRoot          /                      users,!staff 

위의 설정은 어떤 사용자라도 로그인이 가능하며, 접속했을 때의 기본 디렉토리는 루트(/) 디렉토리가 된다.

DefaultRoot          ~                     users,!staff

가장 효용성이 있는 설정으로, 사용자의 홈 디렉토리를 나타내는 “~”를 이용하게 되면, 접속한 사용자의 홈 디렉토리 이하의 디렉토리만을 접근할 수 있게 된다. , 접속자의 홈 디렉토리 밖으로 벗어날 수 없다.

위의 설정에서 로그인 디렉토리를 지정하는 항목 옆의 항목은 그룹에 대한 저정을 하는 것으로, users라는 그룹에 포함된 사용자만이 DefaultRoot 디렉토리로 지정된 곳이 자신의 홈 디렉토리로 적용이 되고, staff 그룹에 포함된 사용자의 경우에는 자신의 홈 디렉토리 이외의 곳으로 이동이 가능하다.

만약 위의 설정 중 DefaultRoot   /home/edu00  users,!staff라는 설정을 보게 되면, users 그룹에 포함된 사용자 edu00 ftp로 접속하게 되면, 자신의 홈 디렉토리인 /home/edu00을 벗어나서 다른 곳으로 이동을 할 수 없지만, staff에 속한 nana 사용자는 자신의 홈 디렉토리인 /home/nana를 벗어나 /usr/bin 디렉토리로도 이동이 가능하다.

 

Root 사용자의 접속

일반적으로 proftpd root의 로그인을 허락하지 않는다. ftp 클라이언트가 적법한(정확한 패스워드를 가지고 있는 사용자) 사용자라도 로그인을 하지 못하고, 또한 syslog에게 특별한 보안 메시지를 전송하도록 하고 있다. 하지만 root 사용자도 ftp를 통해 접근할 수 있도록 하기 위해서는 RootLogin 지시자를 이용하면 된다. , “RootLogin  on”이라고 설정하면 접속을 할 수 있다. 물론 이 경우에도 syslog에는 보안과 관련된 메시지가 남는다.

 

<Anonymous ~ftp>

proftpd.conf 파일내에서 익명 ftp 서비스를 하려면 <Anonymous ~ftp> </Anonymous> 사이에 모든 지시어가 포함되게 된다. 익명 접속을 설정하는 부분으로 “~”는 홈 디렉토리를 뜻하는데 /etc/passwd 파일에 /var/ftp 로 설정되어 있다.

 

User                         ftp

Group                       ftp

익명 접속자의 권한을 제어하기 위해서 User Group이라는 지시어를 사용하며, 일반적으로 시스템에 ftp라는 UID GID를 만들어서 이를 대응시킨는 경우가 많다.

 

UserAlias                  anonymous ftp

익명 접속을 할 때 대부분 anonymous라는 접속 ID를 사용하게 되는데, ID를 시스템에 저장된 ftp 사용자와 일치를 시켜야 한다. 그렇기 때문에, UserAlias 지시어를 이용해 ftp의 별명을 anonymous로 지어준다.

 

MaxClients      10      "죄송합니다. 동시 접속자 수는 %m 명입니다."

MaxClients 지시어는 시스템에 동시에 접속할 수 있는 최대 접속자수를 지정하는 것으로, 위의 설정에서는 10명이 동시에 접속해서 사용할 수 있도록 지정하고 있다. 이 경우 %m 대신에 10이라는 숫자가 들어가고, 11번째 사용자에게 메시지가 출력된다. 만약 제한을 없애려면 none로 설정한다.

 

MaxClientsPerHost     2

MaxClientsPerHost 지시어는 하나의 호스트에서 동시에 접속할 수 있는 수를 지정하는 것으로 사용법은 MaxClients와 유사하다.

 

DisplayLogin              welcome.msg

특정 사이트에 접속해보면 초기 화면에 인사말이 출력되는 경우가 있는데, 주로 로그인할 때 보여지는 메시지를 설정하는 welcome.msg 파일이 있다. 이 파일의 위치를 정확하게 지정해야 한다. 만약 “DefaultRoot ~”로 지정해다면 각 사용자의 홈 디렉토리에 자신만의 메시지를 저장해 두는 것이 좋다. 물론 사용자의 인사말(welcome.msg)이 보여지려면 DisplayLogin 지시어가 welcome.msg 값으로 설정되어 있어야 한다.

 

DisplayFirstChdir       .message

각각의 디렉토리로 이동할 때마다 접속자에게 해당 디렉토리는 어떤 내용의 파일들을 가지고 있는지에 대한 메시지를 출력할 때 설정한다. 메시지 파일들은 Magic Cookie 를 사용할 수 있다.

 

<Limit WRITE>

    DenyAll

</Limit>

만약 이 지시자가 설정되어 있으면 모든 사용자 계정의 쓰기를 할 수 없도록 지정된 경우이다.

<Limit> 블록은 주어진 문맥에 따라 하나 혹은 그 이상의FTP 명령어의 사용에 제한을 가한다. 특히 <Limit> 블록은 이후의 설정에 계속 영향을 미치는 부분이므로 가능하면 파일의 마지막 부분에 위치 시키는 것이 좋다. 다음은 제한을 가하는 명령어들이다. WRITE, READ, LOGIN, CWD(Change Work Directory), MKD(MaKe Directory), RNFR(ReName FRom), RNTO(ReName TO), RMD(ReMove Directory), RETR(RETRieve), STOR(STORe)

다음은 사용 예들이다.

<Limit LOGIN>

    DenyAll

<Limit>

위의 설정은 익명 접속을 못하도록 막는데 사용하는 설정으로, 시스템에 사용자 계정을 가진 사용자만이 접속을 할 수 있다.

만약 특정 IP 주소의 접속을 막고자 한다면 다음과 같이 한다.

<Limit LOGIN>

    Order deny, allow

    Deny from 192.168.10., 211.170.43.100, deny.com

    Allow from all

<Limit>

위의 설정은 먼저 제한을 하고, 다음에 허락하는 순서로 접속을 제어하고, 제한하는 IP 주소는 192.168.10 주소를 갖는 네트워크 그룹, 211.170.43.100, deny.com 도메인 이름을 가진 사이트로부터의 접근만을 차단한다.

 

RequireValidShell       off

<Limit LOGIN> 지시어로 접속을 차단할 수 있는 것은 아니다. RequireValidShell이라는 지시어를 이용할 수 있는데, 주로 anonymous 사용자가 ftp로 접근하여 쉘(shell)의 권한을 획득하는 것을 막는데 사용한다. 이 값은 반드시 off로 해두는 것이 좋다. 이 지시어가 지정되어 있지 않거나 지시어의 값이 on으로 지정된 경우에도 익명 사용자는 접속을 할 수 없게 된다.

 

RateReadBPS

RateReadFreeBytes

RateReadHardBPS

접속한 사용자의 대역폭(bandwidth)을 특정 속도 이하로 제한하여, 모든 사용자에게 공평하게 자원을 허용하고 싶은 경우에 위의 지시어를 사용한다. , 사이트에 접속해서 데이터를 읽어가는 최대 속도를 제한해 둠으로써 특정 사용자가 높은 대역폭을 차지하는 대신 어떤 사용자는 낮은 대역폭을 차지하는 불공평한 처사가 발생하지 않도록 지정할 수 있다.

 

TimeoutIdle

TimeoutNoTransfer

TimeoutLogin

특정 시간동안 아무런 동작을 하지 않을 경우 사용자의 접속 세션을 종료하는 기능을 수행한다. 만약 ftp 클라이언트가 접속 이후 30초 동안 아무런 명령을 내리지 않을 경우 강제적으로 세션을 종료하고 싶다면 “TimeoutIdle 30”으로 값을 지정하면 된다. 만약 세 지시자의 값을 “0”으로 지정하게 되면 사용자의 세션을 강제적으로 종료하지 않고 계속 유지하게 된다.

 

6) 가상 FTP 서버

한 시스템에 둘 이상의 ftp 사이트를 개설하고 싶은 경우가 있다. 예를 들어 ftp.edu00.net이라는 ftp 사이트가 222.222.222.222라는 IP 주소를 갖는 시스템에서 서비스되고 있다. 여기에 pds.edu00.net이라는 또다른 ftp 사이트를 동일한 시스템(222.222.222.222 IP 주소를 갖는 시스템)에 개설한다고 가정을 하면, 물론 시스템에 NIC(Network Interface Card)를 하나 더 장착하고 새로운 IP 주소를 부여하면 문제가 없겠지만 NIC IP 주소의 여유가 없다면 가상 ftp 사이트를 운영하는 수 밖에 없다.

가상 ftp 사이트를 만들기 위해서는 <VirtualHost>라는 지시자를 사용한다.

<VirtualHost 222.222.222.222>

    Port 10000

    DefaultRoot    ~    !staff

</VirtualHost>

위의 설정은 222.222.222.222라는 IP 주소를 갖는 시스템에 또 하나의 ftp 사이트(가상 사이트)를 개설하는 내용이다. , 이 가상 사이트에 할당된 포트는 10000번이다. 외부의 사용자에게 pds.edu00.net ftp 주소를 알려줄 땐 단순히 URL만 알려주어서는 안된다. 포트 번호까지 알려주어야 한다.

<VirtualHost> 지시자내의 설정들은 외부에서 설정한 다양한 지시어들이 그대로 사용이 가능하다.

그리고 주의해야 할 것이 있다. 아파치와 마찬가지로 접속하는 사용자의 수가 많아지면 접속자가 파일을 읽고 쓰는 것 뿐만 아니라 에러의 로그 및 접속 로그를 기록하기 위한 파일 기술자(File Descriptor)의 수가 증가한다는 것이다. 파일 기술자의 수에 제한을 두지 않는다면 접속자의 수가 적음에도 사용자가 접속을 하지 못하는 경우가 발생한다. 이런 경우가 발생하면 tcpBackLog 지시어를 이용해 사용자의 접속을 제어할 수 있다.

 

3. PureFTP

1) 소개

Pure-FTPd Troll-FTPd를 기반으로 만들어 졌으며, 고급 작업이 가능한, 빠르고 표준에 일치하는 FTP 서버이다. 다른 유명한 FTP 서버 프로그램들과 다른 점은 기본 설정에 보안이 디자인 되어 있고, 알려진 버퍼 오버플로우가 없으며, 현재 커널에 맞게 설정할 수 있다는 점이다.

또한 Pure-FTPd Linux, FreeBSD, NetBSD, OpenBSD, Solaris, Tru64에 성공적으로 포팅되었다. Pure-FTPd PAM 인증 지원과 IPv6를 완벽히 지원하고, chroot() 홈디렉토리, 가상 도메인, 내장 'ls' 명령, 안티-와레즈 시스템, FXP 프로토콜, 전송 대역폭 설정, 레티오, LDAP, XML HTML 타입의 보고서, 아파치 타입의 로그파일 등을 지원한다.

Pure-FTPd의 홈페이지는 http://pureftpd.sourceforge.net/이다.

 

2) Pure-FTPd 설치하기

1] 패키지 설치

통의 리눅스 배포판에는 Wu-FTPd ProFTPd가 설치되어 있다. Pure-FTPd를 사용하기 위하여

기존의 FTP 서버를 삭제하고 Pure-FTPd 를 설치한다. 물론 이 경우에 반드시 기존 FTP 서버를 삭제할 필요는 없다.

#rpm qa | grep proftpd

#rpm e proftpd

#rpm Uvh pure-ftpd-0.99a.i386.rpm

 

설치된 패키지는 /usr/local/sbin에 위치하게 된다. /usr/bin이나 /usr/sbin에 설치하고 싶으면 해당 홈페이지에서 src.rpm 패키지를 받아서 spec 파일을 수정한 후 리빌드하여 설치하면 된다.

 

2] 소스로 설치

#tar xvzf pure-ftpd-0.99a.tar.gz

#cd pure-ftpd-0.99a

#./configure

#make

#make install

컴파일이 성공적으로 끝나면 실행파일들은 /usr/local/sbin에 설치된다. 

그리고 RPM 패키지로 설치한 Pure-FTPd 서버의 실행파일은 아래의 옵션을 포함하여 컴파일된다. 만약 소스로 컴파일하고자 하는 사용자들은 다음의 옵션을 참고로 설치를 진행하면 된다.

#./configure prefix=/usr/local

--with-ftpwho : 유저관리를 위한 'pure-ftpwho' 명령을 지원하도록 한다. 만약 이 옵션을 지원하도록 하면 약간의 메모리를 더 필요로 한다.

--with-throttling : 전송 대역폭 설정을 지원하도록 한다.
--with-ratios :
업로드/다운로드 레티오 설정을 지원하도록 한다.
--with-uploadscript : 0.98
부터 Pure-FTPd가 지원하는 기능으로의 업로드를 편리하게 한다.
--without-capabilities
--with-cookie
--with-paranoidmsg
--with-altlog
--with-virtualhosts

 

3) Pure-FTPd 실행하기

1] standalone 모드로 실행하기

#/usr/local/sbin/pure-ftpd &

 

2] xinetd 슈퍼 데몬으로 실행하기

/etc/xinetd.d 디렉토리 아래에 pure-ftpd라는 이름의 파일을 작성한다.

#vi /etc/xinetd.d/pure-ftpd

servce ftp

{

socket_type  = stream

server = /usr/local/sbin/pure-ftpd
protocol = tcp
user = no
wait = no
disable = no
}

그 후, xinetd 슈퍼 데몬을 재시작하면 된다.

#/etc/rc.d/init.d/xinetd restart

혹은

#killall USR2 xinetd

 

지금까지의 과정이 FTP 서버를 실행하기 위한 기본 환경 설정이다.

다음은 ftp 프로그램으로 서버에 접속해본다.

#ftp edu

만약 설정이 올바르다면 ftp에 접속한 화면이 출력될 것이다.

 

4) 환경 설정 옵션

Pure-FTPd는 다른 FTP 서버 프로그램들과는 달리 명령행 옵션으로 환경을 설정한다.

-A : 모든 유저에게 chroot()를 적용한다.

-c : 서버에 접속할 수 있는 클라이언트(유저)를 지정한 수만큼 제한한다. 기본값은 42이다.

-C : 같은 IP에서 접속할 수 있는 호스트의 수를 제한한다.

-e : 서버에 오직 anonymous 유저만이 접속할 수 있다. 계정 사용자라도 anonymous로 로그인된다.

-E : 인증된 유저만이 서버에 접속이 가능하다. Anonymous 유저는 로그인을 허용하지 않는다.

-i : anonymous 유저가 업로드하는 것을 허용하지 않는다.

-I : 최대 동작 반응시간을 설정한다. 지정한 시간 만큼 동작을 하지 않으면 접속을 종료시킨다.

단위는 분단위이다.

-k : 업로드를 할 때 파티션 용량이 지정한 만큼 차있으면 업로드를 허용하지 않는다.

-M : anonymous 유저가 디렉토리를 생성할 수 있도록 한다.

 

1] standalone 모드로 실행할 때

만약 standalone 모드로 실행을 할때는 다음과 같이 설정한다.

 

#/usr/local/sbin/pure-ftpd s a 42 A &

와 같이 서버 실행 명령 뒤에 옵션을 추가하여 사용한다.

 

2] xinetd 모드로 실행할 때

다음과 같이 server_args 변수를 두어 옵션을 사용한다.

service ftp
{
socket_type = stream
server = /usr/local/sbin/pure-ftpd
server_args = -s -a 42 -A
protocol = tcp
user = no
wait = no
disable = no
}

 

5) Pure-FTPd Anonymous 서버 운영

먼저, anonymous 유저 접속을 위한 ftp 계정을 만든다. 그리고 telnet 접속을 허용하지 않기 위해 /etc/passwd 파일을 다음과 같이 수정한다.

#adduser ftp

#passwd ftp

#cat /etc/passwd

.

ftp:*:501:501::/home/ftp:/dev/null

그리고 e 옵션을 주면 anonymous 서버로만 동작을 하게 되는데, 다음과 같이 옵션을 주어서 Pure-FTPd를 실행한다.

#/usr/local/sbin/pure-ftpd A c 5 C 1 e M k 95 I 3

 

6) chroot() 설정

FTP 기본 루트 디렉토리는 시스템 루트(/) 디렉토리로 설정되어 있다. 따라서 일반 계정 사용자가 접속하여 루트 디렉토리까지 접근할 수 있으므로 보안상 좋지않다. 일반 계정 사용자 홈 디렉토리를 기본 루트 디렉토리로 하고자 한다면 옵션에 A 옵션을 추가하면 된다.

 

7

7) FTP 유저 정보보기, pure-ftpwho

이 명령은 with-ftpwho 옵션을 주고 컴파일했을 때만 동작하며, 현재 pure-FTPd 서버에 접속한 ftp 유저들의 프로세스 정보를 보여준다. 텍스트 형식으로 볼 수도 있으며, HTML 방식으로 작성하여 출력할 수도 있다.

서버에 접속한 특정 유저의 접속을 끊으려고 한다면 kill 명령으로 유저의 PID를 종료시키면 된다.
아래 화면에서는 kill 1985  명령으로 접속한 junilove 유저의 접속이 강제로 끊기게 됩니다.

[root @edu00 sbin]#./pure-ftpwho 

728x90
반응형

'IT > 리눅스마스터1급' 카테고리의 다른 글

web서버  (0) 2018.02.13
메일 서비스  (0) 2018.02.13
NFS란  (0) 2018.02.11
삼바  (0) 2018.02.02
DHCP  (0) 2018.02.01