尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenStack Keystone 认证服务部署与配置实战指南

OpenStack Keystone 认证服务部署与配置实战指南 如果你正在学习云计算特别是 OpenStack那么认证服务 Keystone 绝对是你绕不开的第一道坎。很多教程会告诉你 Keystone 是“身份认证服务”但新手真正卡住的地方往往不是理解概念而是照着文档操作时那些看似简单的命令背后隐藏着无数个“为什么”——为什么数据库初始化会失败为什么服务注册不上去为什么 Token 验证总是不通过这篇文章要解决的就是让你从“知道 Keystone 是什么”到“亲手把它跑起来并且理解每一步在干什么”。我们将通过一个完整的、面向初学者的上机实验把 Keystone 的安装、配置、数据库初始化、服务启动和功能验证拆解成一个个可执行、可观察的步骤。你会发现只要理解了核心流程和几个关键配置文件Keystone 的配置并非“玄学”而是一套有迹可循的标准操作。读完本文你将能独立完成一个基础 Keystone 服务的部署并掌握排查常见启动和配置问题的思路。这不仅是完成一次实验更是理解 OpenStack 整个认证体系如何运转的开始。1. Keystone 到底解决了什么问题为什么它是 OpenStack 的“第一关”在深入命令行之前我们先要搞清楚 Keystone 的定位。你可以把它想象成 OpenStack 这个庞大云数据中心的“总门禁系统”。没有 Keystone 会怎样假设 Nova计算服务想调用 Glance镜像服务来获取一个镜像。Nova 怎么证明自己是合法的服务它又凭什么相信 Glance 是它要找的那个服务如果没有一个中心化的认证机构每个服务之间都需要两两建立复杂的信任关系这几乎是一个无法维护的“信任网”。Keystone 的出现就是为了解决三个核心问题身份认证 (Authentication)你是谁用户人或服务如 Nova通过提供凭证如密码、Token来证明自己的身份。授权 (Authorization)你能干什么认证通过后Keystone 会告诉你你拥有哪些项目的哪些权限角色。服务目录 (Service Catalog)你要找的服务在哪里Keystone 维护了一个所有已注册 OpenStack 服务的地址簿Endpoint。Nova 需要找 Glance 时不是硬编码一个地址而是去问 Keystone“Glance 的镜像服务地址在哪”因此任何其他 OpenStack 服务Nova, Glance, Neutron等在启动前都必须先在 Keystone 中注册自己并且后续的所有跨服务调用都需要经过 Keystone 的认证和授权。这就是为什么 Keystone 必须是第一个被安装和配置的服务。它不先跑起来整个 OpenStack 的“社交网络”就无法建立。2. 实验环境与核心概念准备在开始动手前请确保你的实验环境符合以下要求。一个清晰的环境是成功的一半。2.1 实验环境要求操作系统推荐 Ubuntu 20.04 LTS 或 22.04 LTS。本文命令以 Ubuntu 为例CentOS/RHEL 系列在包管理和部分路径上略有不同。权限所有操作都需要root权限。建议直接切换到root用户或在每条命令前加sudo。网络确保主机可以访问互联网以下载软件包并且主机名解析正常/etc/hosts配置正确。OpenStack 版本本文以 OpenStackVictoria版本为例进行演示。不同版本间 Keystone 的配置项可能略有增减但核心架构和流程完全一致。请根据你的目标版本调整软件包版本。2.2 核心概念速览为了避免在配置文件中看到一堆术语发懵我们先快速过一遍接下来会频繁出现的几个词项目 (Project)资源的容器。早期版本也叫“租户 (Tenant)”。用户必须归属于一个或多个项目并在某个项目内使用资源。用户 (User)可以是真人用户也可以是服务账号。拥有密码等凭证。角色 (Role)定义了一组权限如admin,member,reader。将角色赋予某个用户在某个项目上即完成了授权。域 (Domain)项目的更高层级分组用于多租户隔离。在简单实验环境中我们通常使用默认域default。服务 (Service)指 OpenStack 的各个功能组件如nova(计算),glance(镜像),keystone(身份)等。端点 (Endpoint)服务的访问地址URL。通常分为public(公网),internal(内网),admin(管理) 三种类型。令牌 (Token)一串由 Keystone 颁发的、有时效性的字符串是访问其他服务的“临时通行证”。理解了这些再看配置文件里的[DEFAULT] admin_project_name或命令行里的--project参数就不会觉得陌生了。3. 基础环境搭建与依赖安装我们的目标是搭建一个独立运行的 Keystone 服务它使用 SQLite 数据库简化实验和 Fernet Token 提供者推荐方式。步骤 1更新系统并安装基础工具apt update apt upgrade -y apt install -y python3-openstackclientpython3-openstackclient是 OpenStack 的统一命令行客户端后续我们创建用户、项目等操作都要靠它。步骤 2安装 Keystone 及其依赖apt install -y keystone apache2 libapache2-mod-wsgi-py3keystone: 核心服务包。apache2libapache2-mod-wsgi-py3: 在 Victoria 及之后版本Keystone 默认通过 Apache HTTPD 和 WSGI 模块来运行服务替代了老版本的自带keystone-wsgi-public服务。这是一种更标准、更易维护的部署方式。步骤 3配置数据库使用 SQLiteKeystone 需要数据库来存储用户、项目、令牌等信息。生产环境用 MySQL/MariaDB但实验环境为了简化我们使用 SQLite。编辑 Keystone 主配置文件vim /etc/keystone/keystone.conf找到[database]部分将其修改为[database] # 连接字符串指定使用 SQLite 数据库文件位于 /var/lib/keystone/keystone.db connection sqlite:////var/lib/keystone/keystone.db注如果是生产环境这里应该是connection mysqlpymysql://keystone:KEYSTONE_DBPASScontroller/keystone格式并需要预先创建数据库和用户。4. 核心配置详解Fernet Token 与 Apache WSGI这是最容易出错的环节我们慢一点。4.1 配置 Fernet TokenFernet 是一种对称加密的令牌格式无需持久化到数据库性能更好是当前推荐方式。首先初始化 Fernet 密钥库。这些密钥用于加密和解密 Token。keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone keystone-manage credential_setup --keystone-user keystone --keystone-group keystone命令会生成密钥文件默认位于/etc/keystone/fernet-keys/目录下。确保该目录权限正确keystone用户可读。接着在keystone.conf中配置使用 Fernet。# 在 [DEFAULT] 部分或 [token] 部分确认 [DEFAULT] ... provider fernet [token] provider fernet4.2 配置 Apache WSGI这是 Victoria 版本的关键变化。Keystone 不再自己监听端口而是作为 WSGI 应用挂载到 Apache 下。检查 Apache 模块确保wsgi模块已启用。a2enmod wsgi配置 Apache 虚拟主机Ubuntu 的 Keystone 包通常会安装一个配置文件/etc/apache2/sites-available/keystone.conf。如果没有需要创建。其核心内容是指定 WSGI 应用脚本的位置。# /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/apache2/keystone-error.log CustomLog /var/log/apache2/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/apache2/keystone-error.log CustomLog /var/log/apache2/keystone-access.log combined Directory /usr/bin Require all granted /Directory /VirtualHost5000端口用于公共 API (publicendpoint)。35357端口用于管理 API (adminendpoint)。注意较新版本已逐渐弃用 35357统一使用 5000但配置可能仍保留。WSGIScriptAlias将 URL 路径映射到 Keystone 提供的 WSGI 脚本。这些脚本 (keystone-wsgi-public,keystone-wsgi-admin) 在安装 Keystone 时已生成。启用站点并重启 Apachea2ensite keystone systemctl restart apache2 systemctl enable apache25. 引导数据库与初始化服务数据配置写好了现在需要让 Keystone 创建它所需要的表结构并注入最初始的管理员账号等信息。步骤 1同步数据库建表su -s /bin/sh -c keystone-manage db_sync keystone这个命令以keystone系统用户的身份读取/etc/keystone/keystone.conf中的数据库连接信息然后在数据库中创建所有必要的表。关键点必须用keystone用户执行以保证后续服务进程有正确的文件权限。如果看到Operation successful或没有报错通常就成功了。可以查看 SQLite 文件是否生成ls -lh /var/lib/keystone/keystone.db。步骤 2引导身份服务Bootstrap这是初始化管理员账号、服务目录等核心数据的一步。keystone-manage bootstrap --bootstrap-password ADMIN_PASS \ --bootstrap-admin-url http://controller:5000/v3/ \ --bootstrap-internal-url http://controller:5000/v3/ \ --bootstrap-public-url http://controller:5000/v3/ \ --bootstrap-region-id RegionOne请将ADMIN_PASS替换为一个强密码如MySuperSecretPass123并将controller替换为你实际的主机名或 IP 地址如果只在单机实验可以用localhost或127.0.0.1。这个命令做了以下几件大事在default域中创建了一个admin项目。在default域中创建了一个admin用户密码就是你设置的ADMIN_PASS。创建了admin角色。将admin角色赋予admin用户在admin项目上。创建了keystone服务。为keystone服务创建了public,internal,admin三个端点 (Endpoint)地址都是你指定的 URL。创建了一个RegionOne区域。至此Keystone 服务本身需要的基础数据已经全部就绪。6. 配置 OpenStack 客户端环境变量为了方便后续使用openstack命令行工具我们需要设置环境变量告诉客户端去哪里认证、用什么账号。创建一个文件例如admin-openrc.shvim ~/admin-openrc.sh内容如下export OS_USERNAMEadmin export OS_PASSWORDADMIN_PASS # 替换为你的 bootstrap 密码 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 export OS_REGION_NAMERegionOne然后加载这个环境变量文件source ~/admin-openrc.sh加载后你执行的任何openstack命令都会自动使用这里配置的管理员身份去 Keystone 获取 Token 并操作。7. 功能验证亲手创建项目、用户和角色理论配置完成现在让我们用命令行实际验证 Keystone 是否工作正常。这是最有成就感的一步。验证 1获取令牌 (Token)openstack token issue如果配置正确你会看到一个详细的 JSON 输出包含一个id字段就是 Token 字符串以及过期时间、签发者、所属项目等信息。看到这个就证明 Keystone 的认证核心功能是通的验证 2创建新项目、用户和角色我们来模拟一个真实场景创建一个开发项目、一个开发用户并赋予其成员角色。创建项目demo:openstack project create --domain default --description Demo Project demo创建用户demo:openstack user create --domain default --password-prompt demo执行后会提示你输入并确认该用户的密码。创建角色member(如果不存在):openstack role create member将member角色赋予demo用户在demo项目上:openstack role add --project demo --user demo member验证授权现在我们可以切换到demo用户的视角来操作。首先创建一个新的环境变量文件demo-openrc.shexport OS_USERNAMEdemo export OS_PASSWORDDEMO_USER_PASS # 替换为你设置的 demo 用户密码 export OS_PROJECT_NAMEdemo export OS_USER_DOMAIN_NAMEDefault export OS_PROJECT_DOMAIN_NAMEDefault export OS_AUTH_URLhttp://controller:5000/v3 export OS_IDENTITY_API_VERSION3 export OS_REGION_NAMERegionOne加载它 (source demo-openrc.sh)然后尝试列出镜像虽然还没装 Glance或创建网络你会收到403 Forbidden错误这是正常的因为它证明了权限系统在起作用——member角色没有管理员权限。但你可以成功执行openstack token issue获取到属于demo项目的 Token。通过这一系列操作你不仅验证了 Keystone 服务是活的更直观地理解了用户-项目-角色这三者之间的授权关系是如何在 Keystone 中建立和生效的。8. 常见问题与排查思路 (FAQ)在实验过程中你可能会遇到以下问题。别慌按照这个思路排查。问题现象可能原因排查方式解决方案openstack token issue返回401 Unauthorized1. 管理员密码错误。2. Apache 服务未运行或端口未监听。3.admin-openrc.sh中OS_AUTH_URL写错。1. 检查OS_PASSWORD环境变量。2.systemctl status apache2netstat -tlnp | grep :5000。3. 检查OS_AUTH_URL是否包含正确的 IP/主机名和端口 (/v3)。1. 确认密码。2. 重启 Apache检查防火墙是否开放 5000 端口。3. 修正 URL。keystone-manage db_sync失败提示数据库连接错误1.keystone.conf中[database] connection配置错误。2. SQLite 文件路径权限不足。1. 检查keystone.conf中连接字符串的拼写和路径。2. 检查/var/lib/keystone/目录所有者是否为keystone。1. 修正连接字符串。2.chown -R keystone:keystone /var/lib/keystone/。Apache 启动失败日志报错WSGI script … not foundkeystone-wsgi-public或keystone-wsgi-admin文件不存在。ls -l /usr/bin/keystone-wsgi-*可能是 Keystone 包安装不完整。尝试重装apt install --reinstall keystone。执行openstack命令报Missing value auth-url required环境变量未正确加载。执行env | grep OS_查看当前环境变量。确保已source对应的-openrc.sh文件。创建用户或项目时提示Conflict或已存在重复创建同名实体。openstack user list或openstack project list查看。使用不同的名称或先删除已有实体 (openstack user delete name)。Token 能获取但操作其他服务如列出镜像失败1. 其他服务Glance未安装或未启动。2. Keystone 中未注册该服务的 Endpoint。3. 用户角色在该项目上无权限。1. 检查其他服务状态。2.openstack endpoint list查看服务端点。3. 检查用户角色分配openstack role assignment list --user user --project project。1. 安装并配置其他服务。2. 在其他服务配置中正确向 Keystone 注册。3. 赋予相应角色。最重要的排查工具是日志Keystone 服务日志tail -f /var/log/apache2/keystone-error.logApache 访问日志tail -f /var/log/apache2/keystone-access.logKeystone 自身日志如果配置了tail -f /var/log/keystone/keystone.log遇到错误首先看日志通常会有非常明确的错误信息。9. 生产环境考量与最佳实践本次实验为了简化使用了 SQLite 和简单的密码。对于任何严肃的测试或生产环境以下几点必须调整数据库绝对不要使用 SQLite。必须切换到 MySQL/MariaDB 或 PostgreSQL。你需要在数据库服务器上创建keystone数据库和用户。将keystone.conf中的connection改为mysqlpymysql://keystone:DB_PASSdb_host/keystone。安装对应的 Python 驱动apt install -y python3-pymysql。高可用 (HA)生产环境需要部署多个 Keystone 节点通过负载均衡器如 HAProxy对外提供 VIP并使用共享数据库和分布式 Memcached/Redis 集群来缓存 Token。Token 提供者Fernet 是推荐选择。对于大规模集群可以考虑使用[token] driver memcache或[token] driver redis将 Token 存储在内存数据库中以提高验证性能并支持撤销。安全加固使用 HTTPS在所有 Endpoint 配置中使用https://并在 Apache 中配置 SSL 证书。强密码策略通过[security_compliance]部分配置密码最小长度、过期时间、历史记录等。限制管理端点访问通过防火墙策略确保adminendpoint (如35357端口) 仅能从管理网络访问。定期轮转 Fernet 密钥使用keystone-manage fernet_rotate命令。配置管理不要手动编辑配置文件。使用 Ansible, Puppet, Chef 或 OpenStack 自身的部署工具如 Kolla-Ansible, OpenStack-Helm来管理配置确保一致性和可重复性。完成这个实验你已经成功闯过了 OpenStack 部署的“第一关”。你得到的不仅仅是一个运行的 Keystone 服务更是一张理解 OpenStack 各组件如何通过认证服务进行协作的蓝图。接下来当你部署 Nova、Glance、Neutron 时你会反复回到这里——为它们创建服务账号、注册服务端点、配置认证信息。那时你会对今天每一步操作的意义有更深的理解。建议你将admin-openrc.sh和关键的排查命令保存下来它们会成为你 OpenStack 运维工具箱中最常用的几把钥匙。
返回列表