Keystone+LDAP+LAMでOpenStack管理

Quantum周りのたった1つの問題に1週間以上ハマって絶望するも、
絞りだすような勘で生還してブログ再開!!

今回はなんとっ!KeystoneデータをLDAPで管理するという一風変わった情報をお届けします!



LDAPを採用した理由

どうしてわざわざLDAPにしたのか、というと、

まず、既にLDAPが存在し、他の複数のソフトウェアのアカウント管理に用いていたため、OpenStackも同様に既存のLDAPユーザでログインしたかった、というのが1つ。

次に、LDAPユーザから削除された(例えば退職したとか)場合に、そのユーザが管理していたVMを自動的に(もしくは一括して)削除できるようにすることで、VMをより管理しやすくしたかったから。Horizonの表示上は見えませんが、実は novadb.instances テーブルには user_id が保存されているし、nova-manage vm list でも確認できるので、実現することは容易いです。

ということで、ユーザデータだけは既存LDAPのデータを使用し、それ以外のテナントやロールは新規に作成。さらに、一部を除いてデータ管理は keystone コマンドではなく、LDAP Account Manager(LAM)で行うというルールの元に構築していっています。


LDAPサーバslapdの構築

テストデータとなる slapd をControllerNodeにでも作成します。

パッケージインストール

設定は以下のようにしています。

  • 組織DNS : openstack.org
  • バックエンド : HDB
  • DN管理者 : admin / rootpass
  • 設定

    パスワードのSSHAを取得し、設定ファイルに利用します。

    設定ファイルを作成します。

    /etc/ldap/slapd.conf

    今回は slapd.conf で設定したため、slapd.d はどけておく必要があります。

    schema修正

    Keystone+LDAPが必要としている項目 enabled をスキーマに追加します。
    編集対象が core.schema なのが心苦しいですが、仕方ありません。
  • (参考)Re: [Keystone] Creating tenant failed when using ldap as identity backend: ‘attribute type undefined’

  • /etc/ldap/schema/core.schema

    DB_CONFIG

    これは好みで設定しておきます。

    /var/lib/ldap/DB_CONFIG

    設定したら再起動します。


    LDAPに基本データを入れる

    必要な ou を入れます。
    domains はGrizzlyから必要になっています。
    全て同じ階層に作成していますが、users だけ別の階層にしたりしても、問題なく動作します。

    usersのみ既存データを想定しているので、実際は、わかりやすくするためにusers以外は1つdc階層を下げました

    suffix を別にすることは slapd において可能ではありますが、1つのLAMで管理できなくなるので不採用にしています

    /etc/keystone/openstack.ldif

    LDIFを作成したら、追加します。


    LAM (LDAP Account Manager) のインストール

    パッケージ

    設定

    管理ユーザ や OU を編集します。

    /var/lib/ldap-account-manager/config/lam.conf


    Apacheの設定

    ログ排除条件を指定して、

    /etc/apache2/conf.d/logenv.conf

    元のサイト設定を削除して

    VirtualHostでちゃんと指定しておきます。(※プライベートDNSに追加できれば)

    /etc/apache2/sites-available/lam

    他、security系とか好みで編集したら、
    設定を有効にしてリロードします。


    LAMでデータ作成

    LAMにアクセスしてみます。
  • http://ldap.openstack.org/lam/

  • LAMでOpenStack管理ユーザと、一般ユーザのグループ/ユーザを作成しておきます。
  • openstack:10000 グループを作る
  • OpenStackAdmin:10000、パスワード:root、openstackグループ所属、業種:default でユーザを作る
  • member:10001、パスワード:member、openstackグループ所属、業種:default でユーザを作る

  • 『業種』は businessCategory の項目となっています

    既存ユーザデータに小文字の admin を混ぜるのが嫌だったので OpenStackAdmin を管理者にしています


    さらにLAMでdefaultドメインを作成しておきます。
  • domains の子エントリを作成
  • デフォルト -> groupOfNames
  • RDN:cn, cn=default, member:uid=OpenStackAdmin,ou=users,dc=openstack,dc=org

  • usersデータの businessCategory と紐付いたデータです
    お互いの default が一致していないとアカウントは有効になりません



    keystone連携

    設定

    keystone.conf をLDAP仕様に変更します。
    設定は関連部のみ、それとメモを書いておきます。

    /etc/keystone/keystone.conf

    編集したら再起動します。

    メモ
  • LDAPの管理者権限は、プロジェクトやロール操作をする時だけ記述して、通常時はOpenStack管理者ユーザにでもして読み込み権限だけにしておく(ポリシー次第)
  • user_objectclass = person にしたら内部でobjectClassがperson,personで重複してエラーになる
  • Grizzlyでは description の値のデフォが desc になっているので明示的に設定する
  • use_dumb_member = True でないと tenant-create ができないので dumb_member とともに設定する
  • dumb_member は roleOccupant に仮で入るデータなので値はなんでもよい
  • user_name_attribute は cn が理想だが、日本語だと取得の際にエラーになるので、その場合は uid にでもする
  • user_enabled_attribute のために enabled を core.schema に入れたが、入れずに済む方法を探しても、他にちょうどよいboolean型が無いため無理っぽかった
  • domain関連はGrizzlyから必要になった

  • データ追加

    プロジェクトなど最初必要なものを追加していきます。
    初めて追加する時は、LAMのツリービューを見ながらやるとデータの所在がわかってよいです。

    プロジェクト(ou=groups)

    ユーザ(ou=users)
    外道運用ルールでは keystone user-create はせず、LAM上での作成とするため実際にはコマンドは不要ですが、動作確認のために書いておきます。
  • LAMでは businessCategory : default 属性の追加が必要。LAMの表示上は”業種”
  • ロール(ou=roles)
    管理者と一般ユーザ用のロールを追加しておきます。
  • admin, KeystoneAdmin, KeystoneServiceAdmin はソース直書きの固定管理者用ロールです
  • それ以外の一般ユーザが必要なので Member を作成しておきます
  • policy.json はいったんそのままで、別記事で書きます
  • プロジェクト/ユーザ/ロールの関連付け(groupsのcnのさらに上にcnが作成される)
    管理者ユーザを全ての固定管理ロールに入れておきます。

    データの確認


    テストプロジェクト追加

    基本的に admin プロジェクトはネットワーク設定やスナップショット編集などをするためのものにして普段は放置し、2つ目以降のプロジェクトをガリガリ使うようにしています。

    ユーザ追加の際にグループ追加する手順

    LAMでユーザを追加したら、OpenStackでも認証できるように、手動で user-role のデータを追加する必要があります。

  • ツリービューの ou=groups を選択
  • testプロジェクトのcnを選択
  • Memberロールのcnを選択
  • roleOccupant にユーザの uid を追加

  • LDAPのデータをKeystoneでも有効にするには、ユーザのbusinessCategoryにdefaultが入っていて、かつ、上記 user-role データが存在する必要があります。それ以外のユーザは OpenStack を触ることができない、ということです。


    後片付け

    色々終わったら、LDAPユーザを切り替えておきます。
    さきほども書きましたが、これはお好みで、私はできるだけLDAP管理者権限を撒き散らしたくないのでパスワードを消しておき、読み込みのみでKeystoneで利用するようにしています。

    /etc/keystone/keystone.conf

    編集したら再起動します。



    LDAPをそこそこ知らないと厳しい設定かもしれませんが、やってみると意外に悪くなく、特に問題なく運用できています。

    ただ、FolsomからGrizzlyにするとスキーマが変わって古いデータは使えなかったりしたので、その辺の対応は覚悟しておく必要がありそうです。