RHEL 7을 사용하여 표준 cgi-bin 위치 /var/www/cgi-bin/test.pl에서 hello-world Perl 스크립트를 실행해 보세요. selinux가 필수로 설정된 경우에만 httpd 오류 로그에 권한이 거부되었습니다.
AH01215: (13)Permission denied: exec of '/var/www/cgi-bin/test.pl' failed
End of script output before headers: test.pl
selinux를 허용으로 설정하면 스크립트가 제대로 실행되고 httpd 오류 로그에 아무 것도 게시되지 않습니다.
감사 로그에서 나는 장광설을 듣습니다.
type=PROCTITLE msg=audit(27482): proctitle=2F7573722F62696E2F7065726C002F7661722F7777772F6367692D62696E2F746573742E706C
type=PATH msg=audit(27482): item=2 name="/lib64/ld-linux-x86-64.so.2" inode=134467951 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unconfined_u:object_r:ld_so_t:s0 objtype=NORMAL
type=PATH msg=audit(27482): item=1 name="/usr/bin/perl" inode=67148821 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unconfined_u:object_r:bin_t:s0 objtype=NORMAL
type=PATH msg=audit(27482): item=0 name="/var/www/cgi-bin/test.pl" inode=269726961 dev=fd:07 mode=0100775 ouid=0 ogid=1007 rdev=00:00 obj=system_u:object_r:httpd_sys_script_exec_t:s0 objtype=NORMAL
type=CWD msg=audit(27482): cwd="/var/www/cgi-bin"
type=EXECVE msg=audit(27482): argc=2 a0="/usr/bin/perl" a1="/var/www/cgi-bin/test.pl"
type=SYSCALL msg=audit(27482): arch=c000003e syscall=59 success=yes exit=0 a0=561ae60b3cd0 a1=561ae60ad370 a2=561ae60ad388 a3=7ffe850d64a0 items=3 ppid=23749 pid=24488 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="test.pl" exe="/usr/bin/perl" subj=system_u:system_r:httpd_t:s0 key=(null)
type=SELINUX_ERR msg=audit(27482): op=security_bounded_transition seresult=denied oldcontext=system_u:system_r:httpd_t:s0 newcontext=system_u:system_r:httpd_sys_script_t:s0
마지막 줄이 재미있을 것 같네요"SELINUX_ERR op=security_bounded_transition seresult=거부됨 oldcontext=... newcontext=..."하지만 관련 내용을 많이 찾을 수 없었습니다.
마지막으로 파일 컨텍스트와 권한이 올바르게 설정되었습니다.
drwxrwxr-x. root webdev system_u:object_r:httpd_sys_script_exec_t:s0 /var/www/cgi-bin
-rwxrwxr-x. root webdev system_u:object_r:httpd_sys_script_exec_t:s0 /var/www/cgi-bin/test.pl
http.conf의 모든 내용이 올바르게 설정되었습니다.
<Directory "/var/www/cgi-bin">
AllowOverride None
Options +ExecCGI
Require all granted
</Directory>
AddHandler cgi-script .pl
무슨 일이 일어나고 있는지 알아낼 때까지 selinux를 종료해야 합니다.