Linux — от практиката

Част 4: Сигурност и права
(SSH, sudo, iptables)

В железопътните системи сигурността не е просто парола – това е система от процедури, които гарантират, че само точният човек, в точния момент, може да извърши точното действие. Същото важи и за сървърите. В тази статия споделям как защитавам сървърите си – от SSH до firewall.

Сигурността не е еднократен акт. Това е непрекъснат процес, който започва още с първата SSH връзка към сървъра. Всеки допълнителен потребител, всяка отворена услуга, всяка промяна в конфигурацията – всичко това променя сигурността на системата.

1. Как мисля за сигурността

Преди години, когато за първи път инсталирах собствен сървър, сигурността ми се струваше като нещо, което "се прави накрая". Бързо разбрах, че това е грешка. Сигурността започва още при първата конфигурация.

В работата ми с железопътни спирачки има едно правило, което пренасям и в IT: никога не допускай човек до системата, ако не знаеш какво точно може да направи. В Linux това означава: контролирай достъпа, минимизирай привилегиите, следи за нередности.

2. SSH – първата линия на защита

SSH е вратата към сървъра. Ако тази врата не е добре заключена, всичко останало няма значение. Ето как конфигурирам SSH на сървърите си.

/etc/ssh/sshd_config – основни настройки
# Променя стандартния порт (за да намаля автоматичните атаки)
Port 2222

# Забранявам root вход през SSH
PermitRootLogin no

# Изисквам публични ключове (без пароли)
PubkeyAuthentication yes
PasswordAuthentication no

# Разрешавам само конкретни потребители
AllowUsers fedia deploy

# Забранявам празни пароли
PermitEmptyPasswords no

# Ограничавам опитите за вход
MaxAuthTries 3
MaxSessions 5
Моят принцип: никога не оставям SSH на порт 22 с паролен достъп. Това е като да оставиш ключа на вратата на гарата – рано или късно някой ще влезе.

3. SSH ключове – вместо пароли

Паролите се отгатват, открадват или подхлъзват. Публичните ключове са много по-сигурни. Ето как ги използвам.

Генериране на SSH ключ (на клиента)
# Генериране на ED25519 ключ (по-бърз и сигурен от RSA)
ssh-keygen -t ed25519 -C "[email protected]"

# Копиране на публичния ключ към сървъра
ssh-copy-id -p 2222 fedia@srv01
Запомни: Приватният ключ никога не трябва да напуска клиентската машина. Ако някой получи достъп до него, има достъп до всички сървъри, на които имаш ключ.

4. sudo – контролирани привилегии

Не всеки потребител трябва да има root права. И дори тези, които ги имат, не трябва да ги използват за всичко. sudo ми дава инструмент за прецизен контрол.

/etc/sudoers – примери за ограничения
# Позволявам на потребител fedia да рестартира само nginx
fedia ALL=(ALL) /usr/bin/systemctl restart nginx

# Позволявам на deploy да изпълнява само определени скриптове
deploy ALL=(ALL) /usr/local/bin/deploy.sh

# Забранявам използването на shell
fedia ALL=(ALL) !/bin/bash

Редактирам /etc/sudoers само с visudo, защото той проверява синтаксиса преди да запише. Една грешка в sudoers може да те заключи извън системата.

5. Firewall – iptables и nftables

Firewall е втората врата. Ако SSH е входната врата, firewall е оградата около целия имот. В миналото използвах iptables. В днешно време преминах към nftables.

Основни правила с nftables
# Позволявам SSH (на порт 2222)
nft add rule inet filter input tcp dport 2222 accept

# Позволявам HTTP и HTTPS
nft add rule inet filter input tcp dport 80 accept
nft add rule inet filter input tcp dport 443 accept

# Позволявам връзки от локалния интерфейс
nft add rule inet filter input iif lo accept

# Позволявам вече установени връзки
nft add rule inet filter input ct state established,related accept

# Всичко останало се отхвърля
nft add rule inet filter input drop

# Запазване на правилата
nft list ruleset > /etc/nftables.conf
Винаги тествай firewall правилата, преди да ги запишеш. Ако загубиш SSH достъп, ще трябва да ходиш до физическата конзола или да рестартираш сървъра.

6. Fail2ban – автоматична защита

Дори и с ключове, опитите за вход продължават. fail2ban автоматично блокира IP адреси, които правят твърде много неуспешни опити.

Инсталиране и конфигурация
# Инсталиране на fail2ban
apt install fail2ban

# Копиране на конфигурацията
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# Редактиране на jail.local
nano /etc/fail2ban/jail.local
/etc/fail2ban/jail.local – настройки
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600  # 1 час

7. Права на файловете – chmod, chown, chattr

В Linux всичко е файл. И правата на тези файлове определят кой какво може да прави. Това не е просто теория – това е основният механизъм за сигурност.

Основни команди за права
# Собственик и група
chown fedia:www-data /var/www/app
chown -R fedia:www-data /var/www/app

# Права за четене/запис/изпълнение
chmod 755 /var/www/app      # rwx r-x r-x
chmod 640 /etc/nginx/nginx.conf  # rw- r-- ---

# Защита от промяна (дори от root)
chattr +i /etc/nginx/nginx.conf  # става immutable
chattr -i /etc/nginx/nginx.conf  # връщане
Важно: Никога не давай chmod 777 на нищо. Това е като да оставиш отворен сейфа – дори и да няма никой наоколо, рано или късно ще се появи някой.

8. Логове – сигурността започва с наблюдение

Без логове не мога да разбера какво се е случило. /var/log/auth.log и journalctl са моите очи.

Проверка на логове за сигурност
# Неуспешни опити за вход
grep "Failed password" /var/log/auth.log

# Успешни входове
grep "Accepted" /var/log/auth.log

# sudo команди
grep "sudo" /var/log/auth.log

# Всичко в journalctl
journalctl -u sshd -f

9. Аудит на системата – lynis и rkhunter

Периодично използвам инструменти за сканиране на системата – lynis и rkhunter. Те проверяват за слаби места, неправилни конфигурации и следи от компрометиране.

Инсталиране и изпълнение
# Инсталиране на lynis
apt install lynis

# Изпълнение на сканиране
lynis audit system

# Инсталиране на rkhunter
apt install rkhunter

# Изпълнение на проверка
rkhunter --check

10. Практически правила, които следвам

Правило Защо
Променям SSH порта Намалява автоматичните атаки
Използвам само ключове за SSH Паролите се крадат или отгатват
Забранявам root SSH Root акаунтът не трябва да бъде достъпен директно
Използвам fail2ban Автоматична защита от брутални атаки
Firewall правила Отварям само най-необходимите портове
Минимални привилегии sudo, а не root, и то само за конкретни команди
Периодични проверки lynis, rkhunter, проверка на логове
Актуализации apt update && apt upgrade – редовно

11. Най-честите грешки

  • Оставяне на SSH на порт 22 с паролен достъп;
  • Работа като root за ежедневни задачи;
  • Забрава за актуализиране на пакетите;
  • Отваряне на твърде много портове в firewall-а;
  • Пренебрегване на логовете;
  • Използване на едни и същи пароли за различни сървъри;
  • Доверие на "сигурността по подразбиране".
Моят принцип: Сигурността не е перфектна, ако не можеш да я възстановиш след авария. Затова имам план за възстановяване, и той започва с добрия backup.

12. Заключение

Сигурността в Linux не е сложна, но изисква дисциплина. Това не са само команди – това е начин на мислене. Всеки допълнителен потребител, всяка отворена услуга, всяка промяна – всичко това трябва да бъде обмислено.

В тази статия споделих как подхождам към сигурността на сървърите си. Това не е изчерпателен списък, а основата, върху която надграждам.

В следващата част ще се потопим в скриптовете и автоматизацията – как пиша bash скриптове, които спестяват време и гарантират, че нищо не се забравя.

Запомни: Сигурният сървър не е този, който е толкова заключен, че никой не може да работи. Сигурният сървър е този, в който знаеш точно кой какво може да прави и следиш за промени.