Android SELinux 정책 문법과 규칙
SELinux(Security-Enhanced Linux)는 리눅스 커널에 추가된 보안 모듈로, Android에서는 필수적인 보안 정책을 적용하는 데 사용됩니다. Android의 SELinux 정책은 MAC(Mandatory Access Control, 강제 접근 제어) 모델을 기반으로 하며, 시스템 내에서 프로세스와 리소스 간의 접근을 제어합니다.
이번 포스팅에서는 type, attribute, allow, neverallow 등의 주요 규칙을 중심으로 SELinux 정책 문법을 설명하겠습니다. 또한, 관련된 예제 코드를 함께 제공하여 정책이 어떻게 동작하는지 쉽게 이해할 수 있도록 하겠습니다.
1. type (타입)
1.1 type의 개념
type
은 SELinux에서 객체(파일, 디렉토리, 프로세스 등)에 부여되는 레이블(Label) 입니다. 보안 정책에서 특정 객체에 대한 접근을 제한하기 위해 사용됩니다.
1.2 type 선언 문법
# type <타입 이름>, <속성(attribute) 이름>(선택사항);
type my_app_exec, exec_type, file_type;
위 예제에서 my_app_exec
이라는 타입을 정의하였으며, exec_type
과 file_type
속성을 가집니다. 이를 통해 해당 타입이 실행 파일이며 파일 시스템 객체라는 것을 나타냅니다.
1.3 type 예제
# my_app.te
# 특정 실행 파일에 대한 타입 정의
type my_app_exec, exec_type, file_type;
# 특정 디렉토리에 대한 타입 정의
type my_app_data, data_file_type;
위 코드에서 my_app_exec
은 실행 가능한 파일이며, my_app_data
는 데이터 파일임을 나타냅니다.
2. attribute (속성)
2.1 attribute의 개념
attribute
는 여러 type
을 그룹화하여 동일한 보안 정책을 적용할 수 있도록 도와줍니다. 즉, 여러 type
을 하나의 속성으로 묶어 관리할 수 있습니다.
2.2 attribute 선언 문법
attribute app_data_file;
위 코드에서는 app_data_file
이라는 속성을 선언하였습니다.
2.3 attribute 사용 예제
# 속성 정의
attribute app_exec;
# 속성을 특정 타입에 할당
type my_app_exec, app_exec, exec_type, file_type;
type another_app_exec, app_exec, exec_type, file_type;
위 예제에서는 my_app_exec
과 another_app_exec
두 개의 타입이 app_exec
속성을 공통으로 가집니다. 이후 보안 정책을 정의할 때 app_exec
속성을 활용하면 여러 타입에 동시에 정책을 적용할 수 있습니다.
3. allow (허용 규칙)
3.1 allow의 개념
allow
는 SELinux에서 특정 타입이 다른 타입에 대해 특정 권한을 가지도록 허용하는 규칙입니다.
3.2 allow 선언 문법
# allow <소스 타입> <대상 타입> : <클래스> { <권한> };
allow my_app my_app_data : file { read write open };
위 코드에서는 my_app
타입이 my_app_data
타입의 파일을 읽고(read
), 쓰고(write
), 열(open
) 수 있도록 허용합니다.
3.3 allow 예제
# my_app.te
# my_app 프로세스가 my_app_data 파일에 대한 접근 허용
allow my_app my_app_data : file { read write open };
# my_app 프로세스가 특정 디렉토리에 접근 가능하도록 허용
allow my_app my_app_data_dir : dir { search read write open };
위 규칙은 my_app
프로세스가 my_app_data
파일과 my_app_data_dir
디렉토리에 접근할 수 있도록 합니다.
4. neverallow (금지 규칙)
4.1 neverallow의 개념
neverallow
는 특정 접근이 절대 허용되지 않도록 강제하는 규칙입니다. 보안 정책에서 필수적으로 적용되는 경우가 많으며, SELinux 정책 검증 단계에서 위반 사항을 발견하면 빌드가 실패합니다.
4.2 neverallow 선언 문법
# neverallow <소스 타입> <대상 타입> : <클래스> { <권한> };
neverallow my_app_data other_app_data : file { write };
위 코드는 my_app_data
타입을 가진 프로세스가 other_app_data
파일을 쓰는 것이 절대 허용되지 않도록 합니다.
4.3 neverallow 예제
# my_policy.te
# 일반 애플리케이션이 시스템 파일을 수정하는 것을 금지
neverallow { appdomain } system_file : file { write append };
# 특정 프로세스가 다른 프로세스의 데이터를 읽는 것을 금지
neverallow my_app another_app_data : file { read };
위 규칙은 appdomain
에 속한 애플리케이션이 system_file
을 수정할 수 없도록 하고, my_app
프로세스가 another_app_data
파일을 읽을 수 없도록 제한합니다.
5. SELinux 정책 테스트 및 적용 방법
SELinux 정책을 정의한 후에는 이를 테스트하고 적용해야 합니다. Android에서는 sepolicy
검증 도구와 빌드 시스템을 통해 정책을 검증하고 적용할 수 있습니다.
5.1 SELinux 정책 검증
checkpolicy -M -c 30 -o my_policy.pp my_policy.te
위 명령어를 실행하면 my_policy.te
파일을 컴파일하여 my_policy.pp
정책 파일을 생성합니다.
5.2 정책 적용 및 확인
adb shell getenforce # SELinux 상태 확인
audit2allow -i /var/log/audit/audit.log # 거부된 정책 확인 및 해결책 제안
위 명령어를 사용하여 SELinux가 Enforcing
상태인지 확인하고, 정책 위반 사항을 해결할 수 있습니다.
6. 마무리
이번 포스팅에서는 Android SELinux 정책에서 중요한 type
, attribute
, allow
, neverallow
규칙을 설명하고 예제 코드를 제공하였습니다. SELinux 정책을 정의하고 적용하는 과정에서 이러한 규칙을 잘 이해하고 활용하면 보다 안전한 Android 시스템을 구축할 수 있습니다.
'Android > Seploicy' 카테고리의 다른 글
Android SELinux 정책에서 서비스, 바이너리, 파일 시스템 정의하기 (0) | 2025.05.02 |
---|---|
Android SELinux 정책 설정: domain, file_contexts, genfs_contexts 설정 방법 (0) | 2025.05.01 |
avc: denied 로그 분석 및 이해하기 (0) | 2025.04.29 |
Android SELinux 정책의 주요 파일 및 디렉터리 구성 (0) | 2025.04.28 |
Android SELinux 정책의 기본 파일 구조 (0) | 2025.04.27 |