私のシステムは 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-server
RPMをインストールして次のコマンドを実行することもできます。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許可