- 締切済み
会員制サービス上での、各種アカウントの扱い
LAPP(Linux + Apache + PostgreSQL + PHP)環境で、下記のようなWebアプリケーションの開発を仮定します。 ・会員制のサービスで、メンバーにはメールアドレスを付与する。(Postfix使用) ・そのメールアカウントは、メールボックスに配信 or 登録されたアドレスに転送する機能を持つ。 ・メールボックスに配信するか転送するか、及び、転送先アドレスは各ユーザがPHP経由でDBに登録・変更。 ・会員同士が利用できる掲示板(書き込み削除は、投稿者または管理者のみに許可)を提供する。 ・その他こまごまとした一般的なシステムを提供する。(まだ具体的ではありません) ここで、アカウントと呼べるものは、 A: このサービスのアカウント(DB上のテーブルで管理) B: Linuxのユーザーアカウント C: データベースアカウント があると思いますが、それぞれのAのアカウントに、B,Cのシステム上のアカウントも発行すべきでしょうか? (B,Cのアカウントは、システム内部で使用するもので、ユーザーが直接使用するものではありません。) パターン1 : Aのアカウントのみ。DB等にアクセスする場合は、一般ユーザー用の共用アカウントを使用する。 パターン2 : Aのアカウントに対応する、B,Cのアカウントを発行して、ユーザー毎にそれぞれのアカウントを使用する。 パターン2の方が、B,Cのアカウントに対する権限が細かく設定できるようになるので、セキュリティを上げられる可能性があると思っています。(その分、管理は大変になると思いますが。) そこで、それぞれのメリット・デメリット、セオリー(一般的にはどちらのパターンが使用されるか)、その他パターンの可能性をご教授願えれば、と思っています。 よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- nebel
- ベストアンサー率37% (117/308)
システムの設計次第だとおもいますが。 まず、Aは必須ですよね。 ここでお尋ねしたいのは、BとCのアカウントは何のために必要なのか?です。 機能としては、 ・メールアドレスの付与 ・掲示板の利用 が確定しているようですが、この2つの機能だけなら、別にBとCは不要なわけで。 BとCをユーザー毎に作らない方が、セキュリティ的には好ましいでしょう。 結局、その他こまごまとした一般的なシステムの中身次第で、BとCが本来的に必要なのかどうか決りますね。 無用なシステムアカウントなどはないほうが、セキュリティ的には好ましいです
補足
nebelさん、こんにちは。ご回答ありがとうございます。 Linuxアカウントは、メールを「転送」ではなく「メールボックスに配信」にした場合に、Postfixに対して必須かな、と思いました。実際に必要かどうかは勉強不足です。すいません^^; DBアカウントは、ユーザー毎に、各テーブルに対する SELECT,INSERT,UPDATE,DELETE の権限を設定した方が、高いセキュリティを維持できると考えました。例えば、「その他こまごまとした一般的なシステム」として「ToDoリスト」を例に挙げてみます。 ToDoリスト(todo)テーブル(カラム構成は、通し番号(id),ユーザー名(username),内容(body))に対して、ユーザー毎にビューを定義(CREATE VIEW todo_pe_daichan (id, body) AS SELECT * FROM todo WHERE username = 'pe_daichan';)し、ビュー todo_pe_daichanに対しては、ユーザー pe_daichan しかアクセスできないようにする。 この場合、プログラマの意図通りのSQLしか発行されないのであれば、SELECT の WHERE句に、必ず username = '[ユーザー名]' が入っていれば、todoテーブルに対して操作を行う方式でも問題は発生しません。が、万一SQLインジェクション等で username による限定が外れてしまった場合(当然インジェクションを防げるよう留意してプログラミングを行いますが)、他人のToDoの内容が漏れる可能性が出てきます。 そこで、上記のようなビューをユーザー毎に定義し、各Aアカウントに対してCアカウントも発行し、todoに関しては自分用のビューにしかアクセスできないような仕様にしておけば上記の不安が多少なりとも改善するような気がします。 上記は例の一つですが、似たようなケースは多いと思います。そういう場合では、どうでしょう? また、「ToDoリストくらい漏れても大ごとじゃ無い」という考えもありますが^^;、例えばこれがToDoリストではなく、個人情報・機微情報だったりしたら、どうでしょう?