Назад | Перейти на главную страницу

Группы SquidGuard и Active Directory

Я настраиваю прокси Linux с Squid и SquidGuard для фильтрации интернет-трафика.

Я знаю, как аутентифицировать пользователей в Active Directory в Squid, а затем как фильтровать доступ для пользователей с помощью SquidGuard.

Вопрос: как использовать группы Active Directory в SquidGuard вместо простых имен пользователей?

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

Я знаю, что SquidGuard не может напрямую управлять членством в группах, но он может выполнять поиск LDAP самостоятельно; но синтаксис для поиска того, является ли пользователь членом данной группы, кажется довольно загадочным, и мне не удалось найти никакой хорошей документации.

Решено.

Предполагая следующее:

- Domain name: "domain.com"
- Group name: "Internet Users"
- User name: "UserName"
- Path to group: "domain.com\OU1\OU2\Internet Users"

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

(&(memberOf=CN=Group Name,OU=OU2,OU=OU1,DC=domain,DC=com)(SAMAccountName=UserName))

Таким образом, вам придется добавить в squidGuard.conf следующее, чтобы идентифицировать членов этой группы ("% s" - это заполнитель squidGuard.conf для "имени пользователя клиента"):

src Internet_Users {
    ldapusersearch  ldap://dc.domain.com/DC=domain,DC=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=CN=Internet Users,OU=OU2,OU=OU1,DC=domain,DC=com))
}

Предостережение: это не будет работать, если написано так, как указано выше, давая вам лаконичное сообщение о "синтаксической ошибке"; это потому, что (часть) оператора обрабатывается как URL-адрес, поэтому вам нужно экранировать специальные символы, такие как запятые и пробелы; Таким образом, правильная форма будет такой:

src Internet_Users {
    ldapusersearch  ldap://dc.domain.com/DC=domain,DC=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=CN=Internet%20Users%2cOU=OU2%2cOU=OU1%2cDC=domain%2cDC=com))
}

Кроме того, чтобы избежать проблем со ссылками в Active Directory (иногда контроллер домена просто перенаправляет вас на другой, даже если вы находитесь в том же домене, которым он управляет), может быть полезно запросить глобальный каталог:

src Internet_Users {
    ldapusersearch  ldap://gc.domain.com:3268/DC=domain,DC=com?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=CN=Internet%20Users%2cOU=OU2%2cOU=OU1%2cDC=domain%2cDC=com))
}

Отказ от ответственности: я этого не делал, и я не знаком с SquidGuard. Сказав, что вот несколько возможных подходов.

1) Если вы добавите свою машину squid в домен, вы сможете разрешать группы AD и искать членство в группах AD через nss, поэтому вы сможете использовать помощник squid_unix_group. Согласно его странице руководства, у него даже есть переключатель для удаления доменной части групп AD.

2) Учитывая, что AD является своего рода сервером LDAP, я подозреваю, что вы сможете использовать squid_ldap_group, который, согласно странице руководства:

«Как и ожидалось конструкцией external_acl Squid, после указания имени пользователя и группы, за которыми следует новая строка, этот помощник выдаст либо OK, либо ERR в следующей строке, чтобы показать, является ли пользователь членом указанной группы».

3) Даже если это не сработает, вы, вероятно, сможете создать функциональный эквивалент, используя squid external_acl_type.

4) Проверить http://etutorials.org/Server+Administration/Squid.+The+definitive+guide/Chapter+12.+Authentication+Helpers/12.5+External+ACLs/ здесь упоминаются некоторые помощники (wbinfo_group, winbindd_group), которые, похоже, не были созданы / установлены в той версии squid, которую я использую.

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

Вот несколько примеров фильтров запросов: Чтобы узнать, является ли человек членом groupOfUniqueNames:

(&(cn=<GROUP_CN>)(objectClass=groupOfUniqueNames)(uniqueMember=<MEMBER_DN>))

Чтобы узнать, является ли uid членом posixGroup:

(&(cn=<GROUPCN>)(objeCtclass=posixGroup)(memberUid=<UID>))

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

Надеюсь, поможет.