Перейти к основному содержимому

Безопасность сервера

Комплексное руководство по обеспечению безопасности Linux сервера.

Обновление системы

Ubuntu/Debian

sudo apt update && sudo apt upgrade -y

sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

# Настройка автоматических обновлений
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
"${distro_id}ESM:${distro_codename}-infra-security";
};

Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::MinimalSteps "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "false";

CentOS/RHEL

sudo yum update -y

sudo yum install yum-cron
sudo systemctl enable yum-cron
sudo systemctl start yum-cron

SSH безопасность

Настройка SSH

sudo nano /etc/ssh/sshd_config
# Изменить порт по умолчанию
Port 2222

# Отключить root login
PermitRootLogin no

# Отключить аутентификацию по паролю
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

# Разрешить только определенных пользователей
AllowUsers username

# Настройка времени соединения
ClientAliveInterval 300
ClientAliveCountMax 2

# Отключить X11 forwarding если не нужен
X11Forwarding no

# Максимальное количество попыток входа
MaxAuthTries 3
MaxSessions 2

# Протокол только SSH версии 2
Protocol 2

Генерация SSH ключей

# Генерация ED25519 ключа (рекомендуется)
ssh-keygen -t ed25519 -C "your_email@example.com"

# Или RSA 4096 бит
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# Копирование публичного ключа на сервер
ssh-copy-id -p 2222 username@server_ip

# Или вручную
cat ~/.ssh/id_ed25519.pub | ssh username@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Двухфакторная аутентификация

sudo apt install libpam-google-authenticator

# Настройка для пользователя
google-authenticator

# Настройка PAM
sudo nano /etc/pam.d/sshd

Добавить в начало файла:

auth required pam_google_authenticator.so
sudo nano /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

Firewall настройка

UFW (Ubuntu)

sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH (измените порт если нужно)
sudo ufw allow 2222/tcp

# HTTP и HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# MySQL (только с определенного IP)
sudo ufw allow from 192.168.1.100 to any port 3306

# Включение firewall
sudo ufw enable

# Проверка статуса
sudo ufw status verbose

Firewalld (CentOS/RHEL)

sudo systemctl enable firewalld
sudo systemctl start firewalld

# Создание зоны для веб-сервера
sudo firewall-cmd --new-zone=webserver --permanent
sudo firewall-cmd --reload

sudo firewall-cmd --zone=webserver --add-service=http --permanent
sudo firewall-cmd --zone=webserver --add-service=https --permanent
sudo firewall-cmd --zone=webserver --add-port=2222/tcp --permanent

# Добавление интерфейса в зону
sudo firewall-cmd --zone=webserver --change-interface=eth0 --permanent
sudo firewall-cmd --reload

iptables

#!/bin/bash
# Скрипт настройки iptables

# Очистка существующих правил
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# Политики по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Разрешить loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Разрешить установленные соединения
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Защита от DDoS
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

# Сохранение правил
iptables-save > /etc/iptables/rules.v4

Обнаружение вторжений

Fail2Ban

sudo apt install fail2ban

sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
backend = systemd

[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600

[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log

[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 6

[nginx-badbots]
enabled = true
port = http,https
filter = nginx-badbots
logpath = /var/log/nginx/access.log
maxretry = 2

[nginx-noproxy]
enabled = true
port = http,https
filter = nginx-noproxy
logpath = /var/log/nginx/access.log
maxretry = 2

AIDE (Advanced Intrusion Detection Environment)

sudo apt install aide

# Инициализация базы данных
sudo aideinit

# Проверка целостности
sudo aide --check

# Обновление базы данных
sudo aide --update

Мониторинг и аудит

Logwatch

sudo apt install logwatch

sudo nano /etc/logwatch/conf/logwatch.conf
LogDir = /var/log
TmpDir = /var/cache/logwatch
MailTo = admin@example.com
MailFrom = logwatch@server.com
Print = No
Range = Yesterday
Detail = Med
Service = All
Format = html

Auditd

sudo apt install auditd

sudo nano /etc/audit/rules.d/audit.rules
# Мониторинг изменений в критических файлах
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/group -p wa -k group_changes
-w /etc/sudoers -p wa -k sudoers_changes

# Мониторинг системных вызовов
-a always,exit -F arch=b64 -S chmod -F auid>=1000 -F auid!=4294967295 -k perm_mod
-a always,exit -F arch=b64 -S chown -F auid>=1000 -F auid!=4294967295 -k perm_mod

# Мониторинг входов в систему
-w /var/log/wtmp -p wa -k session
-w /var/log/btmp -p wa -k session

# Запуск auditd
sudo systemctl enable auditd
sudo systemctl start auditd

Защита веб-сервера

Nginx безопасность

# /etc/nginx/conf.d/security.conf

# Скрытие версии Nginx
server_tokens off;

# Безопасные заголовки
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

# Ограничение размера запроса
client_max_body_size 1M;

# Защита от медленных атак
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 5s 5s;
send_timeout 10s;

# Блокировка нежелательных User-Agent
if ($http_user_agent ~* (nmap|nikto|wikto|sf|sqlmap|bsqlbf|w3af|acunetix|havij|appscan)) {
return 444;
}

# Блокировка подозрительных запросов
location ~* \.(sql|bak|old|tar|gz|zip|rar)$ {
deny all;
}

location ~* /\. {
deny all;
}

Apache безопасность

# /etc/apache2/conf-available/security.conf

# Скрытие версии Apache
ServerTokens Prod
ServerSignature Off

# Безопасные заголовки
Header always set X-Frame-Options SAMEORIGIN
Header always set X-Content-Type-Options nosniff
Header always set X-XSS-Protection "1; mode=block"
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

# Отключение опасных методов HTTP
<LimitExcept GET POST HEAD>
Require all denied
</LimitExcept>

# Защита важных файлов
<Files ~ "^\.">
Require all denied
</Files>

<Files ~ "\.(sql|bak|old|tar|gz|zip|rar)$">
Require all denied
</Files>

Резервное копирование

Автоматизированный скрипт резервного копирования

#!/bin/bash
# /usr/local/bin/backup.sh

BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER="backup_user"
MYSQL_PASS="backup_password"
RETENTION_DAYS=7

# Создание директории для бэкапов
mkdir -p $BACKUP_DIR/$DATE

# Резервное копирование файлов
tar -czf $BACKUP_DIR/$DATE/files_$DATE.tar.gz \
/etc \
/home \
/var/www \
--exclude=/var/www/*/logs

# Резервное копирование базы данных MySQL
mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases | gzip > $BACKUP_DIR/$DATE/mysql_$DATE.sql.gz

# Резервное копирование PostgreSQL
sudo -u postgres pg_dumpall | gzip > $BACKUP_DIR/$DATE/postgresql_$DATE.sql.gz

# Удаление старых бэкапов
find $BACKUP_DIR -type d -mtime +$RETENTION_DAYS -exec rm -rf {} +

# Отправка на удаленный сервер
rsync -av --delete $BACKUP_DIR/ backup@remote-server:/backup/

# Логирование
echo "$(date): Backup completed successfully" >> /var/log/backup.log

Сканирование уязвимостей

Lynis

sudo apt install lynis

# Полное сканирование системы
sudo lynis audit system

# Сканирование с детальным выводом
sudo lynis audit system --verbose

# Проверка обновлений
sudo lynis update info

Nmap для самодиагностики

# Сканирование портов на локальном сервере
nmap -sS -O localhost

# Детальное сканирование
nmap -sV -sC -A your-server-ip

# Сканирование на уязвимости
nmap --script vuln your-server-ip

Мониторинг процессов

htop и системный мониторинг

sudo apt install htop iotop nethogs

# Создание скрипта мониторинга
cat > /usr/local/bin/monitor.sh << 'EOF'
#!/bin/bash

echo "=== CPU Usage ==="
top -bn1 | grep "Cpu(s)" | awk '{print $2 $3 $4 $5}'

echo "=== Memory Usage ==="
free -h

echo "=== Disk Usage ==="
df -h

echo "=== Network Connections ==="
netstat -tuln | grep LISTEN

echo "=== Failed Login Attempts ==="
grep "Failed password" /var/log/auth.log | tail -5

echo "=== High CPU Processes ==="
ps aux --sort=-%cpu | head -10
EOF

chmod +x /usr/local/bin/monitor.sh

Защита от DDoS

Rate limiting с iptables

#!/bin/bash
# DDoS protection script

# Лимит новых соединений на HTTP
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT

# Лимит на количество пакетов в секунду
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

# Защита от SYN flood
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A INPUT -p tcp --syn -j DROP

# Защита от ping flood
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

Hardening системы

Kernel параметры

sudo nano /etc/sysctl.conf
# IP спуфинг защита
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Игнорировать ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# Игнорировать ICMP ping запросы
net.ipv4.icmp_echo_ignore_all = 1

# Защита от SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5

# Применение изменений
sudo sysctl -p

Отключение ненужных сервисов

# Проверка активных сервисов
systemctl list-units --type=service --state=active

# Отключение ненужных сервисов
sudo systemctl disable telnet
sudo systemctl disable rsh
sudo systemctl disable rlogin
sudo systemctl disable vsftpd
sudo systemctl disable apache2