Инструменты пользователя

Инструменты сайта


service:ldap

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
service:ldap [26.08.2024 19:53] – [Расширение схемы] viacheslavservice:ldap [28.08.2024 08:47] (текущий) – [Расширение схемы] viacheslav
Строка 1: Строка 1:
 +====== openldap ======
 +OpenLDAP: https://github.com/osixia/docker-openldap\\
 +Админка: https://github.com/osixia/docker-phpLDAPadmin\\
 +
 +===== Установка =====
 +<code yaml>
 +---
 +services:
 +  openldap:
 +    image: osixia/openldap
 +    container_name: openldap
 +    hostname: openldap.workgroup.test
 +    ports:
 +#      - 389:389
 +      - 636:636
 +    volumes:
 +#      - ./data/schema:/tmp/schema # Для расширения схемы
 +      - ./data/ldap:/var/lib/ldap
 +      - ./data/slapd:/etc/ldap/slapd.d
 +    environment:
 +#      LDAP_SEED_INTERNAL_SCHEMA_PATH: "/tmp/schema" # Для расширения схемы
 +      LDAP_ORGANISATION: "Test LDAP"
 +      LDAP_DOMAIN: "workgroup.test"
 +      LDAP_ADMIN_USERNAME: "admin"
 +      LDAP_ADMIN_PASSWORD: "123456Qwerty"
 +      LDAP_CONFIG_PASSWORD: "123456Config"
 +      LDAP_BASE_DN: "dc=workgroup,dc=test"
 +      LDAP_READONLY_USER: "true"
 +      LDAP_READONLY_USER_USERNAME: "ro_user"
 +      LDAP_READONLY_USER_PASSWORD: "ro_pass"
 +      LDAP_TLS_VERIFY_CLIENT: "try" # Prevent client TLS errors
 +
 +  phpldapadmin:
 +    image: osixia/phpldapadmin
 +    container_name: phpldapadmin
 +    hostname: phpldapadmin
 +    ports:
 +      - 6443:443
 +    environment:
 +      PHPLDAPADMIN_LDAP_HOSTS: "openldap"
 +      PHPLDAPADMIN_LDAP_CLIENT_TLS_REQCERT: "never" # Prevent client TLS errors
 +#      PHPLDAPADMIN_HTTPS: "false"
 +    depends_on:
 +      - openldap
 +
 +networks:
 +  default:
 +    name: openldap
 +</code>
 +===== Использование =====
 +Вход в админку по dn (distinguishedName):\\
 +<code>
 +cn=admin,dc=workgroup,dc=test
 +P@ssw0rd
 +</code>
 +
 +CLI
 +<code bash>
 +# Поиск с использованием read-only юзера
 +ldapsearch -x -H ldaps://openldap.workgroup.test -d "dc=workgroup,dc=test" -D "cn=ro_user,dc=workgroup,dc=test" -w ro_pass |grep uid:
 +uid: vpupkin
 +uid: pmokin
 +</code>
 +
 +Генерация паролей (slappasswd)
 +<code bash>
 +docker exec openldap slappasswd -s P@ssw0rd123
 +{SSHA}HpBbHxfqUowX5f9VZYq1DZ0oGYnwM4X1
 +</code>
 +
 +Импорт пользователей
 +
 +<code powershell>
 +# Список ФИО (как пример)
 +Import-Html https://www.hse.ru/science/scifund/bonus2012-1 # сохранить в CSV
 +
 +# Сделать ldif (pwdReset не работает: attribute type undefined)
 +$fios = (Import-Csv 'C:\temp\Список ФИО.csv' -Delimiter ';').p2
 +
 +$c = 1100
 +$ldif = foreach ($fio in $fios) {
 +$login = Get-Login $fio
 +"dn: cn=$login,cn=users,dc=workgroup,dc=test
 +uid: $login
 +cn: $login
 +givenName: $($fio -replace '^\w+\s')
 +sn: $($fio.Split()[0])
 +uidNumber: $c
 +gidNumber: 500
 +homeDirectory: /home/users/$login
 +loginShell: /usr/bin/bash
 +objectClass: inetOrgPerson
 +objectClass: posixAccount
 +objectClass: top
 +userPassword: {SSHA}hgNEx6EhrM7LD4uXRGMsfNFyKctjz+rd
 +#pwdReset: TRUE
 +"
 +$c++
 +}
 +
 +$ldif |Set-Clipboard
 +
 +# Далее вставить в файл users.ldif в Линуксе
 +</code>
 +
 +Пример пользователя в файле
 +<code>
 +dn: cn=abramovrn,cn=users,dc=workgroup,dc=test
 +uid: abramovrn
 +cn: abramovrn
 +givenName: Роман Николаевич
 +sn: Абрамов
 +uidNumber: 1100
 +gidNumber: 500
 +homeDirectory: /home/users/abramovrn
 +loginShell: /usr/bin/bash
 +objectClass: inetOrgPerson
 +objectClass: posixAccount
 +objectClass: top
 +userPassword: {SSHA}hgNEx6EhrM7LD4uXRGMsfNFyKctjz+rd
 +#pwdReset: TRUE
 +</code>
 +
 +<code bash>
 +# Загрузить пользователей
 +ldapadd -x -H ldaps://openldap.workgroup.test -D "cn=admin,dc=workgroup,dc=test" -w 123456Qwerty -f users.ldif
 +
 +# Удалить пользователей
 +IFS=$'\n'
 +users=($(cat users.ldif |grep 'dn:'))
 +for i in ${users[*]}; do echo -e "$i\nchangeType: delete\n"; done > usersdel.ldif
 +ldapmodify -x -H ldaps://openldap.workgroup.test -D "cn=admin,dc=workgroup,dc=test" -w 123456Qwerty -f usersdel.ldif
 +</code>
 +https://simp.readthedocs.io/en/latest/user_guide/User_Management/LDAP/OpenLDAP/manage_users.html\\
 +https://tylersguides.com/guides/openldap-how-to-add-a-user/\\
 +
 +===== Расширение схемы =====
 +Схемы, атрибуты и классы, справка: https://www.zytrax.com/books/ldap/ch3/\\
 +[[https://pro-ldap.ru/tr/zytrax/ch6/slapd-config.html#use-schemas|6.1.1.4.2 Добавление/удаление наборов схемы данных в OLC (cn=config)]]
 +
 +Добавление атрибута ''sAMAccountName''. Создаётся файл с расширением ''.schema'', например, ''samaccountname.schema''
 +<code ldif>
 +attributeType ( 1.2.840.113556.1.4.221
 +    NAME 'sAMAccountName'
 +    SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
 +    SINGLE-VALUE )
 +
 +objectClass ( 1.3.6.1.4.1.4203.666.100.1
 +    NAME 'custom'
 +    SUP top
 +    AUXILIARY
 +    MAY (sAMAccountName) )
 +</code>
 +Положить этот файл в каталог, монтирующийся в контейнер и указанный в ''LDAP_SEED_INTERNAL_SCHEMA_PATH''. После запуска контейнера он будет импортирован.
 +После этого нужно остановить контейнер, закомментировать смонтированный каталог и переменную и запустить контейнер заново. ldif-файл после импорта находится в ''data/slapd/cn=config/cn=schema''.
 +<code ldif>
 +# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
 +# CRC32 646e9291
 +dn: cn={5}samaccountname
 +objectClass: olcSchemaConfig
 +cn: {5}samaccountname
 +olcAttributeTypes: {0}( 1.2.840.113556.1.4.221 NAME 'sAMAccountName' SYNTAX
 + 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
 +olcObjectClasses: {0}( 1.3.6.1.4.1.4203.666.100.1 NAME 'custom' SUP top AUXI
 + LIARY MAY sAMAccountName )
 +structuralObjectClass: olcSchemaConfig
 +entryUUID: 2576b05c-f82a-103e-8395-5dabf1ba3ed8
 +creatorsName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
 +createTimestamp: 20240826190713Z
 +entryCSN: 20240826190713.191090Z#000000#000#000000
 +modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
 +modifyTimestamp: 20240826190713Z
 +</code>
 +
 +Другой более человекообразный вариант: сделать сразу файл ldif
 +<code ldif>
 +dn: cn=custom,cn=schema,cn=config
 +objectClass: olcSchemaConfig
 +cn: custom
 +olcAttributeTypes: ( 1.2.840.113556.1.4.221
 +    NAME 'sAMAccountName'
 +    EQUALITY caseIgnoreMatch
 +    SUBSTR caseIgnoreSubstringsMatch
 +    SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
 +    SINGLE-VALUE )
 +olcObjectClasses: ( 1.3.6.1.4.1.4203.666.100.1
 +    NAME 'custom'
 +    SUP top
 +    AUXILIARY
 +    DESC 'Custom attributes class'
 +    MAY (sAMAccountName) )
 +</code>
 +Потом скопировать его внутрь контейнера и импортировать. Работает только от рута, через админскую учётку не хватит полномочий.
 +<code bash>
 +docker cp samaccountname.ldif openldap:/tmp
 +docker exec -ti openldap ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/samaccountname.ldif
 +</code>
 +
 +https://www.opennet.ru/docs/RUS/ldap_apacheds/ch6/slapd-config.html#use-schemas\\
 +https://stackoverflow.com/questions/45725124/openldap-samaccountname-as-custom-attribute\\
 +
 +FIXME Как добавить ещё один AttributeType в тот же ObjectClass - вопрос. Вроде бы AttributeType добавляется без проблем, но потом надо модифицировать ObjectClass так, чтобы он включал в себя этот атрибут. В чудесном мире LDAP это вроде бы делается удалением и повторным добавлением ObjectClass.
 +
 +Вот это добавляется, теперь надо включить его в ранее добавленный objectClass "custom".
 +<file ldif customattr.ldif>
 +
 +dn: cn=extensionAttribute1,cn=schema,cn=config
 +objectClass: olcSchemaConfig
 +cn: extensionAttribute1
 +olcAttributeTypes: ( 1.2.840.113556.1.2.423 NAME 'extensionAttribute1'
 +        DESC 'extensionAttribute1'
 +        SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
 +        SINGLE-VALUE )
 +        
 +</file>
 +https://www.ibm.com/support/pages/adding-custom-attribute-inetorgperson-objectclass-may-attribute\\
 +===== Ошибки =====
 +==== Невозможно работать по LDAPS ====
 +Ошибки типа\\
 +The TLS connection was non-properly terminated\\
 +Can't contact LDAP server (-1)
 +
 +Решение:
 +<code bash>
 +echo 'TLS_REQCERT never' |sudo tee --append /etc/ldap/ldap.conf
 +</code>
 +https://convincingbits.wordpress.com/2016/01/27/ldapsearch-using-tls-and-self-signed-server-certificates/
 +====== FreeIPA ======
 +https://github.com/freeipa/freeipa-container/blob/master/README\\
 +https://github.com/freeipa/freeipa-container#running-freeipa-server-container\\
 +https://hub.docker.com/r/freeipa/freeipa-server/\\
 +https://www.altlinux.org/FreeIPA/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0_FreeIPA\\
 +https://docs.altlinux.org/ru-RU/domain/10.2/html/freeipa/ch01s08.html\\
 +https://freeipa.readthedocs.io/en/latest/workshop/1-server-install.html
 +
 +===== Установка =====
 +Настройка для cgroup версий 1 и 2 отличается, ниже настройка для cgroup2.
 +<code bash>
 +# Проверка версии cgroup
 +grep cgroup /proc/filesystems
 +nodev   cgroup
 +nodev   cgroup2
 +</code>
 +
 +Если не планируется поднимать встроенный DNS, то нужно прописать IP сервера в существующем DNS, например, ''ipa.workgroup.test 192.168.1.32''.
 +
 +Docker run
 +<code bash>
 +docker run --name freeipa-server -ti \
 +-h ipa.workgroup.test --read-only \
 +--cgroupns=host -v /sys/fs/cgroup:/sys/fs/cgroup:rw \
 +--sysctl net.ipv6.conf.all.disable_ipv6=0 \
 +-v ~/volumes/freeipa/data:/data freeipa/freeipa-server:rocky-9 ipa-server-install --skip-mem-check
 +</code>
 +Docker compose (cgroups2, без DNS)
 +<code yaml>
 +---
 +services:
 +  freeipa:
 +    image: freeipa/freeipa-server:rocky-9
 +    container_name: freeipa-server
 +    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.workgroup.test
 +      IPA_SERVER_INSTALL_OPTS: "-n workgroup.test -r WORKGROUP.TEST --skip-mem-check -U"
 +      PASSWORD: "123456Qwerty"
 +      TZ: "Europe/Moscow"
 +    volumes:
 +      - /etc/localtime:/etc/localtime:ro
 +      - /sys/fs/cgroup:/sys/fs/cgroup:rw
 +      - ~/volumes/freeipa/data:/data
 +    sysctls:
 +      - net.ipv6.conf.all.disable_ipv6=0
 +</code>
 +
 +Останов и чистка данных в случае неудачной установки
 +<code bash>
 +docker rm -f freeipa-server
 +sudo rm -rf ~/volumes/freeipa/data/*
 +</code>
 +
 +Результат установки
 +<code>
 +he IPA Master Server will be configured with:
 +Hostname:       ipa.workgroup.test
 +IP address(es): 172.17.0.2
 +Domain name:    workgroup.test
 +Realm name:     WORKGROUP.TEST
 +
 +The CA will be configured with:
 +Subject DN:   CN=Certificate Authority,O=WORKGROUP.TEST
 +Subject base: O=WORKGROUP.TEST
 +Chaining:     self-signed
 +
 +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 /root/cacert.p12
 +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>
 +
 +===== Клиент =====
 +<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=/usr/bin/bash  
 +
 +# Переделать всех пользователей на оболочку bash
 +for i in $(ipa user-find |grep 'User login' |cut -d: -f2); do ipa user-mod $i --shell=/usr/bin/bash; done
 +
 +# Поиск пользователя
 +kinit admin
 +ipa user-find vpupkin
 +--------------
 +1 user matched
 +--------------
 +  User login: vpupkin
 +  First name: Василий
 +  Last name: Пупкин
 +  Home directory: /home/vpupkin
 +  Login shell: /usr/bin/bash
 +  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 'cn=Directory Manager' -w 123456Qwerty -b "dc=workgroup,dc=test" "uid=vpupkin"
 +# Более подробный результат
 +ldapsearch -x -D 'cn=Directory Manager' -w 123456Qwerty -b "cn=users,cn=accounts,dc=workgroup,dc=test" "uid=vpupkin"
 +# Менее подробный
 +ldapsearch -x -D 'cn=Directory Manager' -w 123456Qwerty -b "cn=users,cn=compat,dc=workgroup,dc=test" "uid=vpupkin"
 +
 +</code>
 +
 +==== 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:service.keytab
 +KVNO Timestamp           Principal
 +---- ------------------- ------------------------------------------------------
 +   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:persistent:1000:krb_ccache_Wc0I0KA
 +Default principal: service@WORKGROUP.TEST
 +
 +Valid starting       Expires              Service principal
 +08/22/2024 11:02:05  08/23/2024 10:48:14  krbtgt/WORKGROUP.TEST@WORKGROUP.TEST
 +</code>
 +https://debuntu.ru/n/sozdanie-keytab-faila-dlya-polzovatelskogo-principala/
 +==== Windows ====
 +<code powershell>
 +# Установить модуль
 +Install-Module -Name Manage-FreeIPA
 +</code>
 +
 +===== Ошибки =====
 +==== Configuring certificate server (pki-tomcatd) ====
 +При первоначальной установке
 +<code>
 +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/directories for more information:
 +  /var/log/pki/pki-tomcat
 +  [error] RuntimeError: CA configuration failed.
 +CA configuration failed.
 +</code>
 +Надо прописывать правильный hostname в команде запуска или в docker compose.
 +
  

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki