
telefonicaiot/fiware-keystone-spassword、密码恢复流程、双因素认证(2FA)等。
通过 RPM 安装非常简单:
shrpm -Uvh keystone-spassword-*.noarch.rpm
安装后可微调配置选项(默认配置位于 /etc/keystone/keystone.conf):
[spassword] enabled = true pwd_exp_days = 365 pwd_max_tries = 5 pwd_block_minutes = 30 pwd_user_blacklist = user_id_list smtp_server = '0.0.0.0' smtp_port = 587 smtp_tls = true smtp_user = '***' smtp_password = 'yourpassword' smtp_from = 'smtpuser'
enabled:布尔值,启用(true)或禁用(false)Keystone SPASSWORD 插件功能。pwd_exp_days:密码过期时间(天),若用户未在此期限前更改密码则密码过期。pwd_max_tries:登录尝试失败的最大次数,超过后账户将被锁定。pwd_block_minutes:账户锁定时间(分钟)。pwd_user_blacklist:以逗号分隔的用户 ID 列表,这些用户不受 SPASSWORD 限制。keystone-spassword 启用了两个新的认证和身份插件,扩展了默认插件以确保强密码使用、检查过期时间及控制登录失败尝试次数。此外,它扩展了 Keystone 通过 "POST /v3/auth/tokens" 返回给用户的令牌数据,在令牌的 'extra' 字典中包含新字段:
json"extras": { "password_creation_time": "2016-12-01T08:55:34Z", "pwd_user_in_blacklist": false, "password_expiration_time": "2017-12-01T08:55:34Z", "last_login_attempt_time": "2017-05-01T06:45:00Z" }
需在配置中设置认证和身份插件:
[auth] password=keystone_spassword.contrib.spassword.SPassword
及
[identity] driver=keystone_spassword.contrib.spassword.backends.sql.Identity
添加过滤器配置:
[filter:spassword_checker] paste.filter_factory = keystone_spassword.contrib.spassword.routers:PasswordExtension.factory [filter:spassword_time] paste.filter_factory = keystone_spassword.contrib.spassword:PasswordMiddleware.factory
重启 Keystone 服务:
shsudo service openstack-keystone restart
将插件的 TGZ 文件解压到 Python site-packages 目录,从 Keystone 的 contrib 目录创建软链接指向该目录。详细步骤参见 [RPM 规范步骤]./keystone-spassword.spec)。
完整的 Keystone 开发环境安装指南:
[***]
提供包含 Keystone + keystone scim 插件 + keystone spassword 插件的 Docker 容器镜像: [***]
配置相关的[环境变量
如何升级到最新(1.18.0)Docker 版本: 升级到 1.18.0 版本前,需先升级到 1.17.0 版本。根据起始版本,可能需要执行特定步骤。
常规升级流程:停止容器,更新 docker-compose 中的版本,重新启动容器;容器将被重建。但如果起始版本在 1.4.X 至 1.6.X 之间,则需执行额外步骤。无论如何,确保备份 MySQL Keystone 数据库:
shmysqldump -u root -p keystone > keystone_backup.sql
并在迁移的每个步骤中检查 Keystone 是否正常工作(如能否认证)。
另一种备份 Keystone 数据库的方法:
shecho "create database new_keystone" | mysql -u root -p mysqldump -u root --password=<密码> keystone | mysql -u root -p new_keystone
从 1.4.X 升级
需先升级到 1.5.4 版本,再执行该版本的升级步骤。此步骤中,重要的是使用 Keystone 创建的 SQL 架构,而非仅从 SQL 转储备份恢复,因为 SQL 转储备份可能缺少 1.4.x 到 1.5.x 迁移所需的所有数据。更多信息见 [***]
从 1.5.X 或 1.6.0 升级
需执行以下操作:
在更新 docker-compose 中的镜像前,备份 keystone.spassword 表:
shmysqldump -u root -p keystone spassword > table_spassword.sql
执行以下命令:
shmysql -h iot-mysql -u root -p use keystone; drop table spassword; delete from migrate_version where repository_id='keystone_spassword';
然后停止容器,更新 docker-compose 中的镜像版本并重启容器。检查 Keystone 正常工作后,可选择恢复 spassword 表:
shmysql -u root -p keystone < table_spassword.sql
再次重启 Keystone 容器。
从 1.7.0 或更高版本升级到 1.17.0
无需额外操作。
从 1.17.0 升级到 1.18.1
无需额外操作。
从 1.18.1 升级到 1.19.1
无需额外操作。升级到 1.19.1 版本前需先升级到 1.18.1 版本。
自 1.21.0 版本起,Keystone SPASSWORD 支持从 MySQL 迁移到 PostgreSQL。
前提条件
MySQL 8 的默认认证插件为 caching_sha2_password,不被迁移工具 pgloader 支持。需在 [mysqld] 部分添加:
default-authentication-plugin=mysql_native_password
重启 MySQL 服务器后执行:
ALTER USER 'youruser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
迁移步骤
shPGPASSWORD=postgresUser psql -h 172.17.0.1 -p 5432 -U postgresPass <<EOF CREATE DATABASE keystoneDb; CREATE USER keystoneUser WITH PASSWORD 'keystonePass'; GRANT ALL PRIVILEGES ON DATABASE keystoneDb TO keystoneUser; ALTER DATABASE keystoneDb OWNER TO keystoneUser; EOF
shpgloader mysql://keystoneUser:keystonePass@172.17.0.1:3306/keystoneDb postgresql://keystoneUser:keystonePass@172.17.0.1:5432/keystoneDb
shdocker restart keystone
SPASSWORD 扩展复用 Keystone 提供的认证和授权机制。本文档假设读者已具备 Keystone 使用经验,更多关于 Keystone 认证授权机制的信息参见官方文档。
此外,keystone-spassword 新增了处理双因素认证的 API,以及以下新 API:
GET '/v3/users/{user_id}/project_roles'
需使用与 <user_id> 用户关联的 x-auth-token。返回示例:
json[ { "domain": "8960989b51164eaeaa42200ecc79a47a", "project_name": "/smartcity/gardens", "project": "031149af6c5147a782e9cf4c56e1fe11", "role_name": "8960989b51164eaeaa42200ecc79a47a#SubServiceAdmin", "role": "e0da2d91e8154a32980ed4c5a717fd91", "user": "bace4fd6bd9b49fda5727eb83a714a3c", "user_name": "user1" }, .... ]
获取用户密码过期黑名单成员资格:
GET '/v3/users/<user_id>/black'
需使用与 <user_id> 用户关联的 x-auth-token。返回 JSON 指示用户是否在黑名单中({"black": true} 或 {"black": false}),并包含当前用户的密码过期时间(如 {"pwd_expiration_time": "2035-02-11T09:29:28.000000"})。
修改用户密码过期黑名单成员资格(启用/禁用):
POST '/v3/users/<user_id>/black'
需使用与 <user_id> 用户关联的 x-auth-token。请求体为 {"enable":true}(启用)或 {"enable":false}(禁用)。
初始化密码重置流程:
GET '/v3/users/<user_id>/recover_password'
无需与 <user_id> 用户关联的 x-auth-token。若用户有有效的已验证***,重置密码的链接将发送至该***。用户点击链接后,密码将重置并通过邮件发送给用户。
完成密码重置流程:
GET '/v3/users/<user_id>/reset_password/'
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]
[object Object]

manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务