[RHCSA 준비] SELinux 개념과 유용한 명령어

blog post 

 
이번 포스트에서는 리눅스 시스템 정책 메커니즘인 SELinux에 대해 알아보도록 하겠습니다.
 
SELinux는 시스템을 사용하는 프로세스, 사용자 등 모든 사용 개체들에 보안 레벨을 적용하고 그 레벨에 따라 동작하는 리눅스 커널 기반 메커니즘입니다. 
 
selinux 아래와 같이 6가지의 핵심 요소들로 구성되어 있습니다.
  • Policy: 출발지 객체가 타겟에 접근하는 것에 대해 정의한 룰의 모임
  • Source domain: 목표에 접근하려고 하는 객체. 일반적으로 유저나 프로세스를 의미
  • Target domain: 출발 객체가 접근하려고 하는 . 일반적으로 파일이나 포트를 의미
  • Context: selinux에서 카테고리화 객체들을 사용하는 보안 라벨
  • Rule: 타겟 도매인으로 접근을 허가하는 소스 도메인을 결정하는 정책의 특정 부분
  • Labels: 타겟 도메인으로 접근하는 소스 도메인을 결정하도록 정의된 컨텍스트 라벨과 동일

 

만약 selinux 모드를 적용하려면 재부팅해야 합니다. 커널이 selinux 로드하기 때문에, 재부팅 과정에서 커널이 selinux 모드를 로드할 있도록 해야하기 때문입니다.

 

selinux 아래와 같이 3가지 모드가 있습니다.

  • enforcing mode : 정책에 있는 모든 selinux들이 완전히 작동됩니다.
  • permissive mode: selinux 관련된 로그는 기록이 되나, 접근이 차단되지는 않습니다. 특히 모드는 selinux관점에서 무언가를 하거나 결과를 유용하고, 새로운 무언가를 설정하거나 정책의 효과를 살펴볼 때 좋습니다.
  • disabled: selinux 시스템 자체를 사용하지 않습니다.

 

selinux  설정에 사용되는 주요 명령어는 아래와 같습니다.

  • setenforce 0 : permissive 모드로 설정
  • setenforce 1 : enforcing 모드로 설정
  • getenfoce : 현재 설정된 selinux 모드를 보여준다.
  • setenforce : 원하는 모드로 selinux 설정한다.
  • sestatus -v : 현재 서버에 설정된 selinux 상태를 보여줌

 

현재 context labels 확인하는 명령어 는 아래와 같습니다.(-Z 옵션이 주로 컨텍스트 라벨과 관련된 옵션입니다)

  • ls -Z: 파일 시스템에서 디렉토리의 컨텍스트 세팅을 보여준다
  • ps Zaux: 컨텍스트 라벨을 포함하여 모든 프로세스 리스트를 보여준다
  • netstat -Ztulpen: 네트워크의 모든 포트와 포트와 관련된 현재 컨택스트 라벨을 보여준다.

 

모든 컨텍스트 라벨은 항상 다음의 부분으로 표시됩니다.

  • User: '_u' 뒤에 붙으며, 이는 사용자를 의미합니다. selinux에서의 유저는 리눅스의 유저를 의미하는 것은 아니며, RHCSA RHCE 에서 중요한 부분은 아닙니다.
  • Role: '_r' 뒤에 붙으며, 보통 object_r 규칙으로 라벨이 붙습니다. 참고로 RHCSA RHCE에서 구성하는 방법에 대해서는 몰라도 됩니다..
  • Type: '_t' 붙으며, / 파일 시스템에서 디렉토리에 적용된 매우 다양한 컨텍스트 타입들을 있습니다. 그리고 Type 컨텍스트 라벨은 작동하는 방법에 대해 알아야 합니다.
  • , RHCSA RHCE에서는 user role 무시해도 됩니다.
 

 

RHCSA에서는 디렉토리와 파일에 컨텍스트 타입을 설정하는 것이 중요합니다. (RHCE 네트워크 포트까지)

  • semanage: 커맨드는 파일 시스템에 적용될 새로운 selinux 정책 콘텍스트를 쓰기위해 사용합니다.
  • chcon: 커맨드는 보통 우회하기 위해 사용되며, 기존에 파일시스템에 적용되었던 정책을 다시 덮어 씌우거나 기존 컨텍스트를 재저장하기 위해 사용됩니다. (시험에서사용하지 말것을 추천드립니다.)

 

context type 셋팅할 때 사용하는 주요 명령 및 옵션입니다.

  • ex) semanage fcontext -a -t httpd_sys_content_t "/mydir(/.*)?"
  • -a : 수동으로 만들 사용
  • -t : type 변환할 사용
  • 정규표현식: 하위 디렉토리를 모두 포함할
  • ex) restorecon -R -v /mydir
  • semanage fcontext: context type 셋팅한다.
  • restorecon: 셋팅한 파일 시스템 정책을 적용한다

 

SElinux 셋팅 어려운 부분 하나는 필요한 컨텍스트를 찾는 것이다. 3가지 방법이 있습니다.

  • 기본 환경 살펴보기
  • 구성 파일 읽기
  • man -k _selinux 사용하여 해당 서비스를 위한 SELinux-specific man page 찾기

 

restorecon 통해 정책을 기본 셋팅으로 되돌릴 있습니다. 새로운 파일이 문제가 생기면 이를 고치는데 유용합니다. 이를 사용하는 방법에 대해 알기 전에 새로운 컨텍스트 세팅이 적용되는 방법에 대해 우선 알아야 합니다.

  • 새로운 파일이 만들어지면 파일은 부모 디렉토리로 부터 컨텍스트 세팅을 상속받습니다.
  • 만약 파일이 다른 디렉토리로 복사되면, 새로운 파일이 만들어지고, 파일은 부모 디렉토리로 부터 컨텍스트 세팅을 상속받습니다.
  • 만약 파일이 이동하거나 cp -a 등의 명령어로 속성이 유지된 채로 복사되면, 파일의 기존 컨텍스트 셋팅이 그대로 유지되어 적용됩니다.
  • 위의 세가지 상황은 restorecon 사용함으로써 쉽게 고쳐질 있습니다.

 

Selinux Boolean : 서비스에 대한 특정 행동에 대해 허가/거부를 규정할 있습니다. , 해당 서비스의 설정과 selinux boolean 설정이 충돌날 경우, Boolean 설정이 우선순위를 갖습니다.

  • getsebool -a | grep ftp : ftp 서비스의 boolean 설정을 보여줍니다
  • semanage boolean -l | grep ftp : ftp 서비스의 boolean 설정을 보여줍니다 (getsebool 비슷함)

 

SELinux 정책 위반 진단하고 처리하는 방법에는 아래 방법이 있습니다.

  • grep AVC /var/log/audit/audit.log : selinux 관한 로그 기록 확인 (아래는 예시)
    • avc: denies { something } : something 대한 요청이 거부되었다
    • comm=alsactl : something 대한 문제를 시도하고 있는 명령어가 바로 alsactl 이다.
    • path="/var/lib/alsa/sound.state" 해당 프로세스가 접근하려한 파일
    • scontext: source context 정보
    • tcontext: target context 정보
  • sealert 보면 ui 쉽게 분석할 있도록 합니다.
    • , 트러블 슈팅 방법이 어떤 경우에는 너무 많이 나와서 중에 관리자가 하나를 선택해야하는 경우도 있고, 어떤 경우에는 유용하기도 합니다.
  • /var/log/audit/audit.log : 기본적으로 파일에 selinux 관련 모든 로그가 기록되며, type=AVC 표시가 있는 로그들이 이에 해당됩니다.

 

 

TAGS.

Comments