proftpd에서 TLS 통신 및 GeoIP 설정하기
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로 인코딩된 문자열을 사용한다.
댓글남기기