CloudStackをつかって商売するには
セルフサービスポータルとして
CloudStack管理サイトをインターネット経由で
利用して貰う必要があるが、
1社以上のユーザを受け入れるために
LDAPサーバでの認証が必要にある可能性が高い。
CloudStack3.0から(?)LDAP連携が有効になったとの
記述がAdnministraion Guideにのっていたので
ためしてみた。
LDAPサーバとして
Active Directorも使用できるらしいが
CloudStackを採用する場合
できるだけ安くケチケチプランのSLAベースになるはず
なので、
ここはOpenLDAPで試して見ることにした。
LDAPサーバ環境は
想定される構成でも別々になるはずなので
以下の図のとおり
Management Serverとは別のサーバにした。
図には出ていないが、
作業のためこのセグメントにWindows PCを
別途用意しておく。
LDAPの構成は
あまり良くわからないのでとりあえず
dc=harahara,dc=co,dc=jp
に
cn=admin
をつくりパスワードを"password"
さらに組織ユニットou=peopleをつくって
その下にuid=yamada(パスワードを"password")にした。
以下は前提として
・Management Serverは管理サーバがログイン可能な状態まで
・management Server上にはアカウント/ユーザyamadaは存在しない
・OpenLDAPサーバは固定IPでOSセットアップ完了まで
・proxyなしでインターネットに繋がる
という環境から
CloudStack管理サイトへOpenLDAPユーザ/パスワードでログインできるまで
の手順を記述した。
1. OpenLDAP導入
※OpenLDAPをインストールするサーバで作業
・sudo可能なユーザでログイン
・sudo su -
・cd
・export LANG=C
・aptitude update && aptitude -y slapd ldap-utils sysv-rc-conf
・sysv-rc-conf slapd on
・ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
・ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
・ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
・vi backend.ldif (新規作成、空行もかならず開ける)
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb
dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=harahara,dc=co,dc=jp
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=harahara,dc=co,dc=jp
olcRootPW: password
olcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=harahara,dc=co,dc=jp" write by anonymous auth by self write by * none
olcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=harahara,dc=co,dc=jp" write by * read
・ldapadd -Y EXTERNAL -H ldapi:/// -f backend.ldif
・vi frontend.ldif (新規作成、空行もかならず開ける)
dn: dc=harahara,dc=co,dc=jp
objectClass: top
objectClass: dcObject
objectclass: organization
o: Harahara Server
dc: Server
description: LDAP Server
dn: cn=admin,dc=harahara,dc=co,dc=jp
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: password
dn: ou=people,dc=harahara,dc=co,dc=jp
objectClass: organizationalUnit
ou: people
dn: ou=groups,dc=harahara,dc=co,dc=jp
objectClass: organizationalUnit
ou: groups
・ldapadd -x -D cn=admin,dc=server,dc=world -W -f frontend.ldif
・adduser yamada
※パスワードを"password"にする以外は適当
・grep hori /etc/shadow | cut -d: -f2
※表示される文字列をコピーしておく
・vi user_yamada.ldif(新規作成)
※userPassword: {crypt}の後のxxxxxにコピーした文字列で置換
dn: uid=hori,ou=people,dc=harahara,dc=co,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: yamada
sn: yamada
givenName: yamada
cn: yamada
displayName: taro yamada
uidNumber: 1001
gidNumber: 1001
userPassword: {crypt}xxxxx
gecos: hori
loginShell: /bin/bash
homeDirectory: /home/yamada
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 0
shadowMax: 99999
shadowLastChange: 15436
・ldapadd -x -D cn=admin,dc=server,dc=world -W -f ldapuser.ldif
2. OpenLDAP管理用ツール導入(オプション)
・PCへログイン
※Windows PC上にEclipse3.7(日本語対応)をインストール
・Eclipse3.7起動
・ヘルプ>新規ソフトウェアのインストール
・追加ボタン
・名前:Apache Directory Studio
・ロケーション:http://directory.apache.org/studio/update/1.x
・OKボタン
・すべて選択ボタン
・完了ボタン
※内容を確認し、インストーしてもよい場合のみラジオボタンを操作し継続
・ウィンドウ>パースペクティブを開く>その他>LDAP
・画面左下の接続タブ>LDAPアイコン(バルーンで「新規接続...」と表示)
・接続名:harahara LDAP
・ホスト名:192.168.11.99
・ポート:389
・次へ
・認証方法:単純認証
・バインドDNまたはユーザー:cn=admin,dc=harahara,dc=co,dc=jp
・バインド・パスワード:password
・パスワードを保存をチェック
・完了ボタン
・LDAPブラウザーのDIT>Root DSE>dc=harahara,dc=co,dc=jp>ou=people>uid=yamada
・画面中央の"userPassword"をダブルクリック
・Cuttrent Passwordタブ
・Show current password detailsをチェック
・パスワード確認:password
・Show test password detailsをチェック
・検証ボタン※succcessfullyとでたらパスワードがpasswordになっている
※新規パスワードタブからパスワード変更可能
3. LDAPサーバの登録
・以下のコマンドをURL化する
command=ldapConfig&
port=389&
queryfilter=(&(uid=%u))&
response=json&
binddn=cn=admin,dc=harahara,dc=co,dc=jp&
bindpass=password&
searchbase=ou=people,dc=harahara,dc=co,dc=jp&
hostname=192.168.11.99&
apikey=xxxxxx&
sinunature=xxxxxx
作成例)
http://192.168.11.100:8080/client/api?command=ldapConfig&port=389&response=json&bindpass=password&searchbase=ou%3Dpeople%2Cdc%3Dexa-corp%2Cdc%3Dco%2Cdc%3Djp&hostname=192.168.11.99&queryfilter=%28%26%28uid%3D%25u%29%29&binddn=cn%3Dadmin%2Cdc%3Dexa-corp%2Cdc%3Dco%2Cdc%3Djp&apikey=xxxxxx&signature=xxxxxx
※apikeyは管理サイトからadminユーザで生成したもの
※signatureの作成方法含め以下の情報を参照のこと
CloudStack API を呼び出すURL文字列の作り方を調べる
CloudStack API を呼び出すURLを生成するJavaサンプルコード
・Windows PC上でブラウザ起動
・作成したURLをURL欄に入れ実行
※結果以下のようなJSONコードが表示される
{ "ldapconfigresponse" :
{ "ldapconfig" :
{"hostname":"192.168.11.99",
"port":"false",
"searchbase":"ou=people,dc=harahara,dc=co,dc=jp",
"queryfilter":"(&(uid=%u))",
"binddn":"cn=admin,dc=harahara,dc=co,dc=jp"} } }
※Administration Guideにはqueryfilterが(&(%uid=%uid))となっていたが
上記のようにuidの前の%がないのが正解
Administoratoion Guideだけ参照しているとはまってしまうという罠が..
※上記表示にならない場合は、失敗している
4. LDAP上の同名アカウント/ユーザをCloudStack上に作成
・以下のコマンドをURL化する
command=createAccount&
accounttype=0&
email=yamada@gmail.com&
firstname=taro&
lastname=yamada&
password=5f4dcc3b5aa765d61d8327deb882cf99&
username=yamada&
response=json&
apikey=xxxxxx&
sinunature=xxxxxx
作成例)
http://192.168.11.100:8080/client/api?command=createAccount&username=yamada&email=yamada%40google.com&lastname=yamada&accounttype=0&firstname=taro&password=5f4dcc3b5aa765d61d8327deb882cf99&apikey=qU1uxi73n6HkyLtWNA7YXho_uljUhEF5KgcOUyi6nMs9zIXcTf7TKZ3S6F-z0Tr-PvcBlH2dWX5zBOKzIZhHhQ&signature=hg%2F%2F75X0sbg2%2BEmEXHtGbiD3nfE%3D
※passwordはpasswordをMD5変換した文字列
Apache Directory Studioからも参照可能
5. CloudStack上のパスワードを変更
・CloudStack管理サイトを開く
・admin/password/(ドメインなし)/日本語
・LogOnボタン
・アカウント>yamada>ビューユーザー>yamada
・鍵マークボタン
・新しいパスワード:yamada
・OKボタン
※LDAP上のuid=yamadaのパスワードはpasswordのまま
・ログアウト
6. yamadaユーザでログオン
・CloudStack管理サイトを開く
・yamada/password/(ドメインなし)/日本語
・LogOnボタン
→ログイン成功したらOK
ログを見ると、
2012-04-11 17:44:35,278 DEBUG [cloud.user.AccountManagerImpl] (catalina-exec-16:null) Attempting to log in user: yamada in domain 1
2012-04-11 17:44:35,278 DEBUG [server.auth.MD5UserAuthenticator] (catalina-exec-16:null) Retrieving user: yamada
2012-04-11 17:44:35,279 DEBUG [server.auth.MD5UserAuthenticator] (catalina-exec-16:null) Password does not match
2012-04-11 17:44:35,279 DEBUG [server.auth.LDAPUserAuthenticator] (catalina-exec-16:null) Retrieving user: yamada
2012-04-11 17:44:35,293 INFO [server.auth.LDAPUserAuthenticator] (catalina-exec-16:null) DN from LDAP =uid=yamada
2012-04-11 17:44:35,300 DEBUG [cloud.user.AccountManagerImpl] (catalina-exec-16:null) User: yamada in domain 1 has successfully logged in
となっているので、
・CloudStack上のパスワードで認証をかけようとする
→失敗
・LDAP上のqueryfilter以下のuidがyamadaであるアカウントを探す
→発見
・パスワードをチェック
→成功
でログインできるようになっている。
..でも
これじゃ2つのパスワードでログインできるようになっただけじゃん..
CloudStack上のパスワード変えたら
OpenLDAP側も変わっていてほしかった..
あれ?
でもaccounttype=0(非管理者)でログオンした画面で
パスワード変更機能ってなかったような気がする..
とすると設計者の意図は
LDAP側のパスワード管理サイトでユーザにパスワードを
変えさせるように仕向けたいのか...
とするとOpenLDAPを操作する機能を
別途提供しないと..