5일차_SELinux

최지웅·2025년 1월 7일
0

인프라

목록 보기
29/31
  • 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/로 옮기면 컨텍스트가 다르기에 사용할 수 없다. 이 문제를 해결하기 위해 아래의 방법이 있다.
  1. cp 사용
  2. 유틸리티인 restorecon을 사용
    restorecon(Restore Context)는 잘못 설정된 보안 컨텍스트를 복구하는 명령어로, 사전에 설정된 정책에 따라 자동으로 설정된다(현재 디렉에 해당하는 보안 컨텍스트로 자동 설정_갱신)
# restorecon -R /var/www/html/test.htlm # -R 은 재귀를 이믜하며 디렉터리인 경우
  1. 유틸리티인 chcon(Change Context)를 사용
    보안 컨텍스트를 직접 지정하기에 적절한 보안 컨텍스트를 이미 잘 알고 있어야만 한다. 아래오 같이 사용한다.
# chcon -R -t httpd_sys_content_t /var/www/html/test.html
  1. 유틸리티인 matchpathcon을 사용
    chcon과 같이 쓰면 좋은데 디렉터리 별 필요한 컨텍스트를 확인할 수 있다. 각 디렉터리마다 필요로 하는 보안 컨텍스트를 출력한다.
# matchpathcon /var/log/ /var/ww/ /etc/
  • 아래는 추가적으로 설치하면 좋을 패키지들이다.
  1. 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 로 삭제 가능
  1. audit2why: audit로그에서 SELinux가 왜 차단했는지 보여주는 유틸리티로 파이프로 Audit Log파일의 경로를 지정하면 된다.
# audit2why < /var/log/audit/audit.log

단순히 문제만 가독성 좋게 전달하는 게 아니라 해결책까지 제시해준다. 추가적으로 audit2why를 이용해 보안 정책을 새로 만들 수도 있다.

  1. 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 # 해킹 위험
  • 해킹 시도로 인해 차단된 경우 로그를 보고 원인을 파악한 뒤 방화벽으로 대응한다.
profile
이제 3학년..

0개의 댓글