service:ldap
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
service:ldap [27.08.2024 09:05] – [Расширение схемы] viacheslav | service:ldap [28.08.2024 08:47] (текущий) – [Расширение схемы] viacheslav | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== openldap ====== | ||
+ | OpenLDAP: https:// | ||
+ | Админка: | ||
+ | |||
+ | ===== Установка ===== | ||
+ | <code yaml> | ||
+ | --- | ||
+ | services: | ||
+ | openldap: | ||
+ | image: osixia/ | ||
+ | container_name: | ||
+ | hostname: openldap.workgroup.test | ||
+ | ports: | ||
+ | # - 389:389 | ||
+ | - 636:636 | ||
+ | volumes: | ||
+ | # - ./ | ||
+ | - ./ | ||
+ | - ./ | ||
+ | environment: | ||
+ | # LDAP_SEED_INTERNAL_SCHEMA_PATH: | ||
+ | LDAP_ORGANISATION: | ||
+ | LDAP_DOMAIN: | ||
+ | LDAP_ADMIN_USERNAME: | ||
+ | LDAP_ADMIN_PASSWORD: | ||
+ | LDAP_CONFIG_PASSWORD: | ||
+ | LDAP_BASE_DN: | ||
+ | LDAP_READONLY_USER: | ||
+ | LDAP_READONLY_USER_USERNAME: | ||
+ | LDAP_READONLY_USER_PASSWORD: | ||
+ | LDAP_TLS_VERIFY_CLIENT: | ||
+ | |||
+ | phpldapadmin: | ||
+ | image: osixia/ | ||
+ | container_name: | ||
+ | hostname: phpldapadmin | ||
+ | ports: | ||
+ | - 6443:443 | ||
+ | environment: | ||
+ | PHPLDAPADMIN_LDAP_HOSTS: | ||
+ | PHPLDAPADMIN_LDAP_CLIENT_TLS_REQCERT: | ||
+ | # PHPLDAPADMIN_HTTPS: | ||
+ | depends_on: | ||
+ | - openldap | ||
+ | |||
+ | networks: | ||
+ | default: | ||
+ | name: openldap | ||
+ | </ | ||
+ | ===== Использование ===== | ||
+ | Вход в админку по dn (distinguishedName): | ||
+ | < | ||
+ | cn=admin, | ||
+ | P@ssw0rd | ||
+ | </ | ||
+ | |||
+ | CLI | ||
+ | <code bash> | ||
+ | # Поиск с использованием read-only юзера | ||
+ | ldapsearch -x -H ldaps:// | ||
+ | uid: vpupkin | ||
+ | uid: pmokin | ||
+ | </ | ||
+ | |||
+ | Генерация паролей (slappasswd) | ||
+ | <code bash> | ||
+ | docker exec openldap slappasswd -s P@ssw0rd123 | ||
+ | {SSHA}HpBbHxfqUowX5f9VZYq1DZ0oGYnwM4X1 | ||
+ | </ | ||
+ | |||
+ | Импорт пользователей | ||
+ | |||
+ | <code powershell> | ||
+ | # Список ФИО (как пример) | ||
+ | Import-Html https:// | ||
+ | |||
+ | # Сделать ldif (pwdReset не работает: | ||
+ | $fios = (Import-Csv ' | ||
+ | |||
+ | $c = 1100 | ||
+ | $ldif = foreach ($fio in $fios) { | ||
+ | $login = Get-Login $fio | ||
+ | "dn: cn=$login, | ||
+ | uid: $login | ||
+ | cn: $login | ||
+ | givenName: $($fio -replace ' | ||
+ | sn: $($fio.Split()[0]) | ||
+ | uidNumber: $c | ||
+ | gidNumber: 500 | ||
+ | homeDirectory: | ||
+ | loginShell: / | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | userPassword: | ||
+ | #pwdReset: TRUE | ||
+ | " | ||
+ | $c++ | ||
+ | } | ||
+ | |||
+ | $ldif |Set-Clipboard | ||
+ | |||
+ | # Далее вставить в файл users.ldif в Линуксе | ||
+ | </ | ||
+ | |||
+ | Пример пользователя в файле | ||
+ | < | ||
+ | dn: cn=abramovrn, | ||
+ | uid: abramovrn | ||
+ | cn: abramovrn | ||
+ | givenName: Роман Николаевич | ||
+ | sn: Абрамов | ||
+ | uidNumber: 1100 | ||
+ | gidNumber: 500 | ||
+ | homeDirectory: | ||
+ | loginShell: / | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | userPassword: | ||
+ | #pwdReset: TRUE | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # Загрузить пользователей | ||
+ | ldapadd -x -H ldaps:// | ||
+ | |||
+ | # Удалить пользователей | ||
+ | IFS=$' | ||
+ | users=($(cat users.ldif |grep ' | ||
+ | for i in ${users[*]}; | ||
+ | ldapmodify -x -H ldaps:// | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | ===== Расширение схемы ===== | ||
+ | Схемы, атрибуты и классы, | ||
+ | [[https:// | ||
+ | |||
+ | Добавление атрибута '' | ||
+ | <code ldif> | ||
+ | attributeType ( 1.2.840.113556.1.4.221 | ||
+ | NAME ' | ||
+ | SYNTAX ' | ||
+ | SINGLE-VALUE ) | ||
+ | |||
+ | objectClass ( 1.3.6.1.4.1.4203.666.100.1 | ||
+ | NAME ' | ||
+ | SUP top | ||
+ | AUXILIARY | ||
+ | MAY (sAMAccountName) ) | ||
+ | </ | ||
+ | Положить этот файл в каталог, | ||
+ | После этого нужно остановить контейнер, | ||
+ | <code ldif> | ||
+ | # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. | ||
+ | # CRC32 646e9291 | ||
+ | dn: cn={5}samaccountname | ||
+ | objectClass: | ||
+ | cn: {5}samaccountname | ||
+ | olcAttributeTypes: | ||
+ | | ||
+ | olcObjectClasses: | ||
+ | LIARY MAY sAMAccountName ) | ||
+ | structuralObjectClass: | ||
+ | entryUUID: 2576b05c-f82a-103e-8395-5dabf1ba3ed8 | ||
+ | creatorsName: | ||
+ | createTimestamp: | ||
+ | entryCSN: 20240826190713.191090Z# | ||
+ | modifiersName: | ||
+ | modifyTimestamp: | ||
+ | </ | ||
+ | |||
+ | Другой более человекообразный вариант: | ||
+ | <code ldif> | ||
+ | dn: cn=custom, | ||
+ | objectClass: | ||
+ | cn: custom | ||
+ | olcAttributeTypes: | ||
+ | NAME ' | ||
+ | EQUALITY caseIgnoreMatch | ||
+ | SUBSTR caseIgnoreSubstringsMatch | ||
+ | SYNTAX ' | ||
+ | SINGLE-VALUE ) | ||
+ | olcObjectClasses: | ||
+ | NAME ' | ||
+ | SUP top | ||
+ | AUXILIARY | ||
+ | DESC ' | ||
+ | MAY (sAMAccountName) ) | ||
+ | </ | ||
+ | Потом скопировать его внутрь контейнера и импортировать. Работает только от рута, через админскую учётку не хватит полномочий. | ||
+ | <code bash> | ||
+ | docker cp samaccountname.ldif openldap:/ | ||
+ | docker exec -ti openldap ldapadd -Y EXTERNAL -H ldapi:/// -f / | ||
+ | </ | ||
+ | |||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | FIXME Как добавить ещё один AttributeType в тот же ObjectClass - вопрос. Вроде бы AttributeType добавляется без проблем, | ||
+ | |||
+ | Вот это добавляется, | ||
+ | <file ldif customattr.ldif> | ||
+ | |||
+ | dn: cn=extensionAttribute1, | ||
+ | objectClass: | ||
+ | cn: extensionAttribute1 | ||
+ | olcAttributeTypes: | ||
+ | DESC ' | ||
+ | SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 | ||
+ | SINGLE-VALUE ) | ||
+ | | ||
+ | </ | ||
+ | https:// | ||
+ | ===== Ошибки ===== | ||
+ | ==== Невозможно работать по LDAPS ==== | ||
+ | Ошибки типа\\ | ||
+ | The TLS connection was non-properly terminated\\ | ||
+ | Can't contact LDAP server (-1) | ||
+ | |||
+ | Решение: | ||
+ | <code bash> | ||
+ | echo ' | ||
+ | </ | ||
+ | https:// | ||
+ | ====== FreeIPA ====== | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | ===== Установка ===== | ||
+ | Настройка для cgroup версий 1 и 2 отличается, | ||
+ | <code bash> | ||
+ | # Проверка версии cgroup | ||
+ | grep cgroup / | ||
+ | nodev | ||
+ | nodev | ||
+ | </ | ||
+ | |||
+ | Если не планируется поднимать встроенный DNS, то нужно прописать IP сервера в существующем DNS, например, | ||
+ | |||
+ | Docker run | ||
+ | <code bash> | ||
+ | docker run --name freeipa-server -ti \ | ||
+ | -h ipa.workgroup.test --read-only \ | ||
+ | --cgroupns=host -v / | ||
+ | --sysctl net.ipv6.conf.all.disable_ipv6=0 \ | ||
+ | -v ~/ | ||
+ | </ | ||
+ | Docker compose (cgroups2, без DNS) | ||
+ | <code yaml> | ||
+ | --- | ||
+ | services: | ||
+ | freeipa: | ||
+ | image: freeipa/ | ||
+ | container_name: | ||
+ | restart: unless-stopped | ||
+ | ports: | ||
+ | - 123:123/udp | ||
+ | - 389:389 | ||
+ | - 443:443 | ||
+ | - 464:464 | ||
+ | - 464:464/udp | ||
+ | - 636:636 | ||
+ | - 80:80 | ||
+ | - 88:88 | ||
+ | - 88:88/udp | ||
+ | tty: true | ||
+ | stdin_open: true | ||
+ | cgroup: host | ||
+ | environment: | ||
+ | IPA_SERVER_HOSTNAME: | ||
+ | IPA_SERVER_INSTALL_OPTS: | ||
+ | PASSWORD: " | ||
+ | TZ: " | ||
+ | volumes: | ||
+ | - / | ||
+ | - / | ||
+ | - ~/ | ||
+ | sysctls: | ||
+ | - net.ipv6.conf.all.disable_ipv6=0 | ||
+ | </ | ||
+ | |||
+ | Останов и чистка данных в случае неудачной установки | ||
+ | <code bash> | ||
+ | docker rm -f freeipa-server | ||
+ | sudo rm -rf ~/ | ||
+ | </ | ||
+ | |||
+ | Результат установки | ||
+ | < | ||
+ | he IPA Master Server will be configured with: | ||
+ | Hostname: | ||
+ | IP address(es): | ||
+ | Domain name: workgroup.test | ||
+ | Realm name: | ||
+ | |||
+ | The CA will be configured with: | ||
+ | Subject DN: | ||
+ | Subject base: O=WORKGROUP.TEST | ||
+ | Chaining: | ||
+ | |||
+ | 1. You must make sure these network ports are open: | ||
+ | TCP Ports: | ||
+ | * 80, 443: HTTP/HTTPS | ||
+ | * 389, 636: LDAP/LDAPS | ||
+ | * 88, 464: kerberos | ||
+ | UDP Ports: | ||
+ | * 88, 464: kerberos | ||
+ | * 123: ntp | ||
+ | |||
+ | 2. You can now obtain a kerberos ticket using the command: 'kinit admin' | ||
+ | This ticket will allow you to use the IPA tools (e.g., ipa user-add) | ||
+ | and the web user interface. | ||
+ | 3. Kerberos requires time synchronization between clients | ||
+ | and servers for correct operation. You should consider enabling chronyd. | ||
+ | |||
+ | Be sure to back up the CA certificates stored in / | ||
+ | These files are required to create replicas. The password for these | ||
+ | files is the Directory Manager password | ||
+ | The ipa-server-install command was successful | ||
+ | </ | ||
+ | |||
+ | ===== Клиент ===== | ||
+ | <code bash> | ||
+ | # Установить клиента + kerberos | ||
+ | sudo apt install krb5-user freeipa-client -y | ||
+ | |||
+ | # Список команд с кратким описанием | ||
+ | ipa help commands | ||
+ | |||
+ | # Ввод в домен | ||
+ | sudo ipa-client-install --mkhomedir --hostname ubuntu.workgroup.test --domain workgroup.test --server=ipa.workgroup.test -p admin -w 123456Qwerty -U | ||
+ | |||
+ | # Добавить пользователя с запросом пароля (--random вместо --password - случайный пароль, | ||
+ | ipa user-add mivanova --first=Мария --last=Иванова --password --shell=/ | ||
+ | |||
+ | # Переделать всех пользователей на оболочку bash | ||
+ | for i in $(ipa user-find |grep 'User login' |cut -d: -f2); do ipa user-mod $i --shell=/ | ||
+ | |||
+ | # Поиск пользователя | ||
+ | kinit admin | ||
+ | ipa user-find vpupkin | ||
+ | -------------- | ||
+ | 1 user matched | ||
+ | -------------- | ||
+ | User login: vpupkin | ||
+ | First name: Василий | ||
+ | Last name: Пупкин | ||
+ | Home directory: / | ||
+ | Login shell: / | ||
+ | Principal name: vpupkin@WORKGROUP.TEST | ||
+ | Principal alias: vpupkin@WORKGROUP.TEST | ||
+ | Email address: vpupkin@workgroup.test | ||
+ | UID: 247200003 | ||
+ | GID: 247200003 | ||
+ | Account disabled: False | ||
+ | ---------------------------- | ||
+ | Number of entries returned 1 | ||
+ | ---------------------------- | ||
+ | |||
+ | # Поиск через LDAP | ||
+ | # Общий поиск (2 результата) | ||
+ | ldapsearch -x -D ' | ||
+ | # Более подробный результат | ||
+ | ldapsearch -x -D ' | ||
+ | # Менее подробный | ||
+ | ldapsearch -x -D ' | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== keytab ==== | ||
+ | |||
+ | <code bash> | ||
+ | # Генерация keytab, будет изменение пароля. | ||
+ | # Все ранее выгруженные кейтабы этого пользователя становятся недействительными. | ||
+ | $ ipa-getkeytab -p username -k username.keytab -P | ||
+ | New Principal Password: | ||
+ | Verify Principal Password: | ||
+ | Keytab successfully retrieved and stored in: username.keytab | ||
+ | |||
+ | # Проверка информации в кейтабе | ||
+ | $ klist -kte username.keytab | ||
+ | Keytab name: FILE: | ||
+ | KVNO Timestamp | ||
+ | ---- ------------------- ------------------------------------------------------ | ||
+ | 1 08/22/2024 11:01:03 service@WORKGROUP.TEST (aes256-cts-hmac-sha384-192) | ||
+ | 1 08/22/2024 11:01:03 service@WORKGROUP.TEST (aes128-cts-hmac-sha256-128) | ||
+ | 1 08/22/2024 11:01:03 service@WORKGROUP.TEST (aes256-cts-hmac-sha1-96) | ||
+ | 1 08/22/2024 11:01:03 service@WORKGROUP.TEST (aes128-cts-hmac-sha1-96) | ||
+ | |||
+ | # Получение kerberos-билета и проверка | ||
+ | $ kinit -kt username.keytab username | ||
+ | $ klist | ||
+ | Ticket cache: KEYRING: | ||
+ | Default principal: service@WORKGROUP.TEST | ||
+ | |||
+ | Valid starting | ||
+ | 08/22/2024 11: | ||
+ | </ | ||
+ | https:// | ||
+ | ==== Windows ==== | ||
+ | <code powershell> | ||
+ | # Установить модуль | ||
+ | Install-Module -Name Manage-FreeIPA | ||
+ | </ | ||
+ | |||
+ | ===== Ошибки ===== | ||
+ | ==== Configuring certificate server (pki-tomcatd) ==== | ||
+ | При первоначальной установке | ||
+ | < | ||
+ | Configuring certificate server (pki-tomcatd). Estimated time: 3 minutes | ||
+ | [1/30]: configuring certificate server instance | ||
+ | Failed to configure CA instance | ||
+ | See the installation logs and the following files/ | ||
+ | / | ||
+ | [error] RuntimeError: | ||
+ | CA configuration failed. | ||
+ | </ | ||
+ | Надо прописывать правильный hostname в команде запуска или в docker compose. | ||
+ | |||