Skip to main content

Cài đặt và cấu hình SFTP và FTPS trên Linux Server

01,December 2017
Cài đặt và cấu hình SFTP và FTPS trên Linux Server

FTP(File Transfer Protocol) là giao thức sử dụng để truyền tải files từ 1 host sang host khác qua môi trường internet. FTP được sử dụng rộng rãi nhưng lại gặp vấn đề lớn về security. Dữ liệu truyền tải giữa các hosts ở dạng unencrypted. Username & password cũng không được mã hóa và có thể bị sniffed 1 cách dễ ràng. 

SFTP vs FTPS

- FTP over SSH hoặc SFTP là 1 cách khắc phục vấn đề security. Lúc này phiên kết nối của FTP sẽ được tunneled trong Secure Shell connection, dữ liệu truyền tải giữa 2 hosts sẽ được mã hóa. Với SFTP dữ liệu truyền tải ở dạng packet based thay vì text-based. 

FTPS là 1 phần mở rộng của FTP ( thêm SSL/TLS cryptographic protocols ). Lúc này Transport Layer Security sẽ được thiết lập ngay từ khi khởi tạo kết nối. Có 2 kiểu FTPS là implicit và explicit

  • In case of implicit FTPS, the client is expected to send TLS ClientHello message at the beginning of the connection and if it fails, the connection is dropped.
  • In explicit FTPS, the client is expected to explicitly ask for security. If it fails to ask, it is up to the server to continue in the unsecure more or drop the connection.

=> Khi TLS connection được thiết lập, dữ liệu truyền tải giữa các hosts sẽ được mã hóa. Cả SFTP và FTPS đều tốt nhưng tương thích là vấn đề lớn với SFTP

 

I. Cài đặt và cấu hình VSFTPD Server sử dụng SSL/TLS encryption

1. Cài đặt gói vsftpd và mod_ssl

[root@centos7 ~]$ yum -y install vsftpd      #Installing vsftpd Package
[root@centos7 ~]$ yum -y install mod_ssl   #Installing mod_ssl Package

- Hiển thị files cấu hình và thư mục của mod_ssl

[root@centos7 ~]# rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.modules.d/00-ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/usr/libexec/httpd-ssl-pass-dialog
/var/cache/httpd/ssl

- Khởi động dịch vụ vsftpd

[root@centos7 ~]# systemctl start/status/stop/restart vsftpd
[root@centos7 ~]# systemctl enable vsftpd

 

2. Tạo Certificates cho Vsftpd server

- Cần tạo ra file .pem certificate cho vsftpd server. pem (Privacy Enhanced Mail) là 1 public certificate container, chứa nhiều certificates trong nó ( ví dụ Public Key and Private Key certificates)

- Sử dụng openssl để tạo ra file .pem

[root@centos7 ~]# /usr/bin/openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/certs/vsftpd.pem -out /etc/ssl/certs/vsftpd.pem

Generating a 2048 bit RSA private key
....................................+++
...........................................................+++
writing new private key to '/etc/ssl/certs/vsftpd.pem'
-----
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]:VN
State or Province Name (full name) []:Ha Noi
Locality Name (eg, city) [Default City]:Ha Noi
Organization Name (eg, company) [Default Company Ltd]:itlabvn
Organizational Unit Name (eg, section) []:IT DEPT
Common Name (eg, your name or your server's hostname) []:sftp.itlabvn.net
Email Address []:admin@itlabvn.net

 

3. Cấu hình vsftpd.conf

[root@centos7 ~]# chmod 600 /etc/ssl/certs/vsftpd.pem
[root@centos7 ~]# vim /etc/vsftpd/vsftpd.conf

# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO  # Disable Anonymous Login
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
local_enable=YES  # Enable Local User Login
#
 Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=NO

# Uncomment this to enable any form of FTP write command.
write_enable=YES  # Write enable for any form of FTP
#

xferlog_enable=YES

xferlog_file=/var/log/vsftpd.log
#We’ll also uncomment the chroot to prevent the FTP-connected user from accessing any files or commands outside the directory tree.
chroot_local_user=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022

- Khởi động lại dịch vụ vsftpd

[root@centos7 ~]# systemctl restart vsftpd

 

4. Enable SSL encryption support vsftpd server

[root@centos7 ~]$ vim /etc/vsftpd/vsftpd.conf   #put on end of file

# Path for Certificate File
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
# Path for Private Key File
rsa_private_key_file=/etc/ssl/certs/vsftpd.pem
# Enable SSL Encryption for VSftpd Linux FTP Server
ssl_enable=YES
#  We have to prevent anonymous users from using SSL
allow_anon_ssl=NO
# Force LOcal users to login using SSL Encryption / TLS Encryption
force_local_data_ssl=YES
# Force To use SSL Encryption / TLS Encryption during Data Upload in FTP
force_local_logins_ssl=YES
# Look for the option ssl_enable and set its value to YES to activate the use of SSL, in addition, since TSL is more secure than SSL, we will restrict VSFTPD to employ TLS instead, using the ssl_tlsv1_2 option
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
# When option require_ssl_reuse is set to YES, then, all SSL data connections are required to exhibit SSL session reuse; proving that they know the same master secret as the control channel. Therefore, we have to turn it off.
require_ssl_reuse=NO
# we need to select which SSL ciphers VSFTPD will permit for encrypted SSL connections with the ssl_ciphers option. This can greatly limit efforts of attackers who try to force a particular cipher which they probably discovered vulnerabilities in
ssl_ciphers=HIGH

- Khởi động lại dịch vụ vsftpd

[root@centos7 ~]$ systemctl restart vsftpd

 

5. Kiểm tra

- Tạo user ftp 

[root@centos7 ~]# useradd -m ducdt
[root@centos7 ~]# passwd ducdt

- Sử dụng câu lệnh sau để debug

[root@centos7 ~]# grep -i vsftpd /var/log/messages
[root@centos7 ~]# grep vsftpd /var/log/audit/audit.log

- Với cấu hình SSL/TLS encryption ở trên, bạn không thể truy cập FTP server mà không sử dụng SSL

[root@centos7 ~]# ftp 192.168.3.20
Connected to 192.168.3.20.
220 (vsFTPd 3.0.2)
Name (192.168.3.20:ducdt): ducdt
530 Non-anonymous sessions must use encryption.
Login failed.

+ Sử dụng filezilla

- Không dùng SSL/TLS

cấu hình vsftpd trên linux

 

cấu hình vsftpd trên Linux Server

- Sử dụng SSL/TLS ( FTPS ) 

cấu hình vsftpd trên linux server

 

Cấu hình vsftpd trên Linux Server

 

6. Cấu hình thay đổi thư mục truy cập ftp và disable ssh login server 

+ Để disable ssh login server

- Cách 1: sử dụng câu lệnh sau

echo "/bin/false" >> /etc/shells

- Thay đổi shell của account ftp về /bin/false

usermod ducdt -s /bin/false

- Cách 2: Tạo file shell /bin/ftponly với nội dung sau

# vim /bin/ftponly

#!/bin/sh
echo "This account is limited to FTP access only."

- Change permission và gán shell cho ftp account

chmod a+x /bin/ftponly
echo "/bin/ftponly" >> /etc/shells
usermod ducdt -s /bin/ftponly

+ Thay đổi thư mục truy cập cho account ftp 

mkdir -p /var/www/ftp/ducdt
usermod --home /var/www/ftp/ducdt ducdt
chown -R ducdt:ducdt /var/www/ftp/ducdt
grep ducdt /etc/passwd

 

II. Cấu hình enable SFTP và disable ssh login 

SFTP (SSH File Transfer Protocol) là phương thức truyền tải files sử dụng mã hóa SSH connection và khác hoàn toàn FTP. 

- SFTP có trong gói cài đặt OpenSSH-Server nên không cần cài đặt gì thêm. SFTP an toàn nhưng cũng có nhưng bất tiện, với cấu hình mặc định SSH server sẽ cấp quyền truy cập shell access và truyền tải files cho tất cả các account trên hệ thống. Trong 1 vài trường hợp, bạn chỉ muốn cho phép users truyền tải files và không login SSH vào hệ thống. Để làm điều đó chúng ta tiến hành các bước sau

Bước 1. Tạo user và thiết lập password

[root@CentOS7 ~]# useradd -m ftpuser1
[root@CentOS7 ~]# passwd ftpuser1
[root@CentOS7 ~]# useradd -m ftpuser2
[root@CentOS7 ~]# passwd ftpuser2

 

Bước 2. Tạo thư mục cho các account ftp

[root@CentOS7 ~]# mkdir -p /var/sftp/ftpuser1
[root@CentOS7 ~]# mkdir -p /var/sftp/ftpuser2
[root@CentOS7 ~]# chown root:root /var/sftp
[root@CentOS7 ~]# chmod 755 /var/sftp   ;other users only read and execute rights
[root@CentOS7 ~]# chown ftpuser1:ftpuser1 /var/sftp/ftpuser1
[root@CentOS7 ~]# chown ftpuser2:ftpuser2 /var/sftp/ftpuser2

 

Bước 3. Hạn chế truy cập cho account ftp

- Cấu hình SSH server config file cho phép truyền tải dữ liệu nhưng không cho phép truy cập SSH login vào server 

[root@CentOS7 ~]$ vi /etc/ssh/sshd_config

#Match User tells the SSH server to apply the following commands only to the user specified
Match User ftpuser1
#ForceCommand internal-sftp forces the SSH server to run the SFTP server upon login, disallowing shell access.
ForceCommand internal-sftp
#PasswordAuthentication yes allows password authentication for this user.
PasswordAuthentication yes
#ChrootDirectory /var/sftp/ ensures that the user will not be allowed access to anything beyond the /var/sftp/ftpuser1 directory
ChrootDirectory /var/sftp/ftpuser1
#AllowAgentForwarding no, AllowTcpForwarding no. and X11Forwarding no disables port forwarding, tunneling and X11 forwarding for this user
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

Match User ftpuser2
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp/ftpuser2
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

- Khởi động lại dịch vụ SSH

sudo systemctl restart sshd

 

Bước 4. Kiểm tra 

- Kiểm tra truy cập ssh của account ftpuser1

[root@CentOS7 ~]# ssh ftpuser1@localhost
ftpuser1@localhost's password:
Could not chdir to home directory /home/ftpuser1: No such file or directory
This service allows sftp connections only.
Connection to localhost closed.

- Kiểm tra truy cập sftp của account ftpuser1

[root@CentOS7 ~]# sftp ftpuser1@localhost
ftpuser1@localhost's password:
Connected to localhost.
sftp> help