
CVE-2016-4468
UAA는 Cloud Foundry에서 사용되는 멀티 테넌트 ID 관리 서비스이지만, 독립형 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_CONFIG_YAML에 전체 구성 YAML이 포함된 구성 매니페스트를 제공할 수도 있습니다.먼저 위에서 설명한 대로 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 1.9가 설치되어 있는지 확인한 다음:
$ gem install cf-uaac
$ uaac target http://localhost:8080/uaa
$ uaac token get marissa koala
(또는 사용자 이름/비밀번호를 생략하면 입력하라는 메시지가 표시됩니다).
이 과정은 OAuth2 암시적 승인(implicit grant)을 사용하여 서버에서 액세스 토큰을 인증하고 얻습니다. 이는 CF와 같은 클라이언트에 의도된 접근 방식과 유사합니다. 토큰은 ~/.uaac.yml에 저장되므로 해당 파일을 살펴보고 cf 대상에 대한 액세스 토큰을 찾아내십시오 (또는 위의 로그인 명령줄에 --verbose를 사용하여 콘솔에 기록된 토큰을 확인할 수 있습니다).
그런 다음 리소스 서버로 로그인하여 토큰 세부 정보를 검색할 수 있습니다:
$ uaac target http://localhost:8080/uaa
$ uaac token decode
표준 출력에서 사용자 이름과 원래 토큰 부여의 클라이언트 ID를 볼 수 있습니다. 예:
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 빌드 파일에 있는 이유는 UAA 애플리케이션을 시작하기 전에 Gradle이 항상 flywayClean 작업을 실행하도록 하기 위해서입니다. DB를 정리하지 않으려면 다음 변수를 정의할 수 있습니다.
-Dflyway.clean=false
이를 명령줄의 일부로 지정하십시오. 그러면 Gradle 스크립트에서 flywayClean 작업이 비활성화됩니다. flywayClean을 비활성화하는 또 다른 방법은 명령줄에서 Spring 프로파일을 지정하지 않고 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 루비 젬을 사용하여 로그인을 시도할 수 있습니다. ruby 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를 지정하여 URL을 변경할 수 있는 uaa.yml을 읽어올 수 있으며, (적절한 경우) 서버 실행을 위한 컨텍스트 루트를 설정할 수 있습니다(자세한 내용은 아래 참조).
런타임 매개변수를 수정하려면 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이라는 환경 변수로 변환되는 방식을 확인하십시오.