Подключение к centos 7 по ssh. Создание правил для приложений. Шаг #2: Создание нового пользователя

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

Шаг #1: Смена пароля для учетной записи - root

После окончания создания нового VPS-сервера, вам будет выдан пароль для суперпользователя root. Сразу после подключения к вашему серверу по SSH, необходимо его изменить, т.к. иногда выданный пароль не является устойчивым к подбору (brutforce).

Зададим новый пароль для root.

Шаг #2: Создание нового пользователя

Изначально, после установки CentOS и других дистрибутивов Linux, доступен пользователь под именем root. Суперпользователь root, представляет собой учетную запись администратора системы и имеет максимальные привилегии в системе. Из-за своих высоких возможностей, использовать учетную запись root рекомендуется только в особых случаях, т.к. это способствует случайному совершению деструктивных и необратимых ошибок, исправить которые будет очень сложно.

В связи с этим, администратор сервера создаёт нового пользователя, которому частично делегируют привилегии root. Ниже рассмотрим процесс создания и настройки учетной записи нового пользователя системы.

Создадим новую учетную запись, из под которой будем всегда работать на сервере.

adduser username

Добавим пароль для входа в систему.

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

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

Сделать это можно добавив учетную запись в группу суперпользователей - wheel .

gpasswd -a username wheel

Теперь новый пользователь username может исполнять команды от имени root , используя утилиту sudo .

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

Шаг #3: Включение файрвола

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

Установим службу файрвола:

sudo yum install firewalld

Включим файрвол и добавим его в список служб для автозапуска при рестарте системы:

sudo systemctl start firewalld;
sudo systemctl enable firewalld;

Шаг #4: Настройка конфигурации SSH

Так как в сети существует большое количество запущенных по всему миру брутфорс-программ, которые день и ночь подбирают пароли к пользователю root и есть вероятность того, что ваш VPS тоже попадет под раздачу. В таком случае, разумным решением будет запретить возможность подключения root пользователя по SSH.

Откроем конфигурационный файл - /etc/ssh/sshd_config:

sudo vi /etc/ssh/sshd_config

Изменим значение директивы PermitRootLogin .

#PermitRootLogin yes PermitRootLogin no

#PermitRootLogin yes

PermitRootLogin no

Если вы недостаточно опытный пользователь Linux систем и ваш хостер не предоставляет вам VNC-панель, то запрещать root доступ по ssh, не рекомендуется, т.к. при возникновении критической ошибки, которую можно исправить, только из root записи, вы не сможете ничего сделать.

Также изменим стандартный номер порта SSH, т.к. именно на стандартный 22 порт "стучатся" брутфорс-программы.

Все порты можно разделить на три группы:

  • 0 - 1023 - хорошо известные порты, также относятся к системным портам;
  • 1024 - 49151 - зарегистрированные порты, также относятся к пользовательским портам;
  • 49152 - 65535 - динамические порты, также относятся к частным портам.

Для начала выберем номер порта, на котором будет работать SSH. Выбирать значение номера порта рекомендуется в пределах 49152 - 65535. Чтобы выбрать какой-либо порт, сначала нужно проверить не занят ли он другим сервисом. Для примера, я выберу порт с номером 63356.

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

cat /etc/services | grep 63356/tcp

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

Теперь в файле /etc/ssh/sshd_config изменим значение директивы Port:

#Port 22 Port 63356

#Port 22

Port 63356

Перезапустим сервис SSH для принятия настроек.

sudo systemctl restart sshd

Укажем файрволу, чтобы он пропускал подключения по новому SSH порту - 63356

sudo firewall-cmd --zone=public --permanent --add-port=63356/tcp;
sudo firewall-cmd --reload;

Убедимся, что добавленный порт прослушивается (активен):

ss -lntu | grep 63356

$ ss -lntu | grep 63356
tcp LISTEN 0 128 *:63356 *:*
tcp LISTEN 0 128:::63356:::*

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

ssh username@server_ip_adress -p 63356

Шаг #5: Смена имени сервера (hostname)

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

Полную информацию о имени хоста можно узнать следующей командой:

hostnamectl status

$ hostnamectl status
Static hostname: hostername.ru
Icon name: computer-vm
Chassis: vm
Machine ID:
Boot ID:
Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
CPE OS Name: cpe:/o:centos:centos:7
Kernel: Linux 3.10.0-693.2.2.el7.x86_64
Architecture: x86-64

Изменим имя сервера:

sudo hostnamectl set-hostname "example.ru"

Убедимся, что имя поменялось:

Шаг #6: Настройка временной зоны

При аренде VPS-сервера его локальное время часто связано с тем регионом, в котором он находится. Если, например, ваш VPS-сервер находится в Амстердаме, то и сервер будет работать по центрально-европейскому времени.

Проверим, то по какой временной зоне работает наш сервер:

Получить список доступных временных зон:

timedatectl list-timezones

Я живу в Московском часовом поясе, поэтому мне удобно, чтобы и сервер работал по такому же времени.

Установить время сервера по Москве можно так:

timedatectl set-timezone Europe/Moscow

Шаг #7: Настройка локали

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

Список всех доступных локалей хранится в каталоге - /usr/share/i18n/locales

Просмотреть используемые локали, можно командой ниже:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

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

sudo localectl set-locale LC_TIME=ru_RU.UTF-8

Язык в результат выполнения команды date , изменится на Русский(после перезагрузки сервера).

Для установки Русского-языка в систему, используйте команду:

sudo localectl set-locale LANG=ru_RU.UTF-8

Установка Русской локали для всех переменных окружения:

sudo localectl set-locale LC_ALL=ru_RU.UTF-8

Проверка установки локали:

lacalectl status

Шаг #8: Отключение SElinux

SELinux (англ. Security-Enhanced Linux - Linux с улучшенной безопасностью) - реализация системы принудительного контроля доступа, которая может работать параллельно с классической избирательной системой контроля доступа.

Не смотря на то, что SElinux позволяет улучшить управление безопасностью, он чаще мешает чем приносит реальную пользу, поэтому рекомендую его отключить.

Проверить включен ли SElinux можно командой ниже:

Для отключения SElinux отредактируйте файл - /etc/selinux/config и для директивы SELINUX установите значение disabled .

CentOS - это свободный дистрибутив, основанный на исходном коде Red Hat Enterprise Linux, фактически, он создается с этих исходников практически без изменений, разработчики только вырезают весь брендинг Red Hat. Но в отличие от Red Hat, CentOS полностью бесплатна и получает регулярные обновления, спустя немного времени после выхода их для Red Hat поскольку они тоже собираются из исходного кода.

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

1. Настройка статического IP адреса

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

yum install net-tools

Сначала посмотрим доступные сетевые интерфейсы и текущий IP адрес:

Теперь можно перейти к настройке интерфейса через файл /etc/sysconfig/network-scripts/ifcfg-enp0s3, например, с помощью редактора vi:

vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

IPADDR = ваш_ip
GATEWAY = шлюз_для_доступа_к_сети
DNS1 = IP_адрес_DNS1
DNS2 = IP_адрес_DNS2

После внесения изменений этот файл будет выглядеть вот так:

Затем останется перезагрузить сеть чтобы применить новые настройки:

service network restart

Потом, при необходимости вы можете сменить IP адрес таким же способом.

2. Имя компьютера

Следующее что нам нужно сделать - это изменить имя компьютера. Текущее имя компьютера хранится в переменной HOSTNAME:

Чтобы его изменить вам нужно отредактировать файл /etc/hostname и заменить там старое имя на новое.

vi /etc/hostname

Также вы можете использовать команду hostnamectl:

hostnamectl set-hostname "имя_хоста"

3. Обновление CentOS

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

yum update && yum upgrade

4. Установите браузер

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

yum install links

Вы можете найти и другие консольные браузеры для Linux, например, Lynx или Elinks.

5. Настройка часового пояса

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

Сначала получите список часовых поясов:

timedatectl list-timezones

Затем установите нужный, например, Europe/Kyiv:

timedatectl set-timezone Europe/Kyiv

Затем проверьте:

7. Настройка локали

Локаль определяет язык и кодировку, которая будет использоваться в вашей системе, например, для включения русского языка установите значение ru_RU.UTF-8

localectl set-locale LANG=ru_RU.UTF-8

Затем смотрим что получилось:

Затем устанавливаем раскладку клавиатуры:

localectl set-keymap us

8. Отключите SELinux

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

sed -i "s/(^SELINUX=).*/SELINUX=disabled/" /etc/selinux/config

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

9. Создайте пользователя

Использовать систему от имени суперпользователя небезопасно и тем более небезопасно оставлять открытым доступ к root аккаунту по ssh. Сначала создайте обычного пользователя и установите для него пароль:

useradd имя_пользователя
# passwd пароль

Затем добавьте пользователя в группу wheel, чтобы разрешать пользователю работать от имени администратора:

usermod -G wheel имя_пользователя

Теперь осталось подправить настройки sudo, для этого добавьте такую строчку, если ее там еще нет:

%wheel ALL = (ALL) ALL

10. Включите сторонние репозитории

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

Для добавления репозитория Enterprise Linux Repository (EPEL) выполните:

yum install epel-release
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

10. Настройка SSH

Чаще всего нам приходится работать с серверами не напрямую, а по сети, через SSH. Обычно служба SSH уже установлена и активирована, но для ее правильной работы нужно выполнить несколько настроек. Сначала нужно настроить использование только безопасного протокола, для этого откройте файл /etc/ssh/ssh_config и удалите строчку Protocol 2,1. А вместо нее добавьте:

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

PermitRootLogin no

11. Установите веб-сервер Apache

Если вы планируете использовать машину в качестве веб-сервера, вам понадобится Apache. С помощью него вы можете размещать веб-сайты, мультимедиа контент, клиентские программы и многое другое. Для установки выполните:

yum install httpd

Когда установка будет завершена, перед тем, как вы сможете перейти к работе нужно разрешить HTTP в брандмауере:

firewall-cmd --add-service=http
# firewall-cmd -permanent -add-port=3221/tcp
# firewall-cmd --reload

Теперь осталось добавить Apache в автозагрузку:

systemctl start httpd.service
# systemctl enable httpd.service

12. Установите PHP

PHP - это современный язык веб-приложений и скриптов. Он часто используется в качестве языка программирования общего назначения. Для установки выполните:

После установки необходимо перезапустить Apache:

echo -e "" > /var/www/html/phpinfo.php

Затем откройте созданный файл в браузере:

links http://127.0.0.1/phpinfo.php

13. Установка базы данных

MariaDB - это база данных, основанная на исходном коде MySQL. Дистрибутивы Linux на базе Red Hat используют MariaDB вместо MySQL. Базы данных - незаменимая вещь на сервере, поэтому настройка CentOS после установки должна включать ее установку. Для установки MariaDB наберите:

yum install mariadb-server mariadb

Затем запустите и добавьте в автозагрузку:

systemctl start mariadb.service
# systemctl enable mariadb.service

И разрешите в использование службы в брандмауэре:

firewall-cmd --add-service=mysql

Осталось запустить скрипт настройки:

/usr/bin/mysql_secure_installation

14. Установите GCC

GCC расшифровывается как GNU Compiler Collection, это набор компиляторов, которые считаются стандартом для сборки программ в Linux. Но по умолчанию он не поставляется с CentOS, поэтому для установки наберите:

Затем вы можете посмотреть версию GCC:

15. Установите Java

Java - это объективно-ориентированный язык программирования общего назначения. Он не устанавливается по умолчанию, поэтому настройка CentOS 7 после установки может включать и его установку. Для этого выполните:

yum install java

Затем проверьте версию:

Выводы

В этой статье мы рассмотрели как выполняется настройка сервера CentOS 7 после установки. Как видите, есть много элементарных действий, которые желательно сделать перед тем, как использовать сервер на производстве. Если у вас остались вопросы, спрашивайте в комментариях!

У меня имеется свежеустановленный сервер CentOS 7 на VDS с виртуализацией KVM. Я расскажу о том, как сделать базовую настройку сервера для использования его в любом качестве на ваше усмотрение. Это может быть web сервер ,vpn сервер , сервер мониторинга . Я расскажу о начальных настройках системы CentOS, которые повышают безопасность и удобство работы с сервером. Отмечу, что в 7-й версии системы произошли некоторые изменения по сравнению с предыдущими версиями.

Введение

Начальная настройка CentOS 7

Итак, у нас имеется: # uname -a Linux zeroxzed.ru 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Первым делом обновим базовую систему:

# yum -y update

Для удобства администрирования, я всегда устанавливаю Midnight Commander, или просто mc:

# ifconfig

И увидите ответ:

Bash: ifconfig: command not found

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

Вместо ifconfig в CentOS 7 теперь утилита ip . Я не понимаю, зачем пилить отдельные программы для управления сетевыми настройками, если ifconfig и так отлично справляется с задачей. К тому же мне всегда нравилось, что в различных дистрибутивах линукс все примерно одинаковое. С помощью ifconfig можно настроить сеть не только в linux, но и в freebsd. Это удобно. А когда в каждом дистрибутиве свой инструмент это неудобно. Так что предлагаю установить привычный ifconfig.

Сделаем это:

# yum -y install net-tools.x86_64

Теперь, чтобы у нас работали команды nslookup или, к примеру, host необходимо установить пакет bind-utils. Если этого не сделать, то на команду:

# nslookup

Будет вывод:

Bash: nslookup: command not found

Так что устанавливаем bind-utils:

# yum -y install bind-utils

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

# mcedit /etc/sysconfig/selinux

меняем значение
SELINUX=disabled
Чтобы изменения вступили в силу, перезагружаемся:

# reboot

Указываем сетевые параметры

Добавление репозиториев

Для инсталляции различного софта необходимо подключить репозитории в CentOS . Наиболее популярные это EPEL и rpmforge, поэтому добавим их. Сначала ставим EPEL. С ним все просто, он добавляется из стандартного репозитория:

# yum -y install epel-release

Устанавливаем rpmforge:

# rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt # yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm

Установка iftop, atop, htop на CentOS 7

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

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

# yum -y install iftop

И два интересных диспетчера задач, я чаще всего пользуюсь htop, но иногда пригодится и atop. Ставим оба, сами посмотрите, разберетесь, что вам больше нравится, подходит:

# yum -y install htop # yum -y install atop

Вот как выглядит htop:

На этом у меня все. Базовая настройка CentOS 7 закончена, можно приступать к установке и настройке основного функционала.

Заключение

Мы выполнили некоторые начальные шаги по настройке, которые я обычно делаю при подготовке сервера. Я не претендую на абсолютную истину, возможно что-то упускаю или делаю не совсем верно. Буду рад разумным и осмысленным комментариям и замечаниям с предложениями.

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

  1. Пример настройки сервера мониторинга zabbix , либо только подключение centos к мониторингу путем установки на него агента.
  2. Настройка email оповещений zabbix через сторонний smtp сервер.
  3. Подробный мониторинг web сервера на базе nginx + php-fpm.
  4. Система мониторинга сайта на базе zabbix.
  5. Наблюдение за mysql репликацией в zabbix.

Видео по настройке CentOS 7

Август 15, 2014 12:57 пп 12 380 views | Комментариев нет

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

1: Войдите как root-пользователь

Получив свой IP-адрес и root-пароль, войдите на сервер как главный пользователь (root). Для этого используйте команду (замените выделенный IP своим IP-адресом):

ssh [email protected]

Терминал вернет что-то вроде:

The authenticity of host "111.22.33.444 (111.22.33.444)" can"t be established.
ECDSA key fingerprint is 79:95:46:1a:ab:37:11:8e:86:54:36:38:bb:3c:fa:c0.
Are you sure you want to continue connecting (yes/no)?

Выберите yes и введите свой root-пароль.

Примечание : использовать учетную запись root на регулярной основе не рекомендуется; данное руководство поможет создать другого пользователя для постоянной работы.

2: Измените пароль

На данный момент используется root-пароль, установленный по умолчанию и полученный после регистрации сервера. Первое, что нужно сделать, — заменить его собственным паролем.

Что касается устанавливаемых паролей, система CentOS очень осторожна. Потому после ввода нового пароля может появиться извещение BAD PASSWORD. Можно либо установить более сложный пароль, либо же проигнорировать сообщение: на самом деле, CentOS примет даже слишком простой или короткий пароль, хотя и предложит использовать более сложную комбинацию.

3: Создайте нового пользователя

Войдя на сервер и изменив root-пароль, нужно снова войти на VPS как root. Данный раздел продемонстрирует, как создать нового пользователя и установить пароль для него.

Итак, создайте нового пользователя; для этого используйте следующую команду (замените demo своим именем пользователя):

adduser demo

Теперь создайте пароль для этого пользователя (опять же, замените demo именем только что созданного пользователя):

passwd demo

4: Root-привилегии

На данный момент все права администратора принадлежат root-пользователю. Чтобы иметь возможность постоянно использовать новую учетную запись, нужно передать новому пользователю (demo) все root-привилегии.

Для выполнения задач с привилегиями root нужно начинать команду с sudo. Эта фраза полезна по двум причинам: 1) она защищает систему от разрушающих ошибок, допущенных пользователем; 2) она хранит все запущенные с sudo команды в файле /var/log/secure, который позже можно просмотреть.

Теперь нужно изменить настройки sudo; для этого используйте текстовый редактор CentOS по умолчанию, который называется vi:

Найдите раздел User privilege specification, который выглядит так:

# User privilege specification
root ALL=(ALL) ALL

После строки с привилегиями root внесите следующую строку, которая передаст все привилегии новому пользователю (чтобы начать ввод текста в vi, нажмите i):

demo ALL=(ALL) ALL

Чтобы завершить ввод текста, нажмите Esc; затем введите:, wq, Enter, чтобы сохранить и закрыть файл.

5: Настройте SSH (дополнительно)

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

Откройте конфигурационный файл:

sudo vi /etc/ssh/sshd_config

Найдите следующие разделы и внесите в них соответствующие изменения:

Port 25000
PermitRootLogin no

Port : хотя по умолчанию используется порт 22, его номер можно заменить любым другим в диапазоне от 1025 до 65536. В данном руководстве используется SSHD-порт 25000. Обратите внимание: новый номер порта нужно обязательно запомнить/записать, поскольку он понадобится для входа на сервер через SSH.

PermitRootLogin :измените значение yes на no, чтобы отключить вход в систему как root. Теперь войти на сервер можно только при помощи нового пользователя.

Чтобы SSH мог использовать только конкретный пользователь, добавьте эту строку в нижней части документа (замените demo своим именем пользователя):

AllowUsers demo

Затем сохраните изменения и закройте файл.

Перезапуск SSH

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

sudo systemctl reload sshd.service

Чтобы протестировать новые настройки (пока что не выходите из учетной записи root), откройте терминал и войдите на сервер как новый пользователь (не забудьте указать правильный IP-адрес и порт):

ssh -p 25000 demo @111.22.33.444

Должно появиться извещение:

Зоны

Демон firewalld управляет группами правил при помощи так называемых зон.

Зоны – это, по сути, наборы правил, которые управляют трафиком на основе уровня доверия к той или иной сети. Зоны присваиваются сетевым интерфейсам и управляют поведением брандмауэра.

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

В firewalld существуют следующие зоны:

  • drop: самый низкий уровень доверия сети. Весь входящий трафик сбрасывается без ответа, поддерживаются только исходящие соединения.
  • block: эта зона похожа на предыдущую, но при этом входящие запросы сбрасываются с сообщением icmp-host-prohibited или icmp6-adm-prohibited.
  • public: эта зона представляет публичную сеть, которой нельзя доверять, однако поддерживает входящие соединения в индивидуальном порядке.
  • external: зона внешних сетей. Поддерживает маскировку NAT, благодаря чему внутренняя сеть остается закрытой, но с возможностью получения доступа.
  • internal: обратная сторона зоны external, внутренние сети. Компьютерам в этой зоне можно доверять. Доступны дополнительные сервисы.
  • dmz: используется для компьютеров, расположенных в DMZ (изолированных компьютеров, которые не будут иметь доступа к остальной части сети); поддерживает только некоторые входящие соединения.
  • work: зона рабочей сети. Большинству машин в сети можно доверять. Доступны дополнительные сервисы.
  • home: зона домашней сети. Окружению можно доверять, но поддерживаются только определённые пользователем входящие соединения.
  • trusted: всем машинам в сети можно доверять.

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

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

Большинство команд firewall-cmd может использовать флаг —permanent, который сохранит правило, после чего оно будет использоваться на постоянной основе.

Включение брандмауэра firewalld

Для начала нужно включить демон. Unit-файл systemd называется firewalld.service. Чтобы запустить демон, введите.

sudo systemctl start firewalld.service

Убедитесь, что сервис запущен:

firewall-cmd --state
running

Теперь брандмауэр запущен и работает согласно конфигурации по умолчанию.

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

Правила брандмауэра по умолчанию

Просмотр правил по умолчанию

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

firewall-cmd --get-default-zone
public

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

Чтобы получить список активных зон, введите:


public
interfaces: eth0 eth1

К зоне public привязаны два сетевых интерфейса: eth0 и eth1. Интерфейсы, привязанные к зоне, работают согласно правилам этой зоны.

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

firewall-cmd --list-all
public (default, active)
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Итак, теперь вы знаете, что:

  • public является зоной по умолчанию и единственной активной зоной.
  • К ней привязаны интерфейсы eth0 и eth1.
  • Она поддерживает трафик DHCP (присваивание IP-адресов) и SSH (удаленное администрирование).

Другие зоны брандмауэра

Теперь следует ознакомиться с другими зонами.

Чтобы получить список всех доступных зон, введите:

firewall-cmd --get-zones

Чтобы получить параметры конкретной зоны, добавьте в команду флаг —zone=.

firewall-cmd --zone=home --list-all
home
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Чтобы вывести определения всех доступных зон, добавьте опцию —list-all-zones. Для более удобного просмотра вывод можно передать в пейджер:

firewall-cmd --list-all-zones | less

Настройка зон интерфейсов

Изначально все сетевые интерфейсы привязаны к зоне по умолчанию.

Изменение зоны интерфейса на одну сессию

Чтобы перевести интерфейс в другую зону на одну сессию, используйте опции —zone= и —change-interface=.

Например, чтобы перевести eth0 в зону home, нужно ввести:

sudo firewall-cmd --zone=home --change-interface=eth0
success

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

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

firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1

После перезагрузки брандмауэра интерфейс будет снова привязан к зоне по умолчанию.

sudo systemctl restart firewalld.service
firewall-cmd --get-active-zones
public
interfaces: eth0 eth1

Изменение зоны интерфейса на постоянной основе

Если в настройках интерфейса не указана никакая другая зона, после перезапуска брандмауэра интерфейс будет снова привязан к зоне по умолчанию. В CentOS такие конфигурации хранятся в каталоге /etc/sysconfig/network-scripts, в файлах формата ifcfg-interface.

Чтобы определить зону интерфейса, откройте конфигурационный файл этого интерфейса, например:

В конец файла добавьте переменную ZONE= и в качестве значения укажите другую зону, например, home:

. . .
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=home

Сохраните и закройте файл.

Чтобы обновить настройки, перезапустите сетевой сервис и брандмауэр:

sudo systemctl restart network.service
sudo systemctl restart firewalld.service

После перезапуска интерфейс eth0 будет привязан к зоне home.

firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1

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

Также вы можете выбрать другую зону по умолчанию.

Для этого используется параметр —set-default-zone=. После этого все интерфейсы будут привязаны к другой зоне:

sudo firewall-cmd --set-default-zone=home
home
interfaces: eth0 eth1

Создание правил для приложений

Добавление сервиса в зону

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

firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https

Примечание : Больше информации о каждом конкретном сервисе можно найти в файлах.xml в каталоге /usr/lib/firewalld/services. К пример, сведения о сервисе SSH хранятся в /usr/lib/firewalld/services/ssh.xml и выглядят так:



SSH

Чтобы включить поддержку сервиса в той или иной зоне, используйте опцию —add-service=. Указать целевую зону можно с помощью опции —zone=. По умолчанию эти изменения будут работать в течение одной сессии. Чтобы сохранить изменения и использовать их на постоянной основе, добавьте флаг —permanent.

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

sudo firewall-cmd --zone=public --add-service=http

Если сервис нужно добавить в зону по умолчанию, флаг —zone= можно опустить.

Убедитесь, что операция выполнена успешно:

firewall-cmd --zone=public --list-services
dhcpv6-client http ssh

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

sudo firewall-cmd --zone=public --permanent --add-service=http

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

sudo firewall-cmd --zone=public --permanent --list-services
dhcpv6-client http ssh

Теперь зона public поддерживает HTTP и порт 80 на постоянной основе. Если веб-сервер может обслуживать трафик SSL/TLS, вы также можете добавить сервис https (для одной сессии или в набор постоянных правил):

sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=https

Что делать, если нужный сервис недоступен?

Брандмауэр firewalld по умолчанию включает в себя многие наиболее распространённые сервисы. Однако некоторым приложениям необходимы сервисы, поддержка которых отсутствует в firewalld. В таком случае вы можете поступить двумя способами.

Способ 1: Настройка порта

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

Например, приложение, которое использует порт 5000 и протокол TCP, нужно добавить в зону public. Чтобы включить поддержку приложения на дну сессию, используйте параметр —add-port= и укажите протокол tcp или udp.

sudo firewall-cmd --zone=public --add-port=5000/tcp

Убедитесь, что операция прошла успешно:

firewall-cmd --list-ports
5000/tcp

Также можно указать последовательный диапазон портов, отделив первый и последний порт диапазона с помощью тире. Например, если приложение использует UDP-порты 4990-4999, чтобы добавить их в зону public, нужно ввести:

sudo firewall-cmd --zone=public --add-port=4990-4999/udp

После тестирования можно добавить эти правила в постоянные настройки брандмауэра.

sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
sudo firewall-cmd --zone=public --permanent --list-ports
success
success
4990-4999/udp 5000/tcp

Способ 2: Определение сервиса

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

Сервисы – это просто наборы портов с определенным именем и описанием. С помощью сервисов проще управлять настройками, но сами по себе они сложнее, чем порты.

Для начала нужно скопировать существующий сценарий из каталога /usr/lib/firewalld/services в каталог /etc/firewalld/services (здесь брандмауэр ищет нестандартные настройки).

Например, можно скопировать определение сервиса SSH и использовать его для определения условного сервиса example. Имя сценария должно совпадать с именем сервиса и иметь расширение.xml.

sudo cp /usr/lib/firewalld/services/service.xml /etc/firewalld/services/example.xml

Откорректируйте скопированный файл.

sudo nano /etc/firewalld/services/example.xml

В файле находится определение SSH:



SSH
Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.

Большую часть определения сервиса составляют метаданные. Изменить краткое имя сервиса можно в тегах . Это человекочитаемое имя сервиса. Также нужно добавить описание сервиса. Единственное изменение, которое повлияет на работу сервиса – это изменение номера порта и протокола.

Вернёмся к сервису example; допустим, он требует открыть TCP- порт 7777 и UDP- порт 8888. Определение будет выглядеть так:



Example Service
This is just an example service. It probably shouldn"t be used on a real system.

Сохраните и закройте файл.

Перезапустите брандмауэр:

sudo firewall-cmd --reload

Теперь сервис появится в списке доступных сервисов:

firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns example ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https

Создание зон

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

Например, для веб-сервера можно создать зону publicweb, а для DNS-сервиса – зону privateDNS.

Создавая зону, нужно добавить её в постоянные настройки брандмауэра.

Попробуйте создать зоны publicweb и privateDNS:

sudo firewall-cmd --permanent --new-zone=publicweb
sudo firewall-cmd --permanent --new-zone=privateDNS

Убедитесь, что зоны существуют:

sudo firewall-cmd --permanent --get-zones

В текущей сессии новые зоны не будут доступны:

firewall-cmd --get-zones
block dmz drop external home internal public trusted work

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

sudo firewall-cmd --reload
firewall-cmd --get-zones
block dmz drop external home internal privateDNS public publicweb trusted work

Теперь вы можете присвоить новым зонам требуемые сервисы и порты. К примеру, в зону publicweb можно добавить SSH, HTTP и HTTPS.

sudo firewall-cmd --zone=publicweb --add-service=ssh
sudo firewall-cmd --zone=publicweb --add-service=http
sudo firewall-cmd --zone=publicweb --add-service=https
firewall-cmd --zone=publicweb --list-all
publicweb
interfaces:
sources:
services: http https ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

В зону privateDNS можно добавить DNS:

sudo firewall-cmd --zone=privateDNS --add-service=dns
firewall-cmd --zone=privateDNS --list-all
privateDNS
interfaces:
sources:
services: dns
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Затем можно привязать сетевые интерфейсы к новым зонам:

sudo firewall-cmd --zone=publicweb --change-interface=eth0
sudo firewall-cmd --zone=privateDNS --change-interface=eth1

Теперь можно протестировать настройку. Если всё работает правильно, вы можете добавить эти правила в постоянные настройки.

sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
sudo firewall-cmd --zone=publicweb --permanent --add-service=http
sudo firewall-cmd --zone=publicweb --permanent --add-service=https
sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns

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

К примеру, eth0 будет привязан к publicweb:

sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
. . .
IPV6_AUTOCONF=no
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=publicweb

А интерфейс eth1 будет привязан к privateDNS:

sudo nano /etc/sysconfig/network-scripts/ifcfg-eth1
. . .
NETMASK=255.255.0.0
DEFROUTE="no"
NM_CONTROLLED="yes"
ZONE=privateDNS

Перезапустите сетевые сервисы и брандмауэр:

sudo systemctl restart network
sudo systemctl restart firewalld

Проверьте зоны:

firewall-cmd --get-active-zones
privateDNS
interfaces: eth1
publicweb
interfaces: eth0

Убедитесь, что в зонах работают нужные сервисы:

firewall-cmd --zone=publicweb --list-services
http htpps ssh
firewall-cmd --zone=privateDNS --list-services
dns

Пользовательские зоны полностью готовы к работе. Вы можете сделать любую из них зоной по умолчанию. Например:

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

Автоматический запуск брандмауэра

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

Для этого введите:

sudo systemctl enable firewalld

Теперь брандмауэр будет запускаться вместе с сервером.

Заключение

Брандмауэр firewalld — очень гибкий инструмент. Зоны позволяют быстро изменять политику брандмауэра.

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

Tags: ,