FTPS on CentOS 8 via VSFTPD
https://www.liquidweb.com/kb/how-to-install-and-configure-vsftpd-on-centos-7/
https://www.liquidweb.com/kb/configure-vsftpd-ssl/
https://www.digitalocean.com/community/tutorials/how-to-set-up-vsftpd-for-a-user-s-directory-on-ubuntu-16-04
http://www.tuxfixer.com/vsftpd-installation-on-centos-7-with-selinux/
Install CentOS 8 minimal with 2 CPU, 512MB+ RAM, 20GB+ storage, set FQDN, set static IP, enable NTP.
3.) After install if finished reboot → login → perform a “dnf update”.
Create limited user account and add to wheel group for sudo
useradd example_user && passwd example_user usermod -aG wheel example_user
Install useful stuff
dnf install vim rsyslog policycoreutils-python-utils systemctl enable rsyslog systemctl start rsyslog
Logout of root and login using sudo user
Disallow root login over SSH
sudo vim /etc/ssh/sshd_config
then set
PermitRootLogin no
Restart sshd
sudo systemctl restart sshd
Create Dedicated FTPS/SFTP User/Group
sudo useradd sftps sudo usermod -s /sbin/nologin sftps
Create FTP directory
sudo mkdir -p /opt/public/share sudo chown root:root /opt/public/share sudo chown -R sftps:sftps /opt/public/share sudo chmod 770 /opt/public/share sudo semanage fcontext -a -t public_content_rw_t /opt/public/share sudo restorecon -Rvv /opt/public/share
Note: for chroot for SFTP the parent dir must be owned by root, this is for later if adding SFTP also.
Set other selinux options
sudo setsebool -P ftp_home_dir 1 sudo setsebool -P ftpd_full_access 1
Create Individual FTPS User
And add to sftps group
sudo useradd ftpuser && passwd ftpuser sudo usermod -aG sftps ftpuser
Install VSFTPD
sudo dnf install vsftpd
Create log file (if it's not there fail2ban won't start, the log file is created automatically on ftp login)
sudo touch /var/log/vsftpd.log
Edit Config
sudo vim /etc/vsftpd/vsftpd.conf
Set the following:
anonymous_enable=NO local_enable=YES write_enable=YES chroot_local_user=YES allow_writeable_chroot=YES user_sub_token=$USER local_root=/opt/public/share userlist_enable=YES userlist_file=/etc/vsftpd/user_list userlist_deny=NO dual_log_enable=YES
Add the users you want to allow FTP access for
sudo vim /etc/vsftpd/user_list
Remove everything in there then add the users you want to have FTP access.
Enable and Restart Service
sudo systemctl enable vsftpd sudo systemctl restart vsftpd
Add Firewall Rules
sudo firewall-cmd --permanent --add-port=21/tcp sudo firewall-cmd --permanent --add-port=21000-21010/tcp sudo firewall-cmd --reload
Enable SSL/TLS Encryption
https://forums.centos.org/viewtopic.php?t=43230 https://www.getpagespeed.com/server-setup/ssl-directory https://help.thorntech.com/docs/sftp-gateway-classic/enabling-ftps-using-vsftp/
Create Private Key and CSR
sudo openssl req -new -newkey rsa:4096 -nodes -keyout site1.domain.com.key -out site1.domain.com.csr
Move the files to your PKI folder
sudo mv site1.domain.com.* /etc/pki/tls/private/
Set permissions on private key
sudo chown root:root /etc/pki/tls/private/site1.domain.com.key sudo chmod 600 /etc/pki/tls/private/site1.domain.com.key sudo restorecon -RvF /etc/pki/tls/private/
Submit the CSR to your CA (public or private)
Copy the BASE64 certificate from your CA to your cert folder
sudo vim /etc/pki/tls/certs/site1.domain.com.crt
Create the CA bundle associated with your certificate
sudo vim /etc/pki/tls/certs/site1.domain.com.ca-bundle
Paste the subordinate followed by the root BASE64 certificates
Edit the conf file for VSFTPD
sudo vim /etc/vsftpd/vsftpd.conf
Set the following
ssl_enable=YES allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1_1=YES ssl_tlsv1_2=YES ssl_tlsv1=NO ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=YES ssl_ciphers=HIGH rsa_cert_file=/etc/pki/tls/certs/site1.domain.com.crt rsa_private_key_file=/etc/pki/tls/private/site1.domain.com.key pasv_enable=Yes pasv_min_port=21000 pasv_max_port=21010
Automatic Updates for CentOS
https://www.tecmint.com/dnf-automatic-install-security-updates-automatically-in-centos-8/
sudo dnf install dnf-automatic sudo vim /etc/dnf/automatic.conf
Set:
upgrade_type = security download_updates = yes system_name = (your system name) emit_via = motd
Enable the auto-update timer
sudo systemctl enable --now dnf-automatic.timer
fail2ban
https://idroot.us/install-fail2ban-centos-8/ https://www.digitalocean.com/community/tutorials/how-to-protect-an-apache-server-with-fail2ban-on-ubuntu-14-04
sudo dnf install epel-release sudo dnf install fail2ban
Create a Jail for SSHd
sudo vim /etc/fail2ban/jail.d/sshd.local
Add the following:
[sshd] enabled = true port = ssh logpath = %(sshd_log)s backend = %(sshd_backend)s [selinux-ssh] enabled = true port = ssh logpath = %(auditd_log)s
Create Jail for VSFTPD
sudo vim /etc/fail2ban/jail.d/vsftpd.local
Add the following:
[vsftpd] enabled = true # or overwrite it in jails.local to be # logpath = %(syslog_authpriv)s # if you want to rely on PAM failed login attempts # vsftpd's failregex should match both of those formats port = ftp,ftp-data,ftps,ftps-data logpath = %(vsftpd_log)s
sudo systemctl start fail2ban sudo systemctl enable fail2ban sudo fail2ban-client status sshd
SFTP
https://www.atlantic.net/vps-hosting/how-to-create-a-sftp-user-without-shell-access-on-centos-8/
https://unix.stackexchange.com/questions/293756/set-startup-folder-for-sftp-to-be-other-than-home-username-is-throwing-me-permi
Create a new directory for SFTP or use the existing FTP directory if you need more than one access method.
sudo mkdir -p /opt/public/sftp sudo chown root:root /opt/public sudo chown -R sftps:sftps /opt/public/sftp sudo chmod 770 /opt/public/sftp sudo semanage fcontext -a -t public_content_rw_t /opt/public/sftp sudo restorecon -Rvv /opt/public/sftp
Generate SSH key for sudo user on client computer (not the webserver)
To help keep things organized we'll create a keypair that is specific to the user and the remote sudo user+host.
https://www.ssh.com/ssh/keygen/
ssh-keygen -C "your_email@example.com" -f ~/.ssh/your_email@example.com-remote_sudo_username_@remote_hostname -t ed25519
Record the private and public keys in a secure document for the server.
Copy the public key to the remote server.
ssh-copy-id -i ~/.ssh/your_email@example.com-remote_sudo_username_@remote_hostname.pub sudo_username@remote_hostname
Login using SSH key
ssh -i deployment_key.txt demo@192.237.248.66
Restrict Access in SSH
sudo vim /etc/ssh/sshd_config
Add the following:
Match User ftpuser ForceCommand internal-sftp -d /sftp PasswordAuthentication yes ChrootDirectory /opt/public PermitTunnel no AllowAgentForwarding no AllowTcpForwarding no X11Forwarding no
This will force the listed parameters on the ftpuser, namely that they are allowed sftp access only and that they'll start out in the sftp directory and that they are chrooted to /opt/public. Note, /opt/public must be owned by root:root for chroot to work and the subdirectories need permissions giving access to desired users/groups.
Restrict SSH Access
We want to restrict access to our sudo user and sftp users
sudo vim /etc/ssh/sshd_config
Add the following:
AllowUsers sudo_username ftpuser_username
And since theoretically you're going to allow public SFTP access this means your SSH port is open to the public. We've already restricted who can login over ssh/sftp but now we want to enable key login only for the sudo user.
Don't allow members of the wheel group to login with passwords
Match Group wheel PasswordAuthentication no
And change the default SSH/SFTP port
Port 21011
Tell Selinux of the change
sudo semanage port -a -t ssh_port_t -p tcp 21011
Setup firewall rules
sudo firewall-cmd --permanent --zone=public --add-port=21011/tcp sudo firewall-cmd --reload
Restart SSHD
sudo systemctl restart sshd sudo systemctl restart vsftpd