PHPやCGIで新規プログラムの制作することがあり、そのプログラムのパーミッション設定で悩んでおります。ログファイルなど書き換えが必要なファイルはその他に書き込み権限を与える必要がありますが、それがどれだけ危険なのか、図りかねています。
パーミッションが持つリスクについてなるべく具体的(たとえば777だとこういうツールで外から書き換えができるよ、など)に載っているサイトはありませんでしょうか。
以上、よろしくお願いします。
ということは書き込み権限を与えても、サーバー上でのユーザー権限を持っているユーザーでなければファイルの書き換えなどはできないということですね。
基本的にはそうですが、サーバー上で動作している、ネットワークとやりとりするプログラムは、ネットワークの向こう側からのメッセージに応じて、サーバー上でローカルに何かすることが出来るわけですから、ネットワークとやりとりするプログラムは予期せぬ動作をしないように(セキュリティホールがないように)慎重につくる必要があります。
プログラムを実行するユーザとそのプログラムのファイルの所有者とは同じでも別でもありえます。そのファイルのアクセス権が700であればファイルの所有者しか実行できませんが。
そのプログラムはどのようなやり方で実行していますか? 普段作業している一般ユーザでシェルから手動であるいはcronなどで実行しているのでしたらその一般ユーザです。その場合、その一般ユーザを、HTTPDのグループ(たぶんwww-data)に属させればいいです。
# groups ユーザ名
で確認、
# usermod -G 今属しているグループ名をコンマ区切りで列挙,www-data ユーザ名
でwww-dataを追加します(rootで実行)。
http://www.e-provider.jp/server/cgi.html
少なくともグループに権限を与えると、同一サーバを使っている人にデータを覗かれるなどの問題が発生します。ログファイルということなら、IPなどの情報もあるでしょうし、いろいろ問題が出そうです。
回答ありがとうございました。
書き忘れてしまいましたが、使用しているのが専用サーバーのため、サーバー内部からのアクセスよりも外からの攻撃のほうが気になります。
(もちろん進入されて権限が奪取された場合は別ですが・・・)
「なるべく具体的(たとえば777だと」という捉え方がそもそもおかしいんじゃないでしょうか。アクセス権限の付与や公開ディレクトリに置くファイルは最小限にする、という単純な基本原則に従えばいいだけです。
その3桁の数字がユーザ・グループ・誰でもに対して各々読む・書く・実行を意味するということと、ユーザ・グループの概念については既にご存じなんですよね。
ご回答ありがとございました。
はい、基本的な対策は行っております。ドキュメントルートの外にデータファイルは置くことなどは行っております。また、ライブラリに直接アクセスできないように、HTTP経由でアクセスする必要のないフォルダにはhtaccessでアクセス制限をかけたりなども行っています。
なるべく多くのケースで使える基礎となる考え方がほしかったものですから、あいまいな形で質問をしてしまいましたが、もう少し具体的に言いますと、サイトのトップページをプログラムから更新する必要がありまして、どうしても666にしておく必要があり、これがどのくらい危険なのか図りかねてる、といった状況です。
できればオーナー権限でCGIとしてPHPを起動して・・・などと他権限で動くような対策を取りたいとは考えているのですが、サーバーの知識が足りずうまくいくかどうか不安なもので、先に危険度だけ知りたいなと思います。
SuLinux (Secure Linux) /LIDS
http://itpro.nikkeibp.co.jp/free/LIN/LIN_CONTENTS/20040706/2/?ST...
http://www.atmarkit.co.jp/fsecurity/rensai/lids03/lids02.html
http://www.selinux.hitachi-sk.co.jp/document/article/article-200...
http://lc.linux.or.jp/paper/lc2004/CP-02.pdf
http://www-06.ibm.com/jp/linux/event/2005/matsuri/pdf/14a13hitac...
重要なファイルであれば直接ファイルに書き込みを
行わない方がよいです。(syslogインタフェース等を使う)
独自のロギング用ローダブルモジュールを作る。
http://web.yl.is.s.u-tokyo.ac.jp/~sumii/linux/writing-linux-driv...
http://www.mech.tohoku-gakuin.ac.jp/rde/contents/linux/drivers/m...
ご回答ありがとうございました。
む、難しいですね・・・
いまいち何のことかよくわかりません・・・
PHPから書き換えを行うのではなくて、OSレベルから書き換えを行う、といった意味合いなのでしょうか。
勉強してみます!
つまり、サイトのトップページを更新するプログラムはHTTPDとは無関係に、サーバ内でローカルに一般ユーザで実行され、そして「どうしても666にしておく必要があ」るファイルは、そのプログラムとHTTPD上で動作するphpのスクリプトの両方から読み書きできる必要があるということですよね。
ファイルシステムのアクセス権はあくまでローカルでの話なので、666にしても、ローカルにどれかのユーザ権限で何か出来てしまう穴がどこにも無ければ大丈夫です。
サイトのトップページを更新するプログラムを実行するユーザを、phpスクリプトを実行するユーザ(たぶんHTTPDと同じ?)のグループにも属させてファイルのアクセス権は660というので問題無いように思います。
ご回答ありがとうございます!
>ファイルシステムのアクセス権はあくまでローカルでの話なので、666にしても、ローカルにどれかのユーザ権限で何か出来てしまう穴がどこにも無ければ大丈夫です。
ローカルだけの話なんですか!その他、というからHTTPでアクセスしてきたユーザーもその他に含まれるものだと思っていました・・・
勉強になりました、ありがとうございました!
ということは書き込み権限を与えても、サーバー上でのユーザー権限を持っているユーザーでなければファイルの書き換えなどはできないということですね。
> サイトのトップページを更新するプログラムを実行するユーザを、phpスクリプトを実行するユーザ(たぶんHTTPDと同じ?)のグループにも属させてファイルのアクセス権は660というので問題無いように思います。
上記の「プログラムを実行するユーザ」という点ですが、このユーザーというのは、そのプログラムのファイルの所有者が「プログラムを実行するユーザ」にあたるのでしょうか。
# 一部、他の方の回答への補足になってしまいますが・・・
先に、要点だけ書くとこんな感じになります。
・ひとつでも脆弱性を抱えたPHP/CGIのスクリプトが
外部から使える状態になっていた場合は、666 なファイルの
全てに書き換えのリスクが発生する。
・逆に、書き換え動作を行う PHP のみを setuid な CGI として
動作させた上で書き換え対象ファイルを 644 などの
パーミッションに設定した場合は、setuid なスクリプトの
動作に注意してやれば、リモートから HTTP 経由での
書き換えのリスクは解消可能である
・脆弱なスクリプト類を外部から悪用される場合、特定の
外部から使うツールが存在するというよりは、自身で設置する
スクリプト等次第なので、ツール名は挙げにくい
> その他、というからHTTPでアクセスしてきたユーザーも
> その他に含まれるものだと思っていました・・・
HTTPでアクセスしてきたユーザが PHP スクリプトを
実行した場合は、httpd の実行権限(普通は www とか
apache とか httpd とか)になります。
で、普通はファイルを置く人と httpd などのユーザは同一の
グループには属していないことが多いかと思いますので、
アクセス権的には「その他」(3桁表記でいう一番右の桁)が
利いてくる、ということになります。逆にいうと対象ファイルの
所属グループに httpd アカウントが属している場合は
真ん中の桁が利く、ですね。
# url はダミーです。
なるほどなるほど・・・
> 実行した場合は、httpd の実行権限(普通は www とかapache とか httpd とか)になります。
サーバー屋さんからhttpdの実行権限について昔注意を受けたことがあったのですが、こんなところで効いてくるのですね。
ありがとうございました~
ということは書き込み権限を与えても、サーバー上でのユーザー権限を持っているユーザーでなければファイルの書き換えなどはできないということですね。
基本的にはそうですが、サーバー上で動作している、ネットワークとやりとりするプログラムは、ネットワークの向こう側からのメッセージに応じて、サーバー上でローカルに何かすることが出来るわけですから、ネットワークとやりとりするプログラムは予期せぬ動作をしないように(セキュリティホールがないように)慎重につくる必要があります。
プログラムを実行するユーザとそのプログラムのファイルの所有者とは同じでも別でもありえます。そのファイルのアクセス権が700であればファイルの所有者しか実行できませんが。
そのプログラムはどのようなやり方で実行していますか? 普段作業している一般ユーザでシェルから手動であるいはcronなどで実行しているのでしたらその一般ユーザです。その場合、その一般ユーザを、HTTPDのグループ(たぶんwww-data)に属させればいいです。
# groups ユーザ名
で確認、
# usermod -G 今属しているグループ名をコンマ区切りで列挙,www-data ユーザ名
でwww-dataを追加します(rootで実行)。
コマンドまでわざわざありがとうございます
調べてみてグループで実行できるようになんとかやってみたいと思います。
今までファイルの所有者を気にすることはあっても、グループを気にすることはほとんどなかったのですが、今後気をつけてうまく利用していきたいと思います。
ありがとうございました!
コマンドまでわざわざありがとうございます
調べてみてグループで実行できるようになんとかやってみたいと思います。
今までファイルの所有者を気にすることはあっても、グループを気にすることはほとんどなかったのですが、今後気をつけてうまく利用していきたいと思います。
ありがとうございました!