---
# System prepended metadata

title: 'Инструкция к Практической работе_14 "Список задач по усилению безопасности сервера Linux, которые необходимо сделать."'

---

# Инструкция к Практической работе_14 "Список задач по усилению безопасности сервера Linux, которые необходимо сделать."

### 1. Шифрование передачи данных для сервера Linux
**Передача данных через sftp:**

Так как SFTP работает поверх SSH, первым делом необходимо установить OpenSSH как со стороны сервера (хранилища):

```html
$ sudo apt install openssh-server
```

Также необходимо установить ssh на стороне клиента (устройства, с которого планируется доступ к хранилищу):

```html
$ sudo apt install ssh
```

Для безопасного использования SFTP, лучше всего создать группы и пользователей, которые будут использовать только эту службу:

```html
$ sudo useradd -g sftpgroup sftpuser
$ sudo passwd sftpuser
```

Cоздадим каталоги и изменим их доступ:

```html
$ sudo mkdir -p /data/sftpuser/upload 
$ chown -R root.sftpgroup /data/sftpuser 
$ chown -R sftpuser.sftpgroup /data/sftpuser/upload
```

*Важно: убедитесь, что владелец /data/sftpuser - root, это обязательно для изменения корневого каталога в SFTP.*

Далее нужно настроить сервер так, чтобы когда пользователь, из группы **sftpgroup**, входил в систему, он попадал в **sftp** вместо обычной оболочки, в которую попадает через **ssh**. Для этого нужно добавьте фрагмент кода в файл /etc/ssh/sshd_config. Для редактирования файлов в Linux существует текстовый редактор nano. Чтобы воспользоваться им достаточно выполнить команду nano “путь к файлу”:

```html
$ nano /etc/ssh/sshd_config
```

Добавляем следующее:

```html
Match Group sftpgroup
ChrootDirectory /data/%u
ForceCommand internal-sftp
```

ChrootDirectory позволяет создать необходимый каталог в качестве корневого узла (/ каталог) в дереве каталогов. Вошедший в систему пользователь не сможет увидеть ничего выше этого каталога и это не даст ему получить доступ к файлам других пользователей. %u - это код для заполнения текущим именем пользователя во время входа в систему.

Для сохранения файла нажимаем ctrl + O, и выходим из редактора с помощью ctrl + X.

Чтобы выполнить внесенные в sshd_config изменения, перезапустите службу:

```html
$ sudo systemctl restart sshd
```

Доступ по sftp осуществляется аналогично с ssh → **sftp username@host** (чтобы узнать ip-адрес хоста выполните команду **ip a**) :

```html
$ sftp sftpuser@192.168.183.128
```

После успшеного подключения при необходимости загрузки файлов с удаленного хоста мы можем воспользоваться следующей командой для выполнения этой задачи:
`sftp> get FileName`

По умолчанию команда get загружает удаленный файл и сохраняет файл с тем же именем в локальной файловой системе. Мы можем указать имя, с которым сохранится файл, добавив его в вышеуказанную команду:

`sftp> get FileName NewName`

Команда `get` также имеет несколько флагов. Например, мы можем скопировать каталог и все его содержимое с помощью рекурсивной опции:
`sgtp> get -r DirectoryName`

Передача файлов в удаленную систему осуществляется таким же удобным образом с помощью команды с именем «put»:

`sftp> put FileName`

Директории передаются аналогичным с получением образом:

`sgtp> put -r DirectoryName`

Одним из хорошо знакомых инструментов, который может быть полезен при скачивании и загрузке файлов, является команда `df`, которая работает схожим образом с используемой в командной строке версией данной инструкции. Она позволяет убедиться, что у вас в распоряжении есть достаточное количество места для передачи данных, которые вас интересуют:

`sftp> df -h`

Вывод команды:

```
Output
    Size     Used    Avail   (root)    %Capacity
  19.9GB   1016MB   17.9GB   18.9GB           4%
```

Обратите внимание, что локального варианта этой команды нет, но мы можем обойти это ограничение, воспользовавшись `!` в качестве команды.

Команда `!` перемещает нас в локальную оболочку, где можно
запустить любую команду в локальной системе.  Выполнив её, мы можем проверить использование диска также с помощью `df -h`. Чтобы вернуться в сеанс SFTP, введите `exit` .

Для удаления файлов в удаленной системе используется команда **rm**:

`sftp> rm FileName`

### 2. Избегайте использования служб FTP, Telnet и Rlogin / Rsh в Linux

Удаляем устаревшие и небезопасные службы:
![](https://i.imgur.com/LaQROfA.png)


### 3. Минимизация программного обеспечения для минимизации уязвимостей в Linux

`# dpkg --list`

![](https://i.imgur.com/LfN5bkv.png)

Удалим, к примеру, демон сбора логов rsyslog:

```
rc  rsyslog                               8.2102.0-2+deb11u1               amd64        reliable system and kernel logging daemon
```

```
root@debian:/# apt-get autoremove rsyslog
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package 'rsyslog' is not installed, so not removed
The following packages will be REMOVED:
  linux-image-5.10.0-15-amd64
0 upgraded, 0 newly installed, 1 to remove and 4 not upgraded.
After this operation, 302 MB disk space will be freed.
Do you want to continue? [Y/n] y

```

### 4. Одна сетевая служба на систему или экземпляр виртуальной машины

К примеру, на одной машине будет крутиться apache:

![](https://i.imgur.com/pW7q3jO.png)

На другой сервер сбора логов:

![](https://i.imgur.com/sCnhYim.png)


### 5. Поддерживайте ядро и программное обеспечение Linux в актуальном состоянии

Устанавливаем обновления:

![](https://i.imgur.com/EnsUcKM.png)

Настраиваем автоматическое обновление:

![](https://i.imgur.com/PNLORna.png)

### 6. Используйте расширения безопасности Linux
> см. пункт 7 (SELinux)

### 7. SELinux

Установим SELinux в Debian:

```
root@debian:/# apt-get install selinux-basics selinux-policy-default
```

Перейдем в конфигурационный файл:

```
root@debian:/# nano /etc/selinux/config
```

Нам необходимо изменить значение параметра SELINUX. Он может принимать следующие значения:
```
 enforcing - SELinux включен.
 permissive - SELinux лишь отправляет предупреждения.
 disabled - SELinux выключен.
```
 
 Устанавливаем значение `enforcing`


### 8. Учетные записи пользователей Linux и строгая политика паролей
Установим утилиту pam-cracklib

```
root@debian:/# sudo apt-get install libpam-cracklib
```

Перейдем в конфигурационный файл:

```
sudo nano /etc/pam.d/common-password
```

Найдем там такую строчку:

```
password        requisite                       pam_cracklib.so retry=3 minlen=8 difok=3
```

И изменим её следующим образом:

```
password        requisite                       pam_cracklib.so retry=3 minlen=16 difok=3 ucredit=-1 lcredit=-2 ocredit=-2
```

Где:

    retry=3 : попыток до вывода ошибки
    minlen=16 : минимальная длина пароля
    difok=3 : количество символов, на которое должен отличаться новый пароль от предыдущего
    ucredit=-1 : как минимум один символ - в верхнем регистре
    lcredit=-2 : как минимум два символа - в нижнем регистре
    ocredit=-2 : как минимум два символа

### 9. Настройка смены паролей для пользователей Linux для повышения безопасности

Пример настройки правил для учетной записи польователя user:

![](https://i.imgur.com/1a0cvvm.png)


### 10. Ограничение использования прежних паролей в Linux

Открываем файл :

```
root@debian:/# nano /etc/pam.d/common-password
```

Добавляем туда следующие строчки чтобы пользователи не могли повторно использовать четыре недавно использованных пароля (значение параметра remember = 4) : 
```
auth      sufficient   pam_unix.so likeauthnullok

password             sufficient               pam_unix.so remember=4
```

### 11. Блокировка учетных записей пользователей после неудачного входа в систему
Faillog отображает все неудачные попытки входа пользователя. Если неудачных попыток слишком много, то учетную запись можно отключить с помощью faillog.
Faillog использует этот файл (/var/log/faillog) для отображения неудачных входов в систему. Faillog введенный сам по себе выводит все неудачные попытки пользователя.
После неудачного входа пользователь может быть заблокирован на указанное время с опцией -l. Чтобы заблокировать учетную запись (user2) на 1 минуту (60 секунд), используйте следующее:

`# faillog -l 60 -u user2`

```
# faillog
Login Failures Maximum Latest On

user2 2 0 06/28/22 15:28:32 +0530 tty1 [51s left]
```

Как видите, в последнем столбце отображается оставшееся время с момента неудачного входа в систему. Параметр -u используется для указания имени пользователя (чья учетная запись должна быть заблокирована). Кроме того, с помощью параметра -m можно установить максимальное количество попыток входа в систему.

`# faillog -m 0 -u user2`

Эта команда отключит учетную запись после 3 неудачных входов в систему.

### 12. Как проверить, что ни одна учетная запись не имеет пустых паролей?

Создадим пользователя с пустым паролем:
```
useradd usernopswd
```

Теперь выведем список пользователей без пароля:
```
root@debian:/# awk -F: '($2 == "") {print}' /etc/shadow
usernopswd::19193:0:99999:7:::
```
Заблокируем эту учетную запись:
```
root@debian:/# passwd -l usernopswd
```

Откроем файл /etc/shadow и убедимся что учетная запись usernopswd заблокирована (второе поле содержит значение !)
`usernopswd:!:19193:0:99999:7:::`

### 13. Убедитесь, что ни одна не корневая учетная запись не имеет UID, установленного на 0.

![](https://i.imgur.com/iLuxte7.png)

### 14. Отключить вход под пользователем root

Прежде всего создадим пользователя с правами суперпользователя:

```
root@debian:/# sudo useradd -m admin
root@debian:/# passwd admin
New password: 
Retype new password: 
passwd: password updated successfully
root@debian:/# sudo usermod -aG sudo admin
```
Зайдем в новую учетку:
```
root@debian:/# su admin
```

И изменим в файле:
```
$ sudo nano /etc/passwd
```
Следующую строчку:

```
#было:
root:x:0:0:root:/root:/bin/bash
#стало:
root:x:0:0:root:/root:/sbin/nologin
```

Теперь попробуем войти в root:
```
$ su
Password: 
This account is currently not available.
```

### 15. Безопасность физических серверов

Настроим вход в меню BIOS по паролю. Для этого зайдем в BIOS, перейдем во вкладку Security и установим пароль (если пароль уже установлен, нужно будет ввести сначала его):
![](https://i.imgur.com/JNIXqjK.png)

Теперь установим значение Password on boot = enabled:

![](https://i.imgur.com/FWjwGNZ.png)

Теперь, перезагрузив систему и войдя в BIOS, система попросит нас ввести пароль: 

![](https://i.imgur.com/VqpOL22.png)




### 16. Отключите ненужные службы Linux

Просмотрим службы и их статус: 
![](https://i.imgur.com/1aYVvPJ.png)

Выключим из автозагрузки службу сбора логов rsyslog и проверим её статус:

```
root@debian:/# systemctl disable rsyslog
Synchronizing state of rsyslog.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable rsyslog
Unit /etc/systemd/system/rsyslog.service is masked, ignoring.
root@debian:/# systemctl status rsyslog
● rsyslog.service
     Loaded: masked (Reason: Unit rsyslog.service is masked.)
     Active: inactive (dead)

```


### 17. Поиск прослушиваемых сетевых портов

Просмотрим порты командой `netstat`:

```
root@debian:/# netstat -ltupan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      591/cupsd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      591/cupsd           
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           518/avahi-daemon: r 
udp        0      0 0.0.0.0:60653           0.0.0.0:*                           518/avahi-daemon: r 
udp        0      0 0.0.0.0:631             0.0.0.0:*                           615/cups-browsed    
udp        0      0 192.168.183.221:68      192.168.183.254:67      ESTABLISHED 522/NetworkManager  
udp6       0      0 :::5353                 :::*                                518/avahi-daemon: r 
udp6       0      0 :::46661                :::*                                518/avahi-daemon: r 

```
Флаг `-l` велит netstat показать все прослушивающие сокеты (сочетания IP-адреса и порта). Тогда как флаг `-t` указывает, что нужно показать все TCP-соединения сетевой подсистемы. Конечно же, флаг `-u `демонстрирует UDP-соединения. Тогда как флаг `-a` отобразит активные соединения.  В то время как флаг `-p` запрашивает данные о программном обеспечении, занимающемся прослушкой портов. Вместо имен служб бывает удобнее видеть числовые значения номеров портов. Это может сделать дополнительный флаг `-n`.

Теперь сделаем тоже самое командой `ss`:

```
root@debian:/# ss -ltupan
Netid State  Recv-Q Send-Q           Local Address:Port       Peer Address:Port Process                                   
udp   UNCONN 0      0                      0.0.0.0:5353            0.0.0.0:*     users:(("avahi-daemon",pid=518,fd=12))   
udp   UNCONN 0      0                      0.0.0.0:60653           0.0.0.0:*     users:(("avahi-daemon",pid=518,fd=14))   
udp   UNCONN 0      0                      0.0.0.0:631             0.0.0.0:*     users:(("cups-browsed",pid=615,fd=7))    
udp   ESTAB  0      0        192.168.183.221%ens33:68      192.168.183.254:67    users:(("NetworkManager",pid=522,fd=23)) 
udp   UNCONN 0      0                         [::]:5353               [::]:*     users:(("avahi-daemon",pid=518,fd=13))   
udp   UNCONN 0      0                         [::]:46661              [::]:*     users:(("avahi-daemon",pid=518,fd=15))   
tcp   LISTEN 0      128                  127.0.0.1:631             0.0.0.0:*     users:(("cupsd",pid=591,fd=7))           
tcp   LISTEN 0      128                      [::1]:631                [::]:*     users:(("cupsd",pid=591,fd=6))       
```

### 18. Удаление систем X Window (X11)

Удалим графическую оболочку, в случае Debian Это будет GNOME:
```
root@debian:/# sudo apt-get autoremove gnome*
```
И перезапустим систему:

```
root@debian:/# sudo reboot
```
Теперь она будет выглядить так:

![](https://i.imgur.com/gTmM6cB.png)

> Рекомендую сделать бэкап системы перед выполнением подобных действий


### 19. Настройка брандмауэра на основе Iptables и TCPWrappers в Linux

iptables — это утилита командной строки, используемая для управления встроенным брандмауэром netfilter, доступным в ядре Linux, начиная с версии 2.4. Брандмауэр — это узел сети, на котором происходит фильтрация сетевого трафика на основе заданных администратором правил. Обеспечить безопасность сервера или инфраструктуры, означает обеспечить отказоустойчивость и стабильность работы ваших серверов и приложений, что крайне чувствительно для бизнеса или персональных проектов.

В глобальной сети огромное количество угроз — боты, периодически прощупывают стандартные точки входа в системы, хулиганы, любопытные, взломщики — люди, целенаправленно пытающиеся получить несанкционированный доступ к информационным системам. Задача iptables — исключить, либо, по крайней мере, минимизировать негативное воздействие со стороны разного рода правонарушителей.

Любой, поступивший пакет на сервер с iptables, проходит через ядро, а именно межсетевой экран netfilter. Каждый из них классифицируется в зависимости от его назначения, попадает в соответствующую ему таблицу и проходит по цепочкам, содержащим правила, установленные администратором.

На основе этих правил, выполняется действие — принять пакет, отбросить, удалить или передать следующему узлу сети.  Иллюстрация, представленная ниже, наглядно показывает путь прохождения пакета по системе:

![](https://i.imgur.com/Z458j0x.png)

Данный рисунок не отражает истинную архитектуру брандмауэра, а показывает только логику работы. Существует много распространенных заблуждений по поводу уровней вложенности таблиц, цепочек, и правил. Самым верхним уровнем представления являются таблицы, которые содержат набор свойственных им цепочек. Цепочки содержат списки правил. Схематично «матрешка» выглядит следующим образом:

![](https://i.imgur.com/yjZbvZF.png)


**Синтаксис iptables**

Сетевой экран iptables очень гибок в настройке и имеет огромное количество разнообразных ключей и опций. Общий вид управляющей команды:

`iptables таблица команда цепочка критерии действие`

Рассмотрим каждый элемент в отдельности.

**Пакет**

Под пакетом понимают структурированный блок данных, содержащий в себе как пользовательскую информацию, называемую ещё полезной нагрузкой, так и служебную информацию, например об адресе отправителя, получателя, времени жизни пакета и многое другое.

**Цепочки**

Существует 5 видов цепочек:

* `PREROUTING` — предназначена для первичной обработки входящих пакетов, адресованных как непосредственно серверу, так и другим узлам сети. Сюда попадает абсолютно весь входящий трафик для дальнейшего анализа.
* `INPUT` — для входящих пакетов, отправленных непосредственно этому серверу.
* `FORWARD` — для проходящих пакетов, не адресованных этому компьютеру, предназначены для передачи следующему узлу, в случае, если сервер выполняет роль маршрутизатора.
* `OUTPUT` — для пакетов, отправленных с этого сервера.
* `POSTROUTING` — здесь оказываются пакеты, предназначенные для передачи на другие узлы сети.

Также есть возможность создавать и удалять собственные цепочки, в большинстве случаев, в этом нет необходимости. Названия цепочек пишут заглавными буквами.

**Таблицы**

В netfilter существуют 5 типов таблиц, каждая из них имеет свое назначение.

* Таблица `raw`. Содержит цепочки PREROUTING и OUTPUT, здесь производятся манипуляции с пакетами до задействования механизма определения состояний.

* Таблица `mangle`. Предназначена для модификации заголовков сетевых пакетов, таких параметров как ToS (Type of Service), TTL (Time To Live), MARK. Содержит все существующие пять цепочек.
* Таблица `nat`. Используется для трансляции сетевых адресов, т.е. подмены адреса получателя/отправителя, применяется, если сервер используется в качестве маршрутизатора. Содержит цепочки PREROUTING, OUTPUT, POSTROUTING.
* Таблица `filter`. Основная таблица, служит для фильтрации пакетов, именно здесь происходит принятие решений о разрешении или запрете дальнейшего движения пакета в системе. Используется по умолчанию, если явно не указано имя другой таблицы. Содержит цепочки INPUT, FORWARD и OUTPUT.
* Таблица `security`. Используется для взаимодействия с внешними системами безопасности, в частности с SELinux и AppArmor. Содержит цепочки INPUT, OUTPUT и FORWARD.

Имена таблиц принято писать строчными буквами.


****
**Действия**

Правилами задается поведение для iptables, каким образом поступить с тем или иным пакетом при попадании под заданные критерии. Решения, которые принимает брандмауэр, называют действиями, самые распространенные из них:

* ACCEPT — разрешить дальнейшее прохождение пакета по системе;
* DROP — выбросить пакет без уведомления отправителя;
* REJECT — отказать в прохождении пакета с уведомлением отправителя, такой способ может привести к дополнительным затратам ресурсов процессора, поэтому, в большинстве случаев рекомендуется использовать DROP;
* LOG — зафиксировать информацию о пакете в файле системного журнала;
* MARK — позволяет помечать определенные пакеты, например для маршрутизации, данная метка перестает существовать, как только пакет покинет брандмауэр;
*  CONNMARK — то же самое, что и MARK, только для соединений;
*  QUEUE — отправляет пакет в очередь приложению для дальнейшего взаимодействия;
* RETURN — прекращение движения пакета по текущей цепочке и возврат в предыдущую цепочку. Если текущая цепочка единственная — к пакету будет применено действие по умолчанию;
* REDIRECT — перенаправляет пакет на указанный порт, в пределах этого же узла, применяется для реализации «прозрачного» прокси;
* DNAT — подменяет адрес получателя в заголовке IP-пакета, основное применение — предоставление доступа к сервисам снаружи, находящимся внутри сети;
* SNAT — служит для преобразования сетевых адресов, применимо, когда за сервером находятся машины, которым необходимо предоставить доступ в Интернет, при этом от провайдера имеется статический IP-адрес;
* MASQUERADE — то же, что и SNAT, но главное отличие в том, что может использоваться, когда провайдер предоставляет динамический адрес, создаёт дополнительную нагрузку на систему по сравнению с SNAT;
* TOS — позволяет управлять битами в одноименном поле заголовка IP-пакета;
* ULOG — более продвинутый вариант записи информации, может писать как в обычный текстовый файл, так и в базу данных;
* TTL — используется для изменения значения поля одноименного заголовка IP-пакета, устанавливает время жизни пакета.

**Команды**

Для iptables команда — это инструкция к действию, при помощи них можно добавлять, удалять и сбрасывать все правила, задавать действия по умолчанию и многое другое. Команды могут подаваться как в сокращенном, так и в полном виде:
---`Полный вид;	-Сокращенный вид;`	Описание

* ---`append;	-A;`	добавить правило в конец указанной цепочки
* —`check;	-C;`	проверить существующие правила в заданной цепочке
* —`delete;	-D;`	удалить правило с указанным номером в заданной цепочке
* —`insert;	-I;`	вставить правило с заданным номером, без указания номера — правило будет по умолчанию добавлено первым
* —`replace;	-R;`	заменить правило с указанным номером
* —`list;	-L;`	вывести список всех действующих правил со всех цепочек, если указать интересующую цепочку — вывод будет сделан только по ней
* —`list-rules;	-S;`	построчный вывод всех правил во всех цепочках, если после ключа указать имя цепочки — будут выведены только ее правила
* —`flush;	-F;`	удалить все правила, при указании имени цепочки — правила удаляться только в ней
* —`zero;	-Z;`	обнулить все счетчики во всех цепочках, при указании цепочки — обнуление произойдет только в ней
* —`new;	-N;`	создать пользовательскую цепочку
* —`delete-chain;	-X;`	удалить пользовательскую цепочку
* —`policy;	-P;`	установить политику по умолчанию для цепочки, обычно это ACCEPT или DROP, она будет применена к пакетам, не попавшим ни под один критерий
* —`rename-chain;	-E;`	переименовать цепочку, сначала указывается текущее имя, через пробел — новое
* —`help;	-h;`	вывести справочную информацию по синтаксису iptables

**Критерии**

Чтобы к пакету применить какое-либо действие, необходимо, чтобы он попал под определенные критерии. Одно правило может содержать несколько критериев. Они, как и команды, имеют полную и сокращенную форму. Некоторые из них поддерживают логическую НЕ, если перед ними поставить знак ! — критерий будет инвертирован. Список ниже:

---`Полный вид;	-Сокращенный вид;`	Описание

* —`protocol;	-p;`	указывает протокол, такие как tcp, udp, udplite и другие, поддерживаемые системой, ознакомиться со списком можно в файле /etc/protocols
* —`source;	-s;`	указывает адрес источника пакета, в качестве значения можно указать как один IP-адрес, так и диапазон
* —`destination;	-d;`	адрес получателя, синтаксис аналогичен предыдущему пункту
* —`match;	-m;`	подключает указанный модуль
* —`jump;	-j;`	когда правило подошло — выполнить указанное действие
* —`goto;	-g;`	перейти к указанной цепочке правил
* —`in-interface;	-i;`	задает входящий сетевой интерфейс
* —`out-interface;	-o;`	указывает исходящий сетевой интерфейс
* —`fragment;	-f;`	указывает на фрагменты фрагментированных пакетов
* —`set-counters;	-c;`	устанавливает начальные значения счетчиков пакетов и байт
* —`destination-port;	—dport;`	порт получателя пакета
* —`source-port;	—sport;`	порт отправителя пакета

**Состояние соединений**

Система отслеживания состояния соединений `conntrack` — важная часть сетевого стека linux, встроенная в ядро. Используется для сопоставления пакетов с конкретными соединениями. Под анализ попадают все пакеты, кроме помеченных NOTRACK, в таблице raw. Все пакеты классифицируются на:

* NEW — открывается новое соединение, пришел только первый пакет;
* ESTABLISHED — соединение установлено, пришел уже не первый пакет в рамках этого сеанса. При правильной настройке iptables — такие пакеты проходят по системе без фильтрации, поскольку она уже была выполнена для первого пакета соединения;
* RELATED — открывается новое соединение, связанное с другим сеансом, имеющим статус ESTABLISHED;
* INVALID — помечаются пакеты, которые не связаны ни с одним из существующих соединений, и не могут создать новое, их невозможно идентифицировать. В целях безопасности рекомендуется остановить движение таких пакетов по системе, используя действие DROP.

**Настройка**

Перейдем к настройке iptables. Заблокировать входящий трафик с ip-адресом отправителя `192.168.10.20` можно следующей командой

```
root@debian:/# sudo iptables -A INPUT -s 192.168.10.20 -j DROP
```
Посмотреть установленные правила можно с помощью следующей команды:

```
root@debian:/#  sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  192.168.10.20        anywhere
...
```
Из вывода видно,что в цепочке правил INPUT к трафику, по любому протоколу (prot - all) идущему в любом направлении (destination - anywhere), чей источник (source) принадлежит указанному ip-адресу, применяется действие DROP.

Чтобы разрешить трафик с определенного адреса применяется аналогичная блокирующей команда:

```
root@debian:/# sudo iptables -A INPUT -s 192.168.10.20 -j ACCEPT
```

Теперь при просмотер правил мы увидим два противоречащих друг другу правила. Давайте очистим их. Для этого применяется следующая команда:

```
root@debian:/#  sudo iptables -F
```
Также вы можете указать цепочку, если очистить правила нужно только для неё, например: 

```
root@debian:/# sudo iptables -F INPUT
```

Если для пакета не подходит ни одно правило, то для него применяется действие по умолчанию. Его можно задать с помощью опции -P:

```
root@debian:/# sudo iptables -P FORWARD DROP
```

Или, к примеру, можно заблокировать все входящие соединения по ssh: 
`root@debian:/# sudo iptables -A INPUT -p tcp --dport ssh -j DROP`

**Сохранение правил**

Все настройки iptables, которые вы указали с помощью этих команд сохранятся только до перезагрузки. После перезагрузки компьютера все изменения будут стерты. Поэтому чтобы сохранить правила iptables, нужно выполнить специальную команду. В Debian она будет выглядеть так:
```
root@debian:/# sudo /sbin/iptables-save
# Generated by iptables-save v1.8.7 on Mon Jul 25 07:47:20 2022
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT
# Completed on Mon Jul 25 07:47:20 2022

```

### 20. Усиление ядра Linux /etc/sysctl.conf

Sysctl — это мощная команда Linux, которая действует как интерфейс для динамического изменения параметров ядра. С помощью этой команды вы можете изменить параметры ядра без перекомпиляции ядра или перезагрузки машины.

Для внесения постоянных изменений следует изменить файл /etc/sysctl.conf.

### Настройка



Для фильтрации пакетов ICMP:

`net.ipv4.icmp_echo_ignore_all = 1`

---

Переадресация IP-пакетов должна быть включена только на серверах, которые действуют как маршрутизаторы или шлюзы. На всех других серверах эту функцию необходимо отключить:

`net.ipv4.ip_forward = 0`

---
Проверка исходного адреса помогает против атаки спуфинга:

```
net.ipv4.conf.all.rp_filter = 1
```

---

В атаке типа SYN-флуд система заполняется серией пакетов SYN. Каждый пакет заставляет систему выдавать ответы SYN-ACK. Затем система ожидает ACK, который следует за SYN+ACK (3-стороннее рукопожатие). Поскольку атака никогда больше не отправляет обратно ACK, все системные ресурсы заполняются, т. е. очередь невыполненных работ. Как только очередь будет заполнена, система будет игнорировать входящие запросы от законных пользователей на услуги (http/mail и т.д.). Чтобы это остановить, вам нужно включить SYNcookies в sysctl.conf.

`net.ipv4.tcp_syncookies = 1`

---

Атака smurf — это использование широковещательной адресации Интернет-протокола (IP) для создания отказа в обслуживании. Программа smurf создает сетевой пакет, который, как представляется, исходит от другого адреса (это называется подменой IP-адреса). Пакет содержит сообщение проверки связи ICMP, адресованное широковещательному IP-адресу, т. е. всем IP-адресам в данной сети. Эхо-ответы на пинг-сообщение отправляются обратно на адрес «жертвы». Достаточное количество эхо-запросов и результирующих эхо-сигналов может затопить сеть, сделав ее непригодной для реального трафика.

Один из способов победить смурфинг — отключить широковещательную IP-адресацию.

`net.ipv4.icmp_echo_ignore_broadcasts = 1`

---

После внесения необходимых изменений необходимо сохранить файл и выполнить следующую команду, чтобы загрузить настройки sysctl из файла /etc/sysctl.conf.

`sysctl -p`

### 21. Отдельные разделы диска для системы Linux

При установке системы на этапе разметки диска необходимо выполнить следующую последовательность действий:

![](https://i.imgur.com/napDLrF.png)

![](https://i.imgur.com/i5e4aJ5.png)

![](https://i.imgur.com/z6gcfnM.png)

Затем Вам будет предложено ввести пароль для шифрования диска:

![](https://i.imgur.com/KxW4N9f.png)

Если всё прошло успешно - видим следующую картину и выбираем finish:

![](https://i.imgur.com/8BfuH7e.png)



### 22. Дисковые квоты
Квота файловой системы — это стандартная встроенная функция ядра Linux. Квоты определяют объем пространства, которое может занять пользователь. Дисковые квоты также ограничивают количество файлов, которые пользователь может создать в системе.

Установка пакета:
```
root@debian:/# sudo apt install quota
```
В системе могут отсутствовать модули ядра, поддерживающие использование квот. Вы должны убедиться в их наличии с помощью инструмента find и увидеть, что два модуля quota_v1 и quota _v2 находятся в каталоге /lib/modules:

```
root@debian:/# find /lib/modules/`uname -r` -type f -name '*quota_v*.ko*'
/lib/modules/5.18.0-2-amd64/kernel/fs/quota/quota_v2.ko
/lib/modules/5.18.0-2-amd64/kernel/fs/quota/quota_v1.ko
```

Если один из модулей не найден, используйте следующую команду для установки модулей ядра квоты:

`root@debian:/# sudo apt install linux-image-extra-virtual`

Чтобы квоты были активными в конкретной системе, они должны быть смонтированы с соответствующими параметрами. Для этого отредактируем файл /etc/fstab:

```
root@debian:/# sudo nano /etc/fstab
```

Находим настройку для монтирования раздела, на который необходимо установить квоту и добавим нужные опции:

UUID=ed2ad8e0-1359-425d-95a2-fea7e2d4af5c /               ext4    errors=remount-ro`,usrquota,grpquota` 0       1

В данном примере мы установили квоту на корневой раздел, добавленные опции выделены. В вашем случае изначальная запись может отличаться. Между опциями пробел не ставить.

Теперь перезапустим демона:
```
root@debian:/# systemctl daemon-reload
```

Перемонтируем раздел:

```
root@debian:/# mount -o remount /
```
Проверим, что нужные нам разделы теперь смонтированы с опциями квотирования:

```
root@debian:/# mount | grep quota
/dev/sda1 on / type ext4 (rw,relatime,quota,usrquota,grpquota,errors=remount-ro)
```

### 23. Выключайте IPv6
Убедимся что у машины есть IPv6-адрес:

```
root@debian:/# sudo ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.183.221  netmask 255.255.255.0  broadcast 192.168.183.255
--->    inet6 fe80::20c:29ff:fe9a:220c  prefixlen 64  scopeid 0x20<link>
```

Внесем изменения в файл /etc/sysctl.conf следующими командами, отключающими использование IPv6:

```
root@debian:/# sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6 = 1
root@debian:/# sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6 = 1
root@debian:/# sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6 = 1
```

Теперь проверим, пропал ли IPv6-адрес в выводе ifconfig:
```
root@debian:/# sudo ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.183.221  netmask 255.255.255.0  broadcast 192.168.183.255
        ether 00:0c:29:9a:22:0c  txqueuelen 1000  (Ethernet)
        RX packets 18015  bytes 23218600 (22.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1646  bytes 135782 (132.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

```



### 24. Отключение нежелательных бинарных файлов SUID и SGID

Найдем все файлы с установленным UID:
```
root@debian:/etc/pam.d# find / -perm -4000
/usr/libexec/polkit-agent-helper-1
/usr/sbin/pppd
/usr/bin/pkexec
/usr/bin/vmware-user-suid-wrapper
/usr/bin/sudo
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/ntfs-3g
/usr/bin/passwd
/usr/bin/chsh
/usr/bin/umount
/usr/bin/mount
/usr/bin/chfn
/usr/bin/fusermount3
/usr/bin/su
/usr/lib/openssh/ssh-keysign
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/xorg/Xorg.wrap

```
Подозрительных файлов не обнаружено.
Теперь повторим операцию для файлов с установленным GID:
```
root@debian:/etc/pam.d# find / -perm -2000
/var/mail
/var/log/journal
/var/log/journal/101ab1e9d0034518813af793b33ba799
/var/local
/etc/ppp/peers
/etc/chatscripts
/usr/share/ppd/custom
/usr/libexec/camel-lock-helper-1.2
/usr/sbin/unix_chkpwd
/usr/bin/ssh-agent
/usr/bin/chage
/usr/bin/dotlockfile
/usr/bin/expiry
/usr/bin/crontab
/usr/bin/wall
/usr/bin/write.ul
/usr/lib/xorg/Xorg.wrap
/usr/local/share/fonts
/run/log/journal

```

Подозрительных файлов не обнаружено.

### 25. Файлы с возможностью записи из вне на сервере Linux

Любой может изменить файл из вне, что приведет к проблеме безопасности. Используйте следующую команду, чтобы найти все файлы в которые можно писать из вне:

```
root@debian:/etc/pam.d# find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print
```

Подобных файлов не обнаружено.

### 26. Файлы, не принадлежащие пользователям

Файлы, не принадлежащие ни одному пользователю или группе, могут представлять проблему безопасности. Просто найдите их с помощью следующей команды, которые не принадлежат действительному пользователю и действительной группе.

```
root@debian:/etc/pam.d# find / -xdev \( -nouser -o -nogroup \) -print
/var/cache/private/fwupdmgr
```
Найден лишь один подобный файл, для которого отсутствие владельца и группы является нормой.

### 27. Используйте централизованную службу аутентификации
> см. пункт 28

### 28. Kerberos



### 29. Логирование и аудит
Настроим syslog на сбор всех логов с локальной системы. Главный конфигурационный файл - `/etc/syslog-ng/syslog-ng.conf`

В нем сначал указывается версия:

`@version: 3.27`

Затем идет раздел `global options`, после чего начинается самое интересное - параметры `source, destination, filter, log`.

#### Source (источник)
Этот параметр содержит информацию об источнике логов. Можно указывать несколько источников, реализовано это аналогично с функциями на языке С. К примеру, источник по умолчанию описан таким образом:

```
source s_src {
       system();
       internal();
};
```

Здесь мы видим источник под названием s_src и параметрами system() и internal() без аргументов. При подключении такого источника будут собираться все логи системы. Мы можем указать в качестве источника какой-либо файл логов программы, например: 

```
source s_file {
    file("/var/log/messages");
};
```


#### Destination (назначение)

Этот параметр указывает куда будут отправляться логи, полученные от источника. Они могут записываться в локальный файл:


`destination d_test { file ("/var/log/test.log");};`


#### Log (логирование)

Функция log принимает параметры source и destination и непосредственно записывает логи из указанного источника в указанное место назначения. Для записи локальных логов системы в файл /var/log/test.log используется такая конфигурация: 

```
source s_src {
    system();
    internal();
};

destination d_local {
    file("/var/log/test.log");
};

log {
    source(s_src); destination(d_local);
};
```

Теперь откроем файл /var/log/test.log и убедимся что логи записываются: 

![](https://i.imgur.com/RPhtavl.png)

### 30. Отслеживание подозрительных событий в журнале с помощью команды Logwatch / Logcheck

Установка:
```
root@debian:/# apt-get install logwatch
```
Создайте временный каталог для работы logwatch:
```
root@debian:/# sudo mkdir /var/cache/logwatch
```

Для отображения отчета введите команду logwatch:
![](https://i.imgur.com/1AQvmwi.png)


### 31. Системный учет с помощью auditd

Linux Audit Daemon - это среда, позволяющая проводить аудит событий в системе Linux. Используя мощную систему аудита возможно отслеживать многие типы событий для мониторинга и проверки системы, например:

* доступ к файлам;
*    изменение прав на файлы;
*    просмотр пользователей, изменивших конкретный файл;
* обнаружение несанкционированных изменений;
*    мониторинг системных вызовов и функций;
* обнаружение аномалий, таких как сбои;
* мониторинг набора команд.


Установка auditd:
```
root@debian:/# apt install auditd
```

Конфигурация выполняется с помощью двух файлов: auditd.conf - настройка самого демона, audit.rules - настройка правил, используемых средством auditctl.
> Примечание: auditctl - клиентский инструмент для настройки auditd.

Файл auditd.conf настраивает демон аудита Linux (auditd) с акцентом на том, где и как он должен регистрировать события. Он также определяет, как работать с дисками, журналом повторов и количеством хранимых логов. Обычно стандартная конфигурация подходит для большинства систем.

Чтобы настроить, какие именно события подвергать проверке, в структуре аудита используется файл правил с именем audit.rules.

Активные правила можно просмотреть с помощью опции -l:
```
root@debian:/# sudo auditctl -l
No rules
```
В данный момент никаких правил не задано.
Давайте установим правило для мониторинга файла /etc/passwd. Соответствующая команда будет выглядеть следующим образом:
```
root@debian:/# sudo auditctl -a exit,always -F path=/etc/passwd -F perm=wa
```
Разберем подробнее.
Ключ `-F` задет фильтры, определив переменную `path`, мы задаем, какой каталог или файл следует отслеживать. Переменная `path` определяет, какой вид доступа вызовет событие. Существует 4 вида доступа:

*    r = читать
*    w = писать
* x = выполнить
* a = изменить атрибут

Ключ `-a` указывает список и действие. Допустимые списки: `task, exit, user, exclude`. Допустимые действия: `never, always`.

Поиск связанного события или доступ к файлу можно быстро отслеживать с помощью инструмента ausearch:
```
root@debian:/# sudo ausearch -f /etc/passwd
----
time->Wed Jul 27 08:04:12 2022
type=PROCTITLE msg=audit(1658923452.931:216): proctitle=6E616E6F002F6574632F706173737764
type=PATH msg=audit(1658923452.931:216): item=1 name="/etc/passwd" inode=1045055 dev=08:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(1658923452.931:216): item=0 name="/etc/" inode=1044481 dev=08:01 mode=040755 ouid=0 ogid=0 rdev=00:00 nametype=PARENT cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(1658923452.931:216): cwd="/etc/audit"
type=SYSCALL msg=audit(1658923452.931:216): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=55d4f258c210 a2=241 a3=1b6 items=2 ppid=3788 pid=3935 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=3 comm="nano" exe="/usr/bin/nano" subj==unconfined key=(null)

```


* time - время события
* name - имя объекта
* cwd - текущий рабочий путь, из которого происходил доступ к файлу
* syscall - связанный системный вызов
* auid - идентификатор пользователя аудита
* exe - двоичный файл, выполняющий действие над файлом

Обратите внимание, что `auid` определяет исходного пользователя вошедшего в систему. Другие поля могут указывать на другого пользователя, в зависимости от того, какой пользователь используется при выполнении действия.

Auditd может использоваться для мониторинга системных вызовов, включая доступ к файлам. Зададим следующее правило, чтобы отслеживать доступ к файлу /etc/passwd:
```
auditctl -w /etc/passwd -p warx -k passwd
```

Теперь вывдем содержимое файла:

```
root@debian:/# cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
...
```
Посмотрим содержимое файла `/etc/var/audit/audit.log`:

Информация и событии чтения файла `/etc/passwd` будет выглядеть там следующим образом:
```
type=SYSCALL msg=audit(1659096248.614:264): arch=c000003e syscall=257 success=yes exit=3 a0=ffffff9c a1=7f45cc1ff15e a2=80000 a3=0 items=1 ppid=2801 pid=2888 auid=1000 uid=0 gid>
type=CWD msg=audit(1659096248.614:264): cwd="/"
type=PATH msg=audit(1659096248.614:264): item=0 name="/etc/passwd" inode=1045055 dev=08:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_f>
```
Расшифровка записи o системном вызове:
*     type=SYSCALL Тип события (системный вызов ядра, ака SYSCALL). Полный список регистрируемых событий можно изучить в документации (https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sec-audit_record_types) 

*     msg=audit(1659096248.614:264):Содержит штамп времени и уникальный ИД события audit(time_stamp:ID). Некоторые записи могут содержать один и тот же штамп времени и уникальный ИД если они являются частью одного и того же события произошедшего в одну и ту же единицу времени. Штамп времени может быть конвертирован командой date -d @1659096248.614
*     arch=c000003e Содержит информацию об архитектуре процессора. Если запустить поиск событий с помощью команды ausearch -i `c000003e`|more то числовое значение c000003e в поле arch= будет конвертировано.
*     syscall=257 Тип системного вызова посланного в ядро. ausyscall --dump выдаст список всех системных вызовов для текущей архитектуры. Можно указать архитектуру, например ausyscall i386 117 выдаст ipc, а ausyscall x86_64 117 выдаст setresuid - т.е. значение одного и того же номера системного вызова различно для разных архитектур.
*     success=yes Успешность выполнения события - yes=успех, no=провал выполнения.
*     exit=3 Код выхода, возвращённый системным вызовом. Интерпретировать значение в человекочитаемый формат можно командой: ausearch --interpret --exit -13 (... success=no exit=-13(Отказано в доступе) ...).
*     ppid=2801 Parent Process ID (PPID) - ID родительского процесса
*     pid=2888 Process ID (PID) - ID процесса которому посвящено событие аудита
*     auid=1000 Audit user ID - ID пользователя в системе аудита, который присваивается при входе пользователя в систему и сохраняется неизменным даже при изменении идентификации/личности пользователя (например с помощью su - user2). 
*     uid=0 User ID - ID пользователя запустившего анализируемый процесс. Его можно посмотреть в файле /etc/passwd, uid пользователя root равен 0. 

### 32. Безопасный сервер OpenSSH

 OpenSSH это свободно распространяемая версия семейства инструментов для удаленного управления компьютерами и передачи файлов с использованием протокола безопасной оболочки (SSH). Традиционные инструменты, используемые для этих функций, такие как telnet и rcp, незащищены и передают пользовательский пароль открытым текстом. OpenSSH предоставляет сервис на сервере и клиентские приложения для облегчения операций защиты, зашифрованного удаленного управления и передачи файлов, эффективно заменяя устаревшие инструменты.

Серверный компонент OpenSSH, sshd, постоянно ожидает клиентские подключения от любого клиентского приложения. Когда обнаруживается запрос на соединение, sshd устанавливает корректное соединение в зависимости от соединяющегося клиентского приложения. Например, если удаленный компьютер подсоединяется с помощью клиентского приложения ssh, сервер OpenSSH устанавливает сессию удаленного управления после авторизации. Если удаленный пользователь подсоединяется к серверу OpenSSH с помощью scp, сервис OpenSSH на сервере инициирует защищенное копирование файлов между сервером и клиентом после авторизации. OpenSSH может использовать много методов аутентификации, включая простой пароль, открытый ключ и билеты Kerberos.

**Установка**

Для установки клиентского приложения OpenSSH на вашей системе используйте команду:

`root@debian:/# sudo apt-get install openssh-client`

Для установки серверного приложения OpenSSH и связанных файлов используйте такую команду:

`root@debian:/# sudo apt-get install openssh-server`

**Конфигурация**

Вы можете настроить поведение по умолчанию серверного приложения OpenSSH, sshd, редактируя файл /etc/ssh/sshd_config. Для информации по конфигурационным директивам, используемым в этом файле, вы можете посмотреть соответствующую страницу руководства, задав следующую команду в терминале:

`man sshd_config`


Прежде, чем редактировать конфигурационный файл, стоит создать копию оригинального файла и защитить его от записи, чтобы у вас были оригинальные настройки как справочник, который можно использовать повторно при необходимости.

Скопируйте файл /etc/ssh/sshd_config и защитите его от записи с помощью следующих команд:

```
root@debian:/# sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original
root@debian:/# sudo chmod a-w /etc/ssh/sshd_config.original
```

Далее примеры конфигурационных директив, которые вы можете изменить:

>   Чтобы установить TCP порт прослушивания для вашего OpenSSH 2222 вместо стандартного 22, измените директиву Port таким образом:

Port 2222

> Чтобы sshd допускал вход с использованием открытых ключей, просто добавьте или измените строку:

PubkeyAuthentication yes

> Если строка уже присутствует, убедитесь, что она не закомментирована.

> Чтобы позволить вашему OpenSSH серверу показывать содержимое файла /etc/issue.net в качестве шапки пред авторизацией, просто добавьте или измените строку:

Banner /etc/issue.net

Все изменения производятся в файле /etc/ssh/sshd_config.

После изменений в /etc/ssh/sshd_config, сохраните файл и перестартуйте серверное приложение sshd для применения изменний, используя команду в терминале:

```
root@debian:/# sudo /etc/init.d/ssh restart
Restarting ssh (via systemctl): ssh.service.
```

Множество других директив конфигурации sshd доступны для изменения поведения серверного приложения под ваши нужды. Однако учтите, что если единственный способ доступа к серверу - это ssh и вы допустили ошибку конфигурации sshd в /etc/ssh/sshd_config, вы можете найти свой сервер заблокированным, пока его не перезагрузите. В дополнение, если неправильная директива настройки воспринялась, сервер sshd может отказаться загружаться, поэтому будьте очень осторожны, когда редактируете этот файл на удаленном сервере.

Для подключения к удаленному серверу используйте следующую команду (если вы меняли стандартный порт, то укажите его в опции -p):
```
root@debian:/# ssh -p 2222 user@192.168.183.221
user@192.168.183.221's password: 
Linux debian 5.18.0-2-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.18.5-1 (2022-06-16) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
user@debian:~$ 
```

### 34. Отключение устройств USB/firewire/thunderbolt
Введите следующую команду, чтобы отключить USB-устройства в системе Linux:
```
root@debian:/# echo 'install usb-storage /bin/true' >> /etc/modprobe.d/disable-usb-storage.conf
```

Тот же метод можно использовать для отключения модулей firewire и thunderbolt:

```
root@debian:/# echo "blacklist firewire-core" >> /etc/modprobe.d/firewire.conf
root@debian:/# echo "blacklist thunderbolt" >> /etc/modprobe.d/thunderbolt.conf
```

После этого пользователи не смогут быстро скопировать конфиденциальные данные на USB-устройства или установить вредоносные программы/вирусы или бэкдор на вашу систему на базе Linux.

### 35. Отключение неиспользуемых служб
> см. пункт 16


### 36. Используйте fail2ban/denyhost в качестве IDS (установите систему обнаружения вторжений)

Fail2ban или denyhost сканирует файлы журнала на предмет слишком большого количества неудачных попыток входа и блокирует IP-адрес, который проявляет признаки вредоносности.


Fail2ban написан на языке программирования Python, может работать на POSIX-системах имеющих встроенный менеджер пакетов и брандмауэр, например, iptables .Fail2ban отслеживает файлы журналов, такие как /var/log/auth.log для обнаружения подозрительной активности. Обычно Fail2ban используется для обновления правил с целью блокировки IP-адресов на определённое время, но можно настроить и другие действия — например, отправку письма по электронной почте. 

Принцип работы fail2ban прост. Специальный сервис ищет в системных журналах (логах) записи о неудачных попытках аутентификации и при определенных условиях с помощью iptables блокирует IP-адреса, с которых ведется атака.

Основная идея Fail2ban - при превышении заданного числа неудачных вводов пароля подряд (по умолчанию - 6) бан IP, с которого были попытки подбора на заданное время (по умолчанию - 600 секунд).

#### **Установка**

```html
$ apt-get install fail2ban
```

#### Конфигурация

На данном этапе Fail2ban уже готов к работе, базовая защита SSH сервера от перебора паролей будет включена по умолчанию. Но лучше всё-же внести некоторые изменения следуя рекомендациям ниже.

У программы два основных файла конфигурации:

`/etc/fail2ban/fail2ban.conf` - отвечает за настройки запуска процесса Fail2ban

`/etc/fail2ban/jail.conf` - содержит настройки защиты конкретных сервисов

Файл jail.conf поделён на секции, так называемые «изоляторы» (jails), каждая секция отвечает за определённый сервис и тип атаки. Например секция [ssh] отвечает за защиту SSH от brute–force атак.Параметры из секции [DEFAULT] применяются ко всем секциям.

**Основные параметры файла jail.conf**

- `ignoreip` — IP–адреса, которые не должны быть заблокированы. Можно задать список IP-адресов разделённых пробелами, маску подсети, или имя DNS–сервера
- `bantime` — время бана в секундах, по истечении которого IP–адрес удаляется из списка заблокированных
- `maxretry` — количество подозрительных событий, после которых применяется правило. В контексте брутфорса — это число неудавшихся попыток логина, после которых происходит блокировка.
- `enabled` — значение указывает что данный jail активен, выключает действие изолятора
- `port` — указывает на каком порту или портах запущен целевой сервис
- `filter` — имя фильтра с регулярными выражениями, по которым идёт поиск «подозрительных совпадений» в журналах сервиса
- `logpath` — путь к файлу журнала, который программа Fail2ban будет обрабатывать с помощью заданного ранее фильтра. Вся история удачных и неудачных входов в систему, в том числе и по SSH, по умолчанию записывается в log–файл

#### Пример настройки fail2ban

Прежде чем вносить изменения следуя рекомендациям, отметим, что не стоит редактировать основной файл настроек `jail.conf`, для этого предусмотрены файлы с расширением `*.local`, которые автоматически подключаются и имеют высший приоритет.

```
$ nano /etc/fail2ban/jail.local
```

```
[DEFAULT]
## Постоянный IP-адрес.
## Если не переопределить ignoreip здесь,
## то стоит закомментировать этот параметр в jail.conf.
ignoreip = 57.66.158.131

[ssh]
## если в течении 1 часа:
findtime    = 3600
## произведено 6 неудачных попыток логина:
maxretry    = 6
## то банить IP на 24 часа:
bantime     = 86400
```

Осталось перезапустить Fail2ban:

`$ service fail2ban restart`

### 37. Защита сервера Apache

Основной файл конфигурации Apache: `/etc/apache2/apache2.conf` 
Apache показывает свою версию с установленной на вашем сервере ОС. Это может быть серьезной угрозой безопасности как для вашего веб-сервера, так и для вашей Linux-системы. Чтобы Apache не отображал эту информацию миру, нам нужно внести некоторые изменения в основной файл конфигурации Apache.

Откройте файл конфигурации с помощью редактора и найдите «ServerSignature», по умолчанию он включен. Если такой строки нет то добавьте её со значение Off. Еще одна строка «ServerTokens Prod» говорит Apache возвращать только Apache как продукт в заголовке ответа сервера при каждом запросе страницы.

```
# nano /etc/apache2/apache2.conf
ServerSignature Off
ServerTokens Prod
```

Мы можем ограничить доступ к каталогам с помощью параметров «Allow» и «Deny» в файле httpd.conf. Здесь, в этом примере, мы будем защищать корневой каталог, для этого установив следующее в файле apache2.conf.

 
```
<Directory />
        Options None
        Order deny,allow
        Deny from all     
</Directory>
```

 

Параметр «None» – этот параметр не позволяет пользователям включать какие-либо дополнительные функции.
Order deny, allow – это порядок, в котором будут обрабатываться директивы «Allow» и «Deny». Здесь он сначала «отрицает», а затем «разрешает».
Deny from all – будет отклонять запросы от всех к корневому каталогу, никто не сможет получить доступ к корневому каталогу.

По умолчанию Apache следует символическим ссылкам, мы можем отключить эту функцию с помощью FollowSymLinks с директивой Options. И для этого нам нужно сделать следующую запись в основном файле конфигурации:

`Options -FollowSymLinks`

И, если любому конкретному пользователю или веб-сайту требуется включить FollowSymLinks, мы можем просто написать правило в файле этого веб-сайта:

```
Options +FollowSymLinks
```

Мы можем отключить серверные включения (mod_include) и выполнение CGI, если в этом нет необходимости:
```
Options -Includes
Options -ExecCGI
```

Вот некоторые другие значения, которые можно включить или выключить с помощью директивы Options.

`Options All` – включить все параметры одновременно. Это значение по умолчанию, если вы не хотите явно указывать какие-либо значения в конфигурационном файле Apache.
`Options IncludesNOEXEC` – этот параметр позволяет включать на стороне сервера без разрешения выполнение команды или файлов CGI.
`Options MultiViews` – позволяет контенту согласовывать множественные просмотры с модулем `mod_negotiation`.
Параметры `Options SymLinksIfOwnerMatch` – это похоже на `FollowSymLinks`. Но так будет происходить только в том случае, если владелец совпадает между ссылкой и исходным каталогом, с которым она связана.

### 38. Защита файлов, каталогов и электронной почты

См. пункт 21
