Всем привет!
Про принципы работы Role Based Access Control (он же RBAC) слышали многие. Но реальное применение встречается довольно редко. Меня зовут Корняков Дмитрий, более 6 лет занимаюсь поддержкой инфраструктуры в команде Мир Plat.Form (НСПК). В статье расскажу про предпосылки создания, практическую реализацию и профит, который мы получили от ролевого доступа к ОС на инфраструктуре из 5000+ серверов в десятке доменов в разных ЦОД под управлением FreeIPA и Active Directory.
"Да что тут рассказывать – ещё на начальных курсах по админству про ролевую модель предоставления доступа рассказывают, и все всё знают" (с) Аноним
Когда-то мы использовали дискреционную модель выдачи прав (Discretionary Access Control, DAC). Она простая и эффективная при небольшом количестве серверов и администраторов, но имеет ряд недостатков, и самые существенные из них, напрямую влияющие на решение наших задач, ниже:
Накопление огромного количества правил;
Неочевидно, кто какие права имеет в моменте;
Администраторам систем приходится где-то хранить информацию, какие куда нужны права. Эта информация устаревает/теряется/etc;
Выход нового сотрудника/появление нового сервера может повлечь множество заявок на доступ, если с первого раза не заказали всё правильно;
Автоматизация выдачи прав при таком подходе выглядит утопией.
Например, на один сервер есть более 10 правил доступа, а серверов в информационной системе - 100. Приходит кто-то и просит выгрузить список администраторов. Проводим нехитрые подсчеты и получаем ужасающую цифру - вам придётся посмотреть 1000 правил. Да, можно что-то заскриптовать и что-то автоматизировать. Но автоматизация не решит таких вопросов, как выделение админов – ведь на сервер могут иметь права прикладные администраторы, ДБА, информационная безопасность. И у всех разные права вполне возможно, что разные они даже внутри одного подразделения.
А аудиторы могут попросить показать права из интерфейса системы, со скриншотами – представляете, если минимум сущностей, то уже выходит на 1000 скринов. Аудитору едва ли понятно, что делает скрипт, а объемы документации могут стать поводом посмотреть в сторону эффективности процессов в компании. Если вы не можете быстро и наглядно выяснить, у кого какие права — это уже звоночек.
Немного подробнее про DAC и сущности в правах
Active Directory - группа пользователей через доменную политику прилетает
на серверы в группы RDP доступа или LocalAdmin
FreeIPA – в линуксах добавляются:
Правила HBAC – каким сервисом можно войти на сервер - sshd/vsftpd/mysql/crond/etc;
Правила Sudo – какие команды под какими пользователями можно выполнять.
Дискреционная модель выдачи прав – это когда мы всегда выдаём ровно то, что просят. И выдаём, по большому счёту, не разбираясь, какие права уже есть.
Например, у нас есть команда из 3-х человек, у них есть 3 сервера. И набор правил, который описывает уровень доступа:
Появляется ещё один человек в команде, прилетает заявка на доступ, одному человеку на три сервера. Да кто разбираться будет, что там за правила есть, запилим новые!
Появляется 4-й сервер. Ну вы поняли:
А по пути можно заказать не все права, и какие-то из шагов выше могут повториться по нескольку раз. Сущности копятся лавинообразно.
Ролевая модель выдачи прав — это когда роли доступа к серверам предопределяются заранее.
Группа пользователей в таком случае выступает ролью и имеет чётко определённый набор прав. А предоставление прав — это всегда включение пользователя в предопределённую группу. И если подходящей группы нет, она создаётся совместно с функциональным администратором системы, а потом наполняется пользователями.
В таком случае каркас правил минимален и сущности не плодятся.
На примере правил FreeIPA:
Имя роли добавляется в поле “Описание” группы пользователей, для примера выше это CRM-WebDC-ПРОД_Администратор. “Человеческое” имя роли пригодится для последующего заказа в Service Desk, построения отчётов, понятного разграничения прав и т.д. Можно исходить из базового набора, например:
CRM-WebDC-ПРОД_Администратор
CRM-WebDC-ПРОД_Пользователь_БД
CRM-WebDC-ПРОД_Администратор_ИБ
И т.д.
Видно, что сущности для ролей переиспользуются, и по имени можно понять, что к чему относится:
Чтобы не скатиться обратно в дискреционную модель, нужно ввести ряд ограничений:
Одному пользователю можно назначить неограниченное количество ролей;
Один сервер может быть только в одной группе хостов, если нужно иное - оно вам не нужно, дробите группу серверов на две/три/etc;
В момент перехода на RBAC сервер удаляется из всех остальных групп доступа/правил.
Если в процессе эксплуатации системы вы понимаете, что появились люди, которым нужен доступ только на половину серверов из группы, значит вы пилите группу на две и увеличиваете гранулярность предоставления прав, создав новую роль. Также не должно возникать ситуации, когда вы даёте на сервер права и по RBAC, и дискретно.
А имея структурированные имена сущностей, их легко выгружать – раз в день любимым скриптовым языком парсите и отправляете в CMDB/WIKI/и т.д. Мы вот такую страничку сделали. Тут можно смотреть дифф с предыдущими состояниями, экспортировать и т.д.
Автоматизация с DevOPS
И вроде всё неплохо, но в процессе мы поняли, что такая история не работает со стендами разработки. Люди и серверы перемещаются между проектами, а права нужны вчера - по заявкам долго.
Да и состояние проектов у ребят описано в гите, и права назначаются через CI. Это отдельная история, подробнее можно почитать в статье тут.
Что мы сделали: примерно тот же формат именования, не всегда разделяем стенды на системы. А главное – мы дали права на предоставление ролей техучётке, которая вшита в CI.
Меняется описание проекта, добавляются пользователи – CI назначает им описанные роли.
Для этого во FreeIPA есть отличный механизм кастомных разрешений на права внутри каталога, о котором не все знают. Т.е. можно дать права ТУЗ управлять строго определённой группой пользователей. Вкладки RBAC -> Privileges, где даём нужные права на нужный DN.
Ниже пример Permission Settings “Разрешения”:
Это заняло порядочное количество времени, но мы не гнались. Для каждой системы нужно было рассказать что да как функциональным админам, выгрузить текущие права, определить на их основе роли. В итоге сейчас у нас на RBAC:
> 100 ИС, 3K серверов, 750 ролей;
Учёт всех ролей;
Особые права для команд разработки.
И всё чётко и структурировано. Теперь у нас есть набор кирпичиков, на основе которых можно развивать автоматизацию. От автоматического исполнения заявок на предоставление прав до триггерного изменения прав, например, при выходе/увольнении/переводе между подразделениями сотрудников, над чем мы сейчас и работаем.
Большая автоматизация начинается с маленьких кирпичиков, всем стабильной и прозрачной инфраструктуры!