हाल ही में, मेरे सहयोगियों और मुझे हमारी परियोजना में पारदर्शी (एसएसओ) प्राधिकरण को लागू करने की आवश्यकता थी। अब इस विषय पर विशेष रूप से रूसी में काफी जानकारी है। इस कारण से, इस तरह की कार्यक्षमता के कार्यान्वयन के वंशज के साथ साझा करने का निर्णय लिया गया था।
इसलिए कार्य निम्नानुसार था: उपयोगकर्ता से सर्वर तक जीएसएसएपीआई के माध्यम से पारदर्शी प्राधिकरण को कॉन्फ़िगर करना आवश्यक था, और फिर इस उपयोगकर्ता की ओर से डेटाबेस में जाने की क्षमता भी है।
हमारे पास था:
- कॉन्फ़िगर किया गया Kerberos + LDAP सर्वर
- PostgreSQL सर्वर GSSAPI द्वारा विशेष रूप से प्राधिकरण के लिए कॉन्फ़िगर किया गया है
- कर्ंगोस के साथ Django + UWSGI + nginx एप्लिकेशन सर्वर कॉन्फ़िगर किया गया है
प्रारंभ में, विचार वेब सर्वर के लिए आवेदन में उपयोगकर्ता प्राधिकरण को सौंपने के लिए था, उस पर जीएसएसएपीआई प्राधिकरण स्थापित किया गया था, और Django ने संकेत दिया था कि हम रिमोटयूज़र के साथ काम करेंगे। इस विवरण के भाग के रूप में, मैं GSSAPI पर काम करने के लिए nginx को कॉन्फ़िगर करने के तरीके के बारे में बात नहीं करूंगा, और Django एक वेब सर्वर को प्राधिकरण सौंपने के लिए, यह एक अच्छी तरह से प्रलेखित हिस्सा है, और इस बारे में बहुत सारे लेख हैं। ट्यूनिंग और परीक्षणों के बाद, हमने महसूस किया कि यह वही है जो हमें चाहिए नहीं। हां, हम उपयोगकर्ता का मुख्य नाम अधिकृत और प्राप्त कर सकते हैं, लेकिन हमारे पास इस उपयोगकर्ता की ओर से कुछ भी करने का अधिकार नहीं है।
फिर हमने इंटरनेट पर कुछ सार्थक खोजने के प्रयास किए। वे अपेक्षाकृत सफल थे, और Django के लिए निम्नलिखित पैकेज पाए गए थे:
django-kerberos ,
django-Andor-spnego ,
django-Andor-kerbero । वास्तव में, इन सभी पैकेजों ने एक ही काम किया, कुछ को लंबे समय तक अपडेट नहीं किया गया था और उन्हें लंबे समय तक "डांस विद टैम्ब्रिन" करना पड़ा, ताकि कम से कम कुछ काम हो सके। उन्होंने nginx बंडल (GSSAPI) + Django (RemouteUser) के समान कार्यक्षमता प्रदान की। उन सभी ने अपने स्रोत कोड के साथ समस्या को हल करने में मदद की।
अगला, पायथन में
GSSAPI के साथ काम करने के लिए निम्नलिखित पैकेज पाए गए:
ccs-pykerberos और
python-gssapi , वास्तव में वे पायथन में RFC2744 और RFC4559 मानक के कार्यान्वयन का आयात करते हैं। Ccs-pykerberos पैकेज का उपयोग करते हुए, हम अभी-अभी कार्यशील कार्यक्षमता को लागू करने में कामयाब रहे, फिर मैं थोड़ा कोड दिखाऊंगा जहां LDAP और उपयोगकर्ता के साथ संचार लागू किया गया है, साथ ही उनकी ओर से डेटाबेस को एक प्रश्न पूछा गया है।
from django.shortcuts import render from django.template.response import TemplateResponse import kerberos import psycopg2 def index(request): if 'HTTP_AUTHORIZATION' in request.META: kind, initial_client_token = request.META['HTTP_AUTHORIZATION'].split(' ', 1) if kind == 'Negotiate': service = 'HTTP@django-server-pricipal.che.ru' _ignore_result, krb_context = kerberos.authGSSServerInit(service) kerberos.authGSSServerStep(krb_context, initial_client_token) principal = kerberos.authGSSServerUserName(krb_context) _ignore_result = kerberos.authGSSServerStoreDelegate(krb_context) conn = psycopg2.connect( host='postgresql-server-host', user=principal, dbname='request-db', ) cursor = conn.cursor() cursor.execute("SELECT version()") records = cursor.fetchall() else: unauthorized_template_name = 'gssapi_test/unauthorized.html' response = TemplateResponse(request, 'gssapi_test/index.html', status=401) response['WWW-Authenticate'] = 'Negotiate' return response content = {'records': records} return render(request, 'gssapi_test/index.html', content)
सबसे पहले, हमें यह जांचने की आवश्यकता है कि क्या प्राधिकरण हेडर हमें दिया गया था, यदि नहीं, तो हमें प्रतिक्रिया में हेडर को नेगोशिएट के साथ भेजना चाहिए, और फिर नेगोशिएट उपयोगकर्ता से टोकन की प्रतीक्षा करें। यह टोकन बेस 64 में एन्कोडेड एक बड़े फुटक्लॉथ जैसा दिखता है। टोकन प्राप्त करने के बाद, हम ओडैप सेवा में हमारे आवेदन के सर्वर को अधिकृत (अधिकृत) करते हैं, जो कि ORGGSServerInit () फ़ंक्शन का उपयोग कर रहे हैं। इसके बाद, हम उपयोगकर्ता की ओर से LDAP सेवा में अधिकृत करेंगे, हेडर से प्राप्त किए गए टोकन के लिए मात्र SSLGSSServerStep () फ़ंक्शन का उपयोग करते हुए। फिर हमें उपयोगकर्ता का प्रिंसिपल मिलता है, जिसे हम डेटाबेस में क्वेरी को निष्पादित करते समय, उपयोगकर्ता के रूप में उपयोग करेंगे। और इसके अलावा, हमें एक केर्बरोस बिटेल कैश बनाने की आवश्यकता है, जिसका उपयोग हमें स्वचालित रूप से PostgreSQL में अधिकृत करने के लिए किया जाएगा। यह फ़ंक्शन केवल इस पैकेज के नवीनतम संस्करण में उपलब्ध है, इसलिए आपको अपने स्रोतों को गिट और बिल्ड के साथ क्लोन करने की आवश्यकता है।
ब्राउज़र को वार्ता को वापस करने के लिए कॉन्फ़िगर किया जाना चाहिए, डिफ़ॉल्ट रूप से यह विकल्प अक्षम है। सभी परीक्षण फ़ायरफ़ॉक्स पर CentOS7 में आयोजित किए गए थे, और CentOS7 सभी सर्वरों पर स्थापित किया गया था।
इसके अलावा, हमें एक समस्या हो सकती है जिसमें हमारे कार्य द्वारा उत्पन्न टिकट कैश हमारी प्रक्रिया को दिखाई नहीं देगा और, तदनुसार, हम प्राप्त करेंगे कि उपयोगकर्ता GSSAPI में अधिकृत नहीं था। इसे krb5.conf में टिकट कैशिंग सेट करके हल किया जाता है। बस के मामले में, मैं हमारे विन्यास का एक उदाहरण दूंगा:
/etc/krb5.conf includedir /etc/krb5.conf.d/ includedir /var/lib/sss/pubconf/krb5.include.d/ [libdefaults] default_realm = DOMAIN.RU dns_lookup_realm = false dns_lookup_kdc = false rdns = false ticket_lifetime = 24h forwardable = true udp_preference_limit = 0
कोड का यह टुकड़ा यह समझने में मदद करने के लिए बनाया गया था कि प्राधिकरण और अधिकारों का प्रतिनिधिमंडल कैसे होता है, तो इस ज्ञान के साथ आप डेटाबेस के साथ प्राधिकरण डेकोरेटर और संचार बैकलिंक बना सकते हैं। Apple द्वारा आंतरिक आवश्यकताओं के लिए ccs-pykerberos पैकेज विकसित किया गया था, क्रमशः, मैं उनके कोड का लिंक प्रदान करूँगा, जहाँ वे इसका उपयोग करते हैं। उन्होंने यह समझने में हमारी बहुत मदद की कि उन्होंने
ccs-Calendarserver / twistedcaldav / Cortkerb.py विकसित किया हैउपयोगी लिंक