Иногда бывает нужно обеспечить аутентификацию для запускаемых микросервисов при их обращении к внешним источникам данных.
Для этого можно использовать istio, а можно - делать это с помощью вспомогательных контейнеров nginx.
Тут я собираю различные варианты конфигов для nginx, подходящие для аутентификации в разных ситуациях.
proxy_pass с аутентификацией по сертификату
server { listen 8011; location / { proxy_pass https://api.domain.local:8443; proxy_ssl_certificate /etc/nginx/ssl/api.domain.local/client.pem; proxy_ssl_certificate_key /etc/nginx/ssl/api.domain.local/key_nopasswd.pem; proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2; proxy_ssl_ciphers HIGH:!aNULL:!MD5; proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt; proxy_ssl_verify on; proxy_ssl_verify_depth 2; proxy_ssl_session_reuse on; } }
proxy_pass с kerberos-аутентификацией на upstream
https://blog.inf.ed.ac.uk/squinney/2018/03/29/easy-gssapi-authentication/
https://stackoverflow.com/a/38664954
https://www.ibm.com/support/knowledgecenter/en/SSPT3X_3.0.0/com.ibm.swg.im.infosphere.biginsights.admin.doc/doc/kerberos_webconsole.html
http://www.unstructureddatatips.com/hadoop-rest-api-webhdfs-on-onefs/
С реализацией аутентификации kerberos всё несколько сложнее. Я не нашел готовой реализации этого функционала, поэтому - сделал из подручных средств.
Нужно:
- иметь nginx с поддержкой lua - openresty
- установить билиотеки kerberos и настроить krb5.conf
- curl, nslookup
В моей реализации при попытке ображения к заданному location будет запускаться curl с заданными параметрами (логином, паролем и URL) и возвращать ответ.
То есть весь функционал по реализации аутентификации переездает в curl.
Список переменных среды будет такой:
DOMAIN=domain.local DOMAIN_USER="username" DOMAIN_USER_PASS="userpassword" KRB5_CLIENT_KTNAME=/keytab KRB5CCNAME=/krb5cc CURL_CA_BUNDLE=/etc/ssl/certs/ca.pem CURL_OPTS='--http1.1 -H "Content-Type: application/xml; charset=utf-8" -X POST -v --negotiate -u :' URL='https://krb-protected-server.domain.local:1111/location/method' PORT=8088
А стартовый скрипт контейнера такой:
#!/bin/bash DOMAIN_CONTROLLERS=`nslookup -query=any _ldap._tcp.dc._msdcs.$DOMAIN | grep "_ldap._tcp.dc._msdcs.$DOMAIN" | grep 389 | awk '{print $7}'` DEFAULT_REALM="${DOMAIN^^}" ######################################### ### Setup Kerberos /etc/krb5.conf ######################################### LIBDEFAULTS=$(cat <<EOF [libdefaults] dns_lookup_kdc = true dns_lookup_realm = false default_realm = $DEFAULT_REALM clockskew = 300 #default_ccache_name = FILE:/tmp/krb5cc_%{uid} EOF ) REALMS_KDC=$(for i in $DOMAIN_CONTROLLERS; do echo "kdc = $i";done) REALMS=$(cat <<EOF [realms] $DEFAULT_REALM = { $REALMS_KDC default_domain = $DEFAULT_REALM } EOF ) DOMAIN_REALM=$(cat <<EOF [domain_realm] .$DOMAIN = $DEFAULT_REALM $DOMAIN = $DEFAULT_REALM [appdefaults] pam = { ticket_lifetime = 1d renew_lifetime = 1d forwardable = true proxiable = false minimum_uid = 1 } EOF ) echo "$LIBDEFAULTS" > /etc/krb5.conf echo "$REALMS" >> /etc/krb5.conf echo "$DOMAIN_REALM" >> /etc/krb5.conf ##################################### ### Create keytab and kcc ##################################### { printf "%b" "addent -password -p $DOMAIN_USER -k 1 -e aes256-cts-hmac-sha1-96\n" sleep 3 printf "%b" "$DOMAIN_USER_PASS\nwrite_kt /$KRB5_CLIENT_KTNAME" } | ktutil kinit -k -t $KRB5_CLIENT_KTNAME $DOMAIN_USER ######################################## ### Создаем файл конфига для openresty ######################################## cat <<EOF > /etc/nginx/conf.d/default.conf: server { listen $PORT; location / { content_by_lua_block { ngx.req.read_body() local request_body = ngx.req.get_body_data() command = "curl $CURL_OPTS -d '"..request_body.."' $URL"; local handle = io.popen(command); local result = handle:read("*a"); handle:close(); ngx.print(result); } } } EOF
Иногда бывает нужно обеспечить аутентификацию для запускаемых микросервисов при их обращении к внешним источникам данных.
Для этого можно использовать istio, а можно - делать это с помощью вспомогательных контейнеров nginx.
Тут я собираю различные варианты конфигов для nginx, подходящие для аутентификации в разных ситуациях.
Dockerfile
FROM openresty/openresty:buster RUN set -ex \ && apt-get update \ && apt-get upgrade -y \ && apt-get install -y \ curl \ krb5-user \ gss-ntlmssp \ libsasl2-modules-gssapi-mit \ ca-certificates
Discussion