#!/bin/bash
echo "=================================================================================="
echo "Check if the system is freshly installed before doing anything else, because we don't want to run the installation script twice ..."
if [ -d /etc/ag ]; then
echo "It seems this script has already been executed on this server."
echo "This script should be run only once as otherwise it will duplicate entries in number of configuration files!"
exit 0
fi
SECONDS=0
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Setting cron job definitions before other scripts start puting their own lines..."
cd /var/spool/cron/
rm -f root
cat > root << 'EOF'
# Example of cron job definition on AltaGrade servers:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
#
# 1. Entry: Minute when the process will be started [0-60]
# 2. Entry: Hour when the process will be started [0-23]
# 3. Entry: Day of the month when the process will be started [1-28/29/30/31]
# 4. Entry: Month of the year when the process will be started [1-12]
# 5. Entry: Weekday when the process will be started [0-6] [0 is Sunday]
#
# every x min = */x
# So according to this your 5 8 * * 6 would run 8:05 every Saturday.
# Ex: 39 * * * * wget -O - -q -t 1 http://YourDrupalSite.com/cron.php?key=YourDrupalSiteCronKeyHere
EOF
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Upgrading the system, installing nano and creating AltaGrade working directories..."
yum -y makecache fast && yum -y install yum-plugin-fastestmirror
yum -y update && yum -y install nano
mkdir /etc/ag && cd /etc/ag && mkdir scripts cp
mkdir /sandbox /home/backup /home/backup/ag
ln -s /home/backup /backup
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing additional repositories..."
yum -y install epel-release && yum -y update
cat > /etc/yum.repos.d/AltaGrade.repo << 'EOF'
[altagrade]
name=AltaGrade Repository
baseurl=http://repo.altagrade.org:8080
enabled=1
gpgcheck=0
EOF
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing useful OS packages..."
yum -y install perl nano rsync make vim screen wget mlocate gcc pcre-devel nmap openssh-clients ImageMagick gcc-c++ bzip2 net-tools iptables-services ntpdate yum-cron perl-LWP-Protocol-https deltarpm patch lsof git psacct yum-utils bash-completion at e2fsprogs sudo libxml2-devel htop pam-devel perl-Authen-PAM
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Defining some variable values to use later in the installation script..."
if grep -q "QEMU" /proc/bus/input/devices; then
PORT=19759
else
PORT=19753
fi
export PORT
IP="$( ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' )"
IFACE=$(ip addr | grep $IP | awk '{print $NF}')
OWNER=""
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Creating a Welcome banner and MOTD..."
cat <> /etc/banner
▄▄▄ ▓▓▓ ▓▓▓█████▓ ▄▄▄ ▄████ ▓▓▀███ ▄▄▄ ▓█████▄ ▓█████
▒▓▓██▄ ▓██▒ ▓ ▓▓▒ ▓▒▒████▄ ▓▓▒ ▀█▒▓██ ▒ ▓█▒▒▓▓██▄ ▒▓▓▀ ██▌▓▓ ▀
▒▓▓ ▀█▄ ▒▓▓░ ▒ ▓██░ ▒░▒▓▓ ▀█▄ ▒▓▓░▄▄▄░▓▓▓ ░▄█ ▒▒▓▓ ▀█▄ ░██ █▌▒▓▓██
░██▄▄▄▄██ ▒▓▓░ ░ ▓██▓ ░ ░██▄▄▄▄██ ░▓█ ██▓▒▓▓▀▀█▄ ░██▄▄▄▄██ ░▓█▄ ▌▒▓█ ▄
▓█ ▓██▒░██████▒▒██▒ ░ ▓█ ▓██▒░▒▓███▀▒░██▓ ▒▓▓▒ ▓█ ▓██▒░▒████▓ ░▒████▒
▒▒ ▓▒█░░ ▒░▓ ░▒ ░░ ▒▒ ▓▒█░ ░▒ ▒ ░ ▒▓ ░▒▓░ ▒▒ ▓▒█░ ▒▒▓ ▒ ░░ ▒░ ░
▒ ▒▒ ░░ ░ ▒ ░ ░ ▒ ▒▒ ░ ░ ░ ░▒ ░ ▒░ ▒ ▒▒ ░ ░ ▒ ▒ ░ ░ ░
░ ▒ ░ ░ ░ ░ ▒ ░ ░ ░ ░░ ░ ░ ▒ ░ ░ ░ ░
░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░
EOT
cat <> /etc/motd
*****************************************************************************
* Welcome to AltaGrade Optimized Operating System! *
* *
* If you encounter any issues with the server, then please browse our Help *
* section on https://www.altagrade.com/help first. And if you couldn't find *
* any solution, then submit a support request at https://my.altagrade.com. *
* *
*****************************************************************************
EOT
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Setting %wheel group members passwordless sudoers..."
sed -ie 's/%wheel/#%wheel/' /etc/sudoers && sed -ie 's/# #%wheel/%wheel/' /etc/sudoers
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Define aliases for root user..."
cat >> /root/.bashrc << 'EOF'
alias webminpass='/usr/libexec/webmin/changepass.pl /etc/webmin root'
alias ps10='ps -auxf | sort -nr -k 4 | head -10'
alias cpu10='ps -eo pcpu,pid,user,args | sort -k 1 -r | head -10'
alias qchwr='drush pml --no-core --type=module --status=enabled --pipe | xargs drush -y dis'
alias repo='sed -n -e "/^\[/h; /priority *=/{ G; s/\n/ /; s/ity=/ity = /; p }" /etc/yum.repos.d/*.repo | sort -k3n'
alias psx="ps -eo pcpu,pid -o comm= | sort -k1 -n -r | head -12"
alias psg="ps fuxa |grep $1"
alias psm="ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less"
alias eba='nano /etc/profile.d/globaliases.sh'
alias lba='source /etc/profile.d/globaliases.sh'
alias net1='rm -rf /etc/udev/rules.d/70-persistent-net.rules'
alias net2='nano /etc/resolv.conf'
alias net3='nano /etc/sysconfig/network-scripts/ifcfg*'
snd () {
rsync --rsh -av -e 'ssh -p 19759' --progress --partial ${1} root@IP:/
}
# sync two directories
# rsync -azP -e 'ssh -p 19759' local_dir root@IP:/remote_dir
EOF
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Creating global aliases for user SSH sessions......"
cat > /etc/profile.d/globaliases.sh << 'EOT'
EOT
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Colorify the Nano editor..."
sed -ie 's|# include "/usr/share/nano/sh.nanorc"|include "/usr/share/nano/sh.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/java.nanorc"|include "/usr/share/nano/java.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/python.nanorc"|include "/usr/share/nano/python.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/patch.nanorc"|include "/usr/share/nano/patch.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/php.nanorc"|include "/usr/share/nano/php.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/c.nanorc"|include "/usr/share/nano/c.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/css.nanorc"|include "/usr/share/nano/css.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/html.nanorc"|include "/usr/share/nano/html.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/man.nanorc"|include "/usr/share/nano/man.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/perl.nanorc"|include "/usr/share/nano/perl.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/ruby.nanorc"|include "/usr/share/nano/ruby.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/xml.nanorc"|include "/usr/share/nano/xml.nanorc"|' /etc/nanorc
sed -ie 's|# include "/usr/share/nano/nanorc.nanorc"|include "/usr/share/nano/nanorc.nanorc"|' /etc/nanorc
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Enabling Audit Trail..."
systemctl enable psacct && systemctl start psacct
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Enabling automatic OS updates..."
sed -ie 's/update_messages = no/update_messages = yes/' /etc/yum/yum-cron.conf
sed -ie 's/download_updates = no/download_updates = yes/' /etc/yum/yum-cron.conf
sed -ie 's/apply_updates = no/apply_updates = yes/' /etc/yum/yum-cron.conf
#chattr +i /etc/yum/yum-cron.conf
sed -ie 's/update_messages = no/update_messages = yes/' /etc/yum/yum-cron-hourly.conf
sed -ie 's/download_updates = no/download_updates = yes/' /etc/yum/yum-cron-hourly.conf
sed -ie 's/apply_updates = no/apply_updates = yes/' /etc/yum/yum-cron-hourly.conf
#chattr +i /etc/yum/yum-cron-hourly.conf
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Setting amount of installed kernels to 2..."
sed -ie 's/installonly_limit=5/installonly_limit=2/' /etc/yum.conf
systemctl enable yum-cron.service && systemctl start yum-cron.service
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing Webmin and Virtualmin..."
cd /usr/src
wget http://software.virtualmin.com/gpl/scripts/install.sh
chmod 755 install.sh
# Per https://www.virtualmin.com/node/53190
DISABLE_SCL=1
export DISABLE_SCL
./install.sh -y
#yum -y install wbm-virtualmin-password-recovery
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing style.css file for Virtualmin..."
cat > /etc/webmin/authentic-theme/styles.css << 'EOT'
EOT
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Configuring Webmin and Virtualmin..."
rm -rf /etc/webmin/status/services
sed -ie 's/php_suexec=3/php_suexec=2/' /etc/webmin/virtual-server/config
sed -ie 's/nopwd=0/nopwd=1' /etc/webmin/mysql/config
echo "Declaring global variables for PORT and DEFAULT_IP..."
echo "PORT ${PORT}" > /etc/webmin/virtual-server/globals
echo "DEFAULT_IP 1" >> /etc/webmin/virtual-server/globals
chkconfig usermin off
echo "webmin_from=root" >> /etc/webmin/mailboxes/config
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Creating an 'altagrade' admin user..."
useradd -G wheel altagrade
echo "yik78Fv,ag" | passwd altagrade --stdin
sed -ie 's/root: /altagrade: /' /etc/webmin/webmin.acl
sed -ie 's/root:/altagrade:/' /etc/webmin/miniserv.users
mkdir /home/altagrade/.ssh
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC753VZbicoElj5moS0XZ70ERwse483Cuqc6Jf3YXJvn4+ZGzdjUsUI4+0GHK0aufeFh4YNZQ9QoQnM/3HUKZIGm3/2lYvzY1Z2YtyWz57LSX6o+oskq01Pe+3g+sxbt1yOW/KhClVhTSNzFPtMV5h4//JLxdO1Z6pctXSgq2COZ9fnEAm/AzmYFpuNvg0JmNdWuFkvnSKZrkt9hmw72TTjTE+p9DviTmoq4GCr6l2Pg4y6oTlyQ595yi6wDZe0JK7cdkKMsA4U6kAyHqci7zXOu7HjLdYcKZCohCp/iddHZbERmlZuS1eGbiARYtBZb9FNdUmnUB3nggb4DU3FPeDl' >> /home/altagrade/.ssh/authorized_keys
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC4K7QPiD9EbzJDXN9xcfloD6NL6T4hUDmfe3/5lqVgBkiFUr1Npq5R+KE6DyCxu6HC3Yiowf4Ju32e6W66Ke4smcPQSsAPKUjtzm59IB8Ngt8z/iDlsPj66Wonq9TqIVjuKsol2R8J8LvwybmaheuAr6Hccsw2pdUwkh1KZiJOmPwiP5Rm2ekCJ8kUTED45zQrXEuv3q4Mszec6Kt5r0Y8qHfGzNDE4xgCRofNmK55l6WclC36ZZdYRrNt+1btFM10VqwtWUX3OJtumfPYKmzhWGGpBlBk9rbxCjXdSIiGSjJEO+9nzlsWZo0TfThs6T/DqmMSkCMsVu3jb9cms2qT altagrade@vpn.altagrade.net' >> /home/altagrade/.ssh/authorized_keys
restorecon -R -v /home/altagrade/.ssh
sed -i "s/#Port 22/Port ${PORT}/g" /etc/ssh/sshd_config
sed -i "s/#PermitRootLogin yes/PermitRootLogin no/g" /etc/ssh/sshd_config
sed -i "s/PasswordAuthentication yes/PasswordAuthentication no/g" /etc/ssh/sshd_config
echo 'Banner /etc/banner' >> /etc/ssh/sshd_config
yum -y install policycoreutils-python
semanage port -a -t ssh_port_t -p tcp ${PORT}
yum -y remove policycoreutils-python setools-libs python-IPy checkpolicy libsemanage-python audit-libs-python
systemctl restart sshd
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Renaming Webmin modules..."
cat > /etc/webmin/webmin.descs<< 'EOF'
bandwidth=Traffic Monitoring
webmin=Host Manager Configuration
servers=Host Manager Servers
webminlog=Host Manager Log
acl=Host Manager Users
virtualmin-registrar=Site Manager Domain Registration
virtualmin-dav=Site Manager DAV
virtualmin-init=Site Manager Bootup Actions
virtualmin-git=Site Manager Git
virtualmin-htpasswd=Site Manager Protected Directories
virtualmin-sqlite=Site Manager SQLite
virtual-server=Site Manager Domains
usermin=User Manager Configuration
EOF
# Per https://www.virtualmin.com/node/43097
rm -rf /var/webmin/module.infos.cache
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Temporary step until https://www.virtualmin.com/node/56959 is resolved..."
sed -ie "s/nopwd=0/nopwd=1/" /etc/webmin/mysql/config
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing custom menu for SSL certificate selection..."
mkdir /etc/ag/custom-menus
cd /etc/ag/custom-menus
cat > ssl.menu << 'EOF'
ssl_self Self-signed SSL Certificate
ssl_le Let's Encrypt SSL Certificate
ssl_commercial Commercial SSL Certificate
EOF
cat > app.menu << 'EOF'
drupal8 Drupal 8
drupal7 Drupal 7
backdrop Backdrop
wordpress Wordpress
other Other
EOF
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing Composer globally..."
cd /usr/src
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing additional PHP packages, memcached, configuring uploadprogress..."
yum -y install php-soap php-devel php-pear php-gd php-mbstring php-mcrypt
pecl channel-update pecl.php.net
pecl install uploadprogress
echo extension=uploadprogress.so >> /etc/php.d/uploadprogress.ini
yum -y install memcached
yum -y install php-pecl-memcache
rm -f /etc/sysconfig/memcached
cat <<'EOT' >> /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="1024"
OPTIONS="-l 127.0.0.1"
EOT
systemctl enable memcached
systemctl start memcached
sed -ie 's/upload_max_filesize = 2M/upload_max_filesize = 20M/' /etc/php.ini
sed -ie 's/post_max_size = 8M/post_max_size = 16M/' /etc/php.ini
sed -ie 's/max_execution_time = 30/max_execution_time = 600/' /etc/php.ini
sed -ie 's/max_input_time = 60/max_input_time = 600/' /etc/php.ini
sed -ie 's/memory_limit = 128M/memory_limit = 1280M/' /etc/php.ini
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Configuring the correct SSLProtocol entries in Apache configuration file..."
sed -ie '/SSLProtocol/c\SSLProtocol All -SSLv2 -SSLv3' /etc/httpd/conf/httpd.conf
sed -ie '/SSLCipherSuite/c\SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"' /etc/httpd/conf/httpd.conf
sed -ie '/SSLCipherSuite/i\SSLHonorCipherOrder on' /etc/httpd/conf/httpd.conf
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Configuring automatic core updates for Drupal websites..."
cat > /etc/ag/scripts/update-drupal << 'EOT'
EOT
chmod 755 /etc/ag/scripts/update-drupal
ln -s /etc/ag/scripts/update-drupal /usr/local/sbin/update-drupal
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Configuring Let's Encrypt per https://certbot.eff.org/lets-encrypt/centosrhel7-apache..."
yum -y install certbot
# Install script to auto-replace the ssl_le.pem files for domains
mkdir /etc/letsencrypt/renewal-hooks
mkdir /etc/letsencrypt/renewal-hooks/deploy
cat > /etc/letsencrypt/renewal-hooks/deploy/replace_pems.sh << 'EOF'
#!/bin/sh
# Re-create the ssl_le.pem files for Pound
for domain in $RENEWED_DOMAINS; do
cat $RENEWED_LINEAGE/privkey.pem $RENEWED_LINEAGE/fullchain.pem > $RENEWED_LINEAGE/ssl_le.pem
done
systemctl restart httpd
systemctl restart varnish
systemctl restart pound
exit
EOF
chmod 755 /etc/letsencrypt/renewal-hooks/deploy/replace_pems.sh
# Install script to auto-renew all certificates
cat > /etc/ag/scripts/renew-certs << 'EOF'
#!/bin/bash
# Create a temporary file for STDERR
ERROR_LOG=$(mktemp)
# Renew, ignoring STDOUT and piping STDERR to the temp file
/usr/bin/certbot renew --quiet > /dev/null 2> "$ERROR_LOG"
if [[ -s "$ERROR_LOG" ]]; then
mail -s "certbot Renewal Issue" root < "$ERROR_LOG"
fi
rm -rf "$ERROR_LOG"
exit
EOF
chmod 755 /etc/ag/scripts/renew-certs
# Install cron-tab to trigger auto-renew
(crontab -l && echo "0 0,12 * * 7 python -c 'import random; import time; time.sleep(random.random() * 3600)' && /etc/ag/scripts/renew-certs" | sort | uniq) | crontab -
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Configuring hourly and daily AltaGrade cron-tasks..."
cat > /etc/cron.hourly/altagrade << 'EOF'
#!/bin/bash
sh /etc/ag/scripts/update-drupal 1 > /dev/null
exit
EOF
chmod 755 /etc/cron.hourly/altagrade
cat > /etc/cron.daily/altagrade << 'EOF'
#!/bin/bash
sed -ie 's/CentOS/AltaOS/' /etc/webmin/config >/dev/null 2>&1
sed -ie 's/slider_enabled=true/slider_enabled=false/' /etc/webmin/authentic-theme/settings.js >/dev/null 2>&1
exit
EOF
chmod 755 /etc/cron.daily/altagrade
/etc/cron.daily/altagrade
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Creating script to check if logged user is authorized or not..."
cat > /etc/ag/scripts/login-notify.sh << 'EOF'
#!/bin/sh
if [ "$PAM_TYPE" != "close_session" ]; then
if [ -f /etc/apf/allow_hosts.rules ]; then
IP=`who | cut -d"(" -f2 | cut -d")" -f1`
if ! grep -q "$IP" /etc/apf/allow_hosts.rules; then
HOST="`hostname`"
SUBJECT="Security Alert: $PAM_USER logged into $host from unauthorized $PAM_RHOST"
# message="`env`"
MESSAGE="A user $PAM_USER has opened $PAM_TTY session on $HOST from an unauthorized IP address $PAM_RHOST. If the IP address does not belong to your team, then investigate this incident as soon as possible, otherwise please get it whitelisted to avoid receiving this notifications in the future."
echo "$MESSAGE" | mailx -r root -s "$SUBJECT" "info@altagrade.com"
fi
fi
fi
EOF
chmod 755 /etc/ag/scripts/login-notify.sh
echo 'session optional pam_exec.so seteuid /etc/ag/scripts/login-notify.sh' >> /etc/pam.d/sshd
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Configuring MariaDB settings..."
rm -f /etc/my.cnf
cat > /etc/my.cnf << 'EOF'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
#skip-networking
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
slow_query_log = 1
slow_query_log_file = /var/log/mariadb/slow.log
query_cache_size = 128M
query_cache_limit = 16M
thread_cache_size = 8
myisam_sort_buffer_size = 64M
read_rnd_buffer_size = 8M
read_buffer_size = 2M
sort_buffer_size = 2M
table_cache = 512
max_allowed_packet=1024M
key_buffer = 384M
wait_timeout=600
max_connections = 600
tmp_table_size = 256M
max_heap_table_size = 256M
innodb_large_prefix=true
innodb_file_format=barracuda
innodb_file_per_table = true
innodb_additional_mem_pool_size = 16M
innodb_flush_log_at_trx_commit = 0
innodb_log_buffer_size = 8M
innodb_buffer_pool_size = 1G
innodb_thread_concurrency = 16
innodb_lock_wait_timeout = 120
innodb_data_file_path = ibdata1:10M:autoextend
innodb_file_io_threads = 4
innodb_max_dirty_pages_pct = 90
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
EOF
echo '* soft nofile 65535' >> /etc/security/limits.conf
echo '* hard nofile 65535' >> /etc/security/limits.conf
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Setting the database root password..."
yum install -y expect
MYSQL_ROOT_PASSWORD=`date +%s | sha256sum | base64 | head -c 16 ; echo`
SECURE_MYSQL=$(expect -c "
set timeout 3
spawn mysql_secure_installation
expect \"Enter current password for root (enter for none):\"
send \"$CURRENT_MYSQL_PASSWORD\r\"
expect \"Set root password?\"
send \"y\r\"
expect \"New password:\"
send \"$MYSQL_ROOT_PASSWORD\r\"
expect \"Re-enter new password:\"
send \"$MYSQL_ROOT_PASSWORD\r\"
expect \"Remove anonymous users?\"
send \"y\r\"
expect \"Disallow root login remotely?\"
send \"y\r\"
expect \"Remove test database and access to it?\"
send \"y\r\"
expect \"Reload privilege tables now?\"
send \"y\r\"
expect eof
")
echo "$SECURE_MYSQL"
yum remove -y expect
if grep -q pass= /etc/webmin/mysql/config; then
sed -i "/pass=/c\pass=$MYSQL_ROOT_PASSWORD" /etc/webmin/mysql/config
else
echo pass=$MYSQL_ROOT_PASSWORD >> /etc/webmin/mysql/config
fi
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Configuring Apache..."
sed -ie 's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf
echo 'RemoteIPHeader X-Forwarded-For' >> /etc/httpd/conf/httpd.conf
echo "RemoteIPInternalProxy $IP" >> /etc/httpd/conf/httpd.conf
sed -ie 's/%h/%a/' /etc/httpd/conf/httpd.conf
# per https://support.plesk.com/hc/en-us/articles/213399589-Websites-are-slow-and-a-warning-appears-in-logs-mod-fcgid-ap-pass-brigade-failed
echo 'FcgidMaxRequestsPerProcess 500' >> /etc/httpd/conf.d/fcgid.conf
echo 'FcgidOutputBufferSize 0' >> /etc/httpd/conf.d/fcgid.conf
sed -ie 's|LoadModule|#LoadModule|' /etc/httpd/conf.modules.d/00-dav.conf
sed -ie 's|LoadModule|#LoadModule|' /etc/httpd/conf.modules.d/10-php.conf
# Maybe we can turn the below ones off.
sed -ie 's/LoadModule proxy/#LoadModule proxy/' /etc/httpd/conf.modules.d/00-proxy.conf
sed -ie 's@#LoadModule proxy_module@LoadModule proxy_module@g' /etc/httpd/conf.modules.d/00-proxy.conf
sed -ie 's@#LoadModule proxy_fcgi_module@LoadModule proxy_fcgi_module@g' /etc/httpd/conf.modules.d/00-proxy.conf
sed -ie 's@LoadModule lbmethod_heartbeat@#LoadModule lbmethod_heartbeat@g' /etc/httpd/conf.modules.d/00-proxy.conf
systemctl restart httpd
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing PHP7..."
yum -y install scl-utils
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvhl http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum -y install php72 php72-php-mysqlnd php72-php-curl php72-php-simplexml php72-php-devel php72-php-gd php72-php-json php72-php-mcrypt php72-php-mbstring php72-php-opcache php72-php-pear php72-php-pecl-apcu php72-php-pecl-geoip php72-php-pecl-imagick php72-php-pecl-json-post php72-php-pecl-memcache php72-php-pecl-zip php72-php-pspell php72-php-soap php72-php-xml php72-php-xmlrpc php72-php-pecl-uploadprogress php72-php-imap php72-php-pecl-xmldiff php72-php-bcmath
source /opt/remi/php72/enable
yum -y install php72-php-tidy
pear channel-update pear.php.net
pear install Cache_Lite
sed -ie 's/upload_max_filesize = 2M/upload_max_filesize = 20M/' /etc/opt/remi/php72/php.ini
sed -ie 's/post_max_size = 8M/post_max_size = 16M/' /etc/opt/remi/php72/php.ini
sed -ie 's/max_execution_time = 30/max_execution_time = 600/' /etc/opt/remi/php72/php.ini
sed -ie 's/max_input_time = 60/max_input_time = 600/' /etc/opt/remi/php72/php.ini
sed -ie 's/memory_limit = 128M/memory_limit = 1280M/' /etc/opt/remi/php72/php.ini
yum -y install php73 php73-php-mysqlnd php73-php-curl php73-php-simplexml php73-php-devel php73-php-gd php73-php-json php73-php-mcrypt php73-php-mbstring php73-php-opcache php73-php-pear php73-php-pecl-apcu php73-php-pecl-geoip php73-php-pecl-imagick php73-php-pecl-json-post php73-php-pecl-memcache php73-php-pecl-zip php73-php-pspell php73-php-soap php73-php-xml php73-php-xmlrpc php73-php-pecl-uploadprogress php73-php-imap php73-php-pecl-xmldiff php73-php-bcmath
source /opt/remi/php73/enable
yum -y install php73-php-tidy
pear channel-update pear.php.net
pear install Cache_Lite
sed -ie 's/upload_max_filesize = 2M/upload_max_filesize = 20M/' /etc/opt/remi/php73/php.ini
sed -ie 's/post_max_size = 8M/post_max_size = 16M/' /etc/opt/remi/php73/php.ini
sed -ie 's/max_execution_time = 30/max_execution_time = 600/' /etc/opt/remi/php73/php.ini
sed -ie 's/max_input_time = 60/max_input_time = 600/' /etc/opt/remi/php73/php.ini
sed -ie 's/memory_limit = 128M/memory_limit = 1280M/' /etc/opt/remi/php73/php.ini
sed -ie 's/disable_functions =/disable_functions = pcntl_exec/' /etc/opt/remi/php73/php.ini
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing drush and wp-cli..."
# Installing drush
wget https://github.com/drush-ops/drush/releases/download/8.1.16/drush.phar
php drush.phar core-status
chmod +x drush.phar
mv drush.phar /usr/local/bin/drush
drush -y init
# Fixing https://github.com/drush-ops/drush/issues/2065
sed -i '/disable_functions/c\disable_functions = pcntl_exec' /etc/php.ini
sed -i '/disable_functions/c\disable_functions = pcntl_exec' /etc/opt/remi/php70/php.ini
# Installing wp-cli
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
mv wp-cli.phar /usr/local/bin/wp
if [ ! -d /etc/ag ]; then
mkdir /etc/ag
fi
#mkdir /etc/ag/wp
#cd /etc/ag/wp
#wget https://raw.githubusercontent.com/wp-cli/wp-cli/v1.5.1/utils/wp-completion.bash
#chmod 755 wp-completion.bash
#echo "source /etc/ag/wp/wp-completion.bash" >> /etc/profile.d/globaliases.sh
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Setting the time zone to UTC and synchronizing the time..."
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/UTC /etc/localtime
echo "timeserver=pool.ntp.org" >> /etc/webmin/time/config
cd /etc/webmin/webmincron/crons/
cat >150338373415549.cron<< 'EOF'
disabled=0
hours=11,14
days=*
mins=0,52
boot=1
id=150338373415549
weekdays=*
func=sync_time_cron
months=*
module=time
EOF
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Customizing the control panel..."
cd /etc/ag/cp/
cat > new-etc.sh << 'EOF'
#!/bin/sh
# This script generates a compressed archive of /etc/webmin/authentic-theme and /etc/webmin/custom directories
# and also all language files.
mv etc.tar.gz etc.tar.gz-compare-and-delete
locate custom-lang | tar -cvf etc.tar -T -
tar -uvf etc.tar /etc/webmin/authentic-theme /etc/webmin/custom /etc/webmin/status/services /etc/webmin/webmin.descs
gzip etc.tar
clear
ls -l
EOF
chmod 755 new-etc.sh
cat > /etc/ag/cp/new-lang.sh << 'EOT'
EOT
chmod 755 new-lang.sh
cat > READ.ME << 'EOF'
Update the array in /etc/ag/cp/new-lang.sh and run the script if new UI terms need to be translated.
EOF
/etc/ag/cp/new-etc.sh
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Disabling slider for Authentic Theme..."
rm -rf /etc/webmin/authentic-theme
mkdir /etc/webmin/authentic-theme
cd /etc/webmin/authentic-theme
cat > settings.js << 'EOF'
settings_side_slider_enabled=false;
settings_right_default_tab_usermin='mail';
settings_right_default_tab_webmin='virtualmin';
settings_sysinfo_theme_updates=true;
settings_sysinfo_theme_patched_updates=false;
EOF
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Adapting Virtualmin and Webmin jargon for cPanel users..."
sh /etc/ag/cp/new-lang.sh
sed -i 's/bandwidth /traffic /g' /etc/webmin/virtual-server/bw-template
sed -i 's/bandwidth /traffic /g' /etc/webmin/virtual-server/warnbw-template
sed -i 's/Bandwidth /Traffic /g' /etc/webmin/virtual-server/bw-template
sed -i 's/Bandwidth /Traffic /g' /etc/webmin/virtual-server/warnbw-template
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Setting up skeleton directory..."
mkdir /etc/ag/skel
cd /etc/ag/skel
if [ -d "public_html" ]; then
rm -rf public_html
fi
mkdir patches sandbox public_html
ln -s public_html www
cd /etc/ag/skel/public_html
cat > index.php << 'EOF'
301) {
$txtcolor="#000000";
} else {
$txtcolor="#ffffff";
}
return $txtcolor;
}
$txtcolor=brightness($bgcolor);
$text = "Time: $date
";
$text .= "Background color: #$bgcolor
";
$suffix = "Compare different versions of the same page:
AltaCache at $protocol
AltaCache through SSL termination at $ssl
Apache version at $protocol:8080
";
if ($port == "8080") {
$prefix = "Uncached page with the background color and current time changing
on page refresh.
";
} else {
$prefix = "Cached page, so the background color and time captured won't change
on page refresh.
Expires in 24 hours unless AltaCache is restarted sooner.
";
}
?>
AltaGrade Demo
EOF
cd /etc/ag/skel/patches
cat > PATCHES.TXT << 'EOF'
You can place any information about patches of your website below.
EOF
cd /etc/ag/skel
cat > BEST-PRACTICES.TXT << 'EOF'
Your AltaGrade server is configured to take regular backups of all websites'
home directories. Therefore placing large archive or database dump files within
the home directories make backup process very slow and often times cause errors.
It also negatively effects the overall performance of your server and hosted
the websites. That is why it is in your own best interest to keep the home
directories and document roots of your websites clean and tidy.
Ideally a typical home directory on a AltaGrade server should contain only this
text file and the following directories:
***
cgi-bin
domains
etc
fcgi-bin
logs
Maildir
patches
public_html
sandbox
ssl
tmp
usermails
www -> public_html
***
We recommend to place all non-standard or temporary files in the 'sandbox'
directory, which is excluded from automatic backups.
If you have further questions on how to organize your files, please open a
ticket on https://my.altagrade.com.
EOF
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Giving sudo user an admin privilege for Webmin..."
yum -y install "perl(IO::Pty)"
echo "sudo=1" >> /etc/webmin/miniserv.conf
passwd -d root
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing and configuring Pound..."
sed -i '/Listen/c\#Listen' /etc/httpd/conf.d/ssl.conf
yum -y install Pound && systemctl enable pound && systemctl start pound
mv /etc/pound.cfg /etc/pound.cfg.orig
cat > /etc/pound.cfg << EOF
ListenHTTP
Address ${IP}
Port 80
Service
URL "/.well-known/acme-challenge/.*"
BackEnd
Address ${IP}
Port 8888
End
End
End
Service
BackEnd
Address ${IP}
Port 8888
End
End
EOF
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing and configuring Varnish..."
yum -y install varnish && systemctl enable varnish && systemctl start varnish
sed -ie 's/VARNISH_LISTEN_PORT=6081/VARNISH_LISTEN_PORT=8888/' /etc/varnish/varnish.params
echo 'DAEMON_OPTS="-p default_ttl=2419200"' >> /etc/varnish/varnish.params
# Configure Apache for Varnish
sed -ie 's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf
echo 'RemoteIPHeader X-Forwarded-For' >> /etc/httpd/conf/httpd.conf
echo "RemoteIPInternalProxy $IP" >> /etc/httpd/conf/httpd.conf
sed -ie 's/%h/%a/' /etc/httpd/conf/httpd.conf
cat > /etc/varnish/default.vcl << 'EOT'
EOT
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Generating pre.sh file..."
cat > /etc/ag/scripts/pre.sh << 'EOF'
#!/bin/sh
exit 0
EOF
chmod 755 /etc/ag/scripts/pre.sh
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Generating post.sh file..."
cat > /etc/ag/scripts/post.sh << 'EOT'
EOT
chmod 755 /etc/ag/scripts/post.sh
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Disabling the port mapping service and installing Advanced Policy Firewall..."
# per https://superuser.com/questions/1083882/block-port-111-on-centos-7
systemctl stop rpcbind.socket && systemctl disable rpcbind.socket
systemctl mask fail2ban && systemctl stop fail2ban
systemctl mask firewalld && systemctl stop firewalld
systemctl enable iptables && systemctl start iptables
cd /usr/src
wget http://www.rfxn.com/downloads/apf-current.tar.gz
tar xzf apf-current.tar.gz
rm -f apf-current.tar.gz
cd apf*
./install.sh
chkconfig apf on
sed -ie "s/eth0/$IFACE/" /etc/apf/conf.apf
sed -ie 's/DEVEL_MODE="1"/DEVEL_MODE="0"/' /etc/apf/conf.apf
sed -ie 's/SET_MONOKERN="0"/SET_MONOKERN="1"/' /etc/apf/conf.apf
sed -ie 's/ICMP_LIM="30\/s"/ICMP_LIM="100\/s"/' /etc/apf/conf.apf
sed -ie 's/DLIST_PHP="0"/DLIST_PHP="1"/' /etc/apf/conf.apf
sed -ie 's/DLIST_SPAMHAUS="0"/DLIST_SPAMHAUS="1"/' /etc/apf/conf.apf
sed -ie 's/DLIST_DSHIELD="0"/DLIST_DSHIELD="1"/' /etc/apf/conf.apf
sed -ie 's/IG_TCP_CPORTS=/#IG_TCP_CPORTS=/' /etc/apf/conf.apf
sed -ie 's/IG_UDP_CPORTS=/#IG_UDP_CPORTS=/' /etc/apf/conf.apf
sed -i '2s/^/IG_UDP_CPORTS="53,123,465,587,953,2525,6277,1043,6081,6082,8983"\n/' /etc/apf/conf.apf
sed -i "2s/^/IG_TCP_CPORTS="\"25,53,80,110,143,443,465,587,953,993,995,1043,2525,5900_5910,8079,8080,8888,8983,10000_10010,20000,${PORT}\""\n/" /etc/apf/conf.apf
apf -r
/usr/local/sbin/apf -a 65.49.80.104 "Do not remove this IP address. It belongs to AltaGrade."
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing and configuring Brute Force Detection..."
cd /usr/src
wget http://www.rfxn.com/downloads/bfd-current.tar.gz
tar xzf bfd-current.tar.gz
rm -f bfd-current.tar.gz*
cd bfd-1.5*
./install.sh
sed -ie 's/TRIG="15"/TRIG="5"/' /usr/local/bfd/conf.bfd
sed -ie 's/EMAIL_ALERTS="0"/EMAIL_ALERTS="1"/' /usr/local/bfd/conf.bfd
sed -ie 's/EMAIL_ADDRESS="root"/EMAIL_ADDRESS="security"/' /usr/local/bfd/conf.bfd
rm -f /usr/local/bfd/alert.bfd
echo 'EB=0' >> /usr/local/bfd/alert.bfd
echo 'if [ "$EMAIL_LOGLINES" == "" ]; then' >> /usr/local/bfd/alert.bfd
echo ' EMAIL_LOGLINES=50' >> /usr/local/bfd/alert.bfd
echo 'fi' >> /usr/local/bfd/alert.bfd
echo 'EV=`nice -n 19 tail -n 5000 $LP | grep $ATTACK_HOST | tail -n $EMAIL_LOGLINES`' >> /usr/local/bfd/alert.bfd
echo 'cat <> /usr/local/bfd/alert.bfd
echo '' >> /usr/local/bfd/alert.bfd
echo '$ATTACK_HOST has been blocked and blacklisted by AltaGrade for exceeded login failures on $HOSTNAME.' >> /usr/local/bfd/alert.bfd
echo "If the IP address belongs to your team, then please clear it from the firewall's block-list and add it allowed hosts." >> /usr/local/bfd/alert.bfd
echo 'Alternatively file a support request on https://my.altagrade.com and we will gladly do it for you.' >> /usr/local/bfd/alert.bfd
echo '' >> /usr/local/bfd/alert.bfd
echo 'SOURCE ADDRESS: $ATTACK_HOST' >> /usr/local/bfd/alert.bfd
echo 'TARGET SERVICE: $MOD' >> /usr/local/bfd/alert.bfd
echo 'FAILED LOGINS: $ATTACK_COUNT' >> /usr/local/bfd/alert.bfd
echo 'EXECUTED COMMAND: $BAN_COMMAND' >> /usr/local/bfd/alert.bfd
echo '' >> /usr/local/bfd/alert.bfd
echo "SOURCE LOGS FROM SERVICE '\$MOD' (GMT \$TIME_ZONE):" >> /usr/local/bfd/alert.bfd
echo '' >> /usr/local/bfd/alert.bfd
echo '$EV' >> /usr/local/bfd/alert.bfd
echo '' >> /usr/local/bfd/alert.bfd
echo '-----------------------------------------------' >> /usr/local/bfd/alert.bfd
echo 'AltaGrade Brute Force Detection System' >> /usr/local/bfd/alert.bfd
echo '' >> /usr/local/bfd/alert.bfd
echo 'EOF' >> /usr/local/bfd/alert.bfd
sed -ie 's/#root:/root:/' /etc/aliases
sed -ie 's/marc/info@altagrade.com/' /etc/aliases
echo "#owner: ${OWNER}" >> /etc/aliases
newaliases
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Installing Linux Malware Detect..."
wget http://www.rfxn.com/downloads/maldetect-current.tar.gz
tar xzf maldetect-current.tar.gz
rm -rf maldetect-current.tar.gz
cd maldetect*
./install.sh
# Installing inotify-tools per https://www.rfxn.com/appdocs/README.maldetect
yum -y install inotify-tools
# Configuring malware detection settings
sed -ie 's/email_alert="0"/email_alert="1"/' /usr/local/maldetect/conf.maldet
sed -ie 's/email_addr="you@domain.com"/email_addr="security"/' /usr/local/maldetect/conf.maldet
sed -ie 's/email_ignore_clean="1"/email_ignore_clean="0"/' /usr/local/maldetect/conf.maldet
sed -ie 's/quarantine_hits="0"/quarantine_hits="1"/' /usr/local/maldetect/conf.maldet
sed -ie 's/quarantine_clean="0"/quarantine_clean="1"/' /usr/local/maldetect/conf.maldet
sed -ie 's/quarantine_suspend_user="0"/quarantine_suspend_user="1"/' /usr/local/maldetect/conf.maldet
echo "/home/.*/public_html/stats" >> /usr/local/maldetect/ignore_paths
echo "/home/.*/domains/.*/public_html/stats" >> /usr/local/maldetect/ignore_paths
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Calculating execution time..."
duration=$SECONDS
executed="$(($duration / 60)) minutes and $(($duration % 60)) seconds"
echo "The installation took $executed"
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Removing unnecessary services and installing altagrade package...."
systemctl stop chronyd && yum -y remove chrony
systemctl stop fail2ban && yum -y remove fail2ban*
rm -rf /var/log/fail2ban.log
systemctl stop wpa_supplicant && yum -y remove wpa_supplicant
#yum -y install altagrade
chown -R root:bin /etc/webmin
systemctl restart webmin
echo "Done..."
echo "=================================================================================="
echo "=================================================================================="
echo "Sending the final e-mail notification..."
cd /
mv /usr/src/etc-ag.tgz .
tar -xjf etc-ag.tgz
yum -y install mailx
echo "Installation of AltaOS on ${HOSTNAME} completed in $executed. The system is rebooting..." | mail -s "AltaOS has been installed on ${HOSTNAME}" 6504506428@tmomail.net
rm -f /root/recipe1.sh
rm -f /usr/src/altaos-install.sh
updatedb
echo "Rebooting the system..."
reboot
echo "Done..."
echo "=================================================================================="
exit