NginxでPerl CGIをsuEXEC化して各ユーザー権限で実行する方法

サーバー

基本的にNginxではPHPを利用するが、たまにPerl CGIを動かしたいときがある。

そんな時には「FCGI Wrap」と「Spawn FCGI」を利用してNginxでPerl CGIを利用可能にするが、更にApacheのsuEXECのように各ユーザー権限で安全に実行する方法を解説する。

※動作確認環境
CentOS 7.6
Nginx 1.14.2

スポンサーリンク

FCGI WrapとSpawn FCGIのインストール

「epel-release」の確認

まずはじめに、NginxでPerl CGIを実行するための準備を行う。

FCGI WrapとSpawn FCGIは「epel」リポジトリからインストールするので、念のためにリポジトリを確認する。

インストールされていなければ「epel-release」のインストールが始まるので、インストールが終了したらリポジトリの設定も行っておきましょう。

【備考】
enabledの値:[0]許可時のみ、[1]リポジトリ常時利用
※当方は基本的にepelリポジトリのenabledは全て[0]で運用しています。

FCGI WrapとSpawn FCGIのインストール

FCGI WrapとSpawn FCGIをyumで一気にインストールします。

Spawn FCGIの設定

Spawn FCGIの設定ファイル /etc/sysconfig/spawn-fcgi を以下のように書き換えます。(初期状態の設定は全て#でコメント化されているので末尾に追加してもOKです。)

【備考】
基本的な設定なので、実行ユーザと実行グループは「nginx」、起動プロセス数はOPTIONSの「-F 1」でプロセス数「1」に設定してあります。

Spawn FCGIの起動設定

systemdのリロード

Spawn FCGIの自動起動をオン。

Spawn FCGIを起動。

Nginxの設定

Nginxで「.cgi」ファイルが実行できるように設定します。

SSI(Server Side Includes)も利用したい場合は「location / { ~ }」内に以下の設定も追加します。

Nginxを再起動します。

ここまでで通常のPerl CGIが実行可能になります。

テスト用のPerl CGIをドキュメントルート以下にアップロードまたは作成し、パーミッション(アクセス権)を750にしてブラウザで確認してみましょう。

テスト用cgiの例

NginxでPerl CGIを動かすテスト

ブラウザでこんな感じに表示されればOKです。

動作状況確認

既に上記の基本設定でPerl CGIがNginxで実行可能になっていますが、現在の動作状況は以下のとおりです。

  • 実行ユーザ: nginx
  • 実行グループ: nginx
  • 実行可能なファイルのパーミッション: 750

※Spawn FCGIの設定ファイル「/etc/sysconfig/spawn-fcgi」にて「FCGI_USER」と「FCGI_GROUP」の設定を変更すれば実行ユーザ、実行グループの変更も可能です。

基本設定のみでの問題点

一つのサーバーに一つのドメインで運用するならばこのままで問題ありませんが、バーチャルドメインで複数のドメインを運用する場合にはセキュリティ的に問題が発生します。

なので、セキュリティ対策のために、ApacheのsuEXECのようにドメインごとの各ユーザの権限でPerl CGIが実行出来るようにカスタマイズします。

スポンサーリンク

Perl CGIのsuEXEC化開始

suEXEC化のために行う設定の内容

ここからが本題です。

NginxにおけるPerl CGIのsuEXEC化処理の設定内容は以下のとおりです。

  • ドメインごとにFCGI Wrapのサービスを新規作成する。
  • ドメインごとのFCGI Wrapサービスは実行グループ・実行ユーザをドメインのユーザ・グループに変えてSpawn FCGIを実行させる。
  • Nginxでドメインごとに「fastcgi_pass」のunixソケットを変える。

これによりドメインごとに実行ユーザ、実行グループを変えてPerl CGIを実行させることができます。

それでは設定を開始します。

サービス新規作成

サービスを新規作成してsystemdに登録します。

※ここでは当サイトの「onoredekaiketsu.com」でテストしています。(実際に運用する場合はご利用中のドメイン名に変えて設定してください。コピペで使えるひな形も下のほうに記載してあります。)

【備考】
ExecStartの「-u」オプションで実行ユーザ、「-g」オプションで実行グループを指定しています。「-F」オプションで起動プロセス数を4に設定していますが、この値は任意で調整してください。

サービスの起動設定

systemdのリロード

サービスの自動起動をオン。

サービス起動。

Nginxの設定

Nginxで「fastcgi_pass」のunixソケットを変更します。

旧:fastcgi_pass unix:/var/run/fcgiwrap.socket;
新:fastcgi_pass unix:/var/run/fcgiwrap-onoredekaiketsu.com.socket;

Nginxを再起動します。

これで設定が完了です。

コピペ用ひな形

※コピペで使えるひな形を置いておきます。
[example.com]を利用中のドメインに変えてご利用ください。

== ここからひな形 ==

サービスを新規作成してsystemdに登録

systemdのリロード

サービスの自動起動をオン。

サービス起動。

Nginxで「fastcgi_pass」のunixソケットを変更。

Nginxを再起動。

== ひな形おわり ==

動作状況確認

ちゃんとNginxにおけるPerl CGIのsuEXEC化が行われているか実際にテストしてみます。

以下のPerl CGIをサーバにアップしてテストします。(※パーミッション700)

ブラウザで確認します。(以下のURLで実際に動作を確認できます。)

動作確認URL: https://onoredekaiketsu.com/perl-cgi/test.cgi

NginxでPerl CGIをsuEXEC化して動かすテスト

動作確認OKです。

  • 実行グループ: onoredekaiketsu.com
  • 実行ユーザ: onoredekaiketsu.com
  • 実行しているPerl CGIファイルのパーミッション: 700

Perl CGIスクリプトのパーミッションも700で実行可能なのでセキュリティは高いですね。
※Perl CGIスクリプトを置いておくディレクトリもパーミッション700でOKです。

スポンサーリンク

まとめ

NginxでPerl CGIを動かしたい場合には、「FCGI Wrap」と「Spawn FCGI」をインストールし、ドメインごとのサービスをsystemdで新規作成してsuEXEC化。更にファイルのパーミッション「700」でPerl CGIを実行してセキュリティを高める。

これで安心してPerl CGIを利用することができます。

最近はPerl CGIをWEBサイトで動かす人が減ってきましたが、まだまだPerlは全然使えます。配布されているフリーのPerl CGIやMovable TypeなどもNginxで普通に動きます。

ちょっとした処理ならPerlでサクッと書いてしまうのが一番楽ですね。

 

以上で解決です。