
1. Added config files and edited scripts to build the RST Cloud Admin Guide 2. Converted the identity management chapter to RST Change-Id: I9ee53d5ad0d4b4ffaf228c7229364d6a84076721
11 KiB
Identity management
OpenStack Identity, code-named keystone, is the default identity
management system for OpenStack. After you install Identity, you
configure it through the etc/keystone.conf
configuration file and, possibly, a
separate logging configuration file. You initialize data into Identity
by using the keystone
command-line client.
Identity concepts
User CRUD
Identity provides a user CRUD (Create, Read, Update, and Delete)
filter that can be added to the public_api
pipeline. The
user CRUD filter enables users to use a HTTP PATCH to change their own
password. To enable this extension you should define a
user_crud_extension
filter, insert it after the
"option:*_body middleware and before the
public_service
application in the public_api
WSGI pipeline in keystone-paste.ini
. For example:
[filter:user_crud_extension]
paste.filter_factory = keystone.contrib.user_crud:CrudExtension.factory
[pipeline:public_api]
pipeline = sizelimit url_normalize request_id build_auth_context token_auth admin_token_auth json_body ec2_extension user_crud_extension public_service
Each user can then change their own password with a HTTP PATCH:
$ curl -X PATCH http://localhost:5000/v2.0/OS-KSCRUD/users/USERID -H "Content-type: application/json" \
-H "X_Auth_Token: AUTHTOKENID" -d '{"user": {"password": "ABCD", "original_password": "DCBA"}}'
In addition to changing their password, all current tokens for the user are invalidated.
Note
Only use a KVS back end for tokens when testing.
Logging
You configure logging externally to the rest of Identity. The name of
the file specifying the logging configuration is set using the
log_config
option in the [DEFAULT]
section of
the keystone.conf
file. To route logging through syslog, set use_syslog=true
in the [DEFAULT]
section.
A sample logging configuration file is available with the project in
etc/logging.conf.sample
. Like other OpenStack
projects, Identity uses the Python logging module, which provides
extensive configuration options that let you define the output levels
and formats.
Start the Identity services
To start the services for Identity, run the following command:
$ keystone-all
This command starts two wsgi.Server instances configured by the keystone.conf
file as
described previously. One of these wsgi servers is admin
(the administration API) and the other is main
(the
primary/public API interface). Both run in a single process.
Example usage
The keystone
client is set up to expect commands in the
general form of keystone command argument
, followed by
flag-like keyword arguments to provide additional (often optional)
information. For example, the user-list
and tenant-create
commands can be invoked as
follows:
# Using token auth env variables
export OS_SERVICE_ENDPOINT=http://127.0.0.1:5000/v2.0/
export OS_SERVICE_TOKEN=secrete_token
keystone user-list
keystone tenant-create --name demo
# Using token auth flags
keystone --os-token secrete --os-endpoint http://127.0.0.1:5000/v2.0/ user-list
keystone --os-token secrete --os-endpoint http://127.0.0.1:5000/v2.0/ tenant-create --name=demo
# Using user + password + project_name env variables
export OS_USERNAME=admin
export OS_PASSWORD=secrete
export OS_PROJECT_NAME=admin
openstack user list
openstack project create demo
# Using user + password + project-name flags
openstack --os-username admin --os-password secrete --os-project-name admin user list
openstack --os-username admin --os-password secrete --os-project-name admin project create demo
Authentication middleware with user name and password
You can also configure Identity authentication middleware using the
admin_user
and admin_password
options.
Note
The admin_token
option is deprecated and no longer used
for configuring auth_token middleware.
For services that have a separate paste-deploy .ini
file, you can configure
the authentication middleware in the [keystone_authtoken]
section of the main configuration file, such as nova.conf
. In Compute, for
example, you can remove the middleware parameters from api-paste.ini
, as
follows:
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
Note
Prior to the Juno release, the auth_token
middleware was
in python-keystoneclient
. The filter_factory
must be set to
keystoneclient.middleware.auth_token:filter_factory
in
those releases.
And set the following values in nova.conf
as follows:
[DEFAULT]
...
auth_strategy=keystone
[keystone_authtoken]
auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
admin_user = admin
admin_password = SuperSekretPassword
admin_tenant_name = service
Note
The middleware parameters in the paste config take priority. You must
remove them to use the values in the [keystone_authtoken]
section.
Note
Comment out any auth_host
, auth_port
, and
auth_protocol
options because the identity_uri
option replaces them.
This sample paste config filter makes use of the
admin_user
and admin_password
options:
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
auth_uri = http://controller:5000/v2.0
identity_uri = http://controller:35357
auth_token = 012345SECRET99TOKEN012345
admin_user = admin
admin_password = keystone123
Note
Using this option requires an admin tenant/role relationship. The admin user is granted access to the admin role on the admin tenant.
Note
Comment out any auth_host
, auth_port
, and
auth_protocol
options because the identity_uri
option replaces them.
Note
Prior to the Juno release, the auth_token middleware
was
in python-keystoneclient
. The filter_factory
must be set to
keystoneclient.middleware.auth_token:filter_factory
in
those releases.
Identity API protection with role-based access control (RBAC)
Like most OpenStack projects, Identity supports the protection of its
APIs by defining policy rules based on an RBAC approach. Identity stores
a reference to a policy JSON file in the main Identity configuration
file, keystone.conf
.
Typically this file is named policy.json
, and contains the
rules for which roles have access to certain actions in defined
services.
Each Identity API v3 call has a line in the policy file that dictates which level of governance of access applies.
API_NAME: RULE_STATEMENT or MATCH_STATEMENT
Where:
RULE_STATEMENT
can contain RULE_STATEMENT
or MATCH_STATEMENT
.
MATCH_STATEMENT
is a set of identifiers that must match
between the token provided by the caller of the API and the parameters
or target entities of the API call in question. For example:
"identity:create_user": [["role:admin", "domain_id:%(user.domain_id)s"]]
Indicates that to create a user, you must have the admin role in your
token. The domain_id
in your token must match the
domain_id
in the user object that you are trying to create,
which implies this must be a domain-scoped token. In other words, you
must have the admin role on the domain in which you are creating the
user, and the token that you use must be scoped to that domain.
Each component of a match statement uses this format:
ATTRIB_FROM_TOKEN:CONSTANT or ATTRIB_RELATED_TO_API_CALL
The Identity service expects these attributes:
Attributes from token:
user_id
domain_id
project_id
The project_id
attribute requirement depends on the
scope, and the list of roles you have within that scope.
Attributes related to API call:
user.domain_id
- Any parameters passed into the API call
- Any filters specified in the query string
You reference attributes of objects passed with an object.attribute
syntax (such as, user.domain_id
). The target objects of an
API are also available using a target.object.attribute syntax. For
instance:
"identity:delete_user": [["role:admin", "domain_id:%(target.user.domain_id)s"]]
would ensure that Identity only deletes the user object in the same domain as the provided token.
Every target object has an id
and a name
available as target.OBJECT.id
and
target.OBJECT.name
. Identity retrieves other attributes
from the database, and the attributes vary between object types. The
Identity service filters out some database fields, such as user
passwords.
List of object attributes:
role:
target.role.id
target.role.name
user:
target.user.default_project_id
target.user.description
target.user.domain_id
target.user.enabled
target.user.id
target.user.name
group:
target.group.description
target.group.domain_id
target.group.id
target.group.name
domain:
target.domain.enabled
target.domain.id
target.domain.name
project:
target.project.description
target.project.domain_id
target.project.enabled
target.project.id
target.project.name
The default policy.json
file supplied provides a somewhat basic
example of API protection, and does not assume any particular use of
domains. Refer to policy.v3cloudsample.json
as an example of
multi-domain configuration installations where a cloud provider wants to
delegate administration of the contents of a domain to a particular
admin domain
. This example policy file also shows the use
of an admin_domain
to allow a cloud provider to enable
cloud administrators to have wider access across the APIs.
A clean installation could start with the standard policy file, to
allow creation of the admin_domain
with the first users
within it. You could then obtain the domain_id
of the admin
domain, paste the ID into a modified version of policy.v3cloudsample.json
,
and then enable it as the main policy file.