Nginx + SSO via google
https://medium.com/lasso/use-nginx-and-lasso-to-add-google-authentication-to-any-application-d3a8a7f073dd
#nginx #sso
https://medium.com/lasso/use-nginx-and-lasso-to-add-google-authentication-to-any-application-d3a8a7f073dd
#nginx #sso
Medium
Use nginx and Lasso to Add Google Authentication to Any Application
By using the nginx auth_request module and Lasso you can protect any application running behind your nginx reverse proxy with OAuth. Lasso…
Grafana basic auth
В ролях:
- grafana stable chart
- nginx ingress controller
- terraform
Задача:
Сделать basic auth для графаны на уровне nginx, передавая username в grafana, так чтобы переданное имя использовалось как пользователь в grafana и запихнуть всё это в терраформ.
Решение: (выписка из values.yaml)
Содержимое файла basic_auth.txt заполняется так:
#grafana #kubernetes #nginx #ingress #terraform
В ролях:
- grafana stable chart
- nginx ingress controller
- terraform
Задача:
Сделать basic auth для графаны на уровне nginx, передавая username в grafana, так чтобы переданное имя использовалось как пользователь в grafana и запихнуть всё это в терраформ.
Решение: (выписка из values.yaml)
ingress:где переменные в main.tf принимают такие значения:
enabled: true
annotations:
'kubernetes.io/ingress.class': ${var.controller_ingress_class}
'nginx.ingress.kubernetes.io/auth-type': ${var.auth-type}
'nginx.ingress.kubernetes.io/auth-secret': ${var.basic_auth_secret_name}
'nginx.ingress.kubernetes.io/auth-realm': ${var.auth-realm}
'nginx.ingress.kubernetes.io/configuration-snippet': |
proxy_set_header X-Remote-User $remote_user;
....
grafana.ini:
users:
allow_sign_up: false
allow_org_create: false
auth:
disable_login_form: true
auth.proxy:
enabled: true
header_name: X-Remote-User
header_property: username
auto_sign_up: true
auth-type = "basic"
auth-secret = "nginx-ingress-auth"
auth-realm = "Authentication Required - OK"
basic_auth_secret = "${file("basic_auth.txt")}"
Содержимое файла basic_auth.txt заполняется так:
htpasswd -nb username long_long_password > basic_auth.txt
#grafana #kubernetes #nginx #ingress #terraform
защищаем апишный роут в nginx
действия не сложные, но приходится делать не часто, потому не помню всё наизусть и каждый раз гуглить приходится, а потому запишу сюды, чтобы было.
Дано: апи, и N подрядчиков которые будут туда ходить. на границе с интенрнетами стоит nginx.
Задача: максимально защитить доступ к апи для внешних сервисов. (подходит в том числе для pcidss)
1) каким либо способом генерим сертификаты. Хорошо описано вот здесь: https://habr.com/ru/post/213741/#comment_10231686
По сути нам нужно будет получить пару для УЦ, пару для nginx, и N пар для клиентов. там же написано как это подключить, чтобы требовало проверки, используя ssl_client_certificate и ssl_verify_client on;
2) для того чтобы ходить могли только конкретные сертификаты, нужно рассказать nginx какие из них доверенные. это сделать можно например проверяя сериал или хеш сертификата, в данном случае сериал. получаем его так:
и интегрируем
тут мы запрещаем ходить везде кроме особого роута, чтобы клиент не мог случайно попасть на случайно открытые роуты которые ему не предназначены (когда разраб накосяпорил и выставил какой-то роут с дебагом или метриками)
3) получаем список ip подрядчика и пишем в роуте стандартные allow-deny
4) в качестве дополнительной проверки передаём апстриму инфу о том что за клиент пришёл
Таким образом, только конкретный ip только имея конкретный сертификат может сходить только на конкретный роут и о том какой пришёл клиент узнаёт бекэнд.
#nginx #security
действия не сложные, но приходится делать не часто, потому не помню всё наизусть и каждый раз гуглить приходится, а потому запишу сюды, чтобы было.
Дано: апи, и N подрядчиков которые будут туда ходить. на границе с интенрнетами стоит nginx.
Задача: максимально защитить доступ к апи для внешних сервисов. (подходит в том числе для pcidss)
1) каким либо способом генерим сертификаты. Хорошо описано вот здесь: https://habr.com/ru/post/213741/#comment_10231686
По сути нам нужно будет получить пару для УЦ, пару для nginx, и N пар для клиентов. там же написано как это подключить, чтобы требовало проверки, используя ssl_client_certificate и ssl_verify_client on;
2) для того чтобы ходить могли только конкретные сертификаты, нужно рассказать nginx какие из них доверенные. это сделать можно например проверяя сериал или хеш сертификата, в данном случае сериал. получаем его так:
cert=filename.crt
serial=$(openssl x509 -in ${cert} -text -noout | grep -A1 Serial | grep -v Serial | tr -d ' ') && \
echo classic serial: $serial && \
echo \$ssl_client_serial: $(echo $serial | tr -d ":" | tr '[:lower:]' '[:upper:]')
и интегрируем
map $ssl_client_serial $reject {
default 1;
..........C5CE16 0; #client1
..........635A2D60 0; # client2
}
server {
....
location / { deny all; }
location /secret {
if ($reject) { return 403; }
тут мы запрещаем ходить везде кроме особого роута, чтобы клиент не мог случайно попасть на случайно открытые роуты которые ему не предназначены (когда разраб накосяпорил и выставил какой-то роут с дебагом или метриками)
3) получаем список ip подрядчика и пишем в роуте стандартные allow-deny
allow 1.2.3.4 # client1
...
deny all;
4) в качестве дополнительной проверки передаём апстриму инфу о том что за клиент пришёл
proxy_set_header X-Subject-Name $ssl_client_s_dn;
Таким образом, только конкретный ip только имея конкретный сертификат может сходить только на конкретный роут и о том какой пришёл клиент узнаёт бекэнд.
#nginx #security
грязнофикс для content-type в nginx
Суть проблемы: через nginx выполняется прокси-пасс на minio, откуда отдаются pdf,jpg. Если вы при этом во время записи забыли проставить файлу корретный content-type, то на выходе вы можете получить картину того, что, например, pdf будет интерпретироваться как jpeg. При этом даже выставление types (параметр который отвечает за соответствие расширений типу, такая большая таблица в конфиге по-умолчанию), даже зануление тайпа для конкретного локейшена и принудительная простановка дефолтного типа не сработала, т.к. хедер прилетает уже от минио и его не переопределяет тип. Что же делать? переопределить самостоятельно!
Решение:
1. сделать временный фикс для каждого нужного расширения
2. пройтись по всем файлам в минио и сделать корректный контент-тайп.
#nginx #minio
Суть проблемы: через nginx выполняется прокси-пасс на minio, откуда отдаются pdf,jpg. Если вы при этом во время записи забыли проставить файлу корретный content-type, то на выходе вы можете получить картину того, что, например, pdf будет интерпретироваться как jpeg. При этом даже выставление types (параметр который отвечает за соответствие расширений типу, такая большая таблица в конфиге по-умолчанию), даже зануление тайпа для конкретного локейшена и принудительная простановка дефолтного типа не сработала, т.к. хедер прилетает уже от минио и его не переопределяет тип. Что же делать? переопределить самостоятельно!
Решение:
1. сделать временный фикс для каждого нужного расширения
2. пройтись по всем файлам в минио и сделать корректный контент-тайп.
location ~* \.pdf$ {
proxy_hide_header Content-Type;
proxy_pass http://backend;
add_header Content-Type "application/pdf";
}
location ~* \.(jpg|jpeg)$ {
proxy_hide_header Content-Type;
proxy_pass http://backend;
add_header Content-Type "image/jpeg";
}
#nginx #minio