• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
OpenStack Study#9 JOSUG
 

OpenStack Study#9 JOSUG

on

  • 2,234 views

日本OpenStackユーザ会 第9回 勉強会

日本OpenStackユーザ会 第9回 勉強会
OpenStack Identityについて

Statistics

Views

Total Views
2,234
Views on SlideShare
2,229
Embed Views
5

Actions

Likes
16
Downloads
83
Comments
0

2 Embeds 5

https://twitter.com 3
https://jp.twitter.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    OpenStack Study#9 JOSUG OpenStack Study#9 JOSUG Presentation Transcript

    • openstack Open source software to build public and private clouds. About OpenStack Identity (keystone)Internet Initiative Japan Inc. / Japan OpenStack User Group さいとうひでき (twitterid: @saito_hideki) OpenStack Study #9
    • 本セッションの概要OpenStackが提供する各コンポーネントが利用する認証基盤OpenStack Identity(keystone)の概要と認証・認可の仕組み、利用のされ方について紹介する約30分のセッションです。 OpenStack Study #9
    • 目次● 自己紹介● OpenStack Identity(keystone)について● keystoneの構造● 認証・認可の仕組み● 普通の利用方法● ちょっと変わった利用方法● まとめ OpenStack Study #9
    • 自己紹介● なまえ: – 齊藤 秀喜 (さいとう ひでき) – TwitterId: @saito_hideki● しごと: – クラウド関連のちょっとした開発 – クラウド関連のちょっとした運用 – クラウド関連のちょっとした火消しとかお詫び● しゅみ: – OpenStack(嗜む程度) OpenStack Study #9
    • OpenStack Identity(keystone)についてOpenStackの各コンポーネントが利用する共通の認証基盤としてシステム全体に統合認証機能を提供しています。OpenStackを利用する上では嫌でもダダをこねても避けて通ることはできない重要なサービスです。 goo辞書によると.... 1 《建築》(アーチ頂上の)かなめ石, くさび石. 2 (組織の)中枢, 中心;(学説などの )根本原理. OpenStack Study #9
    • OpenStack Identity(keystone)について各コンポーネントとの相関図は以下のような感じ。コレは動かないと結構ヤバそう。 OpenStack Compute Administration Manualより転載 OpenStack Study #9
    • 認証・認可の仕組み実際に認証と認可の仕組みを追ってみる。キーワードは以下の4つ。● ユーザID/パスワード – 認証とトークンを取得するのに必要なユーザIDとパスワード● トークン – 認証成功時に発行されるAPIアクセスに必須となる許可証● テナント – 仮想リソースをグループ化したもの。ユーザは所属するテナントに対 して認可された操作権を持つ。● エンドポイント – 指定テナント内でユーザに認可されたサービスとそのAPIのURL情報 OpenStack Study #9
    • 認証・認可の仕組みkeystone-allはクライアントからのリクエスト(RESTベース)を処理することにより認証・認可を行う。POSTする情報はjsonまたはxml形式。 client keystone-all (1)ユーザID/パスワードでトークンを要求 (2)トークン backend (3)権限を持つテナント情報を要求 (4)テナントリスト (5)テナントに対するエンドポイント情報を要求 (6)認可されているエンドポイントリスト OpenStack Study #9
    • 認証・認可の仕組みOpenstackのクライアントがendpointを取得する動きをpythonスクリプトで再現してみる。#!/usr/bin/env python#-*- coding: utf-8 -*- get_token() (1)ユーザID/パスワードからトークンを要求from getpass import getpassfrom httplib import HTTPConnection (2)トークン取得Import jsonuser = raw_input("user: ")password = getpass("password: ") get_tenant()session = HTTPConnection("%s:%s" % (HOST, PORT)) (3)権限を持つテナント情報を要求auth_result = get_token(user, password, session) (4)テナントリスト取得token = auth_result[access][token][id]tenant_result = get_tenant(token, session) get_endpoint() (5)テナントに対するエンドポイント情報を要求tenant = tenant_result["tenants"][0]["id"]endpoint_result = get_endpoint(token, tenant, session) (6)認可されているエンドポイントリスト取得session.close()print "=" * 70print json.dumps(auth_result, sort_keys=True, indent=2)print "-" * 70print json.dumps(tenant_result, sort_keys=True, indent=2) OpenStack Study #9
    • 認証・認可の仕組み(1)ユーザID/パスワードでトークンを要求(2)トークン取得 接続先URLはdef get_token(user, password, session): http://<host>:<port>/v2.0/tokens token_path = "/v2.0/tokens" header = { "Content-Type": "application/json" } リクエストヘッダでデータ形式をjson に指定する。 request = { "auth": { "passwordCredentials": { トークンを取得するAPIリクエストを "username":"%s", 生成する。 "password":"%s" } }} % (user, password) リクエスト送信!(POST) session.request("POST", token_path, request, header) keystone-allからトークンが返される。 return json.load(session.getresponse()) OpenStack Study #9
    • 認証・認可の仕組み(1)ユーザID/パスワードでトークンを要求(2)トークン取得{ "access": { keystone-allから返されるトークン "serviceCatalog": {}, "token": { 情報。リクエスト時にjson形式を "expires": "2012-11-18T05:23:51Z", 指定しているので形式は当然なが "id": "84e9f54aef284bf6a8dc79699045ad99" らjson形式となっている。 }, "user": { 以降のリクエストでは、ヘッダに "id": "d60717fe43e94c908bd9248b87d8e045", "name": "foo", X-Auth-Token: トークンID "roles": [], "roles_links": [], "username": "foo" を付加することにより認証された } リクエストであること証明する。 }} OpenStack Study #9
    • 認証・認可の仕組み(3)権限を持つテナント情報を要求(4)テナントリスト取得 接続先URLはdef get_tenant(token, session): http://<host>:<port>/v2.0/tenants tenant_path = "/v2.0/tenants" リクエストヘッダでデータ形式をjson header = { に指定するだけでなく、X-Auth-Token "Content-Type": "application/json", "X-Auth-Token": token, に取得済みのトークンIDを指定する。 } session.request("GET", tenant_path, "", header) リクエスト送信!(GET) return json.load(session.getresponse()) keystone-allからトークンが返される。 OpenStack Study #9
    • 認証・認可の仕組み(3)権限を持つテナント情報を要求(4)テナントリスト取得{ keystone-allから返されるテナント "tenants": [ 情報は、リストとなっているので { 注意。1つだけでも当然リストと "description": "Default Tenant", なる。 "enabled": true, "id": "7695c8332c1b4450a6be1376b3a1f5c4", 次の段階のエンドポイントリスト "name": "openstackDemo" を取得するには、このテナントID } を利用する。 ], "tenants_links": []} OpenStack Study #9
    • 認証・認可の仕組み(5)テナントに対するエンドポイント情報を要求(6)認可されているエンドポイントリスト取得def get_endpoint(token, tenant, session): 接続先URLは token_path = "/v2.0/tokens" http://<host>:<port>/v2.0/tokens header = { "Content-Type": "application/json", リクエストヘッダでデータ形式をjson "X-Auth-Token": token, } に指定するだけでなく、X-Auth-Token に取得済みのトークンIDを指定する。 endpoint_request = { "auth": { 取得済みのトークンIDとテナントIDで "token": { "id":"%s" エンドポイント情報を取得するAPIリク }, エストを生成する。 "tenantId": "%s" }} % (token, tenant) リクエスト送信!(POST) session.request( "POST", "/v2.0/tokens" , endpoint_request, header) keystone-allからトークンが返される。 return json.load(session.getresponse()) OpenStack Study #9
    • 認証・認可の仕組み(5)テナントに対するエンドポイント情報を要求(6)認可されているエンドポイントリスト取得 { "access": { <!-- 中略 --> "serviceCatalog": [ { "endpoints": [ { "adminURL": "http://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4", "id": "48567a3d0f7a40fc9aa57172b9cc46e8", "internalURL": "http://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4", "publicURL": "http://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4", "region": "RegionOne" } ], "endpoints_links": [], "name": "nova", "type": "compute" keystone-allから返されるエンドポイント }, 情報の中にnova/glanceなどのリソースを <!-- 中略 --> } 操作するためのAPIのURLが含まれる OpenStack Study #9
    • keystoneの構造● 本体: keystone-all● keystone-allの認証/認可用バックエンド – KVS Backend – SQL Backend REST API – PAM Backend keystone-all – Template Backend <keystone.conf内> driver=keystone.identity.backends.* – LDAP Backend KVS SQL PAM Template LDAP OpenStack Study #9
    • keystoneの構造SQLバックエンドで見るkeystoneのデータ構造 mysql> show tables; ● keystoneのSQLバックエンドデータベ +------------------------+ ースのテーブル数はessex / folsom と | Tables_in_keystone | もに10個 +------------------------+ ● migrate_versionテーブルに記録されて | ec2_credential | | endpoint | いるデータベースのバージョン情報は | metadata | 上がっている。 | migrate_version | ● essex : 1 | role | ● folsom: 4 | service | ● データ構造的に見ると変更箇所はtoken | tenant | テーブルにvalidフィールドが追加と | token | なったのみ。 | user | ● tokenテーブルに発行されたtokenが延 | user_tenant_membership | 々と登録され続けていくんだけど... +------------------------+ 10 rows in set (0.00 sec) これ溢れないのかな? OpenStack Study #9
    • 普通の利用方法それぞれのコンポーネントでkeystoneを利用するための設定が必要。1. keystone自身の設定2. novaからkeystoneを利用するための設定3. glanceからkeystoneを利用するための設定ココを参考に設定してください!http://d.hatena.ne.jp/pyde/20121111/ OpenStack Study #9
    • 普通の利用方法keystoneコマンドを利用して初期情報を登録します。1. テナントの登録2. ユーザの登録3. ロールの登録4. テナント・ユーザ・ロールの関連付け5. ec2互換APIを利用する場合はec2クレデンシャルを登録ココを参考にして作ってください!http://aikotobaha.blogspot.jp/2012/04/openstackessex-configuration-02keystone.html OpenStack Study #9
    • ちょっと変わった利用方法keystone認証させつつ、novaコマンドと同等の動きをするpythonスクリプトを書いてみる。例えばflavorのリスト取得。これが.....$ export OS_USERNAME=foo keystone認証のための情報$ export OS_PASSWORD=bar$ export OS_TENANT_NAME=openstackDemo を環境変数に設定する。$ export OS_AUTH_URL="http://172.16.100.14:5000/v2.0"$ nova flavor-list+----+------------+-----------+------+-----------+------+-------+-------------+| ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor |+----+------------+-----------+------+-----------+------+-------+-------------+| 1 | m1.tiny | 512 | 0 | 0 | | 1 | 1.0 || 2 | m1.small | 2048 | 10 | 20 | | 1 | 1.0 || 3 | m1.medium | 4096 | 10 | 40 | | 2 | 1.0 || 4 | m1.large | 8192 | 10 | 80 | | 4 | 1.0 || 5 | m1.xlarge | 16384 | 10 | 160 | | 8 | 1.0 || 6 | m1.minimal | 64 | 0 | 0 | | 1 | 1.0 |+----+------------+-----------+------+-----------+------+-------+-------------+ OpenStack Study #9
    • ちょっと変わった利用方法keystoneさえマスターすれば、こんな感じにpythonでもワンライナーで簡単に書ける!渾身のワンライナーでflavorリストを取得する$ python -c from httplib import HTTPConnection as c;from json import load asl;s=c("172.16.100.100:5000");s.request("POST","/v2.0/tokens","{"auth":{"tenantName":"openstackDemo","passwordCredentials":{"username":"foo","password":"bar"}}}",{"Content-Type":"application/json"});j=l(s.getresponse());s.close();tk=j["access"]["token"]["id"];tn=j["access"]["serviceCatalog"][0]["endpoints"][0]["publicURL"].split("/")[-1];s.close();s=c("172.16.100.100:8774");s.request("GET","/v2/%s/flavors"%tn,"",{"X-Auth-Token":tk});j=l(s.getresponse());s.close();print [(x["id"],x["name"],x["links"][0]["href"]) for x in j["flavors"]]結果(なんかそれっぽい!)[(u1, um1.tiny, uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/flavors/1), (u2,um1.small, uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/flavors/2), (u3, um1.medium,uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/flavors/3), (u4, um1.large,uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/flavors/4), (u5, um1.xlarge,uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/flavors/5), (u6, um1.minimal,uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/flavors/6)] OpenStack Study #9
    • ちょっと変わった利用方法続いて、OSイメージのリストも取得してみる。先ほど既に環境変数としてkeystone認証に必要となる情報を設定しているのでnovaコマンドで取得できる。$ nova image-list+--------------------------------------+-------------------+--------+--------+| ID | Name | Status | Server |+--------------------------------------+-------------------+--------+--------+| c9ef36c7-e6f4-414e-b603-257e36836e76 | tty-linux | ACTIVE | || 732ccc6c-093f-4ff3-88ec-d2c97df45014 | tty-linux-kernel | ACTIVE | || 1d51d35e-cd1f-4205-9e62-d249e439536b | tty-linux-ramdisk | ACTIVE | |+--------------------------------------+-------------------+--------+--------+ OpenStack Study #9
    • ちょっと変わった利用方法もちろんpythonのワンライナーでも簡単。渾身のワンライナーでimageリストを取得する$ python -c from httplib import HTTPConnection as c;from json import load asl;s=c("172.16.100.100:5000");s.request("POST","/v2.0/tokens","{"auth":{"tenantName":"openstackDemo","passwordCredentials":{"username":"foo","password":"bar"}}}",{"Content-Type":"application/json"});j=l(s.getresponse());s.close();tk=j["access"]["token"]["id"];tn=j["access"]["serviceCatalog"][0]["endpoints"][0]["publicURL"].split("/")[-1];s.close();s=c("172.16.100.100:8774");s.request("GET","/v2/%s/images"%tn,"",{"X-Auth-Token":tk});j=l(s.getresponse());s.close();print [(x["id"],x["links"][0]["href"]) for x in j["images"]]結果(これまたなんとなく取れてる気がする!)[(uc9ef36c7-e6f4-414e-b603-257e36836e76,uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/images/c9ef36c7-e6f4-414e-b603-257e36836e76),(u1d51d35e-cd1f-4205-9e62-d249e439536b,uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/images/1d51d35e-cd1f-4205-9e62-d249e439536b),(u732ccc6c-093f-4ff3-88ec-d2c97df45014,uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/images/732ccc6c-093f-4ff3-88ec-d2c97df45014)] OpenStack Study #9
    • ちょっと変わった利用方法UIなしでVMも作れます!じゃぁじゃぁ...渾身のワンライナーでVMインスタンスを作成!※このあたりでsessionって1回張ればいいじゃない?って気がつくけど面倒だからそのまま。$ python -c from httplib import HTTPConnection as c;from json import load asl;s=c("172.16.100.100:5000");s.request("POST","/v2.0/tokens","{"auth":{"tenantName":"openstackDemo","passwordCredentials":{"username":"foo","password":"bar"}}}",{"Content-Type":"application/json"});j=l(s.getresponse());s.close();tk=j["access"]["token"]["id"];tn=j["access"]["serviceCatalog"][0]["endpoints"][0]["publicURL"].split("/")[-1];s.close();s=c("172.16.100.100:8774");s.request("POST","/v2/%s/servers"%tn,"{"server":{"name":"josug009","imageRef":"c9ef36c7-e6f4-414e-b603-257e36836e76","flavorRef":"6","OS_DCF:diskConfig":"MANUAL"}}",{"Content-Type":"application/json","X-Auth-Token":tk});j=l(s.getresponse());s.close();print j結果(おぉ!できた!のか!?){userver: {ulinks: [{uhref:uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/servers/2e81b265-0a33-416d-b60c-afc511395279,urel: uself}, {uhref: uhttp://172.16.100.100:8774/7695c8332c1b4450a6be1376b3a1f5c4/servers/2e81b265-0a33-416d-b60c-afc511395279, urel: ubookmark}], uOS-DCF:diskConfig: uMANUAL, uid: u2e81b265-0a33-416d-b60c-afc511395279, usecurity_groups: [{uname: udefault}], uadminPass: uvhcq2X8G4eXz}} OpenStack Study #9
    • ちょっと変わった利用方法VMインスタンスのリスト取得だってUI不要。渾身のワンライナーでちょいちょいのドーンよ!$ python -c from httplib import HTTPConnection as c;from json import load asl;s=c("172.16.100.100:5000");s.request("POST","/v2.0/tokens","{"auth":{"tenantName":"openstackDemo","passwordCredentials":{"username":"foo","password":"bar"}}}",{"Content-Type":"application/json"});j=l(s.getresponse());s.close();tk=j["access"]["token"]["id"];tn=j["access"]["serviceCatalog"][0]["endpoints"][0]["publicURL"].split("/")[-1];s.close();s=c("172.16.100.100:8774");s.request("GET","/v2/%s/servers"%tn,"",{"X-Auth-Token":tk});j=l(s.getresponse());s.close();print [(x["id"],x["name"],x["links"][0]["href"]) for x in j["servers"]]結果(できてるw)[(u2e81b265-0a33-416d-b60c-afc511395279, ujosug009,uhttp://172.16.100.100:8774/v2/7695c8332c1b4450a6be1376b3a1f5c4/servers/2e81b265-0a33-416d-b60c-afc511395279)] OpenStack Study #9
    • まとめ● keystoneは本当に重要なサービスです。大嫌いでもダダをこねて も逃げられません。● OpenStackの主要コンポーネントが共通の認証基盤として利用し ています。各コンポーネント側にkeystoneを利用するための設定 が必要です。● keystoneは認証したアカウントにトークンを発行します。● 各コンポーネントでkeystone認証を利用する場合、APIリクエス トヘッダにはkeystoneが発行したトークンを”X-Auth-Token”とし て付与する必要があります● ユーザはkeystoneから認可された操作のみ行うことができます。 OpenStack Study #9
    • ご清聴ありがとうございました OpenStack Study #9