- RHEL기반 리눅스에는 중요한 두 가지 보안 기능 iptables 방화벽과 SELinux 모듈이 존재한다.
1. SELinux란?
- 접근 통제에서 시스템 자원을 Object, 접근하는 사용자나 프로세스를 Subject라고 한다.
1-1. DAC(Discretionary Access Control)
- 임의 접근 통제는 일반적인 방법으로 Object 소유자가 Subject 접근권한을 주는 방식. setuid를 이용한 보안 취약점 존재.
- setuid 설정된 프로그램은 비트 4000으로 표시되기에 아래와 같이 find -perm옵션으로 찾을 수 있다.
# find /bin /usr/bin /sbin -perm -4000 -exec ls -ldb {} \;
- 또다른 보안 취약점으로 HTTP, SMTP, FTP, TELNET 등의 네트워크 데몬 서비스로 인해 공격당할 수도 있다.
1-2. MAC(Mandatory Access Control)
- 강한 접근 통제는 정책과 보안등급 정의에 의거 소유자도 접근 불가능할 수 있다.
1-3. SELinux
- Flask 보안 커널을 이식한 것으로 접근 통제 정책이 사전 정의되어 탑재돼있고, "Deny All, Permit Some" 정책, setuid비트같은 위험한 프로그램은 격리 실행, 버퍼오버플로우 방지 등의 장점이 있다.
- 주요 목표는 시스템과 데이터의 2차 피해를 막는 것이다.
2. SELinux 사용하기
2-1. SELinux Architecture
- 모든 시스템 콜에 대해 SELinux가 보안 정책을 확인하기 때문에 Query에 최적화된 AVC(Access Vector Cache)를 사용한다.
- 모든 프로세스에 Security Context(Label)이라는 정보를 부여해 관리한다. 이는 User, Role, Type, Label로 구성된다. 이는 ls나 ps에 -Z옵션으로 확인가능하다.
- 기본적인 접근 통제를 위해 접근 시 주체의 Security Context가 Object에 접근할 권한이 있는지 확인하는 것을 Type Enforcement(유형 강제)라고 한다.
- TE관련 에러 로그는 /var/log/audit/audit.log에 저장되며, 대부분 보안 컨텍스트를 잘못 설정하여 막힌 것이다.
- 이처럼 기본적으로 사전 정의되어 탑재된 정책을 Targeted Policy라고 하며 /etc/selinux/targeted/에 정의되어 있다.
2-2. 동작 모드
- 기본적으로 정책과 어긋나면 모두 차단하는 Enforce모드를 사용하고, Permissive, Disable모드가 존재한다.
# getenforce # 모드 확인
# setenforce 0 # 모드 Permissive로 변경. 재부팅시 초기화
# sestatus # 동작모드에 대한 자세한 설명
2-3. SELinux Boolean
[jimo@localhost ~]$ getsebool httpd_can_sendmail
httpd_can_sendmail --> off # http가 메일 서버에 연결할 수 있는지에 대한 불린(이미 정의된 규칙들)
- 만약 mail함수를 사용하는 PHP코드를 아파치 웹 서버에서 실행하면 현재 정의된 SELinux Boolean인 https_can_sendmail이 false이기에 오류가 발생한다.(재부팅 시 복구)
2-4. SELinux Utilies
- 편의를 위해 SELinux는 몇몇 주요 경로(/etc)마다 생성되는 파일에 대해 자동으로 보안 컨텍스트를 부여하게 설정되어있다.
- 하지만 root/에서 파일을 만들어 /var/www/html/로 옮기면 컨텍스트가 다르기에 사용할 수 없다. 이 문제를 해결하기 위해 아래의 방법이 있다.
- cp 사용
- 유틸리티인 restorecon을 사용
restorecon(Restore Context)는 잘못 설정된 보안 컨텍스트를 복구하는 명령어로, 사전에 설정된 정책에 따라 자동으로 설정된다(현재 디렉에 해당하는 보안 컨텍스트로 자동 설정_갱신)
# restorecon -R /var/www/html/test.htlm # -R 은 재귀를 이믜하며 디렉터리인 경우
- 유틸리티인 chcon(Change Context)를 사용
보안 컨텍스트를 직접 지정하기에 적절한 보안 컨텍스트를 이미 잘 알고 있어야만 한다. 아래오 같이 사용한다.
# chcon -R -t httpd_sys_content_t /var/www/html/test.html
- 유틸리티인 matchpathcon을 사용
chcon과 같이 쓰면 좋은데 디렉터리 별 필요한 컨텍스트를 확인할 수 있다. 각 디렉터리마다 필요로 하는 보안 컨텍스트를 출력한다.
# matchpathcon /var/log/ /var/ww/ /etc/
- 아래는 추가적으로 설치하면 좋을 패키지들이다.
- semanage: SELinux 보안 정책 조회 / 추가 / 변경 / 삭제 가능한 명령행 기반 유틸리티로 웹 서버가 다른 어플리케이션과 연동할 때 명시적으로 애플리케이션의 포트를 웹 아파치 서버에 연결가능하게 허용할 때 사용한다(기본은 Deny기 때문에)
# semanage port -l | grep http_port_t # 설정된 포트 목록을 출력(아파치httpd가 접근 가능한 포트 목록)
위와 같은 상황에서 아파치 포트 800번을 서비스하기 위해 Listen을 열어두면 서비스되지 않는데, 위 http_port_t에서 포트 연결설정을 따로 해줘야한다. 아래와 같이 추가한다.
# semanage port -a -p tcp -t http_port_t 800 # -p(프로토콜)은 HTTP기에 tcp로 # -d 로 삭제 가능
SELinux에서 디렉토리 따른 자동 컨텍스트 부여 설정을 파일 컨텍스트로 추가/변경 가능하다.
# semanage fcontext -l | grep httpd_sys_content_1 # 파일 컨텍스트 출력
# semanage fcontext -a -t httpd_sys_context_t "/data/www(/.*)?" # 파일 컨텍스트에 새로운 경로 추가 -d 로 삭제 가능
- audit2why: audit로그에서 SELinux가 왜 차단했는지 보여주는 유틸리티로 파이프로 Audit Log파일의 경로를 지정하면 된다.
# audit2why < /var/log/audit/audit.log
단순히 문제만 가독성 좋게 전달하는 게 아니라 해결책까지 제시해준다. 추가적으로 audit2why를 이용해 보안 정책을 새로 만들 수도 있다.
- settroublesshoot-server: audit2why처럼 SELinux AVC메시지(캐시)를 번역해주고 해결방안을 제시해준다.
위 모듈은 dbus패키지에 포함된 message bus라는 데몬으로 구동되기에 아래처럼 처음에 재구동시키는게 좋다.
# service messagebus restart
문제가 발생하면 settroubleshoot의 메시지는 /var/log/messsages 파일에 기록된다.
# tail -f /var/log/messages
위에 출력되는 메시지 끝에 run ~~~어쩌구 명령어를 셸에서 실행하면 잘못된 원인과 restorecon을 변경하는 옵션과 원인 등을 알려준다.
4. sealert: settroubleshoot의 컴포넌트 중 하나로 윈도우에서 실행가능한 버전
3. SELinux 문제 해결
SELinux에서 서비스나 프로그램이 제대로 동작하지 않는다면? SELinux는 공격자가 레어 메시지를 악용할까봐 별도의 로그로 관리한다.
3-1. 로그 분석
- auditd나 reslogd, settroubleshootd를 이용해 로그가 기록됐다면 /var/log/audit/audit.log나 /var/log/messages에 기록된 모든 로그에서 이를 분리해야한다.
# grep "SELinux is preventing" /var/log/messages
# grep "type=AVC" /var/log/audit/audit.log
# aureport -a -ts "2025년 1월 7일" # 이후의 로그 출력
3-2. 해결 단계
- 잘못된 보안 컨텍스트이 설정된 경우 restorecon, chcon을 잘 모르겠으면 matchpathcon을 사용한다
- 보안 정책을 왼한 기능 차단의 경우 setsebool로 해당 불린을 허용시킨다
- 허가되지 않은 네트워크 포트의 경우 semanage로 포트를 허용해준다
- SELinux 보안 정책으 비그인 겨우 업데이트하자
- 서비스 데몬이 SELinux를 제대로 지원하지 않는 경우 문제가 되는 프로세스만SELinux제한없이 실핸시킨다
# chcon -t unconfined_exec_t /usr/sbin/httpd # 해킹 위험
- 해킹 시도로 인해 차단된 경우 로그를 보고 원인을 파악한 뒤 방화벽으로 대응한다.