10장. SELinux systemd 액세스 제어
Red Hat Enterprise Linux 7에서 시스템 서비스는
systemd 데몬에 의해 제어됩니다. 이전 Red Hat Enterprise Linux 릴리스에서 데몬은 다음 두 가지 방법으로 시작할 수 있습니다.
- 부팅 시 System V
init데몬이init.rc스크립트를 시작한 다음 이 스크립트가 필요한 데몬을 시작했습니다. 예를 들어 부팅 시 시작된 Apache 서버에는 다음 SELinux 레이블이 있습니다.system_u:system_r:httpd_t:s0
system_u:system_r:httpd_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 관리자가
init.rc스크립트를 수동으로 시작하여 데몬이 실행됩니다. 예를 들어 서비스 httpd restart 명령이 Apache 서버에서 호출되면 결과 SELinux 레이블은 다음과 같습니다.unconfined_u:system_r:httpd_t:s0
unconfined_u:system_r:httpd_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
수동으로 시작하면 프로세스가 SELinux 레이블을 시작한 사용자 부분을 채택하여 위의 두 시나리오에서 레이블을 지정하지 않았습니다.
systemd 데몬에서는 전환이 매우 다릅니다. systemd 는 시스템에서 데몬을 시작하고 중지하기 위해 모든 호출을 처리하므로 init_t 유형을 사용하여 데몬을 수동으로 다시 시작할 때 레이블의 사용자 부분을 덮어쓸 수 있습니다. 결과적으로 위의 두 시나리오의 레이블은 예상대로 system_u:system_r:httpd_t:s0 이며 SELinux 정책이 개선되어 어떤 도메인을 제어할 수 있는지 제어할 수 있었습니다.
10.1. 서비스의 SELinux 액세스 권한 링크 복사링크가 클립보드에 복사되었습니다!
링크 복사링크가 클립보드에 복사되었습니다!
이전 버전의 Red Hat Enterprise Linux에서는 관리자가 System V Init 스크립트 레이블을 기반으로 서비스를 시작하거나 중지할 수 있는 사용자 또는 애플리케이션을 제어할 수 있었습니다. 이제
systemd 가 모든 서비스를 시작 및 중지하고 사용자 및 프로세스는 systemctl 유틸리티를 사용하여 systemd 와 통신합니다. systemd 데몬은 SELinux 정책을 참조하고 호출 프로세스의 레이블과 호출자가 관리하려고 하는 단위 파일의 레이블을 확인한 다음, 호출자가 액세스할 수 있는지 여부를 SELinux에 요청할 수 있습니다. 이 접근 방식을 통해 시스템 서비스의 시작 및 중지를 비롯한 중요한 시스템 기능에 대한 액세스 제어를 강화합니다.
예를 들어, 이전에 관리자는 NetworkManager가
systemctl 을 실행하여 D-Bus 메시지를 systemd 로 보낼 수 있도록 허용해야 했으며, 이 메시지는 NetworkManager가 요청한 모든 서비스를 시작하거나 중지했습니다. 실제로 NetworkManager는 systemctl 이 수행할 수 있는 모든 작업을 수행할 수 있습니다. 또한 특정 서비스를 시작하거나 중지할 수 있도록 제한된 관리자를 설정하는 것도 불가능했습니다.
이러한 문제를 해결하기 위해
systemd 는 SELinux Access Manager로도 작동합니다. systemctl 을 실행하는 프로세스의 레이블 또는 D-Bus 메시지를 systemd 로 보낸 프로세스를 검색할 수 있습니다. 그런 다음 데몬은 프로세스가 구성하려는 유닛 파일의 레이블을 조회합니다. 마지막으로 SELinux 정책에서 프로세스 레이블과 유닛 파일 레이블 간의 특정 액세스를 허용하는 경우 커널에서 정보를 검색할 수 있습니다. 즉, 특정 서비스에 대해 systemd 와 상호 작용해야 하는 손상된 애플리케이션을 이제 SELinux로 제한할 수 있습니다. 정책 작성자는 이러한 세분화된 제어를 사용하여 관리자를 제한할 수도 있습니다. 정책 변경에는 service 라는 새 클래스와 다음 권한이 포함됩니다.
예를 들어 정책 작성자는 도메인에서 서비스의 상태를 가져오거나 서비스를 시작 및 중지할 수 있지만 서비스를 활성화하거나 비활성화할 수 없습니다. SELinux 및
systemd 의 액세스 제어 작업이 모든 경우에 일치하지 않습니다. SELinux 액세스 검사를 사용하여 systemd 메서드 호출을 연결하도록 매핑이 정의되었습니다. 표 10.1. “SELinux 액세스 검사에서 systemd 장치 파일 메서드 호출 매핑” 는 단위 파일에 대한 액세스 검사를 매핑하고 표 10.2. “SELinux 액세스 검사에서 systemd 일반 시스템 호출 매핑” 는 일반적으로 시스템에 대한 액세스 검사를 다룹니다. 두 테이블에 일치하는 항목이 없으면 정의되지 않은 시스템 검사가 호출됩니다.
systemd 장치 파일 방법 | SELinux 액세스 확인 |
|---|---|
| DisableUnitFiles | 비활성화 |
| EnableUnitFiles | 활성화 |
| GetUnit | 상태 |
| GetUnitByPID | 상태 |
| GetUnitFileState | 상태 |
| 강제 종료 | stop |
| KillUnit | stop |
| LinkUnitFiles | 활성화 |
| ListUnits | 상태 |
| LoadUnit | 상태 |
| MaskUnitFiles | 비활성화 |
| PresetUnitFiles | 활성화 |
| ReenableUnitFiles | 활성화 |
| 다시 실행 | 시작 |
| 새로 고침 | 새로 고침 |
| ReloadOrRestart | 시작 |
| ReloadOrRestartUnit | 시작 |
| ReloadOrTryRestart | 시작 |
| ReloadOrTryRestartUnit | 시작 |
| ReloadUnit | 새로 고침 |
| ResetFailed | stop |
| ResetFailedUnit | stop |
| 재시작 | 시작 |
| RestartUnit | 시작 |
| 시작 | 시작 |
| StartUnit | 시작 |
| StartUnitReplace | 시작 |
| 중지 | stop |
| StopUnit | stop |
| TryRestart | 시작 |
| TryRestartUnit | 시작 |
| UnmaskUnitFiles | 활성화 |
systemd 일반 시스템 호출 | SELinux 액세스 확인 |
|---|---|
| ClearJobs | reboot |
| FlushDevices | Halted |
| get | 상태 |
| GetAll | 상태 |
| GetJob | 상태 |
| GetSeat | 상태 |
| GetSession | 상태 |
| GetSessionByPID | 상태 |
| GetUser | 상태 |
| Halted | Halted |
| 인트로스펙션 | 상태 |
| kexec | reboot |
| KillSession | Halted |
| KillUser | Halted |
| ListJobs | 상태 |
| ListSeats | 상태 |
| ListSessions | 상태 |
| ListUsers | 상태 |
| LockSession | Halted |
| PowerOff | Halted |
| 재부팅 | reboot |
| SetUserLinger | Halted |
| TerminateSeat | Halted |
| TerminateSession | Halted |
| TerminateUser | Halted |
예 10.1. 시스템 서비스에 대한 SELinux 정책
sesearch 유틸리티를 사용하면 시스템 서비스에 대한 정책 규칙을 나열할 수 있습니다. 예를 들어 sesearch -A -s NetworkManager_t -c service 명령을 호출하면 다음이 반환됩니다.