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

What's hot

Azure Fabric Service Reliable Collection
Azure Fabric Service Reliable CollectionAzure Fabric Service Reliable Collection
Azure Fabric Service Reliable Collection
Takekazu Omi
 
入門!Software Defined Network
入門!Software Defined Network入門!Software Defined Network
入門!Software Defined NetworkEtsuji Nakai
 
Kubernetes Security with DevSecOps
Kubernetes Security with DevSecOpsKubernetes Security with DevSecOps
Kubernetes Security with DevSecOps
Shingo Kitayama
 
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
【第5回東京SoftLayer勉強会】LT7 SoftLayerでOpenStackを動かしてみた
Nobuyuki Matsui
 
OpenStack(RDO/Grizzly) ダッシュボード利用演習
OpenStack(RDO/Grizzly) ダッシュボード利用演習OpenStack(RDO/Grizzly) ダッシュボード利用演習
OpenStack(RDO/Grizzly) ダッシュボード利用演習Etsuji Nakai
 
知らないと地味にハマるOpen stackインストール時の注意点
知らないと地味にハマるOpen stackインストール時の注意点知らないと地味にハマるOpen stackインストール時の注意点
知らないと地味にハマるOpen stackインストール時の注意点
d-shen
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門
VirtualTech Japan Inc.
 
Protecting microsoft azure blobs using net backup with blobfuse jp
Protecting microsoft azure blobs using net backup with blobfuse jpProtecting microsoft azure blobs using net backup with blobfuse jp
Protecting microsoft azure blobs using net backup with blobfuse jp
vxsejapan
 
#02-01 ZFS によるストレージ仮想化 (2012-04-20)
#02-01 ZFS によるストレージ仮想化 (2012-04-20)#02-01 ZFS によるストレージ仮想化 (2012-04-20)
#02-01 ZFS によるストレージ仮想化 (2012-04-20)
SolarisJPNight
 
4章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 54章 Linuxカーネル - 割り込み・例外 5
4章 Linuxカーネル - 割り込み・例外 5
mao999
 
4章 Linuxカーネル - 割り込み・例外 4
 4章 Linuxカーネル - 割り込み・例外 4 4章 Linuxカーネル - 割り込み・例外 4
4章 Linuxカーネル - 割り込み・例外 4
mao999
 
Oracle solaris 10 u9 iSCSI Boot
Oracle solaris 10 u9 iSCSI BootOracle solaris 10 u9 iSCSI Boot
Oracle solaris 10 u9 iSCSI BootKazuyuki Sato
 
RDOを使ったOpenStack Havana - Neutron 構築編
RDOを使ったOpenStack Havana - Neutron 構築編RDOを使ったOpenStack Havana - Neutron 構築編
RDOを使ったOpenStack Havana - Neutron 構築編
VirtualTech Japan Inc.
 
第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版
Ryosuke MATSUMOTO
 
Deep-Dive into Scriptable Build Pipeline
Deep-Dive into Scriptable Build PipelineDeep-Dive into Scriptable Build Pipeline
Deep-Dive into Scriptable Build Pipeline
Haruto Otake
 
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
OpenStackで始めるクラウド環境構築入門(Horizon 基礎編)
VirtualTech Japan Inc.
 
KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話KubernetesバックアップツールVeleroとちょっとした苦労話
KubernetesバックアップツールVeleroとちょっとした苦労話
imurata8203
 
SCIS 2016: An efficient slab encryption using extended SASL protocol
SCIS 2016: An efficient slab encryption using extended SASL protocolSCIS 2016: An efficient slab encryption using extended SASL protocol
SCIS 2016: An efficient slab encryption using extended SASL protocol
Ruo Ando
 
OpenStackトラブルシューティング入門
OpenStackトラブルシューティング入門OpenStackトラブルシューティング入門
OpenStackトラブルシューティング入門
VirtualTech Japan Inc.
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門
VirtualTech Japan Inc.
 

What's hot (20)

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

Similar to memcached + selinux engine

OSS開発勉強会-06
OSS開発勉強会-06OSS開発勉強会-06
OSS開発勉強会-06
Kohei KaiGai
 
Amazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズAmazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズSORACOM, INC
 
OSC2012 Tokyo/Spring JOSUG
OSC2012 Tokyo/Spring JOSUGOSC2012 Tokyo/Spring JOSUG
OSC2012 Tokyo/Spring JOSUG
Hideki Saito
 
VMware vForum/VSS2013にて発表されたNetAppセッションコンテンツ
VMware vForum/VSS2013にて発表されたNetAppセッションコンテンツVMware vForum/VSS2013にて発表されたNetAppセッションコンテンツ
VMware vForum/VSS2013にて発表されたNetAppセッションコンテンツ
NetApp Japan
 
JOSUG 9th Study
JOSUG 9th StudyJOSUG 9th Study
JOSUG 9th Studyirix_jp
 
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
Kuniyasu Suzaki
 
20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public
Amazon Web Services Japan
 
Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517akirahiguchi
 
Share pointを支えるsql server2014最新情報 tokyo_公開用
Share pointを支えるsql server2014最新情報 tokyo_公開用Share pointを支えるsql server2014最新情報 tokyo_公開用
Share pointを支えるsql server2014最新情報 tokyo_公開用Yukio Kumazawa
 
OCP Meetup Tokyo #05 ECK on OCP
OCP Meetup Tokyo #05 ECK on OCPOCP Meetup Tokyo #05 ECK on OCP
OCP Meetup Tokyo #05 ECK on OCP
Tetsuya Sodo
 
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
CODE BLUE
 
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性
kozossakai
 
CloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudCloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloud
samemoon
 
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
NTT DATA Technology & Innovation
 
Java on Kubernetes on Azure
Java on Kubernetes on AzureJava on Kubernetes on Azure
Java on Kubernetes on Azure
Yoshio Terada
 
ASP.NET vNextの全貌
ASP.NET vNextの全貌ASP.NET vNextの全貌
ASP.NET vNextの全貌
A AOKI
 
RFC5717(Partial Lock Remote Procedure Call (RPC) for NETCONF)の勉強資料
RFC5717(Partial Lock Remote Procedure Call (RPC) for NETCONF)の勉強資料RFC5717(Partial Lock Remote Procedure Call (RPC) for NETCONF)の勉強資料
RFC5717(Partial Lock Remote Procedure Call (RPC) for NETCONF)の勉強資料
Tetsuya Hasegawa
 
OSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; OverviewOSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; Overviewirix_jp
 
OpenStack 101
OpenStack 101OpenStack 101
OpenStack 101
Rongze Zhu
 
これから始めるAzure Kubernetes Service入門
これから始めるAzure Kubernetes Service入門これから始めるAzure Kubernetes Service入門
これから始めるAzure Kubernetes Service入門
Yuto Takei
 

Similar to memcached + selinux engine (20)

OSS開発勉強会-06
OSS開発勉強会-06OSS開発勉強会-06
OSS開発勉強会-06
 
Amazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズAmazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズ
 
OSC2012 Tokyo/Spring JOSUG
OSC2012 Tokyo/Spring JOSUGOSC2012 Tokyo/Spring JOSUG
OSC2012 Tokyo/Spring JOSUG
 
VMware vForum/VSS2013にて発表されたNetAppセッションコンテンツ
VMware vForum/VSS2013にて発表されたNetAppセッションコンテンツVMware vForum/VSS2013にて発表されたNetAppセッションコンテンツ
VMware vForum/VSS2013にて発表されたNetAppセッションコンテンツ
 
JOSUG 9th Study
JOSUG 9th StudyJOSUG 9th Study
JOSUG 9th Study
 
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
TEE (Trusted Execution Environment)は第二の仮想化技術になるか?
 
20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public20120117 13 meister-elasti_cache-public
20120117 13 meister-elasti_cache-public
 
Handlersocket 20110517
Handlersocket 20110517Handlersocket 20110517
Handlersocket 20110517
 
Share pointを支えるsql server2014最新情報 tokyo_公開用
Share pointを支えるsql server2014最新情報 tokyo_公開用Share pointを支えるsql server2014最新情報 tokyo_公開用
Share pointを支えるsql server2014最新情報 tokyo_公開用
 
OCP Meetup Tokyo #05 ECK on OCP
OCP Meetup Tokyo #05 ECK on OCPOCP Meetup Tokyo #05 ECK on OCP
OCP Meetup Tokyo #05 ECK on OCP
 
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
 
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性
 
CloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudCloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloud
 
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
 
Java on Kubernetes on Azure
Java on Kubernetes on AzureJava on Kubernetes on Azure
Java on Kubernetes on Azure
 
ASP.NET vNextの全貌
ASP.NET vNextの全貌ASP.NET vNextの全貌
ASP.NET vNextの全貌
 
RFC5717(Partial Lock Remote Procedure Call (RPC) for NETCONF)の勉強資料
RFC5717(Partial Lock Remote Procedure Call (RPC) for NETCONF)の勉強資料RFC5717(Partial Lock Remote Procedure Call (RPC) for NETCONF)の勉強資料
RFC5717(Partial Lock Remote Procedure Call (RPC) for NETCONF)の勉強資料
 
OSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; OverviewOSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; Overview
 
OpenStack 101
OpenStack 101OpenStack 101
OpenStack 101
 
これから始めるAzure Kubernetes Service入門
これから始めるAzure Kubernetes Service入門これから始めるAzure Kubernetes Service入門
これから始めるAzure Kubernetes Service入門
 

More from Kohei KaiGai

20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History
Kohei KaiGai
 
20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API
Kohei KaiGai
 
20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow
Kohei KaiGai
 
20210928_pgunconf_hll_count
20210928_pgunconf_hll_count20210928_pgunconf_hll_count
20210928_pgunconf_hll_count
Kohei KaiGai
 
20210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.020210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.0
Kohei KaiGai
 
20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache
Kohei KaiGai
 
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
Kohei KaiGai
 
20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS
Kohei KaiGai
 
20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGIS20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGIS
Kohei KaiGai
 
20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing
Kohei KaiGai
 
20200828_OSCKyoto_Online
20200828_OSCKyoto_Online20200828_OSCKyoto_Online
20200828_OSCKyoto_Online
Kohei KaiGai
 
20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdw20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdw
Kohei KaiGai
 
20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw
Kohei KaiGai
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo
Kohei KaiGai
 
20191115-PGconf.Japan
20191115-PGconf.Japan20191115-PGconf.Japan
20191115-PGconf.Japan
Kohei KaiGai
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta
Kohei KaiGai
 
20190925_DBTS_PGStrom
20190925_DBTS_PGStrom20190925_DBTS_PGStrom
20190925_DBTS_PGStrom
Kohei KaiGai
 
20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai
Kohei KaiGai
 
20190516_DLC10_PGStrom
20190516_DLC10_PGStrom20190516_DLC10_PGStrom
20190516_DLC10_PGStrom
Kohei KaiGai
 
20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw
Kohei KaiGai
 

More from Kohei KaiGai (20)

20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History20221116_DBTS_PGStrom_History
20221116_DBTS_PGStrom_History
 
20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API20221111_JPUG_CustomScan_API
20221111_JPUG_CustomScan_API
 
20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow20211112_jpugcon_gpu_and_arrow
20211112_jpugcon_gpu_and_arrow
 
20210928_pgunconf_hll_count
20210928_pgunconf_hll_count20210928_pgunconf_hll_count
20210928_pgunconf_hll_count
 
20210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.020210731_OSC_Kyoto_PGStrom3.0
20210731_OSC_Kyoto_PGStrom3.0
 
20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache
 
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index20210301_PGconf_Online_GPU_PostGIS_GiST_Index
20210301_PGconf_Online_GPU_PostGIS_GiST_Index
 
20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS20201128_OSC_Fukuoka_Online_GPUPostGIS
20201128_OSC_Fukuoka_Online_GPUPostGIS
 
20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGIS20201113_PGconf_Japan_GPU_PostGIS
20201113_PGconf_Japan_GPU_PostGIS
 
20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing20201006_PGconf_Online_Large_Data_Processing
20201006_PGconf_Online_Large_Data_Processing
 
20200828_OSCKyoto_Online
20200828_OSCKyoto_Online20200828_OSCKyoto_Online
20200828_OSCKyoto_Online
 
20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdw20200806_PGStrom_PostGIS_GstoreFdw
20200806_PGStrom_PostGIS_GstoreFdw
 
20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw20200424_Writable_Arrow_Fdw
20200424_Writable_Arrow_Fdw
 
20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo20191211_Apache_Arrow_Meetup_Tokyo
20191211_Apache_Arrow_Meetup_Tokyo
 
20191115-PGconf.Japan
20191115-PGconf.Japan20191115-PGconf.Japan
20191115-PGconf.Japan
 
20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta20190926_Try_RHEL8_NVMEoF_Beta
20190926_Try_RHEL8_NVMEoF_Beta
 
20190925_DBTS_PGStrom
20190925_DBTS_PGStrom20190925_DBTS_PGStrom
20190925_DBTS_PGStrom
 
20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai20190909_PGconf.ASIA_KaiGai
20190909_PGconf.ASIA_KaiGai
 
20190516_DLC10_PGStrom
20190516_DLC10_PGStrom20190516_DLC10_PGStrom
20190516_DLC10_PGStrom
 
20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw20190418_PGStrom_on_ArrowFdw
20190418_PGStrom_on_ArrowFdw
 

Recently uploaded

「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 

Recently uploaded (7)

「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 

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