^^; 웁스..... 한고비 뒤 SELinux와 관련된 에러가 또 발생하였다. Trac에서 로깅을 위해 syslogd를 사용하도록 설정하였더니, 웁스 아래 그림과 같은 에러가 발생하였다.
원인은 기본적으로 httpd 데몬에서 수행된 script (httpd_sys_script_t)에서 Socket 생성하는 것이 막혀 있기 때문이었다. ( ^^; 재미있는 것은 php는 스크립트로 취급되지 않는 것 같다. php로 된 Dokuwiki는 smtp를 사용한 메일 발송에 문제가 없었었다.)

이것은 socket이라는 시스템의 커널 리소스에 대한 문제이기 때문에 무언가 context type을 변경해준다고 해결될 문제가 아니었다. 즉 정책 변경이 필요하게 된 것이다.
그동만 별 영양가 없다고 생각했던 audit2allow가 드디어 빛을 발하기 시작했다.
참고문서 : Chapter 45. Customizing SELinux Policy
SELinux Policy를 커스터마이징 하는데 있어 Red Hat Enterprise Linux 4, 5에 각각 대응하는 CentOS 4, 5의 정책 Customizing 방법이 큰 차이가 있었다.
CentOS 4는 selinux-policy-targeted-sources 패키지를 설치하여 정책 파일들을 편집한 다음 다시 로드 하는 방식을 사용한다.
그러나 CentOS 5에서는 정책관리를 보다 커널 모듈과 같이 취급하여 Policy Module이라는 것을 사용하였다.
모듈의 install, reload, remove 등에 사용되는 명령이 semodule 이라는 것이다.
다시 위의 에러가 발생한 문제로 돌아가 문제가 발행한 프로그램은 trac.cgi라는 것이다.
/var/log/audit/audit.log 의 AVC 로그중 comm="trac.cgi" 와 관련된 AVC를 뽑고자 한다면 다음과 같이 할 수 있다.
$ grep trac.cgi /var/log/audit/audit.log | audit2allow
그동안 문제되었던 다른것 포함, audit 로그를 분석하여 그것을 allow 정책으로 변환하여 보여준다.
[root@ProjectS policy]# grep trac.cgi /var/log/audit/audit.log | audit2allow
#============= httpd_sys_script_t ==============
allow httpd_sys_script_t devlog_t:sock_file write;
allow httpd_sys_script_t file_t:dir { search getattr };
allow httpd_sys_script_t file_t:file { read getattr };
allow httpd_sys_script_t self:unix_dgram_socket { write create connect };
allow httpd_sys_script_t syslogd_t:unix_dgram_socket sendto;
allow httpd_sys_script_t user_home_t:dir { search getattr };
allow httpd_sys_script_t user_home_t:file { read getattr };
#============= unconfined_t ==============
allow unconfined_t httpd_sys_script_t:file relabelto;
1차적으로 allow httpd_sys_script_t self:unix_dgram_socket { write create connect }; 이 적용되면 일차적으로 위 소켓 생성시 나는 에러를 해결할 수 있을 것이다. 기타 관련된 다른 allow도 audit 로그 분석을 통해 뽑아졌다.
이를 Policy Module로 컴파일하여 만드는 방법은 다음과 같다.
$ grep trac.cgi /var/log/audit/audit.log | audit2allow -M tracsocket
위 명령을 수행하면 현재 폴더에 tracsocket.pp 와 tracsocket.te 파일 2개가 생성된다.
tracsocket.pp는 컴파일된 policy module 파일이다.
tracsocket.te는 text로 된 컴파일되기 전의 소스이다.
이것을 SELinux 시스템에 적용하는 방법은
$ semodule -i tracsocket.pp
와 같이 하면 적용된다.
이렇게 한번 인스톨된 모듈의 정책은 리부팅 후에도 유지된다고 하니, install에 사용된 pp를 삭제하면 무슨일이 벌어질까?!, 아마도 커널에 로드된 정책을 포함한 전체 Policy를 별도로 저장한다면 문제가 없겠지만 커널 모듈 파일이 지워지면 커널 모듈 로딩중 에러가 나듯, pp 파일이 삭제되면 SELinux에서 Policy 모듈 로드중 에러가 나지 않을까 생각해 본다.
굳이 시간을 들여 테스트 해보픈 마음은 없다. ^^; 여튼 사용된 pp파일은 되도록 삭제나 install된 위치에서 옮기지 말도록 하자. te 파일도 같이 보관하자. 컴파일된 pp 모듈이 실제 어떤 정책을 갖는지 텍스트인 te 파일을 통해 확인할 수 있으니 말이다. 얼핏 te를 가지고 재 컴파일도 가능하다고 한것 같지만 사용법은 나중에 필요하면 알아봐야 겠다. ㅋㅋ
^^ 멋지게 문제가 해결되었다. SELinux에서 audit2allow 무척 유용하구나! ㅋㅋ






