Глава 12. Условия аутентификации¶
Условия аутентификации позволяют проверять статус и атрибуты аутентифицированного пользователя: имя, группу, домен, realm, ошибки аутентификации/авторизации и атрибуты клиентского сертификата.
Все условия этой главы доступны только при активной аутентификации. Если аутентификация не запрошена (отсутствует authenticate() или задано authenticate(no)), условия user=, group=, realm=, user.domain= не могут быть вычислены.
ВАЖНО: Условие
authenticated=нельзя комбинировать с действиемauthenticate()в одном правиле. Используйтеauthenticated=в отдельном правиле после блока сauthenticate().
12.1. authenticated=¶
Проверяет, прошёл ли пользователь аутентификацию в текущей транзакции. Если аутентификация была запрошена для данной транзакции, условие проверяет, были ли верифицированы учётные данные для запрошенного realm.
Синтаксис:
| Значение | Описание |
|---|---|
yes |
Учётные данные запрошенного realm верифицированы |
no |
Учётные данные не верифицированы, либо аутентификация не была запрошена |
Допустимые слои: Admin, Exception, Forward, Proxy, SSL, SSL-Intercept
Применимые транзакции: все прокси-транзакции, администраторские транзакции
Примеры:
Предоставить доступ к определённому сайту только аутентифицированным пользователям:
Запретить доступ неаутентифицированным пользователям к конкретному домену:
Разрешить доступ аутентифицированным пользователям (переопределяя предыдущий deny):
См. также:
group=(12.4),realm=(12.5),user=(12.2),user.domain=(12.3),user.authentication_error=(12.6)
12.2. user=¶
Проверяет имя аутентифицированного пользователя, ассоциированное с транзакцией. Условие доступно только если транзакция была аутентифицирована (задано authenticate() со значением отличным от no).
Синтаксис:
Формат user_name и чувствительность к регистру зависят от типа realm:
| Тип realm | Формат | Регистр | Примеры |
|---|---|---|---|
| IWA (NTLM/Kerberos) | domain\username (полный) или username (относительный) |
Без учёта регистра | user=symantec\mary.jones, user=mary.jones |
| LDAP | DN ("cn=...,dc=...") или короткое имя |
Зависит от атрибута | user="cn=mary.jones,cn=sales,dc=symantec,dc=com", user=mary.jones |
| Local (UNIX) | Имя пользователя | С учётом регистра | user=admin |
| RADIUS | Имя пользователя | Зависит от настройки сервера | user=john.smith |
Допустимые слои: Admin, Exception, Forward, Proxy, SSL, SSL-Intercept
Применимые транзакции: все прокси-транзакции, администраторские транзакции
ПРИМЕЧАНИЕ: В слое
<Forward>условие может вычислиться как NULL, если аутентифицированный клиент отсутствует.
Примеры:
; Разрешить доступ конкретному пользователю
<Proxy>
user=john.smith allow
; Запретить доступ гостевой учётной записи
<Proxy>
user!=guest allow
deny
; Список пользователей
<Proxy>
user=(admin, operator, supervisor) allow
; LDAP DN (в кавычках)
<Proxy>
user="cn=mary.jones,cn=sales,dc=symantec,dc=com" allow
См. также:
authenticated=(12.1),group=(12.4),realm=(12.5),user.domain=(12.3)
12.3. user.domain=¶
Проверяет, аутентифицирован ли клиент, является ли realm типом NTLM/Kerberos, и совпадает ли доменная компонента имени пользователя с указанным доменом.
Синтаксис:
Допустимые слои: Admin, Exception, Forward, Proxy, SSL, SSL-Intercept
Применимые транзакции: все прокси-транзакции, администраторские транзакции
ПРИМЕЧАНИЕ: В слое
<Forward>условие может вычислиться как NULL, если аутентифицированный клиент отсутствует.
Примеры:
; Разрешить доступ только пользователям корпоративного домена
<Proxy>
user.domain=CORP allow
; Запретить доступ из внешнего домена
<Proxy>
user.domain!=EXTERNAL allow
deny
; Комбинация с group= для точного контроля
<Proxy>
user.domain=CORP group=Admins allow
См. также:
authenticated=(12.1),group=(12.4),realm=(12.5),user=(12.2)
12.4. group=¶
Проверяет, аутентифицирован ли клиент и принадлежит ли он к указанной группе. Если оба условия выполнены, результат — true. Условие realm= может использоваться для проверки, аутентифицирован ли пользователь в конкретном realm. Условие недоступно, если текущая транзакция не аутентифицирована (задано authenticate(no)).
Если вы ссылаетесь на несколько realm, рекомендуется уточнять проверки групп, комбинируя их с условием realm=.
Синтаксис:
group_name — имя группы в realm по умолчанию. Требуемый формат и чувствительность к регистру зависят от типа realm.
Допустимые слои: Admin, Exception, Forward, Proxy, SSL, SSL-Intercept
Применимые транзакции: все прокси-транзакции, администраторские транзакции
ПРИМЕЧАНИЕ: В слое
<Forward>условие может вычислиться как NULL, если аутентифицированный клиент отсутствует.
Примеры:
Определение условия с группой и realm:
define condition RW_Admin
realm=LocalRealm group=RWAdmin
end
define condition RO_Admin
realm=LocalRealm group=ROAdmin
end
Разграничение доступа по группам:
<Proxy>
authenticate(LDAP_Realm)
<Proxy>
group=Administrators allow
group=Employees category="Adult Content" deny
allow
Множественные группы:
Запрет доступа для гостевой группы:
Комбинация с realm для нескольких realm:
См. также:
authenticated=(12.1),realm=(12.5),user=(12.2),user.domain=(12.3)
12.5. realm=¶
Проверяет, аутентифицирован ли клиент и вошёл ли он в указанный realm аутентификации. Если оба условия выполнены, результат — true. Условие group= может использоваться для проверки, принадлежит ли пользователь к определённой группе. Условие недоступно, если транзакция не аутентифицирована.
Если вы ссылаетесь на несколько realm, рекомендуется уточнять проверки пользователей, групп и атрибутов, комбинируя их с условием realm=.
Синтаксис:
Допустимые слои: Admin, Exception, Forward, Proxy, SSL, SSL-Intercept
Применимые транзакции: все прокси-транзакции, администраторские транзакции
ПРИМЕЧАНИЕ: В слое
<Forward>условие может вычислиться как NULL, если аутентифицированный клиент отсутствует.
Примеры:
Проверка realm и группы:
Две группы, аутентифицирующиеся через разные realm:
Определение условия с привязкой к realm:
См. также:
authenticated=(12.1),group=(12.4),user=(12.2),user.domain=(12.3)
12.6. user.authentication_error=¶
Проверяет, какая ошибка (если таковая была) возникла в процессе аутентификации пользователя. Условие вычисляется только если обнаруженная ошибка была также указана как допустимая (tolerated) через authenticate.tolerate_error().
Особенность: код ошибки выставляется при Basic- и form-аутентификации; для NTLM/Negotiate/certificate ошибки в это условие пока не передаются.
Синтаксис:
user.authentication_error={any|none|not_attempted|error1[,error2,...]}
user.authentication_error=(error1, error2, ...)
| Значение | Описание |
|---|---|
any |
True, если произошла любая ошибка аутентификации |
none |
True, если ошибок нет и аутентификация была выполнена |
not_attempted |
True, если аутентификация не была запрошена |
error |
Конкретная ошибка аутентификации (например: invalid_credentials, ldap_server_down, ldap_timeout, password_expired, account_locked, account_disabled) |
Допустимые слои: Exception, Forward, Proxy, SSL, SSL-Intercept
Применимые транзакции: все прокси-транзакции
Примеры:
Перенаправление на страницу смены пароля при истечении пароля:
<Proxy>
authenticate(LDAPRealm)
authenticate.tolerate_error(password_expired)
<Exception>
user.authentication_error=password_expired \
redirect(302, "https://password.example.com/change")
Обработка нескольких типов ошибок:
<Proxy>
authenticate(LDAPRealm)
authenticate.tolerate_error(ldap_server_down, ldap_timeout)
<Exception>
user.authentication_error=(ldap_server_down, ldap_timeout) allow
Любая ошибка аутентификации:
См. также:
user.authorization_error=(12.7),authenticated=(12.1)
12.7. user.authorization_error=¶
Особенность: отдельная фаза авторизации пока отсутствует, код ошибки авторизации не выставляется:
=noneсовпадает всегда,=anyи конкретные коды — никогда.
Проверяет, какая ошибка (если таковая была) возникла в процессе авторизации пользователя. Аналогично user.authentication_error=, но применяется к фазе авторизации (проверка прав доступа после успешной аутентификации).
Синтаксис:
user.authorization_error={any|none|not_attempted|error1[,error2,...]}
user.authorization_error=(error1, error2, ...)
| Значение | Описание |
|---|---|
any |
True, если произошла любая ошибка авторизации |
none |
True, если ошибок авторизации нет |
not_attempted |
True, если авторизация не была запрошена |
error |
Конкретная ошибка авторизации (например: communication_error, account_disabled, account_expired, insufficient_privileges) |
Допустимые слои: Exception, Forward, Proxy, SSL, SSL-Intercept
Применимые транзакции: все прокси-транзакции
Примеры:
Добавление пользователя в группу по умолчанию при ошибке авторизации из-за недоступности сервера:
<Proxy>
authenticate(LDAPRealm)
authenticate.tolerate_error(communication_error)
<Exception>
user.authorization_error=communication_error \
group=DefaultAccess allow
Обработка нескольких типов ошибок авторизации:
<Exception>
user.authorization_error=(account_disabled, account_expired) \
redirect(302, "https://hr.example.com/account-status")
См. также:
user.authentication_error=(12.6),authenticated=(12.1)
12.8. user.x509.subject= / user.x509.issuer= / user.x509.serialNumber=¶
Все три условия проверяются по сертификату клиента.
Особенности: - данные сертификата доступны только при SSL-перехвате (или mTLS) — без перехвата условие не совпадает; -
user.x509.serialNumber=— серийный номер сравнивается в hex без учёта регистра (значение в политике нормализуется); -user.x509.subject=/issuer=— сравнение всего DN в формате RFC 2253: порядок атрибутов в политике должен совпадать с порядком в сертификате.Для проверки отдельных компонент удобнее
client.certificate.common_name=/client.certificate.subject.ou=(глава 15).
Условия user.x509.* предназначены для проверки атрибутов X.509 сертификата, использованного при аутентификации в certificate realm. Первичное назначение — построение явных списков отзыва сертификатов (CRL).
user.x509.subject=¶
Проверяет поле subject X.509 сертификата, использованного для аутентификации.
subject — distinguished name в формате RFC 2253 LDAP DN с соответствующим экранированием. Сравнение учитывает регистр.
Допустимые слои: Admin, Exception, Forward, Proxy, SSL
ПРИМЕЧАНИЕ: В слое
<Forward>условие может вычислиться как NULL.
user.x509.issuer=¶
Проверяет издателя (issuer) X.509 сертификата. Результат true только для пользователей, аутентифицированных через certificate realm.
issuer_DN — distinguished name в формате RFC 2253 LDAP DN. Сравнение учитывает регистр.
Допустимые слои: Admin, Exception, Forward, Proxy, SSL
user.x509.serialNumber=¶
Проверяет серийный номер X.509 сертификата.
serial_number — шестнадцатеричная строка, чётное количество символов, до 160 бит.
Допустимые слои: Admin, Exception, Forward, Proxy, SSL
Пример: Список отзыва сертификатов:
define condition CRL
user.x509.serialNumber=0a1b2c3d4e5f user.x509.subject="CN=revoked-user,DC=example,DC=com"
; запретить все сертификаты, выданные скомпрометированным CA
user.x509.issuer="CN=Compromised CA,DC=example,DC=com"
end
<Proxy>
condition=CRL deny
Реализованные альтернативы: client.certificate.*¶
Для работы с клиентскими сертификатами Redcoat предоставляет собственные условия:
client.certificate.presented= — проверяет, предъявил ли клиент сертификат:
client.certificate.common_name= — проверяет Common Name (CN) клиентского сертификата:
client.certificate.common_name=value
client.certificate.common_name("value")
client.certificate.common_name=*.example.com ; wildcard
client.certificate.subject.ou= — проверяет Organizational Unit (OU) из subject DN. Это расширение Redcoat: в BlueCoat отдельного .ou нет — там OU проверяется через client.certificate.subject= (полный DN) по шаблону.
client.certificate.subject.ou=value
client.certificate.subject.ou("value")
client.certificate.subject.ou=Engineering* ; wildcard
Примеры с реализованными условиями:
; Разрешить доступ только при наличии клиентского сертификата
<Proxy>
client.certificate.presented=no deny
; Ограничить доступ по CN сертификата
<Proxy>
client.certificate.common_name=*.corp.example.com allow
deny
; Проверка подразделения
<Proxy>
client.certificate.subject.ou("Engineering") allow
client.certificate.subject.ou("Operations") allow
deny
См. также:
authenticated=(12.1),realm=(12.5),user=(12.2); описание условийclient.certificate.*также см. в Главе 15 (Условия SSL/TLS).
12.9. user.regex=¶
Имя как в BlueCoat.
Проверяет имя аутентифицированного пользователя регулярным выражением. Для неаутентифицированного запроса не совпадает.
Синтаксис:
Допустимые слои: <Proxy>, <Admin>.
Примеры:
12.10. user.is_guest=¶
Имя как в BlueCoat.
Истинно для гостевого (неаутентифицированного) пользователя.
Примечание: в Redcoat нет отдельных guest-аккаунтов; «гость» означает отсутствие аутентифицированного пользователя в транзакции.
Синтаксис:
Допустимые слои: <Proxy>.
Примеры:
12.11. Условия логин-сессий (user.login.*)¶
Особенность: требуют хранилища логин-сессий, которого пока нет. Условия принимаются синтаксически, но правило с ними отклоняется при загрузке (защита от случайного «реагирует на любой трафик»).
user.login.address=ip|subnet ; IP, с которого выполнен логин
user.login.count={N|N..M} ; число одновременных логинов пользователя
user.login.time=... ; давность логина