ldap314ki

Как это работает
-
Подключаемся к AD по протоколу LDAP (в моём случае это MS AD и ldap) с учётными данными указанными в конфигурации
-
Выполняем поиск объектов согласно фильтру указанному в конфигурации
-
Получаем для них атрибуты "dn", "cn", "uid", "mail", "givenName", "sn", "displayName", "sAMAccountName"
-
Для каждого найденного объекта выполняем процедуру создания пользовательского сертификата и ключа
4.1 Выполняем чтение сертификата которым будет выполняться подпись
4.2 Выполняем создание пользовательского сертификата со следующими условиями
* имя файла - каталог + sAMAccountName + ".crt" || ".key"
* размер ключа - согласно конфигурационному файлу
* CommonName - из атрибута cn найденого пользователя
* Emails - из атрибута mail найденноо пользователя
* срок действия - согласно конфигурационному файлу
* OrganizationalUnit - из поля Subhect.CommonName родительского сертификата
* Organization, Country, Locality, Province, StreetAddress, PostalCode, CommonName - из соответствующих значений поля Subject родительского сертификата (Subject.Organization и т.п.)
* Использование ключа - Цифровая подпись, Шифрование ключей, Шифрование данных
* DNS-имена - из атрибута DNSNames родительского сертификата
* CA - нет
4.3 Сохраняем созданные сертификаты назначив права 400 (только чтение владельцу)
4.4 выполняем верификацию и проверку подписи пользовательского сертификата
Установка, конфигурация и запуск
-
Собранные бинарные файлы можно загрузить из раздела Releases
-
Заполнить config-файл указав данные подключения, фильтр поиска и пути до сертификатов
-
Запустить приложение
-
Ознакомиться с выводом
Параметры приложения
--config - "./config-local.yml" - путь до конфгурационного файла, если не задан - ./config.yml.
Содержимое конфигурационного файла приложения (config.yml)
debug - true || false - включает/выключает режим отладки приложения (с выключенным режимом отладки сообщения с уровнем debug не пишутся в лог)
url- "ldap://127.0.0.1:38938" - строка подключения к домену по ldap, указывается протокол (ldap, ldaps), адрес, порт.
baseDn - "dc=demo,dc=lab" - используется при подключении к домену
ldapUsername - "ldapuser" - пользователь для подключения и выполнения запросов по ldap
ldapPassword - "qwe123Q" - пароль для подключения и выполнения запросов по ldap
ldapFilter - "(objectClass=person)" - фильтр, который будет испольван для поиска пользователей, например, поиск по sAMAccountname выглядит как (sAMAccountName=adevi), поддерживаются условия и конкатенации. Итоговый запрос должен быть представлен в виде строки
caCertPath - "./ca_cert.crt" - путь до сертификата промежуточного центра сертификации на основе которого будут выпускаться пользовательские сертификаты
caKeyPath - "./ca_key.key" - путь до ключа сертификата промежуточного центра сертификации на основе которого будут выпускаться пользовательские сертификаты
caPassword - "Passw0rd" - пароль для сертификата промежуточного центра сертификации на основе которого будут выпускаться пользовательские сертификаты
certValidityDays - 30 - значение в днях (int) для действия создаваемых пользовательских сертификатов
certKeySize - 2048 - размер ключа шифрования (int) для создаваемыз пользовательских сертификатов
userCertSaveToPath - "./" - путь куда будут сохранены созданные пользовательские сертификаты. Если сам путь доступен, но, папка отсутствует - будет создана. Если папка уже создана - сертификаты будут добавлены в неё.
Полный пример содержимого config.yml
debug: true
url: "ldap://127.0.0.1:38938"
baseDn: "dc=demo,dc=lab"
ldapUsername: "ldapuser"
ldapPassword: "ldapPASSW0RD"
ldapFilter: "(objectClass=person)"
caCertPath: "./ca_cert.pem"
caKeyPath: "./ca_key.pem"
caPassword: "CApassword"
certValidityDays: 30
certKeySize: 2048
userCertSaveToPath: "./"
Установка для разработки
-
Убедитесь, что установлена подходящая версия Go - 1.25.
-
Запустите make команду для установки утилит разработки.
make setup
Make команды
См. содерржимое Makefile
Структура проекта
Компромисс как я его вижу, между задатками чистой архитектуры и удобства разработки маленького приложения.
ldap314ki/
├── cmd/
│ └── app/
│ └── main.go // Точка входа для запуска приложения
├── internal/ // Вся логика приложения
│ ├── app/ // Инициализация приложения, сигналы на завершение, чтение конфига и сам запуск
│ ├── config/ // Хранение конфигураций для всех частей проекта
│ ├── transport/ // Сетевое взаимодействие
│ │ ├── ldap/ // Взаимодействие с доменом по ldap
│ ├── certs/ // Логика генерации пользовательских сертификатов
TODO v0.2
- тесты
- читать родительский сертификат единожды если найден хотя бы 1 объект пользователя
Мне почему-то это нужно, но, нужно сделать доработки, чтобы было хорошо
Приложение это одна из частей практической (лабораторной или как там её) работы в рамках моего обучения в ВУЗе, поэтому, даже я сам не пробовал
использовать его в сценариях близким к "боевым". Если Вы видите какое-то применение этому и я могу Вам чем-то помочь у нас есть 2 пути:
A. Заведите ISSUE прямо тут в Github - я постараюсь Вам помочь и мне будет приятно, что это пригодилось кому-то ещё. Вариант с ISSUE самый удобный, вдруг, нас будет не 2, а целых 3 человека - тогда 3й увидит, что уже что-то делается.
Б. Вы не хотите заводить ISSUE и хотите понадеяться, что спам-фильтры почты пропустят сообщение - напишите мне по контактным данным указанным в моём профиле