OpenStack Keystone认证服务安装与配置实战指南

发布时间:2026/8/21 5:48:01
OpenStack Keystone认证服务安装与配置实战指南 在实际云计算平台部署中OpenStack 的认证服务 Keystone 是第一个必须正确安装和配置的核心组件。它负责管理用户、项目、角色和权限是所有其他服务如 Nova、Glance、Neutron访问的入口。很多初学者在搭建 OpenStack 实验环境时往往卡在 Keystone 的初始配置上面对数据库初始化、服务端点注册和令牌机制感到无从下手。本文将以一个最小化的、可复现的上机实验为目标带你完成 Keystone 认证服务的安装与基础配置。我们将从准备一个干净的 CentOS 或 Ubuntu 环境开始逐步完成数据库创建、Keystone 软件包安装、配置文件修改、数据库同步、服务端点创建以及最终的服务验证。整个过程会解释每一步背后的目的并重点指出配置文件中容易出错的参数以及如何通过日志和命令行工具排查常见问题。完成本实验后你将拥有一个可提供认证令牌的基础 Keystone 服务为后续集成其他 OpenStack 服务打下坚实基础。1. 实验环境准备与规划在开始安装 Keystone 之前一个清晰、隔离的实验环境至关重要。我们不建议在生产服务器或已有重要服务的机器上直接操作。1.1 操作系统与网络规划本实验基于 OpenStack 社区广泛支持的 Linux 发行版。你可以根据熟悉程度选择其一。操作系统 CentOS 7/8 Stream 或 Ubuntu 20.04/22.04 LTS。本文命令示例将同时给出两种系统的差异。主机名与网络 确保主机名解析正常。建议在/etc/hosts文件中添加本机 IP 与主机名的映射。# 编辑 hosts 文件假设你的服务器IP是 192.168.100.10主机名是 controller sudo vi /etc/hosts # 添加一行 192.168.100.10 controller防火墙与 SELinux 为了简化实验我们暂时禁用它们但在生产环境中需要精细配置规则。CentOS:sudo systemctl stop firewalld sudo systemctl disable firewalld sudo setenforce 0 sudo sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/configUbuntu:sudo ufw disable1.2 基础依赖安装OpenStack 服务通常通过特定版本的软件仓库安装。我们需要先配置 OpenStack 仓库这里以 Yoga 版本为例这是一个长期支持且稳定的版本。CentOS:# 安装 EPEL 仓库 sudo yum install -y epel-release # 安装 OpenStack Yoga 仓库 sudo yum install -y centos-release-openstack-yoga # 更新系统并升级软件包 sudo yum update -yUbuntu:# 添加 OpenStack Yoga 仓库 sudo add-apt-repository -y cloud-archive:yoga sudo apt update sudo apt upgrade -y接下来安装一些通用工具和 Python 客户端它们对后续的配置和调试很有帮助。# CentOS sudo yum install -y python3-openstackclient openstack-selinux # Ubuntu sudo apt install -y python3-openstackclient2. 数据库与消息队列服务初始化Keystone 需要后端数据库来存储其数据用户、项目、令牌等。通常使用 MariaDB 或 MySQL。同时OpenStack 服务间通过消息队列如 RabbitMQ进行异步通信虽然 Keystone 本身不重度依赖但为完整环境我们一并安装。2.1 安装与配置 MariaDB安装数据库服务器# CentOS sudo yum install -y mariadb-server mariadb # Ubuntu sudo apt install -y mariadb-server启动并设置开机自启sudo systemctl enable mariadb sudo systemctl start mariadb运行安全初始化脚本 这个脚本会设置 root 密码、移除匿名用户、禁止远程 root 登录等。sudo mysql_secure_installation执行时根据提示设置一个强密码例如KEYSTONE_DBPASS并对所有安全相关问题回答 “Y”。为 Keystone 创建专用数据库和用户sudo mysql -u root -p在 MySQL 提示符下执行以下 SQL 语句。请将KEYSTONE_DBPASS替换为你设定的强密码。-- 创建 keystone 数据库 CREATE DATABASE keystone; -- 创建 keystone 数据库用户并授予其对该数据库的全部权限 -- 注意keystonelocalhost 表示只允许从本机连接生产环境可能需要调整 GRANT ALL PRIVILEGES ON keystone.* TO keystonelocalhost IDENTIFIED BY KEYSTONE_DBPASS; -- 同样授权给从控制器主机名连接的用户根据你的网络规划 GRANT ALL PRIVILEGES ON keystone.* TO keystone% IDENTIFIED BY KEYSTONE_DBPASS; -- 刷新权限 FLUSH PRIVILEGES; -- 退出 EXIT;2.2 安装与配置 RabbitMQ安装 RabbitMQ 服务器# CentOS sudo yum install -y rabbitmq-server # Ubuntu sudo apt install -y rabbitmq-server启动并设置开机自启sudo systemctl enable rabbitmq-server sudo systemctl start rabbitmq-server添加 OpenStack 用户 这里我们创建一个名为openstack的用户密码设为RABBIT_PASS请自行更改。sudo rabbitmqctl add_user openstack RABBIT_PASS # 授予该用户对所有虚拟主机的配置、读、写权限 sudo rabbitmqctl set_permissions openstack .* .* .*3. Keystone 服务安装与核心配置这是最关键的一步任何配置文件的错误都会导致服务无法启动或认证失败。3.1 安装 Keystone 组件# CentOS sudo yum install -y openstack-keystone httpd mod_wsgi python3-openstackclient # Ubuntu sudo apt install -y keystone apache2 libapache2-mod-wsgi-py3 python3-openstackclient注意在 CentOS 8/Rocky Linux 8 及以后Keystone 默认通过httpd(Apache) 和mod_wsgi运行。Ubuntu 也使用 Apache。3.2 配置 Keystone 主配置文件Keystone 的主配置文件通常位于/etc/keystone/keystone.conf。在修改前建议先备份。sudo cp /etc/keystone/keystone.conf /etc/keystone/keystone.conf.bak使用文本编辑器如vi或nano打开该文件。我们需要修改[DEFAULT],[database],[token]等部分。找到对应章节进行如下修改[DEFAULT] # 启用 Fernet 令牌这是一种无状态的、更安全的令牌格式无需持久化到数据库 # 早期版本使用的 UUID 或 PKI 令牌已不推荐 provider fernet [database] # 配置数据库连接。使用你在 2.1 节中创建的密码。 # 格式mysqlpymysql://用户名:密码主机/数据库名 connection mysqlpymysql://keystone:KEYSTONE_DBPASScontroller/keystone [token] # 指定令牌的提供者为 Fernet provider fernet关键参数解释connection 这是 Keystone 连接数据库的字符串。务必确保用户名、密码、主机名controller和数据库名keystone完全正确。pymysql是 Python 的 MySQL 驱动。provider fernet Fernet 令牌是当前推荐方式。它使用密钥加密令牌信息服务端无需存储验证时只需解密即可提高了性能和可扩展性。3.3 初始化数据库与 Fernet 密钥同步数据库表结构 此命令会根据keystone.conf中的配置在keystone数据库中创建所有必要的表。sudo su -s /bin/sh -c keystone-manage db_sync keystone执行成功不会有太多输出。如果出现错误请检查[database]部分的连接字符串、数据库服务是否运行、用户权限是否正确。初始化 Fernet 密钥仓库 Fernet 令牌需要加密密钥。密钥通常有多个并定期轮换。sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone这些命令会在/etc/keystone/fernet-keys/目录下生成初始密钥。3.4 配置 Apache HTTP Server 托管 Keystone现代 OpenStack 部署使用 Apache 的mod_wsgi来托管 Keystone 的 WSGI 应用。配置 Apache 虚拟主机 编辑 Apache 的 Keystone 配置文件。CentOS/Rocky Linux:/etc/httpd/conf.d/wsgi-keystone.confUbuntu:/etc/apache2/sites-available/keystone.conf确保文件内容类似如下路径可能因系统略有差异Listen 5000 Listen 35357 VirtualHost *:5000 WSGIDaemonProcess keystone-public processes5 threads1 userkeystone groupkeystone display-name%{GROUP} WSGIProcessGroup keystone-public WSGIScriptAlias / /usr/bin/keystone-wsgi-public WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On ErrorLogFormat %{cu}t %M ErrorLog /var/log/httpd/keystone-error.log CustomLog /var/log/httpd/keystone-access.log combined Directory /usr/bin Require all granted /Directory /VirtualHost VirtualHost *:35357 WSGIDaemonProcess keystone-admin processes5 threads1 userkeystone groupkeystone display-name%{GROUP} WSGIProcessGroup keystone-admin WSGIScriptAlias / /usr/bin/keystone-wsgi-admin WSGIApplicationGroup %{GLOBAL} WSGIPassAuthorization On ErrorLogFormat %{cu}t %M ErrorLog /var/log/httpd/keystone-error.log CustomLog /var/log/httpd/keystone-access.log combined Directory /usr/bin Require all granted /Directory /VirtualHost解释 Keystone 使用两个端口5000 用于公共 API如获取令牌35357 用于管理 API如创建用户。这里配置了两个虚拟主机分别监听。启用配置并重启 Apache# CentOS/Rocky Linux sudo systemctl enable httpd sudo systemctl start httpd # Ubuntu sudo a2ensite keystone.conf sudo systemctl restart apache2验证 Apache 是否正在监听端口sudo netstat -tnlp | grep -E ‘:(5000|35357)’应该能看到httpd或apache2进程正在监听 5000 和 35357 端口。4. 引导 Keystone 服务与创建初始实体现在 Keystone 服务已经运行但数据库里还没有任何用户、项目或角色。我们需要进行“引导”bootstrap来创建初始的管理员账户和服务端点。4.1 引导 Keystone此命令会创建初始的管理员用户、项目、角色、域和服务端点。请务必设置一个非常强壮的ADMIN_PASS密码。sudo keystone-manage bootstrap --bootstrap-password ADMIN_PASS \ --bootstrap-admin-url http://controller:35357/v3/ \ --bootstrap-internal-url http://controller:5000/v3/ \ --bootstrap-public-url http://controller:5000/v3/ \ --bootstrap-region-id RegionOne参数解释--bootstrap-password: 管理员用户admin的密码。--bootstrap-*-url: 定义了 Keystone 服务自身的端点 URL。在单节点实验环境中内部、公共和管理 URL 可以相同都指向本机 (controller)。--bootstrap-region-id: 区域标识默认为RegionOne。4.2 配置管理员环境变量为了后续使用openstack命令行客户端时免去每次输入密码和端点信息的麻烦我们设置环境变量。# 将以下内容添加到你的 shell 配置文件如 ~/.bashrc 或 ~/.zshrc中然后执行 source ~/.bashrc export OS_USERNAMEadmin export OS_PASSWORDADMIN_PASS # 替换为上面设置的密码 export OS_PROJECT_NAMEadmin export OS_USER_DOMAIN_NAMEDefault export OS_PROJECT_DOMAIN_NAMEDefault export OS_AUTH_URLhttp://controller:5000/v3 export OS_IDENTITY_API_VERSION3设置完成后你可以通过openstack token issue命令测试是否能够成功获取令牌。openstack token issue如果成功你将看到一个包含令牌 ID、过期时间等信息的 JSON 输出。4.3 创建第一个非管理员项目、用户和角色一个只有admin用户的系统是不完整的。我们通常需要创建普通项目如demo和用户。创建demo项目openstack project create --domain default --description “Demo Project” demo创建demo用户 为其设置密码DEMO_PASS。openstack user create --domain default --password DEMO_PASS demo创建user角色 OpenStack 默认有admin角色我们再创建一个普通用户角色。openstack role create user将user角色授予demo用户在demo项目上openstack role add --project demo --user demo user验证非管理员用户 临时切换环境变量测试demo用户能否获取令牌。export OS_USERNAMEdemo export OS_PASSWORDDEMO_PASS export OS_PROJECT_NAMEdemo # 其他环境变量如 OS_AUTH_URL保持不变 openstack token issue成功后记得将环境变量改回admin用户以便进行后续管理操作。5. 服务验证与常见问题排查安装配置完成后必须进行系统性验证而不仅仅是检查服务进程是否在运行。5.1 基础服务状态检查检查项命令预期结果Keystone 服务进程sudo systemctl status httpd(CentOS) 或sudo systemctl status apache2(Ubuntu)状态为active (running)数据库服务sudo systemctl status mariadb状态为active (running)消息队列服务sudo systemctl status rabbitmq-server状态为active (running)端口监听sudo netstat -tnlp | grep -E ‘:(5000|35357|3306|5672)’应看到 5000, 35357 (Keystone), 3306 (MySQL), 5672 (RabbitMQ) 端口被监听5.2 认证功能测试使用openstack客户端进行端到端测试是最可靠的方式。获取管理员令牌# 确保环境变量已设置为 admin openstack token issue观察输出中是否有expires_at过期时间字段且时间在未来。列出用户和项目openstack user list openstack project list应该能看到admin和demo用户以及admin和demo项目。5.3 常见问题与排查路径即使严格按照步骤操作也可能遇到问题。以下是几个典型场景的排查思路。问题1keystone-manage db_sync失败提示数据库连接错误。现象OperationalError或Access denied for user。排查检查 MariaDB 服务是否运行sudo systemctl status mariadb。使用mysql -u keystone -p尝试手动连接验证密码是否正确。检查/etc/keystone/keystone.conf中[database]部分的connection字符串确保主机名、数据库名、用户名、密码无误。确认 MySQL 中keystone用户的授权主机‘keystone’‘localhost’和‘keystone’‘%’是否正确。问题2Apache 服务启动失败或访问http://controller:5000/v3无响应。现象systemctl status显示服务失败或curl命令超时/返回错误。排查查看 Apache 错误日志sudo tail -f /var/log/httpd/error_log(CentOS) 或sudo tail -f /var/log/apache2/error.log(Ubuntu)。日志通常会明确指出语法错误或模块加载失败。检查 Keystone 的 WSGI 文件是否存在ls -la /usr/bin/keystone-wsgi-*。检查 SELinux 或 AppArmor 是否阻止了 Apache实验环境可先禁用排查。检查防火墙是否阻止了 5000 和 35357 端口。问题3openstack token issue返回 401 Unauthorized 或 500 Internal Server Error。现象 认证失败。排查401 错误 首先确认OS_PASSWORD环境变量或命令行输入的密码绝对正确区分大小写。其次确认OS_AUTH_URL的端口和路径 (/v3) 是否正确。500 错误 这通常是服务端问题。查看 Keystone 的日志sudo tail -f /var/log/httpd/keystone-error.log。常见原因包括 Fernet 密钥路径权限错误、数据库连接池问题等。确保/etc/keystone/fernet-keys/目录及其内容对keystone用户可读。问题4创建用户或项目时提示“找不到默认域”。现象Default domain not found。排查 在 OpenStack V3 API 中所有实体都归属于一个域。引导过程会自动创建Default域。如果丢失可以手动创建openstack domain create --description “Default Domain” default。但更建议检查引导过程是否完全成功。6. 生产环境考量与后续步骤本实验旨在快速搭建一个可工作的 Keystone 服务。若要用于开发测试或生产还需要考虑以下方面6.1 安全加固启用并配置防火墙 只允许可信网络访问 5000 和 35357 端口。使用 HTTPS 在生产环境中必须使用 TLS/SSL 加密 API 端点。需要为 Apache 配置 SSL 证书并将http://改为https://。定期轮换 Fernet 密钥 使用keystone-manage fernet_rotate命令。使用强密码策略 为admin,keystone数据库用户等账户设置复杂密码。审计日志 配置并定期检查/var/log/httpd/keystone-access.log和keystone-error.log关注异常访问。6.2 高可用与性能数据库高可用 将 MariaDB 配置为主从复制或使用 Galera Cluster。Keystone 集群 部署多个 Keystone 节点前端通过负载均衡器如 HAProxy分发请求。缓存 配置 Memcached 或 Redis 作为令牌和目录信息的缓存后端在[cache]部分配置。调整 Apache 参数 根据负载调整wsgi-keystone.conf中的processes和threads数量。6.3 后续集成一个正常运行的 Keystone 是 OpenStack 的基石。接下来你可以按照类似模式安装其他服务Glance镜像服务 需要向 Keystone 注册服务并配置使用 Keystone 进行认证。Nova计算服务 同样需要 Keystone 的认证信息来与其他服务通信。Neutron网络服务 依赖 Keystone 管理其服务的用户和权限。每个服务安装时都需要在 Keystone 中创建对应的服务实体service和端点endpoint并在其配置文件中正确指向 Keystone 的认证 URL。这正是我们在本实验中先行搭建 Keystone 的意义所在——它为整个云平台提供了统一的身份入口。完成本实验后你应该已经掌握了 Keystone 服务从零安装、配置、引导到验证的完整流程。理解每个配置文件参数的作用和每个管理命令的目的远比记忆命令本身更重要。当遇到问题时养成首先查看相关日志数据库日志、Apache 日志、Keystone 日志的习惯能帮助你快速定位绝大多数配置错误。