Android System & AOSP Engineering/Android Security & SELinux

AOSP SELinux 정책 설정: BOARD_SEPOLICY_DIRS vs PRODUCT_PRIVATE_SEPOLICY_DIRS 차이점 완벽 정리

임베디드 친구 2025. 5. 5. 21:29
반응형

Generated by Gemini AI.

AOSP(Android Open Source Project) 기반의 하드웨어나 커스텀 ROM을 개발하다 보면, 시스템 보안을 위해 SELinux 정책(sepolicy)을 추가해야 하는 상황이 반드시 발생합니다. 이때 개발자를 혼란스럽게 만드는 것 중 하나가 정책을 어느 디렉터리에 넣고 어떤 빌드 변수에 할당하느냐입니다.

특히 하드웨어 종속적인 정책과 특정 모델(제품)에만 국한된 정책을 구분하지 못하면, 나중에 여러 기기를 유지보수할 때 정책이 꼬이는 문제가 생깁니다. 이번 포스팅에서는 AOSP 빌드 시스템의 핵심 변수인 BOARD_SEPOLICY_DIRSPRODUCT_PRIVATE_SEPOLICY_DIRS의 차이점을 명확히 짚어보고 올바른 적용 방법을 공유하겠습니다.

 

📌 핵심 요약 3줄

  1. BOARD_SEPOLICY_DIRS: 하드웨어(SoC/Board) 수준의 공통 정책을 정의할 때 사용하며 BoardConfig.mk에 설정합니다.
  2. PRODUCT_PRIVATE_SEPOLICY_DIRS: 특정 제품(Model/SKU)이나 ROM 특화 정책을 정의하며 product.mk에 설정합니다.
  3. 관리의 핵심: 하드웨어 공통 기능은 Board 변수로, 제품별 소프트웨어 기능은 Product 변수로 분리하여 정책 간섭을 최소화해야 합니다.

1. BOARD_SEPOLICY_DIRS: 하드웨어(Board) 수준의 정책

이 변수는 특정 보드 또는 SoC(System on Chip)에 종속적인 정책을 정의합니다. 같은 칩셋을 사용하는 여러 제품이 있다면 공통적으로 적용되는 하드웨어 제어 관련 정책들이 여기에 해당합니다.

BOARD_SEPOLICY_DIRS 특징 요약

구분 상세 내용
설정 위치 device/vendor/board/BoardConfig.mk
적용 대상 특정 SoC 또는 메인보드 하드웨어를 사용하는 모든 빌드 타깃
주요 특징 하드웨어 인터페이스(HAL), 커널 드라이버 접근 권한 등 SoC 제조사(Vendor) 수준의 필수 설정 정의
영향 범위 해당 보드 설정을 공유하는 모든 제품군(Device Family)에 공통으로 적용됨

예제 설정 (BoardConfig.mk): BOARD_SEPOLICY_DIRS += device/vendor/common_board/sepolicy


2. PRODUCT_PRIVATE_SEPOLICY_DIRS: 제품(Product) 수준의 정책

제품별 특화 기능을 위한 정책입니다. 같은 보드를 쓰더라도 제품 A에는 특정 센서 앱이 들어가고 제품 B에는 빠진다면, 제품 A 전용 정책은 이 변수를 통해 관리해야 합니다.

PRODUCT_PRIVATE_SEPOLICY_DIRS 특징 요약

구분 상세 내용
설정 위치 device/vendor/product/product.mk (또는 device.mk)
적용 대상 특정 제품명(Product Name)을 타깃으로 하는 빌드 시에만 포함
주요 특징 제품 특화 앱, 특정 서비스의 Private 영역 접근 권한 등 소프트웨어 중심의 세부 설정 정의
영향 범위 동일한 보드를 사용하더라도 타 제품 빌드에는 전혀 영향을 주지 않는 독립적 설정

예제 설정 (product.mk): PRODUCT_PRIVATE_SEPOLICY_DIRS += device/vendor/premium_phone/sepolicy


3. 한눈에 비교하는 주요 차이점

안드로이드 빌드 시스템에서 SELinux 정책을 어디에 정의하느냐는 유지보수 효율성과 보안 격리 수준을 결정하는 중요한 설계 요소입니다. 두 변수의 핵심 차이점은 다음과 같습니다.

항목 BOARD_SEPOLICY_DIRS PRODUCT_PRIVATE_SEPOLICY_DIRS
적용 기준 하드웨어 (SoC / Board) 소프트웨어 제품 (SKU / Model)
설정 파일 BoardConfig.mk product.mk (혹은 device.mk)
주요 사용처 커널 드라이버, HAL 접근 권한 특정 제품 전용 앱, 서비스 권한
정책 위치 device/vendor/board/sepolicy device/vendor/product/sepolicy

4. 실제 적용 및 빌드 단계

  1. 정책 디렉터리 생성: 보드용(device/vendor/soc_name/sepolicy)과 제품용(device/vendor/product_name/sepolicy)을 명확히 구분하여 생성합니다.
  2. 정책 파일 작성 예시:
  • 보드 레벨: /data/vendor/board_logs 경로에 대한 권한 부여
  • 제품 레벨: /data/system/product_config 특정 제품 설정값에 대한 권한 부여
  1. 빌드 변수 등록: 각각의 .mk 파일에 += 연산자를 사용하여 경로를 추가합니다.
  2. 빌드 실행: source build/envsetup.sh lunch aosp_device-userdebug m -j$(nproc)

💡 개발 꿀팁 및 흔히 하는 실수

구분 항목 상세 내용
개발 꿀팁 Public vs Private 이해하기 PRODUCT_PRIVATE 변수를 활용하면 정책이 'Private' 영역으로 분류됩니다. 이는 시스템의 핵심 도메인과 섞이지 않게 하여 정책 구조를 깔끔하게 유지하는 비결입니다.
개발 꿀팁 최종 정책 파일 디버깅 빌드 완료 후 out/target/product/<기기명>/obj/ETC/sepolicy_intermediates/ 경로를 확인하세요. 여러 곳에 흩어져 있던 정책들이 하나로 합쳐진 최종본을 확인할 수 있어 디버깅에 유용합니다.
흔한 실수 BOARD 변수 남용 모든 정책을 BOARD_SEPOLICY_DIRS에 넣는 것은 위험합니다. 추후 저가형/고가형 모델 분리 시, 저가형 모델에도 불필요한 고사양 기능의 권한이 포함되어 보안 취약점이 될 수 있습니다.
흔한 실수 경로 설정 오타 변수에 등록한 경로 끝에 불필요한 슬래시(/)를 넣거나 오타가 나면 빌드 시스템이 파일을 찾지 못합니다. File not found 에러가 발생한다면 가장 먼저 BoardConfig.mk를 확인하세요.

결론

안드로이드 SELinux 정책 관리의 핵심은 "변화하는 것(Product)과 변하지 않는 것(Board)을 분리하는 것"입니다. 하드웨어의 특성은 BOARD_SEPOLICY_DIRS로 묶고, 제품마다 달라지는 요구사항은 PRODUCT_PRIVATE_SEPOLICY_DIRS로 세분화하여 관리하세요. 이렇게 하면 프로젝트가 커져도 유지보수가 훨씬 수월해집니다.

SELinux 정책 구성 중 궁금한 점이 있거나 빌드 에러가 발생한다면 댓글로 남겨주세요. 함께 해결해 봅시다!

반응형