cgiのパーミッションについて何思う

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
僕自身、開発をしたことはないんですが、というか僕が開発するならPHPで作ってしまうところなんですが……

メールフォームがcgiスクリプトで動いているサイトとか、あるじゃないですか。

僕はcgiってやつはあまりよく分からないんですけど、全部静的なHTMLで作られたサイトにメールフォームがある場合、PHPとかの代わりに何やらcgiファイルを読み込んでメールを送信してる場合があるみたいなんです。

まだPHPとかがそんなに普及してない頃はそれが主流だったんですかね? その辺の事情は存じ上げないですが。

先日、お付き合いのあるクライアントさんから、「何かメールフォームが動かなくなったんだけど、見てくれへん?」的な連絡が来まして、早速サイトを見てみたらまさにメールフォームの部分がcgiで動くものだったんですね。

現象としては、メールを送信しようとすると、500エラー(Internal Server Error)が出るというのもの。

で、まあ、当然のように僕には何のことやらさっぱりで、cgiもいじったことがないのであまりソースをいじくり倒すのも不安だったので、いじる前にいろいろと調べてみたんですが、結果として動かなかった原因はcgiファイルのパーミッションの問題でした。



パーミッションとは何ぞや?

僕も何とな〜くしか分かってないので、何とな〜くな説明になりますが、まあ何とな〜く聞き流してもらえればと。

英和辞書とか見ると、パーミッションの意味は「許可」とか「承諾」とかになってますね。

カルドセプトにもあったよね、パーミッション。全ての砦を通過したことにできるって能力だったかしら。

まさにその通りの意味で、ここで言うパーミッションというのは、ファイルやディレクトリに対するアクセス権限の許可のことです。特定のユーザー、あるいは全てのユーザーに対して、ファイルやディレクトリに必要なパーミッションを与えることで、そのファイルにアクセスできるようになるわけです。

権限の種類としては「読み込み」「書き込み」「実行」があります。

読み込み許可を与えられたユーザーは、そのファイルを読み込むことができます。そのまんまですね。

書き込み許可を与えられたユーザーは、そのファイルに書き込むことができます。そのまんまですね。

実行を与えられたユーザーは、そのファイルを実行することができます。そのまんm

全てのユーザーに全ての権限を与えた状態になっているファイルは、誰でも読み込めるし書き込めるってことですね。セキュリティの状態としては結構甘い状態です。誰でもそのファイルが上書きできちゃいますからね。

知らない人に知らないことを知らないうちに書き込まれたらまずいファイルには、書き込み権限は与えないようにする必要があります。

実行というのは、これもまさにその通りの意味で、ファイルを実行するということになるんですけど、要は実行権限が与えられていると、そのファイルを読み込んだ際、その中に書いてあるスクリプトを実行することができるってことですね。こんな説明で良いんだろうか……?

えっと、つまりですね……例えば、とあるファイルの中にメール送信用のスクリプトが書いてあったとしたら、そのファイルに実行権限を与えておかないと、動いてくれないってことですね。



cgiファイルのパーミッションが外れる

というわけで、今回のエラーが起きた原因ってのは、メール送信に使われているcgiファイルの実行権限がいつの間にか外れていたからってことなんです。

なので、ソースをいじる必要は特になくて、ファイルに実行権限を与えれば良い。FTPソフトとか使ってれば権限を与えたり外したりするのは簡単です。windowsのFFFTPとかだったら、チェックボックスのチェックをつけたり外したりするだけでOKだ。

んで、ですね。

問題の解決方法はこれで良いと思うのですが、今回の掲題として一つ注意点がありまして……まあ、僕が知らなかっただけだから今度同じような事態に遭遇したときに忘れていないように残しておきたい、あるいは同じような迷える子羊さんがうっかりこのサイトに来た時に助けになれば良いなというだけの話なんですが。

cgiファイルのパーミッションってのは、意図せずとも外れる場合があるそうなんですね。cgiファイルだけなのかどうかはちょっと分からないですが。

ウェブサイトを作ってて、改修とかが必要になった場合、直接サーバー上で改修する場合もあれば、一旦ローカル環境に落として来て、改修したのを再びサーバーにアップロードする場合もあると思います。

もしcgiファイルをいじることになった場合、一旦ローカルに落として来て、それを上げ直すと、どうやらそのタイミングでファイルの実行権限は自動的に外れてしまうようなんです。ローカルから上げた場合、そのcgiファイルには実行権限がない、の方が表現としては正しいのかな?

まあ要するに、この手のファイルを上げるときは実行権限がちゃんと許可されてるかどうかチェックしようってことですね。

僕はそんなこと知らなかったので、今回のエラーも、直すために手を動かした時間は20秒くらいなものなんですが、原因を知るまでに結構な時間がかかってしまいました。



今回の教訓としては、世の中「知らぬが仏」ってのは通用しない場面が多いなぁ……ってことにしたいんですが、どうでしょう?
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください