- Система централизованного управления авторизацией пользователей на FreeIPA в Docker
- Настройка сервера
- Настройка клиентов
- Выводы
- Централизованное управление конфигурациями: Puppet + Foreman. Часть І
- Автоматизируем FreeIPA: как устанавливать клиентов с помощью Ansible и управлять DNS записями через Terraform
Система централизованного управления авторизацией пользователей на FreeIPA в Docker
На волне популярности Docker на Хабре, после участия в некоторых дискуссиях в комментариях относительно Docker, и в связи с недавней необходимостью настроить централизованную авторизацию для кластера Linux машин, я решил написать небольшую заметку. Здесь будет показан яркий, на мой взгляд, пример применения Docker’a для небольшой частной задачи.
Вот так, кстати, выглядит FreeIPA WebUI (официальное демо) (кликабельно):
Какие задачи я хотел решить при помощи FreeIPA:
- Иметь возможность создавать/изменять/удалять акаунты пользователей централизовано, а не на каждом отдельном сервере
- Централизованные плавила для sudo
- В последствии мы подключим к этой системе ещё и VPN авторизацию, а потом может и другие внутриофисные сервисы
Да, скорее всего FreeIPA в нашем случае это выстрел пушкой по воробьям, но с другой стороны — альтернатив что-то не видно. Я рассматривал такие варианты: NIS (по-моему он уже давно должен отправиться на отдых), OpenLDAP +… +… (не очень дружелюбно, да и FreeIPA в итоге под собой имеет LDAP, только нам не приходится с ним иметь дело напрямую), тут перечень заканчивается, я не нашёл ничего больше.
Настройка сервера
Перечень используемых технологий:
- FreeIPA — открытый проект компании RedHat, который объединяет в себе множество других открытых проектов: 389 Directory Server, MIT Kerberos, NTP, DNS (bind), Dogtag certificate system, SSSD и другие. При этом у данного решения есть Web UI, CLI, XMLRPC, JSONRPC API и Python SDK.
- Dnsmasq — легковесный DNS сервер (позже я объясню зачем мне он нужен был в дополнение к bind, который используется в FreeIPA).
- Docker — open-source платформа, автоматизирующая развертывание приложений в легковесные, переносимые, самодостаточные контейнеры, которые могут без изменений переноситься между серверами. © Используем Docker и не волнуемся о vendor-lock
FreeIPA, в следствие того, что это продукт RedHat, естественно умеет хорошо разворачиваться на CentOS и Fedora и практически никак не разворачивается на других дистрибутивах. (прим. Я не особо задавался целью, поэтому может и есть где-то инструкции, но пакетов в Debian/Ubuntu для FreeIPA сервера нет, зато есть клиентский пакет freeipa-client , но об этом потом.)
Меня этот факт ни разу не расстроил, а, наоборот, воодушевил! Это же идеальная задача для Docker, когда на серверах Debian/Ubuntu/Gentoo/etc. То есть я мог взять базовый образ Fedora, поставить там нужные пакеты, собрать всё в кучу и запустить, НО ещё более приятной новостью для меня стал официальный Docker образ freeipa-server (есть у них и клиент, но меня интересовал вариант с клиентом на Ubuntu, поэтому я запускал ubuntu образ в Docker и таким образом моделировал и быстро начинал с начала для отладки процесса «с нуля»).
Вообще, запуск freeipa-server не вызвал никаких проблем, всё в соответствии с документацией к образу Docker’a:
- Создаём директорию, которая будет монтироваться в образ для конфигов FreeIPA, которые нужно оставлять после перезапуска (в документации предлагается использовать /var/lib/ipa-data/ , но я не люблю засорять систему, поэтому /opt/ ):
Добавим файл с опциями, которые будут использоваться при инсталяции freeipa-server:
Всё, запускаем (в доке не хватает проброса портов, хотя это и очевидно, что нужно сделать; стоит также отметить, что в доке написано, что нужно подключать раздел с постфиксом :Z:rw , но если у вас нет SELinux, вам эта опция не нужна (спасибо grossws)):
FreeIPA у себя в образе поднял целый зоопарк служб, в том числе и bind (DNS), который настроил по своему усмотрению (магия, которую практически невозможно повторить на других DNS). Для клиентов FreeIPA ожидается, что они будут иметь доступ к этому DNS, который ещё умеет как-то хитро failover обрабатывать, только вот в случае как здесь — всё в одном образе Docker я не очень вижу пользу с такого failover. Однако, я не стал идти на перекор и учёл пожелания разработчиков FreeIPA (кстати, это особенность Kerberos, всё-таки FreeIPA — просто объединяет множество пакетов).
Так вот, к чему я про DNS? Мне нужен был DNS внутри кластера, но мне категорически не хотелось влезать в bind внутри FreeIPA контейнера. Поэтому я решил воспользоваться проверенным решением — Dnsmasq. На Docker Hub есть минималистичный образ Dnsmasq, основанный на Alpine Linux — 6МБ.
Вот как я его подготовил:
- Создал директорию для конфигов:
Добавил туда конфиг dnsmasq:
Запускаем (DNS работает на 53/tcp и 53/udp портах, так что пробрасываем их, папку с конфигами):
Итого, у нас есть FreeIPA Server в одном контейнере и Dnsmasq в другом. Кстати, Dnsmasq, как можно было заметить, никак с bind DNS сервером FreeIPA ещё не взаимодействует.
Дальше я связал эти два сервиса в один docker-compose.yml :
Можно заметить небольшую магию с дополнительной опцией к команде dnsmasq, эта опция будет перенаправлять запросы к *.example.test на bind DNS, уставновленный в freeipa контейнере.
Удобство Docker Compose в данном конкретном случае в том, что его конфиг всё-таки удобнее читать, чем bash-скрипт с docker run . Да и лучше сразу делать хорошо. Сохраняем docker-compose.yml и запускаем:
C сервером, наконец, закончили.
Настройка клиентов
Тут у меня есть решение в 3 команды 🙂
- Нужно исправить /etc/hosts таким образом, чтобы первым в списке было полностью определённое имя домена (FQDN):
Настроить DNS (через /etc/network/interfaces или /etc/resolvconf/resolv.conf.d/head ) так, чтобы в /etc/resolv.conf появились следующие строки:
И теперь изменив пароль admin’a к FreeIPA в следующей команде, можете её запустить:
Здесь добавится PAM-модуль для автоматического создания домашних директорий, установится freeipa-client, запустится установка ipa-client, добавится сервис sudo в sssd.conf и перегрузятся sssd и ssh.
Вот и всё, теперь на этом хосте можно делать su/sudo/ssh, где пользователя при самом первом входе заставят сменить пароль, а при первом входе на новом хосте для пользователя будет автоматически создана домашняя директория из /etc/skel .
Выводы
Docker может упростить разворачивание сложных проектов в любой инфраструктуре. У Docker есть масса применений и это только одно из них.
В дальнейшем я, возможно, сподвигнусь написать о другом проекте, который интенсивно использует ограничения ресурсов, интегрированные в Docker (CPU, RAM).
Источник
Централизованное управление конфигурациями: Puppet + Foreman. Часть І
В этой статье будет рассмотрена установка и настройка связки Puppet + Foreman для централизованного управления конфигурациями.
Для сервера, на котором будет установлена связка Puppet + Foreman, будет использоваться виртуальная машина (1 CPU, 2 Gb RAM, 20Gb HDD), в качестве клиентов будут физические ПК на которых установлена Ubuntu. Конфигурация моего виртуального сервера с указанными выше характеристиками позволяет без проблем обслуживать 500 клиентов (можно и больше).
Установка Puppet довольно простая (все последующие команды выполняются от root):
Этими командами мы скачиваем deb пакет с сайта разработчиков puppet и устанавливаем его. Данный пакет puppetlabs-release-trusty.deb при установке создает файл /etc/apt/sources.list.d/puppetlabs.list в котором прописаны репозитории puppet, а также импортируется gpg ключ которым подписан репозиторий puppet. Сам puppetmaster мы не устанавливаем, он будет установлен автоматически при установке Foreman.
На этом установка Puppet закончена, приступим к установке веб-интерфейса Foreman:
Здесь мы добавили файл /etc/apt/sources.list.d/foreman.list в который вписали репозитории от Foreman, а также добавили ключ от данного репозитория. После добавления репозитория мы обновили список пакетов и установили foreman-installer — это пакет который позволяет установить Foreman.
Далее нам нужно настроить правильное имя компьютера. Прописываем в /etc/hosts и /etc/hostname
Перезагружаем наш сервер.
Запускаем наш установщик коммандой foreman-installer -i.
Нас спрашивают — готовы ли мы к установке, отвечаем «y», далее следует меню в котором можно выбрать дополнительные конфигурации Foreman и дополнительные модули. Мы же устанавливаем стандартную конфигурацию, поэтому выбираем пункт «Save and run» и у нас начинается установка (можно было ставить командой foreman-installer без опции -i, тогда у нас поставится базовая установка, -i подразумевает интерактивный режим).
У меня установка заняла примерно 5 минут, после установки мы видим сообщение об успешно установке, в этом сообщении находятся наши параметры доступа к Foreman.
Переходим по адресу srv.co.com и заходим в веб-интерфейс используя параметры доступа которые мы получили при установке (их желательно сохранить в файлик, а после первого входа в панель управления — поменять пароль). После входа мы видим страницу с множеством текстовой информации на английском языке, можно перейти в настройки аккаунта и сменить язык на русский. Переходим в правый верхний угол, жмем Admin User, My account, вибираем нужный нам язык и сохраняем настройки.
При последующем входе в Foreman мы получим другой интерфейс:
Здесь в списке будут отображаться наши клиенты.
Вот мы и завершили установку связки Puppet + Foreman. Давайте попробуем добавить клиента puppet и посмотреть что поменяется в веб-интерфейсе.
Для установки Puppet агентов на клиентские ПК я использую следующий скрипт:
Этот скрипт устанавливает puppet agent, настраивает автозапуск агента при старте системы, указывает адрес Puppet сервера и запускает агента. Также мы закомментируем в конфиге /etc/puppet/puppet.conf строку templatedir, если не закомеентировать — сыпятся ошибки (как фиксить без комментирования я не разобрался, хотя оно меня не раздражает).
После установки агента у нас на сервере будет запрос на подпись сертификата, если мы не подпишем данный сертификат, тогда агент не будет подключен в серверу.
Для просмотра сертификатов на сервере можно использовать комманду puppet cert —list —all:
# puppet cert —list —all
«zeppelin» (SHA256) 43:64:08:BF:DB:AF:7C:17:5B:DE:3C:CE:22:8B:40:6A:13:60:B7:F4:2C:38:B6:57:E5:FA:EA:CC:63:FB:87:EB
+ «srv.co.com» (SHA256) 04:CB:EB:CF:B2:D1:09:3C:74:00:20:A9:87:24:4B:CE:40:CC:0A:73:1D:F6:E4:24:7D:34:6E:4E:6C:17:DF:61 (alt names: «DNS:puppet», «DNS:puppet.co.com», «DNS:srv.co.com»)
Здесь мы видим что у нас 2 сертификата, один не подписан с именем zeppelin и другой подписан (+) с именем srv.co.com. Не подписаный сертификат — это сертификат от нашего новоустановленого клиента.
Для подписи сертификата можно использовать комманду puppet cert —sign $client_name. Также для подписи сертификатов мы можем использовать веб-интерфейс от Foreman, для этого нам нужно перейти в меню «Инфраструктура» — «Капсули» — «Сертификаты» и здесь можно подписать или удалить сертификат.
Жмем «Подписать», в результате при просмотре списка сертификатов в консоли у нас будет 2 подписаных сертификата:
# puppet cert —list —all
+ «srv.co.com» (SHA256) 04:CB:EB:CF:B2:D1:09:3C:74:00:20:A9:87:24:4B:CE:40:CC:0A:73:1D:F6:E4:24:7D:34:6E:4E:6C:17:DF:61 (alt names: «DNS:puppet», «DNS:puppet.co.com», «DNS:srv.co.com»)
+ «zeppelin» (SHA256) 03:C6:FF:F9:4D:10:7C:7D:6C:32:A7:E8:0C:9F:DA:FB:DD:43:B6:E5:36:79:DD:E3:04:41:D3:58:9F:6A:C4:8F
Переходим в меню «Узлы» — «Все узлы» — здесь мы видим 2 сервера (новый сервер может появиться не сразу, а через некоторое время, для того чтобы он появился сразу, нужно после подписи сертификата выполнить на клиенте команду puppet agent -t).
Поумолчанию Foreman берет манифесты из папки /etc/puppet/environments далее в записимоти от окружения. Сейчас мы добавим манифест в Foreman и попробуем применить его для одного из наших клиентов. Создаем папку mkdir -p /etc/puppet/environments/production/modules/vsftpd/manifests, в эту папку закидаем файл init.pp:
Теперь для того чтобы наш модуль с манифестом появился в Foreman нужно зайти в меню «Настройки» — «Классы Puppet» и нажать «Импорт из srv.co.com».
Отметить птичкой нужное нам окружение и нажать «Обновить».
В результате мы получим список доступных классов Puppet с указанием окружений, узлов к которым они применены и т.д.
Давайте добавим наш манифест в одному из клиентов. Для этого переходим в «Узлы» — «Все узлы», жмем на имени нужного нам узла и у нас открывается страница с детальной характеристикой узла.
Жмем кнопу «Изменить», попадаем на другую страницу с настройками указанного узла, тут жмем на вторую вкладку «Классы Puppet» и видим наш класс «vsftpd».
Выбираем наш клас (значок +), он перемещается в левую сторону с «Доступных классов» в «Включенные классы», подтверждаем изменения.
Все — наш манифест добавлен для выбраного сервера, остается подождать пока он будет применен на клиенте. Если мы не хотим ждать, можно зайти на клиент и выполнить комманду puppet agent -t, сразу после ее выполнения манифест будет применен к клиенту и на нем будет установлення vsftpd (в нашем случае).
Foreman также имеет множество дополнительного функционала, хосты можно группировать, манифесты можно применять на группы, также можно настроить автоподпись клиентских сертификатов, права на клиентские машины для разных администраторов, аудит оборудования и многое другое, о чем я расскажу в следующей статье.
Источник
Автоматизируем FreeIPA: как устанавливать клиентов с помощью Ansible и управлять DNS записями через Terraform
У нас в Altenar собралась достаточно большая и продвинутая команда разработчиков. За эти годы внутри компании накоплен разнообразный опыт в создании и развитии высоконагруженных систем. Поэтому время от времени коллегам хочется поделиться с миром своими знаниями. Регистрироваться на Хабре они пока не готовы, зато совсем не против материализовываться на моей странице. Надеюсь острой аллергии это у вас не вызывает. Если будут вопросы к материалу, смело оставляйте их в комментариях, обещаю молниеносно перенаправлять авторам статьи. Добро пожаловать за кат.
Привет, меня зовут Денис, и я около двух лет работаю DevOps инженером в компании Altenar. Наша инфраструктура располагается как в Google Cloud, так и в собственном облаке на базе VMWare, в котором находится более 200 серверов и виртуальных машин.
Когда количество Linux машин в компании достаточно велико, то рано или поздно возникает необходимость в централизованном управлении доступом к серверам и если в случае с Windows использование AD является индустриальным стандартом, то, когда дело доходит до Linux приходится использовать такие инструменты как FreeIPA.
FreeIPA (Free Identity, Policy and Audit) ─ это open-source решение для Linux (аналогичное MS Active Directory), которое обеспечивает централизованное управление учетными записями и централизованную аутентификацию.
Необходимо отметить, что у RedHat есть решение IdM, которое является частью RHEL. Они технически идентичны с FreeIPA и, можно сказать, что FreeIPA является upstream версией для IdM на которой обкатываются новые фичи (как Fedora для RHEL).
FreeIPA использует клиент-серверную модель. Клиентом может быть любая Linux машина, которая настроена для взаимодействия с FreeIPA (IdM) контроллером домена. Клиент осуществляет взаимодействие с помощью Kerberos, NTP, DNS сервисов и сертификатов.
Как настроить решение с репликацией из двух FreeIPA серверов с DNS можно почитать в этой статье, а для установки FreeIPA клиентов нам понадобится:
● Функционирующий FreeIPA контроллер с настроенным DNS сервером
● Один CentOS 7 сервер по крайней мере с 1GB памяти.
● Ansible version: 2.8+
● Terraform version: 0.13+
Конечно, можно устанавливать FreeIPA клиентов вручную. Это можно сделать в 3 шага:
1) Установить пакет yum install ipa-client
2) Запустить скрипт установки ipa-client-install
3) Пройти по шагам, ответив на вопросы установщика.
Но я уверен, что все прекрасно понимают плюсы автоматизации, поэтому мы пойдем немного другим путём. В Altenar мы используем два основных инструмента автоматизации ─ Ansible и Terraform. В данному случае мы решили использовать Ansible и взяли роль из официального репозитория freeipa.org с минимальным набором переменных в дополнение к перечисленным в /ipaclient/defaults/main.yml.
Playbook для запуска роли выглядит так:
Изначально мы также использовали ansible для создания DNS записей.
При этом возникала проблема: чтобы создать dns запись необходимо было сначала явно указать IP адрес «<
И так как мы используем в том числе Terraform в нашем частном облаке и стараемся придерживаться подхода IaC был найден terraform-provider-freeipa, который позволил нам добавлять DNS записи при создании виртуальных машин.
В результате мы получаем готовую DNS запись при создании виртуальной машины.
И ничто нам не мешает продолжить установку FreeIPA клиента с помощью Ansible роли.
Так выглядит процесс создания DNS записей и установки FreeIPA клиентов у нас в Altenar. Надеюсь, что наш опыт был вам полезен, ну а мы в свою очередь продолжим делиться лайфхаками.
Источник