ubuntu_server_Initial_setup.sh
· 37 KiB · Bash
Eredeti
#!/bin/bash
# Ubuntu Server Initial Setup Script
# Автор: Fedya Serafiev
# Дата: 15 юли 2025
# Версия: 2.2
#
# Този скрипт извършва основните задачи за първоначална настройка на 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 | # Дата: 15 юли 2025 |
6 | # Версия: 2.2 |
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 |