
CVE-2016-4468
UAA एक मल्टी-टेनेंट पहचान प्रबंधन सेवा है, जो Cloud Foundry में उपयोग होती है, लेकिन यह एक स्टैंड-अलोन OAuth2 सर्वर के रूप में भी उपलब्ध है। इसकी प्राथमिक भूमिका OAuth2 प्रदाता के रूप में है, जो क्लाइंट अनुप्रयोगों के लिए टोकन जारी करती है, जब वे Cloud Foundry उपयोगकर्ताओं की ओर से कार्य करते हैं। यह उपयोगकर्ताओं को उनके Cloud Foundry क्रेडेंशियल्स के साथ प्रमाणित भी कर सकता है, और उन क्रेडेंशियल्स (या अन्य) का उपयोग करके SSO सेवा के रूप में कार्य कर सकता है। इसमें उपयोगकर्ता खातों के प्रबंधन और OAuth2 क्लाइंट्स को पंजीकृत करने के लिए एंडपॉइंट्स के साथ-साथ विभिन्न अन्य प्रबंधन कार्य भी हैं।
आवश्यकताएँ:
यदि यह काम करता है, तो आपका काम बन गया है:
$ git clone git://github.com/cloudfoundry/uaa.git
$ cd uaa
$ ./gradlew run
सभी ऐप्स एक साथ काम करते हैं, और उसी पोर्ट (8080) पर चलते हैं: /uaa, /app और /api।
UAA uaa.log नामक एक फ़ाइल में लॉग करेगा, जिसे निम्नलिखित कमांड का उपयोग करके पाया जा सकता है:-
$ sudo find / -name uaa.log
जो आपको कुछ इस प्रकार के पथ के अंतर्गत मिलना चाहिए:-
/private/var/folders/7v/518b18d97_3f4c8fzxphy6f8zcm51c/T/cargo/conf/logs/
आप ऐप को बना सकते हैं और उसे Cloud Foundry पर पुश भी कर सकते हैं, जैसे: हमारा अनुशंसित तरीका मैनिफेस्ट फ़ाइल का उपयोग करना है, लेकिन आप सब कुछ कमांड लाइन पर भी कर सकते हैं।
$ ./gradlew :cloudfoundry-identity-uaa:war
$ cf push myuaa --no-start -m 512M -p uaa/build/libs/cloudfoundry-identity-uaa-2.3.2-SNAPSHOT.war
$ cf set-env myuaa SPRING_PROFILES_ACTIVE default,hsqldb
$ cf set-env myuaa UAA_URL http://myuaa.<domain>
$ cf set-env myuaa LOGIN_URL http://myuaa.<domain>
$ cf set-env myuaa JBP_CONFIG_SPRING_AUTO_RECONFIGURATION '[enabled: false]'
$ cf set-env myuaa JBP_CONFIG_TOMCAT '{tomcat: { version: 7.0.+ }}'
$ cf start myuaa
उपरोक्त चरणों में, बदलें:
myuaa को एक अद्वितीय एप्लिकेशन नाम से2.3.2-SNAPSHOT को आपके बिल्ड से उपयुक्त संस्करण लेबल से<domain> यह आपका ऐप डोमेन है। हम भविष्य में इसे सिस्टम पर्यावरण से पार्स करेंगे।पहले UAA सर्वर को ऊपर बताए अनुसार चलाएँ:
$ ./gradlew run
फिर एक और टर्मिनल खोलें और प्रोजेक्ट की आधार निर्देशिका से, लॉगिन एंडपॉइंट से सिस्टम के बारे में बताने के लिए कहें:
$ curl -H "Accept: application/json" localhost:8080/uaa/login
{
"timestamp":"2012-03-28T18:25:49+0100",
"commit_id":"111274e",
"prompts":{"username":["text","Username"],
"password":["password","Password"]
}
}
फिर आप UAA रूबी जेम से लॉगिन करने का प्रयास कर सकते हैं। सुनिश्चित करें कि आपके पास रूबी 1.9 है, फिर
$ gem install cf-uaac
$ uaac target http://localhost:8080/uaa
$ uaac token get marissa koala
(या प्रॉम्प्ट के लिए उपयोगकर्ता नाम / पासवर्ड छोड़ दें)।
यह प्रमाणित करता है और OAuth2 इम्प्लिसिट ग्रांट का उपयोग करके सर्वर से एक एक्सेस टोकन प्राप्त करता है, जो CF जैसे क्लाइंट के लिए इच्छित दृष्टिकोण के समान है। टोकन ~/.uaac.yml में संग्रहीत होता है, इसलिए उस फ़ाइल में जाकर अपने cf लक्ष्य के लिए एक्सेस टोकन निकालें (या ऊपर दिए गए लॉगिन कमांड लाइन पर --verbose का उपयोग करें ताकि यह आपके कंसोल पर लॉग होता दिखे)।
फिर आप एक रिसोर्स सर्वर के रूप में लॉगिन कर सकते हैं और टोकन विवरण प्राप्त कर सकते हैं:
$ uaac target http://localhost:8080/uaa
$ uaac token decode
आपको अपना उपयोगकर्ता नाम और मूल टोकन ग्रांट का क्लाइंट id stdout पर देखना चाहिए, उदाहरण के लिए:
exp: 1355348409
user_name: marissa
scope: cloud_controller.read openid password.write scim.userids tokens.read tokens.write
email: [email protected]
aud: scim tokens openid cloud_controller password
jti: ea2fac72-3f51-4c8f-a7a6-5ffc117af542
user_id: ba14fea0-9d87-4f0c-b59e-32aaa8eb1434
client_id: cf
$ ./gradlew -Dspring.profiles.active=default,mysql run
यह कमांड मान लेगा कि एक MySQL डेटाबेस डिफ़ॉल्ट एक्सेस सेटिंग्स के साथ उपलब्ध है और निम्नलिखित JDBC सेटिंग्स पर प्रतिक्रिया देगा।
driver = 'org.mariadb.jdbc.Driver'
url = 'jdbc:mysql://localhost:3306/uaa'
user = 'root'
password = 'changeme'
schemas = ['uaa']
इसी तरह, यदि आप निम्न कमांड निष्पादित करते हैं
$ ./gradlew -Dspring.profiles.active=default,postgresql run
यह निम्न रूप में परिभाषित सेटिंग्स का उपयोग करता है
driver = 'org.postgresql.Driver'
url = 'jdbc:postgresql:uaa'
user = 'root'
password = 'changeme'
ये सेटिंग्स Gradle एकीकरण के लिए दो स्थानों पर दोहराई गई हैं। वे Spring XML कॉन्फ़िगरेशन फ़ाइलों में डिफ़ॉल्ट के रूप में परिभाषित हैं, और वे मुख्य build.gradle फ़ाइल में भी परिभाषित हैं। इसका कारण वे Gradle बिल्ड फ़ाइल में हैं, यह है कि Gradle UAA एप्लिकेशन लॉन्च करने से पहले हमेशा flywayClean कार्य निष्पादित करता है। यदि आप DB को साफ नहीं करना चाहते हैं, तो आप निम्न चर को परिभाषित कर सकते हैं
-Dflyway.clean=false
यह ग्रैडल स्क्रिप्ट में flywayClean कार्य को अक्षम कर देता है। flywayClean को अक्षम करने का दूसरा तरीका कमांड लाइन पर स्प्रिंग प्रोफाइल निर्दिष्ट न करना है, बल्कि प्रोफाइल को uaa.yml और login.yml फ़ाइलों में सेट करना है।
वही कमांड लाइन उदाहरण run.pivotal.io पर चल रहे UAA के विरुद्ध काम करना चाहिए (टोकन डिकोडिंग भाग को छोड़कर, क्योंकि आपके पास क्लाइंट सीक्रेट नहीं होगा)। इस मामले में, स्थानीय uaa सर्वर चलाने की कोई आवश्यकता नहीं है, इसलिए बस बाहरी लॉगिन एंडपॉइंट से सिस्टम के बारे में बताने के लिए कहें:
$ curl -H "Accept: application/json" login.run.pivotal.io
{
"prompts":{"username":["text","Username"],
"password":["password","Password"]
}
}
फिर आप UAA रूबी जेम से लॉगिन करने का प्रयास कर सकते हैं। सुनिश्चित करें कि आपके पास रूबी 1.9 है, फिर
$ gem install cf-uaac
$ uaac target uaa.run.pivotal.io
$ uaac token get [yourusername] [yourpassword]
(या प्रॉम्प्ट के लिए उपयोगकर्ता नाम / पासवर्ड छोड़ दें)।
यह प्रमाणित करता है और OAuth2 इम्प्लिसिट ग्रांट का उपयोग करके सर्वर से एक एक्सेस टोकन प्राप्त करता है, वही जो CF जैसे क्लाइंट द्वारा उपयोग किया जाता है।
आप एकीकरण परीक्षण इस प्रकार चला सकते हैं
$ ./gradlew integrationTest
यह स्थानीय Apache Tomcat इंस्टेंस में चल रहे uaa सर्वर के विरुद्ध एकीकरण परीक्षण चलाएगा, उदाहरण के लिए सेवा URL http://localhost:8080/uaa (डिफ़ॉल्ट रूप से) पर सेट है।
आप CLOUD_FOUNDRY_CONFIG_PATH को uaa.yml पकड़ने के लिए इंगित कर सकते हैं जहाँ URLs बदले जा सकते हैं और (यदि उपयुक्त हो) सर्वर चलाने के लिए कॉन्टेक्स्ट रूट सेट कर सकते हैं (इसके बारे में अधिक जानकारी के लिए नीचे देखें)।
रनटाइम पैरामीटर संशोधित करने के लिए आप एक uaa.yml प्रदान कर सकते हैं, जैसे: