前回も同様の質問をさせていただきましたが、パーミッションが持つ危険性について調べています。


PHPやCGIで新規プログラムの制作することがあり、そのプログラムのパーミッション設定で悩んでおります。ログファイルなど書き換えが必要なファイルはその他に書き込み権限を与える必要がありますが、それがどれだけ危険なのか、図りかねています。

パーミッションが持つリスクについてなるべく具体的(たとえば777だとこういうツールで外から書き換えができるよ、など)に載っているサイトはありませんでしょうか。

以上、よろしくお願いします。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2006/06/15 14:11:48
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:jiangmin-alt No.6

回答回数125ベストアンサー獲得回数8

ポイント80pt

ということは書き込み権限を与えても、サーバー上でのユーザー権限を持っているユーザーでなければファイルの書き換えなどはできないということですね。

 基本的にはそうですが、サーバー上で動作している、ネットワークとやりとりするプログラムは、ネットワークの向こう側からのメッセージに応じて、サーバー上でローカルに何かすることが出来るわけですから、ネットワークとやりとりするプログラムは予期せぬ動作をしないように(セキュリティホールがないように)慎重につくる必要があります。

 プログラムを実行するユーザとそのプログラムのファイルの所有者とは同じでも別でもありえます。そのファイルのアクセス権が700であればファイルの所有者しか実行できませんが。

 そのプログラムはどのようなやり方で実行していますか? 普段作業している一般ユーザでシェルから手動であるいはcronなどで実行しているのでしたらその一般ユーザです。その場合、その一般ユーザを、HTTPDのグループ(たぶんwww-data)に属させればいいです。

# groups ユーザ名

で確認、

# usermod -G 今属しているグループ名をコンマ区切りで列挙,www-data ユーザ名

でwww-dataを追加します(rootで実行)。

http://q.hatena.ne.jp/1150274687

id:n_maco2

コマンドまでわざわざありがとうございます

調べてみてグループで実行できるようになんとかやってみたいと思います。

今までファイルの所有者を気にすることはあっても、グループを気にすることはほとんどなかったのですが、今後気をつけてうまく利用していきたいと思います。

ありがとうございました!

2006/06/15 09:13:19

その他の回答5件)

id:harumomo2006 No.1

回答回数79ベストアンサー獲得回数2

ポイント10pt

http://www.e-provider.jp/server/cgi.html

少なくともグループに権限を与えると、同一サーバを使っている人にデータを覗かれるなどの問題が発生します。ログファイルということなら、IPなどの情報もあるでしょうし、いろいろ問題が出そうです。

id:n_maco2

回答ありがとうございました。

書き忘れてしまいましたが、使用しているのが専用サーバーのため、サーバー内部からのアクセスよりも外からの攻撃のほうが気になります。

(もちろん進入されて権限が奪取された場合は別ですが・・・)

2006/06/14 20:17:43
id:jiangmin-alt No.2

回答回数125ベストアンサー獲得回数8

ポイント1pt

 「なるべく具体的(たとえば777だと」という捉え方がそもそもおかしいんじゃないでしょうか。アクセス権限の付与や公開ディレクトリに置くファイルは最小限にする、という単純な基本原則に従えばいいだけです。

 その3桁の数字がユーザ・グループ・誰でもに対して各々読む・書く・実行を意味するということと、ユーザ・グループの概念については既にご存じなんですよね。

http://q.hatena.ne.jp/1150274687

id:n_maco2

ご回答ありがとございました。

はい、基本的な対策は行っております。ドキュメントルートの外にデータファイルは置くことなどは行っております。また、ライブラリに直接アクセスできないように、HTTP経由でアクセスする必要のないフォルダにはhtaccessでアクセス制限をかけたりなども行っています。

なるべく多くのケースで使える基礎となる考え方がほしかったものですから、あいまいな形で質問をしてしまいましたが、もう少し具体的に言いますと、サイトのトップページをプログラムから更新する必要がありまして、どうしても666にしておく必要があり、これがどのくらい危険なのか図りかねてる、といった状況です。

できればオーナー権限でCGIとしてPHPを起動して・・・などと他権限で動くような対策を取りたいとは考えているのですが、サーバーの知識が足りずうまくいくかどうか不安なもので、先に危険度だけ知りたいなと思います。

2006/06/14 20:24:10
id:kurukuru-neko No.3

回答回数1844ベストアンサー獲得回数155

id:n_maco2

ご回答ありがとうございました。

む、難しいですね・・・

いまいち何のことかよくわかりません・・・

PHPから書き換えを行うのではなくて、OSレベルから書き換えを行う、といった意味合いなのでしょうか。

勉強してみます!

2006/06/14 20:30:04
id:jiangmin-alt No.4

回答回数125ベストアンサー獲得回数8

ポイント1pt

 つまり、サイトのトップページを更新するプログラムはHTTPDとは無関係に、サーバ内でローカルに一般ユーザで実行され、そして「どうしても666にしておく必要があ」るファイルは、そのプログラムとHTTPD上で動作するphpのスクリプトの両方から読み書きできる必要があるということですよね。

 ファイルシステムのアクセス権はあくまでローカルでの話なので、666にしても、ローカルにどれかのユーザ権限で何か出来てしまう穴がどこにも無ければ大丈夫です。

 サイトのトップページを更新するプログラムを実行するユーザを、phpスクリプトを実行するユーザ(たぶんHTTPDと同じ?)のグループにも属させてファイルのアクセス権は660というので問題無いように思います。

参考までに⇒http://tdiary.ishinao.net/20060203.html

id:n_maco2

ご回答ありがとうございます!

>ファイルシステムのアクセス権はあくまでローカルでの話なので、666にしても、ローカルにどれかのユーザ権限で何か出来てしまう穴がどこにも無ければ大丈夫です。

ローカルだけの話なんですか!その他、というからHTTPでアクセスしてきたユーザーもその他に含まれるものだと思っていました・・・

勉強になりました、ありがとうございました!

ということは書き込み権限を与えても、サーバー上でのユーザー権限を持っているユーザーでなければファイルの書き換えなどはできないということですね。

> サイトのトップページを更新するプログラムを実行するユーザを、phpスクリプトを実行するユーザ(たぶんHTTPDと同じ?)のグループにも属させてファイルのアクセス権は660というので問題無いように思います。

上記の「プログラムを実行するユーザ」という点ですが、このユーザーというのは、そのプログラムのファイルの所有者が「プログラムを実行するユーザ」にあたるのでしょうか。

2006/06/14 21:56:04
id:toohigh No.5

回答回数291ベストアンサー獲得回数37

ポイント20pt

# 一部、他の方の回答への補足になってしまいますが・・・

先に、要点だけ書くとこんな感じになります。

・ひとつでも脆弱性を抱えたPHP/CGIのスクリプトが

外部から使える状態になっていた場合は、666 なファイルの

全てに書き換えのリスクが発生する。

・逆に、書き換え動作を行う PHP のみを setuid な CGI として

動作させた上で書き換え対象ファイルを 644 などの

パーミッションに設定した場合は、setuid なスクリプトの

動作に注意してやれば、リモートから HTTP 経由での

書き換えのリスクは解消可能である

・脆弱なスクリプト類を外部から悪用される場合、特定の

外部から使うツールが存在するというよりは、自身で設置する

スクリプト等次第なので、ツール名は挙げにくい



> その他、というからHTTPでアクセスしてきたユーザーも

> その他に含まれるものだと思っていました・・・

HTTPでアクセスしてきたユーザが PHP スクリプトを

実行した場合は、httpd の実行権限(普通は www とか

apache とか httpd とか)になります。

で、普通はファイルを置く人と httpd などのユーザは同一の

グループには属していないことが多いかと思いますので、

アクセス権的には「その他」(3桁表記でいう一番右の桁)が

利いてくる、ということになります。逆にいうと対象ファイルの

所属グループに httpd アカウントが属している場合は

真ん中の桁が利く、ですね。

# url はダミーです。

http://www.google.com/

id:n_maco2

なるほどなるほど・・・

> 実行した場合は、httpd の実行権限(普通は www とかapache とか httpd とか)になります。

サーバー屋さんからhttpdの実行権限について昔注意を受けたことがあったのですが、こんなところで効いてくるのですね。

ありがとうございました~

2006/06/15 09:10:49
id:jiangmin-alt No.6

回答回数125ベストアンサー獲得回数8ここでベストアンサー

ポイント80pt

ということは書き込み権限を与えても、サーバー上でのユーザー権限を持っているユーザーでなければファイルの書き換えなどはできないということですね。

 基本的にはそうですが、サーバー上で動作している、ネットワークとやりとりするプログラムは、ネットワークの向こう側からのメッセージに応じて、サーバー上でローカルに何かすることが出来るわけですから、ネットワークとやりとりするプログラムは予期せぬ動作をしないように(セキュリティホールがないように)慎重につくる必要があります。

 プログラムを実行するユーザとそのプログラムのファイルの所有者とは同じでも別でもありえます。そのファイルのアクセス権が700であればファイルの所有者しか実行できませんが。

 そのプログラムはどのようなやり方で実行していますか? 普段作業している一般ユーザでシェルから手動であるいはcronなどで実行しているのでしたらその一般ユーザです。その場合、その一般ユーザを、HTTPDのグループ(たぶんwww-data)に属させればいいです。

# groups ユーザ名

で確認、

# usermod -G 今属しているグループ名をコンマ区切りで列挙,www-data ユーザ名

でwww-dataを追加します(rootで実行)。

http://q.hatena.ne.jp/1150274687

id:n_maco2

コマンドまでわざわざありがとうございます

調べてみてグループで実行できるようになんとかやってみたいと思います。

今までファイルの所有者を気にすることはあっても、グループを気にすることはほとんどなかったのですが、今後気をつけてうまく利用していきたいと思います。

ありがとうございました!

2006/06/15 09:13:19
  • id:kurukuru-neko
    セキュリティーに気をくばるのは大切なことです。
    今回採用さえるグループでもある程度のセキュリティーは
    確保可能です。

    グループで読み書き保護すると言う事は、1つのプログラム
    に問題があれば、グループ権限がある全てのファイルが
    アクセス可能であると言う事を意味します。
    (ユーザでも同じようなものですが)

    将来本格的に慎重なセキュリティー対策を行う場合

     SuLinux (Secure Linux) /LIDS

    の考え方を記憶の片隅にでも覚えておいて損はないと
    思います。

    ================================================

    追伸:

    他のソフトでも同じですがPHPもたまに致命的な
    不具合があるのでパッチの適用も忘れないで
    する必要があります。
    http://itpro.nikkeibp.co.jp/article/NEWS/20051102/223939/
  • id:n_maco2
    コメントありがとうございました。
    確かに人間が作るものである以上、穴を塞ぎきるのは難しそうですよね。OSレベルで取れる対策があるのであれば、将来的に検討していってみます。
    ありがとうございました~
  • id:villain
    Perlの場合はchmod関数でパーミッションを変更できます。
    (恐らくPHPもそういう関数があるのではないかと思います)

    http://perl.misty.ne.jp/function01/chmod.html

    chmod 0755, 'ファイル名';
    open(FILE, '>ファイル名') || die('ファイルが開けません');
    # ファイル書き込み処理
    close FILE;
    chmod 0644, 'ファイル名';

    として、書き込むときだけパーミッションの変更をすればいいのでは
    ないでしょうか。
    (ただし、書き込み処理中にPerlプロセスが死ぬとか攻撃を受けた
    場合などは別ですが)

    たまに、CGIの実行権限をrootで実行していないサーバも
    ありますがその場合は設定できないかも知れません。
  • id:n_maco2
    なるほど、リスクが増える時間をなるべく短くするということですね。
    PHPにも同様の関数がありますので導入を検討してみますね。

    コメントありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません