حدث ذلك أنه في شركتنا ، تم اختيار C # كلغة رئيسية لتطوير الواجهة الخلفية. بالمناسبة ، كنا سعداء دائمًا بهذا الاختيار ، وعندما بدأت MS في تطوير منصة .net Core ، أصبحت أكثر إثارة للاهتمام ، نظرًا لأن C # جيد ، ولكن C # تحت Linux أفضل.
لن أصف مسار الانتقال إلى التطوير عبر الأنظمة الأساسية ، نظرًا لأن العديد من الأشخاص قد انتقلوا بالفعل إلى مسار الانتقال من Framework إلى Core.
سأركز على نقطة واحدة. من بين أمور أخرى ، دفعتنا Docker نحو استضافة تطبيقاتنا لنظام التشغيل Linux ، لأنني أردت حقًا الانضمام إلى تيار الشباب من حاوية كل شيء ممكن.
نظرًا لأننا نقوم بتطوير المؤسسة ، كان علينا أن نمر عبر Linux بمصادقة Windows المارة معنا أيضًا. في الواقع ، كان هذا هو الدافع لكتابة المقال. نظرًا لأن المعلومات كانت صعبة للغاية ، في أجزاء منفصلة ، والتواصل مع العديد من الأشخاص ، فإن فكرة جمع كل ما تحتاجه في مكان واحد ووصف خيار عمل تبدو جيدة.
كحل ، تم اختيار خيار وكيل عكسي تحت nginx مع مصادقة kerberos. ولكي يتمكن الرفاق من المشاريع المختلفة من استخدام الحل ، تقرر تقديم صورة عامل الميناء ، والتي من شأنها حل المشكلة الأساسية ، والتي يمكن للآخرين أن يرثوها ، أو استخدامها كما هي.
لكي يعمل kerberos ، كان عليك بناء nginx مع وحدات إضافية.
ونتيجة لذلك ، حصلنا على مثل هذا الفريق. يتم تجميع كل شيء معًا في مكالمتين لإنشاء طبقات أقل.
دعونا نلقي نظرة على ملف Dockerfile. سنقوم على صورة مضغوطة للغاية مع جبال الألب
FROM alpine:3.7
بعد ذلك ، نقوم بتشديد الحزم الضرورية ومصادر nginx والوحدة المطلوبة spnego-http-auth-nginx-module. والنتيجة شيء مثل هذا الأمر
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
تم تخصيص هذه الكتلة بشكل منفصل حتى عند إعادة تجميع هذه الطبقة من ذاكرة التخزين المؤقت ، لأنها الأطول في الوقت.
مع المجموعة التالية من الأوامر ، سنقوم ببناء nginx وتنظيفها حتى لا تنتفخ الصورة عبثا
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/*
ولكي يكون كل هذا منطقيًا ، ارفع nginx
CMD ["nginx", "-g", "daemon off;"]
يمكننا أن نفترض أن الصورة جاهزة ، والآن نبدأ في التأكد من أن خادمنا لديه القدرة على تخويل المستخدمين.
للقيام بذلك ، تحتاج إلى العثور على مسؤول المجال ، لقد كنت محظوظًا للغاية معه - اتضح أن الرجل كان متجاوبًا وفعل ما طلبوه منه بسرعة كبيرة. وعليك القيام بما يلي.
لنفترض أن اسم المضيف على الجهاز المضيف هو "host-linux" ونطاقك هو "DOMAIN.LOCAL".
في المجال ، تحتاج إلى بدء تشغيل جهاز باسم "host-linux" وإنشاء حساب سنربطه به ، على سبيل المثال ، "host-linux-user". بعد ذلك ، نحتاج إلى إنشاء SPN وإنشاء ملف keytab ، والذي سنحتاجه عند رفع الحاوية.
تحول فريقنا إلى شيء من هذا القبيل
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
بعد أن تلقيت الملف ، يمكن أن أذهب للتجربة. ونتيجة لذلك ، حصلت على 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
الآن ، حتى يبدأ كل شيء ، عند رفع الحاوية ، تحتاج إلى إسقاط nginx.conf الحالي إليها وإطعامه إلى web.keytab المستلم. للقيام بذلك ، استخدم السحر في تكوين عامل الميناء
version: "2" services: nginx-spnego: image: fclmman/alpine-nginx-spnego
دعنا نذهب إلى الدليل حيث لدينا docker-compose.yml. في حالتنا ، في نفس المجلد يجب أن يكون الدليل. /config مع ملفات nginx.conf و web.keytab. قم بتشغيل الأمر
docker-compose -f ./docker-compose.yml up -d
ارتفعت الحاوية ولم تموت. هذا يعطي الأمل للنجاح.
دعونا نفتح المتصفح على جهاز Windows المجال.
في علامة تبويب ، افتح chrome: // net-internals / واكتب الطلبات التي لدينا. في علامة تبويب أخرى ، افتح http: // host-linux: 80 / . دعنا نعود إلى chrome: // net-internals / ونرى النتائج.
# 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
ونتيجة لذلك ، نرى أن العملية كانت ناجحة ونرى شاشة ترحيب nginx.
يجدر تقديم توضيح واحد ، كل شيء سيعمل فقط من خلال اسم المضيف ، ولكن كما أفهمه بشكل صحيح ، لأننا ربطنا kerberos به.
شكرًا لك على اهتمامك ، إذا قرأت هذا المكان ، وآمل حقًا أن تكون المقالة مفيدة.