SlideShare a Scribd company logo
Memcached + SELinux engine


   OSS開発勉強会-06

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



            OSS Development Study Meeting-06   1
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
Memcachedシステムイメージ
                                Web-Server




  User

                               Web-Apps                   PostgreSQL
 ライブラリが接続先の
 ライブラリが接続先の
 Memcachedサーバを選択
 Memcachedサーバを選択             libmemcached

                                                        Memcached



個々のMemcachedサーバは
個々のMemcachedサーバは
互いに独立にKey-Valueペアを
互いに独立にKey-Valueペアを
格納する
格納する

                     OSS Development Study Meeting-06                  3
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
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
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
議論を通じた仕様の変更
 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
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
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
SELinux対応Memcached

 必要機能
  Key-Valueペアを格納し、高速に探索する
  (できれば Persistent Storage 機能もサポート)
  Key-Valueペアにセキュリティコンテキストを関連付け
  本体側からの呼び出し時にアクセス制御を行う
 方針
  Key-Valueペアは mmap(2) した領域に配置
      容易に Persistent Storage 化可能
  B+Treeインデックスを用いる
      サイズの増減に柔軟に対処できる。順スキャン可能。




                  OSS Development Study Meeting-06   10
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
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
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
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
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
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
ベンチマーク
                      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
設定パラメータ
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
おしまい

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

More Related Content

PPTX
OpenStack概要 ~仮想ネットワーク~
PDF
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
PDF
CloudFoundry 2 on Apache CloudStack 4.2.1
PPTX
SCUGJ第18回勉強会:よろしい、ならばVMMだ
PDF
IaaSクラウドを支える基礎技術 演習編_v1_0
PDF
IaaSクラウドを支える基礎技術 v1_0
PDF
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack入門
PDF
4章 Linuxカーネル - 割り込み・例外 2
OpenStack概要 ~仮想ネットワーク~
スレッド単位で権限分離を行うWebサーバのアクセス制御アーキテクチャ
CloudFoundry 2 on Apache CloudStack 4.2.1
SCUGJ第18回勉強会:よろしい、ならばVMMだ
IaaSクラウドを支える基礎技術 演習編_v1_0
IaaSクラウドを支える基礎技術 v1_0
H26第1回 沖縄オープンラボラトリ・ハンズオンセミナー:OpenStack入門
4章 Linuxカーネル - 割り込み・例外 2

What's hot (20)

PPTX
Azure Fabric Service Reliable Collection
PDF
入門!Software Defined Network
PDF
Kubernetes Security with DevSecOps
PPTX
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
PDF
OpenStack(RDO/Grizzly) ダッシュボード利用演習
PDF
知らないと地味にハマるOpen stackインストール時の注意点
PPTX
OpenStackで始めるクラウド環境構築入門
PDF
#02-01 ZFS によるストレージ仮想化 (2012-04-20)
PDF
4章 Linuxカーネル - 割り込み・例外 5
PDF
4章 Linuxカーネル - 割り込み・例外 4
PDF
Oracle solaris 10 u9 iSCSI Boot
PPTX
RDOを使ったOpenStack Havana - Neutron 構築編
PDF
第1回 松本勉強会 2012 05 11 - 公開版
PPTX
Deep-Dive into Scriptable Build Pipeline
PDF
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
PPTX
KubernetesバックアップツールVeleroとちょっとした苦労話
PPTX
SCIS 2016: An efficient slab encryption using extended SASL protocol
PDF
OpenStackトラブルシューティング入門
PDF
OpenStackで始めるクラウド環境構築入門
PPTX
OpenStack マルチノード環境構築
Azure Fabric Service Reliable Collection
入門!Software Defined Network
Kubernetes Security with DevSecOps
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
OpenStack(RDO/Grizzly) ダッシュボード利用演習
知らないと地味にハマるOpen stackインストール時の注意点
OpenStackで始めるクラウド環境構築入門
#02-01 ZFS によるストレージ仮想化 (2012-04-20)
4章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 4
Oracle solaris 10 u9 iSCSI Boot
RDOを使ったOpenStack Havana - Neutron 構築編
第1回 松本勉強会 2012 05 11 - 公開版
Deep-Dive into Scriptable Build Pipeline
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
KubernetesバックアップツールVeleroとちょっとした苦労話
SCIS 2016: An efficient slab encryption using extended SASL protocol
OpenStackトラブルシューティング入門
OpenStackで始めるクラウド環境構築入門
OpenStack マルチノード環境構築
Ad

Similar to memcached + selinux engine (20)

PDF
OSS開発勉強会-06
PDF
Kyoto Tycoon Guide in Japanese
PDF
SaaS/クラウドコンピューティングでのオープンソース活用とセキュリティ
PDF
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
PDF
Oss dev-04
PDF
社内勉強会資料(Varnish Module)
PDF
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
PDF
Basic of virtual memory of Linux
PDF
GMOメディア RHEV-S-事例紹介
PPTX
絵で見てわかる 某分散データストア
PDF
PostgreSQLバックアップの基本
PDF
MySQL de NoSQL Fukuoka
PDF
ソーシャルゲームにおけるAWS/MongoDB利用事例
PPTX
An extension of cryptographic protocol in distributed in-memory caching syst...
PDF
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
PDF
ラボユース最終成果報告会(Web公開版)
PDF
Cloudian nosql casestudy_20120318
PDF
Trema day 1
PDF
WDD2012_SC-004
PDF
先進的計算基盤システムシンポジウム SACSIS2009 Slide Suzaki
OSS開発勉強会-06
Kyoto Tycoon Guide in Japanese
SaaS/クラウドコンピューティングでのオープンソース活用とセキュリティ
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Oss dev-04
社内勉強会資料(Varnish Module)
ソーシャルゲームにおけるMongoDB適用事例 - Animal Land
Basic of virtual memory of Linux
GMOメディア RHEV-S-事例紹介
絵で見てわかる 某分散データストア
PostgreSQLバックアップの基本
MySQL de NoSQL Fukuoka
ソーシャルゲームにおけるAWS/MongoDB利用事例
An extension of cryptographic protocol in distributed in-memory caching syst...
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
ラボユース最終成果報告会(Web公開版)
Cloudian nosql casestudy_20120318
Trema day 1
WDD2012_SC-004
先進的計算基盤システムシンポジウム SACSIS2009 Slide Suzaki
Ad

More from Kohei KaiGai (20)

PDF
20221116_DBTS_PGStrom_History
PDF
20221111_JPUG_CustomScan_API
PDF
20211112_jpugcon_gpu_and_arrow
PDF
20210928_pgunconf_hll_count
PDF
20210731_OSC_Kyoto_PGStrom3.0
PDF
20210511_PGStrom_GpuCache
PDF
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
PDF
20201128_OSC_Fukuoka_Online_GPUPostGIS
PDF
20201113_PGconf_Japan_GPU_PostGIS
PDF
20201006_PGconf_Online_Large_Data_Processing
PDF
20200828_OSCKyoto_Online
PDF
20200806_PGStrom_PostGIS_GstoreFdw
PDF
20200424_Writable_Arrow_Fdw
PDF
20191211_Apache_Arrow_Meetup_Tokyo
PDF
20191115-PGconf.Japan
PDF
20190926_Try_RHEL8_NVMEoF_Beta
PDF
20190925_DBTS_PGStrom
PDF
20190909_PGconf.ASIA_KaiGai
PDF
20190516_DLC10_PGStrom
PDF
20190418_PGStrom_on_ArrowFdw
20221116_DBTS_PGStrom_History
20221111_JPUG_CustomScan_API
20211112_jpugcon_gpu_and_arrow
20210928_pgunconf_hll_count
20210731_OSC_Kyoto_PGStrom3.0
20210511_PGStrom_GpuCache
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20201128_OSC_Fukuoka_Online_GPUPostGIS
20201113_PGconf_Japan_GPU_PostGIS
20201006_PGconf_Online_Large_Data_Processing
20200828_OSCKyoto_Online
20200806_PGStrom_PostGIS_GstoreFdw
20200424_Writable_Arrow_Fdw
20191211_Apache_Arrow_Meetup_Tokyo
20191115-PGconf.Japan
20190926_Try_RHEL8_NVMEoF_Beta
20190925_DBTS_PGStrom
20190909_PGconf.ASIA_KaiGai
20190516_DLC10_PGStrom
20190418_PGStrom_on_ArrowFdw

memcached + selinux engine

  • 1. Memcached + SELinux engine OSS開発勉強会-06 KaiGai Kohei (@kkaigai) <kaigai@kaigai.gr.jp> OSS Development Study Meeting-06 1
  • 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. Memcachedシステムイメージ Web-Server User Web-Apps PostgreSQL ライブラリが接続先の ライブラリが接続先の Memcachedサーバを選択 Memcachedサーバを選択 libmemcached Memcached 個々のMemcachedサーバは 個々のMemcachedサーバは 互いに独立にKey-Valueペアを 互いに独立にKey-Valueペアを 格納する 格納する OSS Development Study Meeting-06 3
  • 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. 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. 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. 議論を通じた仕様の変更 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. 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. 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. SELinux対応Memcached 必要機能 Key-Valueペアを格納し、高速に探索する (できれば Persistent Storage 機能もサポート) Key-Valueペアにセキュリティコンテキストを関連付け 本体側からの呼び出し時にアクセス制御を行う 方針 Key-Valueペアは mmap(2) した領域に配置 容易に Persistent Storage 化可能 B+Treeインデックスを用いる サイズの増減に柔軟に対処できる。順スキャン可能。 OSS Development Study Meeting-06 10
  • 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. 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. 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. 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. 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. 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. ベンチマーク 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. 設定パラメータ 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. おしまい 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