#! /bin/bash

# skrip dasar ini dapat dijalankan pada VPS, penulis melakukan pada
# Google Cloud Platform dan Digital Ocean. Karena alasan keamanan beberapa
# perintah membutuhkan interaksi diantaranya:
# 1. Pembuatan sandi pengguna root dan deploy
# 2. Penyematan kunci publik (authorized_keys)
# 3. Konfirmasi untuk menjalankan ulang layanan sshd

# Rujukan pewarnaan
# http://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux
# HITAM='\033[0;30m'
# MERAH='\033[0;31m'
HIJAU='\033[0;32m'
# LILA='\033[0;33m'
# BIRU='\033[0;34m'
# JINGGA='\033[0;35m'
# SIAN='\033[0;36m'
# ABUTERANG='\033[0;37m'
# ABUGELAP='\033[1;30m'
# MERAHMUDA='\033[1;31m'
# HIJAUMUDA='\033[1;32m'
KUNGING='\033[1;33m'
# BIRUMUDA='\033[1;34m'
# JINGGAMUDA='\033[1;35m'
# SIANMUDA='\033[1;36m'
# PUTIH='\033[1;37m'
TW='\033[0m' # tanpa warna

echo -e "Uji warna ${HIJAU}hijau${TW} oleh BizTech"

# variabel kustomisasi
nonSudo="deploy"

## locale
echo -e "${HIJAU}Proses perbaikan locale..${TW}"
locale-gen --purge "en_US.UTF-8" \
  && locale-gen en_US.UTF-8 \
  && localedef -i en_US -f UTF-8 en_US.UTF-8
export LANGUAGE=en_US.UTF-8 \
  && export LANG=en_US.UTF-8 \
  && export LC_ALL=en_US.UTF-8
locale-gen en_US.UTF-8 \
  && dpkg-reconfigure locales --frontend=noninteractive
sed -e '/SendEnv/ s/^#*/#/' -i /etc/ssh/ssh_config
update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# pembaruan system awal
echo -e "${HIJAU}Memulai pembaruan system awal...${TW}"
apt update ; apt upgrade -y

# mengganti sandi root
echo -e "${HIJAU}Ubah kata sandi${TW} pengguna root!!!"
passwd

# menyesuiakan zona waktu lokal untuk server
echo -e "${HIJAU}Menyesuaikan zona waktu lokal untuk server${TW}"
timedatectl set-timezone Asia/Jakarta

## user:$nonSudo
# membuat pengguna $nonSudo
echo -e "${HIJAU}Membuat pengguna dan sandi bagi ${KUNGING}$nonSudo ${TW}"
adduser $nonSudo --gecos "First Last,Room Number,Work Phone,Home Phone,Other" --disabled-password
passwd $nonSudo
# menyiapkan direktori kunci publik untuk koneksi ke server
mkdir -p /home/$nonSudo/.ssh
chmod 700 /home/$nonSudo/.ssh
nano /home/$nonSudo/.ssh/authorized_keys
# mengamankan dan memberikan akses sudo tanpa kata sandi bagi pengguna deploy
chmod 400 /home/$nonSudo/.ssh/authorized_keys
chown $nonSudo:$nonSudo /home/$nonSudo -R
echo "$nonSudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/$nonSudo
usermod -a -G sudo $nonSudo

# instalasi paket yang akan dibutuhkan
echo -e "${HIJAU}Pembaruan sistem dan instalasi aplikasi dasar yang akan digunakan.${TW}"
apt update
apt-get install -y \
    apt-transport-https \
    curl \
    fail2ban \
    htop \
    git \
    screen \
    sudo \
    tree \
    ufw \
    unattended-upgrades \
    zsh

## unattended-upgrades (50unattended-upgrades)
# mencadangkan berkas pembaruan keamanan, dan membuat ulang dengan aturan baru
echo -e "${HIJAU}Instalasi layanan untuk pembaruan keamanan secara otomatis.${TW}"
mv /etc/apt/apt.conf.d/50unattended-upgrades{,.orig}
# touch /etc/apt/apt.conf.d/50unattended-upgrades
cat << EOF > /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Origins-Pattern {
  "origin=Debian,codename=\${distro_codename},label=Debian-Security";
};
Unattended-Upgrade::Mail "proxsis@brotak.xyz";
Unattended-Upgrade::MailOnlyOnError "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
Unattended-Upgrade::SyslogEnable "true";
EOF
#
echo -e "${HIJAU}Memuat ulang layanan ${KUNING}unattended-upgrades${TW}"
/etc/init.d/unattended-upgrades restart

## ufw
# menonaktifkan aturan untuk IP6, hanya untuk IP4 saja
echo -e "${HIJAU}Konfigurasi firewall UFW${TW}"
cp -v /etc/default/ufw{,.orig}
sed -i -r 's/^#?(IPV6|X11Forwarding)=yes/\1=no/' /etc/default/ufw
ufw allow 8022

## sshd
# mencegah penggunaan pengguna root, dan mencegah akses dengan kata sandi pada
# berkas /etc/ssh/sshd_config. Lalu menjalankan ulang layanan ssh.
echo -e "=== ${HIJAU}Konfigurasi pengaturan layanan SSH${TW} ==="
cp -v /etc/ssh/sshd_config{,.orig}
sed -i -r 's/^#?(PermitRootLogin|PermitEmptyPasswords|PasswordAuthentication|X11Forwarding) yes/\1 no/' /etc/ssh/sshd_config
sed -i -r 's/^#?(Port) 22/\1 8022/' /etc/ssh/sshd_config
/etc/init.d/ssh reload
#
ufw enable ; ufw reload

# membersihkan cache dan paket yang sudah tidak digunakan lagi beserta paket
# terkait lainnya
apt-get autoclean && apt-get autoremove -y && rm -rf /var/cache/apt/archives/
# exit

# shutdown -r now
