- ベストアンサー
suEXECとパーミッションの関係について
- suEXECとはCGIやSSIの実行に関する機能であり、他のファイルの扱いには関与しない。パーミッションは従来通り設定する必要がある。
- 拡張子が.htmlなどのHTMLファイルのパーミッションは600。一般のサイト訪問者が読み取れないが、問題ない。
- suEXEC環境ではApacheはユーザ権限で実行され、通常のApacheではnobody権限で実行される。nobody権限は読み書きに制限があり、パーミッションで設定が必要。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>1 >Apacheでの「WEBページの所有者」の権限は、パーミッションの「オーナー]の権限に >Apacheでの「nobody」の権限は、パーミッションの「ユーザー]の権限に >に対応しているのでしょうか? 考え方が根本的に間違っています。 パーミションのオーナービット=ファイルの所有者と、実行中のプロセスの実行者が一致している場合に適用される。 パーミションのグループビット=ファイルのグループと、実行中のプロセスの実行者が所属するグループが一致している場合に適用される。 パーミションのユーザービット=ファイルの所有者やグループと、実行中のプロセスの実行者やグループが、どちらも一致しなかった場合に適用される。 「上から順に適用されるか調べられていく」のであって「対応」なんかしていません。 まず「どれがどれに対応するのか」って考え方を捨ててください。「対応」と言う概念を持ち込むのは間違いですから。 あと「オーナー」「グループ」「ユーザー」ではなく「オーナー」「グループ」「その他」と覚えた方が良いです。ユーザービットは、事実上「その他ビット」ですから。 判りやすく解説してみます。 usersと言うグループに所属するaaaさんとbbbさんが居ます。二人は別人ですが同じグループに所属しています。 ある所に、所有者がbbbになっていて、グループがadminsになっているfile1と言うファイルがあります。パーミションは604(-rw----r--)に設定されています。 aaaさんが、あるプロセスを実行しました。そのプロセスの実行者はaaaです。 そのプロセスが「file1」を「Readのみ」でオープンしようとしています。 すると、まず「file1の所有者bbbと、プロセスの実行者aaaが、同一人物か?」がチェックされます。 同一人物であれば「オーナーのパーミション」が適用されますが、今回は「別人」ですから適用されません。 別人であれば、今度は、file1のグループadminsと、プロセスの実行者aaaのグループusersが、同一のグループか?」がチェックされます。 同じグループであれば「グループのパーミション」が適用されます。今回は「別のグループ」ですから適用されません。 別グループであれば「ユーザー(その他)のパーミション」が適用されます。 こうして「オーナーか、グループか、ユーザー(その他)か、どのパーミションが適用されるのか」が判断され、今回は「Readのみのオープン」ですから「ユーザー(その他)のrのビット」が付いているかどうかで、オープン出来るかオープン出来ないかが決まります。 今回は、ユーザー(その他)のビットは「r--」なので、オープンに成功(オープンが許可)します。 この辺りの話は、UNIXの基礎の基礎の教本を読んで、1から勉強して来てください。 基礎知識が欠落している為、現状の貴方には「パーミションの概念」を正しく理解できません(「対応」とか言ってる時点で、お話になりません) >1で[WEBページの所有者]の権限=[オーナー]の権限が成り立つなら、拡張子cgiのオーナーのパーミッションが7の場合、 どのパーミションを立てると、誰が何を出来るようになるのか、UNIXの基礎の基礎の教本に書いてあるので、読んでから出直して来て下さい。 >3 >>・パーミションの「x」だけ機能するsuExecが入ったApacheの場合 >>「nobodyやdaemon(httpd.confで設定しているユーザー)」で新しいプロセスが実行される。 >>その新しいプロセスから呼び出されるCGIやSSIだけ「WEBページの所有者」で実行される。 >CGIのデータファイルも「WEBページの所有者」で実行されるのでしょうか。 >CGIが入ったディレクトリのパーミッションはどのように設定すれば良いのでしょうか。 UNIXの基礎の基礎の教本を読んで、読むだけじゃなく、書いてある事を理解すれば「CGIを実行するのは誰か?」を考えただkで、パーミションをどう設定すれば良いか判る筈です。
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8766/19891)
>Apacheサーバーへのアクセスは >1 FTPソフトでプロトコルFTPでFTPサーバにアクセスしているケース >2 ブラウザでプロトコルhttpでwebサーバーにアクセスしているケース >があると思います。 「FTPサーバ」が何なのか理解していますか? FTPサーバとは、ftpデーモンが起動されていて、外のFTPクライアントからの要求に応答出来るサーバの事です。サーバ内のファイルへのアクセスはftpデーモンが行います。 この場合、Apacheは一切関与しません。 「WEBサーバ」が何なのか理解していますか? WEBサーバとは、Apacheなどのhttpデーモンが起動されていて、外のWEBクライアント(ブラウザ)からの要求に応答出来るサーバの事です。サーバ内のファイルへのアクセスはApacheなどのhttpデーモンが行います。 この場合、ftpデーモンは一切関与しません。 >それぞれのケースで、アクセスしてきたのはaaaさんであるかどうかをApacheがどのようにして判断しているのか教えてください。 Apacheは何も判断しません。 Apacheは、設定ファイルに指定されたユーザーで実行し、ファイルにアクセスしに行くだけです。 この時、suEXECがインストールされていると、CGI/SSIを実行する前にsuEXECが呼び出され、suEXECが「そのCGI/SSIを実行すべき適切なユーザー(例えば、aaaさん)にユーザーを切り替えて」、CGI/SSIを実行します。 質問者さんは「アクセスしてきたのは○○さん」と言う概念を持ち出しますが、そういう概念は適当ではありません。間違っています。 UNIXの世界は「プロセス(ApacheやftpデーモンやsuEXECなど)は、自分を実行しているユーザーが、そのユーザーの権限でファイルシステムにアクセスする」って言う仕掛けになっています。 実行されているプロセスごとに「このプロセスは、誰々さんの権限を持って動いています」ってのを保持しているのです。 Windowsでも、タスクマネージャーの「プロセス」の所を見ると、プロセスごとに「誰が起動したか」つまり「誰々の権限を持って動いているか」が表示されます。 各プロセスが「ファイルにアクセスするとき」は「実行しているユーザーの権限を持ってファイルにアクセスするだけ」なのです。 アクセスに成功するか失敗するかは、UNIXシステムが判断します。 >FTPソフトでアクセスするケースではID・パスワードを入力してログインしたときにこちらの名前(aaaなど)をApacheサーバーに伝達しているのでしょうか? Apacheサーバーに伝達なんかしません。 外のFTPクライアントからアクセスがあると、常駐していたftpデーモンが応答し、クライアントにログイン(ユーザー名とパスワードの入力)を求めます。 クライアントからユーザー名とパスワードが送られて来たら、ftpデーモンは、UNIXシステムに「このユーザーは、このパスワードで合っているか?」を問い合わせます。 ユーザー名とパスワードが合っていれば、自分自身の実行者をログインユーザーに切り替えて、あたかも、そのユーザーがftpデーモンを起動したかのような状態になって、ファイルシステムにアクセスします。 UNIXのファイルシステムは、ファイルへのアクセスに対し、実行ユーザーとファイルのパーミションに問題が無いか調べ、問題が無い時だけアクセスを許します。 >>そのプロセスが「file1」を「Readのみ」でオープンしようとしています。 >ブラウザでプロトコルhttpでwebサーバーにアクセスしているケースでは、 だ~か~ら~、ブラウザはサーバー内のファイルには一切アクセスしませんってば。 サーバー内にアクセスしているのは、httpデーモンであるApacheですよ。何度言ったらわかるの? >ブラウザからサーバー内のファイルに向けて[Read]または[Write]または[Execute]の要求を出しているのでしょうか? ブラウザはサーバー内のファイルには一切アクセスしませんって。なので、この質問は意味不明。 >サーバーにログインされることなしに勝手にサーバーのファイルを書き換えられるのが怖いのですが 「WEBページ上で、WEB利用者が自分自身の登録情報を変更する」って場合は、ユーザー情報が入ったファイルは「誰かが書き込み権限を持っている必要」があります。 この時「登録情報変更用のCGIがあるページ」をブラウザで開けるかどうかは「ApacheやUNIXシステムは一切関知しません」ので、ブラウザでそのページに辿り着けるかどうかは、WEBページ作成者の責任になります。 「ログインページを設けて、本人しか入れないようにする責任」は、WEBページ作成者にあります。 suEXECが無い環境では、Apacheや、Apacheから起動されたCGIやSSIは「nobody」など、規定のユーザーで実行されます。ですが、WEBスペース上のファイルは、所有者がnobodyにはなっていません。 でも、前述のように「ユーザー登録情報に書き込みに行く権限」は必要です。 nobodyがWEBスペース上のファイルに書き込みに行くには、パーミションが「606」のように「その他にwが必要」です。 この時、CGIを書き間違えれば、他人が所有するファイルにアクセスしに行っちゃって、他人のファイルを書き換えちゃう可能性が出てきます。 それを防ぐのがsuEXECの役目です。 >htmlファイルのパーミッションが606の時に、 基礎から勉強しなおして来てくださいって言いましたよね? なので、ここ以下の補足質問には答えません。基礎から勉強しなおして来れば理解できる事ばっかりですから。
- chie65536(@chie65535)
- ベストアンサー率44% (8766/19891)
>r(readable) >w(writable) >x(executable) >この3種類に及ぶのでしょうか、 >それとも >x(executable) >の1種類だけでしょうか? suExecのバージョンや設定により、どっちも有り得ます。どっちなのかはやってみないと判りません。 >そこで、ページの内容を返すように新たに設けられたのが 新たには設けられてはいません。FTPなんか無かった頃、WEBなんか無かった頃から、つまり、UNIXが初めて世の中に出てきた時に、すでに、パーミションには「オーナー」「グループ」「ユーザー」の区別がありました。 深く考えてはいけません。 UNIXのファイルシステムには、個々のファイルやディレクトリに「これは誰の物か」と言う情報が付いています。 その「所有者情報」は、ファイル名やタイムスタンプやファイルサイズなどの情報が入っている場所に一緒に入っています。 そして、同じ場所に「パーミション情報」もあって、そこに「これはディレクトリか」「オーナーは××できるか」「同じグループなら××できるか」「オーナーでもグループでもない他のユーザーは××できるか」と言うのが入っています。 この「××できる」が「r(readable)」「w(writable)」「x(executable)」なのです。 >[WEBページの所有者だけがアクセス出来る状態]のため一般のサイト訪問者はhtmlファイルにアクセスできず 「一般のサイト訪問者」と言うモノは存在しません。 「一般のサイト訪問者」と言う概念は捨て去りましょう。 WEBサーバーが動作しているシステム上では、httpデーモンというサービスプログラムが常駐して動作しています。 Apacheはhttpデーモンの1つで、デフォルトでは「nobody」や「daemon」と言うユーザーがApacheを実行しています(どのユーザーに実行させるかは、httpd.confで設定出来ます) 外部からWEBアクセスがあると(ページ内容を送信するように要求するコマンドがWEBサーバーで受信されると)、httpデーモンであるApacheに受信データが渡されます。 受信データを受け取ったApacheは、自分自身を新しいプロセスとして生成して「サービスを開始」して、要求されたWEBページへのアクセスを開始します。 この時、生成されたプロセスを実行しているユーザー、CGI、SSIを実行するユーザーは、 ・suExecの無い素のApacheの場合 「nobodyやdaemon(httpd.confで設定しているユーザー)」で新しいプロセスが実行される。 その新しいプロセスから呼び出されるCGIやSSIも「nobodyやdaemon(httpd.confで設定しているユーザー)」で実行される。 ・パーミションの「x」だけ機能するsuExecが入ったApacheの場合 「nobodyやdaemon(httpd.confで設定しているユーザー)」で新しいプロセスが実行される。 その新しいプロセスから呼び出されるCGIやSSIだけ「WEBページの所有者」で実行される。 ・パーミションの「rwx」すべてに機能するsuExecが入ったApacheの場合 「WEBページの所有者」で新しいプロセスが実行される。 その新しいプロセスから呼び出されるCGIやSSIも「WEBページの所有者」で実行される。 と言うようになっています。 このように「Apacheを実行しているユーザーや、CGIやSSIを実行するユーザー」は「nobodyやdaemon(httpd.confで設定しているユーザー)」か、「WEBページの所有者」か、どちらかです。「一般のサイト訪問者」では実行されません。 「一般のサイト訪問者」というユーザーは、UNIX(LINUX)のシステム内には存在していないのです。 「だれがApacheを実行しているのか」と「だれがCGIやSSIを実行するのか」さえ把握しておけば「ファイルのパーミションをどうすれば良いのか」は理解できる筈です。 >htmlファイルにおいて、一般のサイト訪問者がr(読み取り)の結果を受け取るのはなんとなく分かりますが、w(書き込み)の結果を受け取るとはどのような状態でしょうか? 「一般のサイト訪問者」と言うモノは存在しませんから、一般のサイト訪問者が、サーバー上のファイルに直接にアクセスする事は出来ません。 まず「一般のサイト訪問者」という概念を頭の中から消しましょう。そんなものは存在しないのですから。 >補足で抜けていたことがあります。 >http://tech.bayashi.net/pdmemo/permission.html >で、 >通常のディレクトリ ==> 701 >となっています。 WEBに書いてある事を鵜呑みにしてはいけません。嘘や間違いが書いてある事があります。 参考にした図書で「7」が「1」に誤植されていた場合、それをそのままWEBサイトに書いている人が居るかも知れません。 手書きの原稿を本にしているなら「7」が「1」と誤植される事もありますから、WEBの記述や本の記述を鵜呑みにしてはいけません。 原理と仕掛けを理解するのが大事で、それが理解できれば「あ、嘘が書いてある」と言うのも判別できるようになります。
補足
1 Apacheでの「WEBページの所有者」の権限は、パーミッションの「オーナー]の権限に Apacheでの「nobody」の権限は、パーミッションの「ユーザー]の権限に に対応しているのでしょうか? 2 >・パーミションの「x」だけ機能するsuExecが入ったApacheの場合 >「nobodyやdaemon(httpd.confで設定しているユーザー)」で新しいプロセスが実行される。 >その新しいプロセスから呼び出されるCGIやSSIだけ「WEBページの所有者」で実行される。 1で[WEBページの所有者]の権限=[オーナー]の権限が成り立つなら、拡張子cgiのオーナーのパーミッションが7の場合、 拡張子cgiが「WEBページの所有者」で実行される時、その内容は r(readable),w(writable) ,x(executable)の3種類に及ぶのか、それとも実行される内容はx(executable)だけのため、r(readable)できるようにユーザーのパーミッションを4にしておかなければならないのでしょうか? 3 >・パーミションの「x」だけ機能するsuExecが入ったApacheの場合 >「nobodyやdaemon(httpd.confで設定しているユーザー)」で新しいプロセスが実行される。 >その新しいプロセスから呼び出されるCGIやSSIだけ「WEBページの所有者」で実行される。 CGIのデータファイルも「WEBページの所有者」で実行されるのでしょうか。 CGIが入ったディレクトリのパーミッションはどのように設定すれば良いのでしょうか。
- chie65536(@chie65535)
- ベストアンサー率44% (8766/19891)
>なお、CGI 関係以外のファイル( HTML や GIF 等)の扱いは、従来どおり "644" 等としないと見えません。suEXEC はあくまで CGI や SSI の実行に関してのみ機能するものだからです。 「CGI や SSI の実行に関してのみ機能するバージョンのsuEXEC」なら、この記述の通りです。 「CGI や SSI の実行に関してのみではなく、すべてのファイルに対して機能するバージョンのsuExec」なら、この記述は通用しません。 >600では一般のサイト訪問者がread出来ない様に思えるのですが、問題ないのでしょうか? 問題無いです。 UNIXのユーザーアカウントの中には「一般のサイト訪問者」なんて存在しませんよ。 居るのは「Apacheを実行しているユーザー」つまり「WEBサイトの所有者か、nobodyと言う名のビルトインユーザーか、どっちか」です。 >suEXEC設定がされているサーバーでは、各拡張子のパーミッションはどのように設定すれば良いのか教えてください。 ・ディレクトリや実行権限が必要なファイル 700で試して駄目なら705で試す。 ・その他の実行権限が不要なファイル 600で試して駄目なら604で試す。 「CGI や SSI の実行に関してのみ機能するバージョンのsuEXEC」が動いているか、「CGI や SSI の実行に関してのみではなく、すべてのファイルに対して機能するバージョンのsuExec」が動いているか、サーバー管理者でもない貴方には判らないでしょう? だったら「両方試す」しかありませんよ。 >■UNIX + Apache サーバで nobody権限の場合 >UNIXのApacheは通常 nobody権限で実行され この意味は「Apacheを実行しているのは、nobodyと言うアカウントのユーザーです」って意味。 >■UNIX + Apache サーバで SuExec環境の場合 >SuExec環境では、Apacheがユーザ(オーナ)権限で実行されます。 この意味は「Apacheを実行しているのは、そのWEBページの所有者ユーザーです」って意味。 >上記のApacheの nobody権限、ユーザ権限、オーナ権限 というのは >FTPソフトでパーミッションを設定するときの オーナー権限、グループ権限、ユーザ権限 >とは全く関係のない別物なのでしょうか? おおいに関係あります。 パーミッションが一致してないと、Apacheがエラー吐いて、ページの内容を返して来ません。 >特にnobody権限とは何でしょうか? ビルトインアカウントである「nobody」と言う名前のアカウントが所有している権限の事です。 >ファイルの読み書きもnobody権限しかありません。なので、パーミッションでも第三者に対する許可が必要です >↑が何を言っているのか理解できません。 「Apacheはnobodyと言う名前のユーザーが起動しましたよ。なので、WEBページのディレクトリ内の所有者がnobodyじゃないから、パーミッションが600になってると動きませんよ。パーミッションは604にしましょうね。実行ファイルなら705ですよ」って言ってます。 要は ■UNIX + Apache サーバで nobody権限の場合 ↓ Apacheはnobodyと言うユーザーが実行してます。Apacheがアクセスする場所は、nobodyユーザーがアクセス出来る状態にします。 ■UNIX + Apache サーバで SuExec環境の場合 ↓ ApacheはアクセスされたWEBページの所有者が実行してます。Apacheがアクセスする場所はWEBページの所有者だけがアクセス出来る状態にします。 但し「CGI や SSI の実行に関してのみ機能するバージョンのsuEXEC」なら、実行しないファイルには、WEBページの所有者以外にもアクセス権が必要です。 一方「CGI や SSI の実行に関してのみではなく、すべてのファイルに対して機能するバージョンのsuExec」なら、Apacheがアクセスする場所は、WEBページの所有者だけがアクセス出来る状態にします。 って事です。 suEXECと一言で言っても、色々あるんです。
お礼
補足で抜けていたことがあります。 http://tech.bayashi.net/pdmemo/permission.html で、 --------------------- ■UNIX + Apache サーバで SuExec環境の場合 通常のディレクトリ ==> 701 --------------------- となっています。 ■UNIX + Apache サーバで SuExec環境の場合 ↓ ApacheはアクセスされたWEBページの所有者が実行してます。 ftpソフトでの[オーナー]の権限が7となっているのであれば、ftpソフトでの[ユーザー]の権限は1(701)ではなく0(700)でも、権限が7のApacheの[WEBページの所有者]によってx(executable)がなされると思うのですが、ftpソフトでの[ユーザー]の権限はなぜ1になるのでしょうか? (Apacheでの[WEBページの所有者]は、ftpソフトでの[オーナー]と同じ立場を意味すると考えています。)
補足
>■UNIX + Apache サーバで nobody権限の場合 >↓ >Apacheはnobodyと言うユーザーが実行してます。 >■UNIX + Apache サーバで SuExec環境の場合 ↓ >ApacheはアクセスされたWEBページの所有者が実行してます。 ApacheでnobodyまたはWEBページの所有者が実行する内容は r(readable) w(writable) x(executable) この3種類に及ぶのでしょうか、 それとも x(executable) の1種類だけでしょうか? >おおいに関係あります。 >パーミッションが一致してないと、Apacheがエラー吐いて、ページの内容を返して来ません。 >「Apacheはnobodyと言う名前のユーザーが起動しましたよ。なので、WEBページのディレクトリ内の所有者がnobodyじゃないから、パーミッションが600になってると動きませんよ。パーミッションは604にしましょうね。実行ファイルなら705ですよ」って言ってます。 Apacheがnobodyというユーザーで実行されている場合、WEBページのディレクトリ内のファイルはすべてwebサイトの所有者のものなので、常にパーミションは一致せずApacheがエラーを吐いてページの内容を返さない。 そこで、ページの内容を返すように新たに設けられたのが、ファイルにアクセスする立場を表す(FTPソフトで言うところの)オーナー、グループ、ユーザという分類ということでしょうか? つまり、Apacheをwebサイトの所有者でないnobodyアカウントで実行させていると、webサイトの所有者とは常に一致せずエラーを吐き続けることになってしまうので、そのエラー状態を解決するために、新たに設定された項目が(FTPソフトで言うところの)オーナー、グループ、ユーザという分類に当たる。 >■UNIX + Apache サーバで SuExec環境の場合 >↓ >ApacheはアクセスされたWEBページの所有者が実行してます。Apacheがアクセスする場所はWEBページの所有者だけがアクセス出来る状態にします. CGI や SSI の実行に関してのみではなくすべてのファイルに対して機能するバージョンのsuExecであり htmlファイルのパーミッションが600のケースで一般のサイト訪問者(FTPソフトでのユーザー権限該当者)がhtmlファイルにアクセスした場合、 [WEBページの所有者が実行]する内容は、htmlファイルでのオーナー権限が6に設定してあることから、htmlファイルのr(読み取り)またはw(書き込み)であり、[WEBページの所有者だけがアクセス出来る状態]のため一般のサイト訪問者はhtmlファイルにアクセスできず、[WEBページの所有者が実行]したr(読み取り)またはw(書き込み)の結果を受け取るということでしょうか? htmlファイルにおいて、一般のサイト訪問者がr(読み取り)の結果を受け取るのはなんとなく分かりますが、w(書き込み)の結果を受け取るとはどのような状態でしょうか?
補足
>aaaさんが、あるプロセスを実行しました。そのプロセスの実行者はaaaです。 Apacheサーバーへのアクセスは 1 FTPソフトでプロトコルFTPでFTPサーバにアクセスしているケース 2 ブラウザでプロトコルhttpでwebサーバーにアクセスしているケース があると思います。 それぞれのケースで、アクセスしてきたのはaaaさんであるかどうかをApacheがどのようにして判断しているのか教えてください。 FTPソフトでアクセスするケースではID・パスワードを入力してログインしたときにこちらの名前(aaaなど)をApacheサーバーに伝達しているのでしょうか? >そのプロセスが「file1」を「Readのみ」でオープンしようとしています。 ブラウザでプロトコルhttpでwebサーバーにアクセスしているケースでは、 ブラウザからサーバー内のファイルに向けて[Read]または[Write]または[Execute]の要求を出しているのでしょうか? サーバーにログインされることなしに勝手にサーバーのファイルを書き換えられるのが怖いのですが、htmlファイルのパーミッションが606の時に、 [■UNIX + Apache サーバで nobody権限の場合] で、且つ [パーミションのユーザービット=ファイルの所有者やグループと、実行中のプロセスの実行者やグループが、どちらも一致しなかった場合] ブラウザからサーバー内のhtmlファイルに向けて[Write]の要求が出ていれば、サーバー上のhtmlファイルの中身をブラウザから書き換えられるということでしょうか? FTPソフトでID・パスワードを入力してFTPサーバーにログインして、サーバーにアップされているhtmlファイルの中身を書き換えるというのは普通にやっていることなので違和感はないのですが、ブラウザからhtmlファイルの中身を書き換えられるというのがピンときません。