С помощью существующего протокола единого входа OpenID Connect 11 страница
|
7.5. Безопасность местоположения
Задача
|
Решение
Используйте модуль безопасных ссылок и директиву 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
Обсуждение
|
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:
|
|
|
|
www.example.com/resources/a53bee08a4bf0bbea978ddf736363a12/\ index.html
Обсуждение
Выработка цифровых значений может выполняться множеством способов, причем на множестве языков программирования. Что нужно помнить: значение пути URI следует перед самим кодом безопасности, в этой строке нет никаких символов перехода на новую строку, а также применяются шестнадцатеричные цифры из соответствующего хеши- рования md5.
7.7. Безопасность местоположения при помощи ограниченной даты
Задача
Вам требуется защитить некое местоположение при помощи ссылки, которая имеет срок истечения в будущем и является специфичной для некоего клиента.
Решение
Для настройки срока истечения действия воспользуйтесь прочими включенными в обсуждаемый модуль безопасных ссылок директивами и применяйте переменные в своей защищенной ссылке:
|
|
|
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_secret, который показан в рецепте 7.5. При помощи этих директив мы способны применять любое число доступных для NGINX переменных в своей хешируемой строке. Использование специфичных для пользователя переменных в такой строке хеша усилит вашу безопасность, поскольку у пользова- телей не будет возможности выставлять на продажу ссылки к защи- щенным ресурсам. Рекомендуется применять переменные, подобные
$remote_addr или $http_x_forwarded_for, либо некий заголовок куки сеан- са, вырабатываемый вашим приложением. Значения аргументов для secure_link может поступать из любых предпочитаемых вами перемен- ных, и они могут именоваться так, чтобы лучше соответствовать вашим потребностям. Значения условий относительно значения переменной
$secure_link устанавливаются для возврата известных кодов HTTP для Forbidden и Gone. Значение 410 HTTP, Gone прекрасно подходит для просроченных ссылок, поскольку данное условие рассматривается как неизменное.
|
7.8. Генерация ссылки с ограниченным сроком
Задача
Вам требуется выработать ссылку со сроком истечения.
Решение
Сгенерируйте некий временной штамп (timestamp) для значения срока истечения в формате эпохи Unix. В системе Unix можно выпол- нить проверку, применив значение даты, как это продемонстрировано в приведенном ниже примере:
|
Далее вам требуется сцепить строку своего хеша для установления значения строки, настраиваемой при помощи директивы 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:
|
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
|
# 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. Контроль безопасности
|
7.9. Перенаправление HTTPS
Задача
Вам требуется перенаправлять незашифрованные запросы в HTTPS.
Решение
|
ка в 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!