REST API / वेब सेवा [बंद] हासिल करने के लिए सर्वोत्तम अभ्यास


828

REST API या सेवा डिज़ाइन करते समय सुरक्षा (प्रमाणीकरण, प्राधिकरण, पहचान प्रबंधन) से निपटने के लिए कोई स्थापित सर्वोत्तम प्रथाएं हैं?

सोप एपीआई का निर्माण करते समय आपके पास एक गाइड के रूप में WS-Security होता है और इस विषय पर बहुत अधिक साहित्य मौजूद होता है। मुझे REST के समापन बिंदु सुरक्षित करने के बारे में कम जानकारी मिली है।

जबकि मैं समझता हूं कि REST जानबूझकर WS- * के अनुरूप विनिर्देशन नहीं रखता है - मैं सर्वोत्तम प्रथाओं की उम्मीद कर रहा हूं या अनुशंसित पैटर्न सामने आए हैं।

किसी भी चर्चा या प्रासंगिक दस्तावेजों के लिंक की बहुत सराहना की जाएगी। अगर यह मायने रखता है, तो हम .NET फ्रेमवर्क के v3.5 का उपयोग करके निर्मित हमारे REST API / सेवाओं के लिए POX / JSON के धारावाहिक संदेशों के साथ WCF का उपयोग करेंगे।


1
क्या आप Github में REST API और webServices के साथ अच्छे पैटर्न और प्रथाओं का उपयोग करके किसी भी पूर्ण वास्तविक एप्लिकेशन को जानते हैं?
प्रीग्टनटनकोजेनो कैब्रॉन

जवाबों:


298

जैसा कि चिकोटी ने कहा, अमेज़ॅन एस 3 काम करने के लिए एक अच्छा मॉडल है। उनके अनुरोध पर हस्ताक्षर में कुछ विशेषताएं हैं (जैसे टाइमस्टैम्प को शामिल करना) जो आकस्मिक और दुर्भावनापूर्ण अनुरोध दोनों को रोकने में मदद करते हैं।

HTTP बेसिक के बारे में अच्छी बात यह है कि लगभग सभी HTTP लाइब्रेरी इसका समर्थन करते हैं। बेशक, आपको इस मामले में एसएसएल की आवश्यकता होगी, क्योंकि नेट पर प्लेनटेक्स्ट पासवर्ड भेजना लगभग सार्वभौमिक रूप से एक बुरी बात है। SSL का उपयोग करते समय बेसिक डाइजेस्ट के लिए बेहतर है क्योंकि भले ही फोन करने वाले को पहले से ही पता हो कि क्रेडेंशियल्स की आवश्यकता है, डाइजेस्ट को नॉन वैल्यू का आदान-प्रदान करने के लिए एक अतिरिक्त राउंडट्रिप की आवश्यकता होती है। बेसिक के साथ, कॉल करने वाले केवल पहली बार क्रेडेंशियल्स भेजते हैं।

एक बार क्लाइंट की पहचान स्थापित हो जाने के बाद, प्राधिकरण वास्तव में सिर्फ एक कार्यान्वयन समस्या है। हालाँकि, आप प्राधिकरण को किसी अन्य घटक को किसी मौजूदा प्राधिकरण मॉडल के साथ सौंप सकते हैं। फिर से बेसिक के बारे में अच्छी बात यह है कि आपका सर्वर क्लाइंट के पासवर्ड की एक सादे कॉपी के साथ समाप्त होता है जिसे आप आवश्यकतानुसार अपने बुनियादी ढांचे के भीतर किसी अन्य घटक पर पास कर सकते हैं।


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

36
@ नोर्मन: आपका तर्क विश्वसनीय है, क्योंकि यदि कोई व्यक्ति पूरे लेनदेन को देख सकता है जो मैं ट्विटर पर पोस्ट करने के लिए उपयोग करता हूं, तो वे इसलिए मुझे प्रतिरूपण कर सकते हैं और मेरे नाम के तहत अपने स्वयं के संदेश पोस्ट कर सकते हैं।
ग्रेग हेविगिल

3
डाइजेस्ट ऑथेंटिकेशन पर विकिपीडिया से उद्धृत करते हुए, "डाइजेस्ट एक्सेस ऑथेंटिकेशन उन सहमति-विधियों में से एक है जो वेब सर्वर किसी उपयोगकर्ता के वेब ब्राउज़र के साथ क्रेडेंशियल्स का उपयोग करने के लिए उपयोग कर सकता है। यह नेटवर्क पर भेजने से पहले पासवर्ड के लिए एक हैश फ़ंक्शन लागू करता है, जो है। बुनियादी पहुंच प्रमाणीकरण की तुलना में अधिक सुरक्षित है, जो प्लेनटेक्स्ट भेजता है। " जो मैं ऊपर करने के लिए alluded पूरा करने का एक मानक तरीका होगा। ( विवरण के लिए en.wikipedia.org/wiki/Digest_access_authentication देखें )
नॉर्मन एच।

5
"sending plaintext passwords over the net is almost universally a bad thing"- क्या आप "लगभग" पर विस्तार से बता सकते हैं? यह एक बुरा विचार कब नहीं है?
toniedzwiedz

2
निजी नेटवर्क में भी @GregHewgill, मैं नहीं चाहूंगा कि मेरे उपयोगकर्ता एक-दूसरे के पासवर्ड को इंटरसेप्ट कर सकें। केवल वही स्थिति जिसके बारे में मैं सोच सकता हूं, जिसमें नेटवर्क पर पासवर्ड भेजना ठीक है, जब उपयोगकर्ता नेटवर्क में अकेला हो। तथ्य यह है कि ऐसी बातें कहीं और घटित होती हैं, शायद ही इसे अनुमति देने का कोई कारण हो।
toniedzwiedz

115

HTTP के अलावा REST के लिए कोई मानक नहीं हैं। वहाँ बाहर REST सेवाएँ स्थापित हैं। मेरा सुझाव है कि आप उन पर एक नज़र डालें और यह महसूस करें कि वे कैसे काम करते हैं।

उदाहरण के लिए, हमने अपना विकास करते समय अमेज़न की S3 REST सेवा से बहुत सारे विचार उधार लिए। लेकिन हमने अनुरोध हस्ताक्षरों के आधार पर अधिक उन्नत सुरक्षा मॉडल का उपयोग नहीं करने का विकल्प चुना। सरल दृष्टिकोण HTTP पर HTTP बेसिक है। आपको यह तय करना होगा कि आपकी स्थिति में सबसे अच्छा क्या काम करता है।

इसके अलावा, मैं अत्यधिक O'reilly की पुस्तक रेस्टफुल वेब सर्विसेज की सिफारिश करता हूं । यह मुख्य अवधारणाओं की व्याख्या करता है और कुछ सर्वोत्तम अभ्यास प्रदान करता है। आप आम तौर पर उनके द्वारा प्रदान किए गए मॉडल को ले सकते हैं और इसे अपने स्वयं के एप्लिकेशन में मैप कर सकते हैं।


6
रेस्टफुल वेब सर्विसेज निश्चित रूप से एक बेहतरीन किताब है। इस क्षेत्र में पढ़ना चाहिए। यह सर्वथा प्रेरक था।
एडगरवीरोना

6
यह कैसे है कि @aehlke ने उस टिप्पणी (1) पर विचार करने के लिए इतने सारे अपवोट प्राप्त किए हैं (1) REST विनिर्देशन जैसी कोई चीज नहीं है और (2) आर्किटेक्चरल स्टाइल्स पर फ़ील्डिंग शोध प्रबंध और नेटवर्क-आधारित सॉफ़्टवेयर आर्किटेक्चर के डिज़ाइन में स्पष्ट रूप से REST का उल्लेख है और 6.3 में HTTP: HTTP पर REST लागू है।

20
REST के लिए HTTP एक आवश्यकता नहीं है।
13'13


मैं पुस्तक को पढ़ने की योजना बना रहा था और तब मुझे महसूस हुआ कि यह मुख्य रूप से XML प्रारूप के लिए लक्षित है। क्या मुझे JSON की लोकप्रियता को देखते हुए इस पुस्तक का उपयोग करना चाहिए? या यह डेटा इंटरचेंज फॉर्मेट पर निर्भर नहीं है। मार्गदर्शन चाहिए।
भार्गव झावेरी

72

तुम भी OAuth पर एक नज़र रखना चाहते हो सकता है , टोकन आधारित प्राधिकरण के लिए एक खुला खुला प्रोटोकॉल विशेष रूप से http एपिस को लक्षित कर रहा है।

यह फ्लिकर द्वारा लिए गए दृष्टिकोण के समान है और दूध "रेस्ट" एपिस को याद रखें (आवश्यक रूप से आरामदायक एपिस के अच्छे उदाहरण नहीं हैं, लेकिन टोकन-आधारित दृष्टिकोण के अच्छे उदाहरण हैं)।


3
लेकिन ऐसा लगता है कि 2-पैर वाले ऑउथ, जो मुझे लगता है कि यहां की जरूरत है, कवर नहीं किया गया है (जानकारी की कमी) जितना 3-पैर वाला।
redben

4
OAuth प्राधिकरण के प्रत्यायोजन के बारे में है अर्थात मैं जानकारी का स्वामी / खाता सेवा A को सेवा B पर अपने डेटा के साथ सहभागिता करने देता हूं (जैसे कि मैं अपने फेसबुक पर ट्विटर लिखने देता हूं)। यह व्यापक अर्थों में प्राधिकरण नहीं है जो उपयोगकर्ताओं को संसाधनों (डेटा, सूचना, सेवाओं ...) पर नियंत्रण करने के बारे में है। यह वह जगह है जहां XACML में कदम है। XACML आपको प्राधिकरण नीतियों को परिभाषित करने देता है कि कौन क्या कर सकता है।
डेविड ब्रॉस्सार्ड

60

जीथब पर एक शानदार चेकलिस्ट मिली है :

प्रमाणीकरण

  • प्रमाणीकरण, टोकन पीढ़ी, पासवर्ड भंडारण में पहिया को मजबूत न करें। मानकों का उपयोग करें।

  • Max Retryलॉगिन में उपयोग और जेल सुविधाओं।

  • सभी संवेदनशील डेटा पर एन्क्रिप्शन का उपयोग करें।

JWT (JSON वेब टोकन)

  • टोकन को बहुत कठिन बनाने के लिए एक यादृच्छिक जटिल कुंजी (JWT सीक्रेट) का उपयोग करें।

  • पेलोड से एल्गोरिथ्म न निकालें। बैकएंड (HS256 या RS256) में एल्गोरिथ्म को बल दें।

  • टोकन समाप्ति बनाएं (TTLRTTLजहां तक ​​संभव हो , ) करें।

  • में संवेदनशील डेटा संग्रहीत न करें JWTपेलोड , इसे आसानी से डिकोड किया जा सकता है।

OAuth

  • हमेशा मान्य redirect_uriकेवल श्वेतसूची वाले URL की अनुमति देने के लिए सर्वर-साइड को करें।

  • हमेशा कोड के लिए विनिमय करने की कोशिश करें और टोकन न दें (अनुमति न दें response_type=token )।

  • रोकने के लिए एक यादृच्छिक हैश के साथ राज्य पैरामीटर का उपयोग करें CSRF पर OAuthप्रमाणीकरण प्रक्रिया।

  • डिफ़ॉल्ट स्कोप को परिभाषित करें, और प्रत्येक एप्लिकेशन के लिए स्कोप पैरामीटर को मान्य करें।

पहुंच

  • डीडीओएस / ब्रूट-फोर्स हमलों से बचने के लिए अनुरोध (थ्रॉटलिंग) को सीमित करें।

  • MITM (मध्य आक्रमण में आदमी) से बचने के लिए सर्वर साइड पर HTTPS का उपयोग करें

  • HSTSSSL के साथ हेडर का उपयोग करें एसएसएल स्ट्रिप अटैक से बचने के लिए।

इनपुट

  • ऑपरेशन के अनुसार उचित HTTP विधि का उपयोग करें: GET(पढ़ें), POST(बनाएं), PUT/PATCH(बदलें / अपडेट), और DELETE(किसी रिकॉर्ड को हटाने के लिए), और 405 Method Not Allowedअनुरोधित संसाधन के लिए अनुरोधित विधि उपयुक्त नहीं होने पर प्रतिक्रिया दें ।

  • अनुरोध पर मान्य सामग्री प्रकार Acceptशीर्ष लेख (सामग्री बातचीत) केवल अपने समर्थित प्रारूप (जैसे अनुमति देने के लिए application/xml, application/jsonके साथ, आदि) और प्रतिक्रिया 406 Not Acceptableप्रतिक्रिया करता है, तो मिलान नहीं किया।

  • मान्य content-typeके रूप में आप स्वीकार तैनात डेटा के (जैसे application/x-www-form-urlencoded, multipart/form-data,application/json , आदि)।

  • सामान्य भेद्यताओं (जैसे XSS, SQL- इंजेक्शन, रिमोट कोड निष्पादन, आदि) से बचने के लिए उपयोगकर्ता इनपुट को मान्य करें।

  • URL में किसी भी संवेदनशील डेटा (क्रेडेंशियल्स, पासवर्ड, सुरक्षा टोकन या API कुंजियों) का उपयोग न करें, लेकिन मानक Authorizationहेडर का उपयोग करें ।

  • कैशिंग, Rate Limitनीतियों (जैसे कोटा, स्पाइक अरेस्ट, समवर्ती दर सीमा) को सक्षम करने और गतिशील रूप से एपीआई संसाधनों को तैनात करने के लिए एक एपीआई गेटवे सेवा का उपयोग करें ।

प्रसंस्करण

  • जाँच करें कि क्या सभी समापन बिंदु प्रमाणीकरण प्रक्रिया से बचने के लिए प्रमाणीकरण के पीछे सुरक्षित हैं।

  • उपयोगकर्ता के स्वयं के संसाधन आईडी से बचा जाना चाहिए। / User / 654321 / आदेशों के बजाय / me / ऑर्डर का उपयोग करें।

  • ऑटो-इंक्रीमेंट आईडी न करें। इसके बजाय UUID का उपयोग करें।

  • यदि आप XML फ़ाइलों को पार्स कर रहे हैं, तो सुनिश्चित करें कि XXE (XML बाहरी इकाई के हमले) से बचने के लिए इकाई पार्सिंग सक्षम नहीं है।

  • यदि आप एक्सएमएल फाइलों को पार्स कर रहे हैं, तो सुनिश्चित करें कि एक्सपेंसेशन एक्सपेंशन अटैक के माध्यम से बिलियन लाफ्स / एक्सएमएल बम से बचने के लिए इकाई विस्तार सक्षम नहीं है।

  • फ़ाइल अपलोड के लिए CDN का उपयोग करें।

  • यदि आप भारी मात्रा में डेटा के साथ काम कर रहे हैं, तो पृष्ठभूमि में जितना संभव हो सके प्रोसेस करने के लिए वर्कर्स और क्यूज़ का उपयोग करें और HTTP बुकिंग से बचने के लिए तेजी से प्रतिक्रिया दें।

  • DEBUG मोड को बंद करना न भूलें ।

उत्पादन

  • X-Content-Type-Options: nosniffहेडर भेजें ।

  • X-Frame-Options: denyहेडर भेजें ।

  • Content-Security-Policy: default-src 'none'हेडर भेजें ।

  • हेडर फिंगरप्रिंटिंग निकालें - X-Powered-By, Server, X-AspNet-Versionआदि

  • content-typeआपकी प्रतिक्रिया के लिए बल , यदि आप वापस लौटते हैं application/jsonतो आपकी प्रतिक्रिया सामग्री-प्रकार है application/json

  • संवेदनशील डेटा जैसे क्रेडेंशियल, पासवर्ड, सुरक्षा टोकन वापस न करें।

  • पूर्ण किए गए ऑपरेशन के अनुसार उचित स्थिति कोड लौटाएं। (उदाहरण के लिए 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed, आदि)।


1
अच्छी सूची, हालांकि थोड़ी सी राय - और यह एक बकवास imho से शुरू होती है: "बुनियादी प्रामाणिक उपयोग मानक प्रमाणीकरण (जैसे JWT, OAuth) का उपयोग न करें।" आप मूल प्रमाण से अधिक मानक-वाई प्राप्त नहीं कर सकते हैं, और इसकी जगह है, विशेष रूप से एपीआई के लिए जहां क्लाइंट ब्राउज़र नहीं हैं (ब्राउज़रों के लिए JWT आमतौर पर अधिक उपयुक्त है)। दूसरी ओर Outh प्रमाणीकरण के लिए समझौतों के एक पूरे सेट का उपयोग कर रहा है और वास्तव में बेसिक प्रमाणीकरण और JWT के लिए तुलनीय नहीं है।
जॉन्डोडो

आप सही कह रहे हैं, HTTPS के साथ BasicAuth आम है, लेकिन इस पर गरमागरम बहस होती है - Security.stackexchange.com/questions/988/… । मैं इस बिंदु को वैसे भी हटा दूंगा।
बेपनीज

43

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


हम वास्तव में कुछ एकीकरण के साथ-साथ पुराने सिस्टम का समर्थन करने के लिए एन्क्रिप्टेड vpn सुरंगों के लिए इसका उपयोग करते हैं जिन्हें हम नियंत्रित नहीं करते हैं जो कि https के लिए संचार नहीं कर सकते हैं।
केसी

जब आप लोड बैलेंसिंग की आवश्यकता होती है, तो क्लाइंट सेटर परेशानी कर सकते हैं ... यह किया जा सकता है, लेकिन यह कम सीधा है।
जेरेमी लोगान

2
@fiXedd - ग्राहक क्लाइंट के साथ मेरा अनुभव विपरीत है क्योंकि वे वास्तव में स्टेटलेस हैं। क्लाइंट सर्टिफाइड प्रमाणित कनेक्शनों को डंबल लोड बैलेंसर के साथ संतुलित किया जा सकता है ताकि कनेक्शन चिपचिपाहट का कोई संबंध न हो क्योंकि उन्हें क्लाइंट और सर्वर के बीच बिल्कुल शून्य साझा स्थिति की आवश्यकता होती है।
बदबूदार

4
ओह, आप यह कर सकते हैं .... आप बस टीसीपी ट्रैफिक को लोड करने वाले को आगे ले जा सकते हैं, लेकिन उदाहरण के लिए, लोड बैलेंसर को एसएसएल के लिए समाप्ति बिंदु मान सकते हैं।
जेरेमी लोगन

क्या यह अभी भी सुरक्षित है अगर क्लाइंट सर्टिफिकेट और इसके रूट अथॉरिटी में स्व-हस्ताक्षरित हैं? रूट प्राधिकरण को ग्राहक के विश्वसनीय रूट प्रमाणपत्र अधिकारियों में आयात किया जाएगा।
जॉयस

38

इन उत्तरों में हर किसी ने सच्चे अभिगम नियंत्रण / प्राधिकरण की अनदेखी की है।

यदि उदाहरण के लिए आपकी REST API / वेब सेवाएँ POSTing / GETing मेडिकल रिकॉर्ड के बारे में हैं, तो आप एक्सेस कंट्रोल पोलीसी को परिभाषित करना चाह सकते हैं कि कौन डेटा तक पहुँच सकता है और किन परिस्थितियों में। उदाहरण के लिए:

  • डॉक्टर एक ऐसे मरीज का मेडिकल रिकॉर्ड प्राप्त कर सकते हैं, जिसके साथ उनका देखभाल संबंध है
  • प्रैक्टिस आवर्स के बाहर कोई भी मेडिकल डेटा पोस्ट नहीं कर सकता (उदाहरण के लिए 9 से 5)
  • अंतिम-उपयोगकर्ता वे मेडिकल रिकॉर्ड प्राप्त कर सकते हैं जिनके वे स्वयं या उन रोगियों के मेडिकल रिकॉर्ड हैं जिनके लिए वे अभिभावक हैं
  • नर्सें एक मरीज के मेडिकल रिकॉर्ड का पता लगा सकती हैं जो नर्स के रूप में उसी इकाई से संबंधित है।

उन ठीक-ठीक प्राधिकरणों को परिभाषित करने और कार्यान्वित करने के लिए, आपको XACML नामक एक विशेषता-आधारित अभिगम नियंत्रण भाषा का उपयोग करने की आवश्यकता होगी, जो कि एक्स्टेंसिबल एक्सेस कंट्रोल मार्कअप लैंग्वेज है।

अन्य मानक निम्नलिखित हैं:

  • OAuth: आईडी। महासंघ और प्राधिकरण का प्रतिनिधिमंडल जैसे किसी अन्य सेवा पर मेरी ओर से सेवा अधिनियम देना (फेसबुक मेरे ट्विटर पर पोस्ट कर सकता है)
  • एसएएमएल: पहचान महासंघ / वेब एसएसओ। SAML इस बारे में बहुत है कि उपयोगकर्ता कौन है।
  • WS- सुरक्षा / WS- * मानक: ये SOAP सेवाओं के बीच संचार पर ध्यान केंद्रित करते हैं। वे एप्लिकेशन-लेवल मैसेजिंग फॉर्मेट (SOAP) के लिए विशिष्ट हैं और वे मैसेजिंग के पहलुओं जैसे कि विश्वसनीयता, सुरक्षा, गोपनीयता, अखंडता, परमाणुता, ईवेंटिंग से संबंधित हैं ... कोई भी एक्सेस एक्सेस कंट्रोल नहीं करता है और सभी SOAP के लिए विशिष्ट हैं।

XACML प्रौद्योगिकी-अज्ञेयवादी है। यह जावा ऐप्स, .NET, पायथन, रूबी ... वेब सेवाओं, REST API और अन्य पर लागू किया जा सकता है।

निम्नलिखित दिलचस्प संसाधन हैं:


2
मुझे समझ में नहीं आता कि आप केवल टोकन सिस्टम क्यों नहीं लागू कर सकते हैं जो उपयोगकर्ता और उसकी अनुमतियों को प्राप्त करेगा जो अनिवार्य रूप से एक ही बात होगी?
स्टेन

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

2
एक पक्ष की टिप्पणी के रूप में, "9 से 5" सुरक्षा में क्या योगदान देता है? जैसे कि हमलावर केवल रात में सक्रिय हैं? गंभीर उपयोग के निहितार्थ के बारे में बात नहीं करना, जैसे कि डॉक्टर केवल "9 से 5" काम करते हैं।
रोलैंड

स्वास्थ्य देखभाल परिदृश्यों में यह एक सामान्य आवश्यकता है। उदाहरण के लिए HL7 देखें। यदि डॉक्टर को बाहरी घंटों तक पहुंच की आवश्यकता होती है, तो ब्रेक-इन-ग्लास परिदृश्य भी होते हैं। हैकर्स के लिए, एक बार जब वे सभी दांव बंद हो जाते हैं
डेविड ब्रोडार्ड

1
मेरे कुछ सहकर्मी वास्तव में इसकी जांच कर रहे हैं। साभार @SimplyG
डेविड ब्रॉसार्ड

25

मैंने कुछ बार OAuth का उपयोग किया है, और कुछ अन्य तरीकों (BASIC / DIGEST) का भी उपयोग किया है। मैं पूरी ईमानदारी से OAuth का सुझाव देता हूं। निम्नलिखित लिंक OAuth का उपयोग करने पर मैंने देखा सबसे अच्छा ट्यूटोरियल है:

http://hueniverse.com/oauth/guide/


यद्यपि यह OAuth 1.0 से संबंधित एक बहुत पुराना उत्तर है, यह ध्यान देने योग्य है कि आपके द्वारा उद्धृत लिंक के लेखक ने OAuth 2.0 के बारे में कहा था : "मैं इस निष्कर्ष पर पहुंचा कि OAuth 2.0 एक बुरा प्रोटोकॉल है ... जब Outh के साथ तुलना की जाती है 1.0, 2.0 विनिर्देश अधिक जटिल, कम इंटरऑपरेबल, कम उपयोगी, अधिक अपूर्ण, और सबसे महत्वपूर्ण, कम सुरक्षित है। " । स्पष्ट होने के लिए, जो टिप्पणी मैं उद्धृत कर रहा हूं, वह आपके उत्तर पोस्ट करने के कई वर्षों बाद की गई थी।
स्कोमीसा

17

सबसे अच्छी पोस्ट में से एक मैं कभी भी सुरक्षा को लेकर आया हूँ क्योंकि यह REST से संबंधित है 1 रेनड्रॉप पर । माइस्पेस एपीआई का उपयोग सुरक्षा के लिए OAuth भी है और रेस्टचेस कोड में उनके कस्टम चैनलों तक आपकी पूरी पहुंच है, जिसके साथ मैंने बहुत खोजबीन की। यह मिक्स पर डेमोलाइड था और आप यहां पोस्टिंग पा सकते हैं ।


लिंक के लिए धन्यवाद (1 रेनड्रॉप) - सुरक्षा की बहुत दिलचस्प चर्चा क्योंकि यह SOAP v REST से संबंधित है
नाथन

15

उत्कृष्ट सलाह के लिए धन्यवाद। हमने Microsoft से आगामी Zermatt आइडेंटिटी फ्रेमवर्क के साथ हमारे RESTful API को एकीकृत करने की तैयारी में, ग्राहक से सेवा में एक पहचान टोकन पारित करने के लिए एक कस्टम HTTP हेडर का उपयोग करके समाप्त किया। मैंने यहाँ समस्या और हमारे समाधान का वर्णन किया है । अगर आपने किसी भी तरह के RESTful API का निर्माण किया है, तो मैंने भी Twest की सलाह ली और Restful Web Services को खरीदा ।


1
यह दृष्टिकोण मुझे गड़बड़ लगता है। क्लाइंट को बहकाने के लिए पहचान के टोकन का उपयोग करने से किसी हमलावर को क्या रोकता है? HTTPS उस URL या हेडर की सुरक्षा नहीं करता है जो मैंने पिछली बार चेक किया था ...
Gili

2
हम्म ... यकीन नहीं है कि आप इसके बारे में सही हैं। मेरा मानना ​​है कि कुछ हेडर को छोड़कर यह समझने की आवश्यकता है कि किस प्रकार के एन्क्रिप्शन की आवश्यकता है, अन्य सभी हेडर एन्क्रिप्टेड हैं।
नाथन

51
यह गलत है। HTTPS EVERYTHING की सुरक्षा करता है। यह जाता है: टीसीपी हैंडशेक ... टीएलएस हैंडशेक ... <एनसीपीटेड> जीईटी / फू 200 ओके ... फाड़ </ ENCRYPTED>।
मार्क रेनॉफ

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


14

OWASP (ओपन वेब एप्लीकेशन सिक्योरिटी प्रोजेक्ट) में वेब एप्लिकेशन डेवलपमेंट के सभी पहलुओं के बारे में कुछ चीट शीट हैं। यह परियोजना सूचना का एक बहुत ही मूल्यवान और विश्वसनीय स्रोत है। अन्य सेवाओं के बारे में आप इसे देख सकते हैं: https://www.owasp.org/index.php/REST_Security_Cheat_Sheet


7

मैं OAuth 2/3 की सिफारिश करूंगा। आप अधिक जानकारी पा सकते हैं http://oauth.net/2/ पर


8
विस्तृत रूप से अधूरा रहने पर आप संस्करण 2 की सिफारिश क्यों करेंगे? IMHO, संस्करण 1.0a अधिकांश ऐप्स के लिए एक ठोस समाधान बना हुआ है।
बुटीफरा

6

मैंने आराम करने वाली ws सुरक्षा के बारे में बहुत कुछ खोजा और अनुरोधों को प्रमाणित करने के लिए हमने क्लाइंट से सर्वर तक कुकी के माध्यम से टोकन का उपयोग किया। मैंने सेवा में अनुरोधों के प्राधिकरण के लिए वसंत सुरक्षा का उपयोग किया क्योंकि मुझे निर्दिष्ट सुरक्षा नीतियों के आधार पर प्रत्येक अनुरोध को प्रमाणित और अधिकृत करना था जो पहले से ही डीबी में रहा है।


6

तथ्य यह है कि SOAP दुनिया सुरक्षा मानकों के साथ अच्छी तरह से कवर है इसका मतलब यह नहीं है कि यह डिफ़ॉल्ट रूप से सुरक्षित है। पहली जगह में, मानक बहुत जटिल हैं। जटिलता सुरक्षा और कार्यान्वयन कमजोरियों की बहुत अच्छी दोस्त नहीं है, जैसे कि XML हस्ताक्षर रैपिंग हमले यहां स्थानिक हैं।

.NET वातावरण के लिए मैं बहुत मदद नहीं करूँगा, लेकिन "जावा के साथ वेब सेवाओं का निर्माण" (~ 10 लेखकों के साथ एक ईंट) ने मुझे WS- * सुरक्षा वास्तुकला और विशेष रूप से, इसके क्वर्क को समझने में बहुत मदद की ।


4

REST स्वयं कोई सुरक्षा मानक प्रदान नहीं करता है, लेकिन OAuth और SAML जैसी चीजें तेजी से इस स्थान में मानक बन रही हैं। हालाँकि, प्रमाणीकरण और प्राधिकरण केवल एक छोटा सा हिस्सा है जिसे आपको विचार करने की आवश्यकता है। वेब एप्लिकेशन से संबंधित ज्ञात कमजोरियों में से कई REST एपिस पर लागू होती हैं। आपको इनपुट सत्यापन, सत्र क्रैकिंग, अनुचित त्रुटि संदेश, आंतरिक कर्मचारी कमजोरियों और इतने पर विचार करना होगा। यह एक बड़ा विषय है।


4

मैं जोड़ना चाहता हूं (stinkeymatt के अनुरूप), सरलतम समाधान यह होगा कि आपकी साइट पर SSL प्रमाणपत्र जोड़े जाएं। दूसरे शब्दों में, सुनिश्चित करें कि आपका url HTTPS: // है। यह आपकी परिवहन सुरक्षा (हिरन के लिए बैंग) को कवर करेगा। Restful url के साथ, विचार इसे सरल रखने के लिए है (WS * सुरक्षा / SAML के विपरीत), आप oAuth2 / OpenID कनेक्ट या यहां तक ​​कि बेसिक ऑथ (साधारण मामलों में) का उपयोग कर सकते हैं । लेकिन फिर भी आपको SSL / HTTPS की आवश्यकता होगी। कृपया ASP.NET वेब API 2 सुरक्षा की जाँच करें: http://www.asp.net/web-api/overview/security (लेख और वीडियो)


3

जैसा कि @ नथन समाप्त हुआ, जो एक सरल HTTP हैडर है, और कुछ ने OAuth2 और क्लाइंट साइड एसएसएल प्रमाणपत्र कहा था। इसका सार यह है ... आपके REST API को सुरक्षा संभालना नहीं चाहिए क्योंकि यह वास्तव में API के दायरे से बाहर होना चाहिए।

इसके बजाय एक सुरक्षा परत को उसके ऊपर रखा जाना चाहिए, चाहे वह एक वेब प्रॉक्सी के पीछे HTTP हैडर (साइटमींडर, जरमैट या यहां तक ​​कि अपाचे HTTPd जैसे एक सामान्य दृष्टिकोण), या OAuth 2 के रूप में जटिल हो।

मुख्य बात यह है कि अनुरोध बिना किसी अंतिम-उपयोगकर्ता सहभागिता के काम करना चाहिए। यह सुनिश्चित करने के लिए सभी आवश्यक है कि REST API का कनेक्शन प्रमाणित हो। जावा ईई में हम इस पर एक धारणा userPrincipalप्राप्त कर सकते हैंHttpServletRequest । यह तैनाती विवरणक में भी प्रबंधित किया जाता है कि URL पैटर्न सुरक्षित हो सकता है इसलिए REST API कोड को अब जांचने की आवश्यकता नहीं है।

डब्ल्यूसीएफ दुनिया में, मैं उपयोग करूंगा ServiceSecurityContext.Current वर्तमान सुरक्षा संदर्भ प्राप्त करने के लिए । प्रमाणीकरण की आवश्यकता के लिए आपको आवेदन को कॉन्फ़िगर करना होगा।

मेरे ऊपर दिए गए बयान का एक अपवाद है और यह कि रिप्ले को रोकने के लिए नॉन का उपयोग है (जो कि हमला हो सकता है या कोई व्यक्ति केवल एक ही डेटा को दो बार सबमिट कर सकता है)। उस हिस्से को केवल एप्लिकेशन लेयर में ही हैंडल किया जा सकता है।


3

वेब अनुप्रयोग सुरक्षा के लिए, आपको OWASP ( https://www.owasp.org/index.php/MIN_Page) पर एक नज़र डालनी चाहिए ) जो विभिन्न सुरक्षा हमलों के लिए धोखा देती है। आप अपने एप्लिकेशन को सुरक्षित करने के लिए अधिक से अधिक उपाय शामिल कर सकते हैं। एपीआई सुरक्षा (प्राधिकरण, प्रमाणीकरण, पहचान प्रबंधन) के संबंध में, पहले से बताए गए कई तरीके हैं (बेसिक, डाइजेस्ट और ओएथ)। OAuth1.0 में लूप छेद हैं, इसलिए आप OAuth1.0a का उपयोग कर सकते हैं (विनिर्देश के साथ चिंताओं के कारण OAuth2.0 व्यापक रूप से नहीं अपनाया गया है)


2

थोड़ी देर हो गई है लेकिन सवाल अभी भी प्रासंगिक है, हालांकि जवाब थोड़ा बदल गया है।

एक एपीआई गेटवे एक लचीला और उच्च विन्यास समाधान होगा। मैंने काँग का परीक्षण किया और उसका उपयोग किया और वास्तव में जो मैंने देखा उसे बहुत पसंद किया। KONG स्वयं का एक व्यवस्थापक REST API प्रदान करता है जिसका उपयोग आप उपयोगकर्ताओं को प्रबंधित करने के लिए कर सकते हैं।

Express-gateway.io अधिक हाल का है और एक एपीआई गेटवे भी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.