Bagaimana kami lari dari perusahaan Windows

Kebetulan di perusahaan kami, C # dipilih sebagai bahasa utama untuk pengembangan backend. Omong-omong, kami selalu senang dengan pilihan ini, dan ketika MS mulai mengembangkan platform .net Core, itu menjadi lebih menarik, karena C # bagus, tapi C # di Linux lebih baik.


Saya tidak akan menjelaskan jalur transisi ke pengembangan lintas-platform, karena sudah banyak yang telah melewati jalur transisi dari Framework ke Core.


Saya akan fokus pada satu titik. Di antara hal-hal lain, Docker mendorong kami untuk meng-hosting aplikasi kami untuk Linux, karena saya benar-benar ingin bergabung dengan aliran kaum muda dalam hal kontainerisasi segala sesuatu yang mungkin.


Karena kami sedang mengembangkan perusahaan, kami juga harus menjalankan melalui Linux dengan otentikasi windows pass-through. Sebenarnya, ini adalah dorongan untuk menulis artikel. Karena informasinya sangat sulit, terpisah-pisah, dan berkomunikasi dengan banyak orang, ide untuk mengumpulkan semua yang Anda butuhkan di satu tempat dan mendeskripsikan opsi kerja tampak bagus.


Sebagai solusi, opsi proxy terbalik dipilih di bawah nginx dengan otentikasi kerberos. Dan agar kawan-kawan dari berbagai proyek dapat menggunakan solusinya, diputuskan untuk mengarsipkan gambar buruh pelabuhan, yang akan memecahkan masalah dasar, dan dari mana orang lain dapat mewarisi, atau menggunakannya sebagaimana mestinya.


Agar kerbero berfungsi, Anda harus membangun nginx dengan modul tambahan.
Sebagai hasilnya, kami mendapat tentang tim seperti itu. Semuanya dirangkai dalam dua panggilan untuk membuat lebih sedikit lapisan.


Mari kita lihat Dockerfile kami. Kami akan didasarkan pada gambar yang sangat kompak dengan alpine


FROM alpine:3.7 

Selanjutnya, kita kencangkan paket yang diperlukan, sumber nginx dan modul yang diperlukan spnego-http-auth-nginx-module. Hasilnya adalah sesuatu seperti perintah ini


 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 

Blok ini dialokasikan secara terpisah sehingga ketika memasang kembali layer ini dapat diambil dari cache, karena itu adalah yang terpanjang dalam waktu.


Dengan serangkaian perintah berikutnya, kita akan membangun nginx dan membersihkannya sehingga gambar tidak membengkak sia-sia


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

Dan agar semua ini masuk akal, angkat nginx


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

Kami dapat berasumsi bahwa gambar sudah siap, sekarang kami mulai memastikan bahwa server kami memiliki kemampuan untuk mengotorisasi pengguna.


Untuk melakukan ini, Anda perlu mencari administrator domain, saya sangat beruntung dengannya - orang itu ternyata responsif dan melakukan apa yang mereka tanyakan dengan sangat cepat. Dan Anda perlu melakukan hal berikut.
Katakanlah nama host di mesin host adalah "host-linux" dan domain Anda adalah "DOMAIN.LOCAL".
Dalam domain Anda perlu memulai mesin dengan nama "host-linux" dan membuat akun yang akan kami ikat, misalnya, "host-linux-user". Selanjutnya, kita perlu membuat SPN dan menghasilkan file keytab, yang akan kita perlukan saat mengangkat wadah.


Tim kami ternyata seperti ini


 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 

Setelah saya menerima file, saya bisa pergi bereksperimen. Akibatnya, saya mendapat nginx.conf berikut


 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 

Sekarang, agar semuanya dimulai, saat mengangkat wadah, Anda harus meletakkan nginx.conf saat ini dan memasukkannya ke web.keytab yang diterima. Untuk melakukan ini, gunakan sihir pembuatan docker


 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 

Mari kita pergi ke direktori tempat kita memiliki docker-compose.yml. Dalam kasus kami, dalam folder yang sama harus berupa direktori ./config dengan file nginx.conf dan web.keytab. Jalankan perintah


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

Wadah itu naik dan tidak mati. Ini memberi harapan untuk sukses.


Mari kita buka browser pada domain mesin Windows.


Dalam satu tab, buka chrome: // net-internal / dan tulis permintaan yang kita miliki. Di tab lain, buka http: // host-linux: 80 / . Mari kita kembali ke chrome: // net-internal / dan lihat hasilnya.


 #    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 

Akibatnya, kami melihat bahwa operasi berhasil dan kami melihat layar selamat datang nginx.
Perlu membuat satu klarifikasi, semuanya akan bekerja hanya dengan nama host, tetapi seperti yang saya pahami dengan benar, karena kami mengikat kerberos padanya.


Terima kasih atas perhatian Anda, jika Anda membaca di tempat ini, dan saya sangat berharap artikel ini akan bermanfaat.

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


All Articles