
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 प्रदान कर सकते हैं, जैसे:
$ cat > /tmp/config/uaa.yml
uaa:
host: uaa.appcloud21.dev.mozycloud
test:
username: [email protected] # defaults to [email protected]
password: changeme
email: [email protected]
फिर uaa/uaa से
$ CLOUD_FOUNDRY_CONFIG_PATH=/tmp/config ./gradlew test
वेबऐप शुरू होने पर निम्नलिखित स्थानों पर Yaml सामग्री की तलाश करता है (बाद की प्रविष्टियाँ पहले वाली को ओवरराइड करती हैं)।
classpath:uaa.yml
file:${CLOUD_FOUNDRY_CONFIG_PATH}/uaa.yml
file:${UAA_CONFIG_FILE}
${UAA_CONFIG_URL}
System.getEnv('UAA_CONFIG_YAML') -> environment variable, if set must contain valid Yaml
उदाहरण के लिए, UAA को Cloud Foundry एप्लिकेशन के रूप में तैनात करने के लिए, आप एक एप्लिकेशन मैनिफेस्ट प्रदान कर सकते हैं जैसे
---
applications:
- name: standalone-uaa-cf-war
memory: 512M
instances: 1
host: standalone-uaa
path: cloudfoundry-identity-uaa-3.0.0-SNAPSHOT.war
env:
JBP_CONFIG_SPRING_AUTO_RECONFIGURATION: '[enabled: false]'
JBP_CONFIG_TOMCAT: '{tomcat: { version: 7.0.+ }}'
SPRING_PROFILES_ACTIVE: hsqldb,default
UAA_CONFIG_YAML: |
uaa.url: http://standalone-uaa.cfapps.io
login.url: http://standalone-uaa.cfapps.io
smtp:
host: mail.server.host
port: 3535
या वैकल्पिक रूप से, set-env कमांड का उपयोग करके yaml कॉन्फ़िगरेशन को पर्यावरण चर के लिए एक स्ट्रिंग के रूप में सेट करें
cf set-env sample-uaa-cf-war UAA_CONFIG_YAML '{ uaa.url: http://standalone-uaa.myapp.com, login.url: http://standalone-uaa.myapp.com, smtp: { host: mail.server.host, port: 3535 } }'
इसके अलावा, UAA द्वारा पढ़ी जाने वाली कोई भी सरल प्रकार की प्रॉपर्टी पूरी तरह से विस्तारित होकर सिस्टम पर्यावरण चर के रूप में भी पढ़ी जा सकती है। ध्यान दें कि uaa.url को UAA_URL नामक पर्यावरण चर में कैसे परिवर्तित किया जा सकता है
---
applications:
- name: standalone-uaa-cf-war
memory: 512M
instances: 1
host: standalone-uaa
path: cloudfoundry-identity-uaa-3.0.0-SNAPSHOT.war
env:
JBP_CONFIG_SPRING_AUTO_RECONFIGURATION: '[enabled: false]'
JBP_CONFIG_TOMCAT: '{tomcat: { version: 7.0.+ }}'
SPRING_PROFILES_ACTIVE: hsqldb,default
UAA_URL: http://standalone-uaa.cfapps.io
LOGIN_URL: http://standalone-uaa.cfapps.io
UAA_CONFIG_YAML: |
smtp:
host: mail.server.host
port: 3535
डिफ़ॉल्ट uaa इकाई परीक्षण (./gradlew test integrationTest) hsqldb का उपयोग करते हैं।
PostgreSQL का उपयोग करके इकाई परीक्षण चलाने के लिए:
$ ./gradlew -Dspring.profiles.active=default,postgresql test integrationTest
वैकल्पिक रूप से, Spring प्रोफ़ाइल को uaa.yml फ़ाइल में कॉन्फ़िगर किया जा सकता है
$ echo "spring_profiles: default,postgresql" > src/main/resources/uaa.yml
MySQL का उपयोग करके इकाई परीक्षण चलाने के लिए:
$ ./gradlew -Dspring.profiles.active=default,mysql test integrationTest
common और scim मॉड्यूल के लिए डेटाबेस कॉन्फ़िगरेशन Spring XML कॉन्फ़िगरेशन फ़ाइलों में डिफ़ॉल्ट है। आप उन्हें uaa.yml में कॉन्फ़िगर करके बदल सकते हैं।
डिफ़ॉल्ट निम्न हैं
PostgreSQL: User: root Password: changeme Database: uaa Host: localhost Port: 5432
MySQL: User: root Password: changeme Database: uaa Host: localhost Port: 3306
यहाँ वास्तव में कई प्रोजेक्ट हैं, मुख्य uaa सर्वर एप्लिकेशन, एक क्लाइंट लाइब्रेरी और कुछ नमूने:
uaa आसान परिनियोजन के लिए एक WAR प्रोजेक्ट
server एक JAR प्रोजेक्ट जिसमें UAA के REST API (SCIM सहित) और UI का कार्यान्वयन है
model एक JAR प्रोजेक्ट जिसका उपयोग क्लाइंट लाइब्रेरी और सर्वर दोनों करते हैं
client-lib एक JAR प्रोजेक्ट जो Java क्लाइंट API प्रदान करता है
api (नमूना) एक OAuth2 रिसोर्स सेवा है जो तैनात ऐप्स की एक मॉक सूची लौटाती है
app (नमूना) एक उपयोगकर्ता एप्लिकेशन है जो उपरोक्त दोनों का उपयोग करता है
CloudFoundry शब्दों में
uaa प्रमाणीकरण सेवा के साथ-साथ बैक-एंड सेवाओं और ऐप्स के लिए अधिकृत प्रतिनिधिमंडल प्रदान करता है (OAuth2 एक्सेस टोकन जारी करके)।
api एक सेवा है जो संसाधन प्रदान करती है जिन्हें अन्य एप्लिकेशन संसाधन स्वामी (अंतिम उपयोगकर्ता) की ओर से एक्सेस करना चाह सकते हैं।
app एक वेबऐप है जिसे उपयोगकर्ताओं की ओर से सिंगल साइन ऑन और api सेवा तक पहुँच की आवश्यकता होती है।
प्रोजेक्ट क्षैतिज परतों में व्यवस्थित हैं; क्लाइंट, मॉडल, सर्वर, आदि। इन सभी प्रोजेक्ट्स के भीतर java पैकेज हमारी आंतरिक सेवाओं के चारों ओर लंबवत रूप से व्यवस्थित हैं; zones, providers, clients, आदि।
प्रमाणीकरण सेवा uaa है। यह एक सादा Spring MVC वेबऐप है। Tomcat या अपनी पसंद के कंटेनर में सामान्य रूप से तैनात करें, या सोर्स ट्री में uaa निर्देशिका से सीधे चलाने के लिए ./gradlew run निष्पादित करें। ग्रैडल के साथ चलने पर यह पोर्ट 8080 पर सुनता है और URL http://localhost:8080/uaa है।
UAA सर्वर UAA-APIs दस्तावेज़ में परिभाषित APIs का समर्थन करता है। संक्षेप में:
OAuth2 /oauth/authorize और /oauth/token एंडपॉइंट्स
आवश्यक लॉगिन प्रॉम्प्ट के लिए क्वेरी करने की अनुमति देने हेतु एक /login_info एंडपॉइंट
एक /check_token एंडपॉइंट, जो रिसोर्स सर्वरों को OAuth2 क्लाइंट द्वारा प्रस्तुत एक्सेस टोकन के बारे में जानकारी प्राप्त करने की अनुमति देता है।
एक /token_key एंडपॉइंट, जो रिसोर्स सर्वरों को टोकन हस्ताक्षर सत्यापित करने के लिए सत्यापन कुंजी प्राप्त करने की अनुमति देता है
SCIM उपयोगकर्ता प्रोविज़निंग एंडपॉइंट
प्रमाणीकरण /userinfo समर्थन के लिए OpenID कनेक्ट एंडपॉइंट्स। आंशिक OpenID समर्थन।
कमांड लाइन क्लाइंट /oauth/authorize एंडपॉइंट पर सीधे क्रेडेंशियल्स जमा करके प्रमाणीकरण कर सकते हैं (जैसा कि UAA-API दस्तावेज़ में वर्णित है)। Spring Security OAuth में एक ImplicitAccessTokenProvider है जो यदि आपका क्लाइंट Java है तो भारी काम कर सकता है।
डिफ़ॉल्ट रूप से uaa एक कॉन्टेक्स्ट रूट /uaa के साथ लॉन्च होगा।
प्रमाणित करें
GET /login
एक बुनियादी फ़ॉर्म लॉगिन इंटरफ़ेस।
OAuth2 टोकन ग्रांट स्वीकृत करें
GET /oauth/authorize?client_id=app&response_type=code...
मानक OAuth2 प्राधिकरण एंडपॉइंट।
एक्सेस टोकन प्राप्त करें
POST /oauth/token
मानक OAuth2 प्राधिकरण एंडपॉइंट।
एप्लिकेशन में दो कॉन्फ़िगरेशन फ़ाइलें हैं, uaa.yml और login.yml, जो Spring XML में प्लेसहोल्डर्स के लिए डिफ़ॉल्ट प्रदान करती हैं। XML में जहाँ भी आप ${placeholder.name} देखते हैं, वहाँ उसे ओवरराइड करने का अवसर होता है, या तो समान नाम के साथ एक सिस्टम प्रॉपर्टी (JVM के लिए -D) प्रदान करके, या एक कस्टम uaa.yml या login.yml (जैसा कि ऊपर वर्णित है) देकर।
uaa.yml और login.yml स्टार्टअप के दौरान एक कॉन्फ़िगरेशन में विलीन हो जाते हैं।
कॉन्फ़िग फ़ाइलों में सभी पासवर्ड और क्लाइंट सीक्रेट सादे पाठ में होते हैं, लेकिन वे BCrypt के साथ एन्क्रिप्टेड होकर UAA डेटाबेस में डाले जाएँगे।
भविष्य में, आप स्पष्ट पाठ पासवर्ड निर्दिष्ट करने से बचने के लिए bcrypt प्रारूप में पासवर्ड प्रदान कर सकेंगे।
डिफ़ॉल्ट एक इन-मेमोरी RDBMS उपयोगकर्ता स्टोर का उपयोग करना है जो एकल परीक्षण उपयोगकर्ता के साथ पूर्व-जनित है: marissa का पासवर्ड koala है।
उपयोगकर्ता डेटा के लिए PostgreSQL का उपयोग करने के लिए, Spring प्रोफ़ाइल postgresql सक्रिय करें।
सक्रिय प्रोफाइल को uaa.yml में निम्न का उपयोग करके कॉन्फ़िगर किया जा सकता है
spring_profiles: postgresql,default
या PostgreSQL को कमांड लाइन पर निर्दिष्ट करें:
$ ./gradlew -Dspring.profiles.active=default,postgresql run
UAA के साथ दो नमूना एप्लिकेशन शामिल हैं। /api और /app
इसे uaa रूट निर्देशिका से ./gradlew run का उपयोग करके चलाएँ। तीनों ऐप्स, /uaa, /api और /app एक साथ तैनात होते हैं।
यह एक उपयोगकर्ता इंटरफ़ेस ऐप है (मुख्य रूप से ब्राउज़रों के लिए) जो प्रमाणीकरण के लिए OpenId Connect (अर्थात SSO) और एक्सेस ग्रांट के लिए OAuth2 का उपयोग करता है। यह Auth सेवा के साथ प्रमाणित होता है, और फिर API सेवा में संसाधनों तक पहुँचता है। इसे uaa रूट निर्देशिका से ./gradlew run के साथ चलाएँ।
एप्लिकेशन UAA सर्वर और लॉगिन एप्लिकेशन के स्थान (और उपस्थिति) के अनुसार कई अलग-अलग प्रोफाइल में काम कर सकता है। डिफ़ॉल्ट रूप से यह localhost:8080/uaa पर UAA की तलाश करेगा, लेकिन आप UAA_PROFILE नामक पर्यावरण चर (या सिस्टम प्रॉपर्टी) सेट करके इसे बदल सकते हैं। एप्लिकेशन सोर्स कोड (samples/app/src/main/resources) में आपको उन सर्वरों के लिए विभिन्न संभावित स्थानों के साथ पहले से कॉन्फ़िगर कई प्रॉपर्टीज़ फ़ाइलें मिलेंगी। वे सभी application-<UAA_PROFILE>.properties के रूप में हैं और अपनाया गया नामकरण सम्मेलन यह है कि UAA_PROFILE localhost परिनियोजन के लिए local, vcap.me परिनियोजन के लिए vcap, स्टेजिंग परिनियोजन के लिए staging (VMware VPN के अंदर), आदि है। प्रोफाइल नाम दोहरे हैं (जैसे local-vcap जब लॉगिन सर्वर UAA सर्वर से भिन्न स्थान पर हो)।
सभी ऐप्स देखें
GET /app/apps
ब्राउज़र प्रमाणीकरण और एक्सेस ग्रांट चरणों की एक श्रृंखला के माध्यम से पुनर्निर्देशित होता है (जिसे किसी बिंदु पर उपयोगकर्ता की आवश्यकता न होने वाले इम्प्लिसिट चरणों तक सीमित किया जा सकता है), और फिर ऐप्स की सूची दिखाई जाती है।
वर्तमान में लॉग इन उपयोगकर्ता का विवरण देखें, open id प्रदाता से प्राप्त विशेषताओं का एक समूह
GET /app
समुदाय में शामिल होने के लिए यहाँ कुछ तरीके दिए गए हैं:
