VirtualBoxで作成したCentOSにOpenStackを構築する(Identity編)

[環境編](http://qiita.com/tk3fftk/items/76d696a874d829ea9fe4)の続きです。

# Openstack Identity (keystone)
[Identity serviceの追加](http://docs.openstack.org/liberty/ja/install-guide-rdo/common/get_started_identity.html)に従ってやっていきます

## せつめいのいんよう
> OpenStack Identity サービス は、認証、認可、サービスカタログサービスを管理する OpenStack で唯一のサービスです。他の OpenStack サービスは共通の統一 API として Identity サービスを使用します。また、ユーザー関連の情報を提供する OpenStack 外のサービス (LDAP サービスなど) なども既存のインフラに統合できます。

> Identity サービスには、以下のコンポーネントがあります。
>>  ・サーバー: 中央サーバーが、RESTful インターフェースを使用して、認証と認可のサービスを提供します。
・ドライバー: ドライバーやサービスバックエンドは、中央サーバーと統合されています。ドライバーは、OpenStack の外部にあるリポジトリーにある認証情報にアクセスするために使用されます。こうしたリポジトリーは、OpenStack が導入されるインフラストラクチャーにすでに存在する場合もあります (例えば、SQL データベースやLDAP サーバー)。
・モジュール: ミドルウェアモジュールは、Identity サービスを使用している OpenStack コンポーネントの一部として動作します。これらのモジュールは、サービスリクエスト処理の中で、ユーザーのクレデンシャルを抽出し、認可を行うためそのクレデンシャルを中央サーバーに送信します。ミドルウェアモジュールと OpenStack コンポーネントの間の統合には、Python Web Server Gateway Interface を使用します。

# インストール&設定
- 前提として，DBと管理トークンを作成する必要がある
- `# mysql -u root -p` して以下の作業を行う。KEYSTONE_DBPASSにはroot++
  - `CREATE DATABASE keystone;` 
      - keystoneデータベースの作成
  - `GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';`
  - `GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';`
      - keystoneへのアクセス権の付与
- `# openssl rand -hex 10` 
  - 管理トークンとして利用するランダム値を生成 
  - 結果: `7e229b6bbfda9481cc3f`

## コンポーネントのインストールと設定
  - `# yum install openstack-keystone httpd mod_wsgi memcached python-memcached`
     - memcachedは汎用のメモリキャッシュシステム。 データとオブジェクトをメモリ内にキャッシュすることで、DBから読み出しを行う回数を減少させ、DBを用いたWebサイトを高速化するためによく用いられています。だそうです。
- memcached起動処理 (memcachedをenableにしてstart)
- `# vi /etc/keystone/keystone.conf` で以下

```properties:keystone.conf
[DEFAULT]
admin_token = ADMIN_TOKEN # 先ほど生成したトークン 7e229b6bbfda9481cc3f
[database] # DBへのアクセス方法
connection = mysql://keystone:KEYSTONE_DBPASS@controller/keystone # root++
[memcache]
servers = localhost:11211 # memcachedサービスの設定
[token]
provider = uuid  # UUIDトークンプロバイダー
driver = memcache  # memcachedドライバー
[revoke]
driver = sql # SQL revocationドライバー
[DEFAULT]
#verbose = True # 冗長ロギングを有効にする はとりあえずコメントアウトのまま
```

## Apache HTTP Serverの設定
  - `# vi /etc/httpd/conf/httpd.conf` で以下を編集
      - `ServerName controller`
  -  `# vi /etc/httpd/conf.d/wsgi-keystone.conf` で以下をコピペした
  - httpd起動処理 (httpdをenableにしてstart)

```profile:wsgi-keystone.conf
Listen 5000
Listen 35357

<VirtualHost *:5000>
    WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-public
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined

    <Directory /usr/bin>
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order allow,deny
            Allow from all
        </IfVersion>
    </Directory>
</VirtualHost>

<VirtualHost *:35357>
    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-admin
    WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined

    <Directory /usr/bin>
        <IfVersion >= 2.4>
            Require all granted
        </IfVersion>
        <IfVersion < 2.4>
            Order allow,deny
            Allow from all
        </IfVersion>
    </Directory>
</VirtualHost>

```

> Web Server Gateway Interface (WSGI; ウィズギー) は、プログラミング言語Pythonにおいて、WebサーバとWebアプリケーション（もしくはWebアプリケーションフレームワーク）を接続するための、標準化されたインタフェース定義である。また、WSGIから着想を得て、他の言語でも同様のインタフェースが作られた。

# サービスエンティティと API エンドポイントの作成
## エンドポイントの説明
>OpenStack は、各サービスに対して 3 種類の API エンドポイントを使用します。管理 (admin)、内部 (internal)、パブリック (public) があります。デフォルトでは、管理 API エンドポイントでユーザーやテナントの変更を行えますが、パブリック API と内部 API ではこれらの操作は許可されません。本番環境では、セキュリティーのため、異なる種類のユーザーごとに分かれたネットワークに置いたほうがいいでしょう。例えば、パブリック API ネットワークは、顧客が自身のクラウドを管理できるよう、インターネットから利用できるでしょう。管理 API ネットワークは、クラウドインフラを管理する組織内の運用者に制限されるでしょう。内部 API ネットワークは、OpenStack サービスが動作するホストに制限されるでしょう。また、OpenStack は、拡張性のために、複数のリージョンをサポートしています。簡単のため、このガイドでは、すべてのエンドポイントで管理ネットワークを使用し、デフォルトの RegionOne リージョンを使用します。

- 環境変数を設定してopenstackコマンドを使えるようにする
  - `# export OS_TOKEN=7e229b6bbfda9481cc3f`
      - 先ほど生成したトークンを使用する 
  - `# export OS_URL=http://controller:35357/v3`
  - `# export OS_IDENTITY_API_VERSION=3`
- Identityサービス用のサービスエンティティの作成
  - `# openstack service create --name keystone --description "OpenStack Identity" identity`




- 今回はpublic, internal, adminのエンドポイントを全て同一ネットワークでする
  - `openstack endpoint create --region RegionOne identity public http://controller:5000/v2.0`
  - `openstack endpoint create --region RegionOne identity internal http://controller:5000/v2.0`
  - `openstack endpoint create --region RegionOne identity admin http://controller:5000/v2.0`

- OpenStack 環境に追加するサービスごとに、1 つ以上のサービスエンティティー、3 種類の API エンドポイントを Identity サービスに登録する必要がある。
  - 今後追加していくサービスも今やってるのと同様の操作が必要ということになります。

## プロジェクト，ユーザー，ロールの作成
> ドメイン: Identity API v3 のエンティティー。プロジェクト、グループ、ユーザーの集合体で、 OpenStack Identity のエンティティー管理において管理境界を定義するためのものである。

- adminプロジェクトの作成
  - `# openstack project create --domain default --description "Admin Project" admin`
- adminユーザの作成 
  - `# openstack user create --domain default --password-prompt admin`
  - pass: root++
- adminロールの作成
  - `# openstack role create admin`
- adminロールをadminプロジェクトとadminユーザに追加
  - `# openstack role add --project admin --user admin admin`

- サービスごとの専用ユーザ用プロジェクトを作成(service)
  - `# openstack project create --domain default --description "Service Project" service`
- 非特権プロジェクト，ユーザ(demo:demo)の作成
  - `openstack project create --domain default --description "Demo Project" demo`
  - `openstack user create --domain default --password-prompt demo`
  - `openstack role create user`
  - `openstack role add --project demo --user demo user`

# 動作検証
- 一次認証トークンメカニズムを無効化
  - `/usr/share/keystone/keystone-dist-paste.ini` を編集、admin_token_auth、[pipeline:public_api]、[pipeline:admin_api] セクションから admin_token_auth を削除します。
- 一時的な環境変数を解除
  - `unset OS_TOKEN OS_URL` 
- adminユーザとして認証トークンを要求 (要 adminユーザのパスワード)
  - `openstack --os-auth-url http://controller:35357/v3 --os-project-domain-id default --os-user-domain-id default --os-project-name admin --os-username admin --os-auth-type password token issue`
  
- demoユーザとして認証トークンを要求 (demoユーザのパスワード，5000番ポート，非管理APIのみアクセス)
  - `openstack --os-auth-url http://controller:5000/v3 --os-project-domain-id default --os-user-domain-id default --os-project-name demo --os-username demo --os-auth-type password token issue`
- どちらもちゃんと返ってきたらOK

### 環境スクリプト
- exportをまとめたやつ
- 今後使っていくことになります。

```Bash:admin-openrc.sh
export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=admin
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=root++
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
```
- 使うときは ` source admin-openrc.sh`後に`openstack token issue`