OpenStack部署all in one(二) 安装配置Keystone

OpenStack部署all in one(二) 安装配置Keystone

Keystone服务概述

1、Keystone的作用

Keystone是OpenStack的身份认证和授权服务,它在OpenStack架构中扮演着至关重要的角色。以下是Keystone的主要功能:

  • 身份认证:Keystone负责验证用户的身份信息,确保用户在访问OpenStack资源时提供有效的凭证(如用户名和密码、Token等)。它支持多种身份认证方式,包括本地用户认证、LDAP认证等。
  • 授权:Keystone管理用户的权限和角色,控制用户对OpenStack资源的访问。通过定义角色和策略,管理员可以灵活地分配用户权限,确保用户只能访问他们被授权的资源。
  • 服务目录:Keystone维护一个服务目录,记录了OpenStack环境中所有服务的端点信息。其他OpenStack服务(如Nova、Neutron、Cinder等)通过服务目录发现和调用彼此的服务。
  • Token管理:Keystone生成和管理Token,用于在OpenStack服务之间进行身份验证。Token是一种临时凭证,用户在通过身份认证后获得Token,并在后续的API请求中使用Token进行身份验证。

2、Keystone的架构

Keystone服务由以下几个主要组件构成:

  • keystone服务:这是Keystone的核心服务,负责处理身份认证和授权请求。
  • keystone.conf配置文件:这是Keystone的主要配置文件,包含了数据库连接信息、身份认证驱动配置、Token管理配置等。
  • 数据库:Keystone使用关系型数据库(如MariaDB)存储用户信息、角色信息、服务目录等数据。
  • API端点:Keystone提供RESTful API接口,供其他OpenStack服务和客户端调用,进行身份认证和授权操作。

3、工作原理

Keystone的工作原理可以概括为以下几个步骤:

  • 用户认证:用户通过客户端(如OpenStack命令行工具、Horizon仪表板等)向Keystone发送身份认证请求,提供用户名和密码等凭证。
  • 生成Token:Keystone验证用户凭证,如果验证通过,则生成一个Token,并将其返回给用户。
  • Token验证:用户在后续的API请求中携带Token,其他OpenStack服务通过调用Keystone的API验证Token的有效性。
  • 授权检查:在验证Token有效后,Keystone根据用户的角色和策略进行授权检查,确定用户是否有权限访问请求的资源。
  • 服务调用:如果授权检查通过,用户可以访问相应的OpenStack资源,其他服务通过服务目录获取目标服务的端点信息,并进行调用。

通过以上机制,Keystone确保了OpenStack环境中的身份认证和授权的安全性和灵活性。接下来我将详细介绍如何安装和配置Keystone服务,以确保你的OpenStack环境能够安全地管理用户身份和资源访问。

一、准备keystone数据库

CREATE DATABASE keystone;
# GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone';
CREATE USER 'keystone'@'%' IDENTIFIED BY 'keystone';
# 如果用户存在使用ALTER
ALTER USER 'keystone'@'%' IDENTIFIED BY 'keystone';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%';
FLUSH PRIVILEGES;

二、安装配置 keystone组件

1、安装keystone

⎈[root@luckly ~]# apt-get install keystone apache2 libapache2-mod-wsgi-py3

2、安装CRUDINI编辑器(可选)

⎈[root@luckly ~]# apt-get install crudini -y

3、准备keystone配置文件

修改 /etc/keystone/keystone.conf[database][token]的值

⎈[root@luckly ~]# crudini --set /etc/keystone/keystone.conf database connection mysql+pymysql://keystone:keystone@10.0.0.80/keystone
⎈[root@luckly ~]# crudini --set /etc/keystone/keystone.conf token provider fernet
⎈[root@luckly ~]# grep -A2 "\[database\]" /etc/keystone/keystone.conf 
[database]
connection = mysql+pymysql://keystone:keystone@10.0.0.80/keystone
⎈[root@luckly ~]# 
⎈[root@luckly ~]# egrep -v "^(#|$)" /etc/keystone/keystone.conf | grep -A1 "\[token\]"
[token]
provider = fernet
⎈[root@luckly ~]#

三、初始化认证服务数据库

keystone-manage db_sync会创建所有必要的表和初始数据结构

⎈[root@luckly ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
# 查看Mysql中keystone库是否生成若干张表

四、初始化Fernet keys密钥库

keystone-manage fernet_setup命令用于初始化和管理Fernet密钥库。Fernet是一种对称加密机制,用于加密和解密身份认证令牌(Tokens)。Keystone使用Fernet密钥库来生成和验证Tokens,确保身份认证的安全性。

keystone-manage credential_setup命令用于初始化和管理凭据加密密钥。Keystone使用这些密钥来加密和解密用户的凭据信息,如密码、API密钥等。这确保了用户凭据的安全性。

⎈[root@luckly ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
⎈[root@luckly ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
⎈[root@luckly ~]#

1、检查是否初始化成功

⎈[root@luckly ~]# ll /etc/keystone/fernet-keys/
total 8
-rw------- 1 keystone keystone 44 Dec 12 12:20 0
-rw------- 1 keystone keystone 44 Dec 12 12:20 1
⎈[root@luckly ~]# ll /etc/keystone/credential-keys/
total 8
-rw------- 1 keystone keystone 44 Dec 12 12:21 0
-rw------- 1 keystone keystone 44 Dec 12 12:21 1
⎈[root@luckly ~]#

五、配置bootstrap身份认证服务

⎈[root@luckly ~]# keystone-manage bootstrap --bootstrap-password 123456 --bootstrap-admin-url http://10.0.0.80:35357/v3/ --bootstrap-internal-url http://10.0.0.80:5000/v3/ --bootstrap-public-url http://10.0.0.80:5000/v3/ --bootstrap-region-id RegionOne
⎈[root@luckly ~]#

keystone-manage bootstrap 命令用于:

  • 创建初始的管理员用户。
  • 配置Keystone服务的API端点。
  • 设置服务目录中的初始服务和端点。
  • 初始化默认的域和项目。

六、配置Apache HTTP服务器

⎈[root@luckly ~]# cat /etc/apache2/sites-available/keystone.conf
Listen 5000
Listen 35357

<VirtualHost *:5000>
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public
    WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    LimitRequestBody 114688

    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>

    ErrorLog /var/log/apache2/keystone.log
    CustomLog /var/log/apache2/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>

Alias /identity /usr/bin/keystone-wsgi-public
<Location /identity>
    SetHandler wsgi-script
    Options +ExecCGI

    WSGIProcessGroup keystone-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>

# Admin API - 35357
<VirtualHost *:35357>
    WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    LimitRequestBody 114688

    <IfVersion >= 2.4>
      ErrorLogFormat "%{cu}t %M"
    </IfVersion>

    ErrorLog /var/log/apache2/keystone-admin.log
    CustomLog /var/log/apache2/keystone-admin_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>

Alias /admin /usr/bin/keystone-wsgi-admin
<Location /admin>
    SetHandler wsgi-script
    Options +ExecCGI

    WSGIProcessGroup keystone-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
</Location>
⎈[root@luckly ~]# 
⎈[root@luckly ~]# systemctl reload apache2.service

七、导出环境变量

⎈[root@luckly ~]# export OS_USERNAME=admin
⎈[root@luckly ~]# export OS_PASSWORD=123456
⎈[root@luckly ~]# export OS_PROJECT_NAME=admin
⎈[root@luckly ~]# export OS_USER_DOMAIN_NAME=Default
⎈[root@luckly ~]# export OS_PROJECT_DOMAIN_NAME=Default
⎈[root@luckly ~]# export OS_AUTH_URL=http://10.0.0.80:5000/v3		# Public API
⎈[root@luckly ~]# export OS_AUTH_URL=http://10.0.0.80:35357/v3	# Admin API
⎈[root@luckly ~]# export OS_IDENTITY_API_VERSION=3

八、测试keystone功能

创建domainprojectuserroles,这些步骤是用于测试keystone是否工作正常的,不报错就行了

⎈[root@luckly ~]# openstack domain create --description "An Example Domain" example
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | An Example Domain                |
| enabled     | True                             |
| id          | 5653d114443b410aaff84f7caa0cdacb |
| name        | example                          |
| options     | {}                               |
| tags        | []                               |
+-------------+----------------------------------+
⎈[root@luckly ~]# 
# 创建service项目
⎈[root@luckly ~]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 770577bba57c4a4ab8fb6d9b3d1f3527 |
| is_domain   | False                            |
| name        | service                          |
| options     | {}                               |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+
⎈[root@luckly ~]# 
# 创建demo用户
⎈[root@luckly ~]# openstack user create --domain default --password-prompt demo
User Password:		# 输入密码demo
Repeat User Password:	# 输入密码demo
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | b655787b75b94076855cf7feef0d5937 |
| name                | demo                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
⎈[root@luckly ~]# 
# 创建user角色
⎈[root@luckly ~]# openstack role create user
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | None                             |
| domain_id   | None                             |
| id          | 25e6e71fbfde40529a963a43971a1895 |
| name        | user                             |
| options     | {}                               |
+-------------+----------------------------------+
# 添加demo用户到demo项目和user角色
⎈[root@luckly ~]# openstack role add --project demo --user demo user
⎈[root@luckly ~]#

现在发现都不报错,可以创建环境变量文件了

cat > openstack-admin <<'EOF'
export OS_USERNAME=admin
export OS_PASSWORD=123456
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://10.0.0.80:35357/v3
# export OS_AUTH_URL=http://10.0.0.80:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF

创建好之后,以后再执行任何openstack命令,就只需要source openstack-admin就可以了

© 版权声明
THE END
喜欢就支持一下吧
点赞15赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容