그동안 오픈스택은 인증을 관리하는데 keystone서비스를 사용해왔다. 다만 kilo와 liberty 버전에 와서

mod_wsgi 및 별도의 웹서버를 이용하여 인증 서비스를 수행하고 있음

따라서 이 가이드도 퍼포먼스를 위해 requests 처리에는 아파치 웹서버, 토큰 저장에는 SQL DB 대신에 Memcached를 사용한다.

또 httpd와 keystone 같은 포트(5000, 35357)를 사용하기 때문에 keystone 서비스는 비활성화 한다.

인증서비스도 컨트롤로 노드에 설치하며 서비스를 설치하기전 환경 설정을 먼저한다.

 

### mairadb의 root 패스워드를 설정한다. 'db_password'에 알맞은 패스워드를 입력 ###

[root@controller ~]# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.44-MariaDB MariaDB Server

 

Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [mysql]> update user set password=password('db_password') where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

 

MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

 

keystione db 생성 후 keystone 계정을 생성하고 권한을 부여한다. 이때 keystone 패스워드를 지정해준다.

공식가이드는 controller 에서 접근시 권한은 빠져있는데 실제 설치시 설정 파일에는

controller통해서 DB접근하게 설정해 놓아 설치중 DB권한 문제로 에러가 발생한다. 아래와 같이 controller에서의 접근도 허용해준다.

 

MariaDB [mysql]> CREATE DATABASE keystone;
Query OK, 1 row affected (0.00 sec)

MariaDB [mysql]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \            
    ->   IDENTIFIED BY 'KEYSTONE_DBPASS';

Query OK, 0 rows affected (0.00 sec)

 

MariaDB [mysql]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'controller' \            
    ->   IDENTIFIED BY 'KEYSTONE_DBPASS';
Query OK, 0 rows affected (0.00 sec)

 

MariaDB [mysql]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
    ->   IDENTIFIED BY 'KEYSTONE_DBPASS';
Query OK, 0 rows affected (0.00 sec)


MariaDB [mysql]> quit
Bye

 

관련 패키지 설치 및 구성

[root@controller ~]# yum install -y openstack-keystone httpd mod_wsgi memcached python-memcached
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.neowiz.com
 * extras: ftp.neowiz.com
 * updates: ftp.neowiz.com
Resolving Dependencies
--> Running transaction check

...(생략)...

  python2-oslo-context.noarch 0:0.6.0-1.el7
  python2-passlib.noarch 0:1.6.5-1.el7
  saslwrapper.x86_64 0:0.16-5.el7

Complete!

 

[root@controller ~]#

### memcached 시작 및 부팅시 시작 활성화 ###

[root@controller ~]# systemctl enable memcached.service
Created symlink from /etc/systemd/system/multi-user.target.wants/memcached.service to /usr/lib/systemd/system/memcached.service.
[root@controller ~]# systemctl start memcached.service

 

### admin token을 설정하기 위해 openssl rand 명령어를 이용 임의 값을 구하고 /etc/keystone/keystone.conf 파일을 수정한다 ###

[root@controller ~]# openssl rand -hex 10
16d3b96cc5759b123842

[root@controller ~]# vi /etc/keystone/keystone.conf

 

### [DEFAULT] 섹션에서 admin_token 항목 및 verbose 항목의 주석을 제거하고 ADMIN_TOKEN  부분에 앞에서 구한 임의 값으루 수정한다. ###

[DEFAULT]

...

#admin_token = ADMIN_TOKEN          

admin_token = 16d3b96cc5759b123842

 

 

### [database] 섹션의 connection 항목을 아래와 같이 수정한다. keystone db패스워드가 다르게 설정되었으면 KEYSTONE_DBPASS을 수정 ###

[database]
...
connection = mysql://keystone:KEYSTONE_DBPASS@controller/keystone

 

### [memcache]  섹션에서 Memcached 서비스 구성. ###


[memcache]
...
servers = localhost:11211

 

### [ token] 섹션에 UUID 토큰 공급자 및 Memcached 드라이버 구성 ###


[token]
...
provider = uuid
driver = memcache

 

### [revoke]  섹션에 sql를 입력한다. ###


[revoke]
...
driver = sql 

 

### (옵션)[DEFAULT] 섹션에서 트러블슈팅시 도움이 될수 있게 verbose를 활성화한다.  ###

 

[DEFAULT]
...
verbose = True

 

 

keystone 테이블을 만든다.

[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

 

아파치 웹서버를 구성한다.

### /etc/httpd/conf/httpd.conf 다음과 같이 수정한다. ###

[root@controller ~]# vi /etc/httpd/conf/httpd.conf

....

ServerName controller

 

### 아래의 내용으로 /etc/httpd/conf.d/wsgi-keystone.conf 파일을 생성한다. ###

[root@controller ~]# vi /etc/httpd/conf.d/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>

 

 

 

### httpd 시작 및 부팅시 시작 활성화 ###

[root@controller ~]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@controller ~]# systemctl start httpd.service


 

 

Identity 서비스는 서비스들과 서비스들의 위치의 카탈로그를 제공하며 오픈스택에 추가하는 서비스들은

이 카테고리에 각각 service entity 와 several API endpoints를 필요로 한다.

기본적으로는 Identity에는 아무것도 설정되어 있지 않아 임시 인증키를 이용 service entity 와 several API endpoints를 설정해야 한다.

 

[root@controller ~]# export OS_TOKEN=16d3b96cc5759b123842

### 위에서 /etc/keystone/keystone.conf 에 설정한 ADMIN_TOKEN 값을 사용 ###

[root@controller ~]# export OS_URL=http://controller:35357/v3
[root@controller ~]# export OS_IDENTITY_API_VERSION=3

 

 

Identity 서비스는 OpenStack 환경에서 서비스들의 카탈로그를 관리하며,

서비스들은 오픈스택 환경에서 다른 서비스들을 사용할수 확인하기 위해 이 카테고리를 사용한다.

일단 Identity 서비스 entity를 생성한다.

[root@controller ~]# openstack service create --name keystone --description "OpenStack Identity" identity
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Identity               |
| enabled     | True                             |
| id          | 2133c5611bc845b7b90f06f6675d41df |
| name        | keystone                         |
| type        | identity                         |
+-------------+----------------------------------+

 

 

오픈스택은 서비스들간에 접근할수 있도록 3가지 API endpoint를 사용한다. 각각 admin 접속시 사용할 admin url, 내부 접속시 사용할 internal url,

외부 접속시 사용할 public url이며, Identity 서비스에 대해서도 각각 생성해준다.

 

[root@controller ~]# openstack endpoint create --region RegionOne identity public http://controller:5000/v2.0
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 37a64289ffee4d7f9cf7e9b774ab2b2b |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 2133c5611bc845b7b90f06f6675d41df |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller:5000/v2.0      |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne identity internal http://controller:5000/v2.0
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 95d4152f4c464b36ab887c737c02170c |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 2133c5611bc845b7b90f06f6675d41df |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller:5000/v2.0      |
+--------------+----------------------------------+
[root@controller ~]# openstack endpoint create --region RegionOne identity admin http://controller:35357/v2.0
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | fb68494248754d98b454fa5dbd193917 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 2133c5611bc845b7b90f06f6675d41df |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller:35357/v2.0     |
+--------------+----------------------------------+

 

다음으론 유저, 프로젝트(테넌트), 롤 을 만든다.

우선 admin 유저부터 프로젝트(테넌트)를 생성

[root@controller ~]# openstack project create --domain default --description "Admin Project" admin
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Admin Project                    |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 94f9c25aaa4246b0915afacca2d65c22 |
| is_domain   | False                            |
| name        | admin                            |
| parent_id   | None                             |
+-------------+----------------------------------+

 

다음으로 유저 생성

[root@controller ~]# openstack user create --domain default --password-prompt admin
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | default                          |
| enabled   | True                             |
| id        | 2238ec4daed3436b8cc97491518bd6cf |
| name      | admin                            |
+-----------+----------------------------------+

 

admin 롤을 생성후 admin 롤에 admin 계정을 추가한다.

[root@controller ~]# openstack role create admin
+-------+----------------------------------+
| Field | Value                            |
+-------+----------------------------------+
| id    | e157ef2ab547476f985d26cf90e536d4 |
| name  | admin                            |
+-------+----------------------------------+
[root@controller ~]# openstack role add --project admin --user admin admin

 

오픈스택을 서비스할 서비스용 프로젝트를 만든다.

[root@controller ~]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 6d1588e23bc244d397d9617a6cbacbcb |
| is_domain   | False                            |
| name        | service                          |
| parent_id   | None                             |
+-------------+----------------------------------+

 

관리자가 아닌 일반 유저용 demo 프로젝트를 만든다.

[root@controller ~]# openstack project create --domain default --description "Demo Project" demo
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Demo Project                     |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 52b4355c27004f06b2a6c2e9d46da50c |
| is_domain   | False                            |
| name        | demo                             |
| parent_id   | None                             |
+-------------+----------------------------------+

 

demo 유저를 만든다.

[root@controller ~]# openstack user create --domain default --password-prompt demo
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | default                          |
| enabled   | True                             |
| id        | d16b2f206ce848eca21473f1595f3adf |
| name      | demo                             |
+-----------+----------------------------------+

 

일반 user 롤을 만들고 demo 유저를

[root@controller ~]# openstack role create user
+-------+----------------------------------+
| Field | Value                            |
+-------+----------------------------------+
| id    | 2fc4fad2d097472987b977d57434e5cb |
| name  | user                             |
+-------+----------------------------------+
[root@controller ~]# openstack role add --project demo --user demo user

 

프로젝트, 롤, 사용자들을 생성하였으면 잘 생성되었는지 확인하기 전에

보안상의 이유로 위에서 사용한 임시사용 인증키를 사용하지 않아야 한다.

환경변수를 사용하지 않게 unset 시켜준후 /usr/share/keystone/keystone-dist-paste.ini 파일을 편집하여

[pipeline:public_api], [pipeline:admin_api], [pipeline:api_v3] 섹션에서 admin_token_auth 을 삭제한다.

[root@controller ~]# unset OS_TOKEN OS_URL

[root@controller ~]# vi /usr/share/keystone/keystone-dist-paste.ini

... 

[pipeline:public_api]
# The last item in this pipeline must be public_service or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension user_crud_extension public_service

[pipeline:admin_api]
# The last item in this pipeline must be admin_service or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension s3_extension crud_extension admin_service

[pipeline:api_v3]
# The last item in this pipeline must be service_v3 or an equivalent
# application. It cannot be a filter.
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension_v3 s3_extension simple_cert_extension revoke_extension federation_extension oauth1_extension endpoint_filter_extension service_v3

 

admin 및 demo 사용자의 인증토큰을 요청한다.

[root@controller ~]# 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
Password:

+------------+----------------------------------+
| Field      | Value                            |
+------------+----------------------------------+
| expires    | 2016-02-27T13:01:50.341878Z      |
| id         | cca2a4322d99489e94a49d188e62085e |
| project_id | 94f9c25aaa4246b0915afacca2d65c22 |
| user_id    | 2238ec4daed3436b8cc97491518bd6cf |
+------------+----------------------------------+

[root@controller ~]# 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
Password:
+------------+----------------------------------+
| Field      | Value                            |
+------------+----------------------------------+
| expires    | 2016-02-27T13:04:50.157628Z      |
| id         | 2695f0b63e50423dae7909a7e66f41ac |
| project_id | 52b4355c27004f06b2a6c2e9d46da50c |
| user_id    | d16b2f206ce848eca21473f1595f3adf |
+------------+----------------------------------+

 

이때 위에서 임시로 사용했던 admin_token_auth를 삭제하여 오픈스택을 사용시

위와 같이 admin 및 그외 유저들의 계정정보들을 파라미터로 같이 입력해줘야 한다.(미입력시 error)

따라서 인증내용을 환경변수로 만드는 스크립스틀 생성하여 사용하면 편히하게 운영가능함.

admin 용과 demo 유저용 스크립트를 다음과 같이 각각 생성한다. 이때 OS_PASSWORD 항목은 계정 생성시 사용한 패스워드로 변경!

[root@controller ~]# vi 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=ADMIN_PASS
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3

 

[root@controller ~]# vi demo-openrc.sh
export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=demo
export OS_TENANT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=DEMO_PASS
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3

 

스크립트를 생성후 source admin-openrc.sh 명령어를 입력하여 파라미터를 생략할수 있다.

다음은 스크립트 실행 전후의 command 실행 결과 이다.

 

[root@controller ~]# openstack token issue
Missing parameter(s):
Set a username with --os-username, OS_USERNAME, or auth.username
Set an authentication URL, with --os-auth-url, OS_AUTH_URL or auth.auth_url
Set a scope, such as a project or domain, set a project scope with --os-project-name, OS_PROJECT_NAME or auth.project_name, set a domain scope with --os-domain-name, OS_DOMAIN_NAME or auth.domain_name

[root@controller ~]# openstack user list
Missing parameter(s):
Set a username with --os-username, OS_USERNAME, or auth.username
Set an authentication URL, with --os-auth-url, OS_AUTH_URL or auth.auth_url
Set a scope, such as a project or domain, set a project scope with --os-project-name, OS_PROJECT_NAME or auth.project_name, set a domain scope with --os-domain-name, OS_DOMAIN_NAME or auth.domain_name

[root@controller ~]# source admin-openrc.sh
[root@controller ~]# openstack token issue
+------------+----------------------------------+
| Field      | Value                            |
+------------+----------------------------------+
| expires    | 2016-02-27T13:21:10.984010Z      |
| id         | 96031445b5554e58ae6f1409a1b80388 |
| project_id | 94f9c25aaa4246b0915afacca2d65c22 |
| user_id    | 2238ec4daed3436b8cc97491518bd6cf |
+------------+----------------------------------+
[root@controller ~]# openstack user list
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 2238ec4daed3436b8cc97491518bd6cf | admin |
| d16b2f206ce848eca21473f1595f3adf | demo  |
+----------------------------------+-------+


 


 

+ Recent posts