
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، على سبيل المثال. طريقتنا الموصى بها هي استخدام ملف manifest، لكن يمكنك القيام بكل شيء من سطر الأوامر.
$ ./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 ruby. تأكد من تثبيت ruby 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
يجب أن ترى اسم المستخدم الخاص بك ومعرف العميل لمنحة الرمز الأصلية على 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 يتم دائمًا تنفيذ مهمة flywayClean قبل تشغيل تطبيق UAA. إذا كنت لا ترغب في تنظيف قاعدة البيانات، يمكنك تعريف المتغير
-Dflyway.clean=false
كجزء من سطر الأوامر الخاص بك. يؤدي هذا إلى تعطيل مهمة flywayClean في سكربت gradle. طريقة أخرى لتعطيل flywayClean هي عدم تحديد ملفات التعريف spring في سطر الأوامر، ولكن تعيين ملفات التعريف في ملفي uaa.yml وlogin.yml.
يجب أن يعمل نفس مثال سطر الأوامر مع UAA قيد التشغيل على run.pivotal.io (باستثناء جزء فك ترميز الرمز لأنك لن تمتلك سر العميل). في هذه الحالة، لا حاجة لتشغيل خادم uaa محلي، لذا ببساطة اطلب من نقطة نهاية تسجيل الدخول الخارجية إخبارك عن النظام:
$ curl -H "Accept: application/json" login.run.pivotal.io
{
"prompts":{"username":["text","Username"],
"password":["password","Password"]
}
}
يمكنك بعد ذلك محاولة تسجيل الدخول باستخدام جوهرة UAA ruby. تأكد من تثبيت ruby 1.9، ثم
$ gem install cf-uaac
$ uaac target uaa.run.pivotal.io
$ uaac token get [yourusername] [yourpassword]
(أو اترك اسم المستخدم / كلمة المرور فارغين ليتم سؤالك عنهما).
يقوم هذا بمصادقتك والحصول على رمز وصول من الخادم باستخدام منحة OAuth2 الضمنية، نفس ما يستخدمه عميل مثل CF.
يمكنك تشغيل اختبارات التكامل باستخدام
$ ./gradlew integrationTest
سيؤدي ذلك إلى تشغيل اختبارات التكامل ضد خادم uaa يعمل في مثيل
Apache Tomcat محلي، لذلك على سبيل المثال يتم تعيين عنوان الخدمة إلى http://localhost:8080/uaa (افتراضيًا).
يمكنك توجيه CLOUD_FOUNDRY_CONFIG_PATH لالتقاط ملف
uaa.yml حيث يمكن تغيير عناوين URL
و(إذا كان مناسبًا) تعيين جذر السياق لتشغيل
الخادم (انظر أدناه لمزيد من التفاصيل حول ذلك).
لتعديل معاملات وقت التشغيل يمكنك توفير ملف 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') -> متغير بيئة، إذا تم تعيينه يجب أن يحتوي على Yaml صالح
على سبيل المثال، لنشر UAA كتطبيق Cloud Foundry، يمكنك توفير manifest تطبيق مثل