Перейти к содержанию

Глава 12. Условия аутентификации

Условия аутентификации позволяют проверять статус и атрибуты аутентифицированного пользователя: имя, группу, домен, realm, ошибки аутентификации/авторизации и атрибуты клиентского сертификата.

Все условия этой главы доступны только при активной аутентификации. Если аутентификация не запрошена (отсутствует authenticate() или задано authenticate(no)), условия user=, group=, realm=, user.domain= не могут быть вычислены.

ВАЖНО: Условие authenticated= нельзя комбинировать с действием authenticate() в одном правиле. Используйте authenticated= в отдельном правиле после блока с authenticate().

12.1. authenticated=

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

Синтаксис:

authenticated={yes|no}
Значение Описание
yes Учётные данные запрошенного realm верифицированы
no Учётные данные не верифицированы, либо аутентификация не была запрошена

Допустимые слои: Admin, Exception, Forward, Proxy, SSL, SSL-Intercept

Применимые транзакции: все прокси-транзакции, администраторские транзакции

Примеры:

Предоставить доступ к определённому сайту только аутентифицированным пользователям:

<Proxy>
    client.address=10.10.10.0/24 authenticate(LDAPRealm)

<Proxy>
    deny authenticated=no

Запретить доступ неаутентифицированным пользователям к конкретному домену:

<Proxy>
    server_url.domain=xyz.com deny authenticated=no

Разрешить доступ аутентифицированным пользователям (переопределяя предыдущий deny):

<Proxy>
    allow authenticated=yes

См. также: group= (12.4), realm= (12.5), user= (12.2), user.domain= (12.3), user.authentication_error= (12.6)

12.2. user=

Проверяет имя аутентифицированного пользователя, ассоциированное с транзакцией. Условие доступно только если транзакция была аутентифицирована (задано authenticate() со значением отличным от no).

Синтаксис:

user=user_name
user!=user_name
user=(user1, user2, ...)

Формат 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, и совпадает ли доменная компонента имени пользователя с указанным доменом.

Синтаксис:

user.domain=windows_domain_name
user.domain!=windows_domain_name

Допустимые слои: 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=group_name
group!=group_name
group=(group1, group2, ...)

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

Множественные группы:

<Proxy>
    group=(Administrators, Operators, SuperUsers) allow

Запрет доступа для гостевой группы:

<Proxy>
    group!=Guests allow
    deny

Комбинация с realm для нескольких realm:

<Proxy>
    realm=LDAPRealm group=Engineering allow
    realm=LocalRealm group=Admins allow
    deny

См. также: authenticated= (12.1), realm= (12.5), user= (12.2), user.domain= (12.3)

12.5. realm=

Проверяет, аутентифицирован ли клиент и вошёл ли он в указанный realm аутентификации. Если оба условия выполнены, результат — true. Условие group= может использоваться для проверки, принадлежит ли пользователь к определённой группе. Условие недоступно, если транзакция не аутентифицирована.

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

Синтаксис:

realm=authentication_realm

Допустимые слои: Admin, Exception, Forward, Proxy, SSL, SSL-Intercept

Применимые транзакции: все прокси-транзакции, администраторские транзакции

ПРИМЕЧАНИЕ: В слое <Forward> условие может вычислиться как NULL, если аутентифицированный клиент отсутствует.

Примеры:

Проверка realm и группы:

<Proxy>
    realm=corp group=all_staff allow

Две группы, аутентифицирующиеся через разные realm:

<Proxy>
    realm=LDAPRealm group=Engineering allow
    realm=RADIUSRealm group=Contractors allow
    deny

Определение условия с привязкой к realm:

define condition CorpUser
    realm=LDAPRealm
end

<Proxy>
    condition=CorpUser allow

См. также: 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

Любая ошибка аутентификации:

<Exception>
    user.authentication_error=any \
        redirect(302, "https://auth-error.example.com/")

См. также: 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 сертификата, использованного для аутентификации.

user.x509.subject=subject

subject — distinguished name в формате RFC 2253 LDAP DN с соответствующим экранированием. Сравнение учитывает регистр.

Допустимые слои: Admin, Exception, Forward, Proxy, SSL

ПРИМЕЧАНИЕ: В слое <Forward> условие может вычислиться как NULL.

user.x509.issuer=

Проверяет издателя (issuer) X.509 сертификата. Результат true только для пользователей, аутентифицированных через certificate realm.

user.x509.issuer=issuer_DN

issuer_DN — distinguished name в формате RFC 2253 LDAP DN. Сравнение учитывает регистр.

Допустимые слои: Admin, Exception, Forward, Proxy, SSL

user.x509.serialNumber=

Проверяет серийный номер X.509 сертификата.

user.x509.serialNumber=serial_number

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.presented={yes|no}
client.certificate.presented          ; подразумевается =yes

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.

Проверяет имя аутентифицированного пользователя регулярным выражением. Для неаутентифицированного запроса не совпадает.

Синтаксис:

user.regex="pattern"

Допустимые слои: <Proxy>, <Admin>.

Примеры:

<Proxy>
    ; Сервисные аккаунты svc-*
    user.regex="^svc-" deny

12.10. user.is_guest=

Имя как в BlueCoat.

Истинно для гостевого (неаутентифицированного) пользователя.

Примечание: в Redcoat нет отдельных guest-аккаунтов; «гость» означает отсутствие аутентифицированного пользователя в транзакции.

Синтаксис:

user.is_guest={yes|no}

Допустимые слои: <Proxy>.

Примеры:

<Proxy>
    user.is_guest=yes category=Restricted deny

12.11. Условия логин-сессий (user.login.*)

Особенность: требуют хранилища логин-сессий, которого пока нет. Условия принимаются синтаксически, но правило с ними отклоняется при загрузке (защита от случайного «реагирует на любой трафик»).

user.login.address=ip|subnet     ; IP, с которого выполнен логин
user.login.count={N|N..M}        ; число одновременных логинов пользователя
user.login.time=...              ; давность логина