SElinux
보안 접근제어 모델
- DAC (Discretionary Access Control, 임의적 접근제어)
- 객체 소유자가 임의로 객체에게 권한을 부여하고 객체에 대한 접근을 제어하는 접근 제어 모델
- 유닉스/리눅스의 기본적으로 사용하는 접근제어 모델
- 접근하는 주체의 신분을 확인한다
- MAC (Mandatory Access Control, 강제적 접근제어)
- SElinux를 사용하는 경우 시스템에 적용되는 보안 접근제어 모델
- 주체와 객체에 각각 부여된 보안 레이블(context)과 정책 스위치(boolean)에 의해 접근을 제어하는 접근제어 모델
📒 보안 레이블은 군대의 대외비라고 생각하면 쉽다
-> 퍼미션을 통과해도 객체의 레이블을 확인 후 주체가 해당 레이블을 가지고 있는지 확인 후 접근을 제어
- 주체가 객체에 접근할 때 먼저 객체에 접근할 수 있는 권한이 있는지 확인후 보안 레이블을 확인함
- 보안 레이블에 의해 거부된 접근은 정책 허용 스위치(boolean)에 의해서 허용될 수 있음
- RBAC(Role-Based Access Control, 역할 기반의 접근제어)
- 역할 기반의 접근 제어 모델로, 역할에게 시스템에서 수핼할 수 있는 작업에 대한 권한을 할당하는 접근제어 모델
- 예로 총무부라는 역할, 인사부라는 역할을 만들고 각 부서가 가져야 할 권한을 역할에게 부여한 뒤 사용자에게 인사부 역할을 줬다가 총무부로 이전하면 인사부 역할을 빼고 총무부 역할을 주면 된다
📘 AWS의 IAM 롤이랑 흡사하다
📗 주체(Subject) : 시스템의 리소스에 접근할 수 있는 프로세스, 사용자
📗 객체(Object) : 파일 또는 포트 등과 같은 시스템의 리소스
SElinux 실습
- SElinux 설정은 오로지 root만 가능하다
- getenforce : SElinux의 동작 모드 확인
- /etc/selinux/config : SElinux 설정 파일

- SELINUXTYPE : 정책 유형
- targeted : 특정 프로세스 보호 (기본값)
- minimum : 최소한의 프로세스만 보호
- mls : Multi-Level Security (고급보안) = 보안등급
- SELINUX : 동작 모드
- enforcing (강제모드) : SElinux 활성화, 로그 기록, MAC 모델 적용
📙 SElinux 활성화 : 부팅할 때 SElinux가 커널에 올라옴
- permissive (허용모드) : SElinux가 활성화는 되지만 보안 정책을 강제하지 않음, 로그 기록, DAC 모델 적용
- disabled (비활성) : SElinux 비활성화, 부팅시 아예 커널 모듈을 로딩하지 않는다
- sestatus : SElinux의 정보 자세히 보기
- setenforce : SElinux 동작 모드 설정 (현재 Runtime만 적용)
-> ex) setenforce permissive (0) setenforce enforcing(1)
보안컨텍스트(보안레이블)
-
프로세스 보안 컨텍스트 확인 : ps axZ
-> ex) ps axZ | grep httpd : 해당 프로세스의 레이블 확인
= ps -ZC httpd

사용자 :역할 :유형 :레벨
-
파일 보안 컨텍스트 확인 : ls -alZ
-> ex) ls -dZ /root : 해당 디렉터리의 레이블 확인

-> ex) ls -dZ /var/www/html : 해당 디렉터리의 레이블 확인

📌 프로세스의 레이블과 파일의 레이블이 같아야 프로세스가 해당 파일에 작업을 할 수 있다.
context 실습
- systemctl start httpd
- firewall-cmd --add-service=http --permanent
- firewall-cmd --reload
- cd /var/www/html
- vi index.html접속 후 텍스트 입력
- 웹페이지 접속 정상적으로 확인(context = httpd_sys_content_t)
- 해당 파일 삭제 후 루트 디렉터리에서 다시 index.html 만들고 mv /var/www/html로 이동
- ls -Z /var/www/html/index.html 확인해보면 context(admin_home_t)가 그대로 이동한 것을 확인 -> 웹페이지 접속 x
📒 cp로 옮기면 context가 바뀌어서 웹페이지 접속 가능
context 설정
- chcon : context 임시로 설정
- chcon -t [SELINUX_TYPE_CONTEXT][FILE]
- ex) chcon -t httpd_sys_content_t /var/www/html/index.html
-> context를 html로 바꾸어주었기 때문에 웹페이지 접속 가능
현재 리눅스 시스템의 context 리스트 보기
- semanage fcontext -l | grep /var/www/html
-> 정규표현식으로 디렉터리 위치를 나타내고 해당 위치가 가지는 context값이 설정되어 있다. 해당 디렉터리 위치에 파일을 만들면 파일은 그 context값을 가진다.
- semanage port -l | grep http : port의 context (레이블) 보기
📒 port도 context(레이블)를 가지고 있다
- SELINUX 포트 레이블에 포트 추가
- semanage port -a -t 포트타입 -p tcp/udp 번호
- ex) semanage port -a -t http_port_t -p tcp 10000
- 수정 : semanage port -m -t 포트타입 -p tcp/udp 번호
- 삭제 : semanage port -d -t 포트타입 -p tcp/udp 번호
context를 복원하는 명령어
- 리스트에 명시된 context로 알아서 복원이 된다
- restorecon [옵션] 파일
- restore -R 파일 : 해당 디렉터리 뿐 아니라 서브 디렉터리까지
- -v : 자세히
- -f : 강제
- ex) restorecon -R /var/www/html/index.html
-> mv로 이동했기때문에 context가 달라서 접속이 안됐지만
restorecon으로 리스트에 명시된 context로 바꾸어 주었기 때문에 웹페이지 접속 가능
- ex) semanage fcontext -a -t "admin_home_t" /tmp/rootfil1
: context 리스트에 위치에 해당하는 context값을 추가한다
-> 추가한뒤 재부팅하면 적용되거나, restorecon을 통해 리스트에 명시된 위치에 해당하는 값으로 복구
- semanage fcontext -d -t "admin_home_t" /tmp/rootfile1
: context에 추가한 위치+context 삭제하기
📕 리스트에 기본적으로 존재하는 값들은 삭제 못한다
boolean 설정
- context가 일치하지 않아도 접근할 수 있다
- getsebool -a : bool 설정 목록 보기 (런타임 정보)
- semanage boolean -l : bool 설정 목록 보기
(런타임 정보, 영구적 정보)
- 부울 설정(런타임) : setsebool [SELINUX_BOOL] on/off
- 부울설정(런타임,영구적) : setsebool -P [SELINUX_BOOL] on/off
📌 보통 SElinux에 차단당한 경우 setenforce permissive(0) 으로 끄거나, restorecon로 설정하거나, boolean설정을 한다
추가정보
정규화 - 하나의 릴레이션에 하나의 의미만 갖도록 relation을 분리해나가는 과정(불필요한 데이터의 중복을 제거) -> insert, delete, update의 성능이 좋아진다
- 단점 : 너무 많은 분리로 특정 데이터를 찾을 때 많은 join연산이 필요하여 select(조회)의 성능이 느려진다
-> 반정규화 : 데이터의 중복을 감수하면서 relation을 합치는 과정 -> select(조회)의 성능 증가
💡 data redunduncy = 불필요한 데이터의 중복