Setup WebDAV and SSH host for online file transfers 1.) Install CentOS 7 Minimal,set static ip + FQDN, enable NTP, disable kdump, 1GB /boot, appropriate swap, everything else under /, set root password. 2.) Boot into OS, perform a yum update, install vim, rsync, policycoreutils-python, reboot. 3.) Create sudo user, install and configure fail2ban. ===Create sudo User + Disable root SSH Access=== Create user with password useradd sudo_username && passwd sudo_username Add user to wheel group for sudo privileges usermod -aG wheel sudo_username Restart sshd systemctl restart sshd Log out of root and into newly created account. Disable root login over SSH vi /etc/ssh/sshd_config Add line PermitRootLogin no Change the default SSH port from 22 Port #SSHPORTNUMBER https://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html Configure idle log out timeout interval A user can log in to the server via ssh, and you can set an idle timeout interval to avoid unattended ssh session. Open sshd_config and make sure following values are configured: ClientAliveInterval 300 ClientAliveCountMax 0 15. Disable .rhosts files (verification) Don’t read the user’s ~/.rhosts and ~/.shosts files. Update sshd_config with the following settings: IgnoreRhosts yes 16. Disable host-based authentication (verification) To disable host-based authentication, update sshd_config with the following option: HostbasedAuthentication no Allow only your sudo user to login from specific IPs (here we're allowing the sudo user only to login from our local subnets and everyone else can login from whereever) AllowUsers sudo_user@192.168.21.* sudo_user@192.168.7.* otheruser1 other2 Tell SELinux about the SSH port change sudo semanage port -a -t ssh_port_t -p tcp #SSHPORTNUMBER ===Confiugre Firewall to use non-standard ports for SSH and WebDAV=== sudo firewall-cmd --permanent --zone=public --add-port=#SSHPORTNUMBER/tcp sudo firewall-cmd --permanent --zone=public --add-port=#WEBDAVPORTNUMBER/tcp sudo firewall-cmd --reload Restart sshd and relogin under new port sudo systemctl restart sshd Login using new port ssh sudo_user@192.168.21.30 -p #SSHPORTNUMBER Remove firewall exception for default SSH service port sudo firewall-cmd --zone=public --remove-service=ssh sudo firewall-cmd --runtime-to-permanent sudo firewall-cmd --reload sudo systemctl restart firewalld ===Install Fail2ban=== This will help prevent the baddies from brute forcing your SSH password... well this is supposed to be an offline CA but caution is always warranted for root anything. Install epel repo, install fail2ban and enable it sudo yum install epel-release sudo yum install fail2ban sudo systemctl enable fail2ban Create a jail for sshd sudo vim /etc/fail2ban/jail.d/sshd.local Add as follows: [sshd] enabled = true protocol = tcp port = ssh ###replace ssh with any custom ssh port you used### action = iptables-allports logpath = /var/log/secure maxretry = 3 bantime = 3600 Restart fail2ban sudo systemctl restart fail2ban then test it! ====Setup WebDAV==== https://devops.ionos.com/tutorials/how-to-set-up-webdav-with-apache-on-centos-7/ https://www.vultr.com/docs/how-to-setup-a-webdav-server-using-apache-on-centos-7 Install Apache sudo yum install httpd sudo systemctl enable httpd Create a group that will be used to allow local users access to the WebDAV folder, add apache to group sudo groupadd webdavusers sudo usermod -aG webdavusers apache Create WebDAV dir & set permissions (double check permissions below as incorrect permissions on davlock folder will allow webdav to work but cause transfers to fail after about 200MB) sudo mkdir /var/www/html/webdav sudo mkdir /var/www/html/davlock sudo chown -R apache:webdavusers /var/www/html/webdav sudo chmod -R 775 /var/www/html/webdav sudo chown -R apache:apache /var/www/html/davlock sudo chmod -R 740 /var/www/html/davlock sudo chcon -R -t httpd_sys_content_t /var/www/html sudo chcon -R -t httpd_sys_content_rw_t /var/www/html/webdav sudo chcon -R -t httpd_sys_content_rw_t /var/www/html/davlock Make subfolders/files inherit group membership of webdav folder chmod g+s /var/www/html/webdav Setup password for WebDAV user sudo htpasswd -c /etc/httpd/.htpasswd wedbetter Now, you need to assign group ownership of the file to the apache user, and lock down the permissions for everyone else. To do this, run the following command: sudo chown root:apache /etc/httpd/.htpasswd sudo chmod 640 /etc/httpd/.htpasswd Create a virtual host file for the webdav directory. Start by creating a new site configuration file called webdav.conf. sudo vim /etc/httpd/conf.d/webdav.conf Add the following code DavLockDB /var/www/html/davlock/DavLock ServerAdmin webmaster@localhost DocumentRoot /var/www/html/webdav/ ErrorLog /var/log/httpd/error.log CustomLog /var/log/httpd/access.log combined Alias /webdav /var/www/html/webdav DAV On AuthType Basic AuthName "webdav" AuthUserFile /etc/httpd/.htpasswd Require valid-user Disable Apache's default welcome page: sudo sed -i 's/^/#&/g' /etc/httpd/conf.d/welcome.conf Prevent the Apache web server from displaying files within the web directory: sudo sed -i "s/Options Indexes FollowSymLinks/Options FollowSymLinks/" /etc/httpd/conf/httpd.conf Restart Apache sudo systemctl restart httpd --------- Create user for SSH/SCP/SFTP transfers sudo useradd wedbetter && passwd wedbetter sudo usermod -aG webdavusers wedbetter Login as new ssh user and create symbolic link in ssh user folder to give easy access to webdav folder ln -s /var/www/html/webdav/ ~/webdav -------- Enable HTTPS Create an A record with your public DNS and your internal DNS if you have such a thing. We're going to use non-standrd ports with letsencrypt so we'll being doing a DNS challenge as verification. Install certbot for Letsencrypt sudo yum install certbot python2-certbot-apache [blinkety@xfer ~]$ sudo certbot -d xfer.domain.com --manual --preferred-challenges dns certonly Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Obtaining a new certificate Performing the following challenges: dns-01 challenge for xfer.domain.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you're running certbot in manual mode on a machine that is not your server, please ensure you're okay with that. Are you OK with your IP being logged? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name _acme-challenge.xfer.domain.com with the following value: MmjxEu_E306ew1M-oRgji5O9kjK_fTvMItidycUqo_0 Before continuing, verify the record is deployed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Press Enter to Continue Waiting for verification... Resetting dropped connection: acme-v02.api.letsencrypt.org Resetting dropped connection: acme-v02.api.letsencrypt.org Cleaning up challenges Resetting dropped connection: acme-v02.api.letsencrypt.org IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/xfer.domain.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/xfer.domain.com/privkey.pem Your cert will expire on 2019-08-16. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le Note: for godaddy DNS if it asks you to create the txt record with the name _acme-challenge.xfer.domain.com then you'll put in _acme-challenge.xfer for the host at godaddy. Modify your /etc/httpd/conf.d/webdav.conf to enable SSL and allow only strong ciphers https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html Add the following items or modify existing ones LoadModule ssl_module modules/mod_ssl.so Listen 443 ServerName www.example.com SSLEngine on SSLCertificateFile "/etc/letsencrypt/live/xfer.domain.com/fullchain.pem" SSLCertificateKeyFile "/etc/letsencrypt/live/xfer.domain.com/privkey.pem" If you're using a custom SSL port, modify the Listen 443 and VirtualHost *:443 as needed. Restart Apache and test sudo systemctl restart httpd example of copying via scp to custom port 55955 to the symlink webdav in wedbetters home dir scp -P 55955 cold_backups.sh wedbetter@xfer.domain.com:~/webdav this time via rsync rsync -vP -e "ssh -p55955" cold_backups.sh wedbetter@xfer.domain.com:~/webdav rsync that will resume a broken transfer and uses the highest compression rsync -vP --compress-level=9 --append-verify -e "ssh -p55955" ZIMBRA.img wedbetter@xfer.domain.com:~/webdav/ If you want to organize things before transferring make folders via SSH ssh -p 55955 wedbetter@xfer.domain.com "mkdir -p ~/webdav/Client_Name"