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



 
proxy_pass. Тем не менее это не подтверждает имеющийся сертификат восходящего потока. Прочие директивы, такие как proxy_ssl_certificate и  proxy_ssl_certificate_key,  позволяют  вам  ограничивать шифрование восходящего потока расширенной безопасностью. Вы также можете предписать proxy_ssl_crl или некий список аннулированных сертифика- тов, перечисляющий сертификаты, которые более не рассматриваются как допустимые. Такие директивы посредника SSL помогают упрочнять каналы взаимодействия вашей системы внутри вашей собственной се- тевой среды или поверх общедоступного интернета.

7.5. Безопасность местоположения

Задача

 
Вам требуется при помощи ключа безопасности защитить блок location.

Решение

Используйте модуль безопасных ссылок и директиву secure_link_ secret, чтобы ограничить доступ к ресурсам для пользователей, у кото- рых есть защищенная ссылка:

location /resources { secure_link_secret  mySecret;

if ($secure_link = "") { return 403; }

 

rewrite ^ /secured/$secure_link;

}

 

location /secured/ { internal;

root /var/www;

}

 

Данная конфигурация создает некий внутренний и повернутый в общедоступную сторону блок location. Развернутый в сторону об- щей доступности блок location/resources будет возвращать ошибку 403 Forbidden всякий раз, когда URI его запроса содержит некую строку хе- ширования md5, которая не может быть проверена тем кодом безопасно- сти, что предоставляется в установленной директиве secure_link_secret. Значение переменной $secure_link является некой пустой строкой, пока значение хеша URI не удостоверено.


 

            7.6. Генерация безопасного соединения при помощи ключа безопасности   v 91

Обсуждение

 
Предоставление безопасности при помощи кода безопасности яв- ляется великолепным способом гарантии того, что ваши файлы защи- щены. Такой код безопасности применяется в сочетании со значением URI. Данная строка далее хешируется посредством md5, и в получаемом URI применяются шестнадцатеричные цифры данного хеша md5. Этот хеш помещается в надлежащую ссылку и вычисляется NGINX. NGINX обладает информацией относительно значений, запрашиваемых пути и файла, поскольку они пребывают в URI после значения хеша. NGINX также знает ваш код безопасности (secret), поскольку он предоставля- ется через соответствующую директиву secure_link_secret. NGINX имеет возможность быстро удостоверять значение хеша md5 и сохранять по- лучаемый URI в значении переменной $secure_link. Если же значение хеша не подтверждается, значение переменной устанавливается в не- кую пустую строку. Важно отметить, что те аргументы, которые пере- даются в secure_link_secret, обязаны быть статической строкой; они не могут быть переменной.

 

7.6. Генерация безопасного соединения при помощи ключа безопасности

 
Задача

Вам требуется сгенерировать в своем приложении некую безопасную ссылку при помощи какого-то кода безопасности.

Решение

Имеющийся в NGINX модуль безопасной ссылки принимает значе- ния шестнадцатеричных цифр некой хешированной md5 строки, причем такая строка представляет собой сцепление значения URI пути и самого кода безопасности (secret). Отталкиваясь от последнего рецепта 7.5, мы создадим защищенную ссылку, которая будет работать с предыдущим примером конфигурации, с учетом того что имеется некий файл, пред- ставленный в /var/www/secured/index.html. Для выработки требуемых значений шестнадцатеричных цифр md5 мы можем применить команду Unix openssl:

$ echo -n 'index.htmlmySecret' | openssl md5 -hex (stdin)= a53bee08a4bf0bbea978ddf736363a12


 

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

Здесь мы показываем значение защищаемого нами URI, index.html, сце- пляемое с нашим кодом безопасности, mySecret. Эта строка передается в со- ответствующую команду openssl для вывода шестнадцатеричных цифр md5. Ниже приводится пример построения в Python тех же самых шест- надцатеричных цифр с применением библиотеки hashlib, которая вхо-

дит в состав Стандартной библиотеки Python:

 
import hashlib hashlib.md5.(b'index.htmlmySecret').hexdigest() 'a53bee08a4bf0bbea978ddf736363a12'

 
Теперь, когда у нас имеются данные шестнадцатеричные циф- ры, мы можем применять их в некоем URL. Нашим примером будет www.example.com, выполняющий некий запрос для своего файла /var/ www/secured/index.html через location /resources. Наш полный URL-адрес будет выглядеть так:

www.example.com/resources/a53bee08a4bf0bbea978ddf736363a12/\ index.html

Обсуждение

Выработка цифровых значений может выполняться множеством способов, причем на множестве языков программирования. Что нужно помнить: значение пути URI следует перед самим кодом безопасности, в этой строке нет никаких символов перехода на новую строку, а также применяются шестнадцатеричные цифры из соответствующего хеши- рования md5.

7.7. Безопасность местоположения при помощи ограниченной даты

Задача

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

Решение

Для настройки срока истечения действия воспользуйтесь прочими включенными в обсуждаемый модуль безопасных ссылок директивами и применяйте переменные в своей защищенной ссылке:


 

 
                    7.7. Безопасность местоположения при помощи ограниченной даты  v 93

location /resources { root /var/www;

secure_link $arg_md5,$arg_expires;

secure_link_md5 "$secure_link_expires$uri$remote_addr mySecret"; if ($secure_link = "") { return 403; }

if ($secure_link = "0") { return 410; }

}

 

 
Приводимая директива secure_link получает два разделяемых запя- той параметра. Значением первого параметра является переменная, которая содержит значение хеша md5. Данный пример использует некий аргумент HTTP md5. Вторым параметром является переменная, которая содержит значение времени истечения срока данной ссылки, исчис- ляемого в формате времени эпохи Unix. Следующая директива secure_ link_md5 получает некий отдельный параметр, объявляющий значение формата той строки, которая применяется для построения значения хеша md5. Как и для прочих конфигураций, когда это значение хеша не проходит процедуру удостоверения, значение переменной $secure_link устанавливается в некую пустую строку. Тем не менее при данном при- менении в случае соответствия значения хеша, но при истечении срока действия значение переменной $secure_link будет установлено на 0.

Обсуждение

Данное применение защищенной ссылки является более гибким и выглядит более понятным, чем тот secure_link_secret, который показан в рецепте 7.5. При помощи этих директив мы способны применять любое число доступных для NGINX переменных в своей хешируемой строке. Использование специфичных для пользователя переменных в такой строке хеша усилит вашу безопасность, поскольку у пользова- телей не будет возможности выставлять на продажу ссылки к защи- щенным ресурсам. Рекомендуется применять переменные, подобные

$remote_addr  или $http_x_forwarded_for, либо некий заголовок куки сеан- са, вырабатываемый вашим приложением. Значения аргументов для secure_link может поступать из любых предпочитаемых вами перемен- ных, и они могут именоваться так, чтобы лучше соответствовать вашим потребностям. Значения условий относительно значения  переменной

$secure_link устанавливаются для возврата известных кодов HTTP для Forbidden и Gone. Значение 410 HTTP, Gone прекрасно подходит для просроченных ссылок, поскольку данное условие рассматривается как неизменное.


 

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

7.8. Генерация ссылки с ограниченным сроком

Задача

Вам требуется выработать ссылку со сроком истечения.

Решение

Сгенерируйте некий временной штамп (timestamp) для значения срока истечения в формате эпохи Unix. В системе Unix можно выпол- нить проверку, применив значение даты, как это продемонстрировано в приведенном ниже примере:

 
$ date -d "2020-12-31 00:00" +%s --utc 1609372800

 

Далее вам требуется сцепить строку своего хеша для установления значения строки, настраиваемой при помощи директивы secure_link_ md5. В данном случае нашей используемой строкой будет 1293771600/ resources/index.html127.0.0.1 mySecret. Значение хеша md5 слегка отлича- ется от просто шестнадцатеричных цифр. Это хеш md5 в двоичном фор- мате, кодированный base64, причем символы плюса (+) транслируются в дефисы (-), слеши (/) – в подчеркивания (_), а символы равенства (=) удаляются. Вот пример в системе Unix:

$ echo -n '1609372800/resources/index.html127.0.0.1 mySecret' \

| openssl md5 -binary \

| openssl base64 \

| tr +/ -_ \

| tr -d = TG6ck3OpAttQ1d7jW3JOcw

 

Теперь, когда у нас есть свой хеш, мы можем воспользоваться им в качестве некоего аргумента совместно с датой истечения срока:

'/resources/index.html?md5=TG6ck3OpAttQ1d7jW3JOcw&expires=1609372800'

 

Далее приводится более практичный пример на Python, применяю- щий относительное время для срока истечения, устанавливающий зна- чение срока истечения ссылки на один час с момента его выработки. На момент написания этих строк этот пример работал с Python 2.7 b 3.x с использованием cтандартной библиотеки Python:


 

 
                                                7.8. Генерация ссылки с ограниченным сроком v 95

from datetime import datetime, timedelta

from base64 import b64encode

Import hashlib

# Set environment vars

resource = b'/resources/index.html' remote_addr = b'127.0.0.1'

host = b'www.example.com' mysecret = b'mySecret'

# Generate expire timestamp

now = datetime.utcnow()

expire_dt = now + timedelta(hours=1)

expire_epoch = str.encode(expire_dt.strftime('%s'))

 

# md5 hash the string

 
uncoded = expire_epoch + resource + remote_addr + mysecret md5hashed = hashlib.md5(uncoded).digest()

 

# Base64 encode and transform the string

b64 = b64encode(md5hashed)

unpadded_b64url = b64.replace(b'+', b'-')\

.replace(b'/', b'_')\

.replace(b'=', b'')

 

# Format and generate the link linkformat = "{}{}?md5={}?expires={}" securelink = linkformat.format(

host.decode(), resource.decode(), unpadded_b64url.decode(), expire_epoch.decode()

)

print(securelink)

 

Обсуждение

При наличии данного шаблона мы имеем возможность вырабаты- вать некую защищенную ссылку в особом формате, которая может применяться в URI. Данный код безопасности (secret) предоставляет


 

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

 
защиту при помощи использования переменных, которые никогда не отправляются определенному клиенту. У вас есть возможность приме- нять столько переменных, сколько вам потребуется, чтобы сделать свое местоположение безопасным. Хеширование md5 и кодирование base64 являются распространенными, обладают малым весом и доступны поч- ти во всех языках программирования.

 

7.9. Перенаправление HTTPS

Задача

Вам требуется перенаправлять незашифрованные запросы в HTTPS.

Решение

 
Воспользуйтесь повторной записью для отправки всего HTTP-трафи-

ка в HTTPS:

server {

listen 80 default_server;

listen [::]:80 default_server; server_name _;

return 301 https://$host$request_uri;

}

 

В данной конфигурации мы слушаем порт 80 в качестве своего сер- вера по умолчанию как для IPv4, так и для IPv6, а также для любых на- званий хостов. Оператор return возвращает некий код 301, постоянно выполняя перенаправление в имеющийся в том же самом хосте сервер HTTP и подставляя URI запроса.

Обсуждение

Важно всегда выполнять перенаправление в HTTPS, когда он досту- пен. Вы можете обнаружить, что вам требуется перенаправлять не все запросы, а только те, которые содержат чувствительную информацию, подлежащую передаче между клиентом и сервером. В данном случае вы можете пожелать поместить в оператор return только конкретные рас- положения, например /login.


 

            7.10. Перенаправление на HTTPS, когда SSL/TLS прекращается до NGINX   v 97

7.10. Перенаправление на HTTPS,


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

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






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