Как посмотреть firewall linux

Обновлено: 04.07.2024

Основной брандмауэр в операционных системах Linux - это iptables. Но команды iptables сложны, и многим пользователям тяжело запомнить все опции и случаи, в которых их надо использовать. Поэтому разработчики дистрибутивов создают свои надстройки над iptables, которые помогают упростить управление фаерволом. У CentOS надстройка для управления iptables называется Firewalld.

У Firewalld есть несколько важных отличий, по сравнению с iptables. Здесь управление доступом к сети выполняется на уровне зон и сервисов, а не цепочек и правил. А также правила обновляются динамически, не прерывая запущенных сессий. В этой статье будет рассмотрена настройка Firewall CentOS 7 на примере Firewalld.

Основы использования Firewalld

Как я уже сказал выше, Firewalld работает не с цепочками правил, а с зонами. Каждому сетевому интерфейсу может быть присвоена определенная зона. Зона представляет из себя набор правил, ограничений и разрешений, которые применяются к этому сетевому интерфейсу. Для одного интерфейса может быть выбрана только одна зона. Разработчики создали несколько предустановленных зон:

Таким образом, чтобы разрешить или запретить какой-либо сервис, вам достаточно добавить или удалить его из текущей зоны или сменить зону интерфейса на ту, где он разрешён. Можно провести аналогию с политикой действий по умолчанию для пакетов в iptables. Зона trusted имеет политику ACCEPT и разрешает все подключения, зона block имеет политику DENY, которая запрещает все подключения, а все остальные зоны можно считать наследниками зоны block, плюс в них уже предопределены правила разрешения сетевых подключений для некоторых сервисов.

Также у Firewalld есть два вида конфигурации:

  • runtime - действительна только до перезагрузки, все изменения, в которых явно не указано другое, применяются к этой конфигурации;
  • permanent - постоянные настройки, которые будут работать и после перезагрузки.

Теперь вы знаете всё необходимое, поэтому перейдём к утилите firewalld-cmd.

Синтаксис и опции firewall-cmd

Управлять настройками Firewalld можно как с помощью консольной утилиты firewall-cmd, так и в графическом интерфейсе. CentOS чаще всего используется на серверах, поэтому вам придётся работать в терминале. Давайте рассмотрим синтаксис утилиты:

firewall-cmd опции

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

firewall-cmd --конфигурация --zone=зона опции

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

  • --state - вывести состояние брандмауэра;
  • --reload - перезагрузить правила из постоянной конфигурации;
  • --complete-reload - жёсткая перезагрузка правил с разрывом всех соединений;
  • --runtime-to-permanent - перенести настройки конфигурации runtime в постоянную конфигурацию;
  • --permanent - использовать постоянную конфигурацию;
  • --get-default-zone - отобразить зону, используемую по умолчанию;
  • --set-default-zone - установить зону по умолчанию;
  • --get-active-zones - отобразить активные зоны;
  • --get-zones - отобразить все доступные зоны;
  • --get-services - вывести предопределенные сервисы;
  • --list-all-zones - вывести конфигурацию всех зон;
  • --new-zone - создать новую зону;
  • --delete-zone - удалить зону;
  • --list-all - вывести всё, что добавлено, из выбранной зоны;
  • --list-services - вывести все сервисы, добавленные к зоне;
  • --add-service - добавить сервис к зоне;
  • --remove-service - удалить сервис из зоны;
  • --list-ports - отобразить порты, добавленные к зоне;
  • --add-port - добавить порт к зоне;
  • --remove-port - удалить порт из зоны;
  • --query-port - показать, добавлен ли порт к зоне;
  • --list-protocols - вывести протоколы, добавленные к зоне;
  • --add-protocol - добавить протокол к зоне;
  • --remove-protocol - удалить протокол из зоны;
  • --list-source-ports - вывести порты источника, добавленные к зоне;
  • --add-source-port - добавить порт-источник к зоне;
  • --remove-source-port - удалить порт-источник из зоны;
  • --list-icmp-blocks - вывести список блокировок icmp;
  • --add-icmp-block - добавить блокировку icmp;
  • --add-icmp-block - удалить блокировку icmp;
  • --add-forward-port - добавить порт для перенаправления в NAT;
  • --remove-forward-port - удалить порт для перенаправления в NAT;
  • --add-masquerade - включить NAT;
  • --remove-masquerade - удалить NAT.

Это далеко не все опции утилиты, но для этой статьи нам будет их достаточно.

Настройка Firewall в CentOS 7

1. Статус брандмауэра

Первым делом необходимо посмотреть состояние брандмауэра. Для этого выполните:

sudo systemctl status firewalld


Если служба Firewalld отключена, то необходимо её включить:

sudo systemctl start firewalld
sudo systemctl enable firewalld

Теперь нужно посмотреть, запущен ли Firewalld, с помощью команды firewall-cmd:

sudo firewall-cmd --state

2. Управление зонами

Как вы уже поняли, зоны - это основной инструмент для управления сетевыми подключениями. Чтобы посмотреть зону по умолчанию, выполните:

sudo firewall-cmd --get-default-zone


В моем случае это зона public. Вы можете изменить текущую зону с помощью опции --set-default-zone:

sudo firewall-cmd --set-default-zone=public

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

sudo firewall-cmd --get-active-zones


В списке будут выведены зоны и интерфейсы, для которых они присвоены. Такой командой можно посмотреть конфигурацию для определённой зоны. Например, для зоны public:

sudo firewall-cmd --zone=public --list-all


3. Настройка сервисов

Вы можете посмотреть все предопределенные сервисы командой:

sudo firewall-cmd --get-services



А чтобы удалить этот сервис, выполните:

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

sudo firewall-cmd --reload

Затем, если вы посмотрите конфигурацию зоны, то там появится добавленный сервис:

sudo firewall-cmd --zone=public --list-all


4. Как открыть порт в Firewalld

Если для нужной вам программы нет сервиса, вы можете открыть её порт вручную. Для этого просто добавьте нужный порт к зоне. Например порт 8083:

sudo firewall-cmd --zone=public --add-port=8083/tcp --permanent


Чтобы удалить этот порт из зоны, выполните:

sudo firewall-cmd --zone=public --remove-port=8083/tcp --permanent

Аналогично сервисам, чтобы открыть порт в firewall centos 7 надо перезагрузить брандмауэр.

sudo firewall-cmd --reload


5. Проброс портов Firewalld

sudo firewall-cmd --zone=public --add-forward-port=port=2223:proto=tcp:toport=22

Здесь перенаправление выполняется только на текущей машине. Если вы хотите настроить сеть NAT и пробрасывать порт на другую машину, то вам нужно сначала включить поддержку masquerade:

sudo firewall-cmd --zone=public --add-masquerade

Затем уже можно добавить порт:

sudo firewall-cmd --zone=publiс --add-forward-port=port=2223:proto=tcp:toport=22:toaddr=192.168.56.4

6. Расширенные правила

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

rule family = "семейтво" source значение destination значение log audit действие

Вот значение основных параметров:

Давайте рассмотрим несколько примеров. Нам необходимо заблокировать доступ к серверу для пользователя с IP 135.152.53.5:

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=135.152.53.5 reject'


Или нам нужно запретить для этого же пользователя только доступ к порту 22:

sudo firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=135.152.53.5 port port=22 protocol=tcp reject'

Посмотреть все расширенные правила можно командой:

sudo firewall-cmd --list-rich-rules


Выводы

В этой статье мы разобрали, как выполняется настройка firewall в CentOS 7 и какие задачи можно с помощью него выполнить. Программой намного проще пользоваться, чем iptables, но по моему мнению надстройка фаервола от Ubuntu - ufw ещё проще в использовании.

Подойдет или гаджет, или, лучше, какая-нибудь консольная инструкция, точное имя процесса / демона брандмауэра или сценарий bash.

Брандмауэр Ubuntu пропустит соединение, если вы не настроите его иначе. Этот вопрос, по-видимому, оставлен, если вы столкнулись с подобной проблемой, пожалуйста, задайте новый вопрос с деталями, относящимися к вашей проблеме. Если вы считаете, что этот вопрос не оставлен, отметьте вопрос, объясняющий это. :) На этот вопрос есть полезные ответы, на которые проголосовали, и поэтому он не заброшен . Это должно быть вновь открыто.

Есть в основном 2 способа проверить, настроен ли межсетевой экран. Вы должны использовать оба метода и убедиться, что брандмауэр настроен и настроен так, как вы хотите.

Сначала убедитесь, что правила брандмауэра были применены. Почти все современные брандмауэры Linux используют iptables для брандмауэра. Вы можете видеть, что есть правила с командой iptables:

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

Затем вы будете использовать второй компьютер для проверки соединений с данным хостом. Это можно легко сделать с помощью nmap команды (находится в пакете nmap). Быстрый и грязный способ проверки это:

Замените IP-адрес 10.0.0.10 на IP-адрес хостов назначения.

Первая строка будет сканировать TCP-порты, которые открыты и доступны со второго компьютера. Вторая строка будет повторять сканирование, но на этот раз с портами UDP. Флаг -P0 не позволит тестировать хост с помощью эхо-пакета ICMP, но может быть заблокирован правилами вашего брандмауэра.

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


Проект iptables, разработанный Расти Расселом (Rusty Russell) в 1999 году для управления netfilter и заменивший в ядре 2.4 ipchains и ряд других инструментов вроде ipnatctl, предлагает более расширяемый способ фильтрации пакетов, обеспечивающий сисадмину больший контроль при упрощении самих правил. Так, в ipchains нужно было создавать правило в каждой цепочке, прослеживая весь маршрут пакета, теперь достаточно одного. Появление модулей позволяло очень просто расширять возможности. В процессе развития проекта iptables был портирован для IPv6 (в 2011 году, ip6tables), добавлялись дополнительные модули (ULOG, nf_conntrack), он научился производить разные манипуляции с пакетами, классифицировать трафик (до седьмого уровня OSI), балансировать нагрузку и многое другое. С ростом количества функций усложнились и настройки. При этом, даже несмотря на некоторую унификацию, каждое расширение имеет свой синтаксис, одни поддерживают диапазоны, отрицание, префиксы, другие — нет. Поначалу каждое изменение правил требовало полного перезапуска брандмауэра, включая выгрузку модулей, что приводило к разрыву установленных соединений. Сейчас такой проблемы нет.

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

Неудивительно, что для решения этих проблем были придуманы разные надстройки. Так, в Ubuntu для простой настройки правил используется ufw (Uncomplicated Firewall — несложный файрвол). Например, чтобы открыть доступ к SSH-порту, достаточно ввести

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

Под капотом FERM находится обычный Perl-скрипт, который конвертирует конфигурационные файлы в правила iptables.

В Fedora 18 был анонсирован демон firewalld, ставший официальным приложением для управления настройками netfilter в RHEL 7 / CentOS 7. Последние становятся все популярнее на VDS, а значит, придется столкнуться с их особенностями.

Возможности firewalld

Firewalld запускается как демон, новые правила добавляются без перезапуска и без сброса установленного файрвола. Изменения в конфигурации могут быть сделаны в любое время и применяются мгновенно: сохранять или применять изменения не требуется. Поддерживается IPv4, IPv6, автоматическая загрузка модулей ядра и сетевые зоны, определяющие уровень доверия соединений. Предоставляется простой интерфейс добавления правил для служб и приложений, белый список приложений, имеющих право менять правила. В настоящее время такую возможность поддерживает libvirt, Docker, fail2ban, Puppet, скрипт установки Virtuozzo и многие другие проекты. В репозитории YUM уже есть пакеты fail2ban-firewalld и puppet-firewalld, поэтому подключить их можно одной командой.

Firewalld предоставляет информацию о текущих настройках брандмауэра через D-Bus API, а также принимает изменения через D-Bus с использованием методов аутентификации PolicyKit. В качестве бэкенда используются iptables, ip6tables, ebtables, ipset и планируется nftables. Но сами правила, созданные непосредственно этими утилитами, firewalld не может разобрать, поэтому оба метода использовать нельзя.

Управление производится при помощи утилит командной строки firewall-cmd или графической firewall-config, позволяющей настроить все правила в удобной среде. Для помощи в миграции текущих правил iptables на firewalld используется утилита firewall-offline-cmd, по умолчанию считывающая /etc/sysconfig/system-config-firewall . В последних релизах появилась утилита firewallctl, имеющая простой синтаксис и позволяющая получать информацию о состоянии службы, конфигурации брандмауэра и изменять правила.

Графическая firewall-config поддерживает firewalld

Параметры firewall-cmd

Разрешить соединение на определенный порт очень просто:

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

Для удаления порта из правил используется параметр --remove-port :

Вообще, многие команды --add-* имеют значения для проверки статуса --query-* , --list-* — список, изменения --change-* или удаления --remove соответствующего значения. Для краткости на этом не будем дальше заострять внимание. После релоада правил проверяем:

В firewalld предусмотрен режим, позволяющий одной командой заблокировать все соединения:

Для проверки, в каком режиме находится файрвол, есть специальный ключ:

Отключается panic mode:

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

После установки firewalld знает настройки более 50 сервисов, получаем их список.

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

Firewalld хранит все настройки в XML-файлах в каталогах в /usr/lib/firewalld. В частности, сервисы лежат в services. Внутри файла описание: название, протокол и порт.

Это каталог системный, и менять там ничего нельзя. Если нужно переопределить настройки или создать свой сервис, то копируем любой файл в качестве шаблона в /etc/firewalld/services , правим под свои условия и применяем настройки.

Для настройки ICMP используется отдельный набор правил. Получаем список поддерживаемых типов ICMP:


Все настройки firewalld хранит в XML-файлах

Firewalld знает о почти 50 сервисах

Управление зонами

Для определения уровня доверия сетевому соединению в firewalld используются зоны. Зона может содержать несколько сетевых подключений, но сетевое соединение может входить только в одну зону. Список всех зон получаем командой firewall-cmd --get-zones .

Получаем список зон

Получаем список зон

После установки создается девять зон, в зависимости от назначения может быть использована одна или несколько зон:

Описания зон также представлены в XML-файлах в /usr/lib/firewalld/zones .

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

Настройки зон по умолчанию

Настройки зон по умолчанию

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

Теперь — какие зоны сейчас активны и какие интерфейсы к ним привязаны.

Также можем получить обратную информацию — к какой зоне привязан интерфейс.

Смотрим настройки зоны (сервисы, порты, протоколы. ).

Если параметр пуст, то это значит, что настройки не установлены. При необходимости переназначаем интерфейс зоне:

Если сейчас проверить вывод firewall-cmd --zone=public --list-all , то увидим, что из списка установок пропал сетевой интерфейс. Разрешим подключение сервиса:

Удаляется он так же:

К зонам можно привязывать и другие источники, определяемые по MAC, отдельному IP или адресу сети. Пакет, пришедший из такого источника, будет обрабатываться по правилам зоны.

Список всех source смотрим при помощи --zone=trusted --list-sources . NAT, позволяющий нескольким компьютерам подключаться к сети, в firewalld включается одной командой. Смотрим текущие настройки маскарадинга:

Если в ответ получим no , то включаем:

Это все. Для доступа извне настроим форвардинг порта в один из компьютеров. Например, нам нужен доступ по SSH к внутреннему серверу:

Удаляется правило форвардинга при помощи --remove-forward-port .

Сложные правила

Для отдельного ПК или небольших сетей базовых возможностей вполне хватает, для настройки сложных правил в firewalld изначально предлагался так называемый direct-синтаксис, чуть позже появился собственный язык Rich Language. В первом варианте достаточно знать синтаксис iptables, рекомендуется использовать в крайнем случае, так как правила не сохраняются после перезагрузки.

Синтаксис direct правила такой:

Добавляем правило, разрешающее соединение по 25-му порту:

Пробросим соединение по 22-му на другой сервер:

Большой плюс Rich Language в том, что все параметры можно описать в XML в файле зоны. Формат файла очень простой и повторяет названия параметров:

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

Чтобы не настраивать все повторно, лучше сохранить текущие правила, сгенерированные firewalld.

Останавливаем firewalld и запускаем iptables:

Проверяем текущие правила:

Запрещаем автозапуск firewalld при загрузке ОС:

Выводы

Как видишь, ничего сложного! Firewalld очень упрощает установки, особенно если учесть, что настройки легко перенести.


iptables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана Linux. Для использования утилиты iptables требуются привилегии суперпользователя (root).

Разные сервисы используют разные протоколы:

iptables используется для работы с IP версии 4;

ip6tables используется для работы с IP версии 6;

arptables используется для работы с ARP;

ebtables используется для работы с Ethernet-кадрами.

Последние два сервиса не идут по умолчанию в Debian. Для их установки вводим apt install arptables ebtables

В системе имеется 6 таблиц:

1. NAT - Предназначена для операций преобразования сетевых адресов и портов обрабатываемых пакетов;

2. Filter - Предназначена для фильтрации трафика, то есть разрешения и запрещения пакетов и соединений;

3. Mangle - Предназначена для операций по классификации и маркировке пакетов и соединений, а также модификации заголовков пакетов;

4. Security - Предназначена для изменения маркировки безопасности (меток SELinux) пакетов и соединений;

5. RAW - Предназначена для выполнения действий с пакетами до их обработки системой conntrack;

6. RAWPOST - предназначена для выполнения операций преобразования адресов без использования информации о соединениях, которые не могут быть реализованы в рамках таблицы raw, а именно, для операции маскарадинга.

Каждая таблица имеет цепочки схожие по названию, но разные по назначению:

Так же каждая таблица имеет разные действия:

1. Действия для таблицы NAT:

2. Действия для таблицы Filter:

3. Действия для таблицы Mangle:

4. Действия для таблицы Security:

5. Действия для таблицы RAW:

6. Действия для таблицы RAWPOST:

Работа с службой IPTables:

В Debian-like системах работа с службой не отличается ничем от работы с любой другой службой

service iptables start/stop/restart

Автозапуск при старте системы:

update-rc.d iptables defaults

Проверяем доступность портов:

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

netstat -tulpn | grep :53

Проверим, что iptables разрешает соединение с 53 портом:

iptables -L INPUT -v -n | grep 53

Отображение имеющихся правил:

iptables -n -L -v --line-numbers

Отображение имеющихся правил в нужной таблице:

iptables -L INPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers

Удаление всех записей таблиц:

Пример удаления 3 номера записей таблиц:

iptables -D INPUT 3

Пример вставки записи OUTPUT между 2 и 3 номерами:

iptables -I OUTPUT 3 -s ipaddress -j DROP

Пример блокировки определенного IP-адреса:

iptables -A INPUT -s 1.2.3.4 -j DROP

Пример блокировки входящего порта:

iptables -A INPUT -p tcp --dport 80 -j DROP

Пример блокировки входящего порта от определенного IP-адерса:

iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP

Блокировка доступа к определенной сети:

iptables -A OUTPUT -p tcp -d 1.2.3.0/24 -j DROP

Запрет ICMP запросов:

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

Пример открытия диапазона портов:

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 5000:6000 -j ACCEPT

Пример открытия портов разных служб:
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT



Habib M’henni / Wikimedia Commons, CC BY-SA

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

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

Поэтому нужно завести другого юзера, а для рута отключить удалённое администрирование по SSH.

Новый пользователь заводится командой useradd :


Затем для него добавляется пароль командой passwd :


Наконец, этого пользователя нужно добавить в группу, которая имеет право выполнять команды с повышением привилегий sudo . В зависимости от дитрибутива Linux, это могут быть разные группы. Например, в CentOS и Red Hat юзера добавляют в группу wheel :


В Ubuntu он добавляется в группу sudo :

Брутфорс или утечка паролей — стандартный вектор атаки, так что аутентификацию по паролям в SSH (Secure Shell) лучше отключить, а вместо неё использовать аутентификацию по ключам.

Есть разные программы для реализации протокола SSH, такие как lsh и Dropbear, но самой популярной является OpenSSH. Установка клиента OpenSSH на Ubuntu:


Установка на сервере:


Запуск демона SSH (sshd) на сервере под Ubuntu:


Автоматический запуск демона при каждой загрузке:


Нужно заметить, что серверная часть OpenSSH включает в себя клиентскую. То есть через openssh-server можно подключаться к другим серверам. Более того, со своей клиентской машины вы можете запустить SSH-туннель с удалённого сервера на сторонний хост, и тогда сторонний хост будет считать удалённый сервер источником запросов. Очень удобная функция для маскировки своей системы. Подробнее см. статью «Практические советы, примеры и туннели SSH».

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

Итак, для своего нового юзера сначала нужно сгенерировать ключи SSH на компьютере, с которого вы будете заходить на сервер:


Публичный ключ хранится в файле .pub и выглядит как строка случайных символов, которые начинаются с ssh-rsa .

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ3GIJzTX7J6zsCrywcjAM/7Kq3O9ZIvDw2OFOSXAFVqilSFNkHlefm1iMtPeqsIBp2t9cbGUf55xNDULz/bD/4BCV43yZ5lh0cUYuXALg9NI29ui7PEGReXjSpNwUD6ceN/78YOK41KAcecq+SS0bJ4b4amKZIJG3JWm49NWvoo0hdM71sblF956IXY3cRLcTjPlQ84mChKL1X7+D645c7O4Z1N3KtL7l5nVKSG81ejkeZsGFzJFNqvr5DuHdDL5FAudW23me3BDmrM9ifUmt1a00mWci/1qUlaVFft085yvVq7KZbF2OP2NQACUkwfwh+iSTP username@hostname

Затем из-под рута создать на сервере директорию SSH в домашнем каталоге пользователя и добавить публичный ключ SSH в файл authorized_keys , используя текстовый редактор вроде Vim:

Наконец, установить корректные разрешения для файла:


и изменить владение на этого юзера:


На стороне клиента нужно указать местоположение секретного ключа для аутентификации:


Теперь можно залогиниться на сервер под именем юзера по этому ключу:


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

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

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

На CentOS/Red Hat находим строку PermitRootLogin yes в конфигурационном файле /etc/ssh/sshd_config и изменяем её:


На Ubuntu добавляем строку PermitRootLogin no в конфигурационный файл 10-my-sshd-settings.conf :


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

На CentOS/Red Hat находим строку PasswordAuthentication yes в конфигурационном файле /etc/ssh/sshd_config и изменяем её следующим образом:


На Ubuntu добавляем строку PasswordAuthentication no в файл 10-my-sshd-settings.conf :


Инструкцию по подключению двухфакторной аутентификации по SSH см. здесь.

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

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

С дистрибутивом Ubuntu идёт Uncomplicated Firewall (ufw), а с CentOS/Red Hat — firewalld.

Разрешение SSH в файрволе на Ubuntu:


На CentOS/Red Hat используем команду firewall-cmd :


После этой процедуры можно запустить файрвол.

На CentOS/Red Hat запускаем сервис systemd для firewalld:


На Ubuntu используем такую команду:

Сервис Fail2Ban анализирует логи на сервере и подсчитывает количество попыток доступа с каждого IP-адреса. В настройках указаны правила, сколько попыток доступа разрешено за определённый интервал — после чего данный IP-адрес блокируется на заданный отрезок времени. Например, разрешаем 5 неудачных попыток аутентификации по SSH в промежуток 2 часа, после чего блокируем данный IP-адрес на 12 часов.

Установка Fail2Ban на CentOS и Red Hat:


Установка на Ubuntu и Debian:


В программе два конфигурационных файла: /etc/fail2ban/fail2ban.conf и /etc/fail2ban/jail.conf . Ограничения для бана указываются во втором файле.

Джейл для SSH включён по умолчанию с дефолтными настройками (5 попыток, интервал 10 минут, бан на 10 минут).


Кроме SSH, Fail2Ban может защищать и другие сервисы на веб-сервере nginx или Apache.

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

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

На CentOS/Red Hat нужно установить приложение dnf-automatic и включить таймер:

SSH был разработан в 1995 году для замены telnet (порт 23) и ftp (порт 21), поэтому автор программы Тату Илтонен выбрал порт 22 по умолчанию, и его утвердили в IANA.

Естественно, все злоумышленники в курсе, на каком порту работает SSH — и сканируют его вместе с остальными стандартными портами, чтобы узнать версию программного обеспечения, для проверки стандартных паролей рута и так далее.

Смена стандартных портов — обфускация — в несколько раз сокращает объём мусорного трафика, размер логов и нагрузку на сервер, а также сокращает поверхность атаки. Хотя некоторые критикуют такой метод «защиты через неясность» (security through obscurity). Причина в том, что эта техника противопоставляется фундаментальной архитектурной защите. Поэтому, например, Национальный институт стандартов и технологий США в «Руководстве по безопасности сервера» указывает необходимость открытой серверной архитектуры: «Безопасность системы не должна полагаться на скрытность реализации её компонентов», — сказано в документе.

Теоретически, смена портов по умолчанию противоречит практике открытой архитектуры. Но на практике объём вредоносного трафика действительно сокращается, так что это простая и эффективная мера.

Номер порта можно настроить, изменив директиву Port 22 в файле конфигурации /etc/ssh/sshd_config. Он также указывается параметром -p <port> в sshd. Клиент SSH и программы sftp тоже поддерживают параметр -p <port> .

Параметр -p <port> можно использовать для указания номера порта при подключении с помощью команды ssh в Linux. В sftp и scp используется параметр -P <port> (заглавная P). Указание из командной строки переопределяет любое значение в файлах конфигурации.

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

На правах рекламы

Закажи и сразу работай! Создание VDS любой конфигурации и с любой операционной системой в течение минуты. Максимальная конфигурация позволит оторваться на полную — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Эпичненько :)

Читайте также: