[Linux] SELinux

조성열·2025년 10월 15일
0

Toss - Linux

목록 보기
13/15
post-thumbnail

관리자인 root는 막강한 권한이 있어 지속적인 권한 탈취 문제가 있어 사용자별 접근통제 및 제어를 통해 시스템을 보호하기 위해 사용하는 것이 SELinux이다.


접근 제어 모델에서 주체(Subject)와 객체(Object)

  • 주체: 시스템 자원에 접근하는 프로세스 또는 사용자
  • 객체: 파일 또는 포트와 같은 시스템 자원

MAC(Mandatory Access Control)

MAC모델은 강제 접근 제어 모델로 Context라고 불리는 보안 레이블과 Boolean이라고 불리는 정책 허용 스위치를 통해 접근 제어를 한다. MAC 모델은 주체가 객체에 접근할 수 있는 권한이 있는지 확인하고, Context까지 확인한다.

SELinux 동작 원리 및 모드

SELinux의 동작 원리를 간단히 나타낸 그림이다. SELinux는 MAC 모델을 사용하는데 이로 인해 모든 프로세스와 파일에는 Context가 부여되고, Subject가 Object에 접근할 때 설정된 Context를 확인하여 접근 관리를 한다. 하지만 Context에 의해 차단이 돼도 접근할 수 있는 경우가 있는데, 이는 정책 허용 스위치인 Boolean이 활성화 된 것이다.

SELinux는 Disabled, Enforcing, Permissive 세 가지 모드가 있다. Disabled는 말 그대로 비활성화 된 상태로 MAC 모델보다 취약한 DAC 모델을 사용하는 것이고, Enforcing은 활성화 상태로 MAC 모델이 적용, Permissive는 SELinux가 활성화 되어 있지만 정책을 따르지 않는 모드를 의미한다. 보통 Enforcing모드로 전환하기 전 문제 해결 용도로 사용한다.

SELinux Port Label

예를 들어 httpd 서비스의 기본 포트 번호가 80번인데 임의로 8900번으로 변경하여 사용한다고 해보자. 이를 시도 해보면 서비스 제공이 안되는데 이는 SELinux에서 지원하는 기능 중 Port Label에 변경하고자 하는 포트번호가 등록되어 있지 않기 때문이다.
따라서 임의로 기존 서비스의 기본 포트 외 다른 포트를 이용하려고 할 때는 Port Label에 추가, 수정이 필수적이고 그렇지 않으면 SELinux MAC 모델의 정책에 따라 차단이 된다. Port Label설정은 실습을 통해 확인하자.

동작모드 확인 및 설정 변경

getenforce 명령으로 SELinux의 활성화 상태를 확인할 수 있고, 현재 활성화 되어 있음을 확인할 수 있다. setenforce명령에 0 | 1을 설정하면 각각 permissive, enforcing 상태로 설정 가능하다. 단, 이는 런타임에만 적용되고 reboot하면 초기 설정으로 돌아간다.
SELinux 영구 설정은 /etc/sysconfig/selinux파일에 담겨 있고 세 가지 모드를 설정하고 저장하면 적용된다.

Context 확인 및 변경

ls명령에 -Z옵션을 이용해서 Context 확인이 가능하다. 나는 /tmp디렉토리 안에 디렉토리를 하나 더 만들어 확인했고, 현재 user_tmp_t로 context가 설정되어 있음을 알 수 있다. context는 생성한 사용자의 umask에 따라 달라진다. /etc/passwd파일을 생성한 디렉토리에 복사한 후 원본 파일과 복사한 파일의 context를 확인 해봤다. 원본 파일의 context는 passwd_file_t 복사본은 user_tmp_t임을 확인할 수 있었고, 복사한 사용자에 따라 context가 설정됨을 확인할 수 있다. 만약 원본 그대로 복사하고 싶다면 -a옵션을 추가해서 복사하면 된다.
restorecon -vR 명령으로 시스템에서 기본으로 정의 된 context로 되돌리기가 가능하다. 하지만 /tmp디렉토리 내에는 default로 설정되어 있는 값이 없어 Warning 메세지가 뜨게 된다. semange명령을 이용해서 context 기본값을 설정할 수 있다. 하이라이팅 된 곳 /tmp/my-workspace밑에 생성되는 모든 파일을 의미한다. 즉, 설정한 디렉토리 밑에 생성되는 모든 파일, 디렉토리는 설정값을 따른다는 의미이다.
이후 다시 restorecon명령을 시도 해보면 warning 메세지가 뜨지 않고 default값으로 설정됨을 확인할 수 있다.

Port Label 설정 및 변경

22번 포트를 사용하는 서비스는 ssh이고, 해당 서비스의 Port Label은 ssh_port_t임을 알 수 있다. 22번 대신에 2020번 포트를 사용하려고 한다면 위와 같이 semanage명령에 -a옵션을 주면 추가할 수 있다. ssh 서비스에 설정한 2020 포트를 http 서비스에서 사용하기 위해 변경한 결과다. 마찬가지로 semange명령에 -m옵션을 주면 Port Label 설정이 가능하다. 설정한 포트를 삭제할 때는 semange명령에 -d옵션을 주면 된다. 해당 명령 수행 후 레이블을 확인 해보면 삭제가 됐음을 알 수 있다. /etc/httpd/conf/httpd.conf에 http 관련 설정을 할 수 있는데, port를 8888번으로 변경하고 httpd 서비스를 재시작하면 사진과 같이 에러 메시지가 발생한다.

로그를 확인해보면 Port Label에 등록 되어 있지 않아 Permission Deny가 발생한 것이다. Port Label 설정 후 다시 시행 해보면 오류 메세지가 뜨지 않고 정상적으로 active 상태로 들어온 것을 확인할 수 있다. 방화벽 설정까지 하고나면 접속이 가능하다.

0개의 댓글