Android System & AOSP Engineering/Android Security & SELinux

Android SELinux 설정 가이드: domain 정의부터 file_contexts 적용까지

임베디드 친구 2025. 5. 1. 22:28
반응형

안드로이드 프레임워크나 시스템 서비스를 개발할 때, 새로운 프로세스를 추가하거나 특정 경로의 파일에 접근하려 하면 어김없이 SELinux의 거부(Denied) 로그를 마주하게 됩니다. 이는 해당 프로세스가 적절한 도메인(Domain)을 부여받지 못했거나, 대상 리소스에 컨텍스트(Context)가 올바르게 설정되지 않았기 때문입니다.

단순히 allow 규칙만 추가하는 것으로는 부족합니다. 근본적으로 프로세스가 어떤 이름표를 달고 실행될지, 파일은 어떤 이름표를 가질지를 결정하는 핵심 설정법을 알아야 합니다. 오늘은 domain, file_contexts, genfs_contexts의 설정 방법과 적용 절차를 상세히 정리해 보겠습니다.

Generated by Gemini AI.


📌 핵심 요약 3줄

  1. Domain: 실행 중인 프로세스의 보안 라벨로, init_daemon_domain 매크로를 통해 서비스 시작 시 도메인 전환을 수행합니다.
  2. File Contexts: 실제 저장소의 파일/디렉터리에 라벨을 부여하며, 수정 후에는 restorecon으로 즉시 반영할 수 있습니다.
  3. Genfs Contexts: proc, sysfs와 같이 커널에 의해 동적으로 생성되는 가상 파일 시스템의 보안 라벨을 관리합니다.

1. SELinux 컨텍스트 설정 비교

설정 대상에 따라 수정해야 할 파일과 적용 방식이 다릅니다.

설정 구분 대상 리소스 설정 파일 경로 (예시) 적용 방식
Domain 프로세스 (Service) sepolicy/vendor/my_service.te 정책 재빌드 및 리부팅
File Contexts 일반 파일 및 디렉터리 sepolicy/vendor/file_contexts restorecon 실행
Genfs Contexts 가상 파일 시스템 (proc, sysfs) sepolicy/vendor/genfs_contexts 정책 재빌드 및 리부팅

2. 영역별 상세 설정 방법

2.1 프로세스의 이름표: domain 설정

새로운 서비스를 추가할 때, 이 서비스가 어떤 권한을 가질지 정의하는 첫 단계입니다.

  • 정의: .te 파일에서 프로세스 타입을 선언하고 domain 속성을 부여합니다.
  • 도메인 전환: init 프로세스가 서비스를 실행할 때 자동으로 도메인을 바꿔주도록 설정해야 합니다.
코드 스니펫
 
# my_service.te
# 1. 타입 및 도메인 선언
type my_service, domain;
type my_service_exec, exec_type, vendor_file_type, file_type;

# 2. init이 실행 파일을 실행할 때 my_service 도메인으로 전환하도록 설정
init_daemon_domain(my_service)

2.2 물리적 파일의 이름표: file_contexts 설정

특정 경로에 생성되는 파일이나 미리 포함된 파일에 라벨을 붙입니다.

  • 정의: 정규표현식을 사용하여 경로와 라벨(u:object_r:...)을 매핑합니다.
Plaintext
 
# file_contexts
/vendor/bin/my_service          u:object_r:my_service_exec:s0
/data/vendor/my_data(/.*)?     u:object_r:my_service_data:s0
  • 실시간 반영: 이미 생성된 파일에 변경된 정책을 즉시 적용하려면 아래 명령어를 사용합니다.
Bash
 
adb shell restorecon -Rv /data/vendor/my_data

2.3 가상 파일 시스템의 이름표: genfs_contexts 설정

커널에서 부팅 시 생성하는 sysfs, proc, debugfs 등은 물리적 파일이 아니므로 별도의 설정이 필요합니다.

Plaintext
 
# genfs_contexts
# /proc/my_custom_node에 my_proc_type 라벨 부여
genfscon proc /my_custom_node u:object_r:my_proc_type:s0
genfscon sysfs /devices/platform/my_hw u:object_r:my_sysfs_type:s0

3. SELinux 정책 빌드 및 적용 절차

설정을 마친 후에는 정책 바이너리를 빌드하여 디바이스에 반영해야 합니다.

단계 명령어 / 절차 비고
1. 정책 빌드 m -j8 selinux_policy AOSP 루트 디렉터리에서 실행
2. 권한 획득 adb root && adb remount 쓰기 권한 확보
3. 정책 푸시 adb push [빌드경로]/vendor_sepolicy.cil /vendor/etc/selinux/ 파티션별 경로 확인 필요
4. 반영 adb reboot 시스템 재부팅 후 적용

🛠️ 개발자를 위한 팁 & 흔히 하는 실수

✅ 개발 팁 (Best Practices)

  • 매크로 적극 활용: init_daemon_domain 외에도 권한 묶음을 의미하는 r_file_perms, rw_file_perms 등의 매크로를 사용하여 가독성을 높이세요.
  • 로그 모니터링: 정책 적용 후 adb shell "dmesg | grep avc"를 통해 의도치 않은 차단이 발생하는지 반드시 실시간으로 확인해야 합니다.

❌ 흔히 하는 실수 (Common Mistakes)

  • exec_type 누락: file_contexts에서 실행 파일에 라벨을 붙였더라도, 해당 라벨 정의 시 exec_type 속성을 주지 않으면 도메인 전환(Domain Transition)이 일어나지 않아 서비스가 실행되지 않습니다.
  • 정규식 오류: /data/my_dir 뒤에 (/.*)?를 붙이지 않으면 해당 디렉터리만 라벨링되고 내부 파일들은 라벨링되지 않습니다.
  • 상위 디렉터리 권한: 하위 파일에 대한 read 권한을 주었어도, 상위 디렉터리에 대한 search 권한이 없으면 접근에 실패합니다.

4. 결론

Android SELinux 설정의 핵심은 "정확한 라벨링"입니다. 프로세스는 domain으로, 파일은 file_contexts로, 가상 노드는 genfs_contexts로 각각의 이름표를 명확히 정의해 주어야 합니다. 이 삼박자가 맞았을 때 비로소 안전하고 원활한 시스템 동작이 가능해집니다.

오늘 포스팅이 안드로이드 시스템 보안 설정을 최적화하는 데 도움이 되었기를 바랍니다. 질문이나 막히는 부분이 있다면 언제든 댓글로 소통해 주세요!

반응형