✔️ SELinux (Security Enhanced Linux)
- 관리자가 시스템 엑세스 권한을 효과적으로 제어할 수 있게하는 Linux 시스템 용 보안 아키텍처이다.
- 리눅스는 소스코드가 공개되어 있어 보안이 취약한데 취약점을 보완한 것이 SELinux이다.
- Linux의 핵심인 Kernel을 보호하기 위한 도구이다. (Linux Kernel 모듈)
- 기존 접근 통제 규칙보다 우선으로 동작하여 SELinux의 보안 정책에 맞지 않을 경우 차단한다.
- 3가지 상태가 존재한다.
- enforcing : 강제
- permissive : 허용
- disabled : 비활성화
- CentOS 7 이상부터 적용된다.
- 2000년에 오픈소스 커뮤니티에 릴리스되어 2003년에 Linux Kernel로 통합되었다.
✔️ SELinux 아키텍처
시스템 콜은 SELinux 보안 모듈을 통해 보안 정책을 질의한 후 처리되며 모든 시스템 콜에 대해 SELinux가 보안 정책을 확인해서 접근 허용 여부를 판단해야 하므로 속도를 빠르게 하기 위해 캐싱하여 처리하고 있다.
이 부분을 AVC(Access Vector Cache)라고 부른다.
✔️ Security Context
SELinux 는 모든 프로세스와 객체마다 보안 컨텍스트 - Security Context (또는 보안 레이블 이라고도 한다.)이라고 부르는 정보를 부여하여 관리하고 있다.
이 정보는 접근 권한을 확인하는데 사용되고 있으며 SELinux를 이해하기 위한 핵심 요소이다.
컨텍스트는 다음 4가지 구성 요소로 이루어져 있다.
요소 | 설명 |
라벨 (Label) | Label은 MLS(Multi Level System)에 필요하며 강제 접근 통제보다 더 강력한 보안이 필요할 때 사용하는 기능이라고 한다. |
사용자 | 시스템의 사용자와는 별도의 SELinux 사용자이다. 역할이나 레벨과 연계하여 접근 권한을 관리하는데 사용된다. |
역할 (Role) | 하나 혹은 그 이상의 타입과 연결되어 SELinux의 사용자 접근을 허용할 지 결정하는데 사용된다. |
타입 (Type) | Type Enforcement의 속성 중 하나로 프로세스의 도메인이나 파일의 타입을 지정하고 이를 기반으로 접근 통제를 수행한다. |
⭐️ 가장 중요하고 꼭 알아야 할 부분은 타입이며 이는 보안 컨텍스트의 핵심 부분이다.
SELinux를 활성화하면 파일이나 디렉토리 등의 객체마다 보안 컨텍스트를 부여하고 있으며 ls, ps 등의 명령어에 -Z 옵션을 추가하면 확인할 수 있다.
ls 명령어에 -Z 옵션을 사용하여 직접 파일과 디렉터리의 보안 컨텍스트를 확인해 보도록 하자.
먼저 웹 컨텐츠를 제공하는 /var/www/html 를 확인해 보면 다음처럼 system_u 라는 사용자와 object_r 이라는 역할, httpd_sys_content_t라는 타입을 갖고 있다.
아파치 httpd가 구동되었을 때 어떤 보안 컨텍스트를 갖게 되는지 확인해보자
다음 명령으로 아파치 프로세스의 보안 컨텍스트를 확인할 수 있다.
ps -ZC httpd" # -C 옵션은 pid 대신 프로세스 이름으로 프로세스의 정보를 얻어온다.
위와 같이 httpd 프로세스는 httpd_t 라는 보안 컨텍스트를 갖고 구동된다.
✔️ SELinux 작동 방식
SELinux는 시스템의 어플리케이션, 프로세스, 파일에 대한 엑세스 제어를 정의한다.
- SELinux에 엑세스 할 수 있는 대상을 정하는 룰 세트인 보안 정책을 사용해 정책에서 허용된 액세스를 실행한다.
- 어플리케이션이나 프로세스가 파일에 대한 액세스를 요청하면 SELinux는 AVC(Access Vector Cache)를 확인한다.
- SELinux가 AVC에 기반한 결정을 내릴 수 없을 때 보안 서버에 요청을 전송한다.
- 보안 서버는 어플리케이션이나 프로세스의 보안 컨텍스트와 파일을 확인한다.
- 보안 컨텍스트는 SELinux 보안 정책 데이터베이스에서 적용된다.
- 권한이 허용되거나 거부된다. (권한 거부시 "avc: denied" 라는 메세지가 /var/log.messages 에 나타난다.)
✔️ SELinux 장점
1. 사전 정의된 접근 통제 정책 탑재
사용자, 역할, 타입, 레벨등의 다양한 정보를 조합하여 어떤 프로세스가 어떤 파일, 디렉터리, 포트등에 접근 가능한지에 대해 사전에 잘 정의된 접근 통제 정책이 제공된다.
MAC 적용을 위해 시스템 관리자가 할 일이 대폭 줄었고 애플리케이션의 변경없이 setuid와 1024 이하 포트를 사용하는 데몬을 안전하게 사용할 수 있다.
2. "Deny All, Permit Some" 정책으로 잘못된 설정 최소화
"모든 걸 차단하고 필요한 것만 허용"하는 정책은 단순하면서 강력한 정보 보호를 위한 최선의 정책이다.
SELinux 의 보안 정책도 이 방식으로 사전에 설정되어 있으므로 잘못된 설정이 기본 포함돼 있을 여지가 적다.
3. 권한 상승 공격에 의한 취약점 감소
setuid 비트가 켜져 있거나 루트로 실행되는 프로세스처럼 위험한 프로그램들은 샌드박스안에서 별도의 도메인으로 격리되어 실행되므로 루트 권한을 탈취해도 해당 도메인에만 영향을 미치고 전체 시스템에 미치는 영향이 최소화된다.
ex) 아파치 httpd 서버의 보안 취약점을 통해 권한을 획득했어도 아파치같은 서버 데몬은 낮은 등급의 권한을 부여 받으므로 공격자는 일반 사용자의 홈 디렉터리를 읽을 수 없고 /tmp 임시 디렉터리에 파일을 쓸 수가 없다.
4. 잘못된 설정과 버그로부터 시스템 보호
잘못된 설정이나 신뢰할 수 없는 입력을 악용한 공격에서 프로세스를 보호할 수 있다.
ex) 버퍼의 입력 길이등을 제대로 체크하지 않아서 발생하는 버퍼 오버 플로 공격(buffer overflow attack)의 경우 SELinux 는 어플리케이션이 메모리에 있는 코드를 실행할 수 없게 통제하므로 데몬 프로그램에 버퍼 오버 플로 버그가 있어도 쉘을 얻을 수가 없다.
✔️ SELinux 관련 명령어
CentOS 설치 후 SELinux는 기본적으로 enforcing 상태로 되어있다.
✔️ sestatus
SELinux 상태를 확인하는 명령어이다.
setsebool
SELinux 설정 값을 주는 명령어
setsebool [옵션][설정할 정책][ON(or 1)/OFF(or 0)]
setsebool -P # 재부팅 후에도 적용되는 옵션 (SELinux 환경 설정이 적용된다.)
예시
setsebool -P ftpd_full_access_on
-> ftp에 대해 SELinux 접근 보안 정책
getsebool
정의된 정책 및 정책 설정 상태에 대한 boolean 값 상태를 확인한다.
getsebool [옵션]
getsebool -a # 모든 옵션 boolean 값 상태를 확인 (보통 |grep과 같이 사용)
✔️ getenforce
/etc/sysconfig/selinux 파일을 열거나 getenforce 명령어를 사용하면 SELinux의 현재 서비스 상태를 확인할 수 있다.
[root@localhost ~]# getenforce
Enforcing
✔️ setenforce
/etc/sysconfig/selinux 파일을 직접 수정하거나 setenforce 명령어로 SELinux 정책을 변경할 수 있다.
- setenforce 0 : permissive로 설정
- setenforce 1 : enforcing 으로 설정
[root@localhost ~]# setenforce 1
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
다만, setenforce 명령어는 임시적으로 적용되며, SELinux status 값이 disabled 상태이면 명령어를 사용할 수 없다.
SELinux가 필요하지 않은 경우 /etc/selinux/config 또는 /etc/sysconfig/selinux 를 수정해 영구적으로 비활성화 할 수 있다. (/etc/sysconfig/selinux → /etc/selinux/config 심볼릭 링크되어 있어 어느 파일을 편집하던 /etc/selinux/config 파일이 수정된다.)
[root@web ~]# ls -alh /etc/selinux/config
-rw-r--r--. 1 root root 547 2월 21 14:53 /etc/selinux/config
[root@web ~]# ls -alh /etc/sysconfig/selinux
lrwxrwxrwx. 1 root root 17 2월 21 14:53 /etc/sysconfig/selinux -> ../selinux/config
[root@web ~]# stat /etc/sysconfig/selinux
File: `/etc/sysconfig/selinux' -> `../selinux/config'
Size: 17 Blocks: 0 IO Block: 4096 심볼릭 링크
Device: 802h/2050d Inode: 68075260 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:etc_t:s0
Access: 2022-03-16 10:56:22.842851223 +0900
Modify: 2022-02-21 14:53:25.486000000 +0900
Change: 2022-02-21 14:53:25.486000000 +0900
Birth: -
/etc/selinux/config의 SELINUX 값을 변경 후 반드시 reboot 해줘야 정상적으로 적용된다.
✔️ chcon
보안 문맥을 변경해주는 명령어
chcon [옵션][보안 문맥][파일명]
chcon 옵션
옵션 | 내용 |
-t | 해당 파일에 대한 role 설정 |
-R | 하위 디렉토리 내 모든 파일에 대한 같은 role 설정 |
-u | user 변경 시 |
-r | role 변경 시 |
-t | type 변경 시 |
[root@web ~]# chcon -R -t httpd_sys_content_t /home/user
/home/usr 디렉토리 아래에 생성되는 모든 파일은 "httpd_sys_content_t" 보안 문맥을 적용한다.
→ 디렉토리 권한이 755여도 기본 보안 문맥으로는 웹 서버(80번 포트)에 접근이 불가하기 때문에 명령어를 사용하여 접근 가능하도록 한다.
ls -lZ [파일명]
명령을 통해 적용된 문맥을 볼 수 있다.
- _u : 고유 이름 (identify) 필드
- _r : 역할(role) 필드
- _t : 유형(type) 필드
[root@web html]# pwd
/var/www/html
[root@web html]# ls -lZ
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 phpinfo.php
drwxr-xr-x. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 wordpress
✔️ SELinux 로그 파일
SELinux log → /var/log/audit/audit.log
SELinux 로그 파일을 보면 프로세스가 거부되었을 때 기록한다.
기본 정책이 거부를 허가로 변경했을 때도 로그를 기록할 수 있다.
로그는 기본적으로 /var/log/messages에 기록되는데 보통 로그 메세지를 리다이렉션 기호를 통해 다른 파일에 옮겨서 확인한다.
로그 파일은 SELinux 활성화 및 데몬이 활성화 되어 있어야 한다.
ps -ef |grep auditd
✔️ SELinux 의 한계
SELinux 의 주요 목표는 잘못된 설정이나 프로그램의 보안 버그로 인해 시스템이 공격 당해도 시스템과 데이터를 보호하고 2차 피해를 막는 것이다.
SELinux 는 여러 가지 보안 요소중에 하나이며 SELinux 로 모든 보안 요건이 충족되지는 않는다.
SELinux 는 침입 차단 시스템(IPS : Intrusion Protection System), 침입 탐지 시스템(IDS : Intrusion Detection System)이나 바이러스 백신이 아니므로 여러 보안 요소와 혼용하여 사용해야 한다.
🔗참고
'Linux' 카테고리의 다른 글
[Linux] Samba 서버 (Samba 서버 구축해보기) (0) | 2022.03.21 |
---|---|
[Linux] NFS(Network File System) (0) | 2022.03.21 |
[Linux] ELF(Executable and Linkable Format) 파일 형식 (0) | 2022.03.12 |
[Linux] DataBase (MariaDB) 설치 및 설정 (0) | 2022.03.11 |
[Linux] HTTPS (HTTP Secure), openssl (0) | 2022.03.11 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!