Содержание


Импорт пользователей из LDAP-каталога в IBM Security Access Manager

Поиск и импорт учетных записей в продукт IBM Security Access Manager с помощью скрипта на Python для пользователей без опыта работы со скриптами

Comments

Продукты IBM для обеспечения безопасности нередко реализуются как brownfield-разработки, т.е. создаются для среды, в которой уже существует какое-либо подобное приложение. IBM Security Access Manager — именно такой продукт. Он часто развертывается в средах, в которых уже имеется какой-либо сервер каталогов LDAP (Lightweight Directory Access Protocol). В этом случае системный администратор должен уметь импортировать учетные записи пользователей из сервера LDAP-каталогов в IBM Security Access Manager.

На рис. 1 показана архитектура системы, в которой продукт IBM Security Access Manager был развернут в существующей среде, включающей сервер LDAP-каталогов и серверные приложения.

Архитектура, включающая сервер каталогов и продукт IBM Security Access Manager
A system architecture connecting an LDAP respository to IBM Security Access Manager
A system architecture connecting an LDAP respository to IBM Security Access Manager

В этой статье я представляю скрипт на языке Python (см. раздел Загрузка), который можно запускать из командной строки для автоматического отыскания и импорта новых пользователей из дерева LDAP-репозитария в продукт IBM Security Access Manager. Обратите внимание: предполагается, что читатели этой статьи знакомы с продуктом IBM Security Access Manager и с технологией Lightweight Directory Access Protocol. Предварительное знакомство с языком Python для использования описываемого скрипта импорта не требуется.

Скрипт импорта

В этом разделе я представляю и объясняю некоторые элементы и стадии работы скрипта для импорта, который вы можете загрузить в любой момент времени. Обратите внимание, что в этом скрипте используется команда pdadmin продукта IBM Security Access Manager, поэтому скрипт нужно запускать на компьютере с установленной средой исполнения IBM Security Access Manager.

Блок-схема на рис. 2 демонстрирует основные стадии работы описываемого скрипта.

Основные стадии работы скрипта
A flow diagram showing the stages of the import script.
A flow diagram showing the stages of the import script.

Скрипт импорта показан в листинге 1.

Скрипт импорта
#! /usr/bin/python

# Authentication
ldap_dn = "cn=root"
ldap_pwd = "object00"
ldap_server = "localhost"
sameb_uid = "sec_master"
sameb_pwd = "object00"

# Участок LDAP-дерева, где предполагается наличие пользователей
ldap_base = "o=xyz"

# Участок LDAP-дерева, в котором находится конфигурация SAMeb 
ldap_sameb_base = "secAuthority=Default"

# Внутренняя конфигурация
ldap_user_file = "ldap_users"
uid_file = "uid_file"

from subprocess import call

call("ldapsearch -LLL -D " + ldap_dn + " -w " + ldap_pwd 
	+ " -b " + ldap_base + " -h " + ldap_server
	" objectclass=inetOrgPerson dn >" + ldap_user_file,
		shell=True)

ldap_users = open(ldap_user_file, "r")

for line in ldap_users:
	if len(line) > 1:
		dn = line[4:-1]
		ret_val = call("ldapsearch -D " + ldap_dn +
			" -w " + ldap_pwd + " -h " + ldap_server +
			" -b " + ldap_sameb_base + " secDN=" + dn + 
			" | grep numEntries > /dev/null",
			shell=True)
		if (ret_val == 1):
			print "Need to import " + dn
			call("ldapsearch -D " + ldap_dn +
				" -w " + ldap_pwd + 
				" -h " + ldap_server + " -b " + dn +
				" objectClass=inetOrgPerson uid " + 
				"| grep uid: >" + uid_file, 
				shell=True)
			uid_f = open(uid_file, "r")
			uid = uid_f.read()
			uid_f.close()
			uid = uid[5:-1]
			call("pdadmin -a " + sameb_uid + " -p " +
				sameb_pwd + " user import " + uid + 
				" " + dn,
				shell=True);
			call("pdadmin -a " + sameb_uid + " -p " +
				sameb_pwd + " user modify " + uid + 
				"account-valid yes ",
				shell=True);

В следующем разделе я не буду давать пояснения по каждой части этого скрипта, а лишь расскажу о его основных особенностях. Знакомство читателя с Python является полезным, но не обязательным. Я объясню соответствующие аспекты синтаксиса Python для каждой настройки, а также покажу, где вам придется изменить эти настройки для использования этого скрипта в своей среде.

Настройки скрипта

Обычно в языке Python строки, начинающиеся с символа #, являются комментариями. Однако показанная ниже строка из листинга 1 представляет собой особую ситуацию. Согласно соглашениям UNIX®, в файлах, начинающихся с символов #!, остальная часть строки с этими символами рассматривается как имя интерпретатора, который будет обрабатывать данный файл. В данном случае следующий код — это маршрут к интерпретатору Python. При необходимости измените этот код в соответствии со спецификой своей среды.

#! /usr/bin/python

Следующий фрагмент кода содержит идентификатор и пароль для входа в LDAP-сервер, а также информацию об имени хоста этого сервера. При необходимости измените эти настройки в соответствии со спецификой своей среды.

# Аутентификация
ldap_dn = "cn=root"
ldap_pwd = "object00"
ldap_server = "localhost"

После этого скрипт передает информацию об идентификаторе и пароле в продукт IBM Security Access Manager. Измените эти фрагменты в соответствии со спецификой своей среды.

sameb_uid = "sec_master"
sameb_pwd = "object00"

Следующий фрагмент представляет собой ветвь LDAP-дерева, в которой содержится информация о пользователе. На рис. 3 показан пример размещения пользователей в LDAP-дереве. При необходимости измените эти настройки в соответствии со своей конфигурацией.

LDAP-дерево с пользователями
A diagram of a branch in the LDAP tree.
A diagram of a branch in the LDAP tree.
# Участок LDAP-дерева, в котором вы предполагаете найти пользователей
ldap_base = "ou=people,o=xyz"

Фильтрация учетных записей пользователей

Помимо отыскания пользователей в LDAP-дереве, рассматриваемый скрипт должен ограничить свою деятельность лишь теми пользователями, которые еще не присутствуют в продукте IBM Security Access Manager. Чтобы отфильтровать этих пользователей, скрипту нужно знать местонахождение конфигурации IBM Security Access Manager в LDAP-дереве. Как показано ниже, по умолчанию используется следующее местонахождение: secAuthority=Default. Эту настройку по умолчанию можно изменить при первоначальном конфигурировании сервера политик.

# Участок LDAP-дерева, в котором находится конфигурация SAMeb
ldap_sameb_base = "secAuthority=Default"

На рис. 4 показано LDAP-дерево с местонахождением конфигурации IBM Security Access Manager по умолчанию.

LDAP-дерево с настройкой secAuthority=Default
A diagram of the LDAP tree with ISAM defaults.
A diagram of the LDAP tree with ISAM defaults.

В конце скрипта указаны файлы, которые используются для промежуточного хранения выходной информации команд, применявшихся для получения информации о пользователе. Если у вас нет причин для одновременного выполнения нескольких экземпляров данного скрипта, не следует изменять следующие имена файлов:

# Внутренняя конфигурация
ldap_user_file = "ldap_users"
uid_file = "uid_file"

Функции скрипта

В следующей части скрипта декларированные выше параметры используются для реального чтения пользователей из LDAP-репозитария и импорта этих пользователей в IBM Security Access Manager.

Скрипт использует Python-функцию subprocess.call для исполнения команд оболочки. Следующая строка импортирует эту функцию, после чего она становится доступной:

from subprocess import call

Следующая строка вызывает команду ldapsearch для получения списка пользователей.

call("ldapsearch -LLL -D " + ldap_dn + " -w " + ldap_pwd
        + " -b " + ldap_base + " -h " + ldap_server
        " objectclass=inetOrgPerson dn >" + ldap_user_file,
        shell=True)

В конфигурации по умолчанию показанные выше строки исполняют следующую команду оболочки. Эта команда ищет сущности типа inetOrgPerson, которые используются для представления людей. В каждой найденной сущности команда читает только ее отличительное имя и отправляет полученные результаты в файл ldapusers:

ldapsearch -LLL -D cn=root -w object00 -b ou=people,o=xyz
        -h localhost objectclass=inetOrgPerson dn > ldapusers

Затем скрипт открывает полученный файл ldapusers и читает его строку за строкой. Обратите внимание, что в Python блоки обозначаются отступами; поэтому все строки, которые имеют хотя бы один отступ после данной точки и далее, выполняются по одному разу для каждого пользователя.

ldap_users = open(ldap_user_file, "r")
for line in ldap_users:

Примечание: Строки в файле ldapusers имеют форму: dn: cn=jdoe,ou=users,o=xyz. В начале следуют четыре символа: dn: и пробел. Фактическое отличительное имя начинается с пятого символа (который имеет номер 4, поскольку отсчет начинается с нуля).

Половина строк в файле ldapusers пусты. Другая половина строк начинается с символов dn:. Этот фрагмент кода игнорирует пустые строки и отбрасывает первые четыре символа в других строках. Поскольку блоки Python обозначаются отступами, остальная часть скрипта исполняется только для строк, которые не являются пустыми.

if len(line) > 1:
        dn = line[4:-1]

Проверка на наличие существующих учетных записей

Как указывалось выше, при импорте пользователей из LDAP-репозитария в IBM Security Access Manager необходимо исключить дублирование существующих учетных записей. Каждая запись пользователя в IBM Security Access Manager имеет атрибут secDN, значением которого является первоначальное отличительное имя пользователя. В следующем сегменте кода команда ldapsearch выполняет поиск записи с надлежащим значением атрибута secDN.

ret_val = call("ldapsearch -D " + ldap_dn +
        " -w " + ldap_pwd +
        " -h " + ldap_server +
        " -b " + ldap_sameb_base + " secDN=" + dn +
        " | grep numEntries > /dev/null",
        shell=True)

Возвращаемое значение "1" является признаком того, что команда grep завершилась неудачей, т. е. ни одна из имеющихся LDAP-записей не соответствует фильтру. В этом случае скрипт импортирует соответствующего пользователя, создавая новую LDAP-запись с информацией об этом пользователе IBM Security Access Manager.

if (ret_val == 1):
        print "Need to import " + dn

Импорт нового пользователя

Чтобы импортировать пользователя в продукт IBM Security Access Manager, необходимо указать идентификатор пользователя UID, который он использует для входа в систему. Следующие строки извлекают это значение:

call("ldapsearch -D " + ldap_dn +
        " -w " + ldap_pwd +
        " -h " + ldap_server +
        " -b " + dn +
        " objectClass=inetOrgPerson uid " +
        "| grep uid: >" + uid_file,
        shell=True)

Следующая строка читает первую строку файла:

   uid_f = open(uid_file, "r")
     uid = uid_f.read()
     uid_f.close()

Обратите внимание, что показанная ниже строка указывает, что первые пять символов (uid:) должны быть отброшены. Остающиеся символы представляют фактическое значение атрибута.

uid = uid[5:-1]

Создание новых учетных записей

Наконец, скрипт создает новые учетные записи в продукте IBM Security Access Manager с помощью команды pdadmin:

call("pdadmin -a " + sameb_uid + " -p " +
        sameb_pwd + " user import " + uid +
        " " + dn,
        shell=True);
call("pdadmin -a " + sameb_uid + " -p " +
        sameb_pwd + " user modify " + uid +
        "account-valid yes ", shell=True)

Обратите внимание на вторую команду скрипта (user modify >uid< account-valid yes); она необходима, поскольку пользователи, созданные или импортированные с помощью команды pdadmin, по умолчанию неактивны.

Заключение

В этой статье я представил скрипт Python, который упрощает импорт новых пользователей в продукт IBM Security Access Manager. Хотя этот скрипт не имеет всей гибкости продукта IBM Tivoli Directory Integrator или всей функциональности продукта IBM Security Identity Manager (см. раздел Ресурсы), он обладает несомненным преимуществом — он является бесплатным.

Благодарности

Автор выражает благодарность Виндаяни Ахмаду Зинулле (Windayani Achmad Zaenullah), который сформулировал необходимость написания этой статьи, и Лэнсу Клинтону (Lance Clinton), который стал ее рецензентом. Ответственность за возможные ошибки лежит исключительно на авторе.


Ресурсы для скачивания


Похожие темы

  • Оригинал статьи: Import users from an LDAP directory to IBM Security Access Manager.
  • IBM Security Access Manager unboxed (Развертывание IBM Security Access Manager), developerWorks, январь 2013 г. Развертывание продукта IBM Security Access Manager вместе с продуктом IBM Security Access Manager for Web. В этом цикле из четырех видеороликов демонстрируется, как установить виртуальную машину, как сконфигурировать интерфейс командной строки и как создать обратный прокси-сервер.
  • IBM Identity Management and Access Management Solutions (Решения IBM для управления идентификацией и управления доступом). Обзор решений IBM для обеспечения безопасности посредством управления идентификацией и доступом.
  • Раздел Application development in Python with ibm_db (Разработка приложений на Python с использованием ibm_db) в информационном центре решений DB2. Начните применять Python-функции для обращения к данным и для манипулирования данными на сервере баз данных IBM посредством API-интерфейса ibm_db.
  • "Discover Python, Part 8: Reading and writing data using Python's input and output functionality (Знакомство с Python. Часть 8. Чтение и запись данных с помощью Python-функций), developerWorks, январь 2006 г. Познакомьтесь с разнообразными областями применения Python.
  • Introduction to Computer Science (Введение в компьютерные науки). Пройдите бесплатный онлайновый курс для программистов-новичков, посвященный написанию поискового робота с помощью Python.
  • IBM Tivoli Directory Integrator: загрузите бесплатную ознакомительную версию продукта IBM Tivoli Directory Integrator v7.1 и научитесь использовать его для обеспечения согласованности данных в нескольких ресурсах с идентификационными сведениями или с данными общего характера.
  • IBM Security Identity Manager: автоматизируйте создание, модификацию, повторную сертификацию и прекращение пользовательских полномочий на всем протяжении жизненного цикла пользователя.
  • Загрузите Python.

Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=965813
ArticleTitle=Импорт пользователей из LDAP-каталога в IBM Security Access Manager
publish-date=03142014