Безопасность сервера
Комплексное руководство по обеспечению безопасности 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