====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