설명
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 |
---|