ubuntu_server_Initial_setup.sh
· 37 KiB · Bash
Raw
#!/bin/bash
# Ubuntu Server Initial Setup Script
# Автор: Fedya Serafiev
# Дата: 16 май 2025
# Версия: 2.1
#
# Този скрипт извършва основните задачи за първоначална настройка на Ubuntu Server
# Включва: актуализация на системата, настройка на защитна стена, инсталиране на полезни пакети,
# конфигуриране на SSH, създаване на нов потребител с административни права и базова защита
# Цветове за терминала
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
MAGENTA='\033[0;35m'
NC='\033[0m' # No Color
# Проверка за root привилегии
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}Този скрипт трябва да се изпълни като root потребител${NC}"
echo -e "${YELLOW}Моля, стартирайте го отново с: sudo $0${NC}"
exit 1
fi
# Функция за показване на прогрес
show_progress() {
echo -e "${BLUE}================================================${NC}"
echo -e "${GREEN}>>> $1${NC}"
echo -e "${BLUE}================================================${NC}"
}
# Функция за проверка на успех
check_success() {
if [ $? -eq 0 ]; then
echo -e "${GREEN}[УСПЕХ] $1${NC}"
else
echo -e "${RED}[ГРЕШКА] $2${NC}"
if [ "$3" = "exit" ]; then
exit 1
fi
fi
}
# Функция за пауза
pause() {
echo -e "${YELLOW}Натиснете Enter за да продължите...${NC}"
read -r
}
# Генериране на системна информация
generate_system_info() {
local hostname=$(hostname)
local ip_address=$(hostname -I | awk '{print $1}')
local date=$(date +"%Y-%m-%d %H:%M:%S")
local os_info=$(lsb_release -d | cut -f2-)
local kernel=$(uname -r)
local uptime=$(uptime -p)
echo -e "${CYAN}*************************************************************************${NC}"
echo -e "${MAGENTA} ВНИМАНИЕ!${NC}"
echo -e "${YELLOW} Този сървър е частна собственост. Неоторизираният достъп"
echo -e " е забранен и подлежи на наказателна отговорност."
echo -e " Всички действия се записват и следят.${NC}"
echo -e ""
echo -e "${GREEN} Системна информация:${NC}"
echo -e " * Хост: $hostname"
echo -e " * IP адрес: $ip_address"
echo -e " * Дата: $date"
echo -e " * ОС: $os_info"
echo -e " * Ядро: $kernel"
echo -e " * Uptime: $uptime"
echo -e "${CYAN}*************************************************************************${NC}"
}
# Задаване на времева зона (по подразбиране е Europe/Sofia)
set_timezone() {
show_progress "Настройка на времева зона на Europe/Sofia"
timedatectl set-timezone Europe/Sofia
check_success "Времевата зона е настроена" "Грешка при настройка на времева зона"
echo -e "${YELLOW}Текуща времева зона: $(timedatectl | grep "Time zone" | awk '{print $3}')${NC}"
}
# Актуализиране на системата
update_system() {
show_progress "Актуализиране на системните пакети"
echo -e "${YELLOW}Извършване на apt update...${NC}"
apt update -q
check_success "Репотарите са актуализирани" "Грешка при актуализация на репотарите"
echo -e "${YELLOW}Извършване на apt upgrade...${NC}"
DEBIAN_FRONTEND=noninteractive apt upgrade -y -q
check_success "Пакетите са обновени" "Грешка при обновяване на пакети"
echo -e "${YELLOW}Извършване на apt dist-upgrade...${NC}"
DEBIAN_FRONTEND=noninteractive apt dist-upgrade -y -q
check_success "Дистрибутивните обновления са приложени" "Грешка при dist-upgrade"
echo -e "${YELLOW}Извършване на apt autoremove...${NC}"
apt autoremove -y -q
apt autoclean -q
check_success "Излишните пакети са премахнати" "Грешка при премахване на излишни пакети"
}
# Инсталиране на основни пакети
install_essential_packages() {
show_progress "Инсталиране на полезни пакети"
# Основен списък с пакети
BASE_PACKAGES=(
curl wget vim git htop net-tools nmap tmux unzip zip
ufw fail2ban logwatch ncdu tree dnsutils bash-completion
apt-transport-https ca-certificates gnupg-agent software-properties-common
jq rsync screen iftop iotop lsof strace sysstat
)
# Инсталиране на основни пакети
echo -e "${YELLOW}Инсталиране на основни пакети...${NC}"
apt install -y -q "${BASE_PACKAGES[@]}"
check_success "Основните пакети са инсталирани" "Грешка при инсталиране на основни пакети"
# Допълнителни пакети за Docker (ако е нужно)
read -p "Искате ли да инсталирате Docker? (y/n): " -n 1 -r INSTALL_DOCKER
echo
if [[ $INSTALL_DOCKER =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}Инсталиране на Docker...${NC}"
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt update -q
apt install -y -q docker-ce docker-ce-cli containerd.io
check_success "Docker е инсталиран" "Грешка при инсталиране на Docker"
# Добавяне на текущия потребител към групата docker
if [ -n "$SUDO_USER" ]; then
usermod -aG docker $SUDO_USER
check_success "Потребителят $SUDO_USER е добавен към групата docker" "Грешка при добавяне към docker група"
fi
fi
# Допълнителни пакети за мониторинг
read -p "Искате ли да инсталирате пакети за мониторинг (cockpit, netdata)? (y/n): " -n 1 -r INSTALL_MONITORING
echo
if [[ $INSTALL_MONITORING =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}Инсталиране на cockpit...${NC}"
apt install -y -q cockpit
systemctl enable --now cockpit.socket
check_success "Cockpit е инсталиран и активиран" "Грешка при инсталиране на cockpit"
echo -e "${YELLOW}Инсталиране на netdata...${NC}"
bash <(curl -Ss https://my-netdata.io/kickstart.sh) --non-interactive
check_success "Netdata е инсталиран" "Грешка при инсталиране на netdata"
fi
}
# Конфигуриране на защитна стена (UFW)
configure_firewall() {
show_progress "Конфигуриране на защитната стена (UFW)"
# Разрешаване на SSH
ufw allow ssh
check_success "SSH портът е разрешен" "Грешка при разрешаване на SSH порт"
# Питане за разрешаване на други портове
read -p "Искате ли да разрешите HTTP трафик (порт 80)? (y/n): " -n 1 -r HTTP_RESPONSE
echo
if [[ $HTTP_RESPONSE =~ ^[Yy]$ ]]; then
ufw allow 80/tcp
check_success "HTTP трафик разрешен" "Грешка при разрешаване на HTTP порт"
fi
read -p "Искате ли да разрешите HTTPS трафик (порт 443)? (y/n): " -n 1 -r HTTPS_RESPONSE
echo
if [[ $HTTPS_RESPONSE =~ ^[Yy]$ ]]; then
ufw allow 443/tcp
check_success "HTTPS трафик разрешен" "Грешка при разрешаване на HTTPS порт"
fi
read -p "Искате ли да разрешите други портове? (y/n): " -n 1 -r OTHER_PORTS
echo
if [[ $OTHER_PORTS =~ ^[Yy]$ ]]; then
read -p "Въведете портове, разделени с интервал (напр. 8080 8443): " -a PORTS_ARRAY
for port in "${PORTS_ARRAY[@]}"; do
ufw allow "$port/tcp"
check_success "Порт $port/tcp е разрешен" "Грешка при разрешаване на порт $port"
done
fi
# Активиране на защитната стена
ufw --force enable
check_success "Защитната стена е активирана" "Грешка при активиране на защитната стена"
echo -e "${YELLOW}Текущ статус на защитната стена:${NC}"
ufw status verbose
}
# Конфигуриране на Fail2ban
configure_fail2ban() {
show_progress "Конфигуриране на Fail2ban за защита от brute-force атаки"
# Проверка дали fail2ban е инсталиран
if ! command -v fail2ban-server &> /dev/null; then
apt install -y -q fail2ban
check_success "Fail2ban е инсталиран" "Грешка при инсталиране на fail2ban"
fi
# Създаване на конфигурационен файл, ако не съществува
if [ ! -f /etc/fail2ban/jail.local ]; then
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
fi
# Добавяне на базова конфигурация
cat << EOF >> /etc/fail2ban/jail.local
# Потребителска конфигурация
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
ignoreip = 127.0.0.1/8 ::1
[sshd-ddos]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
findtime = 600
bantime = 86400
EOF
# Рестартиране на услугата
systemctl restart fail2ban
check_success "Fail2ban услугата е рестартирана" "Грешка при рестартиране на fail2ban"
systemctl enable fail2ban
check_success "Fail2ban е конфигуриран да се стартира автоматично" "Грешка при активиране на fail2ban"
echo -e "${YELLOW}Текущ статус на Fail2ban:${NC}"
fail2ban-client status
}
# Създаване на нов администраторски потребител
create_admin_user() {
show_progress "Създаване на нов потребител с sudo права"
read -p "Въведете име за новия потребител: " NEW_USER
# Проверка дали потребителят вече съществува
if id "$NEW_USER" &>/dev/null; then
echo -e "${YELLOW}Потребителят $NEW_USER вече съществува!${NC}"
read -p "Искате ли да добавите потребителя към групата sudo? (y/n): " -n 1 -r ADD_SUDO
echo
if [[ $ADD_SUDO =~ ^[Yy]$ ]]; then
usermod -aG sudo $NEW_USER
check_success "Потребителят $NEW_USER е добавен към групата sudo" "Грешка при добавяне към sudo група"
fi
else
# Създаване на потребителя
adduser --gecos "" $NEW_USER
check_success "Потребителят $NEW_USER е създаден" "Грешка при създаване на потребител"
# Добавяне към групата sudo
usermod -aG sudo $NEW_USER
check_success "Потребителят $NEW_USER е добавен към групата sudo" "Грешка при добавяне към sudo група"
# Настройка на SSH ключове за новия потребител
read -p "Искате ли да настроите SSH ключове за $NEW_USER? (y/n): " -n 1 -r SSH_KEY_RESPONSE
echo
if [[ $SSH_KEY_RESPONSE =~ ^[Yy]$ ]]; then
mkdir -p /home/$NEW_USER/.ssh
chmod 700 /home/$NEW_USER/.ssh
read -p "Въведете публичния SSH ключ: " SSH_KEY
echo $SSH_KEY > /home/$NEW_USER/.ssh/authorized_keys
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh
check_success "SSH ключът е добавен за потребителя $NEW_USER" "Грешка при добавяне на SSH ключ"
fi
fi
# Забрана за вход с парола за root и новия потребител
if [ -f /etc/ssh/sshd_config ]; then
sed -i "/^#*PermitRootLogin/c\PermitRootLogin prohibit-password" /etc/ssh/sshd_config
if grep -q "^#*PasswordAuthentication" /etc/ssh/sshd_config; then
sed -i "/^#*PasswordAuthentication/c\PasswordAuthentication no" /etc/ssh/sshd_config
else
echo "PasswordAuthentication no" >> /etc/ssh/sshd_config
fi
systemctl restart sshd
check_success "SSH конфигурацията е обновена" "Грешка при обновяване на SSH конфигурация"
fi
}
# Подобряване на конфигурацията на SSH
harden_ssh() {
show_progress "Подобряване на SSH конфигурацията"
# Създаване на резервно копие на SSH конфигурационния файл
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
check_success "Резервно копие на sshd_config е създадено" "Грешка при създаване на резервно копие"
# Настройки за по-добра сигурност
sed -i 's/#PermitRootLogin yes/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config
sed -i 's/#MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config
sed -i 's/#ClientAliveInterval 0/ClientAliveInterval 300/' /etc/ssh/sshd_config
sed -i 's/#ClientAliveCountMax 3/ClientAliveCountMax 0/' /etc/ssh/sshd_config
# Добавяне на допълнителни настройки за сигурност
if ! grep -q "^UsePAM" /etc/ssh/sshd_config; then
echo "UsePAM yes" >> /etc/ssh/sshd_config
fi
if ! grep -q "^PrintLastLog" /etc/ssh/sshd_config; then
echo "PrintLastLog yes" >> /etc/ssh/sshd_config
fi
if ! grep -q "^AllowAgentForwarding" /etc/ssh/sshd_config; then
echo "AllowAgentForwarding no" >> /etc/ssh/sshd_config
fi
if ! grep -q "^AllowTcpForwarding" /etc/ssh/sshd_config; then
echo "AllowTcpForwarding no" >> /etc/ssh/sshd_config
fi
read -p "Желаете ли да промените SSH порта? (y/n): " -n 1 -r CHANGE_PORT
echo
if [[ $CHANGE_PORT =~ ^[Yy]$ ]]; then
read -p "Въведете нов SSH порт (препоръчително > 1024): " NEW_SSH_PORT
# Проверка за валиден порт
if [[ "$NEW_SSH_PORT" =~ ^[0-9]+$ ]] && [ "$NEW_SSH_PORT" -ge 1 ] && [ "$NEW_SSH_PORT" -le 65535 ]; then
sed -i "s/#Port 22/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config
# Разрешаване на новия порт в защитната стена
ufw allow $NEW_SSH_PORT/tcp
ufw delete allow ssh
check_success "SSH портът е променен на $NEW_SSH_PORT" "Грешка при промяна на SSH порт"
echo -e "${YELLOW}ВАЖНО: Не затваряйте текущата SSH сесия, докато не проверите, че можете да се свържете на новия порт!${NC}"
else
echo -e "${RED}Невалиден порт. Пропускане на промяната.${NC}"
fi
fi
# Рестартиране на SSH услугата
systemctl restart sshd
check_success "SSH услугата е рестартирана" "Грешка при рестартиране на SSH"
}
# Настройка на автоматични актуализации
setup_automatic_updates() {
show_progress "Настройка на автоматични обновления"
apt install -y -q unattended-upgrades apt-listchanges
# Конфигуриране на автоматичните обновления
cat << EOF > /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Origins-Pattern {
"origin=Debian,codename=\${distro_codename}-updates";
"origin=Debian,codename=\${distro_codename}-proposed-updates";
"origin=Debian,codename=\${distro_codename},label=Debian";
"origin=Debian,codename=\${distro_codename},label=Debian-Security";
"origin=Ubuntu,codename=\${distro_codename}-updates";
"origin=Ubuntu,codename=\${distro_codename}-proposed-updates";
"origin=Ubuntu,codename=\${distro_codename},label=Ubuntu";
"origin=Ubuntu,codename=\${distro_codename},label=UbuntuESM";
"origin=Ubuntu,codename=\${distro_codename}-security";
};
Unattended-Upgrade::Package-Blacklist {
};
Unattended-Upgrade::DevRelease "false";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
EOF
# Активиране на автоматичните обновления
cat << EOF > /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
EOF
systemctl restart unattended-upgrades
check_success "Автоматичните обновления са конфигурирани" "Грешка при конфигуриране на автоматични обновления"
echo -e "${YELLOW}Текущ статус на автоматичните обновления:${NC}"
systemctl status unattended-upgrades.service --no-pager
}
# Настройка на swap файл (ако е необходимо)
configure_swap() {
show_progress "Проверка за swap пространство"
# Проверка на наличния swap
CURRENT_SWAP=$(free -m | awk '/^Swap:/ {print $2}')
TOTAL_MEM=$(free -m | awk '/^Mem:/ {print $2}')
RECOMMENDED_SWAP=$((TOTAL_MEM * 2))
if [ "$CURRENT_SWAP" -eq 0 ]; then
read -p "Няма конфигуриран swap. Искате ли да създадете swap файл? (y/n): " -n 1 -r CREATE_SWAP
echo
if [[ $CREATE_SWAP =~ ^[Yy]$ ]]; then
read -p "Въведете размер на swap файла в GB (рекомендация: $RECOMMENDED_SWAP MB за $TOTAL_MEM MB RAM): " SWAP_SIZE
# Създаване на swap файл
fallocate -l ${SWAP_SIZE}G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# Добавяне на swap файла в /etc/fstab
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# Настройка на swappiness
echo 'vm.swappiness=10' >> /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf
sysctl -p
check_success "Swap файл от ${SWAP_SIZE}GB е създаден и конфигуриран" "Грешка при създаване на swap файл"
fi
else
echo -e "${YELLOW}Системата вече има ${CURRENT_SWAP}MB swap пространство${NC}"
echo -e "${YELLOW}Обща RAM памет: ${TOTAL_MEM}MB${NC}"
echo -e "${YELLOW}Рекомендуван swap размер: ${RECOMMENDED_SWAP}MB${NC}"
read -p "Искате ли да промените swap настройките? (y/n): " -n 1 -r CHANGE_SWAP
echo
if [[ $CHANGE_SWAP =~ ^[Yy]$ ]]; then
read -p "Въведете нова стойност за vm.swappiness (по подразбиране 10): " SWAPPINESS
read -p "Въведете нова стойност за vm.vfs_cache_pressure (по подразбиране 50): " CACHE_PRESSURE
sed -i '/vm.swappiness/d' /etc/sysctl.conf
sed -i '/vm.vfs_cache_pressure/d' /etc/sysctl.conf
echo "vm.swappiness=$SWAPPINESS" >> /etc/sysctl.conf
echo "vm.vfs_cache_pressure=$CACHE_PRESSURE" >> /etc/sysctl.conf
sysctl -p
check_success "Swap настройките са променени" "Грешка при промяна на swap настройки"
fi
fi
}
# Настройка на NTP (Network Time Protocol)
configure_ntp() {
show_progress "Настройка на NTP за синхронизация на времето"
# Инсталиране на NTP
apt install -y -q chrony
# Конфигуриране на Chrony
cat << EOF > /etc/chrony/chrony.conf
pool ntp.ubuntu.com iburst
keyfile /etc/chrony/chrony.keys
driftfile /var/lib/chrony/chrony.drift
logdir /var/log/chrony
maxupdateskew 100.0
hwclockfile /etc/adjtime
rtcsync
makestep 1 3
EOF
# Рестартиране на услугата
systemctl restart chrony
check_success "Chrony услугата е рестартирана" "Грешка при рестартиране на chrony"
systemctl enable chrony
check_success "Chrony е конфигуриран да се стартира автоматично" "Грешка при активиране на chrony"
echo -e "${YELLOW}Текущ статус на NTP синхронизацията:${NC}"
chronyc tracking
chronyc sources
}
# Добавяне на основен банер
add_banner() {
show_progress "Добавяне на системен банер"
# Създаване на банер файл с динамична системна информация
cat << 'EOF' > /etc/issue.net
*************************************************************************
ВНИМАНИЕ!
Този сървър е частна собственост. Неоторизираният достъп
е забранен и подлежи на наказателна отговорност.
Всички действия се записват и следят.
Системна информация:
EOF
# Добавяне на динамична информация
echo " * Хост: $(hostname)" >> /etc/issue.net
echo " * IP адрес: $(hostname -I | awk '{print $1}')" >> /etc/issue.net
echo " * Дата: $(date +"%Y-%m-%d %H:%M:%S")" >> /etc/issue.net
echo " * ОС: $(lsb_release -d | cut -f2-)" >> /etc/issue.net
echo " * Ядро: $(uname -r)" >> /etc/issue.net
echo " * Uptime: $(uptime -p)" >> /etc/issue.net
echo "*************************************************************************" >> /etc/issue.net
# Активиране на банера в SSH
if grep -q "^#Banner" /etc/ssh/sshd_config; then
sed -i 's|^#Banner.*|Banner /etc/issue.net|' /etc/ssh/sshd_config
else
echo "Banner /etc/issue.net" >> /etc/ssh/sshd_config
fi
systemctl restart sshd
check_success "Системният банер е конфигуриран" "Грешка при конфигуриране на банер"
# Показване на банера
echo -e "${CYAN}Системният банер ще изглежда така:${NC}"
generate_system_info
}
# Настройка на базови sysctl параметри
configure_sysctl() {
show_progress "Настройка на базови системни параметри"
# Създаване на резервно копие
cp /etc/sysctl.conf /etc/sysctl.conf.bak
# Добавяне на параметри за подобрена сигурност и производителност
cat << EOF >> /etc/sysctl.conf
# Настройки за мрежова сигурност
net.ipv4.conf.all.rp_filter=1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_syn_backlog=2048
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_syn_retries=2
# Настройки за мрежова производителност
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_probes=5
net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_max_tw_buckets=1440000
# Настройки за защита от DDoS атаки
net.ipv4.tcp_syncookies=1
net.ipv4.netfilter.ip_conntrack_max=655360
EOF
# Прилагане на промените
sysctl -p
check_success "Sysctl параметрите са конфигурирани" "Грешка при конфигуриране на sysctl параметри"
}
# Инсталиране и конфигуриране на ClamAV (антивирус)
install_clamav() {
show_progress "Инсталиране на ClamAV антивирус"
apt install -y -q clamav clamav-daemon
# Обновяване на вирусните дефиниции
freshclam
# Конфигуриране на автоматично сканиране
cat << EOF > /etc/cron.daily/clamav-scan
#!/bin/bash
SCAN_DIR="/home /var/www"
LOG_FILE="/var/log/clamav/scan.log"
/usr/bin/clamscan -i -r $SCAN_DIR >> $LOG_FILE
EOF
chmod +x /etc/cron.daily/clamav-scan
systemctl restart clamav-daemon
systemctl enable clamav-daemon
check_success "ClamAV е инсталиран и конфигуриран" "Грешка при инсталиране на ClamAV"
}
# Настройка на journald за по-добро логване
configure_journald() {
show_progress "Настройка на системното логване"
# Конфигуриране на journald
cat << EOF > /etc/systemd/journald.conf
[Journal]
Storage=persistent
Compress=yes
SystemMaxUse=1G
SystemMaxFileSize=100M
SystemMaxFiles=10
EOF
systemctl restart systemd-journald
check_success "Системното логване е конфигурирано" "Грешка при конфигуриране на journald"
}
# Инсталиране и конфигуриране на RKHunter (rootkit detector)
install_rkhunter() {
show_progress "Инсталиране на RKHunter за откриване на rootkits"
apt install -y -q rkhunter
# Конфигуриране на RKHunter
sed -i 's/UPDATE_MIRRORS=0/UPDATE_MIRRORS=1/' /etc/rkhunter.conf
sed -i 's/MIRRORS_MODE=1/MIRRORS_MODE=0/' /etc/rkhunter.conf
sed -i 's/CRON_DAILY_RUN=""/CRON_DAILY_RUN="true"/' /etc/default/rkhunter
sed -i 's/CRON_DB_UPDATE=""/CRON_DB_UPDATE="true"/' /etc/default/rkhunter
# Обновяване на базата данни
rkhunter --update
rkhunter --propupd
# Изпълнение на проверка
rkhunter --check --sk
check_success "RKHunter е инсталиран и конфигуриран" "Грешка при инсталиране на RKHunter"
}
# Настройка на мрежови параметри
configure_network() {
show_progress "Настройка на мрежови параметри"
# Конфигуриране на hosts файла
cat << EOF > /etc/hosts
127.0.0.1 localhost
127.0.1.1 $(hostname)
# IPv6
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
# Конфигуриране на hostname
read -p "Искате ли да промените hostname на сървъра? (текущо: $(hostname)) (y/n): " -n 1 -r CHANGE_HOSTNAME
echo
if [[ $CHANGE_HOSTNAME =~ ^[Yy]$ ]]; then
read -p "Въведете ново hostname: " NEW_HOSTNAME
hostnamectl set-hostname $NEW_HOSTNAME
check_success "Hostname е променен на $NEW_HOSTNAME" "Грешка при промяна на hostname"
fi
# Конфигуриране на SSMTP за изпращане на имейли
if command -v apt &> /dev/null; then
apt install -y -q ssmtp mailutils
fi
check_success "Мрежовите параметри са конфигурирани" "Грешка при конфигуриране на мрежови параметри"
}
# Създаване на базов backup скрипт
create_backup_script() {
show_progress "Създаване на базов backup скрипт"
cat << 'EOF' > /usr/local/bin/backup-server.sh
#!/bin/bash
# Базов backup скрипт за сървър
# Автор: Fedya Serafiev
# Дата: $(date +%Y-%m-%d)
BACKUP_DIR="/backups"
LOG_FILE="/var/log/backup.log"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_NAME="backup_$DATE.tar.gz"
# Създаване на директория за backup, ако не съществува
mkdir -p $BACKUP_DIR
# Функция за логване
log() {
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
log "Стартиране на backup процеса"
# Създаване на backup
tar -czf $BACKUP_DIR/$BACKUP_NAME \
/etc \
/home \
/var/www \
/var/log \
/var/lib/mysql 2>/dev/null
if [ $? -eq 0 ]; then
log "Backup успешно създаден: $BACKUP_NAME"
else
log "Грешка при създаване на backup"
exit 1
fi
# Изтриване на стари backups (по-стари от 7 дни)
find $BACKUP_DIR -type f -name "backup_*.tar.gz" -mtime +7 -exec rm -f {} \;
log "Изтрити са стари backups (по-стари от 7 дни)"
log "Backup процесът завърши успешно"
EOF
chmod +x /usr/local/bin/backup-server.sh
# Добавяне към cron за автоматично изпълнение
if [ ! -f /etc/cron.d/backup-job ]; then
echo "0 2 * * * root /usr/local/bin/backup-server.sh" > /etc/cron.d/backup-job
fi
check_success "Backup скриптът е създаден" "Грешка при създаване на backup скрипт"
}
# Основно меню с опции
main_menu() {
while true; do
clear
generate_system_info
echo -e "${BLUE}==============================================${NC}"
echo -e "${GREEN} UBUNTU SERVER НАЧАЛНА НАСТРОЙКА ${NC}"
echo -e "${BLUE}==============================================${NC}"
echo -e "Моля, изберете операциите, които искате да изпълните:"
echo ""
echo -e "${YELLOW}1) Настройка на времева зона (Europe/Sofia)${NC}"
echo -e "${YELLOW}2) Актуализиране на системата${NC}"
echo -e "${YELLOW}3) Инсталиране на основни пакети${NC}"
echo -e "${YELLOW}4) Конфигуриране на защитна стена (UFW)${NC}"
echo -e "${YELLOW}5) Конфигуриране на Fail2ban${NC}"
echo -e "${YELLOW}6) Създаване на нов администраторски потребител${NC}"
echo -e "${YELLOW}7) Подобряване на SSH конфигурацията${NC}"
echo -e "${YELLOW}8) Настройка на автоматични актуализации${NC}"
echo -e "${YELLOW}9) Настройка на swap пространство${NC}"
echo -e "${YELLOW}10) Настройка на NTP (синхронизация на времето)${NC}"
echo -e "${YELLOW}11) Добавяне на системен банер${NC}"
echo -e "${YELLOW}12) Настройка на системни параметри (sysctl)${NC}"
echo -e "${YELLOW}13) Инсталиране на ClamAV антивирус${NC}"
echo -e "${YELLOW}14) Настройка на системно логване${NC}"
echo -e "${YELLOW}15) Инсталиране на RKHunter${NC}"
echo -e "${YELLOW}16) Настройка на мрежови параметри${NC}"
echo -e "${YELLOW}17) Създаване на backup скрипт${NC}"
echo ""
echo -e "${GREEN}A) Изпълни всички основни операции (1-11)${NC}"
echo -e "${GREEN}B) Изпълни всички разширени операции (12-17)${NC}"
echo -e "${GREEN}C) Изпълни всички операции (1-17)${NC}"
echo -e "${RED}Q) Изход${NC}"
echo -e "${BLUE}==============================================${NC}"
read -p "Въведете вашия избор: " USER_CHOICE
case $USER_CHOICE in
1) set_timezone; pause ;;
2) update_system; pause ;;
3) install_essential_packages; pause ;;
4) configure_firewall; pause ;;
5) configure_fail2ban; pause ;;
6) create_admin_user; pause ;;
7) harden_ssh; pause ;;
8) setup_automatic_updates; pause ;;
9) configure_swap; pause ;;
10) configure_ntp; pause ;;
11) add_banner; pause ;;
12) configure_sysctl; pause ;;
13) install_clamav; pause ;;
14) configure_journald; pause ;;
15) install_rkhunter; pause ;;
16) configure_network; pause ;;
17) create_backup_script; pause ;;
[Aa])
set_timezone
update_system
install_essential_packages
configure_firewall
configure_fail2ban
create_admin_user
harden_ssh
setup_automatic_updates
configure_swap
configure_ntp
add_banner
echo -e "${GREEN}Всички основни операции са изпълнени успешно!${NC}"
pause
;;
[Bb])
configure_sysctl
install_clamav
configure_journald
install_rkhunter
configure_network
create_backup_script
echo -e "${GREEN}Всички разширени операции са изпълнени успешно!${NC}"
pause
;;
[Cc])
set_timezone
update_system
install_essential_packages
configure_firewall
configure_fail2ban
create_admin_user
harden_ssh
setup_automatic_updates
configure_swap
configure_ntp
add_banner
configure_sysctl
install_clamav
configure_journald
install_rkhunter
configure_network
create_backup_script
echo -e "${GREEN}Всички операции са изпълнени успешно!${NC}"
pause
;;
[Qq])
echo -e "${GREEN}Изход от скрипта.${NC}"
exit 0
;;
*)
echo -e "${RED}Невалиден избор. Моля, опитайте отново.${NC}"
pause
;;
esac
done
}
# Стартиране на основното меню
main_menu
| 1 | #!/bin/bash |
| 2 | |
| 3 | # Ubuntu Server Initial Setup Script |
| 4 | # Автор: Fedya Serafiev |
| 5 | # Дата: 16 май 2025 |
| 6 | # Версия: 2.1 |
| 7 | # |
| 8 | # Този скрипт извършва основните задачи за първоначална настройка на Ubuntu Server |
| 9 | # Включва: актуализация на системата, настройка на защитна стена, инсталиране на полезни пакети, |
| 10 | # конфигуриране на SSH, създаване на нов потребител с административни права и базова защита |
| 11 | |
| 12 | # Цветове за терминала |
| 13 | RED='\033[0;31m' |
| 14 | GREEN='\033[0;32m' |
| 15 | YELLOW='\033[1;33m' |
| 16 | BLUE='\033[0;34m' |
| 17 | CYAN='\033[0;36m' |
| 18 | MAGENTA='\033[0;35m' |
| 19 | NC='\033[0m' # No Color |
| 20 | |
| 21 | # Проверка за root привилегии |
| 22 | if [[ $EUID -ne 0 ]]; then |
| 23 | echo -e "${RED}Този скрипт трябва да се изпълни като root потребител${NC}" |
| 24 | echo -e "${YELLOW}Моля, стартирайте го отново с: sudo $0${NC}" |
| 25 | exit 1 |
| 26 | fi |
| 27 | |
| 28 | # Функция за показване на прогрес |
| 29 | show_progress() { |
| 30 | echo -e "${BLUE}================================================${NC}" |
| 31 | echo -e "${GREEN}>>> $1${NC}" |
| 32 | echo -e "${BLUE}================================================${NC}" |
| 33 | } |
| 34 | |
| 35 | # Функция за проверка на успех |
| 36 | check_success() { |
| 37 | if [ $? -eq 0 ]; then |
| 38 | echo -e "${GREEN}[УСПЕХ] $1${NC}" |
| 39 | else |
| 40 | echo -e "${RED}[ГРЕШКА] $2${NC}" |
| 41 | if [ "$3" = "exit" ]; then |
| 42 | exit 1 |
| 43 | fi |
| 44 | fi |
| 45 | } |
| 46 | |
| 47 | # Функция за пауза |
| 48 | pause() { |
| 49 | echo -e "${YELLOW}Натиснете Enter за да продължите...${NC}" |
| 50 | read -r |
| 51 | } |
| 52 | |
| 53 | # Генериране на системна информация |
| 54 | generate_system_info() { |
| 55 | local hostname=$(hostname) |
| 56 | local ip_address=$(hostname -I | awk '{print $1}') |
| 57 | local date=$(date +"%Y-%m-%d %H:%M:%S") |
| 58 | local os_info=$(lsb_release -d | cut -f2-) |
| 59 | local kernel=$(uname -r) |
| 60 | local uptime=$(uptime -p) |
| 61 | |
| 62 | echo -e "${CYAN}*************************************************************************${NC}" |
| 63 | echo -e "${MAGENTA} ВНИМАНИЕ!${NC}" |
| 64 | echo -e "${YELLOW} Този сървър е частна собственост. Неоторизираният достъп" |
| 65 | echo -e " е забранен и подлежи на наказателна отговорност." |
| 66 | echo -e " Всички действия се записват и следят.${NC}" |
| 67 | echo -e "" |
| 68 | echo -e "${GREEN} Системна информация:${NC}" |
| 69 | echo -e " * Хост: $hostname" |
| 70 | echo -e " * IP адрес: $ip_address" |
| 71 | echo -e " * Дата: $date" |
| 72 | echo -e " * ОС: $os_info" |
| 73 | echo -e " * Ядро: $kernel" |
| 74 | echo -e " * Uptime: $uptime" |
| 75 | echo -e "${CYAN}*************************************************************************${NC}" |
| 76 | } |
| 77 | |
| 78 | # Задаване на времева зона (по подразбиране е Europe/Sofia) |
| 79 | set_timezone() { |
| 80 | show_progress "Настройка на времева зона на Europe/Sofia" |
| 81 | timedatectl set-timezone Europe/Sofia |
| 82 | check_success "Времевата зона е настроена" "Грешка при настройка на времева зона" |
| 83 | echo -e "${YELLOW}Текуща времева зона: $(timedatectl | grep "Time zone" | awk '{print $3}')${NC}" |
| 84 | } |
| 85 | |
| 86 | # Актуализиране на системата |
| 87 | update_system() { |
| 88 | show_progress "Актуализиране на системните пакети" |
| 89 | echo -e "${YELLOW}Извършване на apt update...${NC}" |
| 90 | apt update -q |
| 91 | check_success "Репотарите са актуализирани" "Грешка при актуализация на репотарите" |
| 92 | |
| 93 | echo -e "${YELLOW}Извършване на apt upgrade...${NC}" |
| 94 | DEBIAN_FRONTEND=noninteractive apt upgrade -y -q |
| 95 | check_success "Пакетите са обновени" "Грешка при обновяване на пакети" |
| 96 | |
| 97 | echo -e "${YELLOW}Извършване на apt dist-upgrade...${NC}" |
| 98 | DEBIAN_FRONTEND=noninteractive apt dist-upgrade -y -q |
| 99 | check_success "Дистрибутивните обновления са приложени" "Грешка при dist-upgrade" |
| 100 | |
| 101 | echo -e "${YELLOW}Извършване на apt autoremove...${NC}" |
| 102 | apt autoremove -y -q |
| 103 | apt autoclean -q |
| 104 | check_success "Излишните пакети са премахнати" "Грешка при премахване на излишни пакети" |
| 105 | } |
| 106 | |
| 107 | # Инсталиране на основни пакети |
| 108 | install_essential_packages() { |
| 109 | show_progress "Инсталиране на полезни пакети" |
| 110 | |
| 111 | # Основен списък с пакети |
| 112 | BASE_PACKAGES=( |
| 113 | curl wget vim git htop net-tools nmap tmux unzip zip |
| 114 | ufw fail2ban logwatch ncdu tree dnsutils bash-completion |
| 115 | apt-transport-https ca-certificates gnupg-agent software-properties-common |
| 116 | jq rsync screen iftop iotop lsof strace sysstat |
| 117 | ) |
| 118 | |
| 119 | # Инсталиране на основни пакети |
| 120 | echo -e "${YELLOW}Инсталиране на основни пакети...${NC}" |
| 121 | apt install -y -q "${BASE_PACKAGES[@]}" |
| 122 | check_success "Основните пакети са инсталирани" "Грешка при инсталиране на основни пакети" |
| 123 | |
| 124 | # Допълнителни пакети за Docker (ако е нужно) |
| 125 | read -p "Искате ли да инсталирате Docker? (y/n): " -n 1 -r INSTALL_DOCKER |
| 126 | echo |
| 127 | if [[ $INSTALL_DOCKER =~ ^[Yy]$ ]]; then |
| 128 | echo -e "${YELLOW}Инсталиране на Docker...${NC}" |
| 129 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - |
| 130 | add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" |
| 131 | apt update -q |
| 132 | apt install -y -q docker-ce docker-ce-cli containerd.io |
| 133 | check_success "Docker е инсталиран" "Грешка при инсталиране на Docker" |
| 134 | |
| 135 | # Добавяне на текущия потребител към групата docker |
| 136 | if [ -n "$SUDO_USER" ]; then |
| 137 | usermod -aG docker $SUDO_USER |
| 138 | check_success "Потребителят $SUDO_USER е добавен към групата docker" "Грешка при добавяне към docker група" |
| 139 | fi |
| 140 | fi |
| 141 | |
| 142 | # Допълнителни пакети за мониторинг |
| 143 | read -p "Искате ли да инсталирате пакети за мониторинг (cockpit, netdata)? (y/n): " -n 1 -r INSTALL_MONITORING |
| 144 | echo |
| 145 | if [[ $INSTALL_MONITORING =~ ^[Yy]$ ]]; then |
| 146 | echo -e "${YELLOW}Инсталиране на cockpit...${NC}" |
| 147 | apt install -y -q cockpit |
| 148 | systemctl enable --now cockpit.socket |
| 149 | check_success "Cockpit е инсталиран и активиран" "Грешка при инсталиране на cockpit" |
| 150 | |
| 151 | echo -e "${YELLOW}Инсталиране на netdata...${NC}" |
| 152 | bash <(curl -Ss https://my-netdata.io/kickstart.sh) --non-interactive |
| 153 | check_success "Netdata е инсталиран" "Грешка при инсталиране на netdata" |
| 154 | fi |
| 155 | } |
| 156 | |
| 157 | # Конфигуриране на защитна стена (UFW) |
| 158 | configure_firewall() { |
| 159 | show_progress "Конфигуриране на защитната стена (UFW)" |
| 160 | |
| 161 | # Разрешаване на SSH |
| 162 | ufw allow ssh |
| 163 | check_success "SSH портът е разрешен" "Грешка при разрешаване на SSH порт" |
| 164 | |
| 165 | # Питане за разрешаване на други портове |
| 166 | read -p "Искате ли да разрешите HTTP трафик (порт 80)? (y/n): " -n 1 -r HTTP_RESPONSE |
| 167 | echo |
| 168 | if [[ $HTTP_RESPONSE =~ ^[Yy]$ ]]; then |
| 169 | ufw allow 80/tcp |
| 170 | check_success "HTTP трафик разрешен" "Грешка при разрешаване на HTTP порт" |
| 171 | fi |
| 172 | |
| 173 | read -p "Искате ли да разрешите HTTPS трафик (порт 443)? (y/n): " -n 1 -r HTTPS_RESPONSE |
| 174 | echo |
| 175 | if [[ $HTTPS_RESPONSE =~ ^[Yy]$ ]]; then |
| 176 | ufw allow 443/tcp |
| 177 | check_success "HTTPS трафик разрешен" "Грешка при разрешаване на HTTPS порт" |
| 178 | fi |
| 179 | |
| 180 | read -p "Искате ли да разрешите други портове? (y/n): " -n 1 -r OTHER_PORTS |
| 181 | echo |
| 182 | if [[ $OTHER_PORTS =~ ^[Yy]$ ]]; then |
| 183 | read -p "Въведете портове, разделени с интервал (напр. 8080 8443): " -a PORTS_ARRAY |
| 184 | for port in "${PORTS_ARRAY[@]}"; do |
| 185 | ufw allow "$port/tcp" |
| 186 | check_success "Порт $port/tcp е разрешен" "Грешка при разрешаване на порт $port" |
| 187 | done |
| 188 | fi |
| 189 | |
| 190 | # Активиране на защитната стена |
| 191 | ufw --force enable |
| 192 | check_success "Защитната стена е активирана" "Грешка при активиране на защитната стена" |
| 193 | |
| 194 | echo -e "${YELLOW}Текущ статус на защитната стена:${NC}" |
| 195 | ufw status verbose |
| 196 | } |
| 197 | |
| 198 | # Конфигуриране на Fail2ban |
| 199 | configure_fail2ban() { |
| 200 | show_progress "Конфигуриране на Fail2ban за защита от brute-force атаки" |
| 201 | |
| 202 | # Проверка дали fail2ban е инсталиран |
| 203 | if ! command -v fail2ban-server &> /dev/null; then |
| 204 | apt install -y -q fail2ban |
| 205 | check_success "Fail2ban е инсталиран" "Грешка при инсталиране на fail2ban" |
| 206 | fi |
| 207 | |
| 208 | # Създаване на конфигурационен файл, ако не съществува |
| 209 | if [ ! -f /etc/fail2ban/jail.local ]; then |
| 210 | cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local |
| 211 | fi |
| 212 | |
| 213 | # Добавяне на базова конфигурация |
| 214 | cat << EOF >> /etc/fail2ban/jail.local |
| 215 | |
| 216 | # Потребителска конфигурация |
| 217 | [sshd] |
| 218 | enabled = true |
| 219 | port = ssh |
| 220 | filter = sshd |
| 221 | logpath = /var/log/auth.log |
| 222 | maxretry = 5 |
| 223 | bantime = 3600 |
| 224 | findtime = 600 |
| 225 | ignoreip = 127.0.0.1/8 ::1 |
| 226 | |
| 227 | [sshd-ddos] |
| 228 | enabled = true |
| 229 | port = ssh |
| 230 | filter = sshd |
| 231 | logpath = /var/log/auth.log |
| 232 | maxretry = 5 |
| 233 | findtime = 600 |
| 234 | bantime = 86400 |
| 235 | EOF |
| 236 | |
| 237 | # Рестартиране на услугата |
| 238 | systemctl restart fail2ban |
| 239 | check_success "Fail2ban услугата е рестартирана" "Грешка при рестартиране на fail2ban" |
| 240 | |
| 241 | systemctl enable fail2ban |
| 242 | check_success "Fail2ban е конфигуриран да се стартира автоматично" "Грешка при активиране на fail2ban" |
| 243 | |
| 244 | echo -e "${YELLOW}Текущ статус на Fail2ban:${NC}" |
| 245 | fail2ban-client status |
| 246 | } |
| 247 | |
| 248 | # Създаване на нов администраторски потребител |
| 249 | create_admin_user() { |
| 250 | show_progress "Създаване на нов потребител с sudo права" |
| 251 | |
| 252 | read -p "Въведете име за новия потребител: " NEW_USER |
| 253 | |
| 254 | # Проверка дали потребителят вече съществува |
| 255 | if id "$NEW_USER" &>/dev/null; then |
| 256 | echo -e "${YELLOW}Потребителят $NEW_USER вече съществува!${NC}" |
| 257 | read -p "Искате ли да добавите потребителя към групата sudo? (y/n): " -n 1 -r ADD_SUDO |
| 258 | echo |
| 259 | if [[ $ADD_SUDO =~ ^[Yy]$ ]]; then |
| 260 | usermod -aG sudo $NEW_USER |
| 261 | check_success "Потребителят $NEW_USER е добавен към групата sudo" "Грешка при добавяне към sudo група" |
| 262 | fi |
| 263 | else |
| 264 | # Създаване на потребителя |
| 265 | adduser --gecos "" $NEW_USER |
| 266 | check_success "Потребителят $NEW_USER е създаден" "Грешка при създаване на потребител" |
| 267 | |
| 268 | # Добавяне към групата sudo |
| 269 | usermod -aG sudo $NEW_USER |
| 270 | check_success "Потребителят $NEW_USER е добавен към групата sudo" "Грешка при добавяне към sudo група" |
| 271 | |
| 272 | # Настройка на SSH ключове за новия потребител |
| 273 | read -p "Искате ли да настроите SSH ключове за $NEW_USER? (y/n): " -n 1 -r SSH_KEY_RESPONSE |
| 274 | echo |
| 275 | |
| 276 | if [[ $SSH_KEY_RESPONSE =~ ^[Yy]$ ]]; then |
| 277 | mkdir -p /home/$NEW_USER/.ssh |
| 278 | chmod 700 /home/$NEW_USER/.ssh |
| 279 | |
| 280 | read -p "Въведете публичния SSH ключ: " SSH_KEY |
| 281 | echo $SSH_KEY > /home/$NEW_USER/.ssh/authorized_keys |
| 282 | chmod 600 /home/$NEW_USER/.ssh/authorized_keys |
| 283 | chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh |
| 284 | check_success "SSH ключът е добавен за потребителя $NEW_USER" "Грешка при добавяне на SSH ключ" |
| 285 | fi |
| 286 | fi |
| 287 | |
| 288 | # Забрана за вход с парола за root и новия потребител |
| 289 | if [ -f /etc/ssh/sshd_config ]; then |
| 290 | sed -i "/^#*PermitRootLogin/c\PermitRootLogin prohibit-password" /etc/ssh/sshd_config |
| 291 | |
| 292 | if grep -q "^#*PasswordAuthentication" /etc/ssh/sshd_config; then |
| 293 | sed -i "/^#*PasswordAuthentication/c\PasswordAuthentication no" /etc/ssh/sshd_config |
| 294 | else |
| 295 | echo "PasswordAuthentication no" >> /etc/ssh/sshd_config |
| 296 | fi |
| 297 | |
| 298 | systemctl restart sshd |
| 299 | check_success "SSH конфигурацията е обновена" "Грешка при обновяване на SSH конфигурация" |
| 300 | fi |
| 301 | } |
| 302 | |
| 303 | # Подобряване на конфигурацията на SSH |
| 304 | harden_ssh() { |
| 305 | show_progress "Подобряване на SSH конфигурацията" |
| 306 | |
| 307 | # Създаване на резервно копие на SSH конфигурационния файл |
| 308 | cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak |
| 309 | check_success "Резервно копие на sshd_config е създадено" "Грешка при създаване на резервно копие" |
| 310 | |
| 311 | # Настройки за по-добра сигурност |
| 312 | sed -i 's/#PermitRootLogin yes/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config |
| 313 | sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config |
| 314 | sed -i 's/X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config |
| 315 | sed -i 's/#MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config |
| 316 | sed -i 's/#ClientAliveInterval 0/ClientAliveInterval 300/' /etc/ssh/sshd_config |
| 317 | sed -i 's/#ClientAliveCountMax 3/ClientAliveCountMax 0/' /etc/ssh/sshd_config |
| 318 | |
| 319 | # Добавяне на допълнителни настройки за сигурност |
| 320 | if ! grep -q "^UsePAM" /etc/ssh/sshd_config; then |
| 321 | echo "UsePAM yes" >> /etc/ssh/sshd_config |
| 322 | fi |
| 323 | |
| 324 | if ! grep -q "^PrintLastLog" /etc/ssh/sshd_config; then |
| 325 | echo "PrintLastLog yes" >> /etc/ssh/sshd_config |
| 326 | fi |
| 327 | |
| 328 | if ! grep -q "^AllowAgentForwarding" /etc/ssh/sshd_config; then |
| 329 | echo "AllowAgentForwarding no" >> /etc/ssh/sshd_config |
| 330 | fi |
| 331 | |
| 332 | if ! grep -q "^AllowTcpForwarding" /etc/ssh/sshd_config; then |
| 333 | echo "AllowTcpForwarding no" >> /etc/ssh/sshd_config |
| 334 | fi |
| 335 | |
| 336 | read -p "Желаете ли да промените SSH порта? (y/n): " -n 1 -r CHANGE_PORT |
| 337 | echo |
| 338 | |
| 339 | if [[ $CHANGE_PORT =~ ^[Yy]$ ]]; then |
| 340 | read -p "Въведете нов SSH порт (препоръчително > 1024): " NEW_SSH_PORT |
| 341 | |
| 342 | # Проверка за валиден порт |
| 343 | if [[ "$NEW_SSH_PORT" =~ ^[0-9]+$ ]] && [ "$NEW_SSH_PORT" -ge 1 ] && [ "$NEW_SSH_PORT" -le 65535 ]; then |
| 344 | sed -i "s/#Port 22/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config |
| 345 | |
| 346 | # Разрешаване на новия порт в защитната стена |
| 347 | ufw allow $NEW_SSH_PORT/tcp |
| 348 | ufw delete allow ssh |
| 349 | |
| 350 | check_success "SSH портът е променен на $NEW_SSH_PORT" "Грешка при промяна на SSH порт" |
| 351 | echo -e "${YELLOW}ВАЖНО: Не затваряйте текущата SSH сесия, докато не проверите, че можете да се свържете на новия порт!${NC}" |
| 352 | else |
| 353 | echo -e "${RED}Невалиден порт. Пропускане на промяната.${NC}" |
| 354 | fi |
| 355 | fi |
| 356 | |
| 357 | # Рестартиране на SSH услугата |
| 358 | systemctl restart sshd |
| 359 | check_success "SSH услугата е рестартирана" "Грешка при рестартиране на SSH" |
| 360 | } |
| 361 | |
| 362 | # Настройка на автоматични актуализации |
| 363 | setup_automatic_updates() { |
| 364 | show_progress "Настройка на автоматични обновления" |
| 365 | |
| 366 | apt install -y -q unattended-upgrades apt-listchanges |
| 367 | |
| 368 | # Конфигуриране на автоматичните обновления |
| 369 | cat << EOF > /etc/apt/apt.conf.d/50unattended-upgrades |
| 370 | Unattended-Upgrade::Origins-Pattern { |
| 371 | "origin=Debian,codename=\${distro_codename}-updates"; |
| 372 | "origin=Debian,codename=\${distro_codename}-proposed-updates"; |
| 373 | "origin=Debian,codename=\${distro_codename},label=Debian"; |
| 374 | "origin=Debian,codename=\${distro_codename},label=Debian-Security"; |
| 375 | "origin=Ubuntu,codename=\${distro_codename}-updates"; |
| 376 | "origin=Ubuntu,codename=\${distro_codename}-proposed-updates"; |
| 377 | "origin=Ubuntu,codename=\${distro_codename},label=Ubuntu"; |
| 378 | "origin=Ubuntu,codename=\${distro_codename},label=UbuntuESM"; |
| 379 | "origin=Ubuntu,codename=\${distro_codename}-security"; |
| 380 | }; |
| 381 | Unattended-Upgrade::Package-Blacklist { |
| 382 | }; |
| 383 | Unattended-Upgrade::DevRelease "false"; |
| 384 | Unattended-Upgrade::Remove-Unused-Dependencies "true"; |
| 385 | Unattended-Upgrade::Automatic-Reboot "true"; |
| 386 | Unattended-Upgrade::Automatic-Reboot-Time "02:00"; |
| 387 | Unattended-Upgrade::AutoFixInterruptedDpkg "true"; |
| 388 | EOF |
| 389 | |
| 390 | # Активиране на автоматичните обновления |
| 391 | cat << EOF > /etc/apt/apt.conf.d/20auto-upgrades |
| 392 | APT::Periodic::Update-Package-Lists "1"; |
| 393 | APT::Periodic::Download-Upgradeable-Packages "1"; |
| 394 | APT::Periodic::AutocleanInterval "7"; |
| 395 | APT::Periodic::Unattended-Upgrade "1"; |
| 396 | EOF |
| 397 | |
| 398 | systemctl restart unattended-upgrades |
| 399 | check_success "Автоматичните обновления са конфигурирани" "Грешка при конфигуриране на автоматични обновления" |
| 400 | |
| 401 | echo -e "${YELLOW}Текущ статус на автоматичните обновления:${NC}" |
| 402 | systemctl status unattended-upgrades.service --no-pager |
| 403 | } |
| 404 | |
| 405 | # Настройка на swap файл (ако е необходимо) |
| 406 | configure_swap() { |
| 407 | show_progress "Проверка за swap пространство" |
| 408 | |
| 409 | # Проверка на наличния swap |
| 410 | CURRENT_SWAP=$(free -m | awk '/^Swap:/ {print $2}') |
| 411 | TOTAL_MEM=$(free -m | awk '/^Mem:/ {print $2}') |
| 412 | RECOMMENDED_SWAP=$((TOTAL_MEM * 2)) |
| 413 | |
| 414 | if [ "$CURRENT_SWAP" -eq 0 ]; then |
| 415 | read -p "Няма конфигуриран swap. Искате ли да създадете swap файл? (y/n): " -n 1 -r CREATE_SWAP |
| 416 | echo |
| 417 | |
| 418 | if [[ $CREATE_SWAP =~ ^[Yy]$ ]]; then |
| 419 | read -p "Въведете размер на swap файла в GB (рекомендация: $RECOMMENDED_SWAP MB за $TOTAL_MEM MB RAM): " SWAP_SIZE |
| 420 | |
| 421 | # Създаване на swap файл |
| 422 | fallocate -l ${SWAP_SIZE}G /swapfile |
| 423 | chmod 600 /swapfile |
| 424 | mkswap /swapfile |
| 425 | swapon /swapfile |
| 426 | |
| 427 | # Добавяне на swap файла в /etc/fstab |
| 428 | echo '/swapfile none swap sw 0 0' >> /etc/fstab |
| 429 | |
| 430 | # Настройка на swappiness |
| 431 | echo 'vm.swappiness=10' >> /etc/sysctl.conf |
| 432 | echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf |
| 433 | sysctl -p |
| 434 | |
| 435 | check_success "Swap файл от ${SWAP_SIZE}GB е създаден и конфигуриран" "Грешка при създаване на swap файл" |
| 436 | fi |
| 437 | else |
| 438 | echo -e "${YELLOW}Системата вече има ${CURRENT_SWAP}MB swap пространство${NC}" |
| 439 | echo -e "${YELLOW}Обща RAM памет: ${TOTAL_MEM}MB${NC}" |
| 440 | echo -e "${YELLOW}Рекомендуван swap размер: ${RECOMMENDED_SWAP}MB${NC}" |
| 441 | |
| 442 | read -p "Искате ли да промените swap настройките? (y/n): " -n 1 -r CHANGE_SWAP |
| 443 | echo |
| 444 | |
| 445 | if [[ $CHANGE_SWAP =~ ^[Yy]$ ]]; then |
| 446 | read -p "Въведете нова стойност за vm.swappiness (по подразбиране 10): " SWAPPINESS |
| 447 | read -p "Въведете нова стойност за vm.vfs_cache_pressure (по подразбиране 50): " CACHE_PRESSURE |
| 448 | |
| 449 | sed -i '/vm.swappiness/d' /etc/sysctl.conf |
| 450 | sed -i '/vm.vfs_cache_pressure/d' /etc/sysctl.conf |
| 451 | |
| 452 | echo "vm.swappiness=$SWAPPINESS" >> /etc/sysctl.conf |
| 453 | echo "vm.vfs_cache_pressure=$CACHE_PRESSURE" >> /etc/sysctl.conf |
| 454 | sysctl -p |
| 455 | |
| 456 | check_success "Swap настройките са променени" "Грешка при промяна на swap настройки" |
| 457 | fi |
| 458 | fi |
| 459 | } |
| 460 | |
| 461 | # Настройка на NTP (Network Time Protocol) |
| 462 | configure_ntp() { |
| 463 | show_progress "Настройка на NTP за синхронизация на времето" |
| 464 | |
| 465 | # Инсталиране на NTP |
| 466 | apt install -y -q chrony |
| 467 | |
| 468 | # Конфигуриране на Chrony |
| 469 | cat << EOF > /etc/chrony/chrony.conf |
| 470 | pool ntp.ubuntu.com iburst |
| 471 | keyfile /etc/chrony/chrony.keys |
| 472 | driftfile /var/lib/chrony/chrony.drift |
| 473 | logdir /var/log/chrony |
| 474 | maxupdateskew 100.0 |
| 475 | hwclockfile /etc/adjtime |
| 476 | rtcsync |
| 477 | makestep 1 3 |
| 478 | EOF |
| 479 | |
| 480 | # Рестартиране на услугата |
| 481 | systemctl restart chrony |
| 482 | check_success "Chrony услугата е рестартирана" "Грешка при рестартиране на chrony" |
| 483 | |
| 484 | systemctl enable chrony |
| 485 | check_success "Chrony е конфигуриран да се стартира автоматично" "Грешка при активиране на chrony" |
| 486 | |
| 487 | echo -e "${YELLOW}Текущ статус на NTP синхронизацията:${NC}" |
| 488 | chronyc tracking |
| 489 | chronyc sources |
| 490 | } |
| 491 | |
| 492 | # Добавяне на основен банер |
| 493 | add_banner() { |
| 494 | show_progress "Добавяне на системен банер" |
| 495 | |
| 496 | # Създаване на банер файл с динамична системна информация |
| 497 | cat << 'EOF' > /etc/issue.net |
| 498 | ************************************************************************* |
| 499 | ВНИМАНИЕ! |
| 500 | Този сървър е частна собственост. Неоторизираният достъп |
| 501 | е забранен и подлежи на наказателна отговорност. |
| 502 | Всички действия се записват и следят. |
| 503 | |
| 504 | Системна информация: |
| 505 | EOF |
| 506 | |
| 507 | # Добавяне на динамична информация |
| 508 | echo " * Хост: $(hostname)" >> /etc/issue.net |
| 509 | echo " * IP адрес: $(hostname -I | awk '{print $1}')" >> /etc/issue.net |
| 510 | echo " * Дата: $(date +"%Y-%m-%d %H:%M:%S")" >> /etc/issue.net |
| 511 | echo " * ОС: $(lsb_release -d | cut -f2-)" >> /etc/issue.net |
| 512 | echo " * Ядро: $(uname -r)" >> /etc/issue.net |
| 513 | echo " * Uptime: $(uptime -p)" >> /etc/issue.net |
| 514 | echo "*************************************************************************" >> /etc/issue.net |
| 515 | |
| 516 | # Активиране на банера в SSH |
| 517 | if grep -q "^#Banner" /etc/ssh/sshd_config; then |
| 518 | sed -i 's|^#Banner.*|Banner /etc/issue.net|' /etc/ssh/sshd_config |
| 519 | else |
| 520 | echo "Banner /etc/issue.net" >> /etc/ssh/sshd_config |
| 521 | fi |
| 522 | |
| 523 | systemctl restart sshd |
| 524 | check_success "Системният банер е конфигуриран" "Грешка при конфигуриране на банер" |
| 525 | |
| 526 | # Показване на банера |
| 527 | echo -e "${CYAN}Системният банер ще изглежда така:${NC}" |
| 528 | generate_system_info |
| 529 | } |
| 530 | |
| 531 | # Настройка на базови sysctl параметри |
| 532 | configure_sysctl() { |
| 533 | show_progress "Настройка на базови системни параметри" |
| 534 | |
| 535 | # Създаване на резервно копие |
| 536 | cp /etc/sysctl.conf /etc/sysctl.conf.bak |
| 537 | |
| 538 | # Добавяне на параметри за подобрена сигурност и производителност |
| 539 | cat << EOF >> /etc/sysctl.conf |
| 540 | |
| 541 | # Настройки за мрежова сигурност |
| 542 | net.ipv4.conf.all.rp_filter=1 |
| 543 | net.ipv4.conf.default.rp_filter=1 |
| 544 | net.ipv4.conf.all.accept_redirects=0 |
| 545 | net.ipv4.conf.default.accept_redirects=0 |
| 546 | net.ipv4.conf.all.secure_redirects=0 |
| 547 | net.ipv4.conf.default.secure_redirects=0 |
| 548 | net.ipv4.icmp_echo_ignore_broadcasts=1 |
| 549 | net.ipv4.icmp_ignore_bogus_error_responses=1 |
| 550 | net.ipv4.tcp_syncookies=1 |
| 551 | net.ipv4.tcp_max_syn_backlog=2048 |
| 552 | net.ipv4.tcp_synack_retries=2 |
| 553 | net.ipv4.tcp_syn_retries=2 |
| 554 | |
| 555 | # Настройки за мрежова производителност |
| 556 | net.ipv4.tcp_window_scaling=1 |
| 557 | net.ipv4.tcp_keepalive_time=600 |
| 558 | net.ipv4.tcp_keepalive_probes=5 |
| 559 | net.ipv4.tcp_keepalive_intvl=15 |
| 560 | net.ipv4.tcp_fin_timeout=30 |
| 561 | net.ipv4.tcp_tw_reuse=1 |
| 562 | net.ipv4.tcp_max_tw_buckets=1440000 |
| 563 | |
| 564 | # Настройки за защита от DDoS атаки |
| 565 | net.ipv4.tcp_syncookies=1 |
| 566 | net.ipv4.netfilter.ip_conntrack_max=655360 |
| 567 | EOF |
| 568 | |
| 569 | # Прилагане на промените |
| 570 | sysctl -p |
| 571 | check_success "Sysctl параметрите са конфигурирани" "Грешка при конфигуриране на sysctl параметри" |
| 572 | } |
| 573 | |
| 574 | # Инсталиране и конфигуриране на ClamAV (антивирус) |
| 575 | install_clamav() { |
| 576 | show_progress "Инсталиране на ClamAV антивирус" |
| 577 | |
| 578 | apt install -y -q clamav clamav-daemon |
| 579 | |
| 580 | # Обновяване на вирусните дефиниции |
| 581 | freshclam |
| 582 | |
| 583 | # Конфигуриране на автоматично сканиране |
| 584 | cat << EOF > /etc/cron.daily/clamav-scan |
| 585 | #!/bin/bash |
| 586 | SCAN_DIR="/home /var/www" |
| 587 | LOG_FILE="/var/log/clamav/scan.log" |
| 588 | /usr/bin/clamscan -i -r $SCAN_DIR >> $LOG_FILE |
| 589 | EOF |
| 590 | |
| 591 | chmod +x /etc/cron.daily/clamav-scan |
| 592 | |
| 593 | systemctl restart clamav-daemon |
| 594 | systemctl enable clamav-daemon |
| 595 | |
| 596 | check_success "ClamAV е инсталиран и конфигуриран" "Грешка при инсталиране на ClamAV" |
| 597 | } |
| 598 | |
| 599 | # Настройка на journald за по-добро логване |
| 600 | configure_journald() { |
| 601 | show_progress "Настройка на системното логване" |
| 602 | |
| 603 | # Конфигуриране на journald |
| 604 | cat << EOF > /etc/systemd/journald.conf |
| 605 | [Journal] |
| 606 | Storage=persistent |
| 607 | Compress=yes |
| 608 | SystemMaxUse=1G |
| 609 | SystemMaxFileSize=100M |
| 610 | SystemMaxFiles=10 |
| 611 | EOF |
| 612 | |
| 613 | systemctl restart systemd-journald |
| 614 | check_success "Системното логване е конфигурирано" "Грешка при конфигуриране на journald" |
| 615 | } |
| 616 | |
| 617 | # Инсталиране и конфигуриране на RKHunter (rootkit detector) |
| 618 | install_rkhunter() { |
| 619 | show_progress "Инсталиране на RKHunter за откриване на rootkits" |
| 620 | |
| 621 | apt install -y -q rkhunter |
| 622 | |
| 623 | # Конфигуриране на RKHunter |
| 624 | sed -i 's/UPDATE_MIRRORS=0/UPDATE_MIRRORS=1/' /etc/rkhunter.conf |
| 625 | sed -i 's/MIRRORS_MODE=1/MIRRORS_MODE=0/' /etc/rkhunter.conf |
| 626 | sed -i 's/CRON_DAILY_RUN=""/CRON_DAILY_RUN="true"/' /etc/default/rkhunter |
| 627 | sed -i 's/CRON_DB_UPDATE=""/CRON_DB_UPDATE="true"/' /etc/default/rkhunter |
| 628 | |
| 629 | # Обновяване на базата данни |
| 630 | rkhunter --update |
| 631 | rkhunter --propupd |
| 632 | |
| 633 | # Изпълнение на проверка |
| 634 | rkhunter --check --sk |
| 635 | |
| 636 | check_success "RKHunter е инсталиран и конфигуриран" "Грешка при инсталиране на RKHunter" |
| 637 | } |
| 638 | |
| 639 | # Настройка на мрежови параметри |
| 640 | configure_network() { |
| 641 | show_progress "Настройка на мрежови параметри" |
| 642 | |
| 643 | # Конфигуриране на hosts файла |
| 644 | cat << EOF > /etc/hosts |
| 645 | 127.0.0.1 localhost |
| 646 | 127.0.1.1 $(hostname) |
| 647 | |
| 648 | # IPv6 |
| 649 | ::1 localhost ip6-localhost ip6-loopback |
| 650 | ff02::1 ip6-allnodes |
| 651 | ff02::2 ip6-allrouters |
| 652 | EOF |
| 653 | |
| 654 | # Конфигуриране на hostname |
| 655 | read -p "Искате ли да промените hostname на сървъра? (текущо: $(hostname)) (y/n): " -n 1 -r CHANGE_HOSTNAME |
| 656 | echo |
| 657 | |
| 658 | if [[ $CHANGE_HOSTNAME =~ ^[Yy]$ ]]; then |
| 659 | read -p "Въведете ново hostname: " NEW_HOSTNAME |
| 660 | hostnamectl set-hostname $NEW_HOSTNAME |
| 661 | check_success "Hostname е променен на $NEW_HOSTNAME" "Грешка при промяна на hostname" |
| 662 | fi |
| 663 | |
| 664 | # Конфигуриране на SSMTP за изпращане на имейли |
| 665 | if command -v apt &> /dev/null; then |
| 666 | apt install -y -q ssmtp mailutils |
| 667 | fi |
| 668 | |
| 669 | check_success "Мрежовите параметри са конфигурирани" "Грешка при конфигуриране на мрежови параметри" |
| 670 | } |
| 671 | |
| 672 | # Създаване на базов backup скрипт |
| 673 | create_backup_script() { |
| 674 | show_progress "Създаване на базов backup скрипт" |
| 675 | |
| 676 | cat << 'EOF' > /usr/local/bin/backup-server.sh |
| 677 | #!/bin/bash |
| 678 | |
| 679 | # Базов backup скрипт за сървър |
| 680 | # Автор: Fedya Serafiev |
| 681 | # Дата: $(date +%Y-%m-%d) |
| 682 | |
| 683 | BACKUP_DIR="/backups" |
| 684 | LOG_FILE="/var/log/backup.log" |
| 685 | DATE=$(date +%Y-%m-%d_%H-%M-%S) |
| 686 | BACKUP_NAME="backup_$DATE.tar.gz" |
| 687 | |
| 688 | # Създаване на директория за backup, ако не съществува |
| 689 | mkdir -p $BACKUP_DIR |
| 690 | |
| 691 | # Функция за логване |
| 692 | log() { |
| 693 | echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE |
| 694 | } |
| 695 | |
| 696 | log "Стартиране на backup процеса" |
| 697 | |
| 698 | # Създаване на backup |
| 699 | tar -czf $BACKUP_DIR/$BACKUP_NAME \ |
| 700 | /etc \ |
| 701 | /home \ |
| 702 | /var/www \ |
| 703 | /var/log \ |
| 704 | /var/lib/mysql 2>/dev/null |
| 705 | |
| 706 | if [ $? -eq 0 ]; then |
| 707 | log "Backup успешно създаден: $BACKUP_NAME" |
| 708 | else |
| 709 | log "Грешка при създаване на backup" |
| 710 | exit 1 |
| 711 | fi |
| 712 | |
| 713 | # Изтриване на стари backups (по-стари от 7 дни) |
| 714 | find $BACKUP_DIR -type f -name "backup_*.tar.gz" -mtime +7 -exec rm -f {} \; |
| 715 | log "Изтрити са стари backups (по-стари от 7 дни)" |
| 716 | |
| 717 | log "Backup процесът завърши успешно" |
| 718 | EOF |
| 719 | |
| 720 | chmod +x /usr/local/bin/backup-server.sh |
| 721 | |
| 722 | # Добавяне към cron за автоматично изпълнение |
| 723 | if [ ! -f /etc/cron.d/backup-job ]; then |
| 724 | echo "0 2 * * * root /usr/local/bin/backup-server.sh" > /etc/cron.d/backup-job |
| 725 | fi |
| 726 | |
| 727 | check_success "Backup скриптът е създаден" "Грешка при създаване на backup скрипт" |
| 728 | } |
| 729 | |
| 730 | # Основно меню с опции |
| 731 | main_menu() { |
| 732 | while true; do |
| 733 | clear |
| 734 | generate_system_info |
| 735 | echo -e "${BLUE}==============================================${NC}" |
| 736 | echo -e "${GREEN} UBUNTU SERVER НАЧАЛНА НАСТРОЙКА ${NC}" |
| 737 | echo -e "${BLUE}==============================================${NC}" |
| 738 | echo -e "Моля, изберете операциите, които искате да изпълните:" |
| 739 | echo "" |
| 740 | echo -e "${YELLOW}1) Настройка на времева зона (Europe/Sofia)${NC}" |
| 741 | echo -e "${YELLOW}2) Актуализиране на системата${NC}" |
| 742 | echo -e "${YELLOW}3) Инсталиране на основни пакети${NC}" |
| 743 | echo -e "${YELLOW}4) Конфигуриране на защитна стена (UFW)${NC}" |
| 744 | echo -e "${YELLOW}5) Конфигуриране на Fail2ban${NC}" |
| 745 | echo -e "${YELLOW}6) Създаване на нов администраторски потребител${NC}" |
| 746 | echo -e "${YELLOW}7) Подобряване на SSH конфигурацията${NC}" |
| 747 | echo -e "${YELLOW}8) Настройка на автоматични актуализации${NC}" |
| 748 | echo -e "${YELLOW}9) Настройка на swap пространство${NC}" |
| 749 | echo -e "${YELLOW}10) Настройка на NTP (синхронизация на времето)${NC}" |
| 750 | echo -e "${YELLOW}11) Добавяне на системен банер${NC}" |
| 751 | echo -e "${YELLOW}12) Настройка на системни параметри (sysctl)${NC}" |
| 752 | echo -e "${YELLOW}13) Инсталиране на ClamAV антивирус${NC}" |
| 753 | echo -e "${YELLOW}14) Настройка на системно логване${NC}" |
| 754 | echo -e "${YELLOW}15) Инсталиране на RKHunter${NC}" |
| 755 | echo -e "${YELLOW}16) Настройка на мрежови параметри${NC}" |
| 756 | echo -e "${YELLOW}17) Създаване на backup скрипт${NC}" |
| 757 | echo "" |
| 758 | echo -e "${GREEN}A) Изпълни всички основни операции (1-11)${NC}" |
| 759 | echo -e "${GREEN}B) Изпълни всички разширени операции (12-17)${NC}" |
| 760 | echo -e "${GREEN}C) Изпълни всички операции (1-17)${NC}" |
| 761 | echo -e "${RED}Q) Изход${NC}" |
| 762 | echo -e "${BLUE}==============================================${NC}" |
| 763 | |
| 764 | read -p "Въведете вашия избор: " USER_CHOICE |
| 765 | |
| 766 | case $USER_CHOICE in |
| 767 | 1) set_timezone; pause ;; |
| 768 | 2) update_system; pause ;; |
| 769 | 3) install_essential_packages; pause ;; |
| 770 | 4) configure_firewall; pause ;; |
| 771 | 5) configure_fail2ban; pause ;; |
| 772 | 6) create_admin_user; pause ;; |
| 773 | 7) harden_ssh; pause ;; |
| 774 | 8) setup_automatic_updates; pause ;; |
| 775 | 9) configure_swap; pause ;; |
| 776 | 10) configure_ntp; pause ;; |
| 777 | 11) add_banner; pause ;; |
| 778 | 12) configure_sysctl; pause ;; |
| 779 | 13) install_clamav; pause ;; |
| 780 | 14) configure_journald; pause ;; |
| 781 | 15) install_rkhunter; pause ;; |
| 782 | 16) configure_network; pause ;; |
| 783 | 17) create_backup_script; pause ;; |
| 784 | [Aa]) |
| 785 | set_timezone |
| 786 | update_system |
| 787 | install_essential_packages |
| 788 | configure_firewall |
| 789 | configure_fail2ban |
| 790 | create_admin_user |
| 791 | harden_ssh |
| 792 | setup_automatic_updates |
| 793 | configure_swap |
| 794 | configure_ntp |
| 795 | add_banner |
| 796 | echo -e "${GREEN}Всички основни операции са изпълнени успешно!${NC}" |
| 797 | pause |
| 798 | ;; |
| 799 | [Bb]) |
| 800 | configure_sysctl |
| 801 | install_clamav |
| 802 | configure_journald |
| 803 | install_rkhunter |
| 804 | configure_network |
| 805 | create_backup_script |
| 806 | echo -e "${GREEN}Всички разширени операции са изпълнени успешно!${NC}" |
| 807 | pause |
| 808 | ;; |
| 809 | [Cc]) |
| 810 | set_timezone |
| 811 | update_system |
| 812 | install_essential_packages |
| 813 | configure_firewall |
| 814 | configure_fail2ban |
| 815 | create_admin_user |
| 816 | harden_ssh |
| 817 | setup_automatic_updates |
| 818 | configure_swap |
| 819 | configure_ntp |
| 820 | add_banner |
| 821 | configure_sysctl |
| 822 | install_clamav |
| 823 | configure_journald |
| 824 | install_rkhunter |
| 825 | configure_network |
| 826 | create_backup_script |
| 827 | echo -e "${GREEN}Всички операции са изпълнени успешно!${NC}" |
| 828 | pause |
| 829 | ;; |
| 830 | [Qq]) |
| 831 | echo -e "${GREEN}Изход от скрипта.${NC}" |
| 832 | exit 0 |
| 833 | ;; |
| 834 | *) |
| 835 | echo -e "${RED}Невалиден избор. Моля, опитайте отново.${NC}" |
| 836 | pause |
| 837 | ;; |
| 838 | esac |
| 839 | done |
| 840 | } |
| 841 | |
| 842 | # Стартиране на основното меню |
| 843 | main_menu |