Как стать автором
Обновить
73.98
Слёрм
Учебный центр для тех, кто работает в IT

Безопасность в Linux

Время на прочтение8 мин
Количество просмотров35K

В новой статье говорим про безопасность в Linux: как настроить и что важно учитывать в процессе. Дополнительно разбираем PAM и модули аутентификации, рассматриваем iptables. 

За основу взят один из уроков нашего практического курса «Администрирование Linux Мега».

PAM: модули, флаги, sudoers

PAM — модульная система аутентификации пользователя. Программы могут попросить её произвести аутентификацию пользователя любым доступным методом и абстрагироваться от самого процесса. PAM сделает всё самостоятельно и отдаст результат программе. 

PAM используется везде, где требуется аутентификация пользователя или проверка его прав. Например, при подключении через SSH или FTP, а также при повышении привилегий через команду sudo. 

Модули PAM находятся в директории lib/security для старых операционных систем типа CentOS и в директории /usr/lib/x86_64-linux-gnu/security для современных ОС вроде последних релизов Ubuntu. 

Конфигурационные файлы PAM — в директории /etc/pam.d. 

Конфиги модулей — в директории /etc/security.

Типы модулей:

  • auth — аутентификация пользователя. Проверяют, точно ли пользователь является тем, за кого себя выдает.

  • account — проверка возможности доступа к серверу. Уточняют, может ли пользователь в данный момент получить доступ к сервису или службе. 

  • password — обновление механизма аутентификации. Отвечают за обновление пароля пользователя.

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

Помимо модулей есть флаги контроля:

  • Required — указанный модуль должен успешно отработать. Остальные модули будут запущены при неудаче, исполнение продолжится по конфигу.

  • Requisite — указанный модуль должен успешно отработать. Остальные модули не будут запущены при неудаче, исполнение конфига тут же прекратится.

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

  • Optional — результат модуля не имеет значения, если этот модуль единственный.

  • Include — подключить содержимое другого конфига PAM. 

Ещё есть sudoers — конфигурационные файлы, в которых описано, каким пользователям разрешено повышать свои привилегии при помощи команды sudo. В Linux-системах обычно действует правило, которое разрешает всем участникам группы voCentOS или sudo в Ubuntu повышать свои привилегии для любых действий. 

Основный конфигурационный файл sudoers находится по пути /etc/sudoers, а дополнительные конфиги в /etc/sudoers.d/. Для редактирования правила sudo лучше использовать команду visudo. Она автоматически проверяет синтаксис, и, если там есть ошибки, тут же сообщает о них. 

Меры защиты SSH-сервера

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

  • Перевести с SSH на нестандартный порт — самая простая, но в то же время самая слабая мера защиты. Злоумышленник может просканировать ваш сервер на предмет открытых портов и выяснить, какой из них слушает SSH. С её помощью вы можете избавиться от бесконечного брутфорса, который преследует на стандартном 22-м порту.

  • Запретить вход под пользователем root параметром PermitRootLogin. Мера эффективна в сочетании с хорошо настроенной конфигурацией sudoers и SELinux, где у пользователей и их процессов нет доступа к опасным командам. Даже при входе злоумышленника на сервер он не сможет серьёзно навредить системе, так как это невозможно без root-прав.

  • Запретить вход по паролю параметром Password/Authentication в config-е SSH-сервера. Данная мера спасает от брутфорса и утечки паролей пользователей. Если приватный ключ зашифрован паролем, взломать его практически невозможно, даже если код сольют.

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

К сожалению, ни один из перечисленных серверов не даёт 100% гарантии защиты — почти везде есть уязвимости. Чтобы максимально обезопасить себя, рекомендуется применять все четыре способа. В сумме эти меры добавляют вашей системе очков прочности при взломе.

От теории к практике

Перейдём в терминал на Ubuntu и попробуем настроить двухфакторную аутентификацию через Google Authenticator. Для начала установим пакет apt install libpam-google-authenticator:

root@vm:/home/zaqwer# apt install libpam-google-authenticator

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

1. Хотите ли вы, чтобы аутентификация была основана на текущем времени? Ответ: да.

На экране отобразится QR-код — отсканируйте его через Google Authenticator на телефоне. В приложении добавится новый аккаунт и сгенерируется одноразовый пароль. В терминале появятся одноразовые emergency-коды на случай, если вы потеряете доступ к мобильному устройству. 

2. Хотите ли вы создать файл с конфигом Google Authenticator для текущего пользователя. Ответ: да. Создастся файл /root/.google.authenticator. 

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

4. Хотите ли вы повысить количество принимаемых кодов до 17? Например, у вас будут храниться 8 предыдущих кодов, один текущий и ещё 8 будущих. Это не самая лучшая ситуация, поскольку у злоумышленника появляется огромный запас времени, чтобы завладеть кодом. Ответ: нет.

5. Хотите ли вы включить rate-limiting? Ответ: да. Это спасёт вас от брутфорса двухфакторной аутентификации. 

Вы ответили на все вопросы, теперь займёмся SSH-сервером — сделаем так, чтобы он работал через Google Authenticator. Откройте файл /etc/pam.d/sshd для настройки PAM-модулей:

root@vm:/home/zaqwer# vim /etc/pam.d/sshd 

Здесь уже есть какие-то настройки по умолчанию:

В конце файла допишите две строки. В первой тип модуля — auth required, имя модуля — pam_google_authenticator.so и параметр — nullok. Во второй тип модуля — auth required и модуль — pam_permit.so.

Затем перейдите в конфиг SSH-сервера:

root@vm:/home/zaqwer# vim /etc/ssh/sshd_config

И включите параметр ChallengeResponseAuthenticaton в yes (это нужно, чтобы у нас запросили одноразовый пароль):

Сохраните изменения и перезапустите SSH-сервер:

root@vm:/home/zaqwer# systemctl restart sshd

Теперь попробуем подключиться к серверу. Посмотрим на IP-адрес:

root@vm:/home/zaqwer# ip a
[zaqwer@archlinux~]$ ssh root@192.169.0.236

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

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

root@vm:/home/zaqwer# vim /etc/ssh/sshd_config

Добавляем метод AuthenticatonMethods и пишем в нём publickey, password publickey и keyboard-interactive:

Сохраняем изменения и выходим. У нас отвалилась аутентификация по ключу — теперь каждый будет запрашиваться пароль, даже если у нас есть SSH-ключ. Чтобы у нас не спрашивали пароль, если есть SSH-ключ, нужно ввести команду:

root@vm:/home/zaqwer# vim /etc/pam.d/sshd

И закомментировать строчку: 

Это позволит отключить стандартную unix-аутентификацию при доступе через SSH. Аутентификация будет происходит только средствами SSH-сервера, то есть при помощи ключа.

Перезапускаем SSH-сервер ещё раз, подключаемся обратно, и у нас запрашивают одноразовый пароль:

Вводим пароль одноразовый, но нас по какой-то причине не пускают. Чтобы разобраться, в чём проблема, идём в /var/log/auth.log — сюда пишутся данные об аутентификации. Видим, что PAM получил пустой пароль:

Идём в конфиг SSH-сервера:

root@vm:/home/zaqwer# vim /etc/ssh/sshd_config

И видим, что PermitRootLogin отключен:

Пишем PermitRootLogin yes, снова перезапускаем наш SSH-сервер и пробуем подключиться заново. Мы попадаем в систему по одноразовому паролю — отлично, всё работает.

Зададим пароль для root и попробуем раскомментировать строчку в PAM d, которую мы закомментировали, чтобы включить стандартную аутентификацию через средства unix:

root@vm:~# passwd
New password
Retype new password
passwd: password updated successfully

Снова перезапустим sshd, разлогинимся и попробуем подключиться. Теперь у нас спрашивают пароль:

Посмотрим в лог аутентификации:

root@vm:/home/zaqwer# tail -f /var/log/auth.log 

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

И если мы посмотрим в log аутентификации, то увидим, что всё в порядке: мы вошли по паролю.

Iptables: что это и как работает

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

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

Что важно помнить про iptables:

  • ограничивает доступ на уровне сети;

  • конфигурация состоит из цепочек правил;

  • управляется командой iptables.

Перейдём в терминал и узнаем, как iptables работает. 

Посмотреть все текущие правила мы можем командой iptables-save:

root@vm:/home/zaqwer# iptables-save

Мы видим дефолтные цепочки, но не видим никаких правил:

Ещё один вариант, как посмотреть правила с их номерами строк и дополнительной информацией:

root@vm:/home/zaqwer# iptables --line-numbers -L -v -n

Сейчас нет правил ни в одной из цепочек, поэтому все поля пустые:

Начнём с добавления правила, которое будет разрешать все локальные подключения через интерфейс lo:

root@vm:/home/zaqwer# iptables -A INPUT -I lo -j ACCEPT
  • -A — чтобы добавить правила в конец цепочки;

  • INPUT — цепочка, в которую добавляем. 

  • -i — чтобы указать интерфейс lo;

  • -j — чтобы указать, что дальше делать с трафиком;

  • ACCEPT — принимаем все подключения по локальной сети.

Запускаем и смотрим в правила:

Теперь разрешим icmp-пакеты, которые отправляются командой ping: 

root@vm:/home/zaqwer# iptables -A INPUT -p icmp -j ACCEPT

Смотрим правила: теперь их два, как мы и хотели:

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

root@vm:/home/zaqwer# iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT
  • -m — ключ, который определяет критерий, по которому мы идентифицируем пакеты;

  • сonntrack — этот самый критерий и подсистема ядра, которая отслеживает состояние сетевых соединений;

  • --ctstate — ключ, указывающий состояние соединений;

  • RELATED и ESTABLISHED — типы соединений. 

Теперь откроем порты, начнём с SH:

root@vm:/home/zaqwer# iptables -A INPUT -m tcp -p tcp --dport 22 -j ACCEPT
  • --dport — ключ для указаний порта;

  • 22 — порт, на котором работаем SH, поэтому я указываю 22 и –j ACCEPT.

Мы разрешили всё, что нужно. Теперь давайте запретим всё, что мы не разрешили:

root@vm:/home/zaqwer# iptables -A INPUT -p tcp -j REJECT

tcp — пакеты, которые мы ключом -j отправляем в цепочку REJECT. 

Точно так же запретим протокол utp:

root@vm:/home/zaqwer# iptables -A INPUT -p utp -j REJECT

Проверим наш список правил:

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

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

  • меняем ключ -A, на ключ -I;

  • пишем цепочку и номер строки — INPUT 5;

  • указываем порт — 80;

  • добавляем ключ -s, если хотим разрешить порт только тем, кто пришёл из локальной сети;

  • указываем сеть, с которой будем принимать, — 192.168.0.0/24.

root@vm:/home/zaqwer# iptables -I INPUT 5 -m tcp --dport 80 -s 192.168.0.0/24 -j ACCEPT

Теперь пятое правило — это уже разрешение 80-го порта для нашей локальной сети.

Если понадобится удалить какое-то правило, воспользуйтесь командой iptables -D:

root@vm:/home/zaqwer# iptables -D INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

На этом всё: мы обсудили, что модульная система аутентификации пользователя и где она используется, разобрали меры защиты SSH-сервера, а также рассказали об основных принципах работы iptables.

Aдминистрирование Linux Mega

Курс «Aдминистрирование Linux Mega» системного инженера Платона Платонова поможет разобраться не только во всех «фишках» контроля прав, но повысить владение Linux до уровня «бог» за 5 недель. Это самая хардовая и самая «прикладная» программа в духе Слерм + Southbridge: 12 часов теории, 48 часов практики на стендах, 9 масштабных тем и несчитанное количество реальных кейсов. 

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

Принять вызов ⬅️

Теги:
Хабы:
Всего голосов 23: ↑13 и ↓10+4
Комментарии19

Публикации

Информация

Сайт
slurm.io
Дата регистрации
Дата основания
Численность
51–100 человек
Местоположение
Россия
Представитель
Антон Скобин