Базовая настройка безопасности Linux-систем

Это руководство создано для новых пользователей Linux, которые, хотя бы немного знакомы с принципами ее администрирования. Также инструкция будет полезна и более опытным пользователям, в качестве дополнительного источника проверки знаний. В приведенной статье мы постарались рассмотреть все основные аспекты защиты от неразрешенного доступа для таких ОС, как Debian / Ubuntu, CentOS/ Fedora, а также правила настройки брандмауэра, управление проверками подлинности при удаленном подключении и многое другое.

Автоматическое обновление программного обеспечения

Как уже неоднократно упоминалось, поддерживать актуальное состояние версий операционной системы и всего программного обеспечения очень важно. Это один из самых главных и действенных, и в тоже время простых способов обеспечения безопасности ОС. Актуальные версии ПО – это возможность исправления обнаруженных сбоев, а также повышенная вероятность устранения критических ошибок, найденных к моменту выхода последней версии.

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

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

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

Первый шаг в этой части инструкции – создание нового пользователя.

На Debian/Ubuntu:

Создайте аккаунт с новым уникальным именем и введите пароль в соответствии с запросом. Будьте внимательны, возможности показать пароль нет, вы вводите данные, которые не отображаются в командной строке. Чтобы подтвердить данные, нажмите на клавишу Enter.

adduser oblako

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

adduser oblako sudo

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

sudo apt-get install htop

CentOS/Fedora:

Придумайте имя и пароль для нового аккаунта.

useradd oblako && passwd oblako

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

usermod –aG wheel oblako

Подключение к хосту через SSH безопасным путем

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

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

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

Создание аутентификационных ключей:

При работе на Linux / MacOS обратите внимание! Если ранее пара ключей уже создавалась, то данная команда перезапишет данные. Как следствие может пропасть доступ к прочим хостам, которые работали с использованием данной пары ключей.

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

ls ~/.ssh/id_rsa*

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

ssh-keygen –b 4096

На Windows:

ОС позволяет использовать специальную программу, которую можно найти по этой ссылке. После скачивания и распаковки, подключите ssh-keygen, как это изображено ниже.

Выберите 2048-битный ключ ssh-rsa и нажмите на кнопку «Сгенерировать».

Команда позволит создать новый ключ, после чего необходимо придумать специальную кодовую фразу и комментарий. Сохраните публичный ключ – mykey.ppk  и приватный - mykey.ppk .

Установка пары ключей на сервер

При реализации этой инструкции замените приведенные данные на адрес своего сервера и имя аккаунта, под которым создавались ключи./p>

На Linux необходимо ввести команду с локального компьютера.

ssh-copy-id oblako@1.1.1.1

На Mac OS войдите под именем пользователя, владеющего ключами на сервер и введите:

mkdir –p ~/.ssh && sudo chmod –R 700 ~/.ssh/

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

scp ~/.ssh/id_rsa.pub oblako@1.1.1.1:~/.ssh/authorized_keys

Для Windows:

Первый вариант – это использование утилиты WinSCP, которую можно скачать здесь. Для входа воспользуйтесь ip-адресом сервера, именем и паролем аккаунта, под который делались ключи, после чего нажмите кнопку «Залогиниться».

Если данные введены верно, перед вами откроется окно, состоящее из двух частей. Слева вы увидите перечень локальных документов, а справа – тех файлов, которые находятся на удаленном сервере. Слева выберите нужный вам файл ключа. На верхней панели найдите кнопку «Загрузить», выберите нужную директорию на сервере следующей командой (не забудьте ввести имя пользователя):

/home/oblako/.ssh/authorized_keys

Открытый ключ можно перенести напрямую из утилиты, которая была использована при его создании (см. выше). Ключ будет перенесен в терминал Putty, где происходит подключение к удаленному серверу. Из окна терминала необходимо ввести команду:

mkdir ~/.ssh; nano ~/.ssh/authorized_keys

Она позволит открыть новый пустой файл в редактора. Найдите файл ключа и скопируйте его данные в поле документа. Важно! Обратите внимание, что данные должны идти одной строкой, как и в изначальном документе. После завершения переноса текста нажмите CTRL+X , Y, а затем Enter.

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

sudo chmod 700 -R ~/.ssh && chmod 600 ~/.ssh/authorized_keys

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

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

Изменение службы сетевого протокола:

Прекращение подключений от имени пользователя root.

Если вы воспользуетесь данным запретом, то сервер не будет принимать подключения SSH только от пользователя root, для остальных все останется по-прежнему. Чтобы получить расширенные права уже после подключения, можно воспользоваться командой su – или sudo –s, чтобы переключиться на суперпользователя, или же просто добавлять префикс sudo перед вводом текста команды.

Войдите на сервер, найдите файл sshd_config. В документе измените значение параметра PermitRootLogin на отрицательное.

Отключение подключений по паролю.

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

Войдите в документ sshd_config. Далее найдите строку PasswordAuthentification и введите символ # в начале текста. Если эта строка отсутствует, добавьте ее. Для Debian/Ubuntu используйте команду:

 

nano /etc/ssh/sshd_config
...
PasswordAuthentication no

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

Перезапуск службы SSH для обновления внесенных изменений

Если вы пользуетесь systemctl, то введите команду:

sudo systemctl restart sshd

Если в работе используется System V или Upstart, тогда команда будет такой:

sudo service ssh restart Настойки утилиты для установления защиты подключений по сетевому протоколу

 

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

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

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

Изменение настроек брандмауэра

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

Инструмент Iptables представляет собой контроллер для стандартного набора программ фильтрации для ОС. Как правило, он уже есть в составе установочного пакета программы. Это достаточно сложная программа, которой легче всего управлять с помощью утилит. Разберемся, как правильно настроить инструмент.

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

IPv4:

sudo iptables -L

IPv6:

sudo ip6tables -L

В стандартную настройку инструмента включено разрешение всех подключений:


Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

По умолчанию iptables разрешает все входящие, исходящие и переадресованные подключения.

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

IPv4 (файл /tmp/v4):


*filter
# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT

# Allow ping.
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT

# Allow SSH connections.
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# Allow HTTP and HTTPS connections from anywhere
# (the normal ports for web servers).
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

# Allow inbound traffic from established connections.
# This includes ICMP error returns.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Log what was incoming but denied (optional but useful).
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7

# Reject all other inbound.
-A INPUT -j REJECT

# Log any traffic that was sent to you
# for forwarding (optional but useful).
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7

# Reject all traffic forwarding.
-A FORWARD -j REJECT

COMMIT

IPv6 (/tmp/v6):


*filter

# Allow all loopback (lo0) traffic and reject traffic
# to localhost that does not originate from lo0.
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s ::1/128 -j REJECT

# Allow ICMP
-A INPUT -p icmpv6 -j ACCEPT

# Allow HTTP and HTTPS connections from anywhere
# (the normal ports for web servers).
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

# Allow inbound traffic from established connections.
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Log what was incoming but denied (optional but useful).
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7

# Reject all other inbound.
-A INPUT -j REJECT

# Log any traffic that was sent to you
# for forwarding (optional but useful).
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7

# Reject all traffic forwarding.
-A FORWARD -j REJECT

COMMIT
Ввод правил в работу на дистрибутивах

 

На Arch Linux:

Необходимо создать два документа в директории /etc/iptables/: iptables.rules и ip6tables.rules.

Введите приведенные выше правила в документы.

С помощью таких команд запустите применение инструмента настройки фаервола:

sudo iptables-restore < /etc/iptables/iptables.rules
sudo ip6tables-restore < /etc/iptables/ip6tables.rules

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

sudo systemctl start iptables && sudo systemctl start ip6tables
sudo systemctl enable iptables && sudo systemctl enable ip6tables

Воспользуйтесь pre-network.conf для включения работы инструмента до момента подключения сервера.

На CentOS / Fedora: sudo service iptables save
sudo service ip6tables save

Вместо работы с инструментов, в этих продуктах существует утилита FirewallD для внесения настроек в работу брандмауэра.

Для CentOS 6 / Fedora 19 и ниже:

Создайте два документа /tmp/v4 и /tmp/v6. Внесите в содержимое данные для примеров, приведенные выше.

Перенесите правила из файлов:

sudo iptables-restore < /tmp/v4
sudo ip6tables-restore < /tmp/v6

Сохраните.

На Debian / Ubuntu:

Для этих дистрибутивов доступна утилита UFW.

По аналогии с Fedora создайте два файла и вставьте содержимое приведенных выше примеров.

Командой импортируйте правила для начала работы:

sudo iptables-restore < /tmp/v4sudo ip6tables-restore < /tmp/v6

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

sudo apt-get install iptables-persistent

Проверка правильности внесенных изменений

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

IPv4:


Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 REJECT all -- !lo any loopback/8 anywhere reject-with icmp-port-unreachable
0 0 ACCEPT icmp -- any any anywhere anywhere icmp destination-unreachable
0 0 ACCEPT icmp -- any any anywhere anywhere icmp echo-request
0 0 ACCEPT icmp -- any any anywhere anywhere icmp time-exceeded
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh state NEW
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:http state NEW
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:https state NEW
0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables_INPUT_denied: "
0 0 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 LOG all -- any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "iptables_FORWARD_denied: "
0 0 REJECT all -- any any anywhere anywhere reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out sourcedestination

IPv6:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all lo any anywhere anywhere
0 0 REJECT all !lo any localhost anywhere reject-with icmp6-port-unreachable
0 0 ACCEPT ipv6-icmp any any anywhere anywhere
0 0 ACCEPT tcp any any anywhere anywhere tcp dpt:http state NEW
0 0 ACCEPT tcp any any anywhere anywhere tcp dpt:https state NEW
0 0 ACCEPT all any any anywhere anywhere state RELATED,ESTABLISHED
0 0 LOG all any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "ip6tables_INPUT_denied: "
0 0 REJECT all any any anywhere anywhere reject-with icmp6-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 LOG all any any anywhere anywhere limit: avg 5/min burst 5 LOG level debug prefix "ip6tables_FORWARD_denied: "
0 0 REJECT all any any anywhere anywhere reject-with icmp6-port-unreachable

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Далее командой запустите перезагрузку:

sudo reboot

Эти команды помогут отобразить настоящие правила:

sudo iptables -vL
sudo ip6tables –vL

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

Управление правилами инструмента фаервола

Рассмотрим, как добавлять и удалять, а также вносить изменения в правила iptables. Правила работают от первого к последнему, что означает, что внесение новых правил может осуществляться только с помощью таких команд: iptables –I ip6tables –I

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

sudo iptables –L –line-numbers

Приведем пример, как можно внести новое правило в /tmp/v4, описанный выше, чтобы осуществить разрешение входящих подключений порта 8080 TCP. Добавим пример под номером 9 в соответствующую цепочку: p sudo iptables -I INPUT 9 -p tcp --dport 8080 -j ACCEPT

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

iptables –R

Приведем пример. Вы хотите сменить параметр сохранения перечня подключений, которые были заблокированы, в лог. Необходимо изменить количество подключений с пяти до трех (в минуту). Правило логирования находится под номером 11 в цепочке входящих. Команда будет следующей:

sudo iptables -R INPUT 11 -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: "--log-level 7

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

sudo iptables -D INPUT 9 Обратите внимание, что внесенные изменения начинают работать не сразу. Чтобы включить процесс, нужно ознакомиться с правилами базовой конфигурации и воспользоваться информацией оттуда. Эти шаги являются завершающими в процессе настройки усиленной безопасности ОС вашего сервера. Однако это далеко не полный список мер, которые могут защитить сервер, и в дальнейшем мы еще не раз вернемся к этой теме, чтобы привести и другие способы усиления безопасности и повышения уровня защищенности системы.

Последнее обновление: 07.12.2018