Memcached + SELinux engine


   OSS開発勉強会-06

   KaiGai Kohei (@kkaigai)
   <kaigai@kaigai.gr.jp>



            OSS Develo...
Memcachedの特徴

 Key-Valueストア
  <Key>に対応する<Value>を保存/取得するだけの機能
  トランザクション、検索式、型定義...など無い! 速さこそ正義
 分散システム
  Memcachedサーバ自体に一切...
Memcachedシステムイメージ
                                Web-Server




  User

                               Web-Apps          ...
Memcached 内部構造

      GET aaa                              get_item()

                                                   ...
Memcached Engine (1/2)

 Engine Interface v1
   次期メジャーバージョン(v1.6.x系)の新機能
 typedef struct engine_interface_v1 {
     :
    ...
Memcached Engine (2/2)

 オリジナルRFC
 Memcache Engine Interface (Dec, 18 2008)
 http://code.google.com/p/memcached/wiki/Engin...
議論を通じた仕様の変更
 socket-fdを取得するServerAPIの追加
  SELinuxはgetpeercon(3)にsockfdを与えて、
  接続元プロセスの権限 (=security context) を取得するため
  SER...
Memcached and Security
               (3) Not run as root
                (3) Not run as root
 Memcached




   (2) SASL a...
SELinuxによるアクセス制御
                                                        “機密” 情報は、どこに格納
   SELinux

                Securi...
SELinux対応Memcached

 必要機能
  Key-Valueペアを格納し、高速に探索する
  (できれば Persistent Storage 機能もサポート)
  Key-Valueペアにセキュリティコンテキストを関連付け
  ...
selinux_engine.so の構成
                               Engine V1
  Memcached
                             インターフェース
    本体


...
mblock.c
mchunk_t 構造体の定義(tag値による多様性を持つ)
MCHUNK_TAG_FREE       MCHUNK_TAG_ITEM          MCHUNK_TAG_BTREE       MCHUNK_TAG_L...
mbtree.c
                                            K0                    KN-1
                                       V0 ...
mcache.c
                    mcache_t 構造体                             mcache_t 構造体    mcache_t 構造体
mcache ハッシュ表



       ...
interface.c
 create_instance()で、コールバックの関数ポインタを登録
 イベントに応じて登録した関数が呼び出される
 SETコマンド処理の例
本体側                                  ...
selinux.c
  アクセス制御を行う関数群
  interface.c 内の各メソッドから呼び出され、
  SELinuxにアクセス制御の問い合わせを行う。
     ‘denied’の結果が返却されれば、ERROR_EACCESSを呼出...
ベンチマーク
                      default
                       default               selinux
                                ...
設定パラメータ
filename=<fname>
  <fname> をストレージとして mmap(2) する。デフォルトは匿名マッピング
size = <total_size>
  mmap(2)するサイズ。PageSizeの倍数でなければな...
おしまい

Twitterでの質問先
    @kkaigai
ソースコードの入手先
%   svn co http://sepgsql.googlecode.com/svn/trunk/memcached
%   cd memcached
%...
Upcoming SlideShare
Loading in …5
×

memcached + selinux engine

1,835 views

Published on

OSS開発勉強会-06の資料

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,835
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

memcached + selinux engine

  1. 1. Memcached + SELinux engine OSS開発勉強会-06 KaiGai Kohei (@kkaigai) <kaigai@kaigai.gr.jp> OSS Development Study Meeting-06 1
  2. 2. Memcachedの特徴 Key-Valueストア <Key>に対応する<Value>を保存/取得するだけの機能 トランザクション、検索式、型定義...など無い! 速さこそ正義 分散システム Memcachedサーバ自体に一切の分散機能は無い ライブラリがKey値に応じたMemcachedサーバを選択して接続 memcached プロトコル テキストベースのシンプルなプロトコル http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt 多くの互換Key-Valueストア Tokyo Tyrant, Repocached, Flared, KumoFS, ... OSS Development Study Meeting-06 2
  3. 3. Memcachedシステムイメージ Web-Server User Web-Apps PostgreSQL ライブラリが接続先の ライブラリが接続先の Memcachedサーバを選択 Memcachedサーバを選択 libmemcached Memcached 個々のMemcachedサーバは 個々のMemcachedサーバは 互いに独立にKey-Valueペアを 互いに独立にKey-Valueペアを 格納する 格納する OSS Development Study Meeting-06 3
  4. 4. Memcached 内部構造 GET aaa get_item() Key-Value ‘xyzxyz’ プロトコル処理部 hash_item * ストレージ Key-Value ストレージ libevent with New Feature プロトコル解析部 Key-Valueストレージ これ、Key-Valueストレージの部分を モジュール化できるよね? OSS Development Study Meeting-06 4
  5. 5. Memcached Engine (1/2) Engine Interface v1 次期メジャーバージョン(v1.6.x系)の新機能 typedef struct engine_interface_v1 { : /** * Retrieve an item. * * @param handle the engine handle * @param cookie The cookie provided by the frontend * @param item output variable that will receive the located item * @param key the key to look up * @param nkey the length of the key * @param vbucket the virtual bucket id * こんな感じでInterfaceが こんな感じでInterfaceが * @return ENGINE_SUCCESS if all goes well 定義されている 定義されている */ ENGINE_ERROR_CODE (*get)(ENGINE_HANDLE* handle, const void* cookie, item** item, const void* key, const int nkey, uint16_t vbucket); OSS Development Study Meeting-06 5
  6. 6. Memcached Engine (2/2) オリジナルRFC Memcache Engine Interface (Dec, 18 2008) http://code.google.com/p/memcached/wiki/EngineInterface Engine-Interfaceとは? Key-Valueペアの管理をプラグインに任せる 何がいいのか? 独自の拡張機能ごとに “memcachedクローン” を作らずに済む Persistent Storage, Name Space, Access Control, etc... 本体 ⇔ プラグイン間のインターフェースを規定 ENGINE_HANDLE_V1構造体: 本体 プラグインの呼び出し SERVER_HANDLE_V1構造体: プラグイン 本体の呼び出し OSS Development Study Meeting-06 6
  7. 7. 議論を通じた仕様の変更 socket-fdを取得するServerAPIの追加 SELinuxはgetpeercon(3)にsockfdを与えて、 接続元プロセスの権限 (=security context) を取得するため SERVER_HANDLE_V1構造体 に get_socket_fd() が追加 ->delete() の手順を変更 従来の実装 1. ->get() に Key値を与えて呼び出し、本体は item *ポインタを取得 2. ->delete()に item *ポインタを与えてKey-Valueペアの削除 問題点 ->get()内で評価すべきパーミッションは、 “read権限”なのか、それとも”delete”権限なのか、特定できない 修正後の実装 ->delete() にKey値を与えるよう ENGINE_HANDLE_V1構造体を修正 OSS Development Study Meeting-06 7
  8. 8. Memcached and Security (3) Not run as root (3) Not run as root Memcached (2) SASL auth, (2) SASL auth, (1) Firewalling, ififneeded Web Apps (1) Firewalling, needed always always Web Server できる事はほとんど何もない 絶対に外部ネットワークから接続可能にしちゃダメ 一応、SASL認証で接続の可否を決める事はできる あと、root権限で走らせてはならない Memcached Security; by Dustin Sallings http://dustin.github.com/2010/08/08/memcached-security.html OSS Development Study Meeting-06 8
  9. 9. SELinuxによるアクセス制御 “機密” 情報は、どこに格納 SELinux Security しても“機密”情報として扱う Policy Filesystem Networks classified unclassified information information memcached RDBMS domain of inter process domain of classified processes communication channels unclassified processes OSS Development Study Meeting-06 9
  10. 10. SELinux対応Memcached 必要機能 Key-Valueペアを格納し、高速に探索する (できれば Persistent Storage 機能もサポート) Key-Valueペアにセキュリティコンテキストを関連付け 本体側からの呼び出し時にアクセス制御を行う 方針 Key-Valueペアは mmap(2) した領域に配置 容易に Persistent Storage 化可能 B+Treeインデックスを用いる サイズの増減に柔軟に対処できる。順スキャン可能。 OSS Development Study Meeting-06 10
  11. 11. selinux_engine.so の構成 Engine V1 Memcached インターフェース 本体 Engine V1 の Engine V1 の フック関数 interface.c selinux.c フック関数 Key/Valueペア管理、 SELinuxを用いた SELinuxを用いた Key/Valueペア管理、 mcache.c セキュリティラベル アクセス制御 アクセス制御 セキュリティラベル B+木インデックス B+木インデックス mbtree.c メモリブロックの メモリブロックの mblock.c alloc()/free() alloc()/free() selinux_engine.so OSS Development Study Meeting-06 11
  12. 12. mblock.c mchunk_t 構造体の定義(tag値による多様性を持つ) MCHUNK_TAG_FREE MCHUNK_TAG_ITEM MCHUNK_TAG_BTREE MCHUNK_TAG_LABEL uint16 magic uint16 magic uint16 magic uint16 magic uint8 mclass uint8 mclass uint8 mclass uint8 mclass uint8 tag uint8 tag uint8 tag uint8 tag mlist_t list uint16_t flags uint64_t parent uint32_t secid uint64_t prev uint16_t keylen uint8_t is_leaf uint32_t refcount uint64_t next uint32_t datalen uint16_t nkeys uint8_t value[0] uint32_t secid uint32_t keys[N] uint32_t exptime uint8_t data[0] uint64_t items[N+1] mmap(2)した領域を 2^N サイズ単位で割り当て・解放する Buddyアルゴリズムを用いたメモリ管理 シンプルで領域の分割併合を行いやすい方法 最悪の場合、メモリ利用率は 50% そこそこに…。 別の mchunk_t を参照する際にポインタを使えない。 uint64_t 幅のオフセット値を使用する OSS Development Study Meeting-06 12
  13. 13. mbtree.c K0 KN-1 V0 V1 VN-1 VN K0 K1 K2 K0 K1 K2 V0 V1 V2 V3 V0 V1 V2 V3 K0 K1 K2 K0 K1 K2 K0 K1 K2 null K0 K1 K2 V0 V1 V2 V3 V0 V1 V2 V3 V0 V1 V2 V3 V0 V1 V2 V3 MCHUNK_TAG_ITEM MCHUNK_TAG_LABEL uint32_t型のキーと、uint64_t型の値からなるB+木構造 uint32_t : 真のキーをハッシュ化した値 uint64_t : ITEMやLABELチャンクへのオフセット値 ハッシュと比べ、データ量が増えた時の再編コストが安い default_engine.so は、アイテム数に応じてハッシュスロットの数を増減する OSS Development Study Meeting-06 13
  14. 14. mcache.c mcache_t 構造体 mcache_t 構造体 mcache_t 構造体 mcache ハッシュ表 mcache_t *next int refcnt bool is_hot security_id_t tsid MCHUNK_TAG_LABEL mchunk_t *mchunk MCHUNK_TAG_ITEM Key-Valueペアを表現するデータ構造 tsid パース済みの MCHUNK_TAG_LABEL mchunk MCHUNK_TAG_ITEM へのポインタ データ構造の目的 Key-Valueに対応するセキュリティラベルを毎度々々探索せずに済むように 最近使った Key-Value を疑似LRUで繋いでおく refcnt の操作によって、mmap(2)したページが Dirty にならないように Dirtyになると、ファイルをmmap(2)した時に I/O が発生するので。 OSS Development Study Meeting-06 14
  15. 15. interface.c create_instance()で、コールバックの関数ポインタを登録 イベントに応じて登録した関数が呼び出される SETコマンド処理の例 本体側 モジュール側 process_update_command() ->allocate() メソッド SETコマンドのパース 入力データ用のItemバッファを確保 クライアントからのデータ入力受付準備 確保したItemバッファに対して クライアントからのデータを入力 ->store() メソッド 利用者の write 権限をチェックする 新しいItemをB+木に追加 complete_update_ascii() (必要なら)古いItemをB+木から削除 データを読み込んだItemバッファを インデックスに登録する処理 ->release() メソッド (必要なら古いItemを削除する) 参照カウンタをデクリメント B+木に登録されていなければ、 利用者に store() の実行結果を返却 Itemを開放する STORED/EXISTS/NOT_FOUND/... OSS Development Study Meeting-06 15
  16. 16. selinux.c アクセス制御を行う関数群 interface.c 内の各メソッドから呼び出され、 SELinuxにアクセス制御の問い合わせを行う。 ‘denied’の結果が返却されれば、ERROR_EACCESSを呼出し元に返す Access Vector Cache (AVC)を用いて、システムコール回数を最小化 Query mselinux_check_write() Access Control Decision avc_has_perms() ERROR_SUCCESS or Yes on cache? ERROR_EACCESS No security policy security_compute_av() System-Call SELinux OSS Development Study Meeting-06 16
  17. 17. ベンチマーク default default selinux selinux IPsec(ESP) IPsec(ESP) 191,409 191,409 IPsec(AH) IPsec(AH) 251,485 251,485 No IPsec No IPsec 00 100000 100000 200000 200000 300000 300000 number of commands in 30sec number of commands in 30sec Iteration of GET/SET mixture, 8threads-client, 4core server x 2, Gb-ether Less significant differences in same network environment Penalties in IPsec(AH) communication (~20%?) OSS Development Study Meeting-06 17
  18. 18. 設定パラメータ filename=<fname> <fname> をストレージとして mmap(2) する。デフォルトは匿名マッピング size = <total_size> mmap(2)するサイズ。PageSizeの倍数でなければならない。 use_cas = (true|false) Compare-and-Set操作をサポートするか否か selinux = (true|false) SELinuxサポート(アクセス制御)の有効化/無効化 これを無効化すると、ただのストレージ付きMemcachedになってしまう reclaim = (true|false) 領域の不足時に、既存ItemをReclaimするか否か。 debug = (true|false) デバッグ出力のON/OFF OSS Development Study Meeting-06 18
  19. 19. おしまい Twitterでの質問先 @kkaigai ソースコードの入手先 % svn co http://sepgsql.googlecode.com/svn/trunk/memcached % cd memcached % autoconf % env CPPFLAGS=-I/path/to/memcached/include ./configure % make % su –c ‘make install’ 情報源 Coming soon....  ドキュメントを書きましょう ☺ OSS Development Study Meeting-06 19

×