SElinux : httpd가 특정 포트에 연결하도록 허용


40

내 시스템은 apache2.2.15와 함께 CentOS 6.4를 실행 중입니다. SElinux가 시행 중이며 파이썬 / wsgi 앱을 통해 로컬 redis 인스턴스에 연결하려고합니다. 오류 13, 권한이 거부되었습니다. 명령을 통해이 문제를 해결할 수 있습니다.

setsebool -P httpd_can_network_connect

그러나 httpd가 모든 tcp 포트에 연결할 수 있기를 원하지 않습니다. httpd에 연결할 수있는 포트 / 네트워크를 어떻게 지정합니까? httpd가 포트 6379 (redis) 또는 127.0.0.1의 모든 tcp에 연결할 수 있도록 모듈을 만들 수 있다면 바람직합니다. 왜 내 편집증이 그렇게 강한 지 잘 모르겠지만

누구 알아?


프록시를 통해 나가도록 강요하는 것이 낫지 않습니까? 이렇게하면 a) 액세스 할 수있는 대상을보다 잘 제어 할 수 있습니다. b) 발생한 상황과시기를보다 잘 감사 할 수 있습니다.
Cameron Kerr

답변:


50

기본적으로 SELinux 정책은 서비스가 해당 서비스와 관련된 인식 된 포트에만 액세스하도록 허용합니다.

# semanage port -l | egrep '(^http_port_t|6379)'
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
# curl http://localhost/redis.php
Cannot connect to redis server.

-SELinux 정책에 Redis 포트 (6379) 추가

# semanage port -a -t http_port_t -p tcp 6379
# semanage port -l | egrep '(^http_port_t|6379)'
http_port_t                    tcp      6379, 80, 81, 443, 488, 8008, 8009, 8443, 9000
# curl http://localhost/redis.php
Connected successfully.

setroubleshoot-serverRPM 을 설치 하고 다음을 실행할 수도 있습니다 sealert -a /var/log/audit/audit.log.-유용한 제안이있는 멋진 보고서를 제공합니다 (위의 명령 포함).

연결을 테스트하기위한 PHP 스크립트 :

# cat redis.php 
<?php

$redis=new Redis();
$connected= $redis->connect('127.0.0.1', 6379);

if(!$connected) {
        die( "Cannot connect to redis server.\n" );
}

echo "Connected successfully.\n";

?>

3
Fedora 23에서 httpd에서 시작한 perl 스크립트 (Net :: SMTP 사용)에서 이메일 (포트 25의 127.0.0.1에 연결하여)을 보내는 데 문제가있었습니다. "httpd가 포트 25에 연결하기위한 권한"은이 경우에 원하는 것이 아닙니다. 실제로 http_port_t포트 25가 이미 사용 된 (다른 SELinux 유형의 경우) 포트 25를 SELinux 유형에 추가 할 수 없습니다 ValueError: Port tcp/25 already defined. httpd가 포트 25에 연결하도록하는 올바른 방법은 해당 SELinux 정책 부울을 설정하는 것입니다 setsebool -P httpd_can_sendmail on(참조 getseebool -a). (2 부에서 계속)
David Tonhofer

1
(1 부에서 계속) 그러나 perl 스크립트에서 보내려면 다음을 허용하는 SELinux 모듈을 명시 적으로 작성해야합니다 sealert -b; sealert -a /var/log/audit/audit.log; grep perl /var/log/audit/audit.log | audit2allow -M mypol; semodule -v -i mypol.pp. 그런 다음 작동합니다!
David Tonhofer 2016 년

getsebool -a명령 에서 @DavidTonhofer 경미한 오타 (하나 더 적음 e).
davidjb

1
: @DavidTonhofer 당신은 대신 수정할 수 있습니다, 기존의 포트에 대한 새 정책을 만들 필요가 없습니다 semanage port -m -t http_port_t -p tcp 25, 참조semanage port --help
HTF

zabbix의 경우 CentOS 7.5에는 이미 특정 부울이 있습니다.setsebool -P httpd_can_connect_zabbix true
David Tonhofer

17

사용해야 할 수도 있습니다

semanage port -m -t http_port_t -p tcp 6379

의미가없는 경우 패키지 policycoreutils-python을 추가하십시오.

yum install policycoreutils-python

semanagepolicycoreutils-python-utils지금 있을 수 있습니다 (적어도 Fedora 23)
David Tonhofer

1
CentOS 7에는 여전히에 포함 semanage되어 policycoreutils-python있습니다.
jxmallett

다른 질문 대신 질문에 답변 해 주셔서 감사합니다.
Florian Heigl

3

selinux를 일시적으로 허용 모드로 설정하고 httpd가 redis에 연결되도록 한 다음 audit2allow를 사용하여 사용자 정의 정책 모듈을 생성 및 빌드 할 수 있습니다.

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