Cómo nos escapamos de Windows corporativo

Dio la casualidad de que en nuestra empresa, C # fue elegido como el idioma principal para el desarrollo del backend. Por cierto, siempre estuvimos contentos con esta elección, y cuando MS comenzó a desarrollar la plataforma .net Core, se volvió aún más interesante, ya que C # es bueno, pero C # en Linux es aún mejor.


No describiré la ruta de transición al desarrollo multiplataforma, ya que muchos ya han pasado la ruta de transición de Framework a Core.


Me enfocaré en un punto. Entre otras cosas, Docker nos empujó a alojar nuestras aplicaciones para Linux, porque realmente quería unirme al flujo juvenil de contenedorización de todo lo que es posible.


Dado que estamos desarrollando una empresa, también tuvimos que ejecutar Linux con autenticación de Windows de paso a través. En realidad, este fue el ímpetu para escribir el artículo. Dado que la información era muy difícil, en partes separadas y se comunicaba con muchas personas, la idea de recopilar todo lo que necesita en un solo lugar y describir una opción de trabajo parecía agradable.


Como solución, se eligió una opción de proxy inverso en nginx con autenticación kerberos. Y para que camaradas de diferentes proyectos pudieran usar la solución, se decidió archivar la imagen acoplable, lo que resolvería el problema básico, y de lo que otros podrían heredar, o usarlo como está.


Para que Kerberos funcione, tuvo que construir nginx con módulos adicionales.
Como resultado, obtuvimos un equipo así. Todo está improvisado en dos llamadas para crear menos capas.


Echemos un vistazo a nuestro Dockerfile. Nos basaremos en una imagen muy compacta con alpine


FROM alpine:3.7 

A continuación, ajustamos los paquetes necesarios, las fuentes de nginx y el módulo requerido spnego-http-auth-nginx-module. El resultado es algo como este comando


 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 

Este bloque se asignó por separado para que al volver a montar esta capa se pueda tomar de la memoria caché, ya que es la más larga en el tiempo.


Con el siguiente conjunto de comandos, construiremos nginx y lo limpiaremos para que la imagen no se hinche en vano


 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/* 

Y para que todo esto tenga sentido, críe nginx


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

Podemos suponer que la imagen está lista, ahora comenzamos a asegurarnos de que nuestro servidor tenga la capacidad de autorizar a los usuarios.


Para hacer esto, necesita encontrar un administrador de dominio, tuve mucha suerte con él: el tipo resultó ser receptivo e hizo lo que le pidieron muy rápidamente. Y necesitas hacer lo siguiente.
Digamos que el nombre de host en la máquina host es "host-linux" y su dominio es "DOMAIN.LOCAL".
En el dominio, debe iniciar una máquina con el nombre "host-linux" y crear una cuenta a la que la vincularemos, por ejemplo, "host-linux-user". A continuación, necesitamos crear un SPN y generar un archivo de tabla de claves, que necesitaremos al levantar el contenedor.


Nuestro equipo resultó ser algo como esto


 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 

Después de recibir el archivo, podría ir a experimentar. Como resultado, obtuve el siguiente nginx.conf


 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 

Ahora, para que todo se inicie, al levantar el contenedor, debe soltar el nginx.conf actual y alimentarlo al web.keytab recibido. Para hacer esto, usa la magia 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 

Vayamos al directorio donde tenemos docker-compose.yml. En nuestro caso, en la misma carpeta debe estar el directorio ./config con los archivos nginx.conf y web.keytab. Ejecuta el comando


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

El contenedor se levantó y no murió. Esto da esperanza para el éxito.


Abramos el navegador en la máquina de dominio de Windows.


En una pestaña, abre chrome: // net-internals / y escribe las solicitudes que tenemos. En otra pestaña, abra http: // host-linux: 80 / . Volvamos a chrome: // net-internals / y veamos los resultados.


 #    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 

Como resultado, vemos que la operación fue exitosa y vemos la pantalla de bienvenida de nginx.
Vale la pena hacer una aclaración, todo funcionará solo por nombre de host, pero como lo entiendo correctamente, porque lo vinculamos a los kerberos.


Gracias por su atención, si lee este lugar, y realmente espero que el artículo le sea útil.

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


All Articles