Автор — Федор Потапов, Windows DevOps компании Hostkey  Любая современная телекоммуникационная компания сталкивается с необходимостью организовать удобное рабочее пространство не только для пользователей своих услуг, но и для сотрудников. В компании Hostkey часть персонала работает в офисах в России и Нидерландах, а часть — удаленно. Естественно, все работают на тех операционных системах, которые им удобны и привычны, так что и в этом вопросе нет унификации.  В компаниях с развитой инфраструктурой Microsoft эти вопросы решаются в рамках регулярного использования рабочих станций, почтового сервиса, etc. Если все работают в среде ОС семейства Linux — хорошим решением является FreeIPA. Мы тоже начинали с IPA и рассказывали о нашем опыте интеграции FreeIPA с Active Directory в одной из прошлых статей. Но Single sign‑on (SSO) как продукт используется всеми сотрудниками, только часть из которых использует ssh. В итоге веб‑сервисы и вендорное оборудование привели к появлению небольшой инфраструктуры Microsoft как довеска к IPA. SSO на первых этапах чаще всего реализовывался через LDAP, мы только‑только доросли до SAML и oAuth. Долгое время, до появления этих протоколов в системе авторизации, требовалось решать вопрос регулярной ротации паролей. Двигаясь по пути наименьшего сопротивления, мы не стали сразу накручивать сложных систем, постаравшись максимально просто с точки зрения эксплуатации и удобно с точки зрения пользователей решить эту проблему. Этим небольшим опытом мы и хотели бы поделиться, надеемся, это будет полезно для администраторов небольших или гибридных инфраструктур. Нам необходимо было реализовать процедуру регулярной смены паролей так, чтобы это отрабатывало везде и было удобно для пользователей. В нашей компании используется Python, и изначально мы использовали скрипт, созданный на этом языке программирования, но он был весьма прост и решал только одну задачу — смену пароля, а нам было необходимо также решить задачи многофакторной аутентификации. В итоге мы этот скрипт доработали. В основу нашего решения легла сборка — Web UI for changing LDAP password. В ней есть два самых важных файла: App.py — одностраничный компактный  Python-скрипт, который легко модифицировать под себя. Settings.ini.example — поддержка одновременной смены пароля в нескольких LDAP, указываются параметры LDAP-сервера. Этот инструмент позволяет менять пароль на нескольких LDAP-серверах, но есть важный нюанс, не позволяющий использовать готовое решение. В нашей инфраструктуре между серверами AD и FreeIPA (об их взаимодействии мы рассказывали в отдельной статье) отрабатывает служба Password Sync. Оказалось, что иногда Password Sync отрабатывает быстрее Python-скрипта. Из-за этого периодически возникали проблемы при смене пароля пользователями. Отметим, что мы меняем пароль только на одном LDAP-сервере, у нас это сервер AD, так как нас больше устроили базовые требования к сложности пароля (администратор должен быть ленив, и, если можно использовать готовый вариант, зачастую на нем и стоит остановиться :) ), например пароль должен содержать, кроме длины и сложности: заглавные буквы; строчные буквы; спецсимволы; цифры. Для создания пароля необходимо выполнение хотя бы трех из этих пунктов. Также у AD несколько дополнительных требований, например пароль не должен содержать логин, FreeIPA такого требования не содержит. Таким образом, с небольшой подстройкой политики FreeIPA мы пришли к конструкции, в которой если AD пароль принял, то FreeIPA его тоже примет.  Скрипт смены пароля можно посмотреть здесь. По сути, скрипт работает следующим образом: в конфигурации прописаны два LDAP-сервера, одним из которых является AD. Python в процессе своей работы читает конфигурацию, блок LDAP, первым в конфигурации идет блок без пункта type = ad, Python выполняет пункт verify_mfa, сначала ищет user_dn пользователя на сервере FreeIPA, затем отправляет его на проксирующий LDAP-сервер Multifactor. Далее в конфигурации идет блок с пунктом type = ad, Python идет на соответствующий сервер и выполняет смену пароля (change_password_ad). Если от MULTIFACTOR не придет подтверждения, Python не выполняет второй пункт. Практика показывает, что пользователь всегда забывает сменить свой пароль вовремя. Это приводит к лишней и необязательной нагрузке на администраторов, да и самим пользователям доставляет дискомфорт, что не есть хорошо. Решить эту проблему помогла система автоматических напоминаний, которые были добавлены в корпоративный мессенджер (в нашем случае — Rocket.Chat). Например: Нами был использован штатный механизм Rocket.Chat — интеграция webHook. URL формируется автоматически, а также указывается чат и от чьего имени осуществляется публикация: Затем на сервере AD отрабатывает простой скрипт: Этот скрипт помещается в AD и в планировщике задач AD указывается задача на отработку expass. В итоге мы получили удобную и простую в реализации систему по управлению паролями от учетных записей сотрудников без сложных сервисов, с двухфакторной проверкой при смене пароля и порталом самообслуживания.