[CentOS 8] SELinux
1. SELinux 란
1) DAC (Discretionary Access Control)
DAC은 객체에 대한 접근여부 사용자의 권한을 기준으로 결정한다. 일반 파일의 접근권한을 소유자, 소유그룹, 다른 사용자에 따라 결정하는 것이 DAC이다. root는 모든 권한을 갖고 있게 되며, 따라서 root 권한을 탈취하면 시스템을 장악당할 수 있다는 보안상 문제점이 있다.
2) MAC (Mandatory Access Control)
MAC은 미리 정해전 정책과 보안 등급에 따라 주체의 보안등급과 객체의 보안등급을 비교하여 접근을 통제한다. 높은 보안을 요구하는 정보는 낮은 보안 등급의 주체가 접근할 수 없으며, 소유자라고 할지라도 정책에 어긋나면 객체에 접근할 수 없다.
SELinux는 MAC을 사용하여 접근을 통제한다. 객체에 보안레벨을 적용하고 그 보안레벨에 연관성이 있는 보안레벨을 갖는 주체만이 접근할 수 있다. MAC은 보안이 더 강력하지만 유연성이 떨어진다.
따라서, 일반 파일에는 DAC을 사용하고 특별한 보안을 요구하는 파일(커널파일)은 SELinux를 사용하여 보호한다.
2. SELinux 관리
1) SELinux 동작모드
SELinux는 3가지 동작모드를 가진다.
enforce 모드일 경우 정책에 어긋나는 동작은 모두 차단된다.
permissive 모드일 경우 정책에 어긋나는 동작은 로그를 남기고 허용한다.
disabled 모드는 SELinux가 동작하지 않는 상태이다.
sestatus
혹은 getenforce
명령어로 현재 시스템의 SELinux 상태를 확인할 수 있다.
setenforce
명령어로 enforce 혹은 permissive 상태로 변경할 수 있다.
enforce : 1 | Enforcing |
permissive : 0 | Permmisive |
혹은 직접 /etc/sysconfig/selinux 파일을 수정해도 된다.
2) 보안등급 확인
ls
에 -Z
옵션을 통해 파일의 보안등급을 확인할 수 있다.
[root@localhost html]# ls -lZ
합계 4
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 26 8월 27 23:33 index.html
사용자 | 역할 | 보안등급 유형 | 레벨 |
---|---|---|---|
unconfined_u | object_r | httpd_sys_content_t | s0 |
index.html 은 httpd_sys_content_t 라는 보안등급을 가지고 있다.
또는 semanage fcontext -l
명령을 통해 전체 시스템에 등록된 보안등급을 확인할 수 있다.
[root@localhost www]# ls -dZ
system_u:object_r:httpd_sys_content_t:s0
/var/www/html 의 보안등급을 보면 동일한 httpd_sys_content_t 이다.
디렉토리에서 생성된 파일들은 자동으로 디렉토리의 보안등급을 갖게 된다.
또한 ps
에 -Z
옵션을 통해 프로세스의 보안등급을 확인할 수 있다.
[root@localhost html]# ps -eZ | grep "http"
system_u:system_r:httpd_t:s0 8347 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 8354 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 8355 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 8356 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 8357 ? 00:00:00 httpd
[root@localhost html]# ps -eZ | grep "httpd"
system_u:system_r:httpd_t:s0 8347 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 8354 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 8355 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 8356 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 8357 ? 00:00:00 httpd
httpd 는 httpd_t 라는 보안등급을 가지고 동작하고 있음을 확인할 수 있다.
아파치 웹 서버가 /var/www/html/ 에 접근하려 할 때 주체는 httpd_t 컨텍스트를 가진 httpd가 되며, httpd_t 는 httpd_sys_content_t 컨텍스트가 적용된 객체에 접근 가능하다.
3) 보안등급 변경
chcon -t <컨텍스트> <파일명>
을 통해 파일의 컨텍스트를 변경할 수 있다.
[root@localhost html]# chcon -t tmp_t index.html
[root@localhost html]# ls -lZ
합계 4
-rw-r--r--. 1 root root unconfined_u:object_r:tmp_t:s0 29 8월 27 23:55 index.html
이제 httpd 는 index.html 에 접근할 수 없기 때문에 웹사이트가 열리지 않는다.
restorecon -v <파일명>
으로 파일의 컨텍스트를 디렉토리의 컨텍스트로 변경할 수 있다.
[root@localhost html]# restorecon -v index.html
Relabeled /var/www/html/index.html from unconfined_u:object_r:tmp_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
[root@localhost html]# ls -lZ
합계 4
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 27 8월 28 00:44 index.html
4) SELinux Boolean
Boolean은 필요에 따라 컨텍스트를 임시적으로 바꿔 접근이 허용되게 해준다.
semanage boolean -l
을 통해 Boolean의 이름과 상태, 디폴트값, 설명을 볼 수 있다.
[root@localhost html]# semanage boolean -l | grep httpd
httpd_anon_write (비활성 , 비활성 ) Allow httpd to anon write
httpd_builtin_scripting (활성 , 활성 ) Allow httpd to builtin scripting
httpd_can_check_spam (비활성 , 비활성 ) Allow httpd to can check spam
httpd_can_connect_ftp (비활성 , 비활성 ) Allow httpd to can connect ftp
혹은 getsebool -a
를 통해 boolean이 on 인지 off 인지만 확인할 수 있다.
setsebool -P <boolean> <on|off>
를 통해 boolean 동작 상태를 바꿀 수 있다.
5) 포트 보안등급
SELinux를 활성화하면 포트에도 컨텍스트가 적용된다. 따라서 서비스가 기본적으로 사용하는 포트 외의 것을 사용하려면 해당 포트에 포트 컨텍스트를 부여해야 한다.
semanage port -l
명령어로 포트 컨텍스트를 확인할 수 있다.
[root@localhost html]# semanage port -l | grep "8080"
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
semange port -a -t <컨텍스트> -p <tcp|udp> <포트번호>
를 통해 포트 컨텍스트를 설정할 수 있다.
해당 포트에 다른 컨텍스트가 이미 지정되어 있는 경우 -a
대신 -m
옵션을 준다.
semanage port -d -t <컨텍스트> -p <tcp|udp> <포트번호>
를 통해 포트 컨텍스트를 삭제할 수 있다.
댓글남기기