proftpd에서 TLS 통신 및 GeoIP 설정하기

5 분 소요

proftpd에서 TLS 통신 및 GeoIP 설정하기

O/S : CentOS 7.x / 64bit  / ProFTPD 버전 : proftpd-1.3.5e 참고1 : https://xinet.kr/?p=2035
참고2 : http://www.proftpd.org/docs/contrib/mod_geoip.html

1. 설치

yum -y install epel-release
yum -y install proftpd


2. conf 파일 수정

mv /etc/proftpd.conf /etc/proftpd.conf.ori
vi /etc/proftpd.conf


conf 파일의 경우, 각 주석 확인하여 설정

#ftp 데몬이 파일 및 디렉토리에 쓸 수 있습니다.
# setsebool -P allow_ftpd_anon_write=1
 
#ftp 데몬이 시스템의 모든 파일을 읽고 쓸 수 있습니다.
# setsebool -P allow_ftpd_full_access=1
 
#ftp 데몬이 CIFS 마운트 된 파일을 읽고 쓸 수 있습니다.
# setsebool -P allow_ftpd_use_cifs=1
 
#ftp 데몬이 NFS 마운트 된 파일을 읽고 쓸 수 있습니다.
# setsebool -P allow_ftpd_use_nfs=1
 
# ftp 데몬이 사용자의 home에서  파일을 읽고 쓸 수 있습니다.
# setsebool -P ftp_home_dir=1
 
# Fedora 16 / RHEL-7부터 사용할 수 있으며 Linux 이외의 시스템에서 액티브 모드 ftp 전송이 안정적으로 작동
# setsebool -P ftpd_connect_all_unreserved=1
 
# ftp 데몬이 일반적으로 사용되는 데이터베이스에 연결
# setsebool -P ftpd_connect_db=1
 
#Fedora 릴리스 4에서 6 및 Red Hat에서만 사용할 수 있습니다.
#Enterprise Linux 5. ProFTPD가 독립형으로 실행되는 경우 설정해야합니다
# setsebool -P ftpd_is_daemon=1
# setsebool -P ftpd_disable_trans=1
#TraceLog			/var/log/proftpd/trace.log
#Trace				DEFAULT:0
 
ServerName "ProFTPD server"
ServerIdent on "FTP Server ready."
DefaultServer on
 
# Proftpd 기본 포트번호를 지정해 준다.
Port                            21
 
# PassivePort범위를 지정한다.
PassivePorts                    40100 40200
 
# adm 사용자만 상위디렉토리 이동가능 / 일반 유저는 보안상 홈디렉토리 상위 접속불가
DefaultRoot ~ !adm
 
# Use pam to authenticate (default) and be authoritative
AuthPAMConfig proftpd
AuthOrder mod_auth_pam.c* mod_auth_unix.c
 
#NIS / YP / LDAP를 사용하는 경우 PersistentPasswd를 비활성화
#PersistentPasswd		off
 
#DNS 역방향 조회를 수행
UseReverseDNS off
 
#서버가 실행되는 사용자 및 그룹 설정
User root
Group root
 
# 자식 프로세스 최대 갯수
MaxInstances 20
 
#다운로드 속도 표시가 끊어 지므로 기본적으로 sendfile을 사용 중지
UseSendfile off
 
# Define the log formats
LogFormat default "%h %l %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
 
### 타임아웃설정
# TimeoutIdle 지시자는 조정 또는 data connection에 해당하는 어떤 data를 받지 않고선 접속을 유지할수 있는 최대 시간을 초단위로 지정을 한다.
# 접속상태에서 data를 전송받으면, idle timer는 초기화가 된다. TimeoutIdle을 "0"으로 지정하면 idle timer는 무한대의 값을 갖는다.
# (즉 date의 전송없이 무한히 접속이 가능하다.)
# 이것은 일반적으로 원격 user가 정확히 접속을 끊었음에도 불구하고
# child server가 수동으로 process를 죽이기 전까지 살아있을수 있기 때문에 별로 좋은 설정 방법은 아니다.
TimeoutIdle                                     900
 
# TimeoutNoTransfer 지시자는 인증후에 활성화 되어 있거나 수동적인 data 접속을 생성하는 명령어가 없이
# 접속을 유지할 수 있는 최대 시간을 초단위로 설정을 한다.(예를 들어 파일을 보내고 받거나 또는 directory list를 받는 경우)
TimeoutNoTransfer                               900
 
# TimeoutLogin 지시자는 client가 인증을 유지할수 있는 시간을 초단위로 지정을 한다.
# login 시간은 clinet가 data를 전송한다고 해서 reset이 되지는 않으며,
# 오직 USER/PASS 명령을 사용하며 승인을 재전송할 경우에만 reset이 된다.
TimeoutLogin                                    300
 
# TimeoutStalled 지시자는 proftpd server와 연결은 되어 있지만 실제로 data 전송이 지연되고 있는 상태에서
# Server와 FTP client사이의 data connection이 유지될수있는 최대 시간을 초단위로 설정을 한다.
# seconds 인자를 0으로 지정하면, data 전송은 무한정 지연을 하고 있는 것을 허락한다.(기본 설정이다)
TimeoutStalled                                  300
 
 
# Dynamic Shared Object (DSO) loading
#   LoadModule mod_sql.c
#   LoadModule mod_sql_passwd.c
#   LoadModule mod_sql_mysql.c
#   LoadModule mod_sql_postgres.c
#   LoadModule mod_sql_sqlite.c
#   LoadModule mod_quotatab.c
#   LoadModule mod_quotatab_file.c
#   LoadModule mod_quotatab_sql.c
#   LoadModule mod_ldap.c
#   LoadModule mod_quotatab_ldap.c
#   LoadModule mod_radius.c
#   LoadModule mod_quotatab_radius.c
#   LoadModule mod_copy.c
#LoadModule mod_ctrls_admin.c
#   LoadModule mod_deflate.c
#   LoadModule mod_exec.c
#   LoadModule mod_facl.c
# http://www.castaglia.org/proftpd/modules/mod_geoip.html
   LoadModule mod_geoip.c
#   LoadModule mod_ifversion.c
#   LoadModule mod_load.c
#   LoadModule mod_ratio.c
#   LoadModule mod_rewrite.c
    LoadModule mod_sftp.c
#   LoadModule mod_sftp_pam.c
#   LoadModule mod_sftp_sql.c
#   LoadModule mod_shaper.c
#   LoadModule mod_site_misc.c
   LoadModule mod_tls_shmcache.c
   LoadModule mod_tls_memcache.c
#   LoadModule mod_wrap.c
#   LoadModule mod_wrap2.c
#   LoadModule mod_wrap2_file.c
#   LoadModule mod_wrap2_sql.c
#LoadModule mod_vroot.c
#   LoadModule mod_ifsession.c
#ModuleControlsACLs		insmod,rmmod allow user root
#ModuleControlsACLs		lsmod allow user *
# Enable basic controls via ftpdctl
# http://www.proftpd.org/docs/modules/mod_ctrls.html
ControlsEngine on
ControlsACLs all allow user root
ControlsSocketACL allow user *
ControlsLog /var/log/proftpd/controls.log
 
<IfModule mod_ctrls_admin.c>
  AdminControlsEngine on
  AdminControlsACLs all allow user root
</IfModule>
 
<IfModule mod_vroot.c>
  VRootEngine on
</IfModule>
 
# OPENSSL 인증서 생성
# openssl req -x509 -newkey rsa:2048 -keyout /etc/pki/tls/certs/proftpd.key -out  /etc/pki/tls/certs/proftpd.cert -nodes
# TLS http://www.castaglia.org/proftpd/modules/mod_tls.html
  TLSEngine on
  TLSProtocol TLSv1 TLSv1.1 TLSv1.2
  TLSRequired off
  TLSRSACertificateFile /etc/pki/tls/certs/proftpd.cert
  TLSRSACertificateKeyFile /etc/pki/tls/certs/proftpd.key
  #CA the server trusts
  #TLSCACertificateFile 	/usr/local/apache/conf/ssl/DigiCertRoot2.crt.cer
  TLSCipherSuite ALL:!ADH:!DES
  #TLSOptions			NoCertRequest
  TLSOptions NoSessionReuseRequired
  TLSVerifyClient off
  #TLSRenegotiate		ctrl 3600 data 512000 required off timeout 300
  TLSLog /var/log/proftpd/tls.log
 
#  <IfModule mod_tls_shmcache.c>
#    TLSSessionCache		shm:/file=/var/run/proftpd/sesscache
#  </IfModule>
#</IfDefine>
 
 
#<IfDefine DYNAMIC_BAN_LISTS>
#  LoadModule			mod_ban.c
#  BanEngine			on
#  BanLog			/var/log/proftpd/ban.log
#  BanTable			/var/run/proftpd/ban.tab
#  BanOnEvent			MaxLoginAttempts 2/00:10:00 01:00:00
#  BanMessage			"Host %a has been banned"
#  BanControlsACLs		all allow user ftpadm
#</IfDefine>
 
# QOS
#<IfDefine QOS>
#  LoadModule			mod_qos.c
#  # RFC791 TOS parameter compatibility
#  QoSOptions			dataqos throughput ctrlqos lowdelay
#  # For a DSCP environment (may require tweaking)
#  #QoSOptions			dataqos CS2 ctrlqos AF41
#</IfDefine>
 
 
<Global>
  Umask 022

  ### 인코딩
  UseEncoding on
 
  # Client에서 한글이 깨질경우 서버 언어셋과 동일하게 변경하여 준다.
  # 로컬에서 사용하고 클라이언트를 처리하기 위한 문자 세트.
  # UseEncoding		      서버 클라이언트
  # UseEncoding                   euckr cp949
  UseEncoding                 utf8 cp949
 
  # Server의 ftpd시간을 지역시간으로 고정한다.
  # on으로 했을 경우 GMT를 사용하게 되며, 한국과 9시간의 차이가 난다.
  TimesGMT                      off
  #SetEnv                       TZ "Asia/Seoul"
  # 지역시간을 존으로 지정하기 보다는 서버설정에 따른다.
  SetEnv                        TZ :/etc/localtime

# 파일 업로드시 overwrite를 가능하게 한다.
  AllowOverwrite yes
  <Limit ALL SITE_CHMOD>
    AllowAll
  </Limit>
</Global>
 
 
### GEOIP 사용시 아래주석해제
#GeoIPEngine on
#GeoIPLog /var/log/geoip.log
#GeoIPTable /usr/share/GeoIP/GeoIPCity-initial.dat IndexCache
### KR만 접속가능
#GeoIPAllowFilter CountryCode KR
### CN 접속차단
#GeoIPDenyFilter CountryCode CN



3. tls 설정

 TLSEngine on
  TLSProtocol TLSv1 TLSv1.1 TLSv1.2
  TLSRequired off
  TLSRSACertificateFile /etc/pki/tls/certs/proftpd.cert
  TLSRSACertificateKeyFile /etc/pki/tls/certs/proftpd.key
  #CA the server trusts
  #TLSCACertificateFile 	/usr/local/apache/conf/ssl/DigiCertRoot2.crt.cer
  TLSCipherSuite ALL:!ADH:!DES
  #TLSOptions			NoCertRequest
  TLSOptions NoSessionReuseRequired
  TLSVerifyClient off
  #TLSRenegotiate		ctrl 3600 data 512000 required off timeout 300
  TLSLog /var/log/proftpd/tls.log

/etc/proftpd.conf 파일 내 TLS 설정 부분이며, 인증서의 경우 자체인증서 발급하여 테스트하거나, 해당 웹의 SSL 인증서 경로 입력하여 사용 가능


4. geoip 설정

wget https://xinet.kr/data/geoip/GeoIPCity.dat
mv GeoIPCity.dat /usr/share/GeoIP/GeoIPCity-initial.dat
### GEOIP
GeoIPEngine on
GeoIPLog /var/log/geoip.log
GeoIPTable /usr/share/GeoIP/GeoIPCity-initial.dat IndexCache

### GeoIPAllowFilter 에 지정된 값 외에 전부 차단 ###
GeoIPPolicy deny,allow

### KR만 접속가능
GeoIPAllowFilter CountryCode KR
### CN 접속차단
#GeoIPDenyFilter CountryCode CN

geoip 설정 부분은, https://xinet.kr/?p=2035  링크와 같이 설정 시, 룰이 먹히지 않아 (사설 IP로 인해 geoip 데이터베이스에 포함되지 않은 IP) 관련 문서 확인 시, 아래 설정으로 인해 적용되지 않은 것으로 아래 GeoIPPolicy  룰 추가해야 정상적으로 동작합니다. ( allow,deny 값이 디폴트 )

GeoIPPolicy 

Syntax: GeoIPPolicy “allow\,deny”|“deny\,allow” allow,deny (default) : 연결 클라이언트가 GeoIPDenyFilter 규칙에 의해 거부되지 않는 한 연결을 허용한다. deny, allow : 연결 클라이언트가 구성된 GeoIPAllowFilter 규칙과 일치하지 않는 한 mod_geoip 모듈은 모든 연결을 거부한다.


아래는 GeoIPTable flags 관련 설명입니다.

GeoIPTable

Syntax: GeoIPTable path [flags]

Standard 파일 시스템에서 데이터베이스 읽기, 메모리는 가장 적게 사용하지만 각 연결에 대해 데이터베이스를 읽게 한다.

MemoryCache 데이터베이스를 메모리에 로드, 성능은 더 빠르지만 가장 많은 메모리를 사용한다. MemoryCache로 구성된 테이블은 상위 프로세스 메모리에 로드되므로 각 연결에 대해 읽을 필요가 없다.

IndexCache 데이터베이스에서 가장 자주 액세스하는 인덱스 부분만 메모리에 로드, 표준보다 검색 속도가 빠르지만 메모리 캐시보다 메모리 사용량이 적다. GeoIP-Organization 및 GeoIP-City 와 같은 큰 데이터베이스에 유용할 수 있다.

MMapCache 데이터베이스를 mmap 공유 메모리에 로드한다.

UTF8 GeoIP 라이브러리에게 이 데이터베이스 파일에서 얻은 데이터에 대한 UTF8 문자열을 반환하도록 지시. 기본적으로 GeoIP 라이브러리는 ISO-8859-1로 인코딩된 문자열을 사용한다.

댓글남기기