
AOSP(Android Open Source Project) 기반의 하드웨어나 커스텀 ROM을 개발하다 보면, 시스템 보안을 위해 SELinux 정책(sepolicy)을 추가해야 하는 상황이 반드시 발생합니다. 이때 개발자를 혼란스럽게 만드는 것 중 하나가 정책을 어느 디렉터리에 넣고 어떤 빌드 변수에 할당하느냐입니다.
특히 하드웨어 종속적인 정책과 특정 모델(제품)에만 국한된 정책을 구분하지 못하면, 나중에 여러 기기를 유지보수할 때 정책이 꼬이는 문제가 생깁니다. 이번 포스팅에서는 AOSP 빌드 시스템의 핵심 변수인 BOARD_SEPOLICY_DIRS와 PRODUCT_PRIVATE_SEPOLICY_DIRS의 차이점을 명확히 짚어보고 올바른 적용 방법을 공유하겠습니다.
📌 핵심 요약 3줄
- BOARD_SEPOLICY_DIRS: 하드웨어(SoC/Board) 수준의 공통 정책을 정의할 때 사용하며 BoardConfig.mk에 설정합니다.
- PRODUCT_PRIVATE_SEPOLICY_DIRS: 특정 제품(Model/SKU)이나 ROM 특화 정책을 정의하며 product.mk에 설정합니다.
- 관리의 핵심: 하드웨어 공통 기능은 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. 실제 적용 및 빌드 단계
- 정책 디렉터리 생성: 보드용(device/vendor/soc_name/sepolicy)과 제품용(device/vendor/product_name/sepolicy)을 명확히 구분하여 생성합니다.
- 정책 파일 작성 예시:
- 보드 레벨: /data/vendor/board_logs 경로에 대한 권한 부여
- 제품 레벨: /data/system/product_config 특정 제품 설정값에 대한 권한 부여
- 빌드 변수 등록: 각각의 .mk 파일에 += 연산자를 사용하여 경로를 추가합니다.
- 빌드 실행: 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 정책 구성 중 궁금한 점이 있거나 빌드 에러가 발생한다면 댓글로 남겨주세요. 함께 해결해 봅시다!
'Android System & AOSP Engineering > Android Security & SELinux' 카테고리의 다른 글
| 안드로이드 시스템 서비스 추가 가이드: SELinux 정책(sepolicy) 완벽 설정법 (0) | 2025.05.08 |
|---|---|
| AOSP 커스텀 보드 sepolicy 추가 및 적용 가이드: 단계별 실전 예제 (0) | 2025.05.06 |
| AOSP SELinux 정책(sepolicy) 빌드 및 적용 가이드: 기초부터 트러블슈팅까지 (0) | 2025.05.04 |
| Android SELinux 완벽 가이드: 서비스, 바이너리, 파일 시스템 정책 정의법 (0) | 2025.05.02 |
| Android SELinux 설정 가이드: domain 정의부터 file_contexts 적용까지 (0) | 2025.05.01 |