SELinux 는 Linux의 보안을 강화해 주는 보안 강화 커널이고 zero-day 공격 및 buffer overflow 등 어플리케이션 취약점으로 인한 해킹을 방지해 주는 핵심 구성요소이다.
특정 서비스가 SELinux 때문에 동작하지 않는다면 SELinux 를 끄기 보다는 해당 서비스가 SELinux 하에서 잘 동작하도록 설정을 수정하는걸 권장한다.
접근 통제
디렉터리나 파일, 네트워크 소켓 같은 시스템 자원을 적절한 권한을 가진 사용자나 그룹이 접근하고 사용할 수 있게 통제하는 것을 의미함
접근 통제에서는 **시스템 자원을 객체(Object)**라고 하며 자원에 접근하는 **사용자나 프로세스는 주체(Subject)**라고 정의함
즉, /etc/passwd 파일은 객체이고 이 파일에 접근해서 암호를 변경하는 passwd 라는 명령어는 주체이며 아파치 웹 서버의 설정 파일인 /etc/httpd/conf/httpd.conf는 객체이며 웹 서버 프로그램인 /sbin/httpd는 주체임
임의 접근 통제(DAC; Discretionary Access Control)
임의 접근 통제는 객체에 대한 접근을 사용자나 그룹의 신분을 기준으로 제한하는 방법임
사용자나 그룹이 객체의 소유자라면 다른 주체에 대해 이 객체에 대한 접근 권한을 설정할 수 있음
임의적이라는 말은 소유자가 자신의 판단에 의해 다른 주체에게 권한을 줄 수 있다는 의미임. 그리고 구현이 용이하고 사용이 간편하기 때문에 대부분의 운영체제의 기본 접근 통제 모델로 사용되고 있음
DAC는 사용자가 임의로 접근 권한을 지정하므로 사용자의 권한을 탈취당하면 사용자가 소유하고 있는 모든 객체의 접근 권한을 가질 수 있게 되는 치명적인 문제가 있음
특히 root 계정은 모든 권한을 갖고 있으므로 root 권한을 탈취하면 시스템을 완벽하게 장악할 수 있음
강제 접근 통제(MAC; Mandatory Access Control)
미리 정해진 정책과 보안 등급에 의거해 주체에게 허용된 접근 권한과 객체에게 부여된 허용 등급을 비교해 접근을 통제하는 모델임
높은 보안을 요구하는 정보는 낮은 보안 수준의 주체가 접근할 수 없으며 소유자라 할 지라도 정책에 어긋나면 객체에 접근할 수 없으므로 강력한 보안을 제공함
SELinux 아키텍처
SELinux는 리눅스 커널의 일부이며 다음과 같은 아키텍처를 가짐. 모든 시스템 콜은 SELinux 보안 모듈을 통해 내부의 캐시된 보안 정책을 통해서 권한을 검사한 후에 실행됨
캐시된 정책은 AVC(Access Vector Cache) 라고 불리며 시스템의 성능을 떨어뜨리지 않기 위해 질의에 최적화 돼서 정책을 추가/변경/삭제하는 작업은 매우 시간이 오래 걸리지만 AVC에서 정책을 질의하는 것은 빠르게 처리됩니다
사용자 관점에서 보면 프로세스가 특정 리소스(파일, 디렉토리, 소켓 등)를 요청하면 기존의 임의 접근 통제(DAC) 방식의 권한이 부여돼 있는지 확인하고 다시 SELinux 내의 강제 접근 통제(MAC) 에서도 허용된 요청인지를 보안 컨텍스트를 통해 확인하고 이를 통과하면 접근을 허용하게 됨
Security Context
SELinux는 모든 프로세스와 객체마다 보안 컨텍스트(Security Context), 또는 보안 레이블(Security Label)이라 부르는 정보를 부여해 관리하고 있음. 이 정보는 접근 권한을 확인하는데 사용되고 있으며 SELinux를 이해하기 위한 핵심 요소로 다음 4가지 구성 요소로 이루어져 있음
요소 설명
사용자 | 시스템의 사용자와는 별도의 SELinux 사용자로 역할이나 레벨과 연계해 접근 권한을 관리하는데 사용 |
역할(Role) | 하나 혹은 그 이상의 타입과 연결돼 SELinux의 사용자 접근을 허용할지 결정하는데 사용 |
타입(Type) | Type Enforcement의 속성중 하나로 프로세스의 도메인이나 파일의 타입을 지정하고 이를 기반으로 접근 통제를 수행 |
레이블(Label) | 레이블은 MLS(Multi Level System)에 필요하며 강제 접근 통제보다 더 강력한 보안이 필요할 때 사용하는 기능으로 정부나 군대등 최고의 기밀을 취급하는 곳이 아니라면 사용하지 않음 |
보안 컨텍스트에서 가장 중요한 부분은 타입(Type)이라는 레이블(식별자)로 SELinux는 모든 파일이나 디렉터리등의 객체와 httpd 프로세스등의 주체에 대해 레이블을 붙여서 구분하고 있으며 객체에 붙일 경우 타입, 주체에 붙일 경우 도메인(Domain)이라고 부름
SELinux의 세가지 모드
- enforce : SELinux 의 정책과 룰에 어긋나는 동작은 모두 차단됨
- permissive : SELinux 의 정책에 어긋나는 동작은 감사 로그를 남기고 허용됨
- disable : 정책을 적용하지 않음
SELinux 트러블 슈팅
- /var/www/html 하단에 mount 한 nfs 디렉토리 내부 파일을 curl -O로 다운로드시 permission denied로 인해 파일을 읽을 수 없던 문제
원인 : httpd 서버가 nfs 클라이언트 mount하고 있는 디렉토리에 접근할 권한이 없음 (permission denied)
해결 : SELinux Boolean 이라는 사전에 정의된 규칙의 집합들에 대한 값을 조정함
#sebool에 대한 모든 설정 확인
getsebool -a
#httpd에 관련된 sebool 리스트 확인
#getsebool -a | grep httpd
...
httpd_use_nfs --> off
...
#httpd가 nfs를 사용할 수 있도록 모아놓은 seboolean을 on으로 켜준다
#-P 옵션을 통해 reboot 이후에도 해당 설정이 유지되도록 한다
setsebool -P httpd_use_nfs true
'IT 일기' 카테고리의 다른 글
nfs 구성 (0) | 2023.08.19 |
---|---|
iscsi 구성 - with multipath (2) | 2023.08.19 |
데코레이터 패턴이란? (Go) (0) | 2023.04.16 |
Two ways to implement DFS. (Recursive or Stack) (0) | 2023.03.23 |
TCP 4-way-handshake's Buffered-Period in Time-Wait (0) | 2023.03.18 |