Android/Seploicy

Android SELinux 정책 문법과 규칙

임베디드 친구 2025. 4. 30. 19:41
728x90
반응형

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_typefile_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_execanother_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 시스템을 구축할 수 있습니다.

728x90
반응형