С помощью существующего протокола единого входа OpenID Connect 10 страница




 

6.5. Аутентификация пользователей с помощью существующего протокола единого ... v 81

Обсуждение

 
Для создания JWK существует множество библиотек на разных язы- ках. Рекомендуется создать службу ключей, которая будет центральным органом JWK для создания и ротации ваших ключей с регулярным ин- тервалом. Для повышения безопасности рекомендуется делать ваши JWK такими же безопасными, как и сертификаты SSL/TLS. Защитите свой ключевой файл соответствующими правами доступа пользовате- ля и группы. Хранение их в памяти на вашем хосте – лучший вариант. Это можно сделать, создав файловую систему в памяти, такую как ramfs. Ротация ключей с регулярным интервалом также важна; вы можете со- здать службу ключей, которая создает открытые и закрытые ключи и предлагает их приложению и NGINX через API.

 
См. также:

https://tools.ietf.org/html/rfc7517

 

6.5. Аутентификация пользователей

с помощью существующего протокола единого входа OpenID Connect

Задача

Вам нужно перенести проверку подлинности с помощью OpenID Con- nect в NGINX Plus.

Решение

Используйте модуль JWT, поставляемый с NGINX Plus, для защиты местоположения или сервера и дайте директиве auth_jwt указание ис- пользовать $cookie_auth_token в качестве токена для проверки:

location /private/ {

auth_jwt "Google Oauth" token=$cookie_auth_token; auth_jwt_key_file /etc/nginx/google_certs.jwk;

}

В этой конфигурации мы направляем NGINX Plus для защиты пути

/private/ URI с проверкой JWT. В OpenID Connect используется куки-файл

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

должны указать NGINX искать токен в этом куки-файле, а не в располо-


 

82 v Глава 6. Аутентификация                                                                              

жении по умолчанию NGINX Plus. Для местоположения auth_jwt_key_file

задан произвольный путь, который мы рассмотрим в рецепте 6.6.

Обсуждение

 
Данная конфигурация демонстрирует, как можно проверить веб-то- кен JSON OpenID Connect JSON Google OAuth 2.0 с помощью NGINX Plus. Модуль аутентификации JWT NGINX Plus для протокола HTTP способен проверить любой JWT-токен, который соответствует RFC для специфи- кации JSON Web Signature, мгновенно активируя любые полномочия системы единого входа, использующие JWT-токены на уровне NGINX Plus. Протокол OpenID 1.0 – это уровень поверх протокола аутентифика- ции OAuth 2.0, который добавляет идентичность, позволяя использовать JWT для подтверждения личности пользователя, отправившего запрос. С помощью подписи токена NGINX Plus может проверить, что токен не был изменен, с того момента как он был подписан. Таким образом, Google использует метод асинхронной подписи и позволяет распростра- нять общедоступные JWK, храня при этом свой закрытый JWK в тайне.

NGINX Plus также может управлять потоком с кодом подтверждения

 
для OpenID Connect 1.0, что позволяет NGINX Plus выступать в роли ре- транслятора для OpenID Connect. Эта возможность обеспечивает интег- рацию с большинством основных поставщиков удостоверений, включая CA Single Sign-On (ранее SiteMinder), ForgeRock OpenAM, Keycloak, Okta, OneLogin и Ping Identity. Дополнительную информацию и справочную реализацию NGINX Plus в качестве ретранслятора для аутентификации с OpenID Connect можно найти в репозитории OpenID Connect GitHub NGINX Inc (https://github.com/nginxinc/nginx-openid-connect).

См. также:

https://www.nginx.com/blog/authenticating-users-existing-applications- openid-connect-nginx-plus/

https://openid.net/connect/

6.6. Получение ключа в формате JSON

От Google

Задача

Вам необходимо получить ключ в формате JSON от Google, чтобы использовать его при проверке токенов OpenID Connect с помощью NGINX Plus.


 

                                              6.6. Получение ключа в формате JSON от Google    v 83

Решение

Используйте Cron для запроса нового набора ключей каждый час, чтобы гарантировать, что ключи всегда актуальны:

0 * * * * root wget https://www.googleapis.com/oauth2/v3/ \ certs-O /etc/nginx/google_certs.jwk

 
Этот фрагмент кода представляет собой строку из файла crontab. Unix- подобные системы имеют множество опций, где могут находиться фай- лы crontab. У каждого пользователя будет пользовательский crontab, а также ряд файлов и каталогов в каталоге /etc/.

Обсуждение

Cron – это распространенный способ запуска запланированной за- дачи в Unix-подобной системе. Следует регулярно выполнять ротацию ключей в формате JSON, чтобы обеспечить их безопасность и, в свою очередь, безопасность своей системы. Чтобы у вас всегда был самый актуальный ключ от Google, вам нужно регулярно проверять наличие новых JWK. Cron – один из способов сделать это.

См. также:

 

https://linux.die.net/man/8/cron


 

Глава 7

Контроль безопасности

 

7.0. Введение

 
Безопасность осуществляется по уровням, и в вашей модели безопас- ности должно быть несколько уровней, чтобы она была действительно прочной. В этойглаве мы рассмотрим различные способы защиты ваших веб-приложений с помощью NGINX и NGINX Plus. Вы можете исполь- зовать многие из этих методов обеспечения безопасности в сочетании друг с другом, чтобы помочь повысить защиту. Ниже приводится ряд разделов, посвященных вопросам безопасности, где рассматриваются функции NGINX и NGINX Plus, которые могутпомочь при защите вашего приложения. Вы можете заметить, что в этойглаве не затрагивается одна из крупнейших функций безопасности NGINX, модуль ModSecurity 3.0, который превращает NGINX в брандмауэр веб-приложений. Чтобы уз- нать больше о возможностях WAF, скачайте «ModSecurity 3.0 и NGINX: Краткое руководство по началу работы» (https://www.nginx.com/resources/ library/modsecurity-3-nginx-quick-start-guide/).

7.1. Доступ на основе IP-адреса

Задача

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

Решение

Используйте модуль доступа по протоколу HTTP для управления до- ступом к защищенным ресурсам:

location /admin/ { deny 10.0.0.1;


 

7.2. Разрешение совместного использования ресурсов между разными источниками v 85

 
allow 10.0.0.0/20; allow 2001:0db8::/32; deny all;

}

 

Данный блок разрешает доступ с любого адреса IPv4 в 10.0.0.0/20, кро- ме 10.0.0.1, доступ с IPv6-адресов в подсети 2001:0db8::/32 и возвращает ошибку 403 для запросов, исходящих с любого другого адреса. Директи- вы allow и deny действительны в контексте HTTP, сервера и местополо- жения. Правила проверяются последовательно, пока не будет найдено соответствие для удаленного адреса.

Обсуждение

 
Защита ценных ресурсов и услуг в интернете должна осуществляться в слоях. NGINX предоставляет возможность быть одним из этих слоев. Директива deny блокирует доступ к данному контексту, в то время как директива allow может использоваться для разрешения подмножеств заблокированного доступа. Вы можете использовать IP-адреса, IPv4 или IPv6, диапазоны блоков бесклассовой адресации, ключевое слово all и сокет Unix. Обычно при защите ресурса можно разрешить блок внутренних IP-адресов и запретить отовсюду.

7.2. Разрешение совместного использования ресурсов между разными источниками

Задача

Вы обслуживаете ресурсы из другого домена и вам нужно разрешить совместное использование ресурсов между разными источниками (CORS), чтобы браузеры могли использовать эти ресурсы.

Решение

Измените заголовки на основе метода request, чтобы активировать

CORS:

map $request_method $cors_method { OPTIONS 11;

GET 1;

POST 1;

default 0;


 

86 v Глава 7. Контроль безопасности                                                                      

 

}

server {

...

location / {

 
if ($cors_method ~ '1') {

add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';

add_header 'Access-Control-Allow-Origin' '*.example.com';

add_header 'Access-Control-Allow-Headers' 'DNT,

Keep-Alive, User-Agent,

X-Requested-With, If-Modified-Since, Cache-Control, Content-Type';

}

if ($cors_method = '11') {

add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain; charset=UTF-8'; add_header 'Content-Length' 0;

return 204;

 
}

}

}

 

В этом примере происходит много всего, что было сжато при ис- пользовании карты для группировки методов GET и POST. Метод запроса OPTIONS возвращает предварительный запрос клиенту о правилах CORS этого сервера. Методы OPTIONS, GET и POST разрешены правилами CORS. Установка заголовка Access-Control-Allow-Origin позволяет также исполь- зовать контент, обслуживаемый этим сервером, на страницах проис- хождения, которые соответствуют этому заголовку. Предварительный запрос можно кешировать для клиента на 1 728 000 секунд, или 20 дней.

Обсуждение

Такие ресурсы, как JavaScript, используют технологию CORS, когда запрашиваемый ими ресурс находится в домене, отличном от их собст- венного. Когда запрос рассматривается как предполагающий совмест-


 

                                                             7.3. Шифрование на стороне клиента v 87

 
ное применение источников, браузер должен соблюдать правила CORS. Браузер не будет использовать ресурс, если у него нет заголовков, ко- торые конкретно разрешают его использование. Чтобы наши ресурсы могли использоваться другими поддоменами, мы должны установить заголовки CORS, что можно сделать с помощью директивы add_header. Если запрос – это метод GET, HEAD или POST со стандартным типом контен- та, и у запроса нет специальных заголовков, браузер выполнит запрос и проверит только источник. Другие методы запроса заставят браузер выполнить предварительный запрос, чтобы проверить условия серве- ра, которому он будет подчиняться для этого ресурса. Если вы не уста- новите эти заголовки надлежащим образом, браузер выдаст ошибку при попытке использовать этот ресурс.

7.3. Шифрование на стороне клиента

Задача

 
Вам необходимо зашифровать трафик между вашим сервером NGINX

и клиентом.

Решение

Используйте один из SSL-модулей, например ngx_http_ssl_module или

ngx_stream_ssl_module, для шифрования трафика:

http { # All directives used below are also valid in stream server {

listen 8433 ssl;

ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5;

ssl_certificate /etc/nginx/ssl/example.pem; ssl_certificate_key /etc/nginx/ssl/example.key; ssl_certificate /etc/nginx/ssl/example.ecdsa.crt; ssl_certificate_key /etc/nginx/ssl/example.ecdsa.key; ssl_session_cache shared:SSL:10m;

ssl_session_timeout 10m;

}

}

 

Данная конфигурация настраивает сервер на прослушивание порта 8443, зашифрованного с помощью SSL. Сервер принимает протоколы SSL версий TLSv1.2 и TLSv1.3. Для применения данным сервером рас-


 

 
88 v Глава 7. Контроль безопасности                                                                            

крываются два набора местоположений сертификата и пар ключей. Серверу предписывается применять наивысшую предлагаемую его клиентом неприступность при ограничении небольшим числом, не яв- ляющимся безопасным. Поскольку мы предоставили некую пару клю- чей ECC (Elliptic Curve Cryptopgraphy), наивысшим приоритетом обла- дает именно шифрование ECC. Имеющиеся кеш SSL сеанса и тайм-аут делают для исполнителей возможным кешировать и сохранять пара- метры сеанса на заданный промежуток времени. Существует большое число прочих параметров кеширования сеанса, которые способствуют производительности и безопасности для любых видов вариантов при- менения. Вы можете использовать параметры кеширования сеанса сов- местно друг с другом. Однако если определять параметр без значения по умолчанию, это отключит значение по умолчанию, которое встроено в кеширование сеанса.

 
Обсуждение

Безопасные транспортные уровни являются наиболее распростра- ненным способом шифрования информации при передаче. На момент написания этих строк предпочтительнее использовать протокол TLS вместо SSL, потому что версии SSL с 1 по 3 теперь считаются небезопас- ными. Хотя имя протокола можетотличаться, TLS по-прежнему устанав- ливает уровень защищенных сокетов. NGINX позволяет вашей службе защищать информацию между вами и вашими клиентами, что, в свою очередь, защищает клиента и ваш бизнес. При использовании подпи- санного сертификата необходимо объединить сертификат с цепочкой сертификатов центра сертификации. Когда вы объединяете свой сер- тификат и цепочку, ваш сертификат должен находиться над цепочкой в файле. Если ваш центр сертификации предоставил большое количество файлов в цепочке, он также может указать порядок их размещения. Кеш SSL-сессии повышает производительность благодаря отсутствию согла- сования шифров и версий SSL/TLS.

При тестировании было установлено, что сертификаты ECC быстрее,

чем аналогичные сертификаты RSA. Размер ключа меньше, что при- водит к возможности обслуживать больше SSL/TLS-соединений и с бо- лее быстрым квитированием. NGINX позволяет настраивать несколько сертификатов и ключей, а затем обслуживать оптимальный сертификат для клиентского браузера. Это дает вам возможность воспользоваться преимуществами новой технологии, но при этом обслуживать старых клиентов.


 

                                                                      7.4. Восходящее шифрование v 89

См . также : https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_con fi gurationshttps://ssl-con fi g.mozilla.org

https://www.ssllabs.com/ssltest/

 

7.4.

 
Восходящее шифрование

Задача

Вам требуется шифровать трафик между NGINX и конкретной служ- бой восходящего потока, а также устанавливать особые правила согла- сования для регулировок надежности или когда данный восходящий поток пребывает вне вашей безопасной сетевой среды.

 
Решение

Для задания правил SSL вам следует применить директивы SSL для своего модуля посредника HTTP:

location / {

proxy_pass https://upstream.example.com; proxy_ssl_verify on; proxy_ssl_verify_depth 2; proxy_ssl_protocols TLSv1.2;

}

 

Эти директивы посредника устанавливают особые правила SSL чтобы подчиняться NGINX. Эти настраиваемые директивы гарантируют, что NGINX удостоверяет: данный сертификат и цепочка в данной службе восходящего потока подтверждены до двух сертификатов в глубину. Соответствующая директива proxy_ssl_protocols определяет, что этот NGINX будет применять только TLS с версией 1.2. По умолчанию NGINX не проверяет сертификаты восходящего потока и применяет все версии TLS.

Обсуждение

Имеющиеся директивы для нашего модуля посредника HTTP очень многочисленны, а если вам требуется шифровать трафик восходящего потока, следует, по крайней мере, включить установление подлинно- сти. Вы можете выступать посредником поверх HTTPS, изменяя прото- кол в том значении, которое передается в соответствующую директиву


 

90 v Глава 7. Контроль безопасности                                                                            


Дата добавления: 2021-01-21; просмотров: 116; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!