Asp интерфейсы active directory service interfaces


Содержание

Рабочие заметки и не только .

Тест S5 Box

Вот примерно так работает модуль в реале.

Установка интерфейса программирования приложений Active Directory (Active Directory Servise Interface) — adsiedit.msc

Если Вы настраиваете на Windows Server 2003 Active Directory, то вам может понадобиться утилита adsiedit.msc.

Утилита ADSI позволяет создавать, изменять и удалять объекты в каталогах AD, выполнять поиск и т. д., что бывает необходимо.

В моем случае при настройке AD на Windows 2003 Server ADSI не оказалось. Давайте рассмотрим как ее установить.

Скачать приложение

Для начала необходимо скачать ADSIedit, для этого воспользуйтесь любой из ссылок:

Установка

1. Полученые файлы распаковываем в папку C:\Windows;

2. Открываем консоль: «Пуск» ? «Выполнить» ввести cmd и нажать Enter;

3. Вводим в консоли команду: regsvr32 adsiedit и выполните ее;

4. Осталось выполнить проверку, зарегистрировалось ли наше приложение. В «Пуск» ? «Выполнить» выполним команду: adsiedit.smc

Если мы все сделали правильно откроется наше приложение:

Asp интерфейсы active directory service interfaces

Active Directory Service Interfaces (ADSI) abstracts the capabilities of directory services from different network providers in a distributed computing environment to present a single set of directory service interfaces for managing network resources. Administrators and developers can use ADSI services to enumerate and manage the resources in a directory service, no matter which network environment contains the resource.

ADSI makes it easier to perform common administrative tasks, such as adding new users, managing printers, and locating resources throughout the distributed computing environment.

ADSI makes it easy for developers to «directory enable» their applications. Administrators and developers handle a single set of directory service interfaces, regardless of which directory services are installed.

The following topics are discussed in this introduction:

What You Should Know Before Reading This Guide

This guide assumes that you are familiar with the Component Object Model (COM) and Automation, and that you know how to program in either Visual Basic or C/C++.

Some of the terms used in this guide are unique to either ADSI or the directory services environment. Other terms will be familiar but may have slightly different meanings in these environments.

For more information about Active Directory Service Interfaces and the technologies on which they are based, you may find the following sources helpful.

Brockschmidt, Kraig. Inside OLE, 2nd edition. Redmond, WA: Microsoft Press, 1995.

Chappell, David. Understanding ActiveX and OLE. Redmond, WA: Microsoft Press, 1996.

Hahn, Steven. ADSI ASP Programmer’s Reference. Wrox Press Ltd., 1998.

Harrison, Richard. ASP/MTS/ADSI Web Security. Prentice Hall, 1999.

Microsoft’s OLE DB Programmer’s Reference Version 1.0, 1996.

OLE 2 Programmer’s Reference, Volume Two. Redmond, WA: Microsoft Press, 1994.

Rogerson, Dale. Inside COM. Redmond, WA: Microsoft Press, 1997.

The Active Directory Service Design Specification Version 2.0.

The Component Object Model Specification.

(These resources may not be available in some languages and countries/regions.)

Записки IT специалиста


Технический блог специалистов ООО»Интерфейс»

  • Главная
  • Настраиваем Squ >

Настраиваем Squ >
  • Автор: Уваров А.С.
  • 20.06.2015

Материалы о построении роутера на базе Squid — одни из самых популярных на нашем сайте. Такое решение позволяет с минимальными затратами (прежде всего на программную часть) организовать и упорядочить доступ к сети интернет на предприятии. Но рассматриваемые нами варианты предназначались преимущественно для работы в составе рабочей группы. Отсутствие интеграции с Active Directory резко снижало удобство применения такого роутера в доменных сетях, поэтому мы решили исправить это упущение.

В процессе подготовки данного материала мы не планировали отдельно останавливаться на подготовке сервера, намереваясь использовать для этого уже существующий материал: Ubuntu Server. Настраиваем роутер NAT + DHCP + Squid3. Однако, когда количество уточнений и отличий стало превышать разумные пределы, мы решили посвятить этому вопросу отдельную статью. В тоже время мы предполагаем, что читатель знаком с вышеуказанным материалом и поэтому не будем объяснять подробно многие используемые нами настройки и не будем останавливаться на второстепенных деталях.

Особенности интеграции с Active Directory

В чем смысл интеграции прокси-сервера Squid в Active Directory? Скажем сразу, что если ваша основная цель — просто раздать интернет всем и без ограничений, ну разве что закрыв социальные сети, то дальше можно не читать, уже описанная нами конфигурация полностью удовлетворит ваши потребности. Основное преимущество интеграции роутера в Active Directory — это использование единой точки аутентификации и управление доступом к сети интернет на базе уже существующих в домене учетных записей и групп безопасности.

Отсюда следуют некоторые особенности. Так прозрачный режим не поддерживает аутентификацию и от него придется отказаться, указывая настройки прокси непосредственно в настройках браузера. Этот процесс несложно автоматизировать при помощи DHCP-сервера и протокола WPAD.

В качестве DNS-серверов, в том числе и на роутере, должны обязательно указываться только доменные DNS, по умолчанию DNS-сервером является каждый контроллер домена. По этой причине роутер не должен иметь роли DNS-сервера. Также, для обеспечения интеграции с AD, роль DHCP-сервера также следует передать Windows Server, обычно на один или несколько контроллеров домена.

Теперь подходим к тому, ради чего все это затевалось. Аутентификация по доменным учетным записям позволяет использовать единую точку входа (SSO, Single Sign-On), когда пользователь вводит логин и пароль один раз — при входе в систему. Это достигается применением протокола Kerberos, который является способом аутентификации в AD по умолчанию. В отличии от авторов иных руководств, мы не видим смысла настраивать NTLM или Basic-аутентификацию, в первую очередь по соображениям безопасности. Тем более Kerberos поддерживают все современные операционные системы.

Следующим шагом является авторизация на основе существующих групп безопасности, это особенно актуально при переходе с Forefront TMG или ISA Server. Это позволяет один раз настроив Linux-сервер дальнейшее управление доступом осуществлять привычным способом — через группы Active Directory, что позволяет снизить порог вхождения для администраторов.

Так как Active Directory имеет более сложную структуру и большее количество «действующих лиц», то чтобы вы не запутались в используемых нами адресах и именах хостов мы подготовили небольшую схему:

В наших примерах будет использоваться домен Active Directory с FQDN именем interface31.lab, за который отвечают два контроллера домена SRV-DC01 и SRV-DC02 с адресами 192.168.31.101 и 102 соответственно. Оба контроллера реализованы на базе Windows Server 2012 R2.

Роутер выполнен на базе Ubuntu Server 14.04 (Debian 7/8) и имеет имя SRV-GW01 с адресом 192.168.31.100. Также в сети имеется группа серверов со статическими адресами 192.168.31.103-105 и клиентские ПК, адреса которым выдаются DHCP сервером из диапазона 192.168.31.111-199.

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

Сеть настраивается традиционным образом, посредством правки конфигурационного файла /etc/network/interfaces. Примем что внешней сети соответствует интерфейс eth0, а внутренней eth1. В результате настройки у нас должно получиться примерно следующее:

Обратите внимание, что несмотря на то, что в настройках внешнего интерфейса использован внешний адрес и шлюз, адреса DNS-серверов указаны внутренние. Также указана опция dns-search, которая определяет домен для разрешения не FQDN-имен. Это означает, что к каждому короткому имени будет автоматически добавлен указанный домен, например, srv-dc01 будет дополнено до srv-dc01.interface31.lab.

Если вас смущает указание внутренних DNS в настройках внешней сетевой карты, то можете перенести эти строки в секцию eth1, на работу сервера это не повлияет.

DNS-сервера провайдера или публичные DNS следует указать в разделе Серверы пересылки внутреннего DNS-сервера на любом из контроллеров домена.

Если вы получаете сетевые настройки от провайдера по DHCP, то для использования внутренних серверов имен, вместо DNS провайдера секция eth0 должна иметь вид:

Таким образом явно указанные настройки перекроют полученные автоматом от провайдера.

Сохраняем содержимое файла, перезагружаемся. Проверяем наличие интернета на сервере и разрешение имен. Например, выполните команду:

Ответить вам должен первый указанный доменный сервер имен, в нашем случае 192.168.33.101 и выдать полное FQDN-имя хоста и его IP-адрес.

После чего проверьте разрешение внешних имен:

Вы также должны получить ответ от внутреннего сервера. На этом настройку сети можно считать законченной.

Настройка NAT и брандмауэра

Базовая настройка брандмауэра принципиально ничем не отличается от варианта роутера для рабочей группы, за одним исключением. Так как наш прокси является непрозрачным, то существует возможность выхода напрямую через NAT, если по какой-то причине браузер не будет настроен на работу с прокси-сервером. Поэтому ограничим доступ по HTTP (порт 80) для всех клиентов локальной сети, за исключением серверов и отдельных хостов, которым может потребоваться прямой доступ.

Мы считаем, что прокси-сервер нужен в первую очередь для контроля пользователей, поэтому заворачивать на него сервера и служебные хосты, которые не предоставляют доступ к интернет пользователям, не видим никакого смысла.

Создадим и откроем файл /etc/nat

внесем в него следующее содержимое:

Секция #Разрешаем HTTP серверам подразумевает набор идентичных правил для каждого хоста, которому мы разрешаем выход в интернет в обход прокси. В нашем случае это адреса от 192.168.31.101 до 192.168.31.105, чтобы не загромождать пример мы написали первый и последний, разделив их многоточием (которого в реальном конфиге быть не должно).

Сохраним файл и дадим ему права на исполнение:


После чего можно проверить интернет на клиентах, на тех, которые входят в список исключений — он будет, на остальных нет. Другие протоколы: почта (SMTP, POP3, IMAP), FTP, HTTPS и т.п. должны работать на всех клиентах.

Настройка синхронизации времени

Для успешной работы с доменом Active Directory и прохождения Kerberos-аутентификации важно чтобы часы роутера были синхронизированы с часами контроллера домена.

Затем откроем файл конфигурации /etc/ntp.conf и закомментируем все строки, начинающиеся на server. После чего добавим две свои записи:

Как вы уже, наверное, догадались, мы закомментировали записи сторонних серверов времени и добавили в этом качестве контроллеры домена.

Затем добавим в конец файла две строки, ограничивающие работу NTP-клиента внутренним интерфейсом:

Сохраняем файл и перезапускаем службу:

Чтобы убедиться, что NTP работает только на внутреннем интерфейсе, выполните:

В выводе команды должны быть только внутренние адреса и адреса локальной петли (localhost):

Проверить синхронизацию можно командой:

В выводе обращаем внимание на колонки: when -время с последнего ответа сервера, pool — время опроса сервера, offset — разница времени в секундах.

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

Настройка кеширующего прокси-сервера Squ > Внимание! Если вы перенастраиваете сервер для рабочей группы, то обязательно удалите пакет dnsmasq или иные DNS и DHCP сервера!

Важно! Начиная с Debian 9 и Ubuntu 16.04 вместо пакета squid3 снова используется squid, также аналогичным образом следует изменить все пути, т.е. вместо /etc/squid3 использовать /etc/squid.

Установим прокси-сервер squid3 командой:

Откроем конфигурационный файл /etc/squid3/squid.conf и зададим минимальную конфигурацию, добавив или раскомментировав в соответствующих секциях указанные строки.

Укажем acl элемент для локальной сети:

Минимальный набор списков доступа:

Интерфейсы, порты и режимы работы прокси:

Для squid 3.1 и ниже первая строка должна выглядеть так:

Сохраните и проверьте конфигурацию:

Если нет ошибок, то перезапускаем squid:

На DNS-сервере домена добавьте A-запись для нашего роутера:

Теперь в настройках браузера укажите полное FQDN имя сервера и порт 3128:

Так как никаких ограничений пока не установлено, то вы должны получить доступ в интернет.

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

Asp интерфейсы active directory service interfaces

Are they inside the firewall and logged into active directory?

Because you can use impersonation on the website and their credentials will be that of their user.

And with that user identity you can do isinrole to check they’re in a specific active directory role.

Users not logged into AD won’t be able to use the system — which might satisfy part of your requirements.

  • Изменено Andy ONeill Moderator 31 июля 2014 г. 11:41
  • Помечено в качестве ответа Franklin Chen Microsoft employee, Moderator 7 августа 2014 г. 10:15


Все ответы

Why would you use a sql job?

When you say site — this application is web or windows or what?

Are these users all logged into your active directory?

Because you can just use impersonation on the web site ( including service ) and check isinrole against an AD role as they log on. Which isn’t using passport but then how do you know what the relationship is between a passport and an AD user?

Публикация SQL Server в Active Directory

Заметив вкладку Active Directory в свойствах SQL Server в Enterprise Manager, многие удивляются: какое отношение Active Directory (AD) имеет к SQL Server, какие преимущества можно получить при добавлении сведений об SQL Server и базах данных в AD? Сетевые службы, такие как службы файлов и печати, используют AD для публикации и хранения информации о сетевых ресурсах. AD содержит список учетных записей пользователей и каталог доступных сетевых ресурсов.

Поскольку AD рассматривает серверы SQL и базы данных SQL Server как сетевые ресурсы, их список в AD всегда можно получить. Начиная с SQL Server 2000 Microsoft ввела концепцию публикации (publishing) — в смысле листинга или внесения информации в реестр AD — как самого сервера SQL Server, так и размещенных на нем баз данных в AD в доменах Windows Server 2003 или Windows 2000.

Некоторые продукты Microsoft, например Microsoft Exchange 2000, настолько глубоко интегрированы с AD, что без Active Directory просто не смогут нормально функционировать. SQL Server не нуждается в AD (по крайней мере пока), и простое внесение SQL Server в AD никаких прямых выгод не сулит. Листинг баз данных SQL Server в AD полезен только в случае разработки приложений, которые получают преимущества при публикации баз данных в AD. Одно из преимуществ публикации ресурсов в AD заключается в наличии функции AD Service Publication. Функция Service Publication позволяет приложениям вносить в списки AD имя и местоположение служб, с которыми они работают, и клиент при необходимости может обращаться к службам соответствующего приложения. Service Publication и поисковые возможности AD позволяют администраторам гибко реконфигурировать серверы, не изменяя настроек клиента.

В данной статье рассказывается о том, как зарегистрировать экземпляр SQL Server и базу данных в AD. Кроме того, приводится описание практических примеров, в которых используется ADO, SQL и Active Directory Service Interface (ADSI) для опроса и обновления каталога AD. Дополнительную информацию об ADSI можно найти во врезке «Что такое ADSI?». В дальнейшем мы посмотрим, как выполняется публикация о базе данных SQL Server, чтобы клиенты могли динамически локализовать ее и подключаться к серверу SQL Server, основываясь только на имени базы данных.

Публикация базы данных SQL Server в AD

Можно опубликовать базу данных SQL Server в AD, используя либо Query Analyzer (с помощью системных хранимых процедур sp_ActiveDirectory_SCP и sp_ActiveDirectory_Obj), либо Enterprise Manager. Для добавления SQL Server из Query Analyzer нужно набрать:

Чтобы добавить SQL Server из Enterprise Manager, следует открыть Server Properties, выбрать вкладку Active Directory и щелкнуть Add (см. экран 1).

Экран 1. Добавление SQL Server в Active Directory из Enterprise Manager
Илон Маск рекомендует:  Asp быстродействие доступа к данным

После регистрации экземпляра SQL Server в AD при помощи процедуры sp_ActiveDirectory_Obj можно добавить базы данных. Например, для добавления базы данных Northwind в AD нужно набрать:

Чтобы добавить Northwind из Enterprise Manager, требуется открыть Northwind Properties, перейти на вкладку Options и установить флажок List this database in Active Directory в нижней части экрана (см. экран 2).

Экран 2. Добавление базы данных Northwind в Active Directory из Enterprise Manager

Теперь, после того как SQL Server и база данных добавлены в AD, добавленные классы можно увидеть в AD с помощью редактора ADSI Edit (он включен в состав Windows 2000 Server). Чтобы открыть ADSI Edit, нужно запустить консоль MMC, выбрать Console, Add/Remove Snap-in и добавить оснастку ADSI Edit.

После регистрации ADSI Edit следует выбрать домен для подключения. Для этого используется контекстное меню ADSI и указывается имя сервера домена. Необходимо, чтобы сервер был доступен в контейнере COMPUTER. Новый объект mS-SQL-SQLServer будет отображаться ниже экземпляра Server AD Class. Если запущен экземпляр SQL Server по умолчанию, объект будет называться MSSQLSERVER.

Если раскрыть объект mS-SQL-SQLServer, появится дочерний объект — mS-SQL-SQLDatabase. Каждый из таких объектов или классов имеет свои атрибуты. Один из атрибутов mS-SQL-SQLDatabase — это mS-SQL-Name, который содержит имя базы данных. В данном случае это Northwind (см. экран 3).

Экран 3. Контейнеры SQL в Active Directory

Возникает вопрос, а насколько безопасно публиковать данные об SQL Server и базах данных в AD? На самом деле публикация в AD — более безопасный метод работы с SQL Server, чем существующий подход, размещение SQL Server в сети и использование именованных каналов (Named Pipe) в качестве механизма связи между процессами. По умолчанию SQL Server заявляет о себе клиентам сети с помощью широковещательных сообщений, используя Named Pipe. Для иллюстрации сказанного попробуйте выдать команду osql -L для обнаружения всех компьютеров, на которых запущен SQL Server. Сообщения Named Pipe позволяют клиентам динамически находить SQL Server, однако невозможно назначить сообщениям разрешения на доступ — они попадут на любой компьютер, подключенный к сети.

Что касается AD, то можно назначить разрешения и ограничить круг лиц, которые имеют право просматривать объекты AD. Например, если на SQL Server хранятся платежные данные, следует назначить разрешения на чтение только для платежной группы. После опубликования SQL Server и баз данных в AD можно отключить сообщения по Named Pipe и назначить разрешения для объектов AD. О том, как отключить широковещательный обмен сообщениями по Named Pipe, рассказано в SQL Server 2000 Books Online-BOL-(Updated-SP3) в статье «Revealing SQL Server on a Network». Нужно иметь в виду, что в «спрятанном» таким образом сервере SQL происходит переключение на использование порта 2433 независимо от предыдущих настроек.

Служба Service Publication

Публикация служб позволяет приложениям клиента без труда отыскивать соответствующий сервер базы данных. Как показано на рис. 1, сначала SQL Server публикует в AD свое имя и местоположение, включая информацию об имени сервера и номере порта SQL Server. После этого приложение клиента устанавливает местонахождение SQL Server по имени базы данных. И наконец, приложение использует извлеченную информацию о местоположении сервера для подключения к SQL Server и начинает с ним работать. Когда сведения об SQL Server и его базах данных публикуются в AD, клиенты могут динамически локализовать серверы баз данных по имени базы. Если требуется переместить базу данных на другой сервер, достаточно будет только обновить AD.

Рисунок 1. Процесс публикации службы

Концепция публикации службы (service publication) для систем управления базами данных существует в Oracle начиная с версии 8i, и базы данных Oracle можно публиковать в AD. В Oracle, если базы данных опубликованы в AD, можно просто указать системный идентификатор базы данных (database?s system identifier, SID) как Host String, и приложение само начнет поиск в AD для локализации сетевого адреса сервера и номера порта для выполнения подключения. Например, SQL*Plus может зарегистрироваться на сервере Oracle с помощью SID базы данных. Хотя в SQL Server Query Analyzer такая функциональность не предусмотрена, можно построить клиентское приложение, которое будет осуществлять поиск в AD на основе имени базы данных и находить нужный SQL Server для подключения точно так же, как это происходит при использовании Oracle.

Применение данных SQL Server, содержащихся в AD

Теперь, когда мы убедились, что SQL Server и база данных Northwind зарегистрированы в AD, перейдем к некоторым техническим приемам, используемым для извлечения из AD связанных с SQL Server данных и работы с ними. Хотя можно использовать исключительно ADSI, я предпочитаю при поиске в AD задействовать комбинацию ADO и диалекта ADSI SQL. Код на VBScript (см. листинг 1) с помощью провайдера ADO Active Directory извлекает из AD имена всех экземпляров SQL Server (для всех компьютеров, на которых работает SQL Server и чьи имена экземпляров зарегистрированы в AD).

Кроме того, можно опросить AD и извлечь список всех зарегистрированных баз данных, выбрав атрибут mS-SQL-Name (см. листинг 2). И снова используется провайдер ADO AD. Для получения полного списка атрибутов AD следует обратиться к документации Microsoft Developer Network (MSDN) для схемы Windows 2000 AD. В частности, стоит обратить внимание на классы mS-SQL-SQLServer и mS-SQL-SQLDatabase.

Использование диалекта ADSI SQL для опроса AD имеет несколько ограничений. Например, нельзя задействовать синтаксис SELECT *; в операторе SELECT необходимо явно указывать столбцы. Нельзя применять ADSI SQL для обновления AD; вместо этого следует использовать ADSI. Последнее ограничение также распространяется на ADSI для связанных серверов. Более подробную информацию можно найти в SQL Server 2000 BOL (Updated-SP3) в статье «OLE DB Provider for Microsoft Directory Services». И наконец, поскольку AD — это иерархическая структура, проще использовать функции ADSI для получения информации о родительских контейнерах, чем работать только с диалектом ADSI SQL.

Код на VBScript (см. листинг 3) использует ADO, ADSI SQL и функции ADSI при извлечении имени сервера, на котором находится искомая база данных. Сначала выдается запрос на получение ADsPath для контейнера mS-SQL-SQLDatabase, в котором хранится база данных Northwind. Затем значение ADsPath присваивается объекту ObjADSI. После этого используется свойство ADSI Parent для извлечения mS-SQL-SQLDatabase родительского контейнера MSSQLSERVER. После извлечения ADsPath для mS-SQL-SQLServer код снова использует свойство ADSI Parent для получения имени сервера или Common-Name, которое хранится как атрибут cn.

Поиск настроек

Предположим, что в какой-то специфической базе данных требуется зарегистрировать три конфигурации (скажем, производство, разработку и обеспечение качества). Например, у нас имеется версия production, версия development и версия QA (quality assurance) базы данных Northwind, и во всех трех случаях используется одно и то же имя базы данных. Как установить, текущая база данных относится к производственной версии или к версии разработки? Информацию об этом можно хранить в одном из атрибутов mS-SQL-SQLDatabase. Нужно иметь в виду, что не все атрибуты AD могут обновляться пользователем; некоторые атрибуты обновляются только с помощью Directory System Agent (системный процесс, обеспечивающий доступ в AD). Чтобы узнать, может ли пользователь обновить какой-то специфический атрибут, нужно просмотреть документацию на атрибут класса AD.

Встроенный атрибут Flags является обновляемым, поэтому можно задействовать его для хранения индикатора конфигурации. В приведенном примере я использую кодировку для представления разных конфигураций, где 1 — это производство, 2 — разработка и 3 — обеспечение качества. Программа (см. листинг 4) показывает, как установить атрибут Flags класса mS-SQL-SQLDatabase с помощью свойств ADSI Put и SetInfo. Сначала из AD извлекаются новые значения Flags. Затем можно зарегистрировать множество копий одной и той же базы данных для каждой конфигурации, различая их по значению атрибута Flags. Например, в моем случае для конфигурации development атрибут равен 2, для QA — 3.

Локализация и подключение к серверу SQL Server


Можно модифицировать код листинга 3 для поиска нужной конфигурации базы данных Northwind и динамического подключения к серверу SQL Server на основе только указанного имени базы данных в соответствующей конфигурации. Код листинга 5 использует запрос ADSI SQL для получения значения ADsPath базы данных Northwind, у которой атрибут Flags установлен равным 1 (конфигурация production). Затем с помощью свойства ADSI Parent извлекается класс mS-SQL-SQLDatabase родительского контейнера MSSQLSERVER. После получения ADsPath объекта mS-SQL-SQLServer извлекается номер порта работающего экземпляра SQL Server; затем свойство ADSI Parent используется для получения имени сервера или dNSHostname. На основе имени SQL Server и номера порта программа выполняет доверительное подключение к SQL Server.

Публикация служб — одна из наиболее мощных функций AD. Когда SQL Server публикуется в AD как служба, клиентское приложение может быть спроектировано с таким расчетом, чтобы динамически локализовать базы данных, используя Service Publication и поисковые возможности AD. Следовательно, вручную менять клиентские настройки не потребуется. В свою очередь, просто обновив расположение базы данных в AD, администратор DBA может без труда перемещать ее по серверам без каких-либо последствий для приложения клиента, которое динамически отслеживает местонахождение базы данных, используя информацию AD.

Публикуя SQL Server в AD и разрабатывая приложения, которые используют Service Publication, можно избавиться от необходимости хранить статические конфигурационные данные для каждого клиента. В то же время администратор получает дополнительную возможность для перенастройки расположения базы данных и сокращения времени простоя при миграции баз данных между серверами.

Чед Миллер (cmille19@tampabay.rr.com) — администратор базы данных в компании Raymond James & Associates во Флориде. Имеет сертификаты MCSE и MCDBA

Что такое ADSI?

Профессионалы в области программирования баз данных хорошо знакомы с ADO и SQL, но мало кто использует инструменты программирования Active Directory (AD). Active Directory Service Interface (ADSI), подобно ODBC, имеет открытый прикладной интерфейс программирования, API. Но используется ADSI не для работы с системой управления базами данных (database management system, DBMS), а для помощи в организации доступа и управления службами каталогов (например, Windows Directory Service, Novell Directory Service (NDS) и другими службами, работа которых основана на использовании протокола Lightweight Directory Access Protocol, LDAP). Хороший обзор синтаксиса ADSI и руководство для быстрого освоения языка сценариев ADSI можно найти в материалах «Active Directory Service Interfaces Scripting Tutorial» (см. врезку «Дополнительные ресурсы»).

ASA. Настройка перехватывающей аутентификации через AD и LDAP

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

А здесь я расскажу, как используя ASA, напрямую аутентифицироваться в AD

На МСЭ часто возникает задача проверить пользователя до предоставления ему доступа к определенным ресурсам. На ASA такая проверка называется «перехватывающая аутентификация» (cut-through proxy).

Этот сервис использует инфраструктуру ААА (Authentication, Authorization, Accounting).

Примечание: в английском слове authentication нет слога «фи», который появился в русском «аутентификация» скорее всего из-за созвучия слову «идентификация». Причем, в нашем могучем языке есть и «аутентичность». Без всякого «фи» :) Не попадитесь!

Аутентификация.
Отвечает на вопрос «есть ли такой пользователь». Поиск этого пользователя может производиться как в локальной (LOCAL) базе данных, так и во внешних (TACACS+, RADIUS, AD по протоколу LDAP).

Настройка сервера LDAP подразумевает указание учетной записи пользователя из AD, с которой ASA будет входить в LDAP, тип сервера, «корень» поиска и т.д.

aaa-server protocol ldap
aaa-server () host
ldap-base-dn <корневой уровень>
ldap-scope
ldap-naming-attribute <передаваемый атрибут>
ldap-login-dn <имя пользователя ASA>
ldap-login-password <пароль на пользователя ASA>
server-type

Пример:
aaa-server AD (dmz) host 172.16.1.100
ldap-base-dn ou=Employers, dc=anticisco, dc=ru
ldap-scope subtree
ldap-naming-attribute sAMAccountName
ldap-login-dn cn=ASA, cn=users, dc=anticisco, dc=ru
ldap-login-password ASALDAPPASS
server-type microsoft

После того, как настроены сервера, самое время определить, какой трафик нам интересно проверять и не пропускать без аутентификации. На ASA за это отвечает…конечно список доступа, где строчками permit указывается такой трафик. Сам список доступа для аутентификации применяется командой

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

Например, хотим проверить весь трафик из локальной сети 10.1.1.0/24 (за интерфейсом inside), идущий во все сети, кроме 172.16.1.0/24:
access-list AUTH deny ip 10.1.1.0 255.255.255.0 172.16.1.0 255.255.255.0
access-list AUTH permit ip 10.1.1.0 255.255.255.0 any
aaa authentication match AUTH inside RAD

А как же спросить у пользователя его логин/пароль? Ведь не может же какой-нибудь пинг инициировать запрос?
Перехватить сессию и спросить логин и пароль ASA может по протоколам http/https, ftp, telnet. Если же необходимо аутентифицировать другой трафик, то надо сделать 2 телодвижения: пойти куда-нибудь за ASA по одному из указанных протоколов, ввести свои логин/пароль либо в броузере либо в telnet либо в ftp окошке. Надо учитывать, что такой трафик обязательно должен быть указан в списке доступа для интересного трафика.

Например, мы хотим, чтобы пользователь мог пойти по telnet или http на хост 1.1.1.1 и его бы спросили логин и пароль. Тогда этот трафик обязательно должен попадать в список доступа. Вот такой не подойдет, т.к. по telnet работать не будет:
access-list AUTH permit tcp any any eq 80
access-list AUTH permit udp any any

Если данные верны, ASA пропустит ваш трафик. Но только на указанное время. По умолчанию таймауты, скажем так, странные: 5 минут абсолютного времени, таймаут неактивности не отслеживается. Поменять их не только можно, но и нужно:

timeout uauth

Пример:
timeout uauth 0:15:0 inactivity
timeout uauth 20:00:00 absolute

Таким образом, с аутентификацией все просто: если более ничего не указывать, то пользователю, а вернее, ip-адресу его компьютера, будет можно все.

Гораздо более интересный момент – авторизация, то есть ограничение прав пользователя.

Для авторизации по LDAP нам нужен «костыль» — специальная конструкция, которая сопоставит атрибуту LDAP атрибут RADIUS, который поймет ASA. Такая конструкция называется

ldap attribute-map
map-name
map-value

Пример. Сопоставим атрибуту ipPhone базы AD атрибут IETF-Radius-Filter-Id (список доступа). И опишем, что если в указанном атрибуте мы получим слово «BUHG», то на пользователя применим список доступа BUH, который уже написан на ASA:
ldap attribute-map AD
map-name ipPhone IETF-Radius-Filter-Id
map-value ipPhone BUHG BUH

Важно: если в указанном атрибуте мы ничего не получили, мы его игнорируем, а если получили слово, не описанное в значениях для данного атрибута, то доступ будет запрещен. Таким образом, администратор AD может влиять на права доступа. Например, может перекрыть интернет неугодному пользователю, не прикасаясь к ASA:)

Осталось только применить этот список атрибутов в конкретном сервере LDAP

aaa-server () host
ldap-attribute-map

Пример:
aaa-server AD (dmz) host 172.16.1.100
ldap-attribute-map AD

Приятного авторизования, дорогие хабрачитатели-цисколюбы :)

ЗЫ Я сам: «На нормальных ОС это делается половиной команды» :) Так что поможем админам «ненормальных» :)

Active Directory Service Interface (ADSI) and the Read Only Domain Controller (RODC) – Avo >

UserPrincipal User = UserPrincipal . FindByIdentity ( Context , IdentityType . SamAccountName , UserName );

pSearcher . QueryFilter = new UserPrincipal ( Context ) < Surname = "Smith" , GivenName = "John" >;

PrincipalSearchResult Principal > Results = pSearcher . FindAll ();

Indeed — the .Net namespace System.DirectoryServices is nothing else than a wrapper library for ADSI and the namepsace System.DirectoryServices.AccountManagement wraps System.DirectoryServices for the ease of use.

Symptom:

Let’s have a look at a very simple AD infrastructure design:

  • single domain forest
  • central site with one Windows Server 2008 R2 DC
  • branch site with one Windows Server 2008 R2 RODC
  • Windows 7 client in branch site
  • Windows 7 client is member of Allowed RODC Password Replication Group

When the client starts up he establishes a secure channel to the RODC (client PWD is cached on the RODC) and caches the RODC in the DCLocator cache.

When executing an ADSI call on the client (like IADs::GetObject(Path) or DirectoryEntry(Path) ) against an object of the domain, this is what is going to happen:


  • ADSI instructs LSASS to detect a writable (always) Domain Controller of the domain (DsGetDcName call with Flag DS_WRITABLE_FLAG ) and passes the RWDC to ADSI.
  • ADSI performs a LDAP-Bind to this RWDC.
  • ADSI compares the modifyTimeStamp attribute of the Aggregate Schema entry on this RWDC with the locally cached value for this forest.
    If the value on the Aggregate Schema is higher than the cached one, the Aggregate Schema is downloaded into the Schema cache on the client and the cached timestamp gets updated.
  • LSASS calls again DsGetDcName with Flag DS_WRITABLE_FLAG and passes the returned RWDC to ADSI.
  • ADSI performs a LDAP-Bind to this RWDC.
  • ADSI does a base query against the object path and asks for the default attributes of this object.
    The attribute values that are returned from the AD database are stored in the ADSI Property Cache in the RAM of the client.
  • When we try to process one of the cached attributes (all attribute values are coming back as string values), ADSI must use the Schema cache to translate the attribute value into the correct syntax.
    -> ADSI verifies the Schema cache again by instructing LSASS to enumerate through the DCs of the domain containing the object. This is done by calls against

In a network trace we see, that there are up to 255 DCLocator calls against DCs — no matter how many DC we do have in the domain.

  • After the enormous number of DCLocator calls ADSI decides to use the locally cached Schema Cache — only now ADSI translates the string value of the requested property into it’s proper syntax.
  • Hence we waited approximately 60 seconds between the LDAP-Bind and the attribute retrieval.

    Cause:

    The RODC in the DCLocator cache is marked with a DCQuality flag, a combination of values based on the following enumeration:

    This results in our scenario in a value of 28 for our RODC ( DS_DS_FLAG + DS_HAS_IP + DS_KDC_FLAG + DS_TIMESERV_FLAG + DS_WS_FLAG + DS_CLOSEST_FLAG ).

    Because ADSI always requests a RWDC and never reuses the RWDC used in the last bind, ADSI tries again to get a RWDC for the Schema cache verification — with the assumption that the returned DCQuality flag is higher than the one of the cached RODC.

    In our scenario no RWDC can return a DCQuality flag including DS_CLOSEST_FLAG and therefore the DCQuality flag of the RWDC will never be higher than 19. And because there is no DS_WRITABLE_FLAG value for the DCQuality flag — every answer of the DCLocator calls is discarded and LSASS goes on searching for RWDC with a sufficiently high DCQuality flag.

    As we can see — LSASS will never find a fitting DC -> LSASS stops enumerating the DCs when reaching the internal limit of 255 calls (fortunately there is a limit — otherwise we would need a Cray computer — it’s rumoured the Cray to be the only machine that finishes an endless loop in 4 hours).

    This behavior has to be expected on every bind / search call in our code!

    AntiDot:

    • Get a RWDC into the DCLocator cache
    1. Call nltest /DSGETDC:DomainName /WRITABLE /FORCE /DS /RET_DNS on the client
    2. Use DsGetDcname wrapper in .Net namespace System.DirectoryService.ActiveDirectory to get a RWDC into the DCLocator cache.
      C# sample:

      string foundDC = DomainController . FindOne ( new DirectoryContext ( DirectoryContextType . Domain ), ActiveDirectorySite . GetComputerSite () . ToString (), LocatorOptions . ForceRediscovery | LocatorOptions . WriteableRequired ) . Name ;

    -> we circumvent the DCQuality flag issue because the now cached RWDC has no ‘unbeatable’ DCQuality flag.

      LDAP-Bind with full qualified domain name

      If we use the DNS name of the domain containing our object in our ‘bind’ * string we avoid the above issue because we need not rely on the DCLocator cache — a new DC discovery is performed via API DsGetDcOpen.
      This API uses the DCs found in _tcp.sitename._sites.dc._msdcs.contoso.com respectively tcp.sites.dc._msdcs.contoso.com and no RODC does register himself in these DNS zones -> no DCQuality flag issue -> no endless loop -> no cray computer necessary.
      Samples:

    VBS
    Set oIADsUser = GetObject ( LDAP://contoso.com/CN=TheCN,OU=TheOU,DC=contoso,DC=com )

    sDefNC = GetObject ( «LDAP://contoso.com/rootDSE» ).Get( «defaultNamingContext» )

    PoSh
    $IADsUser = [ ADSI ] LDAP://contoso.com/CN=TheCN,OU=TheOU,DC=contoso,DC=com

    $IADsUser = New-Object System.DirectoryServices.DirectoryEntry ( «LDAP://contoso.com/CN=TheCN,OU=TheOU,DC=contoso,DC=com» )

    Perl
    my $ oIADsUser = Win32::OLE->GetObject ( «LDAP://contoso.com/CN=TheCN,OU=TheOU,DC=contoso,DC=com» );

    C++
    hr = ADsOpenObject ( «LDAP://contoso.com/CN=TheCN,OU=TheOU,DC=contoso,DC=com» , Null , Null , ADS_SECURE_AUTHENTICATION , I >&IADsUser );

    .Net
    DirectoryEntry deIADsUser = new DirectoryEntry ( «LDAP://contoso.com/CN=TheCN,OU=TheOU,DC=contoso,DC=com» );

    SearchResult srIADsUser = new DirectorySearcher ( new DirectoryEntry ( «LDAP://contoso.com/CN=TheCN,OU=TheOU,DC=contoso,DC=com» ), «(&(object > , new String [] < "ADspath" , "memberOf" >) . FindOne ();


    *
    Note: There is actually no bind against AD objects. ADSI exports a GetObject bind — but this is nothing else than a base query against the obejct path in the underlying LDAP APIs.

    Use IADsOpenDsObject with Flag ADS_READONLY_SERVER

    The ADSI interface IADsOpenDsObject::OpenDsobject gives us the possibility to force ADSI to accept RODCs in an LDAP-Bind as well. This is the only ADSI interface exporting this ability.
    The implementation is there — you guess it — becauseof backward compatibility to NT4 domains with their Backup Domain Controllers (= ‘Read Only Domain Controller’)
    Samples:

    .Net:
    DirectoryEntry deIADsUser = new DirectoryEntry ( LDAP://contoso.com/CN=TheCN,OU=TheOU,DC=contoso,DC=com, null , null , Authenticationtype . Secure | Authenticationtype . ReadonlyServer | Authenticationtype . ServerBind );

  • .NET System.DirectoryServices.Protocols & System.DirectoryServices. ActiveDirectory

    In the sample code below you will find an exemplary implementation of System.DirectoryServices.Protocols (S.DS.P) for communicating with AD. S.DS.P is a .Net wrapper library for the LDAP APIs and does not rely on the DCLocator cache or the Schema cache — it’s up to the programmer to decide which DC to connect to and to take care of the property value translation into the proper syntax — the Schema cache is out of scope here -> thus we avoid the ADSI trap DCLocator cache and Schema caching.


  • using System . DirectoryServices . ActiveDirectory ;
    using System . DirectoryServices . Protocols ;
    using System . Security . Principal ;

    static string foundDC ;
    static string defNC ;
    static LdapConnection ldapAsyncCon ;
    static int AsyncPagesRetreived;
    static long AsyncEntriesOverall ;
    static bool AsyncComplete ;

    //find dc
    DiscoverDC ();

    Console . WriteLine ( «DC: <0>» , foundDC );

    //get defaultnamingcontext from rootDSE
    DefaultNamingContext ( foundDC );

    Console . WriteLine ( «DefaultNamingContext: <0>» , defNC );

    //get contructed attribute by base search
    ReadTokenGroups ( «theboss» );

    //get all groups count
    PagedSearch ( foundDC , defNC , «(objectCategory=group)» , 1000 );

    get all users count
    PagedSearch ( foundDC , defNC , «(objectCategory=user)» , 468 );

    //get all objects count — asynchronous search
    AsyncSearch ( foundDC , defNC , «(objectCategory=*)» );

    //get all objects count — asynchronous paged search
    PagedAsyncSearch ( foundDC , defNC , «(objectCategory=*)» , 500 , null );

    DirectoryContext dirCtx = new DirectoryContext ( DirectoryContextType . Domain ) ;

    LocatorOptions locOpts = LocatorOptions . ForceRediscovery |
    LocatorOptions . WriteableRequired ;

    string site = ActiveDirectorySite . GetComputerSite () . ToString () ;

    Manage Directory Resources with Active Directory Services Interface

    Do you want to use scripting or Visual Basic (VB) to enhance your user administration and network resource management? Would you like to use a C compiler to create utilities that work without modification on both Windows NT and NetWare? Do you want to add 200 user accounts with proper settings in a batch run or print a customized report of your users?

    In February, Microsoft released a specification that makes these tasks possible: Active Directory Service Interfaces (ADSI) 1.0. ADSI is not a multivendor or Internet Engineering Task Force (IETF) standard; the copyright belongs solely to Microsoft. With ADSI, you can manage the resources in your directory services—and it doesn’t matter which network environments those resources come from.

    ADSI works with true directory services, such as NetWare 4.x’s Novell Directory Services (NDS) and NT 5.0’s Active Directory (AD). ADSI also works with network environments that don’t have a directory service, such as NetWare 3.x (instead, its Bindery stores user accounts and other objects) and NT 4.0 (instead, its Security Accounts Manager—SAM—stores the user database and domain models). Of course, you need an ADSI provider for all these environments.

    When you have a true directory service, you can create directory-enabled applications with ADSI, whether you are an inhouse developer or independent software vendor (ISV). These applications go beyond network administration. They use the directory service as a distributed information store to add value to current networked applications.

    How does ADSI work? NT, NetWare, and other network operating systems have native APIs for accessing and managing network resources. ADSI just puts a uniform layer on top of the native APIs so that you don’t need to use different software development kits (SDKs) or learn different APIs to program for multiple network environments. ADSI abstracts the objects and interfaces of the underlying directory services and creates component object model (COM) objects and interfaces for you to use.

    Using ADSI might sound difficult, but it’s not. You are probably already familiar with part of ADSI’s technology: COM. ADSI uses the same COM technology as distributed component object model (DCOM) and ActiveX components. You just need to learn about those technological areas that you might not be too familiar with: the ADSI environment and ADSI objects.

    The ADSI Environment
    Both the ADSI application and provider run on your workstation. The target server does not need any ADSI support or installation. The server just receives native calls. The main platform for the 32-bit ADSI program is currently NT 4.0, although ADSI also supports Windows 95, as Figure 1 shows. ADSI talks to four different providers: ADSNW.DLL for NetWare 3.x, ADSNDS.DLL for NetWare 4.x, ADSNT.DLL for NT 4.0, and ADSLDP.DLL for NT 5.0 and Lightweight Directory Access Protocol (LDAP) 2.0. These providers convert ADSI calls to Win32 API, NetWare, or LDAP calls.

    Although you can use ADSI with different networks, it has the closest relationship with NT 5.0’s AD. ADSI’s and AD’s terminology, design, structure, and name are similar. ADSI will be the primary interface for programming to AD; Messaging API (MAPI) and the traditional C language API for LDAP will be secondary.

    You can use VB 4.0 (32-bit version), VB 5.0, Visual C++ 4.2, and Visual J++ with the Java Virtual Machine (JVM) to develop applications. According to Microsoft, you can also use any other application development tools that bind and invoke interfaces in COM objects or act as an Object Linking and Embedding (OLE) automation controller. For example, you can use ADSI with NT 5.0 Windows Scripting Host (WSH) to develop Visual Basic Script (VBScript) batches or scripts (see the sidebar «Use ADSI with WSH,» page 164).

    ADSI’s Object Architecture
    You won’t find ADSI’s object architecture complicated, but you might find it confusing because every element in the network directory service is referred to as an object. The object referral process begins when the network directory service abstracts its resources by creating objects to represent them. So, for example, users, servers, and printers become objects in the directory service (NDS or AD). ADSI, in turn, abstracts these NDS and AD objects into COM objects, as shown in Figure 2.

    AD COM objects include dependent objects. Dependent objects are COM objects that represent common functions, such as collection handling. Because you can access dependent objects only through their host AD objects, I will not discuss them further.

    AD COM objects represent elements in the underlying directory service. Two types exist: AD leaf objects and AD container objects. If an object can contain another object—just like an electronic folder can contain an electronic file—the object is an AD container object (herein referred to as simply container). If an object cannot house another object—just like a file cannot contain a folder—the object is an AD leaf object (or just leaf). Simply put, containers can house leafs, but leafs cannot house containers. Table 1 contains ADSI standard containers and leafs.

    A container isn’t limited to holding leafs. Just like an electronic folder can contain other folders, a container can hold other containers. For example, containers house AD Schema containers, which play an important role in ADSI. An AD Schema container holds the objects that define the schema for a particular part of a directory service. This container houses three different types of objects: AD Schema class objects, AD Property objects, and AD Syntax objects.

    AD Schema class objects represent the different types, or classes, of elements in a directory service. One AD Schema class object exists for each type, such as user, computer, group, and organization. The AD Schema class object tells which properties are mandatory and which are optional for the corresponding object type. For example, the AD Schema class object for user might have a mandatory property of user name and an optional property of fax number. The AD Schema class object also tells whether the object’s class is derived from other classes (and thus would support also their properties).

    The AD Property object represents one property of the AD Schema class object. Thus, in this example, you need two AD Property objects: one to represent the user name and the other to represent the fax number. If two AD Schema class objects have the same property, they share the AD Property object. For example, if the AD Schema class objects of user and organization both have the property of fax number, only one AD Property object of fax number will exist.

    Each property uses a syntax, which is represented by the AD Syntax object. So, in this example, you need two AD Syntax objects: one to represent the string syntax of the name property and another to represent the fax number syntax of the fax number property.

    The AD Schema class objects define where containers and leafs belong. A given namespace permits only certain types of containers and certain types of leafs. Similarly, each type of container permits only certain types of containers and leafs. Thus, the schema are the rules of the directory service database because they define what information the database can store.

    The schema in NT 5.0’s AD and NetWare 4.0’s NDS are extensible. You can define new object classes or redefine existing object classes. Applications are numerous, but one traditional example is to add payroll information to user objects.

    NT 4.0 and NetWare 3.0, however, have locked schema. With fixed object classes, only the directory service provider (e.g., Microsoft and Novell) has the ability to add objects that are not in the standard ADSI object set.

    It’s Time to Start
    Now that you know about ADSI’s environment and object architecture, you can start experimenting with ADSI. But first, you need to download it from http://www.microsoft.com/win32dev/netwrk/adsi.htm. To create programs or scripts with ADSI, you need the several-megabyte SDK, which includes the ADSI specification (a 100-page Word document). Then you need the 500KB-compressed runtime libraries and possibly a patch for them. You must install these libraries in each workstation that will execute ADSI applications. (NT 5.0 will include these runtime libraries.)


    After you install the downloaded files, you need to enable VB to use ADSI. In VB 5.0, simply select Project/References and check Active DS Type Library in the list of references. In VB 4.0, you first need to use the Tools menu to add the type library ActiveDS.Tlb (in System32 folder) to your Project menu. These steps let you use AD COM objects in your application.

    For the sake of simplicity, the examples from this point on will focus on how to implement ADSI on NT rather than NetWare. The examples will deal mostly with users as the objects, but the same principles apply if the objects are printers, services, or other elements.

    Browse a Little, Report a Lot
    Once you have installed the necessary files, you can browse with DSBrowse, which is in the SDK. This sample application browses your namespaces and shows objects and properties in them.

    Next, you can run several reports that will help you learn about your directory services. The reports that are most useful are the namespaces, user, and property reports.

    Namespaces correspond to the four providers: WinNT, NWCOMPAT, NDS, and LDAP. Table 2 (page 166) gives examples of names in different namespaces. To check which namespaces are installed in your computer system, you can use this code:

    Dim NamespacesObj as IADs Namespaces

    Dim obj as IADs

    Set NamespacesObj = GetObject(«ADS:»)

    For Each obj in NamespacesObj

    This exercise not only tells you which namespaces are available, but also shows you many of the steps in ADSI programming. First, you define the variables with Dim statements, usually including the letters IADs. Next you use GetObject to instantiate (or create) the object based on the path given. GetObject is an ADSI helper function and is not to be confused with a VB function with the same name. Then on the same line, you assign the object to a variable, after which you can finally use it. If your object has many elements, you can walk through them with the For Each loop.

    If you want to make a report containing all users and their home directory, you first need to use the code just given to find out the namespaces. (If you want, you can skip this step and just assume that you are using NT with the WinNT: namespace. This assumption isn’t too risky.) Next, determine which domains you have. If your namespace is only WinNT:, you can get a list of the domains from your network neighborhood. Once you know the domains, use this code:

    Dim Container As IADsContainer

    Dim Child As IADs

    Set Container = GetObject
    («WinNT://SomeDomain»)

    For Each Child In Container

    Debug.Print Child.Name + Chr$(9) + Child.HomeDirectory

    This code sets a filter to the container so that it lists only users. It ignores other objects, such as groups and computers. (You can, however, run reports on other objects in a domain. The SDK can help you with this task.) The code then uses a For Each loop to recall each user’s name and home directory.

    A property report will tell you which optional properties each user supports. (A printout of mandatory properties would be empty.) Here’s how to run the optional properties report:

    Table 3 shows sample output from this procedure.

    Another way you can access the properties of AD objects is to use the Get and Put methods. A benefit of using Get and Put is that, theoretically, you do not need to know anything about your network objects or properties beforehand. You can browse the schema and then use the property names found as variables in the Get and Put statements. (For more information on Get and Put, see the ADSI specification.)

    NT 4.0 has some shortcomings with regard to user properties. It does not report three properties (PasswordExpirationDate, AccountDisabled, and IsAccountLocked) in OptionalProperties, so you cannot use them with Get and Put. Conversely, two properties (PasswordExpired and BadLoginCount) work only with Get and Put and not the previous procedure. Thus, you might have to use both approaches.

    Another shortcoming is that you can access the properties of UserCannotChangePassword, PasswordNeverExpires, and Global/Local account type only through the UserFlags bit field property. So you have to find the right bits and do some calculations. Finally, you cannot access the dial-in settings and the properties LogonHours, HomeDirDriveLetter, PasswordLastChanged, and LastFailedLogin.

    Manipulating Objects
    When you have done enough browsing and reporting, you will likely be eager to make some changes. When manipulating objects, you need to identify both the objects and their paths. To identify the object from its path, you can use the GetObject function as in the code examples here. To identify the path to an object, you can use the ADsPath property by typing:

    You can manipulate objects in many ways using Create, Delete, Move, and Copy. Here’s an example of how to use Create to add a new user and its properties to a container in NT 4.0:

    Dim Container As IADsContainer

    Dim NewUser As IADsUser

    Set Container = GetObject
    («WinNT://SomeDomain»)

    Set NewUser = Container.Create
    («user», «Maggie»)

    NewUser.FullName = «Henderson Maggie»

    Set NewUser = Nothing

    An important element in this code is SetInfo. After you specify the object you are creating, its name, and its properties (lines 3 through 6 in the code), the client computer caches this information. The computer creates the object and adds the property values to the user database only when you use SetInfo (line 7). You do not have to use SetInfo, however, when creating a password because SetPassword (line 8) is a method and not a property.

    Another important element is the Set NewUser = Nothingstatement (line 9). Use this statement when you finish working with a COM object. Otherwise, depending on the scope of the object variable, you might not release all the memory back to the operating system.

    NT 5.0 beta includes a VBScript example program, which adds and deletes users using a Microsoft Excel worksheet. The program uses ADSI and is 170 lines long, half of which are comment lines.

    Deleting, moving, and copying objects in ADSI is as simple as creating them. The ADSI specification can show you how to perform these and other procedures. If you have questions, Microsoft has an ADSI news group at msnews.microsoft.com/microsoft.public.
    active.directory.interfaces. In addition, Microsoft’s Knowledge Base will likely contain program examples and other information. You just need to go to http://
    www.microsoft.com/kb and search on ADSI. The Microsoft Developer Network (MSDN) is another resource to tap into.

    The Best Is Yet to Come
    Although the ADSI specification is version 1.0, it performs more like a beta version. Using ADSI with NT 4.0 or NetWare is more limiting, although easier, than using the corresponding native APIs.


    This situation, however, will change next year for two reasons. First, Novell will release an ADSI provider for NDS that will likely support the NetWare environment better than Microsoft’s ADSI provider. Novell’s ADSI provider will give NetWare users a way to access NDS via COM programming. This access will be beneficial because the clients will already be using 32-bit Windows.

    Second, Microsoft will release NT 5.0 next year. ADSI is the chosen interface for NT 5.0’s AD, so ADSI will perform at full capacity. In addition, although Microsoft designed ADSI and AD at the same time, it released ADSI earlier. The earlier release will give ADSI time to mature. By the time Microsoft releases NT 5.0, ADSI’s bugs will likely be worked out.

    Microsoft has committed to using LDAP 3 in NT 5.0 if the IETF finalizes this revised protocol in time. The LDAP 3 draft specification calls for an improved referral process, better support for user authentication, extensibility, and other improvements. (For more information about LDAP 3 and how various vendors plan to use it, see Craig Zacker, «LDAP and the Future of Directory Services, Part 2,» page 191.) The use of LDAP 3 in NT 5.0 would likely bring about two changes: ADSI would get an LDAP 3 provider and LDAP 3 would update ADSI.

    If AD dominates the industry, ADSI will be beside it. But if a new programming technique replaces object-oriented COM, ADSI will vanish. However, ADSI probably won’t disappear in this millennium, so you need to take a closer look at it. ADSI is an object that represents the future.

    Записки IT специалиста

    Технический блог специалистов ООО»Интерфейс»

    • Главная
    • Настраиваем Squ >

    Настраиваем Squ >
    • Автор: Уваров А.С.
    • 20.06.2015

    Материалы о построении роутера на базе Squid — одни из самых популярных на нашем сайте. Такое решение позволяет с минимальными затратами (прежде всего на программную часть) организовать и упорядочить доступ к сети интернет на предприятии. Но рассматриваемые нами варианты предназначались преимущественно для работы в составе рабочей группы. Отсутствие интеграции с Active Directory резко снижало удобство применения такого роутера в доменных сетях, поэтому мы решили исправить это упущение.

    В процессе подготовки данного материала мы не планировали отдельно останавливаться на подготовке сервера, намереваясь использовать для этого уже существующий материал: Ubuntu Server. Настраиваем роутер NAT + DHCP + Squid3. Однако, когда количество уточнений и отличий стало превышать разумные пределы, мы решили посвятить этому вопросу отдельную статью. В тоже время мы предполагаем, что читатель знаком с вышеуказанным материалом и поэтому не будем объяснять подробно многие используемые нами настройки и не будем останавливаться на второстепенных деталях.

    Особенности интеграции с Active Directory

    В чем смысл интеграции прокси-сервера Squid в Active Directory? Скажем сразу, что если ваша основная цель — просто раздать интернет всем и без ограничений, ну разве что закрыв социальные сети, то дальше можно не читать, уже описанная нами конфигурация полностью удовлетворит ваши потребности. Основное преимущество интеграции роутера в Active Directory — это использование единой точки аутентификации и управление доступом к сети интернет на базе уже существующих в домене учетных записей и групп безопасности.

    Отсюда следуют некоторые особенности. Так прозрачный режим не поддерживает аутентификацию и от него придется отказаться, указывая настройки прокси непосредственно в настройках браузера. Этот процесс несложно автоматизировать при помощи DHCP-сервера и протокола WPAD.

    В качестве DNS-серверов, в том числе и на роутере, должны обязательно указываться только доменные DNS, по умолчанию DNS-сервером является каждый контроллер домена. По этой причине роутер не должен иметь роли DNS-сервера. Также, для обеспечения интеграции с AD, роль DHCP-сервера также следует передать Windows Server, обычно на один или несколько контроллеров домена.

    Теперь подходим к тому, ради чего все это затевалось. Аутентификация по доменным учетным записям позволяет использовать единую точку входа (SSO, Single Sign-On), когда пользователь вводит логин и пароль один раз — при входе в систему. Это достигается применением протокола Kerberos, который является способом аутентификации в AD по умолчанию. В отличии от авторов иных руководств, мы не видим смысла настраивать NTLM или Basic-аутентификацию, в первую очередь по соображениям безопасности. Тем более Kerberos поддерживают все современные операционные системы.

    Следующим шагом является авторизация на основе существующих групп безопасности, это особенно актуально при переходе с Forefront TMG или ISA Server. Это позволяет один раз настроив Linux-сервер дальнейшее управление доступом осуществлять привычным способом — через группы Active Directory, что позволяет снизить порог вхождения для администраторов.

    Так как Active Directory имеет более сложную структуру и большее количество «действующих лиц», то чтобы вы не запутались в используемых нами адресах и именах хостов мы подготовили небольшую схему:

    В наших примерах будет использоваться домен Active Directory с FQDN именем interface31.lab, за который отвечают два контроллера домена SRV-DC01 и SRV-DC02 с адресами 192.168.31.101 и 102 соответственно. Оба контроллера реализованы на базе Windows Server 2012 R2.

    Роутер выполнен на базе Ubuntu Server 14.04 (Debian 7/8) и имеет имя SRV-GW01 с адресом 192.168.31.100. Также в сети имеется группа серверов со статическими адресами 192.168.31.103-105 и клиентские ПК, адреса которым выдаются DHCP сервером из диапазона 192.168.31.111-199.

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

    Сеть настраивается традиционным образом, посредством правки конфигурационного файла /etc/network/interfaces. Примем что внешней сети соответствует интерфейс eth0, а внутренней eth1. В результате настройки у нас должно получиться примерно следующее:

    Обратите внимание, что несмотря на то, что в настройках внешнего интерфейса использован внешний адрес и шлюз, адреса DNS-серверов указаны внутренние. Также указана опция dns-search, которая определяет домен для разрешения не FQDN-имен. Это означает, что к каждому короткому имени будет автоматически добавлен указанный домен, например, srv-dc01 будет дополнено до srv-dc01.interface31.lab.

    Если вас смущает указание внутренних DNS в настройках внешней сетевой карты, то можете перенести эти строки в секцию eth1, на работу сервера это не повлияет.

    DNS-сервера провайдера или публичные DNS следует указать в разделе Серверы пересылки внутреннего DNS-сервера на любом из контроллеров домена.

    Если вы получаете сетевые настройки от провайдера по DHCP, то для использования внутренних серверов имен, вместо DNS провайдера секция eth0 должна иметь вид:

    Таким образом явно указанные настройки перекроют полученные автоматом от провайдера.

    Сохраняем содержимое файла, перезагружаемся. Проверяем наличие интернета на сервере и разрешение имен. Например, выполните команду:

    Ответить вам должен первый указанный доменный сервер имен, в нашем случае 192.168.33.101 и выдать полное FQDN-имя хоста и его IP-адрес.

    После чего проверьте разрешение внешних имен:

    Вы также должны получить ответ от внутреннего сервера. На этом настройку сети можно считать законченной.

    Настройка NAT и брандмауэра

    Базовая настройка брандмауэра принципиально ничем не отличается от варианта роутера для рабочей группы, за одним исключением. Так как наш прокси является непрозрачным, то существует возможность выхода напрямую через NAT, если по какой-то причине браузер не будет настроен на работу с прокси-сервером. Поэтому ограничим доступ по HTTP (порт 80) для всех клиентов локальной сети, за исключением серверов и отдельных хостов, которым может потребоваться прямой доступ.


    Мы считаем, что прокси-сервер нужен в первую очередь для контроля пользователей, поэтому заворачивать на него сервера и служебные хосты, которые не предоставляют доступ к интернет пользователям, не видим никакого смысла.

    Создадим и откроем файл /etc/nat

    внесем в него следующее содержимое:

    Секция #Разрешаем HTTP серверам подразумевает набор идентичных правил для каждого хоста, которому мы разрешаем выход в интернет в обход прокси. В нашем случае это адреса от 192.168.31.101 до 192.168.31.105, чтобы не загромождать пример мы написали первый и последний, разделив их многоточием (которого в реальном конфиге быть не должно).

    Сохраним файл и дадим ему права на исполнение:

    После чего можно проверить интернет на клиентах, на тех, которые входят в список исключений — он будет, на остальных нет. Другие протоколы: почта (SMTP, POP3, IMAP), FTP, HTTPS и т.п. должны работать на всех клиентах.

    Настройка синхронизации времени

    Для успешной работы с доменом Active Directory и прохождения Kerberos-аутентификации важно чтобы часы роутера были синхронизированы с часами контроллера домена.

    Затем откроем файл конфигурации /etc/ntp.conf и закомментируем все строки, начинающиеся на server. После чего добавим две свои записи:

    Как вы уже, наверное, догадались, мы закомментировали записи сторонних серверов времени и добавили в этом качестве контроллеры домена.

    Затем добавим в конец файла две строки, ограничивающие работу NTP-клиента внутренним интерфейсом:

    Сохраняем файл и перезапускаем службу:

    Чтобы убедиться, что NTP работает только на внутреннем интерфейсе, выполните:

    В выводе команды должны быть только внутренние адреса и адреса локальной петли (localhost):

    Проверить синхронизацию можно командой:

    В выводе обращаем внимание на колонки: when -время с последнего ответа сервера, pool — время опроса сервера, offset — разница времени в секундах.

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

    Настройка кеширующего прокси-сервера Squ > Внимание! Если вы перенастраиваете сервер для рабочей группы, то обязательно удалите пакет dnsmasq или иные DNS и DHCP сервера!

    Важно! Начиная с Debian 9 и Ubuntu 16.04 вместо пакета squid3 снова используется squid, также аналогичным образом следует изменить все пути, т.е. вместо /etc/squid3 использовать /etc/squid.

    Установим прокси-сервер squid3 командой:

    Откроем конфигурационный файл /etc/squid3/squid.conf и зададим минимальную конфигурацию, добавив или раскомментировав в соответствующих секциях указанные строки.

    Укажем acl элемент для локальной сети:

    Минимальный набор списков доступа:

    Интерфейсы, порты и режимы работы прокси:

    Для squid 3.1 и ниже первая строка должна выглядеть так:

    Сохраните и проверьте конфигурацию:

    Если нет ошибок, то перезапускаем squid:

    На DNS-сервере домена добавьте A-запись для нашего роутера:

    Теперь в настройках браузера укажите полное FQDN имя сервера и порт 3128:

    Так как никаких ограничений пока не установлено, то вы должны получить доступ в интернет.

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

    Доступ к Active Directory Service Interfaces

    Как получить доступ к ADSI?
    есть ли аналог в Delphi функции GetObject?

    Вот пример как это делается на VB

    Dim Container as IADsContainer
    Dim NewUser as IADsUser

    ‘ Bind to the known container.
    Set Container = GetObject(‘WinNT://MSFT’)

    ‘ Create the new Active Directory Service Interfaces User.
    Set NewUser = Container.Create(‘User’, ‘Jane’)

    ‘ Set Jane’s password.
    NewUser.AccountRestrictions.SetPassword(‘Argus’)

    ‘ Complete the operation to create the object in the directory.
    NewUser.SetInfo

    02.04.2008, 10:40

    ACTive Directory
    Друзья, опять обращаюсь к вам за помощью!! пишу диплом. кто сталкивался вот с чем: есть форма.

    Загрузка фотографий из Active Directory
    Здравствуйте. Передо мной стоит задача написания программы для поздравления пользователей.

    ADO -> Active Directory
    Всем привет подскажите, совсем варианты закончились есть два домена 1. name1.local 2. name2.ru.

    Работа с active directory в delphi
    Есть задача по созданию программы которая будет брать некоторую информацию из АД. К примеру имя.

    Запросить данные из active directory
    Доброго времени суток уважаемые гуру!! Пытался установить synapse40 взятый.

    02.04.2008, 10:40

    создание Active Directory Domain Service
    здравствуйте! если не трудно помогите в такой вот ситуации: есть ADSL модем, получающий реал айпи.

    eToken в Active Directory пропадает доступ к шарам
    Имеется сеть под управлением AD. Был поднят центр сертификации для записи сертификатов на ключи.

    Lotus\domino Directory & Active Directory
    Добрый день, столкнулся с такой проблемой. Поставил сервер Domino на win2k8R2. Сервак является и.

    Илон Маск рекомендует:  Что такое код pg_put_line
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL