SElinux: httpd が特定のポートに接続できるようにする

SElinux: httpd が特定のポートに接続できるようにする

私のシステムは CentOS 6.4 と apache2.2.15 を実行しています。SElinux が強制されており、python/wsgi アプリを介して redis のローカル インスタンスに接続しようとしています。エラー 13 (権限が拒否されました) が表示されます。次のコマンドでこれを修正できます。

setsebool -P httpd_can_network_connect

しかし、私は httpd がすべての TCP ポートに接続できるようにしたいわけではありません。httpd が接続できるポート/ネットワークを指定するにはどうすればよいでしょうか? httpd がポート 6379 (redis) または 127.0.0.1 上の任意の TCP に接続できるようにするモジュールを作成できれば、それが望ましいでしょう。なぜ私がこれに対してこれほど強い偏執症なのかはわかりませんが、まあ...

誰か知ってますか?

答え1

デフォルトでは、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.

- Redis ポート (6379) を SELinux ポリシーに追加します

# 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";

?>

答え2

使用する必要があるかもしれません

semanage port -m -t http_port_t -p tcp 6379

semanageが見つからない場合は、パッケージpolicycoreutils-pythonを追加します。

yum install policycoreutils-python

答え3

一時的にselinuxをpermissiveモードにしてhttpdをredisに接続し、カスタムポリシーモジュールを生成してビルドすることができます。監査2許可

関連情報