SeLinux+CentOS+Apache+mod_fastcgi FastCGI環境の構成


投稿は出典を明記してください!!!
 
説明:
最近はいくつかの理由でFastCGI環境を配置する必要がありますが、ネット上の資料が山積みになっていますが、私のニーズを完全に解決できるものは何もありません.何度も振り回して、やっと配置しました.
 
環境:
CentOS5.3(32bit)
Apache 2.2.3
php5.1.6
selinux状態:Enforcing
 
構成手順:
1.yumを使用してApache、PHPなどを取り付け、基本的な配置をしっかりと行う.
2.コンパイルmod_のインストールfastcgiモジュールに必要なパッケージ:
    #yum install httpd-devel apr apr-devel libtool
3.FastCGI公式サイトからmodをダウンロードfastcgiモジュールソースパッケージ:
    #wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
4.上記圧縮パッケージを解凍し、コンパイル、インストールを行う:
    #tar zxvf mod_fastcgi-2.4.6.tar.gz
    #cd mod_fastcgi-2.4.6
(以下、解凍したディレクトリのREADMEファイルの説明に従ってコンパイルインストールを行う)
    #cp Makefile.AP2 Makefile
    #vim Makefile
Makefileのマクロtop_をvimで変更するdirはhttpdインストールパス/usr/lib/httpdで、保存、終了し、次のコマンドを実行します.
    #make
    #make install
5.Apacheサポートmod_の構成fastcgiモジュール:
    #cd/var/www/
    #mkdir fcgi-bin
    #chcon -R -t httpd_sys_script_exec_t/var/www/fcgi-bin
    #cd/etc/httpd/conf.d/
    #vim fastcgi.conf
vimで新しいプロファイルを作成し、次の内容を編集して保存します.
    ##########################
    # FastCGI configuration. #
    # fastcgi.conf           #
    ##########################
    LoadModule fastcgi_module modules/mod_fastcgi.so
    ScriptAlias /fcgi-bin/ "/var/www/fcgi-bin"
    <Directory "/var/www/fcgi-bin">
            AllowOverride None
            Options +ExecCGI -Includes
            AddHandler fastcgi-script .fcg .fcgi
            Order allow,deny
            Allow from all
    </Directory>
    FastCgiIpcDir "/tmp/fcgi-ipc"

6.httpdサービスを再起動する:
    #/etc/init.d/httpd restart
7.成功したかどうかを確認します.
    #vim/var/log/httpd/error_log
mod_のように見える場合fastcgi構成成功とかならOK
エラーが表示される可能性があります(「問題と解決」セクションで説明します):
    [error]FastCGI: access for server (uid -1, gid -1) failed: read not allowed
    [error]FastCGI: can't create dynamic directory "/tmp/fcgi-ipc/dynamic": access for server (uid -1, gid -1) failed: read not allowed
ディレクトリ権限が
    drwx------ root root        fcgi-ipc
しかしhttpdは正常に起動します
8.FastCGI公式サイトからFastCGI開発ライブラリをダウンロードする:
    #wget http://www.fastcgi.com/dist/fcgi-2.4.0.tar.gz
9.開発ライブラリの解凍、コンパイル、インストール:
    #tar zxvf fcgi-2.4.0.tar.gz
    #cd fcgi-2.4.0
(以下、解凍したディレクトリのREADMEファイルの説明に従ってコンパイルインストールを行う)
    #./configure
    #make
    #make install
インストールが完了すると、/etc/ldを編集する必要があります.so.conf、/usr/local/libを追加します.
実行:ldconfig(ダイナミックリンクライブラリの管理コマンド)
10.サンプルプログラムを実行してテストします.
    #cd fcgi-2.4.0
    #gcc -o echo.fcgi echo.c -I/usr/local/lib -lfcgi
    #cp ./echo.fcgi/var/www/fcgi-bin/
ブラウザを開き、アドレスバーに入力http://localhost/fcgi-bin/echo.fcgiechoが正常に表示されるかどうか見てみましょう.fcgiプログラム実行の結果
 
問題と解決:
1.httpdの起動に失敗した場合:
    access for server (uid -1, gid -1) failed: read not allowed
なぜなら、自動的に確立された/tmp/fcgi-ipc/dynamic権限は
    drwx------ root root        fcgi-ipc
しかし、エラーメッセージを見ると、Apacheは起動中のある段階でuid=-1のユーザーを使ってこのディレクトリにアクセスしようとするので失敗します.
このディレクトリは主にFastCGIモジュールとApacheサーバの通信用のsocketを配置するために使用されますが、なぜrootまたはapacheユーザーを直接使用してこのディレクトリにアクセスしないのですか?
構成の問題かもしれませんが、まだよく分かりません.
ソリューション:
ディレクトリを一時的に更新する権限だけで済みます.
    #chmod -R o+rwx/tmp/fcgi-ipc
その後apacheアカウントでこのディレクトリにアクセスするのが正常であることを容易にするために、このディレクトリ所有者をapacheに変更します.
    #chown -R apache:apache/tmp/fcgi-ipc
変更後、httpdを再起動
    #/etc/init.d/httpd restart
ブラウザを開き、アドレスバーに入力http://localhost/fcgi-bin/echo.fcgiechoが正常に表示されるかどうか見てみましょう.fcgiプログラム実行の結果
SOcketファイルの作成に成功したことがわかりますが、正常な結果は表示されません(後述)
安全のため、現在、一時的に変更されたディレクトリ権限を変更できます.
    #chmod -R o-rwx/tmp/fcgi-ipc
2.なぜ表示できないのですか.観察/var/log/http/error_log、次のようなエラーが発生する可能性があります.
    (13)Permission denied: FastCGI: can't create (dynamic) server "/var/www/fcgi-bin/echo.fcgi": bind() failed [/tmp/fcgi-ipc/dynamic/......] 
    (13)Permission denied: FastCGI: failed to connect to server "/var/www/fcgi-bin/echo.fcgi": connect() failed......    
権限が問題ない以上、seLinuxによるものかどうかを考慮し、/var/log/messageを観察することで、確かにseLinuxのブロックによる失敗を見ることができますが、
参考/var/log/messageのアドバイスは必ずしもできるとは限りません.
ソリューション:
audit 2 whyとaudit 2 allowを助けて、命令は以下の通りです
    #audit2why 多くのエラーが表示され、プロンプトに従ってavcをaudit 2 allow入力として使用し、アクセスを許可するルールを追加します.
    #grep '88cf197ab......' /var/log/audit/audit.log | audit2allow -M myhttpdrule
その中の「88 cf 197 ab......」socketファイル名を指します.次にヒントを押して実行します.
    #semodule -i myhttpdrule.pp
 
これで、やっと訪問できました...