====== GPO для Linux из подручных материалов====== * [[https://habr.com/ru/articles/732736/|GPO для Linux из подручных материалов]] Всем привет! Когда меня спрашивали, а есть ли аналог групповых политик Microsoft для Linux систем, долгое время просто отвечал - "Конечно, ведь есть Ansible"! Сегодня хочется подтвердить это практическим примером, использование которого помогает нам управлять множеством Linux систем в сети и за ее пределами. Еще одна причина появления этого решения заключается в том, что некая компания планировала внедрить на нашем предприятии ПО с красивым названием "Система управления конфигурациями" (представьте, как звучала аббревиатура:), но, что-то пошло не так, и после Нового года понадобилось (срочно, как обычно) все сделать самим. Поэтому было решено реализовать только тот функционал, который понадобился в первую очередь: 1. Простой способ инициализации (подключения к нашей системе управления) вводимых в эксплуатацию или уже существующих систем 2. Возможность автоматического управления системами, недоступными по сети "напрямую" (за NAT или Firewall) 3. Возможность поддержки нескольких категорий (профилей) систем 4. Возможность предварительного тестирования конфигураций, перед передачей их в "прод" IMG_1.png Эти требования привели к решению, использующему связку Git и [[https://docs.ansible.com/ansible/latest/cli/ansible-pull.html|ansible-pull]] (совершенно случайно узнал про него, и вот как пригодилось:) Коротко про ansible-pull (будем считать, что с самим ansible аудитория уже знакома, иначе [[https://habr.com/ru/companies/express42/articles/254959/|вот]]) - эта утилита загружает из Git репозитория (GitLab, Gitea, ...) копию проекта и выполняет из него плейбук с именем local.yml, либо с именем, которое совпадает с hostname системы. Остается описать в проекте все необходимые роли и "запускать" их из этих плейбуков. По поводу ролей, рассмотрим описанные в предыдущих статьях (см. ссылки): 1. [[https://habr.com/ru/articles/718632/|Подключение к домену]] 2. Настройка на использование [[https://habr.com/ru/articles/732290/|корпоративного прокси]] 3. Установка ПО и "иконки" для [[https://habr.com/ru/articles/709218/|корпоративного аналога TeamViewer]] По аналогии, можно будет добавить любые другие, в том числе, под другие дистрибутивы (в нашем случае будет Debian/Ubuntu). Итак, поехали! На компьютере разработчика (у нас будет client1) создаем каталог (в дальнейшем, для краткости, команды создания и переходов в каталоги будут опущены) для нашего проекта, например, ansible-pull-gpo (делать это будем в учетной записи root, что позволит сразу тестировать результат) client1:~# apt install ansible client1:~# mkdir ansible-pull-gpo client1:~# cd ansible-pull-gpo/ client1:~/ansible-pull-gpo# Создаем роль (назовем "kerberos"), для включения рабочей станции в домен (все, как в [[https://habr.com/ru/articles/718632/|статье по ссылке]]) client1:~/ansible-pull-gpo# nano kerberos/files/etc/krb5.conf [libdefaults] default_realm = CORP.RU client1:~/ansible-pull-gpo# nano kerberos/files/etc/pam.d/common-auth auth [success=2 default=ignore] pam_krb5.so minimum_uid=1000 auth [success=2 default=ignore] pam_unix.so nullok_secure try_first_pass auth requisite pam_deny.so auth sufficient pam_script.so auth required pam_permit.so client1:~/ansible-pull-gpo# nano kerberos/files/usr/share/libpam-script/pam_script_auth #!/bin/bash id "$PAM_USER" &>/dev/null || useradd -m -s /bin/bash "$PAM_USER" client1:~/ansible-pull-gpo# nano kerberos/tasks/main.yml - name: Install krb5-user libpam-krb5 libpam-script apt: pkg: - krb5-user - libpam-krb5 - libpam-script state: present update_cache: true - name: Copy krb5.conf common-auth copy: src: '{{item.0}}' dest: '{{item.1}}' loop: - [ 'etc/krb5.conf', '/etc/' ] - [ 'etc/pam.d/common-auth', '/etc/pam.d/' ] - name: Copy pam_script_auth copy: src: usr/share/libpam-script/pam_script_auth dest: /usr/share/libpam-script/ mode: '0755' Создаем роль, настраивающую использование [[https://habr.com/ru/articles/732290/|корпоративного прокси]] (самую простую из трех) client1:~/ansible-pull-gpo# nano proxy/files/etc/environment https_proxy=http://authproxy.corp.ru:3128 no_proxy=localhost,127.0.0.1,corp.ru client1:~/ansible-pull-gpo# nano proxy/tasks/main.yml - name: Copy environment copy: src: etc/environment dest: /etc/environment Третья роль, обещанная в [[https://habr.com/ru/articles/709218/|этой статье]], устанавливает ПО и "иконку" для корпоративного аналога TeamViewer client1:~/ansible-pull-gpo# nano help/files/usr/share/applications/help.desktop [Desktop Entry] Name=Help Name[ru_RU]=Помощь Exec=/bin/bash -c 'echo -n "Enter ID: "; read -r ID; /usr/bin/x11vnc -connect help.corp.ru:"$ID"' Terminal=true Type=Application Icon=help-browser Categories=Network client1:~/ansible-pull-gpo# nano help/tasks/main.yml - name: Install x11vnc apt: pkg=x11vnc state=present update_cache=true - name: Copy help.desktop copy: src: usr/share/applications/help.desktop dest: /usr/share/applications/ Создаем плейбук, объединяющий все эти роли и тестируем результат: client1:~/ansible-pull-gpo# nano local.yml - hosts: localhost roles: - role: kerberos - role: proxy - role: help client1:~/ansible-pull-gpo# ansible-playbook local.yml client1:~/ansible-pull-gpo# reboot После перезагрузки, должна появиться возможность подключаться любым доменным пользователем, браузер должен работать через authproxy, а в меню графической оболочки, в разделе "Интернет", должна появиться иконка "Помощь". Для доступа к этим ролям с других рабочих станций, разместим все в корпоративном GitLab, если его еще нет, см. 3-й шаг из [[https://habr.com/ru/articles/716454/|этой статьи]]. В дальнейшем, подразумевается имя GitLab сервера - gitlab.corp.ru и учетная запись владельца проекта - student Создаем публичный проект без readme с названием ansible-pull-gpo (см. 4-й шаг из [[https://habr.com/ru/articles/716454/|той же статьи]]) и выполняем внутри каталога ansible-pull-gpo команды из подсказок нового проекта, предварительно установив утилиту git: client1:~# apt install git client1:~# cd ansible-pull-gpo/ client1:~/ansible-pull-gpo# git config --global user.email "student@corp.ru" client1:~/ansible-pull-gpo# git init --initial-branch=main client1:~/ansible-pull-gpo# git remote add origin http://gitlab.corp.ru/student/ansible-pull-gpo.git client1:~/ansible-pull-gpo# git add . client1:~/ansible-pull-gpo# commit -m "Initial commit" client1:~/ansible-pull-gpo# push -u origin main Для сдачи в эксплуатацию следующей системы достаточно выполнить на ней команды (вот он - ansible-pull в действии :) client2:~# apt install git ansible client2:~# ansible-pull -U http://gitlab.corp.ru/student/ansible-pull-gpo.git client2:~# reboot Инструкцию ansible-pull можно прописать в cron, что бы обновления конфигурации загружались периодически, но еще лучше, добавить в проект файлы, облегчающие процесс ввода в эксплуатацию новых рабочих станций: Скрипт start.sh будет устанавливать необходимое ПО и прописывать ansible-pull в cron (каждые 2 часа со случайной задержкой и после перезагрузки), добавляя возможность указывать (например, тестовую) ветку проекта. Вывод команды ansible-pull будет передаваться в syslog client1:~/ansible-pull-gpo# nano start.sh #!/bin/bash apt update apt install -y git ansible echo -e "0 */2 * * * \ /usr/bin/ansible-pull -s 120 -U http://gitlab.corp.ru/student/ansible-pull-gpo.git -C $BR 2>&1 | /usr/bin/logger -t ansible-pull\n\ @reboot sleep 1m; /usr/bin/ansible-pull -U http://gitlab.corp.ru/student/ansible-pull-gpo.git -C $BR 2>&1 | /usr/bin/logger -t ansible-pull" | crontab - Проверить работу скрипта можно здесь же: client1:~/ansible-pull-gpo# BR=main bash start.sh client1:~/ansible-pull-gpo# crontab -l ... В readme.md опишем способ запуска, позволяющий инженеру просто скопировать команды из браузера сдаваемой в эксплуатацию системы (цифра 2, между projects и repository, это Project ID проекта из General Settings) client1:~/ansible-pull-gpo# nano readme.md sudo -i export BR=main; bash <(curl -s http://gitlab.corp.ru/api/v4/projects/2/repository/files/start.sh/raw?ref=$BR) После синхронизации изменений в репозитории client1:~/ansible-pull-gpo# git --no-optional-locks status | grep 'modified\|deleted\|new file\|renamed' | git commit -a -F - client1:~/ansible-pull-gpo# push -u origin main процесс подключения следующей рабочей станции выглядит как на титульном скриншоте, а именно, после базовой инсталляции системы, инженер подключается локальной учетной записью, открывает браузер, находит (через Explore в GitLab) проект ansible-pull-gpo и копирует из readme.md две команды в терминал. После перезагрузки рабочей станции можно наблюдать процесс применения конфигурации: clientN$ sudo journalctl -f Остается рассказать про профили систем. Например, домашние компьютеры сотрудников не нужно включать в домен, но иконка "Помощь/Help" для разрешения удаленного подключения инженера может очень пригодиться. Для этого опишем профиль - просто еще один плейбук, аналогичный local.yml с названием home-comp.yml (в реальности, удобнее использовать отдельный каталог для профилей) client1:~/ansible-pull-gpo# nano home-comp.yml - hosts: localhost roles: - role: help Далее, уточняем hostname компьютера сотрудника (например, petrov-home) и создаем одноименный линк на созданный плейбук (hostname должны быть уникальны, компьютерам предприятия они назначается по определенному правилу, которое исключает возможность совпадений) client1:~/ansible-pull-gpo# ln -s home-comp.yml petrov-home.yml client1:~/ansible-pull-gpo# git --no-optional-locks status | grep 'modified\|deleted\|new file\|renamed' | git commit -a -F - client1:~/ansible-pull-gpo# push -u origin main После этого сотруднику оправляется ссылка на видео инструкцию ([[https://youtu.be/Y4RzavhVwxY?t=3653|похожую на эту]]) и он самостоятельно подключает свой компьютер к нашей системе управления. В дальнейшем, можно создать в проекте новую роль, например - openvpn, добавить ее к плейбуку home-comp.yml и она будет выполнена (в течении 2-х часов или после загрузки) на всех компьютерах, hostname которых мы "прилинковали" к файлу home-comp.yml Вот такое решение "из подручных материалов". Мы его активно используем, добавляя, по необходимости, новые роли (в том числе, настройку 1С, установку офиса Р7 и прочее). Спасибо, что дочитали до конца, буду рад, если кому то пригодится и ответить на вопросы, а, так же, советам в комментариях!