ProFTPD 설치 및 설정 TLS 통신 및 GeoIP를 이용한 국가 차단 설정
O/S : CentOS 7.x / 64bit / ProFTPD 버전 : proftpd-1.3.5e
1. 설치
1 |
[root@localhost ~]# yum -y install proftpd |
2. 환경설정 config 백업 및 신규 conf 파일 생성
1 2 3 |
[root@xinet ~]# mv /etc/proftpd.conf /etc/proftpd.conf.ori [root@xinet ~]# vi /etc/proftpd.conf |
proftpd.conf 내용
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 |
#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 |
자체 인증서를 만들어서 TLS 통신을 되게 구성해준다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[root@xinet ~]# openssl req -x509 -newkey rsa:2048 -keyout /etc/pki/tls/certs/proftpd.key -out /etc/pki/tls/certs/proftpd.cert -nodes Generating a 2048 bit RSA private key ..............+++ .........................+++ writing new private key to '/etc/pki/tls/certs/proftpd.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:KR State or Province Name (full name) []:Gyeonggi-do Locality Name (eg, city) [Default City]:Gwangmyeong-si Organization Name (eg, company) [Default Company Ltd]:xinet Organizational Unit Name (eg, section) []:SE Common Name (eg, your name or your server's hostname) []:xinet.kr Email Address []: [root@xinet ~]# ls -l /etc/pki/tls/certs/proftpd.* -rw-r--r-- 1 root root 1334 4¿ù 10 15:18 /etc/pki/tls/certs/proftpd.cert -rw-r--r-- 1 root root 1704 4¿ù 10 15:18 /etc/pki/tls/certs/proftpd.key |
만약 웹서버 인증서를 이용해서 TLS 통신을 구성한다면 proftpd.conf 에서 웹서버 인증서 경로를 지정해주면 된다
1 2 3 4 5 6 7 8 9 10 11 12 |
# TLS (http://www.castaglia.org/proftpd/modules/mod_tls.html) TLSEngine on TLSProtocol TLSv1 TLSv1.1 TLSv1.2 TLSRequired off TLSRSACertificateFile /usr/local/apache/conf/ssl/xinet.kr.crt TLSRSACertificateKeyFile /usr/local/apache/conf/ssl/xinet.kr.key 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 |
ProFTP 1.3.3 부터는 보안상 SSL 세션을 재사용한다 하지만 Client ftp 프로그램( curl,filezilla)는 세션을 재사용하지 않기 때문에 TLSOptions NoSessionReuseRequired 옵션을 줘야한다.
3. 서비스 시작 및 중지
1 2 3 4 5 6 |
[root@xinet ~]# systemctl start proftpd [root@xinet ~]# systemctl stop proftpd ##시작서비스에 등록 [root@xinet ~]# systemctl enable proftpd |
4. 시스템 로그상태 (일반접속)
여기 로그에서 _ i 는 업로드 / _ o 는 다운로드를 뜻한다
5. TLS 접속
TLS1.2 로 접속된것을 확인 할 수 있다
FTP log를 통해서도 TLS 통신 (FTPS)로 되는것을 확인 할 수 있다
GeoIP를 통하여 접속 차단 및 설정
1 2 3 4 5 6 7 8 |
### GEOIP GeoIPEngine on GeoIPLog /var/log/geoip.log GeoIPTable /usr/share/GeoIP/GeoIPCity-initial.dat IndexCache ### KR만 접속가능 GeoIPAllowFilter CountryCode KR ### CN 접속차단 #GeoIPDenyFilter CountryCode CN |
이렇게 구성하는 경우 한국만 접속을 하게 설정할 수 있다 로그를 보면
1 2 3 4 5 |
2019-04-10 12:08:51,541 mod_geoip/0.7[32225]: CountryCode filter value 'KR' matched GeoIPAllowFilter pattern 'KR' 2019-04-10 12:09:07,744 mod_geoip/0.7[32227]: CountryCode filter value 'KR' matched GeoIPAllowFilter pattern 'KR' 2019-04-10 12:09:53,653 mod_geoip/0.7[32227]: CountryCode filter value 'KR' matched GeoIPAllowFilter pattern 'KR' 2019-04-10 12:10:01,773 mod_geoip/0.7[445]: CountryCode filter value 'KR' matched GeoIPAllowFilter pattern 'KR' 2019-04-10 12:10:01,831 mod_geoip/0.7[445]: CountryCode filter value 'KR' matched GeoIPAllowFilter pattern 'KR' |