#nginx #proxy #keycloak
#nginx #прокси #скрытие ключей
Вопрос:
AWS EC2 Ubuntu 18.04 Keycloak 5.0.0 Nginx 1.15.8
Я пытаюсь разместить приложение (не мою разработку) на основе Wildfly с интеграцией скрытого ключа (OpenID-connect) и знаю о сообщениях, которые относятся к моей задаче, но я полагаю, что мой вопрос не был рассмотрен в этих сообщениях.
В моем случае все работает нормально, приложение и сервер скрытия ключей за обратным прокси-сервером Nginx. Чего я не могу понять, так это того, что в соответствии с этим документом по скрытому ключу необходимо внести следующие изменения в скрытый ключ standalone.xml (в моем случае):
<http-listener name="default" socket-binding="http" proxy-address-forwarding="true" redirect-socket="proxy-https"/>
<socket-binding name="proxy-https" port="443"/>
Если я правильно понимаю, эта настройка предполагает, что приложение отправляет запрос на аутентификацию http-прослушивателю, и он перенаправляется на прокси-https. Не совсем ясно, куда прокси должен отправлять свой proxy_pass.
Но в любом случае, в моем случае приложение отправляет запрос на аутентификацию следующим образом:
<realm>MyRealm</realm>
<resource>MyRealm</resource>
<public-client>true</public-client>
<auth-server-url>https://<host name>:8843/auth/</auth-server-url>
<ssl-required>external</ssl-required>
Я только что изменил порт https в скрытии ключей stanalone.xml на 8943 и присвоил серверу Nginx порт 8843 с указанием местоположения /auth/
, как в этом фрагменте:
server {
listen 192.168.80.40:8843 ssl http2 default_server;
server_name <host name>;
location /auth/ {
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port 8843;
add_header Strict-Transport-Security "max-age=15552000";
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass https://192.168.80.40:8943/auth/;
proxy_redirect off;
}
}
Это работает, но я не совсем уверен, что это правильный способ разместить сервер скрытия ключей за обратным прокси-сервером Nginx, учитывая вышеупомянутую статью о скрытии ключей. По сути, это вопрос не о чем-то, что не работает, а о том, почему это работает.
Если некоторые эксперты по скрытию ключей могут заверить меня, что моя настройка работоспособна, я был бы очень признателен.
Мой второй вопрос: возможно ли ограничить внешний доступ только к области приложений, если пользователи решат открыть:
https://<host name>:<port>/auth
Я хотел бы заблокировать любой внешний доступ к экрану входа в основную область.
Когда я использую /auth/realms/MyRealm/
в расположении Nginx, это не позволяет пользователям получать доступ к экрану входа в основную область, но он показывает просто какой-то уродливый экран входа в область приложений, который на самом деле работает, но выглядит непрофессионально.
Заранее спасибо.
Обновить:
Единственное решение для моего второго вопроса, которое я нашел до сих пор:
location /auth/realms/master/ {
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port 8843;
add_header Strict-Transport-Security "max-age=15552000";
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
add_header Pragma "no-cache";
proxy_pass https://192.168.80.40:8943/auth/realms/master/;
proxy_redirect off;
allow X.X.X.X;
deny all;
}
И аналогично для корневого расположения:
location / {
*
*
*
proxy_pass https://192.168.80.40:8943$request_uri;
proxy_redirect off;
allow X.X.X.X;
deny all;
}
Местоположение /auth/
не изменено.
https://<host name>:<port>/auth
по-прежнему открывается "Welcome to Keycloak"
экран, но доступ к "Administration Console"
запрещен. По крайней мере, теперь у меня есть обычный экран входа в систему для области приложений, и мошеннические пользователи Интернета никуда не денутся с этого экрана приветствия.
Мне все еще нужна помощь с моим первым вопросом.
Комментарии:
1. Вы нашли какое-либо решение? У меня тот же сценарий, и я ищу, как установить блокировку ключей с помощью прокси-сервера Nginx с ограниченным доступом к основной области.
2. Вы также можете заблокировать доступ к самой странице /auth/, предоставив аналогичное правило nginx для ‘location = /auth/’