SELinux 정책 위반을 유발하는 방법은 무엇입니까?


12

SELinux의 기본 작업을 연구 중이며 거부를 유발하는 것이 유용하다는 것을 알았습니다. 내 테스트 시스템은 CentOS 7을 실행 중이며 추가 서비스가없는 기본 서버 설치이며 getenforce 상태는 '강제'입니다. 그래서 나는 / root를 읽을 수있게 만들고 권한이없는 사용자로서 파일을 읽으려고 시도하면 트릭을 할 것이라고 확신했습니다. 그러나 운이 없다! 누구나 빠른 테스트를 제안 할 수 있습니까? 경로 액세스 또는 포트 열기 등

이상적으로는 DAC가 제한하지 않은 간단한 셸 명령을 찾고 있지만 MAC은 알아 채고 거부합니다. 따라서 저는 맞춤형 프로그램을 컴파일하거나 웹 서버와 같은 특정 서비스를 설치하여이를 달성하려고하지 않습니다. 이것은 SELinux가 실제로 작동하는 것을 볼 수있는 일반적이고 명확한 방법을 제공하기 때문에 유용합니다.

DAC (예 : 파일 시스템 권한)를 수정하여 기본적으로 테스트의 일부보다 덜 제한적으로 만드는 데 아무런 문제가 없습니다.


1
보호 시스템을 작동시키는 방법을 아는 +1은 시스템이 제대로 작동하는지 확인할 수 있도록하는 중요한 단계입니다.
gowenfawr

이 질문은 Unix & Linux SE에 속하기 때문에 주제를 벗어난 주제로 마무리하려고합니다.
Mark

답변:


3

타사 / 자신의 개발자 코드에 대한 버그 탐지 에서 SELinux의 유틸리티를 시연하기 위해 메모리 보호 테스트가 있습니다 ( 여기 에서 첫 번째 코드 예제 수정 ).

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main (void) {
  // open file read-write, get a memory-mapped pointer with private access, write permission
  int fd = open ("file_to_test", O_RDWR);
  char *p = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

  p[0] = 'a';   // put something

  // Update protection mode; SELinux response depends on sebool: allow_execmod
  int r = mprotect (p, 42, PROT_READ | PROT_EXEC);

  // Display mprotect result
  printf ("mprotect = %d\n", r);

  close(fd);
  return 0;
}
컴파일 및 기본값 표시 (포착되지 않음)
$ echo "test data" > file_to_test
$ gcc execmod.c 

$ ./a.out 
mprotect = 0

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
<no events of interest were found>

부울을 변경하여 문제를 포착하십시오.

$ sudo getsebool allow_execmod
allow_execmod --> on

$ sudo setsebool allow_execmod 0
$ ./a.out 
mprotect = -1

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 04/30/2015 12:26:41 a.out unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10 file execmod unconfined_u:object_r:user_home_t:s0 denied 3612

이것은 프로그래머가 아니며 코드를 실제로 이해하지 못하지만 확실히 유용하고 잘 문서화되어 있습니다 (+1). 이상적으로 쉘, netcat, telnet 등과 같은 간단한 명령 행 도구를 사용하여 포트를 열거 나 경로에 액세스하려는 시도를 거부하는 SELinux의 명백한 예를보고 싶습니다. 질문을 편집하여 명확하게 설명하겠습니다.
Thoughtitious

코드 부분을 직접 찾아봐야했습니다. 아래에 bash 테스트를 추가하게되어 기쁩니다. CentOS7에서 Snort 및 postfix (아마도 비둘기장) 오류는 패키지이므로 설치해야 할 작업이 많으며 나중에 수정 될 수 있으며 구성이 더 많기 때문에 생략했습니다. 이미 그런 식으로 가고 있다면 정책 생성 실무에 유용합니다.
ǝɲǝɲbρɯͽ

3

이것은 CentOS 7의 기본 설치에서 동등한 DAC를 우회 할 수있는 MAC 정책을 분명히 보여줍니다.

  1. 권한이없는 비 시스템 사용자는 기본적으로 (쓰기 당시 CentOS에서) 'unconfined_u'역할로 로그인됩니다. 그러나 권한이없는 사용자 'alice'가 대신 'user_u'역할에 배치되도록 시스템을 변경할 수 있습니다. 적은 양의 추가 구성으로이 역할을 명확하게 제한하도록 기본 정책을 만들 수 있습니다.

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. 이제 이들 사용자가 홈 디렉토리 및 / tmp에있는 파일을 실행하는 기능을 해제하십시오. 다시 한번, 기본값은이 동작을 허용하는 것입니다. 이 명령을 완료하는 데 약간의 시간이 걸릴 수 있습니다 .

    [root]# setsebool -P user_exec_content off
    
  3. 이제 (권한이없는 사용자와 함께) 우리는 로그인하고 이러한 이동하지 않는 영역 중 하나에서 무언가를 실행하려고 시도 할 수 있습니다. 보시다시피 우리는 거부당했습니다.

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. 마지막으로 ALinux 로그를보고 SELinux 거부를 확인할 수 있습니다.

    [root]# aureport -a
    
    AVC Report
    ========================================================
    # date time comm subj syscall class permission obj event
    ========================================================
    1. 02/05/15 21:08:33 bash user_u:user_r:user_t:s0 59 file execute user_u:object_r:user_tmp_t:s0 denied 693
    

그래, 그거 효과가있어! 이 "exec content 없음"접근 방식을 선택했음을 특히 좋아합니다. 처음에는 실행 파일 작성을 막기 위해 감사를 선호하는 경향이 있었지만 나는 이것도 좋아합니다. 유스 케이스 : 저는 새로운 소프트웨어를 설치하기 어렵게 만드는 공통 클라우드 기반 서비스를 사용합니다 (패키지 관리자를 사용해야하며 sudo는 없습니다). 그들은 생성 또는 실행을 차단하지 않으며 개발자 환경입니다 ... 따라서 필요한 패키지를 wget / scp하고 컴파일 합니다. +1
ǝɲǝɲbρɯͽ

1

system-config-selinux의 부울 탭 (또는 / etc / selinux / policy)에서 정책을 변경하지 않은 경우 기본값은 다음에 응답해야합니다 (NB, 심층적 인 다이빙을 위해 setroubleshoot를 설치할 수도 있습니다) :

mkdir -m 755 -p / install / ks

cp /root/anaconda-ks.cfg / install / ks

chmod 644 /install/ks/anaconda-ks.cfg

그런 다음 웹 서버를 다시 시작하고 웹 브라우저로 http : // localhost / ks 에 액세스 하십시오 . "금지"메시지가 나타납니다. 테일링 /var/log/audit/audit.log을 실행 하거나을 실행 ausearch -m avc -ts recent하면 다음 메시지가 표시됩니다.type=AVC msg=audit(1391277951.222:266): avc: denied { read } for pid=1731 comm="httpd" name="ks" dev=sda1 ino=22351 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined u:object r:default t:s0 tclass=dir

그런 다음 SELinux chcon -Rv --reference /var/www/html /install/ks를 사용하지 않으려 고하지만 자원에 액세스 할 수 있으면 SELinux 컨텍스트를 변경할 수 있습니다 .

편집 : 죄송합니다, 당신은 "웹 서버가 아니라"고 말하지 않았습니다. chcon -u fake_u <filename>시스템 파일에서 권한이없는 계정을 사용해보십시오 .


새로 만든 사용자를 사용하여 두 번째 제안을 할 수 없었습니다. 또한 DAC가 허용 한 위치를 강화하는 MAC의 예인 좀 더 일반적인 테스트를하고 싶습니다. 반면 SELinux가 SELinux 레이블링에 대한 관리 변경을 얼마나 잘 보호 할 수 있는지 테스트합니다.
Thoughtitious

0

두 개의 작은 패키지 설치-종속성 없음

  yum install -y vsftpd lftp

FTP 서버를 시작하십시오

  systemctl start vsftpd

루트의 집에 파일을 만들다

  touch ~/tux.tch

루트의 홈에서 FTP 디렉토리로 이동하십시오.
참고 : 이동, 복사하지 않거나 파일의 fcontext가 변경됩니다

  mv ~/tux.tch /var/ftp/pub

FTP 클라이언트 사용자로 FTP 서버에 로그인하고 새 파일에 액세스하십시오.
참고 : 탭 자동 완성은 여기에서 작동하지 않습니다

  lftp localhost
    ls pub/tux.tch
    exit

원시 로그에서 거부를 봅니다.

  grep AVC /var/log/audit/audit.log

또는 setroubleshoot*설치 한 경우

  grep sealert /var/log/messages
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.