디버깅 제한 컨트롤러 통합 가이드

다음 안내에 따라 AAOS 디버깅 제한 컨트롤러(DRC)를 통합합니다.

그림 1. DRC 앱 예

아키텍처

DRC 아키텍처는 다음과 같습니다. 빨간색으로 표시된 구성요소(토큰 발급기관 및 디버깅 제한 컨트롤러)에는 맞춤설정할 수 있는 참조 구현이 함께 제공됩니다.

그림 2. DRC 아키텍처

DRC란 무엇인가요?

자동차 헤드 단위에는 DRC 앱이 포함되어 있습니다(packages/apps/Car/DebuggingRestrictionController의 참조 구현 참고). 참조 앱에는 토큰 발급기관에서 액세스 토큰을 받고 토큰을 검증한 다음 토큰에 지정된 디버깅 제한 변경사항을 적용하기 위한 로직이 포함되어 있습니다. 로직에는 차량 측의 기본 UX 요소가 포함되어 있습니다.

토큰 발급기관이란 무엇인가요?

암호화 방식으로 서명된 액세스 토큰을 발급하는 웹 서비스입니다(packages/apps/Car/DebuggingRestrictionController/server의 참조 구현 참고). 참조 웹 서비스는 배포 가능한 Firebase Cloud 함수입니다(자세한 내용은 Firebase용 Cloud Functions 참고).

기본 요건

참조 구현을 배포하기 전에 다음 작업을 완료해야 합니다.

액세스 토큰 서명을 위한 인증서 준비

토큰 발급기관은 JSON Web Signature(JWS)를 액세스 토큰으로 생성합니다. 최적의 호환성을 위해 참조 발급기관은 RS256 알고리즘(SHA256을 사용한 RSA 서명)만 지원합니다. 키 순환을 용이하게 하려면 단일 인증서 대신 인증서 체인을 사용하여 액세스 토큰에 서명합니다. 일반적인 인증서 체인은 루트 CA 인증서, 중간 CA 인증서, 최종 엔터티 인증서로 구성되어야 합니다.

JWS 토큰에 서명하는 최종 엔터티 인증서는 표준 TLS 인증서와 다르지 않습니다. DigiCert와 같은 Public CA에서 인증서를 구매하거나, 자체 서명 루트 CA 인증서 또는 하드웨어 보안 모듈을 사용하여 자체 인증서 체인을 유지할 수 있습니다. 최종 엔터티 인증서는 주체 대체 이름(SAN) 확장이 포함된 X509v3 인증서여야 합니다. SAN 확장에는 토큰 발급기관의 식별자(예: 호스트 이름)가 포함되어 있습니다. 마지막으로 RSA 인증서는 EC 인증서보다 우선되어야 합니다. 토큰 발급기관에서 RS256만 지원하기 때문입니다.

Google은 packages/apps/Car/DebuggingRestrictionController/server/genkey.sh에서 자체 서명된 인증서를 생성하기 위한 셸 스크립트를 제공합니다.

Firebase 설정

참조 토큰 발급기관에서는 Firebase 인증Firebase Cloud 함수를 사용합니다.

Firebase 계정을 설정하려면 다음 안내를 따르세요.

  1. Firebase 프로젝트를 만들려면 Android 프로젝트에 Firebase 추가를 참고하세요.
  2. 일부 Firebase 인증을 사용 설정하려면 Firebase 인증은 어디에서 시작하나요?를 참고하세요.
  3. 비어 있는 Firebase Cloud 함수를 추가하려면 시작하기를 참고하세요.
  4. 아직 완료하지 않았다면 Node.js, NPM 및 Firebase 도구를 설치하여 토큰 발급기관을 컴파일하고 배포합니다.

DRC 앱 통합

참조 DRC 앱은 packages/apps/Car/DebuggingRestrictionController에 있습니다. 이 앱은 AOSP에서 Soong을 사용하여 번들로 빌드하거나 Gradle을 사용하여 번들 해제할 수 있습니다.

번들된 빌드

번들된 앱을 빌드하려면 다음 안내를 따르세요.

  1. applicationId, projectId, apiKeygoogle-services.json에서 packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java로 복사합니다. 그러면 DRC 앱이 Firebase에 올바르게 연결됩니다.
  2. packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java에서 상수를 업데이트합니다.
    • TOKEN_USES_SELF_SIGNED_CA는 자체 서명 루트 CA 인증서가 사용되었는지를 나타냅니다. 사용 설정된 경우 DRC 앱은 ROOT_CA_CERT에 지정된 PEM 인코딩 루트 CA 인증서만 신뢰합니다.
    • TOKEN_ISSUER_API_NAME은 Firebase Cloud 함수의 이름이고 이전에 Firebase Console에서 만든 Cloud 함수와 일치해야 합니다.
    • TOKEN_ISSUER_HOSTNAME은 액세스 토큰에 서명하는 최종 엔터티 인증서의 주체 대체 이름과 일치해야 합니다.
    • DRC_TEST_EMAILDRC_TEST_PASSWORD는 테스트 계정(선택사항)의 사용자 인증 정보이고, 이메일/비밀번호 로그인을 사용 설정한 경우 Firebase에서 사전 프로비저닝될 수 있습니다. 계측 테스트에만 사용됩니다.

이제 Firebase 계정과 인증서를 사용하도록 앱이 구성되었습니다. Android 9 이상에서는 독점 권한 허용을 설정해야 합니다. 허용 목록에 최소한 android.permission.MANAGE_USERS가 포함되어야 합니다. 예:

<permissions>
  <privapp-permissions package="com.android.car.debuggingrestrictioncontroller">
    <permission name="android.permission.INTERNET"/>
    <permission name="android.permission.MANAGE_USERS"/>
  </privapp-permissions>
</permissions>

번들 해제된 빌드

번들 해제된 DRC 빌드는 Gradle을 사용하여 앱을 컴파일합니다.

번들 해제된 빌드를 만들려면 다음 안내를 따르세요.

  1. Android SDK가 설치되었는지 확인합니다.
  2. 앱의 루트 디렉터리에 local.properties라는 텍스트 파일을 만듭니다.
  3. 다음과 같이 Android SDK의 위치를 설정합니다.
     sdk.dir=path/to/android/sdk
    
  4. Firebase를 설정하려면 google-services.jsonpackages/apps/Car/DebuggingRestrictionController/app에 복사합니다. Gradle은 파일을 파싱하고 나머지를 자동으로 설정합니다.
  5. 환경 변수를 정의합니다. 번들된 빌드에서와 마찬가지로 다음을 지정해야 합니다.
    • $TOKEN_USES_SELF_SIGNED_CA: true 또는 false 중 선택
    • $ROOT_CA_CERT: PEM 인코딩 루트 CA 인증서의 경로
    • $TOKEN_ISSUER_API_NAME: Firebase Cloud 함수의 이름
    • $TOKEN_ISSUER_HOST_NAME: 인증서의 SAN
    • $DRC_TEST_EMAIL$DRC_TEST_EMAIL: 테스트 계정의 사용자 인증 정보. 디버그 빌드 전용
  6. Gradle로 앱을 빌드하려면 다음과 같은 명령어를 실행합니다.
    $ ./gradlew build
    

토큰 발급기관 통합

참조 토큰 발급기관은 Node.js에 구현된 Firebase Cloud 함수입니다. 함수는 인증된 사용자만 호출할 수 있습니다. 앱을 배포하려면 JWS 토큰 서명에 사용되는 비공개 키와 인증서를 설정해야 합니다.

  1. 다음 내용으로 JSON 파일을 채웁니다.
    {
        "key": "---BEGIN PRIVATE KEY---\nRSA_PRIVATE_KEY\n-----END PRIVATE KEY-----\n",
        "certificates.0": "-----BEGIN CERTIFICATE-----\nTOKEN_SIGNING_CERT\n-----END CERTIFICATE-----\n",
        "certificates.1": "-----BEGIN CERTIFICATE-----\nINTERMEDIATE_CA_CERT\n-----END CERTIFICATE-----\n",
        "certificates.2": "-----BEGIN CERTIFICATE-----\nROOT_CA_CERT\n-----END CERTIFICATE-----\n",
        "expiration": "30m",
        "issuer": "Debugging Access Token Issuer",
        "audience": "IHU"
    }
    

    인증서는 최종 엔터티 인증서에서 루트 CA 인증서 순으로 정렬됩니다. 만료 기간은 맞춤설정이 가능하고, 발급된 토큰을 DRC 앱에서 받아 사용할 수 있기까지 시간이 다소 걸리는 경우 더 길게 설정할 수 있습니다. 토큰 취소는 가능하지 않습니다.

  2. 다음과 같이 Firebase에 구성을 업로드합니다.
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. 다음과 같이 Firebase Cloud 함수를 배포합니다.
  5. $ firebase deploy --only functions
    
  6. 토큰 발급기관을 관리하고 모니터링하려면 함수 배포 및 런타임 옵션 관리를 참고하세요.

기본 제한 설정

최초 부팅 전에 기본 제한을 적용할 수 있습니다. Android 프레임워크의 기본값을 재정의하기 위한 몇 가지 정적 리소스 오버레이로 진행하면 됩니다. 제한은 서로 다른 유형의 사용자에게 각각 적용할 수 있습니다. 서로 다른 사용자 유형에 관해 알아보려면 멀티 사용자 지원을 참고하세요.

헤드리스 시스템 사용자와 관련된 기본 제한은 frameworks/base/core/res/res/values/config.xml에서 config_defaultFirstUserRestrictions 문자열 배열로 구성할 수 있습니다. 이 제한을 설정하면 제한이 삭제될 때까지 Android 디버그 브리지(ADB)가 자동으로 중지됩니다. 예를 들면 다음과 같습니다.

<string-array translatable="false" name="config_defaultFirstUserRestrictions">
  <item>no_debugging_features</item>
</string-array>

일반 사용자(예: 운전자와 승객)와 손님과 관련된 기본 제한은 frameworks/base/core/res/res/xml/config_user_types.xml에서 구성할 수 있습니다. 이러한 문자열을 오버레이하여 각 사용자 유형의 기본 제한을 각각 설정할 수 있습니다. 예를 들면 다음과 같습니다.

<user-types>
  <full-type name="android.os.usertype.full.SECONDARY" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
  <full-type name="android.os.usertype.full.GUEST" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
</user-types>