Comment nous nous sommes enfuis de Windows Corporate

Il se trouve que dans notre entreprise, C # a été choisi comme langage principal pour le développement backend. Soit dit en passant, nous avons toujours été satisfaits de ce choix, et lorsque MS a commencé à développer la plate-forme .net Core, cela est devenu encore plus intéressant, car C # est bon, mais C # sous Linux est encore meilleur.


Je ne décrirai pas le chemin de transition vers le développement multiplateforme, car beaucoup ont déjà emprunté le chemin de transition de Framework à Core.


Je vais me concentrer sur un point. Entre autres choses, Docker nous a poussés à héberger nos applications pour Linux, car je voulais vraiment rejoindre le volet jeunesse de la conteneurisation de tout ce qui était possible.


Puisque nous développons l'entreprise, nous avons également dû exécuter Linux avec l'authentification Windows pass-through. En fait, c'était l'impulsion pour écrire l'article. Étant donné que les informations étaient très difficiles, en morceaux séparés et communiquaient avec de nombreuses personnes, l'idée de rassembler tout ce dont vous avez besoin en un seul endroit et de décrire une option de travail semblait intéressante.


Comme solution, une option de proxy inverse a été choisie sous nginx avec l'authentification Kerberos. Et pour que des camarades de différents projets puissent utiliser la solution, il a été décidé de déposer l'image docker, qui résoudrait le problème de base, et dont d'autres pourraient hériter, ou l'utiliser telle quelle.


Pour que les kerberos fonctionnent, vous avez dû créer nginx avec des modules supplémentaires.
En conséquence, nous avons formé une telle équipe. Tout est bricolé en deux appels pour créer moins de couches.


Jetons un coup d'œil à notre Dockerfile. Nous serons basés sur une image très compacte avec alpin


FROM alpine:3.7 

Ensuite, nous resserrons les packages nécessaires, les sources de nginx et le module requis spnego-http-auth-nginx-module. Le résultat est quelque chose comme cette commande


 ENV NGINX_VERSION 1.15.1 RUN set -ex \ && apk add --no-cache \ git \ krb5 \ krb5-dev \ ca-certificates \ libressl \ pcre \ zlib \ && apk add --no-cache --virtual .build-deps \ build-base \ linux-headers \ libressl-dev \ pcre-dev \ wget \ zlib-dev \ && cd /tmp \ && wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz \ && tar xzf nginx-${NGINX_VERSION}.tar.gz \ && git clone https://github.com/stnoonan/spnego-http-auth-nginx-module.git nginx-${NGINX_VERSION}/spnego-http-auth-nginx-module 

Ce bloc a été alloué séparément afin que lors du réassemblage, cette couche puisse être extraite du cache, car elle est la plus longue dans le temps.


Avec le prochain ensemble de commandes, nous allons construire nginx et le nettoyer pour que l'image ne gonfle pas en vain


 RUN cd /tmp/nginx-${NGINX_VERSION} \ && ./configure \ \ --prefix=/etc/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --error-log-path=/var/log/nginx/error.log \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/run/nginx.lock \ --user=nginx \ --group=nginx \ --with-threads \ --with-file-aio \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_auth_request_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_slice_module \ --with-http_stub_status_module \ --http-log-path=/var/log/nginx/access.log \ --http-client-body-temp-path=/var/cache/nginx/client_temp \ --http-proxy-temp-path=/var/cache/nginx/proxy_temp \ --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \ --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \ --http-scgi-temp-path=/var/cache/nginx/scgi_temp \ --with-mail \ --with-mail_ssl_module \ --with-stream \ --with-stream_ssl_module \ --with-stream_realip_module \ --add-module=spnego-http-auth-nginx-module \ && make -j$(getconf _NPROCESSORS_ONLN) \ && make install \ && sed -i -e 's/#access_log logs\/access.log main;/access_log \/dev\/stdout;/' -e 's/#error_log logs\/error.log notice;/error_log stderr notice;/' /etc/nginx/nginx.conf \ && adduser -D nginx \ && mkdir -p /var/cache/nginx \ && apk del .build-deps \ && rm -rf /tmp/* 

Et pour que tout cela ait du sens, augmentez nginx


 CMD ["nginx", "-g", "daemon off;"] 

Nous pouvons supposer que l'image est prête, nous commençons maintenant à nous assurer que notre serveur a la capacité d'autoriser les utilisateurs.


Pour ce faire, vous devez trouver un administrateur de domaine, j'ai été extrêmement chanceux avec lui - le gars s'est révélé réactif et a fait ce qu'il lui avait demandé très rapidement. Et vous devez faire ce qui suit.
Disons que le nom d'hôte sur la machine hôte est «host-linux» et que votre domaine est «DOMAIN.LOCAL».
Dans le domaine, vous devez démarrer une machine avec le nom "host-linux" et créer un compte auquel nous le lierons, par exemple, "host-linux-user". Ensuite, nous devons créer un SPN et générer un fichier keytab, dont nous aurons besoin lors du levage du conteneur.


Notre équipe s'est avérée être quelque chose comme ça


 C:\Windows\system32>ktpass -princ HTTP/HOST-LINUX.domain.local@DOMAIN.LOCAL -mapuser host-linux-user@DOMAIN.LOCAL -pass yourpassword -cryptoAll -ptype KRB5_NT_PRINCIPAL -out C:\Temp\web.keytab 

Après avoir reçu le fichier, je pouvais aller expérimenter. En conséquence, j'ai obtenu le nginx.conf suivant


 http { #Whatever is there by default server { listen 80; server_name localhost; #Here kerberos stuff starts auth_gss on; auth_gss_realm DOMAIN.LOCAL; #Keytab file from the mounted folder auth_gss_keytab /home/spnego/config/web.keytab; auth_gss_service_name HTTP/HOST-LINUX.domain.local; auth_gss_allow_basic_fallback off; #Here kerberos stuff ends location / { root html; index index.html index.htm; } #bla-bla-bla 

Maintenant, pour que tout démarre, lorsque vous soulevez le conteneur, vous devez lui déposer le nginx.conf actuel et le nourrir dans le web.keytab reçu. Pour ce faire, utilisez la magie docker-compose


 version: "2" services: nginx-spnego: image: fclmman/alpine-nginx-spnego #  .   ports: - 80:80 - 5010:5010 - 443:443 - 8001:8001 #   web.keytab,       volumes: - ./config:/home/spnego/config - ./config/nginx.conf:/etc/nginx/nginx.conf 

Allons dans le répertoire où nous avons docker-compose.yml. Dans notre cas, le même dossier devrait se trouver dans le répertoire ./config avec les fichiers nginx.conf et web.keytab. Exécutez la commande


 docker-compose -f ./docker-compose.yml up -d 

Le conteneur s'est levé et n'est pas mort. Cela donne de l'espoir pour le succès.


Ouvrons le navigateur sur la machine Windows du domaine.


Dans un onglet, ouvrez chrome: // net-internals / et notez les demandes que nous avons. Dans un autre onglet, ouvrez http: // host-linux: 80 / . Revenons à chrome: // net-internals / et voyons les résultats.


 #    negotiate t= 3 [st= 3] HTTP_TRANSACTION_READ_RESPONSE_HEADERS --> HTTP/1.1 401 Unauthorized Server: nginx/1.15.1 Date: Fri, 10 Aug 2018 14:15:54 GMT Content-Type: text/html Content-Length: 597 Connection: keep-alive WWW-Authenticate: Negotiate t= 4 [st= 4] HTTP_TRANSACTION_SEND_REQUEST_HEADERS --> GET / HTTP/1.1 Host: host-linux Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Authorization: Negotiate #    Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7 t= 4 [st= 4] -HTTP_TRANSACTION_SEND_REQUEST t= 4 [st= 4] +HTTP_TRANSACTION_READ_HEADERS [dt=47] t= 4 [st= 4] HTTP_STREAM_PARSER_READ_HEADERS [dt=47] t=51 [st=51] HTTP_TRANSACTION_READ_RESPONSE_HEADERS --> HTTP/1.1 200 OK Server: nginx/1.15.1 Date: Fri, 10 Aug 2018 14:15:54 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Fri, 10 Aug 2018 12:21:36 GMT Connection: keep-alive WWW-Authenticate: Negotiate #   ETag: "5b6d8350-264" Accept-Ranges: bytes 

En conséquence, nous voyons que l'opération a réussi et nous voyons l'écran de bienvenue de nginx.
Il vaut la peine de faire une clarification, tout ne fonctionnera que par nom d'hôte, mais si je comprends bien, car nous y avons lié les kerberos.


Merci de votre attention, si vous lisez jusqu'à cet endroit, et j'espère vraiment que l'article vous sera utile.

Source: https://habr.com/ru/post/fr419975/


All Articles