Skip to content

Instantly share code, notes, and snippets.

@shogochiai
Last active August 29, 2015 14:23
Show Gist options
  • Save shogochiai/5ae52b1e606996132edf to your computer and use it in GitHub Desktop.
Save shogochiai/5ae52b1e606996132edf to your computer and use it in GitHub Desktop.
security_model.md

#概説

honeybaseという名のフレームワークの、route毎のアクセス制限の実装案です。

ホワイトリスト形式でアクセス可能なpath, table, action, role, paramsの組み合わせを定義します 登録されていない組み合わせによるアクセス全て拒否します。 このファイルはphp(laravel)製のhoneybase-server側で読み込まれます。RailsやRevel(go)でも同じように実装します。 全ての/api/v1以下のAPI(honeybase interface)を用いるrequestにフィルタ処理をかけます。

http通信のリファラを元にpathを判断し、honeybase-clientの通信が持つtable, action, current_user, params情報を元にtable, action, roke, paramsがマッチするか判定します。

基本的にSSL通信を行うので, APIを外部から改ざんして直接叩く事は難しいです。フレームワークにはtinycertという無料のテスト用SSLをとりあえず入れておいて、プロダクション移行時にラピッドSSLなどの安価なSSLくらいを使えばいいかなと。

RDBを用いたWEBサービスの設計の要を「テーブル構造」と「ルーティング」だと捉えました。 これまで仮実装でデータベースに対してアクセス制限を定義していましたが、honeybase-clientを実行できるpathも制限する事が、よくあるWEBサービスのセキュリティモデルにおいて重要だと考えました。

実装案

{
  "/" : {
    "honeybase" : ["auth"],
  },
  "/choose" : {
    "honeybase" : ["uploader"],
    "database" : {
      "teams" : {
        "insert" : {
          "role" : "login",
          "params" : ["name", "owner_id", "team_cover", "link", "description", "created_at", "updated_at"]
        },
        "select" : {
          "role" : "login",
          "params" : ["name", "owner_id", "team_cover", "link", "description", "created_at", "updated_at"]
        }
      }
    }
  },
  "/admin" : {
    "database" : {
      "feed" : {
        "insert" : {
          "role" : "admin",
          "params" : ["text", "user_id", "notification_flg", "created_at", "updated_at"]
        }
      }
    }
  },
  "/my/feed" : {
    "database" : {
      "feeds" : {
        "insert" : {
          "role" : "login",
          "params" : ["text", "user_id", "notification_flg", "created_at", "updated_at"]
        },
        "select" : {
          "role" : "login",
          "params" : ["id", "text", "user_id", "notification_flg", "created_at", "updated_at"]
        }
      }
    }
  },
  "/my/teams" : {
    "database" : {
      "teams" : {
        "insert" : {
          "role" : "login",
          "params" : ["name", "owner_id", "team_cover", "link", "description", "created_at", "updated_at"]
        },
        "select" : {
          "role" : "login",
          "params" : ["name", "owner_id", "team_cover", "link", "description", "created_at", "updated_at"]
        }
      }
    }
  },
  "/my/messages" : {
    "database" : {
      "messages" : {
        "insert" : {
          "role" : "login",
          "params" : ["body", "sender_id", "receiver_id", "read_flag", "created_at", "updated_at"]
        },
        "select" : {
          "role" : "login",
          "params" : ["body", "sender_id", "receiver_id", "read_flag", "created_at", "updated_at"]
        }
      }
    }
  }

}

アプリの場合:アプリでアカウントシステムを作った事がないので学びが必要だが、基本的に大枠は変わらないと理解しているので、知識の欠陥を埋めて行く。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment