=====Repo Mirror Using Rocky Linux 8===== https://help.ubuntu.com/community/Rsyncmirror \\ https://computingforgeeks.com/create-local-centos-7-centos-6-mirrors/ Plan is to create a slimmed down mirror of CentOS 7, Rocky Linux 8, ELRepo, Remi PHP Repo, Zimbra Repo and others for internal systems (not as a public mirror or as an archive). Starting with a 500GB disk. ====Base Install==== * Download and install Rocky Linux 8 minimal, setup FQDN and set static IP, enable NTP and set timezone, set root password, use LVM for partitioning, select minimal software. ==Install Misc Tools, Create Sudo User and Reboot== dnf install unzip wget vim tar rsync dnf update useradd example_user && passwd example_user usermod -aG wheel example_user shutdown -r now ==Disallow root login over SSH== * Login using sudo user sudo vim /etc/ssh/sshd_config then set PermitRootLogin no * Restart sshd sudo systemctl restart sshd ====Setup/Sync Repos CentOS/Rocky==== * Create Repo Dirs sudo mkdir -p /var/mirror/pub/centos/7 sudo mkdir -p /var/mirror/pub/rocky/8 sudo mkdir -p /var/mirror/pub/epel/7 sudo mkdir -p /var/mirror/pub/epel/8 sudo mkdir -p /var/mirror/pub/remi/enterprise/7/php74 sudo mkdir -p /var/mirror/pub/remi/enterprise/8 sudo mkdir -p /var/mirror/pub/debian ==Repo Mirror Script for CentOS== https://gist.github.com/didip/4506837 * Create file centos.sh and chmod +x it Note: there are excludes so that only the packages I want are synced, modify to your needs #!/bin/bash # Number of arguments should be at least 1 if [ $# -lt 1 ]; then echo "Usage: $0 centos-version-number" exit 1 fi VERSION=$1 # Change these variables as appropriate LOCK_FILE=/tmp/centos_mirror_rsync_updates DOWNLOAD_LOCATION=rsync://mirrors.kernel.org/centos TARGET_DIR=/var/mirror/pub/centos RSYNC_RETVAL=1 if [ -f $LOCK_FILE ]; then echo "CentOS updates via rsync already running." exit 0 fi echo "Starting rsync from $DOWNLOAD_LOCATION/$VERSION to $TARGET_DIR/$VERSION..." mkdir -p $TARGET_DIR/$VERSION touch $LOCK_FILE # add --exclude as necessary rsync -avSHP --delete --delete-excluded --copy-links --exclude "atomic" --exclude "cloud" --exclude "configmanagement" --exclude "cr" --exclude "dotnet" --exclude "fasttrack" --exclude "infra" --exclude "messaging" --exclude "nfv" --exclude "opstools" --exclude "paas" --exclude "rt" --exclude "sclo" --exclude "storage" --exclude "virt" $DOWNLOAD_LOCATION/$VERSION $TARGET_DIR/ RSYNC_RETVAL=$? rsync -avSHP $DOWNLOAD_LOCATION/RPM-GPG-KEY-CentOS-$VERSION $TARGET_DIR/RPM-GPG-KEY-CentOS-$VERSION /bin/rm -f $LOCK_FILE if [ $RSYNC_RETVAL -eq 0 ]; then echo "Finished rsync from $DOWNLOAD_LOCATION/$VERSION to $TARGET_DIR/$VERSION." fi exit 0 * Run the script for CentOS 7: sudo ./centos.sh 7 ==Repo Mirror Script for Rocky Linux== https://gist.github.com/didip/4506837 * Create file rocky.sh and chmod +x it Note: there are excludes so that only the packages I want are synced, modify to your needs #!/bin/bash # Number of arguments should be at least 1 if [ $# -lt 1 ]; then echo "Usage: $0 rocky-version-number" exit 1 fi VERSION=$1 # Change these variables as appropriate LOCK_FILE=/tmp/rocky_mirror_rsync_update DOWNLOAD_LOCATION=rsync://mirrors.vcea.wsu.edu/rocky TARGET_DIR=/var/mirror/pub/rocky RSYNC_RETVAL=1 if [ -f $LOCK_FILE ]; then echo "Rocky updates via rsync already running." exit 0 fi echo "Starting rsync from $DOWNLOAD_LOCATION/$VERSION to $TARGET_DIR/$VERSION..." mkdir -p $TARGET_DIR/$VERSION touch $LOCK_FILE # add --exclude as necessary rsync -avSHP --delete --delete-excluded --copy-links --exclude "AppStream/aarch64" --exclude "AppStream/source" --exclude "AppStream/x86_64/debug" --exclude "AppStream/x86_64/kickstart" --exclude "BaseOS/aarch64" --exclude "BaseOS/source" --exclude "BaseOS/x86_64/iso" --exclude "BaseOS/x86_64/debug" --exclude "BaseOS/x86_64/kickstart" --exclude "Devel" --exclude "HighAvailability" --exclude "isos/aarch64" --exclude "isos/x86_64" --exclude "live/x86_64" --exclude "Live" --exclude "Minimal" --exclude "PowerTools" --exclude "RT" --exclude "ResilientStorage" --exclude "extras/aarch64" --exclude "extras/source" --exclude "extras/x86_64/debug" --exclude "plus/aarch64" --exclude "plus/source" --exclude "plus/x86_64/debug" --exclude "images" --exclude "nfv" --exclude "rockypi" $DOWNLOAD_LOCATION/$VERSION $TARGET_DIR/ RSYNC_RETVAL=$? rsync -avSHP $DOWNLOAD_LOCATION/RPM-GPG-KEY-rockyofficial $TARGET_DIR/RPM-GPG-KEY-rockyofficial /bin/rm -f $LOCK_FILE if [ $RSYNC_RETVAL -eq 0 ]; then echo "Finished rsync from $DOWNLOAD_LOCATION/$VERSION to $TARGET_DIR/$VERSION." fi exit 0 * Run the script for Rocky Linux 8: sudo ./rocky.sh 8 ==EPEL== Same as Rocky but modified for EPEL. Pick an appropriate mirror closer to you and modify the exclusions as necessary #!/bin/bash # Number of arguments should be at least 1 if [ $# -lt 1 ]; then echo "Usage: $0 epel-version-number" exit 1 fi VERSION=$1 # Change these variables as appropriate LOCK_FILE=/tmp/epel_mirror_rsync_update DOWNLOAD_LOCATION=rsync://dfw.mirror.rackspace.com/epel TARGET_DIR=/var/mirror/pub/epel RSYNC_RETVAL=1 if [ -f $LOCK_FILE ]; then echo "epel updates via rsync already running." exit 0 fi echo "Starting rsync from $DOWNLOAD_LOCATION/$VERSION to $TARGET_DIR/$VERSION..." mkdir -p $TARGET_DIR/$VERSION touch $LOCK_FILE # add --exclude as necessary rsync -avSHP --delete --delete-excluded --copy-links --exclude "Everything/SRPMS/" --exclude "Everything/aarch64/" --exclude "Everything/ppc64le" --exclude "Everything/s390x/" --exclude "Everything/source/" --exclude "Everything/x86_64/debug/" --exclude "Modular/SRPMS/" --exclude "Modular/aarch64/" --exclude "Modular/ppc64le" --exclude "Modular/s390x/" --exclude "Modular/source/" --exclude "Modular/x86_64/debug/" $DOWNLOAD_LOCATION/$VERSION $TARGET_DIR/ RSYNC_RETVAL=$? rsync -avSHP $DOWNLOAD_LOCATION/RPM-GPG-KEY-EPEL-$VERSION $TARGET_DIR/RPM-GPG-KEY-EPEL-$VERSION /bin/rm -f $LOCK_FILE if [ $RSYNC_RETVAL -eq 0 ]; then echo "Finished rsync from $DOWNLOAD_LOCATION/$VERSION to $TARGET_DIR/$VERSION." fi exit 0 ====Setup/Sync Repos Debian==== We're going to use debmirror to create a private mirror: https://linux.die.net/man/1/debmirror Install EPEL release and debmirror: sudo dnf install epel-release sudo dnf install debmirror Edit the config file: sudo vim /etc/debmirror.conf Set the variables as such: # Location of the local mirror (use with care) $mirrordir="/var/mirror/debian"; # Output options $verbose=1; $progress=1; $debug=0; # Download options $host="ftp.us.debian.org"; $user="anonymous"; $passwd="anonymous@"; $remoteroot="debian"; $download_method="rsync"; @dists="bullseye"; @sections="main,main/debian-installer,contrib,non-free"; @arches="amd64"; ==debian-archive-keyring.gpg== I couldn't find a simple way to get this file on a non-debian system so I ended up grabbing it from another Debian Bullseye/11 install. Create dir for gpg file: sudo mkdir -p /usr/share/keyring Copy the debian-archive-keyring.gpg file to /usr/share/keyring Import the key: gpg --keyring /usr/share/keyrings/debian-archive-keyring.gpg --export | gpg --no-default-keyring --keyring trustedkeys.gpg --import Run the mirror sync sudo ./debmirror ====Install Apache==== ==Configure hosts== sudo vim /etc/hosts *Add a line for your FQDN 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.30 mirror.domainname.com mirror ==Install Apache and Configure Firewall== sudo dnf install httpd httpd-tools sudo systemctl enable httpd sudo systemctl start httpd sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --reload ====Create Virtual Hosts==== ==Setup virtual host config files== sudo vim /etc/httpd/conf.d/mirror.example.conf Add the following content. Make sure the website directory path, server name, and PHP version match your setup: Require all granted Options +Indexes ServerAdmin webmaster@example.com ServerName mirror.example.com DocumentRoot /var/mirror ErrorLog /var/log/httpd/mirror.example.com_error.log CustomLog /var/log/httpd/mirror.example.com_access.log combined IndexOptions NameWidth=* Save and close the file when you are finished. Then check the Apache configuration file for any syntax errors: sudo httpd -t You’ll see the following output: Output Syntax OK ==Disable Exposing Apache Server Info== https://www.if-not-true-then-false.com/2009/howto-hide-and-modify-apache-server-information-serversignature-and-servertokens-and-hide-php-version-x-powered-by/ \\ This will help to prevent being the target of a an attack if you're running an out of date or vunerable release sudo vim /etc/httpd/conf/httpd.conf Add the following: ServerSignature Off ServerTokens Prod delete the welconf.conf to disable the default apache welcome page. sudo rm /etc/httpd/conf.d/welcome.conf ==Remove Default Access from httpd.conf== This is important as it would allow access to the /var/www/html path via HTTP. sudo vim /etc/httpd/conf/httpd.conf Modify the following statements to mirror the examples below: DocumentRoot "/var/www/html" AllowOverride None Require all denied Options None AllowOverride None Require all denied Options None AllowOverride None Require all denied Options None ==Set Owner and File Permissons== sudo chown -R apache:apache /var/mirror sudo chmod -R 755 /var/mirror ==Set SElinux Permissions== https://www.redhat.com/sysadmin/apache-yum-dnf-repo sudo chcon -Rt httpd_sys_content_t /var/mirror/ Finally, restart the Apache service to implement your changes: sudo systemctl restart httpd ====Automatic Updates for Rocky Linux==== 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 apply_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 a Jail for Apache== sudo vim /etc/fail2ban/jail.d/apache.local Add the following: [apache-auth] enabled = true port = http,https logpath = %(apache_error_log)s [apache-badbots] enabled = true port = http,https logpath = %(apache_access_log)s bantime = 48h maxretry = 1 [apache-noscript] enabled = true port = http,https logpath = %(apache_error_log)s [apache-overflows] enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 2 [apache-nohome] enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 2 [apache-botsearch] enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 2 [apache-fakegooglebot] enabled = true port = http,https logpath = %(apache_access_log)s maxretry = 1 ignorecommand = %(ignorecommands_dir)s/apache-fakegooglebot [apache-modsecurity] enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 2 [apache-shellshock] enabled = true port = http,https logpath = %(apache_error_log)s maxretry = 1 sudo systemctl start fail2ban sudo systemctl enable fail2ban sudo fail2ban-client status sshd ====Configure Client Repos==== ==CentOS 7== * Edit the Repo Config sudo vim /etc/yum.repos.d/CentOS-Base.repo Comment out any line like mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra Uncomment the baseurl lines and change the FQDN to your FQDN or IP of the repo server baseurl=http://10.222.0.21/centos/$releasever/os/$basearch/ Now you should be able to do a yum update. Rocky 8 sudo vim /etc/yum.repos.d/Rocky-AppStream.repo Modify as such, commenting out mirror and uncommenting baseurl then modifying the url: # Rocky-AppStream.repo # # The mirrorlist system uses the connecting IP address of the client and the # update status of each mirror to pick current mirrors that are geographically # close to the client. You should use this for Rocky updates unless you are # manually picking other mirrors. # # If the mirrorlist does not work for you, you can try the commented out # baseurl line instead. [appstream] name=Rocky Linux $releasever - AppStream #mirrorlist=https://mirrors.rockylinux.org/mirrorlist?arch=$basearch&repo=AppStream-$releasever baseurl=http://10.222.0.21/$contentdir/$releasever/AppStream/$basearch/os/ gpgcheck=1 enabled=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial Repeat for /etc/yum.repos.d/Rocky-BaseOS.repo and any other branches you've included and will use from your local mirror.