Данный текст не является руководством по внедрению двухфакторной аутентификации в Linux на основе токенов / смарт-карт. Подобные (и весьма подробные) руководства вы сможете найти как на сайтах производителей токенов, так и операционных систем. Я хочу лишь перечислить возможные варианты реализации 2ФА, а заодно побудить ответственных за информационную безопасность предприятия решить проблемы, связанные с парольной аутентификацией.
Принцип двухфакторной аутентификации для пользователей операционных систем и VPN был придуман давно, однако используется (мягко говоря) далеко не повсеместно. Квалификация злоумышленников растёт (иногда вместе с мотивацией), качество инструментария для взлома растёт, а в подавляющем большинстве организаций по-прежнему используются пароли.
Сотрудников переводят на удаленную работу, и становится невозможно определить, кто именно подключается к сети организации, легальный пользователь или укравший пароль злоумышленник, но пароли живее всех живых и не собираются сдавать позиции.
В достаточно редких случаях внедряется двухфакторная аутентификация в отдельных web-приложениях. Но если аутентификация реализуется с помощью SMS, то она является аутентификацией двухэтапной. А аутентификация с использованием одноразовых паролей (OTP) хоть и может называться двухфакторной, но подвержена рискам, связанным с атаками на проверяющую сторону, поскольку схема симметричная, и проверяющая сторона владеет тем же секретом, что и пользователь. К тому же аутентификация по OTP не является стойкой к MitM атакам - в частности, возможен перехват сессии через фишинговые сайты.
И всё это, несмотря на то, что существуют надежные и безопасные специализированные устройства для 2ФА – смарт-карты и USB-токены, а все необходимые программные компоненты для 2ФА изначально входили в поставку Windows Server (нужно было установить Active Directory и Certification Services). К тому же сам процесс внедрения был многократно и подробно описан, например, здесь.
Но жизнь не стоит на месте, и пришла пора массовой (хоть и не повсеместной) миграции на Linux (в основном российского производства). Поэтому давайте поговорим о том, как реализуется двухфакторная аутентификация в Linux.
Для начала вспомним теорию 2ФА.
Для двухфакторной аутентификации используется фактор владения – аппаратное устройство, которое всегда находится у пользователя, и фактор знания – некий пароль или секрет, который знает только пользователь.
Для надежной и безопасной двухфакторной аутентификации в качестве фактора владения используется USB-токен или смарт-карта (например, линейки Рутокен ЭЦП), а в качестве фактора знания – PIN-код, открывающий доступ к защищенной памяти токена.
Для пользователя двухфакторная аутентификация выглядит следующим образом. Он подключает свой Рутокен к ПК и вводит PIN-код в единственное поле в форме аутентификации. Если PIN-код правильный, а токен был предварительно зарегистрирован в домене / на ПК, то будет выполнен вход в ОС, и можно будет работать. После многократной попытки ввода неверного PIN-кода память токена будет заблокирована, и потребуется вмешательство администратора.
(В данном случае я специально не уточняю, что понимается под «регистрацией токена», дальше разберем более подробно).
Таким образом, при краже или утере токена, злоумышленник не сможет им воспользоваться без знания PIN-кода. А если перед кражей токена PIN-код был подсмотрен, то легальный пользователь быстро заметит отсутствие своего идентификатора, сообщит администратору, и доступ с помощью ключей или паролей, находящихся на данном токене, будет заблокирован.
Существует два основных механизма реализации двухфакторной аутентификации с помощью токенов / смарт-карт. Давайте их рассмотрим (разумеется, в сильно упрощенном виде).
1. С помощью ассиметричной криптографии
Для каждого пользователя заранее создается пара ключей (открытый и закрытый ключ), а также выпускается сертификат открытого ключа.
Закрытый ключ должен быть неизвлекаемым, то есть генерироваться с помощью процессора токена и храниться только в памяти токена без возможности извлечения и экспорта. Так мы сможем гарантировать, что аппаратный фактор аутентификации будет для каждого пользователя присутствовать строго в одном экземпляре.
Следовательно, для такого механизма аутентификации могут применяться только активные ключевые носители, то есть токены либо смарт-карты, оснащенные процессором с реализацией криптографических функций (например, Рутокен ЭЦП 3.0).
Для создания сертификатов открытого ключа может использоваться самоподписанный сертификат удостоверяющего центра организации, а также соответствующее программное обеспечение. Это может быть как полноценный удостоверяющий центр со списками действующих и отозванных сертификатов, так и относительно простая программа, предназначенная только для формирования сертификата. Для отдельных ПК можно использовать и самоподписанный сертификат пользователя.
Если очень упрощенно, то сам процесс аутентификации выглядит следующим образом. Перед началом работы пользователь подключает токен к ПК и вводит PIN-код токена. Если PIN-код верный, то разблокируется защищенная память токена, в которой хранится закрытый ключ.
Сервер генерирует некую случайную числовую последовательность, клиент её подписывает с помощью закрытого ключа на токене, подпись отправляется на сервер. Сервер проверяет подпись с помощью открытого ключа, хранящегося в соответствующем сертификате. Если подпись верна, то аутентификация считается выполненной.
2. С хранением пароля на USB-токене / смарт-карте
Этот способ намного проще в реализации, поскольку не требует в организации удостоверяющего центра для выдачи сертификатов.
При настройке генерируется длинный и сложный пароль, который устанавливается для конкретного пользователя и сохраняется в защищенной памяти токена.
Перед началом работы пользователь подключает токен к ПК. Операционная система предлагает ввести PIN-код токена. Если PIN-код верный, то разблокируется защищенная память токена, и ОС считывает оттуда пароль. Далее ОС сравнивает его с хранящимся в базе паролей, и, если сравнение удачное - аутентификация считается выполненной.
Поскольку использование собственного процессора токена в данном случае не требуется, то для реализации данного варианта аутентификации могут применяться как активные (например, обладающие собственным процессором для вычисления ЭП), так и пассивные (скажем, Рутокен Lite, не оснащенные процессором) ключевые носители.
К сожалению, вследствие применения симметричной парольной схемы, данный способ подвержен угрозам характерным для симметричных схем. Фактически это «костыль», который позволяет не запоминать длинные сложные пароли, и только.
А теперь давайте поговорим о том, как эти механизмы 2ФА работают в современных ОС Linux.
В Linux аутентификация (не только двухфакторная) реализуется с помощью различных библиотек PAM или Pluggable Authentication Modules, компонентов, предоставляющих программный интерфейс для аутентификации пользователей. Эти библиотеки PAM через API взаимодействуют с такими компонентами ОС, как login или su для выполнения стандартных задач по аутентификации.
Замечательной особенностью PAM является то, что системный администратор может выбирать, какие конкретно модули будут использоваться для аутентификации пользователей с помощью конфигурационного файла Linux-PAM /etc/pam.conf. В одной библиотеке PAM будет реализована очень простая однофакторная аутентификация с помощью паролей, хранящихся в файле /etc/passwd; в другой библиотеке, в качестве второго фактора используются одноразовые пароли с аппаратным генератором OTP; в третьей для 2ФА необходим криптографический токен или смарт-карта. Можно выбирать согласно вкусам администратора и ИБ-политике организации.
Нас интересует именно третий вариант (точнее, целый набор вариантов). Осталось рассказать, что необходимо для внедрения 2ФА (кроме, собственно, токенов), и как это внедрение происходит. Сам процесс поиска необходимого PAM, выбор из вариантов реализации и установку PAM в операционную систему я опускаю. Этот процесс замечательно описан в руководствах по операционным системам.
Вариант 1: Хранение пароля в защищенной памяти токена.
Перед началом работы необходимо выполнить настройку каждого ПК с ОС Linux для каждого конкретного пользователя. У пользователя есть персональный токен (активный или пассивный ключевой носитель). Токен подключается к ПК, доступ к его памяти разблокируется путем ввода PIN-кода. В результате настройки PAM (или генератор случайных чисел токена) генерирует сложный пароль, устанавливает этот пароль для пользователя и записывает его на токен. Процесс последующей аутентификации я уже описывал. Одни реализации PAM требуют выполнять настройку с физическим доступом к ПК, другие - предоставляют интерфейс для централизованного управления.
Вариант 2: Использование ключевых пар (открытого и закрытого ключей).
Напомню, что в этом случае используются только активные ключевые носители (Рутокен ЭЦП). На каждом токене создается ключевая пара (открытый и закрытый ключи). На основе открытого ключа Удостоверяющий центр организации выписывает сертификат открытого ключа. Закрытый ключ и сертификат используются для аутентификации, то есть для проверки того, что к ПК подключен токен конкретного пользователя, и этот пользователь знает PIN-код данного токена.
Для реализации данного варианта 2ФА существует достаточно много Linux PAM, которые отличаются друг от друга как местом хранения сертификатов, так и поддерживаемыми протоколами шифрования.
Итак, двухфакторная аутентификация в Linux может производиться:
Локально на компьютере пользователя. В этом случае необходимо создать ключи, выписать сертификат (например, с помощью openssl) и поместить сертификат в локальное хранилище доверенных сертификатов на конкретном ПК с ОС Linux. Подробно этот процесс описан здесь.
С помощью контроллера домена Active Directory. Да, такой комбинированный вариант вполне возможен на переходный период миграции (который может затянуться очень надолго). В этом случае для аутентификации используются данные пользователей в AD, а для создания и управления сертификатами применяется Microsoft Certification Serivice. А вот и инструкция.
С помощью контроллера домена Kerberos. Создание и управление сертификатами осуществляется с помощью той же самой openssl. Вот как настраивается 2ФА с помощью международных алгоритмов. Если же необходимо использование российских алгоритмов ГОСТ, то об этом мой коллега написал хорошую статью.
С помощью контроллера домена FreeIPA. На мой взгляд – самый лучший вариант, поскольку реализует централизованное управление пользователями и сертификатами. Делать надо вот что.
Многие разработчики дистрибутивов Linux (включая российских) создают собственные решения для двухфакторной аутентификации (обычно включающие в себя FreeIPA в качестве контроллера домена, DogTag в качестве центра сертификации и Ansible для централизованного применения политик).
Так что, как видите, внедрение двухфакторной аутентификации в Linux – дело не только нужное и важное, но и не такое сложное, как многим кажется.