Android 사용자 정의 System Service 만들기: SELinux 정책 추가 및 접근 제어
Android Open Source Project(AOSP)에서 사용자 정의 System Service를 추가할 때 보안 정책을 구성하는 것은 필수적인 과정입니다. Android는 SELinux(Security-Enhanced Linux)를 통해 강력한 보안 모델을 제공하며, System Service가 동작하려면 적절한 SELinux 정책을 추가해야 합니다. 이번 글에서는 System Service 관련 SELinux 정책을 추가하는 방법과, AOSP 보안 모델에서 System Service 접근을 제어하는 방법을 다룹니다.
1. SELinux 개요 및 Android에서의 적용
SELinux는 보안 정책을 기반으로 시스템 내에서 특정 프로세스가 수행할 수 있는 작업을 제한하는 보안 메커니즘입니다. Android는 SELinux의 강제 적용 모드(enforcing mode) 를 사용하여 모든 프로세스의 접근을 철저히 통제합니다. System Service를 추가할 경우, 해당 서비스가 정상적으로 실행되도록 SELinux 정책을 작성해야 합니다.
SELinux 정책은 system/sepolicy 디렉터리에서 정의되며, 주요 구성 요소는 다음과 같습니다:
- domain: 특정 프로세스가 속하는 보안 도메인
- type: 보안 컨텍스트의 유형
- allow 규칙: 특정 도메인에서 다른 도메인 또는 리소스에 대한 접근 권한을 설정
- neverallow 규칙: 보안 정책이 절대적으로 허용하지 않는 동작을 정의
2. 사용자 정의 System Service 추가 시 SELinux 정책 적용 방법
2.1 서비스 도메인 정의
먼저, 새로운 System Service를 위한 도메인을 정의해야 합니다. 예를 들어, custom_service 라는 System Service를 추가한다고 가정하겠습니다.
다음과 같이 system/sepolicy/private/custom_service.te 파일을 생성하고 도메인을 정의합니다:
# custom_service.te
# 새로운 서비스 도메인 생성
type custom_service, domain;
type custom_service_exec, exec_type, file_type;
# custom_service 도메인이 system_server 도메인과 상호작용할 수 있도록 허용
allow system_server custom_service:process { fork sigchld };
allow custom_service self:process { execmem };
# custom_service가 서비스 관련 디렉터리 및 파일을 읽고 쓸 수 있도록 허용
allow custom_service system_data_file:dir search;
allow custom_service system_data_file:file { read write open getattr };
위의 설정은 custom_service 가 system_server 와 프로세스 간 통신을 할 수 있도록 하고, 파일 시스템에서 특정 디렉터리 및 파일에 대한 접근을 허용합니다.
2.2 실행 바이너리 및 파일 컨텍스트 설정
SELinux는 실행 파일에 대한 보안 컨텍스트를 설정해야 합니다. file_contexts 파일을 수정하여 custom_service 실행 파일을 지정합니다.
# file_contexts
/system/bin/custom_service u:object_r:custom_service_exec:s0
이렇게 하면 /system/bin/custom_service 실행 파일이 custom_service_exec 유형을 갖게 됩니다.
2.3 서비스 매니페스트에 SELinux 도메인 추가
사용자 정의 System Service를 service_manager 에 등록할 때, 서비스가 올바른 SELinux 컨텍스트를 가질 수 있도록 설정해야 합니다.
system/sepolicy/private/service_contexts 파일을 수정하여 다음과 같이 추가합니다:
# service_contexts
custom_service u:object_r:custom_service:s0
이제 custom_service 가 올바른 보안 컨텍스트에서 실행되도록 설정되었습니다.
3. AOSP 보안 모델에서 System Service 접근 제어
Android의 보안 모델에서는 SELinux뿐만 아니라, Binder IPC 및 Android 권한 모델을 활용하여 서비스 접근을 제어합니다.
3.1 Binder 통신을 위한 SELinux 설정
새로운 System Service가 Binder 를 통해 다른 프로세스와 통신하려면 binder_use 권한을 설정해야 합니다.
system/sepolicy/private/custom_service.te 파일에 다음 내용을 추가합니다:
# custom_service가 Binder를 사용할 수 있도록 허용
allow custom_service system_server:service_manager { add find };
allow custom_service hal_graphics_composer:service_manager { find };
3.2 권한 설정 및 system/sepolicy 변경 방법
Android는 AndroidManifest.xml 파일에서 서비스 권한을 정의할 수 있으며, SELinux 정책과 함께 사용할 수 있습니다.
예를 들어, 특정 앱이 custom_service 에 접근할 수 있도록 permission 을 설정하려면 AndroidManifest.xml 에 다음과 같이 추가합니다:
<manifest>
<permission
android:name="com.example.permission.USE_CUSTOM_SERVICE"
android:protectionLevel="signature" />
</manifest>
이제 앱이 USE_CUSTOM_SERVICE 권한을 선언하고 서명된 앱만 사용할 수 있도록 제한됩니다.
3.3 SELinux 정책 변경 후 빌드 및 적용 방법
SELinux 정책을 변경한 후 AOSP를 다시 빌드해야 합니다. 다음 명령어를 사용하여 빌드를 수행합니다:
# 전체 AOSP 빌드
source build/envsetup.sh
lunch aosp_arm64-userdebug
make -j$(nproc)
# 이미지 플래싱
adb root
adb remount
adb push out/target/product/generic/system.img /system
adb reboot
또는, SELinux 정책만 컴파일하여 적용하려면 다음 명령어를 실행할 수 있습니다:
mmma system/sepolicy
adb push out/target/product/generic/system/sepolicy /system/etc/selinux
adb reboot
4. 결론
SELinux 정책을 올바르게 추가하고 적용하는 것은 Android System Service를 구현할 때 필수적인 과정입니다. 이번 포스팅에서는 다음 내용을 다루었습니다:
- SELinux 개요 및 Android에서의 적용 방식
- 사용자 정의 System Service를 위한 SELinux 정책 정의 방법
- AOSP 보안 모델에서 System Service 접근을 제어하는 방법
- SELinux 변경 후 빌드 및 적용 방법
위 내용을 바탕으로 사용자 정의 System Service를 안전하게 실행할 수 있도록 SELinux 정책을 적용하시기 바랍니다.
'Android > Custom System Service' 카테고리의 다른 글
Android 사용자 정의 System Service 만들기 - HAL 연동 및 성능 최적화 (0) | 2025.06.11 |
---|---|
Android 사용자 정의 System Service 디버깅 및 문제 해결 (0) | 2025.06.10 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.08 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.07 |
Android 사용자 정의 System Service 만들기 (0) | 2025.06.06 |