Como fugimos do Windows corporativo

Aconteceu que em nossa empresa, o C # foi escolhido como o principal idioma para o desenvolvimento de back-end. A propósito, sempre ficamos felizes com essa escolha e, quando a MS começou a desenvolver a plataforma .net Core, ela se tornou ainda mais interessante, pois o C # é bom, mas o C # no Linux é ainda melhor.


Não descreverei o caminho de transição para o desenvolvimento de plataforma cruzada, pois muitos já seguiram o caminho de transição do Framework para o Core.


Vou me concentrar em um ponto. Entre outras coisas, o Docker nos levou a hospedar nossos aplicativos para Linux, porque eu realmente queria ingressar no fluxo jovem de contêiner de tudo o que era possível.


Como estamos desenvolvendo empresas, tivemos que executar o Linux com autenticação de janelas de passagem conosco também. Na verdade, esse foi o ímpeto para escrever o artigo. Como as informações eram muito difíceis, em partes separadas e na comunicação com muitas pessoas, a idéia de coletar tudo o que você precisa em um só lugar e descrever uma opção de trabalho parecia agradável.


Como solução, uma opção de proxy reverso foi escolhida no nginx com autenticação kerberos. E para que camaradas de diferentes projetos pudessem usar a solução, foi decidido arquivar a imagem do docker, que resolveria o problema básico e da qual outros poderiam herdar ou usá-la como está.


Para que o kerberos funcione, é necessário criar o nginx com módulos adicionais.
Como resultado, contatamos uma equipe assim. Tudo é montado em duas chamadas para criar menos camadas.


Vamos dar uma olhada no nosso Dockerfile. Seremos baseados em uma imagem muito compacta com imagens alpinas.


FROM alpine:3.7 

Em seguida, reforçamos os pacotes necessários, as fontes do nginx e o módulo necessário spnego-http-auth-nginx-module. O resultado é 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 

Esse bloco foi alocado separadamente para que, ao remontar, essa camada pudesse ser retirada do cache, pois é a mais longa no tempo.


Com o próximo conjunto de comandos, criaremos o nginx e o limparemos para que a imagem não incha em vão


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

E para que tudo isso faça sentido, aumente nginx


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

Podemos assumir que a imagem está pronta, agora começamos a garantir que nosso servidor tenha a capacidade de autorizar usuários.


Para fazer isso, você precisa encontrar um administrador de domínio, tive muita sorte com ele - o cara mostrou-se receptivo e fez o que pediu rapidamente. E você precisa fazer o seguinte.
Digamos que o nome do host na máquina host seja "host-linux" e seu domínio seja "DOMAIN.LOCAL".
No domínio, você precisa iniciar uma máquina com o nome "host-linux" e criar uma conta à qual a vincularemos, por exemplo, "host-linux-user". Em seguida, precisamos criar um SPN e gerar um arquivo keytab, necessário ao levantar o contêiner.


Nossa equipe acabou sendo algo como isto


 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 

Depois de receber o arquivo, eu poderia experimentar. Como resultado, recebi o seguinte 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 

Agora, para que tudo inicie, ao levantar o contêiner, você deve soltar o nginx.conf atual e alimentá-lo com o web.keytab recebido. Para fazer isso, use o docker-compose magic


 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 

Vamos para o diretório em que temos o docker-compose.yml. No nosso caso, na mesma pasta deve estar o diretório ./config com os arquivos nginx.conf e web.keytab. Execute o comando


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

O recipiente subiu e não morreu. Isso dá esperança para o sucesso.


Vamos abrir o navegador na máquina Windows do domínio.


Em uma guia, abra chrome: // net-internals / e anote os pedidos que temos. Em outra guia, abra http: // host-linux: 80 / . Vamos voltar ao chrome: // net-internals / e ver os 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 a operação foi bem-sucedida e a tela de boas-vindas do nginx.
Vale a pena fazer um esclarecimento, tudo funcionará apenas pelo nome do host, mas como eu o entendi corretamente, porque amarramos os kerberos a ele.


Obrigado por sua atenção, se você leu este lugar, e eu realmente espero que o artigo seja útil.

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


All Articles