Админим с Буквой
5.35K subscribers
302 photos
8 videos
59 files
1.15K links
Канал о системном администрировании, DevOps и немного Инфобеза.

По всем вопросам обращаться к @bykva. Рекламу не размещаю.
Download Telegram
Grafana basic auth

В ролях:
- grafana stable chart
- nginx ingress controller
- terraform

Задача:
Сделать basic auth для графаны на уровне nginx, передавая username в grafana, так чтобы переданное имя использовалось как пользователь в grafana и запихнуть всё это в терраформ.

Решение: (выписка из values.yaml)

ingress:
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

где переменные в main.tf принимают такие значения:

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 какие из них доверенные. это сделать можно например проверяя сериал или хеш сертификата, в данном случае сериал. получаем его так:

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. пройтись по всем файлам в минио и сделать корректный контент-тайп.

      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