Android System & AOSP Engineering/Android Security & SELinux

SELinux 정책 최적화 가이드: 성능과 보안을 모두 잡는 5가지 기법

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

리눅스 및 안드로이드 시스템의 보안을 책임지는 SELinux(Security-Enhanced Linux)는 강력한 접근 제어를 제공하지만, 정책이 복잡해질수록 시스템 리소스 소모가 커지고 유지보수가 어려워지는 단점이 있습니다. 특히 임베디드나 모바일 환경에서는 최적화되지 않은 정책이 부팅 속도 지연이나 앱 실행 성능 저하로 이어지기도 합니다.

이번 포스팅에서는 보안성은 유지하면서도 시스템 부하를 줄일 수 있는 SELinux 정책 최적화 및 최소화 전략을 상세히 살펴보겠습니다.

Generated by Gemini AI.

📌 핵심 요약 3줄

  1. **최소 권한 원칙(PoLP)**을 준수하여 프로세스에 꼭 필요한 권한만 부여합니다.
  2. 도메인 및 파일 컨텍스트를 그룹화하고 불필요한 규칙을 제거하여 정책 크기를 줄입니다.
  3. audit2allow와 seinfo 도구를 활용해 정기적으로 정책을 분석하고 최적화합니다.

1. SELinux 정책 최소화 원칙

단순히 거부(Deny) 로그를 없애는 것이 목적이 아니라, 구조적으로 간결한 정책을 만드는 것이 중요합니다.

원칙 설명 비고
최소 권한(PoLP) 프로세스가 동작하는 데 필요한 최하위 권한만 할당 보안의 기본
도메인 격리 하나의 도메인이 너무 많은 권한을 갖지 않도록 세분화 권한 확산 방지
정책 레이어링 Base, Vendor, Product 정책을 분리하여 관리 유지보수 용이성
규칙 단순화 중복되거나 유사한 권한은 매크로 등을 통해 통합 정책 가독성 향상

2. SELinux 정책 최적화 주요 기법

2.1. 불필요한 도메인 및 파일 컨텍스트 제거

사용하지 않는 바이너리나 서비스에 할당된 정책은 메모리를 점유합니다. seinfo 명령어로 현재 상태를 점검하세요.

  • 명령어 예시: seinfo -t (모든 타입 확인), seinfo -r (역할 확인)
  • 제거 방법: 더 이상 사용하지 않는 .te 파일(Type Enforcement)과 .fc 파일(File Contexts)을 소스 트리에서 삭제하고 정책을 다시 빌드합니다.

2.2. 권한 그룹화 및 매크로 활용

개별 권한을 일일이 나열하는 대신, 관련 권한을 묶어서 관리하면 정책 파일의 가독성이 좋아지고 관리가 편해집니다.

최적화 전 (비효율적) 최적화 후 (권장)
allow domain data:file read;

allow domain data:file write;

allow domain data:file open;
allow domain data:file { read write open };

또는 매크로 사용: rw_file_perms

2.3. audit2allow를 통한 스마트한 정책 생성

audit2allow는 로그 기반으로 정책을 자동 생성해 주지만, 그대로 복사 붙여넣기 하는 것은 금물입니다. 생성된 결과물에서 과도한 권한(예: capability, rawip_recv)이 포함되어 있는지 반드시 검토해야 합니다.

Bash
 
# AVC 로그를 분석하여 최적화된 정책 제안 확인
adb logcat -d | grep "avc: denied" | audit2allow -p policy

3. 정책 최적화 실습 예제

실제 환경에서 자주 발생하는 권한 과잉 부여 사례를 최적화해 보겠습니다.

✅ Case: 앱 데이터 접근 권한 최적화

  • 기존 정책: 불필요한 생성/삭제 권한까지 포함됨
  • 코드 스니펫
     
    type my_app_data, file_type;
    allow my_app_domain my_app_data:file { read write create unlink setattr };
    
  • 최적화 후: 실제 필요한 읽기/쓰기 권한으로 한정
  • 코드 스니펫
     
    type my_app_data, file_type;
    allow my_app_domain my_app_data:file { read write };
    

💡 개발을 위한 꿀팁 (Tips)

  • Neverallow 활용: 최적화 과정에서 실수로 중요한 보안 벽을 허물지 않도록 neverallow 규칙을 가이드라인으로 삼으세요. 이는 빌드 타임에 보안 위반을 잡아주는 강력한 도구입니다.
  • Donataudit 활용: 시스템 동작에는 지장이 없지만 로그만 계속 발생하는 경우, dontaudit을 사용하여 로그 생성을 억제하세요. 로그 오버헤드를 줄여 시스템 성능을 소폭 향상시킬 수 있습니다.

⚠️ 흔히 하는 실수 (Common Mistakes)

  • 모든 권한에 self 사용: 프로세스가 자기 자신에게 모든 권한을 가질 필요는 없습니다. 불필요한 self 권한 부여는 보안 취약점이 될 수 있습니다.
  • 폭넓은 와일드카드(*) 사용: 파일 경로 설정(file_contexts) 시 과도한 와일드카드 사용은 의도치 않은 파일에 보안 컨텍스트가 입혀지는 결과를 초래합니다.
  • Permissive 모드 방치: 개발 중 편의를 위해 permissive 모드로 설정해 둔 도메인을 운영 환경까지 그대로 배포하는 실수를 주의하세요.

4. 결론

SELinux 정책 최적화는 단순히 보안을 강화하는 단계를 넘어, 시스템 전체의 가용성과 성능을 최상으로 유지하기 위한 필수 작업입니다. 최소 권한 원칙을 바탕으로 정기적인 정책 리뷰를 수행한다면, 복잡한 시스템에서도 가볍고 강력한 보안 환경을 구축할 수 있습니다.

오늘 소개해 드린 기법들을 활용해 여러분의 시스템 정책을 한 단계 더 업그레이드해 보시기 바랍니다!

반응형