Авторизация пользователей в Eserv/3 и Eproxy/3
Используемая терминология
Для проверки прав доступа пользователей к ресурсам на серверах Eserv (почтовым ящикам POP3, IMAP, файлам HTTP, FTP) и прав приема/передачи интернет-трафика программами пользователя (внешних ресурсов через HTTP, FTP, Socks прокси, передачи почты по SMTP) в Eserv используются два основных вида управляющих списков:- списки пользователей (учетных записей)
- списки прав доступа (ACL)
Списки прав доступа — определение прав доступа авторизованного пользователя к конкретному сетевому ресурсу, требующему не-анонимного доступа. На основе этого анализа доступ предоставляется, ограничивается отдельными правами, отвергается или запрашивается переавторизация — для смены полномочий.
Для удобства управления большими списками с однотипными правами пользователей можно объединять в именованные группы, и в списках прав доступа задавать права не отдельным пользователям, а группам. Соответственно, в Eserv применяются дополнительные списки — списки групп, где описывается членство пользователей в группах.
В случаях, когда Eserv обслуживает более одной организации или подразделения/проекта или более одного интернет-домена возникают ситуации, когда невозможно (и ненужно) обеспечивать уникальность имен учетных записей (например, в каждой организации есть свой postmaster). Поэтому реализована возможность иметь несколько независимых непересекающихся списков пользователей — в виде доменов. Домены — это имена для уникальной идентификации таких общностей учетных записей. Внутри домена имя учетной записи должно быть уникально. Полное имя учетной записи состоит из имени внутри домена и имени самого домена. Такое полное имя записывается как email-адрес: имя_учетной_записи@имя_домена и является уникальным как минимум в пределах Eserv. Имя домена может соответствовать реально существующему доменному имени, принадлежащему организации, а может быть никак не связанным с интернетом. В последнем случае оно может содержать любые символы, допустимые в файловой системе. Для различения своих и чужих доменов используются списки локальных доменов. Если используются реально существующие интернет-домены, то Eserv может отличать свои домены от чужих автоматически — по DNS.
При авторизации пользователь может явно указывать имя@домен — в этом случае Eserv сразу знает, по какому домену проводить авторизацию этого пользователя. Если домен не указывается, применяется домен по умолчанию. Это может быть один жестко заданный в настройках домен, а также может выбираться в зависимости от сетевого интерфейса (IP-адреса сервера), к которому подключился клиент. В multihomed-системах это позволяет создать на каждом IP свой отдельный "виртуальный" сервер с привязкой домена к IP-адресу — в результате пользователям не нужно вводить домен при авторизации на своем сервере. Домен по IP может определяться автоматически по DNS, если используются реальные интернет-домены. Но в общем случае надежнее и намного быстрее пользоваться списком соответствия домены — IP.
Часто бывает удобно автоматически назначать не только домен, но и имя пользователя (учетной записи). Если IP-адреса пользовательских компьютеров фиксированы, и если пользователи работают только со своих компьютеров, то можно назначать имя пользователя по IP-адресу подключившегося к серверу клиента. В Eserv это называется IP-авторизацией. Соответствие имен учетных записей клиентским IP задается в списке IP-авторизации.
При использовании SSL/TLS-соединений с сервером Eserv также позволяет использовать автоматическую авторизацию по пользовательским X.509-сертификатам. Эта возможность реализована в ядре Eserv осенью 2003, но пока не поддерживается в интерфейсе управления (на февраль 2004).
Как было сказано выше, домены — это фактически списки учетных записей. Когда становятся известны пользовательские данные — имя, пароль, домен — сервер может проводить авторизацию пользователя по заданному для данного домена списку. Физически списки пользователей домена могут храниться различными способами — быть записаны в текстовых файлах разных форматов, в базах данных доступных по разным протоколам, совпадать с учетными записями локального Windows NT, другого компьютера, контроллера домена, веб-сервера и т.п. В Eserv поддерживаются перечисленные способы доступа к спискам и эти способы могут дополняться, т.к. все способы реализованы в виде подключаемых модулей — plugin'ов. Логически работа с любым списком единообразна — нужно иметь возможность выяснить, есть ли такой пользователь в списке, совпадает ли пароль, входит ли пользователь в заданную группу, и т.п. Однако в зависимости от способа авторизации требуются дополнительные параметры — имя файла со списком, либо параметры доступа к базе данных, имя NT-сервера и т.д. По аналогии с источниками данных (DSN — data sources) в Windows, в Eserv используются список источников авторизации (AuthSources). В списке задаются имена источников (произвольные), имена методов авторизации (auth_nt, auth_e2, auth_md5, auth_odbc, ... — имена соответствующих plugin'ов) и параметры доступа к конкретным спискам в зависимости от метода авторизации. А в списке локальных доменов указывается только имя источника авторизации — оно используется как ссылка на список источников. Если в этих списках обнаружено несоответствие (нет заданного пользователем домена или в списке источников авторизации нет указанного в списке локальных доменов источника), то используется метод авторизации по умолчанию, заданный в настройках сервера.
Конкретная реализация в базовой конфигурации Eserv и Eproxy
В Eserv3.ini по умолчанию принята авторизация AuthDomains — выбор способа авторизации в зависимости от домена. При авторизации выполняется следующая последовательность действий:- предварительный "отсев" по черным и белым спискам по IP для конкретного сервиса
- для протоколов, допускающих анонимную работу (SMTP, HTTP, proxy) предварительная IP-авторизация
- явная авторизация, если переданы пользовательские имя/пароль/домен
- если домен не задан, то установка домена по умолчанию по списку Lists[DomainIP] либо Server[DefaultDomain], если в DomainIP не указано соответствие для текущего IP
- по домену в списке локальных доменов Lists[LocalDomains] находится имя источника авторизации, а если домен не найден, то используется метод авторизации по умолчанию — AUTH[AuthMethod]
- по имени источника в списке источников авторизации AUTH[AuthSources] ищется метод авторизации и его параметры, а если источник не наден, то используется метод авторизации по умолчанию — AUTH[AuthMethod]
- выполняется правило DoLogin для найденного источника авторизации. При успешной авторизации переменная UID содержит ненулевое число. Далее это значение может использоваться при анализе прав доступа к конкретному серверу/ресурсу. Правило "LoggedAs: user" возвращает истину, если имя учетной записи user, и UID не равен нулю. ...
IP-авторизация
Автоматическая авторизация удобна для тех протоколов, в которых не предусмотрена обязательная явная авторизация, и таким образом так или иначе существует "пользователь по умолчанию" или "права по умолчанию". К таким протоколам относятся HTTP, HTTP-proxy, SMTP, Socks4. Все перечисленные протоколы, кроме Socks4, допускают и явную авторизацию. IP-авторизация в этом случае позволяет автоматически устанавливать пользователя, чьи права должны применяться по умолчанию, и таким образом регулировать права без явного запроса имени:пароля у пользователя. При нехватке "автоматических" прав можно запросить явную авторизацию для повышения прав.В POP3, IMAP, FTP, Socks5 авторизация всегда явная (даже в случае "анонимных" FTP клиентская программа всегда использует команды протокола USER,PASS).
IP-авторизация берет IP-адрес подключившегося клиента и сверяет со списком, в котором заданы соответствия IP-подсеть — имя. При попадании IP клиента в заданную подсеть клиент автоматически считается авторизованным с именем "имя".
В текущей версии Eproxy для HTTP-proxy используется Eserv/2-совместимый формат списка IP-авторизации
IP-Auth: IP_адрес маска имя_пользователя и задается в файле CommonPlugins\plugins\auth_lib\IpAuth.rules.txt
В текущей версии Eserv SMTP-сервера IP-авторизация объединена с белым списком IP — SMTP[IpWhiteList], в веб-интерфейсе управляется через http://localhost:3140/main/CONF/lists/smtp/IpWhiteList.txt Указываемый в последнем столбце логин назначается по умолчанию при подключении клиента с подходящим под маску IP-адресом.
FAQ
Нужно ли пользователю подтверждать свои имя и пароль, можно ли использовать этот метод при установке Eproxy3 на контроллере домена, на сколько медленнее идет авторизация при этом по сравнению с IPAuth, auth_md5
Подтверждать имя:пароль не нужно. При авторизации по доменам NT имя и пароль, введенные пользователем, передаются для проверки на компьютер или домен ActiveDirectory, имя которого указано в источнике авторизации. Если указать "." (точка) вместо имени компьютера, то используются локальные учетные записи NT того компьютера, на котором установлен Eserv. Скорость проверки паролей в auth_nt сильно зависит от конфигурации NT и сети, и от к-ва пользователей, но обычно медленнее, чем IP-Auth и auth_md5.Как правильно настроить определенный метод (например упомянутый выше доменный)
Сначала в списке источников авторизации (AuthSources.txt) добавить новый источник с требуемыми вам параметрами (если там такого нет), потом в списке локальных доменов добавить домен, ссылающийся на этот источник. Либо, если ничего не настраивать в "свежеустановленном" Eserv, будет по умолчанию использоваться авторизация auth_md5 по списку UserList.txt — этот список можно заполнить через веб-интерфейс.Если я правильно понимаю, при настройке источника авторизации списоб — вещь определенная и выбор у меня только из того, что указано в исходных (постинсталляционных) файлах, а наименование — могу указывать, что на ум придет, а потом ссылаться на него там где нужно.
Верно, наименование источника авторизации роли не играет, это имя используется только для ссылок.Для определения имени пользователя используется база пользователей из Active Directory? И вводить имя и пароль от пользователя не требуется (как при IP-авторизации)? Как происходит проверка пароля — опишите механизм, пожалуйста.
Вводить пароль не потребуется только в случае IP-авторизации. Если используется авторизация auth_nt, и в качестве параметра указывается домен Active Directory или имя сервера с контроллером домена, то Eserv/Eproxy сможет там авторизоваться, если у машины, на которой установлен Eserv, есть права на эту операцию (как правило, машина должна быть членом домена, плюс Eserv должен работать сервисом под учетной записью LocalSystem). В старые версии Eproxy, а также в текущие версии Eserv (начиная с 09.02.2004) входит скрипт http://eserv:3140/nt/users.html, который позволяет управлять пользователями и группами на NT-сервере — если это удается через веб-интерфейс, значит и для авторизации прав хватит.Хотелось бы вообще отвязаться от "списков пользователей" в Eproxy.
Тогда можно просто не требовать авторизации в ACL в Eproxy — будут допускаться все локальные пользователи. Если разным пользователям нужно дать разные права на доступ через прокси, то придется списки использовать — если не имён, то хотя бы IP. При подключении клиента сервер изначально ничего не знает о нем, кроме его IP...Как мне давать инет не всей сети, а только некоторым её членам, скажем с ip=192.168.0.1, 192.168.0.4 и др?
В http://localhost:3140/main/CONF/lists/proxy/HostBlackList.txt есть пример с ограничением доступа к сайту www.fastmoneyforfree.com пользователю с IP 10.1.1.20:www.fastmoneyforfree.com * 0 PeerIP= 10.1.1.20
Если добавить запись
* 0 0 PeerIP= 10.1.1.20
То доступ этому IP будет ограничен ко всем сайтам. Аналогично в белом списке можно разрешать доступ. Белый список имеет приоритет. Т.е. если если в черном списке всем запретить (* 0 0 0), то в белом можно будет разрешать избранным — авторизованным по имени пользователя (* имя 0 0) или по IP (* 0 0 PeerIP= 10.1.1.3). Здесь 0 — обозначение пустого поля — в веб-интерфейсе так и вводите, а если напрямую редактируете файл, то просто ставьте ;""; или ;;. срабатывает только первое правило, подходящее под маску хоста (в вашем случае "*"). Если нужно разрешить несколько IP, можно использовать сетевые маски, например
PeerIP:Mask= 192.168.1.0:255.255.255.0 или перечислить конкретные IP через OR:
PeerIP= 192.168.1.2 PeerIP= 192.168.1.3 OR PeerIP= 192.168.1.4 OR
Либо использовать IP-авторизацию.
См. также FAQ