2008-09-30 6 views
5

हमारे पास एक ऐसी सेवा है जो उपयोगकर्ता नाम और पासवर्ड के आधार पर प्राधिकरण को संभालती है। कॉल का उपयोगकर्ता नाम और पासवर्ड भाग बनाने के बजाय, हम इसे SOAP शीर्षलेख में रखते हैं।इस वेब सेवा सुरक्षा योजना के साथ संभावित समस्याएं क्या हैं?

एक सामान्य परिदृश्य में, एक वेब सेवा निष्पादन की शुरुआत में प्राधिकरण सेवा को कॉल करती है ताकि यह जांच सके कि कॉलर को इसे कॉल करने की अनुमति है। समस्या यह है कि इन वेब सेवाओं में से कुछ एक-दूसरे को कॉल करते हैं, और इसका मतलब यह होगा कि प्रत्येक उप-कॉल पर उपयोगकर्ता की अनुमतियां जांच की जाती हैं, और यह बहुत महंगा हो सकती है।

जो मैंने सोचा था वह प्राधिकरण सेवा पहली कॉल के बाद सुरक्षा टोकन लौटा देना था। फिर, प्राधिकरण सेवा को हर बार कॉल करने के बजाय, वेब सेवा स्थानीय स्तर पर सुरक्षा शीर्षलेख को सत्यापित कर सकती है।

public sealed class SecurityHeader : SoapHeader 
{ 
    public string UserId;  // Encrypted 
    public string Password; // Encrypted; Just realized this field isn't necessary [thanks CJP] 

    public DateTime TimeStamp; // Used for calculating header Expiry 
    public string SecurityToken; 
} 

सामान्य विचार है कि SecurityHeader हर कॉल के साथ की जाँच हो जाता है: - (आवश्यक अवधारणा को वर्णन करने छंटनी सी # कोड)

सुरक्षा हैडर कुछ इस तरह लग रहा है। यदि यह अस्तित्व में है, तो समाप्त नहीं हुआ है, और सुरक्षा टोकन मान्य है, तो वेब विधि सामान्य के रूप में प्राप्त होती है। अन्यथा यह या तो एक त्रुटि लौटाएगा, या यह एक नया सुरक्षा हैडर

सुरक्षा टोकन उपयोगकर्ता आईडी, पासवर्ड और टाइमस्टैम्प के नमकीन हैश पर आधारित है। प्रतिकृति को रोकने के लिए हर दिन नमक बदल जाता है।

एक समस्या जो मैं देखता हूं वह यह है कि किसी उपयोगकर्ता को वेब सेवा ए तक पहुंचने की अनुमति हो सकती है, लेकिन वेब सेवा बी नहीं। यदि वह ए को कॉल करता है और सुरक्षा टोकन प्राप्त करता है, क्योंकि अब इसका मतलब है कि बी उसे दे देगा अगर वह उसी टोकन का उपयोग करता है। मुझे इसे बदलना है ताकि सुरक्षा टोकन केवल उपयोगकर्ता सेवा से वेब सेवा के बजाय वेब सेवा से वेब सेवा के लिए मान्य हो। यह ठीक होना चाहिए यदि उपयोगकर्ता ए को कॉल करता है जो बी को कॉल करता है, लेकिन यदि उपयोगकर्ता सेवा ए और फिर सेवा डी को कॉल करता है तो ठीक नहीं है। इसके आस-पास एक तरीका है जो तर्कसंगत संबंधित सेवाओं के लिए एक सामान्य कुंजी (या चाबियों का एक सेट) असाइन करना है। (यानी यदि ग्राहक ए कर सकता है तो तार्किक रूप से वह बी भी कर सकता है)।

वैकल्पिक रूप से, मुझे सुरक्षा शीर्षलेख के हिस्से के रूप में उपयोगकर्ता की संपूर्ण अनुमति सेट को एन्कोड करना होगा। मुझे जांच करनी होगी कि ओवरहेड क्या होगा।

संपादित करें:

कई लोगों ने मुझे पहले से ही है WS-सुरक्षा और SAML आदि जैसे अन्य सुरक्षा योजनाओं को देख उल्लेख किया है। वास्तव में, मुझे डब्ल्यूएस-सुरक्षा से विचार मिला। समस्या यह है कि अन्य योजनाएं मुझे आवश्यक कार्यक्षमता प्रदान नहीं करती हैं (प्रमाणीकरण जानकारी को कैशिंग और बिना किसी डेटाबेस डेटाबेस के प्रतिलिपि के खिलाफ सुरक्षा)। अगर कोई ऐसी योजना के बारे में जानता है जो करता है तो मैं इसके बजाय इसका उपयोग करूँगा। इसके अलावा, यह प्रमाणीकरण के बारे में नहीं है। यह मेरे नियंत्रण से परे एक और तंत्र द्वारा संभाला जाता है।

यदि यह पता चला है कि प्रमाणीकरण डेटा कैश करने का कोई तरीका नहीं है, तो इसका मतलब है कि मुझे केवल प्रत्येक स्तर पर प्राधिकरण के उपरांत को लेना होगा।

+0

एक एसएएमएल दावा निम्न जैसा दिखता है: "क्लाइंट एक्स की भूमिका ए और बी है। यह दावा समय टी के साथ मान्य है, हस्ताक्षर, ऑथ सेवा।" यह आपको क्या चाहिए? – ykaganovich

+0

मैं आज एसएएमएल और एक्सएसीएमएल की समीक्षा करूंगा। – ilitirit

उत्तर

1

व्यक्तिगत रूप से मुझे तब तक कोई समस्या नहीं है जब तक आपके पास सुरक्षा टोकन मानों के सत्यापन का समर्थन करने के लिए केंद्रीकृत अंतर्निहित ढांचा है।

2

ठीक है, मेरे पुराने उत्तरों को उम्मीद से बेहतर तरीके से बदलना।

यदि आपके पास अपनी सेवाओं के बीच डेटा को सुरक्षित रूप से साझा करने का कोई तरीका है तो आप क्या वर्णन करना चाहिए।उदाहरण के लिए, यदि आपकी सेवाएं प्राधिकरण सेवा के साथ एक गुप्त कुंजी साझा करती हैं, तो आप नमक प्राप्त करने के लिए इस कुंजी का उपयोग कर सकते हैं।

Btw, मैं काफी क्रिप्टोग्राफी चाहे वह गुप्त नमक + हैश जोड़ने के लिए (हालांकि ठीक लग रहा है) काफी सुरक्षित है कहने के लिए पता नहीं है; मुझे यकीन है कि यह एक गुप्त या निजी कुंजी के साथ HMAC पर सुरक्षित है। घूर्णन कुंजी एक अच्छा विचार है, इसलिए आपके पास अभी भी एक मास्टर कुंजी होगी और एक नई हस्ताक्षर कुंजी प्रसारित होगी।

आपके दृष्टिकोण के साथ अन्य मुद्दे यह हैं कि (ए) आप प्रत्येक सेवा में हैशिंग तर्क को हार्डकोड कर रहे हैं, और (बी) सेवाएं प्राधिकरण सेवा से अधिक विस्तृत डेटा प्राप्त करना चाहती हैं, केवल हां/नहीं उत्तर से। उदाहरण के लिए, आप प्राधिकरण सेवा को हेडर में डालने के लिए चाहते हैं कि यह उपयोगकर्ता भूमिका ए और बी से संबंधित है लेकिन सी

वैकल्पिक रूप से, आप प्राधिकरण सेवा को जो भी रोचक जानकारी के साथ एक नया शीर्षलेख बना सकते हैं है, और उस ब्लॉक पर हस्ताक्षर करें।

इस बिंदु पर, हम एकल साइन-ऑन कार्यान्वयन पर चर्चा कर रहे हैं। आप पहले से ही WS-Security चश्मे के बारे में जानते हैं। मैंने जो हेडर वर्णित किया है वह SAML दावे की तरह बहुत कुछ लगता है।

एकल साइन-ऑन के लिए WS-सुरक्षा और SAML का उपयोग के बारे में Here's an article

अब, मुझे नहीं पता कि आपको यह सब चाहिए ... समाधान के बीच भी हैं। उदाहरण के लिए, प्राधिकरण सेवा मूल उपयोगकर्ता नाम ब्लॉक पर हस्ताक्षर कर सकती है; यदि आप सार्वजनिक/निजी क्रिप्टो प्रदर्शन के बारे में चिंता करते हैं, और आप गुप्त कुंजी साझा करना ठीक कर रहे हैं, तो आप सार्वजनिक/निजी कुंजी के बजाय साइन करने के लिए एक गुप्त कुंजी का भी उपयोग कर सकते हैं।

4

आपकी योजना के साथ मौलिक समस्या यह है कि आप मानक ढांचे या कार्यान्वयन का उपयोग नहीं कर रहे हैं। यह आपकी योजना के किसी विशेष गुण के बावजूद है।

कारण सरल है, सुरक्षा (विशेष रूप से क्रिप्टोग्राफ़ी) बहुत जटिल है और सही होने के लिए बहुत असंभव है। एक सामान्य उपकरण का प्रयोग करें जो मजबूत, अच्छी तरह समझा और सिद्ध हो।

देखें: http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss डब्ल्यूएस-सुरक्षा पर अधिक जानकारी के लिए।

अधिकांश चौखटे (.NET/JavaEE आदि) WS-सुरक्षा के लिए में निर्मित समर्थन (कुछ हद तक) होगा।

यदि आप मानकों की तुलना में किसी भी तरीके से बेहतर होने के लिए अपनी योजना को कम करते हैं, तो मेरा सुझाव है कि आप इसे एक पेपर के रूप में लिखें और इसे पीयर-समीक्षा (संदर्भ कार्यान्वयन के साथ) के लिए सबमिट करें, लेकिन इसे सुरक्षित रखने के लिए उपयोग न करें एक आवेदन पत्र। में मुझे लगता है कि आप प्रमाणीकरण और प्राधिकरण एक छोटे से है, जो करने के लिए आसान है की भूमिका भ्रमित कर रहे हैं ...

सुरक्षा टोकन (या समान) के रोल:

संपादित ओपी संपादित करने के लिए प्रतिक्रिया करने के लिए योजनाएं संदेश के प्रेषक को प्रमाणित करना है - मूल रूप से, वह प्रेषक है जो उन्हें होना चाहिए। जैसा कि आपने सही तरीके से बताया है, प्रमाणीकरण कुछ भी नहीं बताता है कि प्रेषक को किस अंतर्निहित संसाधनों तक पहुंच प्रदान की जानी चाहिए।

प्राधिकरण प्रक्रिया है जिसके तहत आप ताकि आप एक्सेस के कार्यक्षेत्र को सीमित कर सकते हैं एक प्रमाणीकृत इस से कुछ अनुमतियां सेट लेने के लिए और लागू है। आम तौर पर ढांचे डिफ़ॉल्ट रूप से प्राधिकरण नहीं करेंगे, आपको या तो एसीएल का कुछ रूप बनाकर या किसी प्रकार के "सुरक्षा प्रबंधक" प्रकार इंटरफ़ेस को विस्तारित करके इसे सक्षम करना होगा।

वास्तव में, यह विचार है कि प्रमाणीकरण परत तुम कौन पृष्ठ एक का उपयोग करने की कोशिश कर रहा है बताता है, और आप के लिए यह तय करने के लिए छोड़ देता है, तो उस व्यक्ति तक पहुँचने के लिए पृष्ठ ए

अधिकृत है आप दुकान कभी नहीं करना चाहिए संदेश में अधिकारों और अनुमतियों के बारे में जानकारी - रिसीवर को प्रत्येक संदेश के लिए अपने एसीएल (या डेटाबेस या जो भी) के खिलाफ अधिकार सत्यापित करना चाहिए। यह आपके एक्सपोजर को सीमित करता है किसी को यह पता लगाना चाहिए कि संदेश को कैसे संशोधित किया जाए।

+0

क्या आप इसके साथ किसी भी संभावित समस्या को देखते हैं? – ilitirit

+0

समस्याएं कार्यान्वयन में होने की संभावना है, उदा। यदि आप रीप्ले, पैडिंग, टक्कर इत्यादि के लिए खुले हैं। ईमानदारी से यह नाटक के लायक नहीं है जब आप उन चीजों का उपयोग कर सकते हैं जो अन्य लोगों ने पहले से ही अपने सिर कर चुके हैं :) –

+0

मुझे लगता है कि आपका क्या मतलब है - उपयोगकर्ता को प्रमाणीकृत होने के बाद मुझे पासवर्ड स्टोर करने की आवश्यकता नहीं है। यह सिर्फ चीजों को थोड़ा आसान बनाता है। हालांकि, यह अभी भी प्रारंभिक समस्या में मदद नहीं करता है - अनुमतियों को कैश करना ताकि मुझे प्रत्येक संदेश के साथ यह जांच न हो (यह एक महंगा ऑपरेशन है) – ilitirit

0

सबसे पहले, @ सीजेपी की पोस्ट पढ़ें, वह एक उत्कृष्ट और वैध बिंदु बनाता है।
आप आगे जाना है और यह अपने आप को रोल वैसे भी (हो सकता है आप इसके लिए एक अच्छा कारण है) करने के लिए, मैं निम्नलिखित बातों होगा चाहते हैं:

  • आप एक प्रमाणीकरण सेवा, नहीं एक प्राधिकरण के बारे में बात कर रहे हैं सर्विस। बस यह सुनिश्चित करने के लिए कि आप जानते हैं कि आप किस बारे में बात कर रहे हैं ...?
  • दूसरा, आपको नमक (जो रहस्य नहीं है) और कुंजी (जो है) के बीच अलग होना चाहिए। आपके पास एक चाबी हैश (उदा। एचएमएसी) होना चाहिए, साथ में नमक (या एक चाबीदार नमकीन हैश। सैंडविच की तरह लगता है।)। जैसा कि उल्लेख किया गया नमक गुप्त नहीं है, लेकिन प्रत्येक टोकन के लिए बदला जाना चाहिए, और हेडर में शामिल किया जा सकता है; कुंजी गुप्त होना चाहिए और हर दिन बदलना अच्छा है। बेशक, सुनिश्चित करें कि आप मजबूत हैश (जैसे SHA-256), उचित कुंजी प्रबंधन तकनीकों, वगैरह वगैरह

उपयोग कर रहे हैं फिर से बनाने के लिए, मैं अपने खुद के रोलिंग पुनर्विचार करने के लिए आप से आग्रह करता हूं, लेकिन बाहर जाने के लिए अगर आपके पास अपने आप पर ...

+0

मैं एक प्रमाणीकरण सेवा के बारे में बात नहीं कर रहा हूं, मैं प्राधिकरण (अनुमतियों) के बारे में बात कर रहा हूं। नमक मूल्यों को चाबियों के रूप में उपयोग किया जा सकता है (मेरे पास एक गुप्त कुंजी भी है) .मैं एक मौजूदा योजना में नहीं आया हूं जो हैंडल मध्यवर्ती डेटाबेस के बिना तृतीय पक्ष प्राधिकरण और रीप्ले हमले। – ilitirit

+0

ठीक है, आपके संपादन के बाद मैं आपका बिंदु देखता हूं - लेकिन यह अभी तक वास्तव में प्राधिकरण नहीं है जब तक कि आप "अनुमति सेट" शामिल नहीं करते हैं। अधिकतर, इसकी प्रमाणीकरण + पहुंच। – AviD

+0

इसके अलावा, हैश को सलाने से स्पूफिंग को रोका नहीं जाएगा, इसके लिए आपको एक कुंजी हैश की आवश्यकता है - नमक इंद्रधनुष तालिका के हमलों को रोकने के लिए है, इसलिए प्रत्येक टोकन के लिए यह अद्वितीय होना आवश्यक है। – AviD

संबंधित मुद्दे