2.3.11.5. 在 Keystone 中配置和使用 STS Lite(技术预览)

同一命名空间中的 Amazon 安全令牌服务(STS)和 S3 API 共存。STS 选项可以和 Keystone 选项一起配置。

注意

S3 和 STS API 都可以使用 Ceph 对象网关中的同一端点来访问。

先决条件

  • Red Hat Ceph Storage 3.2 或更高版本。
  • 正在运行的 Ceph 对象网关.
  • 安装 Boto Python 模块,版本 3 或更高版本。

流程

  1. 使用以下选项打开并编辑 group_vars/rgws.yml 文件:

    rgw_sts_key = STS_KEY
    rgw_s3_auth_use_sts = true

    替换:

    • STS_KEY 带有用于加密会话令牌的密钥。
  2. 再次运行适当的 Ceph Ansible playbook:

    1. 裸机部署:

      [user@admin ceph-ansible]$ ansible-playbook site.yml --limit rgws
    2. 容器部署:

      [user@admin ceph-ansible]$ ansible-playbook site-docker.yml --limit rgws
  3. 生成 EC2 凭证:

    示例

    [user@osp ~]$ openstack ec2 credentials create
    
    +------------+--------------------------------------------------------+
    | Field      | Value                                                  |
    +------------+--------------------------------------------------------+
    | access     | b924dfc87d454d15896691182fdeb0ef                       |
    | links      | {u'self': u'http://192.168.0.15/identity/v3/users/     |
    |            | 40a7140e424f493d8165abc652dc731c/credentials/          |
    |            | OS-EC2/b924dfc87d454d15896691182fdeb0ef'}              |
    | project_id | c703801dccaf4a0aaa39bec8c481e25a                       |
    | secret     | 6a2142613c504c42a94ba2b82147dc28                       |
    | trust_id   | None                                                   |
    | user_id    | 40a7140e424f493d8165abc652dc731c                       |
    +------------+--------------------------------------------------------+

  4. 使用生成的凭证,通过 GetSessionToken API 来备份一组临时安全凭证。

    示例

    import boto3
    
    access_key = b924dfc87d454d15896691182fdeb0ef
    secret_key = 6a2142613c504c42a94ba2b82147dc28
    
    client = boto3.client('sts',
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key,
    endpoint_url=https://www.example.com/rgw,
    region_name='',
    )
    
    response = client.get_session_token(
        DurationSeconds=43200
    )

  5. 获取临时凭证可用于发出 S3 调用:

    示例

    s3client = boto3.client('s3',
      aws_access_key_id = response['Credentials']['AccessKeyId'],
      aws_secret_access_key = response['Credentials']['SecretAccessKey'],
      aws_session_token = response['Credentials']['SessionToken'],
      endpoint_url=https://www.example.com/s3,
      region_name='')
    
    bucket = s3client.create_bucket(Bucket='my-new-shiny-bucket')
    response = s3client.list_buckets()
    for bucket in response["Buckets"]:
      print "{name}\t{created}".format(
        name = bucket['Name'],
        created = bucket['CreationDate'],
      )

  6. 创建新的 S3Access 角色并配置策略。

    1. 使用管理 CAPS 为用户分配:

      语法

      radosgw-admin caps add --uid="USER" --caps="roles=*"

      示例

      [user@client]$ radosgw-admin caps add --uid="gwadmin" --caps="roles=*"

    2. 创建 S3Access 角色:

      语法

      radosgw-admin role create --role-name=ROLE_NAME --path=PATH --assume-role-policy-doc=TRUST_POLICY_DOC

      示例

      [user@client]$ radosgw-admin role create --role-name=S3Access --path=/application_abc/component_xyz/ --assume-role-policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\[\{\"Effect\":\"Allow\",\"Principal\":\{\"AWS\":\[\"arn:aws:iam:::user/TESTER\"\]\},\"Action\":\[\"sts:AssumeRole\"\]\}\]\}

    3. 将权限策略附加到 S3Access 角色:

      语法

      radosgw-admin role-policy put --role-name=ROLE_NAME --policy-name=POLICY_NAME --policy-doc=PERMISSION_POLICY_DOC

      示例

      [user@client]$ radosgw-admin role-policy put --role-name=S3Access --policy-name=Policy --policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\[\{\"Effect\":\"Allow\",\"Action\":\[\"s3:*\"\],\"Resource\":\"arn:aws:s3:::example_bucket\"\}\]\}

    4. 现在,另一个用户可以假定 gwadmin 用户的角色。例如,gwuser 用户可以假定 gwadmin 用户权限。
    5. 记录假定用户的 access_keysecret_key 值。

      示例

      [user@client]$ radosgw-admin user info --uid=gwuser | grep -A1 access_key

  7. 使用 AssumeRole API 调用,提供来自假定用户的 access_keysecret_key 值:

    示例

    import boto3
    
    access_key = 11BS02LGFB6AL6H1ADMW
    secret_key = vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY
    
    client = boto3.client('sts',
    aws_access_key_id=access_key,
    aws_secret_access_key=secret_key,
    endpoint_url=https://www.example.com/rgw,
    region_name='',
    )
    
    response = client.assume_role(
    RoleArn='arn:aws:iam:::role/application_abc/component_xyz/S3Access',
    RoleSessionName='Bob',
    DurationSeconds=3600
    )

    重要

    AssumeRole API 需要 S3Access 角色。

其它资源

  • 有关安装 Boto Python 模块的更多信息,请参阅 Red Hat Ceph Storage Object Gateway 指南中的 Test S3 Access 部分。
  • 如需更多信息,请参阅 Red Hat Ceph Storage Object Gateway 指南中的 创建用户 部分。