LDAP Linux LDAP SUDO: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 201: Строка 201:
   
 
=Настройка клиента=
 
=Настройка клиента=
  +
На клиенте следует установить пакет sudo-ldap который заменяет стандартный пакет sudo.
  +
<BR>
  +
В файле nsswitch прописать использование sudo:
  +
<PRE>
  +
cat /etc/nsswitch.conf | grep sudo
  +
</PRE>
  +
<PRE>
  +
sudoers: ldap files
  +
</PRE>
  +
В случае когда у меня было files ldap - не работало.
  +
  +
Настроить файл /etc/sudo-ldap.conf.
  +
<BR>
  +
По-умолчанию это символическая ссылка но это не очень удобно, потому проще заменить его на файл
  +
<PRE>
  +
BASE dc=customer_organization,dc=fuel_domain
  +
URI ldaps://ldap-srv.example.com
  +
BINDDN uid=nssproxy-node3,ou=service_users,dc=customer_organization,dc=fuel_domain
  +
BINDPW node3
  +
TIMELIMIT 15
  +
TIMEOUT 20
  +
SUDOERS_BASE ou=sudo,ou=services,dc=customer_organization,dc=fuel_domain
  +
SUDOERS_DEBUG 2
  +
TLS_CACERT /etc/ssl/certs/rootca.crt
  +
TLS_REQCERT demand
  +
</PRE>
  +
  +
* BASE - "база" ждя поиска
  +
* URI - адрес LDAP сервера, в случае шифрования - ldap<B>s</B>://
  +
* BINDDN , BINDPW - "логин" и прароль для подключения к LDAP
  +
* TIMELIMIT, TIMEOUT - параметры подключения.
  +
* SUDOERS_BASE - "база" поиска объектов sudo. Их вооб-ще то можно положить куда угодно, но лишние права на это поддерево лучше не давать
  +
* SUDOERS_DEBUG - отладка. Я использовал значение 2 для отладки, 0 - для продкашена.
  +
* TLS_CACERT - путь к сертефикату
  +
* TLS_REQCERT - опция, влияющая на то будет ли принят самоподписанный сертификат.
  +
 
=SUDO=
 
=SUDO=
 
Добавить разрешения в файл sudoers
 
Добавить разрешения в файл sudoers

Версия 15:36, 21 мая 2016

Настройка состоит из 2 независимых частей - настройка сервера и клиента.

Настройка сервера

Добавление схемы

Операция не совсем тривиальная - в пакете ldap-sudo поставляется старая схема и просто так ее залить на сервер не получиться. Требуется конвертация.

  • Создать временный файл "конфигурации slapd". В моем примере это /root/slapd.conf с одной строкой:
# cat /root/slapd.conf
include ./sudo.OpenLDAP

sudo.OpenLDAP - это файл скопированный из пакета ldap-sudo, /usr/share/doc/sudo-ldap/schema.OpenLDAP
Запустить конвертацию: создать директорию для будущих конфигов и сгенерировать их

# создаём директорию
mkdir testdir
# запускаем slaptest
slaptest -f slapd.conf -F testdir

В результате в testdir будет создано дерева конфигурации.
Интересующая нас схема расположена в файле testdir/cn=config/cn=sudo

# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 75e9d97b
dn: cn={0}sudo
objectClass: olcSchemaConfig
cn: {0}sudo
olcAttributeTypes: {0}( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s).
 who may  run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMa
 tch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {1}( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s).
 who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMat
 ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {2}( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Comma
 nd(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1
 466.115.121.1.26 )
olcAttributeTypes: {3}( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s)
  impersonated by sudo (deprecated)' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1
 .4.1.1466.115.121.1.26 )
olcAttributeTypes: {4}( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Option
 s(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115
 .121.1.26 )
olcAttributeTypes: {5}( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'Use
 r(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466
 .115.121.1.26 )
olcAttributeTypes: {6}( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Gr
 oup(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.14
 66.115.121.1.26 )
olcAttributeTypes: {7}( 1.3.6.1.4.1.15953.9.1.8 NAME 'sudoNotBefore' DESC 'Sta
 rt of time interval for which the entry is valid' EQUALITY generalizedTimeMat
 ch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
  )
olcAttributeTypes: {8}( 1.3.6.1.4.1.15953.9.1.9 NAME 'sudoNotAfter' DESC 'End.
 of time interval for which the entry is valid' EQUALITY generalizedTimeMatch.
 ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
olcAttributeTypes: {9}( 1.3.6.1.4.1.15953.9.1.10 NAME 'sudoOrder' DESC 'an int
 eger to order the sudoRole entries' EQUALITY integerMatch ORDERING integerOrd
 eringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcObjectClasses: {0}( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' DESC 'Sudoer En
 tries' SUP top STRUCTURAL MUST cn MAY ( sudoUser $ sudoHost $ sudoCommand $ s
 udoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoOrder $ sudoNotB
 efore $ sudoNotAfter $ description ) )
structuralObjectClass: olcSchemaConfig
entryUUID: aaaded3e-af4b-1035-8f99-f94b551aa988
creatorsName: cn=config
createTimestamp: 20160516004836Z
entryCSN: 20160516004836.159008Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20160516004836Z


Тут dn: cn={0}sudo - взято из имени файла. Если файл со схемой назывался по-другому, то и имя будет другое.


Файл требуется привести к следующему виду:

dn: cn=sudo,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: sudo
olcAttributeTypes: {0}( 1.3.6.1.4.1.15953.9.1.1 NAME 'sudoUser' DESC 'User(s).
 who may  run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMa
 tch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {1}( 1.3.6.1.4.1.15953.9.1.2 NAME 'sudoHost' DESC 'Host(s).
 who may run sudo' EQUALITY caseExactIA5Match SUBSTR caseExactIA5SubstringsMat
 ch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: {2}( 1.3.6.1.4.1.15953.9.1.3 NAME 'sudoCommand' DESC 'Comma
 nd(s) to be executed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1
 466.115.121.1.26 )
olcAttributeTypes: {3}( 1.3.6.1.4.1.15953.9.1.4 NAME 'sudoRunAs' DESC 'User(s)
  impersonated by sudo (deprecated)' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1
 .4.1.1466.115.121.1.26 )
olcAttributeTypes: {4}( 1.3.6.1.4.1.15953.9.1.5 NAME 'sudoOption' DESC 'Option
 s(s) followed by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466.115
 .121.1.26 )
olcAttributeTypes: {5}( 1.3.6.1.4.1.15953.9.1.6 NAME 'sudoRunAsUser' DESC 'Use
 r(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.1466
 .115.121.1.26 )
olcAttributeTypes: {6}( 1.3.6.1.4.1.15953.9.1.7 NAME 'sudoRunAsGroup' DESC 'Gr
 oup(s) impersonated by sudo' EQUALITY caseExactIA5Match SYNTAX 1.3.6.1.4.1.14
 66.115.121.1.26 )
olcAttributeTypes: {7}( 1.3.6.1.4.1.15953.9.1.8 NAME 'sudoNotBefore' DESC 'Sta
 rt of time interval for which the entry is valid' EQUALITY generalizedTimeMat
 ch ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24
  )
olcAttributeTypes: {8}( 1.3.6.1.4.1.15953.9.1.9 NAME 'sudoNotAfter' DESC 'End.
 of time interval for which the entry is valid' EQUALITY generalizedTimeMatch.
 ORDERING generalizedTimeOrderingMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
olcAttributeTypes: {9}( 1.3.6.1.4.1.15953.9.1.10 NAME 'sudoOrder' DESC 'an int
 eger to order the sudoRole entries' EQUALITY integerMatch ORDERING integerOrd
 eringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcObjectClasses: {0}( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' DESC 'Sudoer En
 tries' SUP top STRUCTURAL MUST cn MAY ( sudoUser $ sudoHost $ sudoCommand $ s
 udoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoOrder $ sudoNotB
 efore $ sudoNotAfter $ description ) )

diff:

< # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
< # CRC32 75e9d97b
< dn: cn={0}sudo
---
> dn: cn=sudo,cn=schema,cn=config
5c3
< cn: {0}sudo
---
> cn: sudo
41,47d38
< structuralObjectClass: olcSchemaConfig
< entryUUID: aaaded3e-af4b-1035-8f99-f94b551aa988
< creatorsName: cn=config
< createTimestamp: 20160516004836Z
< entryCSN: 20160516004836.159008Z#000000#000#000000
< modifiersName: cn=config

А именно: указать правильный dn и удалить{0}. Удаление {0} означает что LDAP сам назначит номер в последовательности, а не перепишет существующую запись.
Тут подробно:

Добавление объектов

Следующим шагом следует конвертировать существующий файл sudoers в объекты LDAP
Установить sudo с поддержкой ldap и необходимые утилиты и схемы

apt-get  install  sudo-ldap

Бекап настроек sudo

cp /etc/sudoers /root/sudoers

В файле предназначенном для конвертации я добавил разрешения для sudo для группу fuel_users

%fuel_users ALL=(ALL:ALL) ALL

Распаковать утилиту для конвертации файла sudoers а объекты LDAP

zcat /usr/share/doc/sudo-ldap/sudoers2ldif.gz > /root/sudoers2ldif
chmod +x sudoers2ldif

Конвертация

SUDOERS_BASE=ou=sudo,ou=services,dc=customer_organization,dc=fuel_domain  ./sudoers2ldif sudoers  > sudoers.ldif

Переменная SUDOERS_BASE=ou=sudo,ou=services,dc=customer_organization,dc=fuel_domain определяет в каком OU/DOMAIN помещать объекты


Загрузить конфигурацию в LDAP

ldapadd < sudoers.ldif
adding new entry "cn=defaults,ou=sudo,ou=services,dc=customer_organization,dc=fuel_domain"

adding new entry "cn=root,ou=sudo,ou=services,dc=customer_organization,dc=fuel_domain"

adding new entry "cn=%admin,ou=sudo,ou=services,dc=customer_organization,dc=fuel_domain"

adding new entry "cn=%sudo,ou=sudo,ou=services,dc=customer_organization,dc=fuel_domain"

adding new entry "cn=%fuel_users,ou=sudo,ou=services,dc=customer_organization,dc=fuel_domain"

Настройка клиента

На клиенте следует установить пакет sudo-ldap который заменяет стандартный пакет sudo.
В файле nsswitch прописать использование sudo:

cat /etc/nsswitch.conf | grep sudo
sudoers:        ldap files

В случае когда у меня было files ldap - не работало.

Настроить файл /etc/sudo-ldap.conf.
По-умолчанию это символическая ссылка но это не очень удобно, потому проще заменить его на файл

BASE              dc=customer_organization,dc=fuel_domain
URI               ldaps://ldap-srv.example.com
BINDDN            uid=nssproxy-node3,ou=service_users,dc=customer_organization,dc=fuel_domain
BINDPW            node3
TIMELIMIT         15
TIMEOUT           20
SUDOERS_BASE      ou=sudo,ou=services,dc=customer_organization,dc=fuel_domain
SUDOERS_DEBUG     2
TLS_CACERT        /etc/ssl/certs/rootca.crt
TLS_REQCERT       demand
  • BASE - "база" ждя поиска
  • URI - адрес LDAP сервера, в случае шифрования - ldaps://
  • BINDDN , BINDPW - "логин" и прароль для подключения к LDAP
  • TIMELIMIT, TIMEOUT - параметры подключения.
  • SUDOERS_BASE - "база" поиска объектов sudo. Их вооб-ще то можно положить куда угодно, но лишние права на это поддерево лучше не давать
  • SUDOERS_DEBUG - отладка. Я использовал значение 2 для отладки, 0 - для продкашена.
  • TLS_CACERT - путь к сертефикату
  • TLS_REQCERT - опция, влияющая на то будет ли принят самоподписанный сертификат.

SUDO

Добавить разрешения в файл sudoers
/etc/sudoers

%fuel_users ALL=(ALL:ALL) ALL


Подробно про sudo: https://wiki.archlinux.org/index.php/Sudo_%28%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9%29