반응형

설명

ProFTPD에서 "SFTP 모듈" + "ftpasswd로 생성한 사용자 계정"으로 SFTP 서비스를 구현하는데 필요한 설정을 살펴보겠습니다. 접속환경은 Putty를 기반으로하는 FileZilla나 WinSCP와 같은 프로그램으로 제한합니다.

 

 

SELinux 비활성화

SELinux는 사용하지 않으므로 비활성화 하겠습니다. "setenforce 0"는 퍼미시브 모드로 경고 메세지만 표시되도록 하며, 완전한 비활성화는 "sed -i xxx"를 실행후 OS가 재시작되면 적용됩니다. 

### Inactive the SELinux ###
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@localhost ~]# reboot

 

 

Firewall 설정

Firewall이 동작중이라면 Firewall에 SFTP 서비스의 등록이 필요하므로, 아래와 같이 SFTP에 사용할 포트를 포함한 SFTP 서비스를 등록합니다. (SFTP 서비스 포트는 2022를 사용합니다)

### Add ProFTPD Service to the firewall ###
[root@localhost ~]# firewall-cmd --permanent --zone=public --new-service=sftp
[root@localhost ~]# firewall-cmd --permanent --service=sftp --add-port=2022/tcp
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=sftp
[root@localhost ~]# firewall-cmd --reload

### Check ProFTPD Service on the firewall ###
[root@localhost ~]# firewall-cmd --list-service
cockpit dhcpv6-client sftp ssh

### Check ProFTPD Service Port on the firewall ###
[root@localhost ~]# firewall-cmd --info-service=sftp
sftp
  ports: 2022/tcp
  protocols:
  source-ports:
  modules:
  destination:
  includes:
  helpers:

 

 

설치

최소 설치한 CentOS 7에는 ProFTPD 설치 패키지가 포함되어 있지 않으므로 EPEL 레포지토리를 설치한 후, ProFTPD 관련 패키지를 설치합니다. "proftpd-utils" 패키지는 확장 모듈 및 명령어를 사용하기 위해서 필요하므로 같이 설치합니다.

### Install the EPEL Repository ###
[root@localhost ~]# yum -y install epel-release

### Install the Proftpd packages ###
[root@localhost ~]# yum -y install proftpd proftpd-utils

 

 

환경파일 설정

앞서 설명한 것과 같이 ProFTPD의 기본 인증방법인 PAM을 대신하여 ftpasswd 명령어로 생성한 계정으로 인증을 대체하기 위해서 관련 내용을 추가하여 환경 파일을 설정합니다.

### /etc/proftpd.conf ###

ServerName                      "FTP server"
ServerIdent                     on "FTP Server ready."
ServerAdmin                     root@localhost

DefaultServer                   on
DefaultRoot                     ~ !adm

#AuthPAM                        off
#AuthPAMConfig                  proftpd
AuthUserFile                    /etc/proftpd/ftpd.passwd
AuthGroupFile                   /etc/proftpd/ftpd.group
AuthOrder                       mod_auth_file.c

IdentLookups                    off
UseReverseDNS                   off
UseSendfile                     off

User                            nobody
Group                           nobody

RootLogin                       off
RequireValidShell               off

MaxInstances                    100

LogFormat                       default "%h %l %u %t \"%r\" %s %b"
LogFormat                       auth    "%v [%P] %h %t \"%r\" %s"

LoadModule mod_ctrls_admin.c
LoadModule mod_sftp.c
LoadModule mod_sftp_pam.c
LoadModule mod_vroot.c

ModuleControlsACLs              insmod,rmmod allow user root
ModuleControlsACLs              lsmod allow user *

ControlsEngine                  on
ControlsACLs                    all allow user root
ControlsSocketACL               allow user *
ControlsLog                     /var/log/proftpd/controls.log

TimesGMT                        off
TimeoutIdle                     600
TimeoutLogin                    300
TimeoutNoTransfer               600
TimeoutStalled                  600

<IfModule mod_ctrls_admin.c>
  AdminControlsEngine           on
  AdminControlsACLs             all allow user root
</IfModule>

<IfModule mod_sftp.c>
  SFTPEngine                    on
  SFTPLog                       /var/log/proftpd/sftp.log
  Port                          2022
  SFTPHostKey                   /etc/proftpd/ssh/ssh_host_rsa_key
  SFTPHostKey                   /etc/proftpd/ssh/ssh_host_dsa_key
  SFTPHostKey                   /etc/proftpd/ssh/ssh_host_ecdsa_key
  SFTPCompression               delayed
  MaxLoginAttempts              1000
  DefaultRoot                   ~
  SFTPAuthMethods               publickey
  SFTPAuthorizedUserKeys        file:/etc/proftpd/key/%u/authorized_keys
</IfModule>

<IfModule mod_vroot.c>
  VRootEngine                   on
</IfModule>

<IfDefine TLS>
  TLSEngine                     on
  TLSRequired                   on
  TLSRSACertificateFile         /etc/pki/tls/certs/proftpd.pem
  TLSRSACertificateKeyFile      /etc/pki/tls/certs/proftpd.pem
  TLSCipherSuite                ALL:!ADH:!DES
  TLSOptions                    NoCertRequest
  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 5/00:10:00 01:00:00
  BanMessage                    "Host %a has been banned"
  BanControlsACLs               all allow user ftpadm
</IfDefine>

<IfDefine QOS>
  LoadModule                    mod_qos.c
  QoSOptions                    dataqos throughput ctrlqos lowdelay
</IfDefine>

<Global>
  Umask                         022
  AllowOverwrite                yes

  <Limit ALL SITE_CHMOD>
    AllowAll
  </Limit>

</Global>

 

 

SSH Host Key 생성

ProFTPD의 SFTP 모듈을 사용하므로, SSH Host Key를 별도 생성합니다.

### Create folder for SSH Host Key ###
[root@localhost ~]# mkdir -p /etc/proftpd/ssh

### Create SSH Host Key ###
[root@localhost ~]# ssh-keygen -m PEM -f /etc/proftpd/ssh/ssh_host_dsa_key -N '' -t dsa
[root@localhost ~]# ssh-keygen -m PEM -f /etc/proftpd/ssh/ssh_host_rsa_key -N '' -t rsa -b 3072
[root@localhost ~]# ssh-keygen -m PEM -f /etc/proftpd/ssh/ssh_host_ecdsa_key -N '' -t ecdsa -b 521

 

 

사용자 계정 및 그룹 생성

사용자 계정은 ftpasswd 명령어에 --passwd 옵션을 붙여서 생성하며, 사용자 그룹은 ftpasswd 명령어에 --group 옵션을 붙여서 생성합니다.

### Create a ProFTPD User named test1 ###
[root@localhost ~]# ftpasswd --passwd --name=test1 --uid=10001 --gid=10001 --file=/etc/proftpd/ftpd.passwd \
--home=/data/www/test1 --shell=/bin/false

ftpasswd: using alternate file: /etc/proftpd/ftpd.passwd
ftpasswd: creating passwd entry for user test1

ftpasswd: /bin/false is not among the valid system shells.  Use of
ftpasswd: "RequireValidShell off" may be required, and the PAM
ftpasswd: module configuration may need to be adjusted.

Password: **********
Re-type password: **********

ftpasswd: entry created

 

### Create a ProFTPD Group for test1 ###
[root@localhost ~]# ftpasswd --group --name=test1 --gid=10001 --file=/etc/proftpd/ftpd.group

 

 

사용자 계정의 Private와 Public Key 생성

사용자 계정의 Private와 Public Key를 생성합니다. Private Key를 생성할 때, 분실을 상정하여 패스워드를 입력합니다. 입력한 패스워드는 추후 로그인 과정에서 사용됩니다.

### Create a Key Directory ###
[root@localhost ~]# mkdir -p /etc/proftpd/key/test1

### Create Private and Public Keys ###
[root@localhost ~]# ssh-keygen -f /etc/proftpd/key/test1/test1
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): **********
Enter same passphrase again: **********
Your identification has been saved in /etc/proftpd/key/test1/test1.
Your public key has been saved in /etc/proftpd/key/test1/test1.pub.
The key fingerprint is:
SHA256:DDJzC9gzEFkhNt5yuMCn5EDPBas9JlG8rKs1ovudKuA root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| .B*+o           |
|oo=Xo            |
|o+*=% o          |
|+.** O +         |
| =o+  . S        |
|..o .            |
|+ +              |
|oE o .           |
|=+o.o            |
+----[SHA256]-----+

### Create a Authorized Key with Public Key ###
[root@localhost ~]# ssh-keygen -e -f /etc/proftpd/key/test1/test1.pub > /etc/proftpd/key/test1/authorized_keys

### Change the Authorized Key Permision ###
[root@localhost ~]# chmod 600 /etc/proftpd/key/test1/authorized_keys

 

FileZilla나 WinSCP와 같은 프로그램에서 ProFTPD SFTP로 접속하려면 별도의 ppk 파일이 필요하므로, 기존 Private Key를 ppk 형식의 파일로 변환해서 저장합니다. 변환 과정에서 패스워드 입력란에 앞서 Private Key를 생성할때 입력한 패스워드를 입력해 주세요.


### Install putty package ###
[root@localhost ~]# yum -y install putty

### Create a Private Key for Putty Format ###
[root@localhost ~]# puttygen /etc/proftpd/key/test1/test1 -o /etc/proftpd/key/test1/test1.ppk
Enter passphrase to load key: **********

 

 

홈 폴더 생성

사용자 계정의 홈 폴더를 생성하고 소유권을 설정합니다.

### Create a Home Folder for test1 ###
[root@localhost ~]# mkdir -p /data/www/test1

### Change ownership of test1 Home Folder ###
[root@localhost ~]# chown 10001.10001 /data/www/test1

 

 

서비스 재시작

설정이 완료되었다면 테스트 전에 ProFTPD 서비스를 재시작합니다.

### Enable ProFTPD Service ###
[root@localhost ~]# systemctl enable proftpd

### Start ProFTPD Service ###
[root@localhost ~]# systemctl start proftpd

 

접속 테스트

접속 테스트는 FileZilla로 진행합니다. 접속 테스트에서 로그인 유형을 "키 파일" 형식으로 진행하므로, WinSCP와 같은 어플리케이션을 사용하여 앞서 생성해둔 ppk 파일을 사전에 다운로드해 둡니다. ppk 파일의 준비가 끝났다면, 아래와 같이 FileZilla를 실행한후, 접속할 호스트 및 포트 로그인 유형, 사용자, 키 파일 등을 설정한후 연결을 클릭합니다.

 

사전에 등록한 SSH Host Key가 등록되어 있지 않다는 메시지가 출력되면 "항상 이 호스트를 신뢰하고 이 키를 캐쉬에 등록"을 선택후 확인을 클릭합니다.  

 

ppk 파일에 포함된 패스워드를 입력하는 부분입니다. Private Key를 발급할때 또는 Private Key를 ppk 형식으로 변환할때 사용한 패스워드를 입력하고 확인을 클릭합니다.

 

접속에 성공한 화면입니다.

 

반응형

'FTP > ProFTPD' 카테고리의 다른 글

[ProFTPD] ftpasswd로 사용자 생성/편집/삭제  (0) 2021.12.02

+ Recent posts