将身份和访问管理验证与基本数据库服务结合使用

您可以在基本数据库服务中将 Oracle Database 配置为使用 Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) 验证和授权,以允许 IAM 用户使用 IAM 身份证明访问数据库。

注:Oracle Database 支持面向具有身份域的 OCI IAM 的基本数据库服务集成以及不包含身份域的旧 IAM。将 IAM 与身份域结合使用时,支持默认域用户和非默认域用户和组。

仅 Oracle Database Release 19c、Version 19.21 及更高版本 (Oracle Database Release 21c) 支持非默认自定义域。

关于 IAM 验证

OCI IAM 与基本数据库服务的集成支持数据库密码验证器验证和基于令牌的验证。有关在基本数据库服务中使用 IAM 用户的体系结构的更多信息,请参见 Authenticating and Authorizing IAM Users for Oracle DBaaS Databases 。

IAM 数据库密码验证

您可以启用 Oracle Database 实例,以允许用户使用 OCI IAM 数据库密码(使用密码验证器)进行访问。

对于密码验证器数据库访问,您可以为 IAM 用户和 OCI 应用程序创建到 Oracle Database 实例的映射。IAM 用户帐户本身在 IAM 中进行管理。用户帐户和用户组可以位于默认域中,也可以位于定制的非默认域中。

注:任何支持的 12c 及更高版本的数据库客户端都可用于 Oracle Database 的 IAM 数据库密码访问。

OCI IAM 数据库密码允许 IAM 用户登录到数据库实例,因为 Oracle Database 用户通常使用用户名和密码登录。用户输入其 IAM 用户名和 IAM 数据库密码。IAM 数据库密码是与 OCI 控制台密码不同的密码。使用具有口令验证器的 IAM 用户,只要数据库客户机支持 Oracle Database 12c 口令验证器,即可使用任何受支持的数据库客户机登录到数据库。

基于 IAM SSO 标记的验证

您可以启用 Oracle Database 实例以使用 OCI IAM SSO 令牌。

对于令牌数据库访问,您可以为 IAM 用户和 OCI 应用程序创建到 Oracle Database 实例的映射。IAM 用户帐户本身在 IAM 中进行管理。用户帐户和用户组可以位于默认域中,也可以位于定制的非默认域中。

数据库客户机可以通过多种方式获取 IAM 数据库令牌:

如果用户输入用户名和密码进行登录,则数据库驱动程序将使用密码验证器方法访问数据库作为默认方法。

先决条件

基本数据库服务上的 IAM 验证需要以下先决条件。

网络设置

在对数据库使用 IAM 验证之前,必须使用网络服务向数据库资源所在的虚拟云网络 (Virtual Cloud Network,VCN) 和子网添加服务网关、路由规则和出站安全规则。

  1. 按照创建服务网关中的说明,在数据库资源所在的 VCN 中创建服务网关。
  2. 创建服务网关后,向数据库资源所在的每个子网(VCN 中)添加路由规则和出站安全规则,以便这些资源可以使用网关使用 IAM 验证:

    1. 转到子网的 Subnet Details(子网详细信息)页面。
    2. 在 Subnet Information(子网信息)选项卡中,单击子网的 Route Table(路由表)的名称以显示其 Route Table Details(路由表详细信息)页面。
    3. 在现有路由规则表中,检查是否已存在具有以下特征的规则:

      • 目标:Oracle 服务网络中的所有 IAD 服务
      • 目标类型:服务网关
      • 目标:刚在 VCN 中创建的服务网关的名称

      如果不存在此类规则,请单击添加路由规则并添加具有这些特征的路由规则。

    4. 返回到子网的子网详细信息页面。
    5. 在子网的安全列表表中,单击子网的安全列表名称以显示其安全列表详细信息页面。
    6. 在侧边菜单的资源下,单击出站规则。
    7. 在现有出站规则表中,检查是否已存在具有以下特征的规则:

      • 无状态:否
      • 目标:Oracle 服务网络中的所有 IAD 服务
      • IP Protocol(IP 协议):TCP
      • 源端口范围:所有
      • 目的地端口范围: 443
    8. 如果不存在此类规则,请单击添加出站规则并添加具有这些特征的出站规则。

环境设置

检查是否已配置 WALLET_ROOT:

show parameters wallet_root;
NAME               TYPE        VALUE
------------------ ----------- --------
wallet_root        string

如果没有为 WALLET_ROOT 显示目录位置,您将无法使用 IAM 配置此数据库。下次为数据库打补丁时,应设置 WALLET_ROOT。新数据库将附带 WALLET_ROOT 集。

TLS 配置

将 IAM 令牌从数据库客户机发送到数据库服务器时,必须建立 TLS 连接。带有基本数据库服务实例数据库证书的 TLS wallet 必须存储在 WALLET_ROOT 位置下。创建 tls 目录,使其看起来像:WALLET_ROOT/<PDB GUID>/tls

在数据库客户机和服务器之间配置 TLS 时,需要考虑多个选项。

自签名证书:使用自签名证书是面向内部的 IT 资源的常见做法,因为您可以自行创建这些证书并且它是免费的。资源(在本例中为数据库服务器)将具有自签名证书以向数据库客户机验证自身。自签名证书和根证书将存储在数据库服务器 wallet 中。要使数据库客户机能够识别数据库服务器证书,客户机上也需要根证书的副本。此自创建的根证书可以存储在客户端 Wallet 中,也可以安装在客户端系统默认证书存储中(仅限 Windows 和 Linux)。建立会话后,数据库客户机将检查由数据库服务器发送的证书是否已由同一根证书签名。

众所周知的证书颁发机构:使用众所周知的根证书颁发机构具有一些优势,因为根证书很可能已存储在客户机系统默认证书存储中。如果根证书是公共根证书,则客户端没有额外的步骤来存储根证书。缺点是,这通常具有与之相关的成本。

单向 TLS :在标准 TLS 会话中,只有服务器向客户机提供证书以进行自身验证。客户端不需要单独的客户端证书即可向服务器验证自身(类似于 HTTPS 会话的建立方式)。虽然数据库需要 wallet 来存储服务器证书,但客户机唯一需要具备的是用于对服务器证书进行签名的根证书。

双向 TLS(也称为 Mutual TLS、mTLS):在 mTLS 中,客户机和服务器都具有相互提供的身份证书。在大多数情况下,相同的根证书都将对这些证书进行签名,以便可以将相同的根证书与数据库服务器和客户机一起用于验证其他证书。mTLS 有时用于验证用户,因为用户身份由数据库服务器通过证书进行验证。这对于传递 IAM 令牌不是必需的,但在传递 IAM 令牌时可以使用。

具有 wallet 的客户机:使用 mTLS 存储客户机证书时,客户机 wallet 是必需的。但是,根证书可以存储在同一 wallet 或系统默认证书存储中。

不带 wallet 的客户机:在以下情况下使用 TLS 时,可以配置不带 wallet 的客户机:

  1. 正在配置单向 TLS,其中客户机没有自己的证书,并且
  2. 对数据库服务器证书进行签名的根证书存储在系统默认证书存储中。如果服务器证书由公共证书颁发机构签名,则根证书很可能已经存在。如果是自签名证书,则需要将根证书安装在系统默认证书存储中,以避免使用客户端 wallet。

有关如何在数据库客户机和数据库服务器之间配置 TLS 的详细信息(包括上述选项),请参见 Configuring Transport Layer Security Authentication 。

如果您选择使用自签名证书以及其他与 wallet 相关的任务,请参阅《数据库安全指南》中的 orapki 命令行界面 (command line interface,CLI) 参考指南。请参见 Managing Public Key Infrastructure (PKI) Elements 。

更改外部身份提供者

本主题介绍了将外部身份提供者从集中管理用户 (Centrally Managed Users,CMU) 更改为 OCI IAM 验证和授权的步骤,反之亦然。

默认情况下,未为新预配的数据库启用 OCI IAM 验证和用户授权。外部验证的另一个选项是将集中管理的用户与 Active Directory (CMU-AD) 一起使用。在任何给定时间只能启用一个外部验证方案。

启用 OCI IAM 验证和授权

执行以下步骤以启用 OCI IAM 验证和授权。

  1. 使用 ALTER SYSTEM 命令启用 OCI IAM 验证和授权。

    ALTER SYSTEM SET IDENTITY_PROVIDER_TYPE=OCI_IAM SCOPE=BOTH;
  2. 验证 IDENTITY_PROVIDER_TYPE 系统参数的值。

    SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_type';
    NAME                   VALUE
    ---------------------- -------
    identity_provider_type OCI_IAM
  3. 检查是否已设置 IDENTITY_PROVIDER_CONFIG 参数。

    SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='identity_provider_config';
  4. 如果已设置 IDENTITY_PROVIDER_CONFIG 参数,则重置此参数。

    ALTER SYSTEM RESET IDENTITY_PROVIDER_CONFIG SCOPE=BOTH;

禁用 OCI IAM 验证和授权

执行以下步骤可禁用 OCI IAM 验证和授权。

  1. 使用 ALTER SYSTEM 命令禁用 OCI IAM 集成。

    ALTER SYSTEM RESET IDENTITY_PROVIDER_TYPE SCOPE=BOTH;

启用 CMU-AD

执行以下步骤以允许 Active Directory (AD) 用户使用 CMU 连接到数据库:

  1. 禁用 IAM 集成,如禁用 OCI IAM 验证和授权中所述。
  2. 按 Configuring Centrally Managed Users with Microsoft Active Directory 中所述配置 CMU-AD。

禁用 CMU-AD

执行以下步骤禁用 CMU-AD:

  1. 使用 ALTER SYSTEM 命令禁用 CMU-AD。

    ALTER SYSTEM SET LDAP_DIRECTORY_ACCESS = 'NONE';

重新启用 OCI IAM 验证和授权

执行以下步骤以重新启用 IAM 用户,以便使用 OCI IAM 验证和授权连接到数据库:

  1. 禁用 CMU-AD,如 Disable CMU-AD 中所述。
  2. 启用 OCI IAM 验证和授权,如启用 OCI IAM 验证和授权中所述。

为 IAM 用户创建 IAM 组和策略

本主题介绍了为 IAM 组编写策略语句以允许 IAM 用户访问 OCI 资源(特别是数据库实例)的步骤。

策略是一组语句,用于指定谁可以访问特定资源以及如何访问特定资源。可以为整个租户、区间中的数据库或单个数据库授予访问权限。这意味着您可以编写策略语句,为特定组提供对特定区间中特定类型资源的特定访问。

注:需要定义策略才能使用 IAM 令牌访问数据库。使用 IAM 数据库密码访问数据库时,不需要策略。

要使数据库允许 IAM 用户使用 IAM 令牌连接到数据库,请执行以下操作:

  1. 通过创建组并将用户添加到组来执行 OCI IAM 先决条件。

    例如,创建组 sales_dbusers。

    有关详细信息,请参阅管理组。

  2. 编写策略语句以允许访问 OCI 资源。

    1. 在 OCI 控制台中,单击身份和安全,然后单击策略。
    2. 要创建写入策略,请单击创建策略,然后输入名称和说明。
    3. 使用策略构建器创建策略。

      例如,创建策略以允许 IAM 组 DBUsers 中的用户访问其租户中的任何数据库:

      Allow group DBUsers to use database-connections in tenancy

      例如,要创建一个策略,以限制 DBUsers 组的成员仅访问区间 testing_compartment 中的数据库:

      allow group DBUsers to use database-connections in compartment testing_compartment

      例如,创建策略来限制对区间中单个数据库的组访问:

      allow group DBUsers to use database-connections in compartment testing_compartment
          where target.database.id = 'ocid1.database.oc1.iad.aabbcc'
    4. 单击创建。

      有关策略的更多信息,请参阅管理策略。

注意:

要创建与基本数据库服务中数据库上的 IAM 用户一起使用的策略,需要满足以下要求。

您可以在创建的策略中创建动态组并引用动态组以访问 OCI。

有关更多信息,请参见 Managing Dynamic Groups 。

添加 IAM 用户

要添加允许访问数据库的 IAM 用户,请使用 CREATE USER 或 ALTER USER 语句(带有 IDENTIFIED GLOBALLY AS 子句)将数据库全局用户映射到 IAM 组或用户。

通过将数据库全局用户 (schemas) 映射到 IAM 用户(独占映射)或 IAM 组(共享方案映射),IAM 用户对数据库实例的授权可以正常工作。

对数据库实例上的 IAM 用户进行授权:

执行以下步骤对数据库实例上的 IAM 用户进行授权。

  1. 以 ADMIN 用户身份登录到已启用使用 IAM 的数据库(ADMIN 用户具有这些步骤所需的 CREATE USER 和 ALTER USER 系统权限)。
  2. 使用 CREATE USER 或 ALTER USER 语句在数据库用户(方案)之间创建映射,并包括 IDENTIFIED GLOBALLY AS 子句,以指定 IAM 组名称。

    使用以下语法将全局用户映射到 IAM 组:

    CREATE USER global_user IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=IAM_GROUP_NAME';

    例如,要将名为 db_sales_group 的 IAM 组映射到名为 sales_group 的共享数据库全局用户:

    CREATE USER sales_group IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=db_sales_group';

    这将创建共享全局用户映射。该映射具有全局用户 sales_group,对 IAM 组中的所有用户都有效。因此,db_sales_group 中的任何人都可以使用其 IAM 凭证(通过 sales_group 全局用户的共享映射)登录到数据库。

    以下示例说明如何为非默认域 sales_domain 完成此操作:

    CREATE USER shared_sales_schema IDENTIFIED GLOBALLY AS
        'IAM_GROUP_NAME=sales_domain/db_sales_group';
  3. 如果要为其他 IAM 组或用户创建其他全局用户映射,请针对每个 IAM 组或用户执行以下步骤。

注:非 IDENTIFIED GLOBALLY 的数据库用户可以像以前一样继续登录,即使数据库已启用 IAM 验证也是如此。

将本地 IAM 用户独占映射到 Oracle Database 全局用户:

执行以下步骤可将本地 IAM 用户以显式方式映射到 Oracle Database 全局用户。

  1. 以 ADMIN 用户身份登录到已启用使用 IAM 的数据库(ADMIN 用户具有这些步骤所需的 CREATE USER 和 ALTER USER 系统权限)。
  2. 使用 CREATE USER 或 ALTER USER 语句在数据库用户(方案)之间创建映射,并包括 IDENTIFIED GLOBALLY AS 子句,以指定 IAM 本地 IAM 用户名。

    例如,要创建一个名为 peter_fitch 的新数据库全局用户并将此用户映射到名为 peterfitch 的现有本地 IAM 用户:

    CREATE USER peter_fitch IDENTIFIED GLOBALLY AS 'IAM_PRINCIPAL_NAME=peterfitch'

    以下示例说明如何通过指定非默认域 sales_domain 来创建用户:

    CREATE USER peter_fitch2 IDENTIFIED GLOBALLY AS
        'IAM_PRINCIPAL_NAME=sales_domain/peterfitch';

添加 IAM 角色

(可选)创建全局角色,以便在多个 IAM 用户映射到同一个共享全局用户时向 IAM 用户提供其他数据库角色和权限。

对于具有到数据库用户的独占 IAM 映射的 IAM 用户(方案),创建全局角色是可选的。当 IAM 映射到共享方案时,创建全局角色也是可选操作。例如,可以将所有权限和角色授予共享方案,并且将向映射到共享方案的所有 IAM 用户授予分配给共享方案的权限和角色。

使用全局角色可以选择区分使用相同共享方案的用户。例如,一组用户可以具有相同的共享方案,共享方案可以具有 CREATE SESSION 权限。然后,可以使用全局角色向所有使用相同共享方案的用户组分配不同的权限和角色。

通过将数据库全局角色映射到 IAM 组,向 IAM 用户授予其他角色可以正常工作。

将数据库全局角色映射到 IAM 组:

执行以下步骤将数据库全局角色映射到 IAM 组。

  1. 以 ADMIN 用户身份登录到已启用使用 IAM 的数据库(ADMIN 用户具有这些步骤所需的 CREATE USER 和 ALTER USER 系统权限)。
  2. 使用 CREATE ROLE 或 ALTER ROLE 语句为数据库角色设置数据库授权,并包括 IDENTIFIED GLOBALLY AS 子句,以指定 IAM 组名称。

    使用以下语法将全局角色映射到 IAM 组:

    CREATE ROLE global_role IDENTIFIED GLOBALLY AS
        'IAM_GROUP_NAME=IAM_GROUP_of_WHICH_the_IAM_USER_IS_a_MEMBER';

    例如,要将名为 ExporterGroup 的 IAM 组映射到名为 export_role 的共享数据库全局角色:

    CREATE ROLE export_role IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=ExporterGroup';

    以下示例说明如何通过指定非默认域 sales_domain 来创建角色:

    CREATE ROLE export_role IDENTIFIED GLOBALLY AS
        'IAM_GROUP_NAME=sales_domain/ExporterGroup';

    登录到数据库时,sales_domain 域中 ExporterGroup 的所有成员都将获得数据库全局角色 export_role 的授权。

  3. 使用 GRANT 语句向全局角色授予所需的特权或其他角色。

    GRANT CREATE SESSION TO export_role;
    GRANT DWROLE TO export_role;
  4. 如果希望现有数据库角色与 IAM 组关联,则使用 ALTER ROLE 语句更改现有数据库角色以将角色映射到 IAM 组。使用以下语法更改现有数据库角色以将其映射到 IAM 组:

    ALTER ROLE existing_database_role
       IDENTIFIED GLOBALLY AS 'IAM_GROUP_NAME=IAM_Group_Name';

如果要为其他 IAM 组添加其他全局角色映射,请按照每个 IAM 组的上述步骤操作。

为 IAM 用户创建 IAM 数据库密码

要添加 IAM 用户并允许 IAM 用户通过提供用户名和密码登录到数据库,必须创建 IAM 数据库密码。IAM 用户名和 IAM 数据库密码可以通过两种方式之一使用。

  1. 访问数据库时,IAM 用户可以输入 IAM 用户名和 IAM 数据库密码。默认情况下,数据库客户机将遵循与数据库的常规密码验证机制,数据库将从 IAM 检索 IAM 数据库密码验证器。
  2. 可以将数据库客户机配置为使用 IAM 用户名和 IAM 数据库密码获取 IAM 数据库令牌。数据库客户机会将此数据库令牌发送到数据库以供用户访问。

有关使用 IAM 用户名和 IAM 数据库密码获取 IAM 数据库令牌的更多信息,请参见 Configuring IAM for Oracle DBaaS 。

有关 IAM 数据库密码的更多信息,请参见 Managing User Credentials 中的 Working with IAM Database User Names and Password 。

使用 IAM 验证连接到数据库

数据库 ADMIN 用户将全局用户和全局角色映射到 IAM 用户和 IAM 组后,用户使用其 OCI IAM 身份证明登录到数据库实例,或通过 OCI IAM 数据库令牌访问数据库。

您仍可以使用本地数据库帐户用户名和密码(非全局数据库用户帐户)登录到数据库。

您可以使用数据库客户端以 OCI IAM 用户身份访问数据库实例。要使用具有 OCI IAM 用户名和密码身份证明以及密码验证器的客户端,数据库客户端必须为 12c 或更高版本。

IAM 数据库令牌使用需要 Oracle Database 客户端 19.16 及更高版本(而非 21c)。某些 Oracle Database 客户端 21.5 及更高版本提供了有限(未完全)的 IAM 数据库令牌功能。

注:如果数据库实例处于受限模式,则只有具有 RESTRICTED SESSION 权限(例如 ADMIN)的用户才能连接到数据库。

关于使用 IAM 连接到数据库实例

IAM 用户可以使用 IAM 数据库密码验证器或 IAM 令牌连接到数据库实例。

使用 IAM 数据库密码验证程序与数据库密码验证过程类似。但是,验证器不是存储在数据库中的密码验证器(密码的加密散列),而是存储在 OCI IAM 用户配置文件中。

第二种连接方法使用数据库的 IAM 令牌。使用基于令牌的访问更适合基本数据库服务中的云资源,例如 Oracle 数据库。该令牌基于 IAM 端点可以强制实施的强度。这可以是多因素验证,这比单独使用密码更强大。使用令牌的另一个好处是,密码验证器(被认为是敏感的)永远不会在内存中存储或可用。使用令牌进行数据库访问时,需要 TCPS (TLS) 连接。

注:传递 IAM 令牌时,无法配置本机网络加密。仅支持传输层安全 (Transport Layer Security,TLS),不支持使用 TLS 进行本机网络加密或本机网络加密。

使用 IAM 数据库密码验证器的客户端连接

配置 IAM 用户所需的授权后,此用户可以使用现有客户机应用程序(例如 SQL*Plus 或 SQLcl)登录,而无需进行其他配置。

IAM 用户使用当前支持的任何数据库客户端输入 IAM 用户名和 IAM 数据库密码(不是 OCI 控制台密码)。唯一的约束条件是数据库客户机版本为 Oracle Database 发行版 12.1.0.2 或更高版本,以使用 Oracle Database 12c 口令。数据库客户机必须能够使用 12c 口令验证器。IAM 不支持使用 11g 验证器加密。IAM 用户无需特殊的客户机或工具配置即可连接到数据库。

数据库客户机还可以使用 IAM 用户名和 IAM 数据库密码直接从 IAM 请求令牌。有关将客户机配置为获取令牌的更多信息,请参见 Client Connections That Use a Token Request by an IAM User Name and Database Password 。

使用令牌的客户端连接

对于对数据库的 IAM 令牌访问,客户机应用程序或工具会为 IAM 用户从 IAM 请求数据库令牌。

客户端应用程序将通过数据库客户端 API 将数据库令牌直接传递给数据库客户端。

如果尚未更新应用程序或工具以请求 IAM 标记,则 IAM 用户可以使用 OCI CLI 请求和存储数据库标记。可以使用以下身份证明请求数据库访问令牌 (db-token):

当 IAM 用户使用斜杠 / 登录登录登录到客户机并且配置了 OCI_IAM 参数(sqlnet.ora、tnsnames.ora 或作为连接字符串的一部分)时,数据库客户机将从文件中检索数据库令牌。如果 IAM 用户提交了用户名和密码,则该连接将使用针对使用 IAM 数据库密码验证器的客户机连接描述的 IAM 数据库验证器访问,除非数据库客户机配置为使用 IAM 用户名和 IAM 数据库密码从 IAM 检索数据库令牌。本主题中的说明说明了如何使用 OCI CLI 作为数据库令牌的帮助者。如果已更新应用程序或工具以使用 IAM,请按照应用程序或工具的说明进行操作。一些常见用例包括:SQL Plus 内部部署、SQLcl 内部部署、Cloud Shell 中的 SQL Plus 或使用 SEP 钱包的应用程序。

以下主题说明如何:

为使用 IAM 数据库密码的 SQL*Plus 配置客户机连接

可以将 SQL*Plus 配置为使用 IAM 数据库密码。

以 IAM 用户身份,使用以下语法登录到数据库:

CONNECT user_name@db_connect_string
Enter password: password

在此规范中,user_name 是 IAM 用户名。组合 domain_name/user_name 的限制为 128 字节。

以下示例说明 IAM 用户 peter_fitch 如何登录到数据库实例。

sqlplus /nolog
connect peter_fitch@db_connect_string
Enter password: password

某些特殊字符需要使用双引号将 user_name 和 password 引起来。例如:

"peter_fitch@example.com"@db_connect_string

"IAM database password"

为使用 IAM 标记的 SQL*Plus 配置客户端连接

执行以下步骤可以为使用 IAM 令牌的 SQL*Plus 配置客户机连接。

  1. 确保您有一个 IAM 用户账户。
  2. 请与 IAM 管理员和数据库管理员核实,以确保您具有允许访问区间或租户中的数据库以及您映射到数据库中的全局方案的策略。
  3. 如果您的应用或工具不支持直接 IAM 集成,请下载、安装和配置 OCI CLI。有关安装和配置 OCI CLI 的更多信息,请参见 Quickstart 。
  4. 在 OCI CLI 配置中设置 API 密钥并选择默认值。

    1. 为 IAM 用户设置 API 密钥访问。
    2. 检索 db-token。例如:

      • 使用 OCI CLI 检索 db-token 和 API-key:

        oci iam db-token get
      • 使用安全(或会话)令牌检索 db-token:

        oci iam db-token get --auth security_token

        如果安全令牌已过期,则会显示一个窗口,以便用户可以再次登录到 OCI。这将为用户生成安全令牌。OCI CLI 将使用此刷新的令牌来获取 db-token。

      • 使用委派令牌检索 db-token:登录到云 shell 时,会自动生成委派令牌并将其放置在 /etc 目录中。要获取此令牌,请在 OCI CLI 中执行以下命令:

        oci iam db-token get
      • 使用 OCI CLI 检索实例标记:

        oci iam db-token get --auth instance_principal

    有关更多信息,请参见 Required Keys and OCIDs 。

  5. 此配置仅适用于 Oracle Database 19c 客户机。确保您正在使用此客户端的最新发行版更新。

    注:Oracle Database 客户端发行版 21c 提供了有限的 IAM 令牌功能。

  6. 按照现有过程从数据库下载 wallet,然后按照配置 wallet 以与 SQL*Plus 一起使用的说明进行操作。

    1. 通过在 sqlnet.ora 中查找 SSL_SERVER_DN_MATCH=ON,确认已启用 DN 匹配。
    2. 通过将 TOKEN_AUTH=OCI_TOKEN 添加到 sqlnet.ora 文件,将数据库客户机配置为使用 IAM 标记。由于您将使用数据库令牌文件的默认位置,因此无需包括令牌位置。

    tnsnames.ora 连接字符串中的 TOKEN_AUTH 和 TOKEN_LOCATION 值优先于该连接的 sqlnet.ora 设置。例如,对于连接字符串,假定令牌位于缺省位置(对于 Linux 为 ~/.oci/db-token):

    (description=
      (retry_count=20)(retry_delay=3)
      (address=(protocol=tcps)(port=1522)
      (host=example.us-phoenix-1.oraclecloud.com))
      (connect_data=(service_name=aaabbbccc_exampledb_high.example.oraclecloud.com))
      (security=(ssl_server_cert_dn="CN=example.uscom-east-1.oraclecloud.com,
         OU=Oracle BMCS US, O=Example Corporation,
         L=Redwood City, ST=California, C=US")
      (TOKEN_AUTH=OCI_TOKEN)))

使用 TOKEN_AUTH 参数更新连接字符串后,IAM 用户可以通过运行以下命令来启动 SQL*Plus 来登录到数据库实例。可以包括连接描述符本身,也可以使用 tnsnames.ora 文件中描述符的名称。

connect /@exampledb_high

或:

connect /@(description=
  (retry_count=20)(retry_delay=3)
  (address=(protocol=tcps)(port=1522)
  (host=example.us-phoenix-1.oraclecloud.com))
  (connect_data=(service_name=aaabbbccc_exampledb_high.example.oraclecloud.com))
  (security=(ssl_server_cert_dn="CN=example.uscom-east-1.oraclecloud.com,
     OU=Oracle BMCS US, O=Example Corporation,
     L=Redwood City, ST=California, C=US")
  (TOKEN_AUTH=OCI_TOKEN)))

数据库客户机已配置为获取 db-token,因为已经通过 sqlnet.ora 文件或连接字符串设置了 TOKEN_AUTH。数据库客户机将获取 db-token 并使用私钥对其进行签名,然后将令牌发送到数据库。如果指定了 IAM 用户名和 IAM 数据库密码而不是斜杠 /,则数据库客户机将使用密码进行连接,而不是使用 db-token,除非指定了其他参数:PASSWORD_AUTH = OCI_TOKEN。这会指示数据库客户机使用 IAM 用户名和 IAM 数据库密码从 IAM 获取令牌。除了设置 PASSWORD_AUTH,,还需要设置 OCI_IAM_URL、OCI_TENANCY 以及可选的 OCI_COMPARTMENT 和 OCI_DATABASE。

使用实例主用户通过 IAM 验证访问数据库

在 ADMIN 用户在数据库上启用 OCI IAM 后,应用可以使用实例主体通过 OCI IAM 数据库令牌访问数据库。

有关详细信息,请参阅使用实例主用户访问 Oracle Cloud Infrastructure API 。

配置代理验证

代理验证允许 IAM 用户代理到数据库方案执行应用程序维护等任务。

代理验证通常用于验证实际用户,然后授权他们使用具有方案权限和角色的数据库方案,以便管理应用程序。共享应用程序方案密码等替代方案被视为不安全且无法审计实际用户执行了操作。

在该环境下,作为应用程序数据库管理员的指定 IAM 用户可以使用其身份证明进行验证,然后代理到数据库方案用户(例如 hrapp)。此验证使 IAM 管理员能够以 hrapp 用户身份使用 hrapp 特权和角色来执行应用程序维护,但仍使用其 IAM 身份证明进行验证。应用程序数据库管理员可以登录到数据库,然后代理到应用程序方案以管理此方案。

您可以为口令验证方法和令牌验证方法配置代理验证。

为 IAM 用户配置代理验证

要为 IAM 用户配置代理验证,IAM 用户必须已经具有到全局方案的映射(专用或共享映射)。要代理的 IAM 用户的单独数据库方案也必须可用。

确保具有此类型的用户后,请更改数据库用户以允许 IAM 用户代理该用户。

  1. 以具有 ALTER USER 系统权限的用户身份登录到数据库实例。
  2. 授予 IAM 用户代理本地数据库用户帐户的权限。无法在命令中引用 IAM 用户,因此必须在数据库全局用户(映射到 IAM 用户)和目标数据库用户之间创建代理。在以下示例中,hrapp 是要代理到的数据库方案,peterfitch_schema 是唯一映射到用户 peterfitch 的数据库全局用户。

    ALTER USER hrapp GRANT CONNECT THROUGH peterfitch_schema;

在此阶段,IAM 用户可以使用代理登录到数据库实例。例如:

要使用密码验证器进行连接,请执行以下操作:

CONNECT peterfitch[hrapp]@connect_string
Enter password: password

要使用令牌进行连接,请执行以下操作:

CONNECT [hrapp]/@connect_string

验证 IAM 用户代理验证

您可以验证密码和令牌验证方法的 IAM 用户代理配置。

  1. 以具有 CREATE USER 和 ALTER USER 系统权限的用户身份登录到数据库实例。
  2. 以 IAM 用户身份连接并执行 SHOW USER 和 SELECT SYS_CONTEXT 命令。例如,假定您希望在 IAM 用户 peterfitch 代理数据库用户 hrapp 时检查其代理验证。您需要使用此处显示的不同类型的验证方法连接到数据库,但是您执行的命令的输出对所有类型都是相同的。

    • 对于密码验证,假定 IAM 用户位于默认域中:

      CONNECT peterfitch[hrapp]/password!@connect_string
      SHOW USER;
      
      --The output should be USER is "HRAPP"
      SELECT SYS_CONTEXT('USERENV','AUTHENTICATION_METHOD') FROM DUAL;
      
      --The output should be "PASSWORD_GLOBAL_PROXY"
      SELECT SYS_CONTEXT('USERENV','PROXY_USER') FROM DUAL;
      
      --The output should be "PETERFITCH_SCHEMA"
      SELECT SYS_CONTEXT('USERENV','CURRENT_USER') FROM DUAL;
      
      --The output should be "HRAPP"
    • 对于令牌验证,对于位于非默认域中的用户,sales_domain:

      CONNECT [hrapp]/@connect_string
      SHOW USER;
      
      --The output should be USER is "HRAPP "
      SELECT SYS_CONTEXT('USERENV','AUTHENTICATION_METHOD') FROM DUAL;
      
      --The output should be "TOKEN_GLOBAL_PROXY"
      SELECT SYS_CONTEXT('USERENV','PROXY_USER') FROM DUAL;
      
      --The output should be "PETERFITCH_SCHEMA"
      SELECT SYS_CONTEXT('USERENV','CURRENT_USER') FROM DUAL;
      
      --The output should be "HRAPP"

将数据库链接与 IAM 验证的用户结合使用

您可以使用数据库链接以 OCI IAM 用户身份从一个数据库实例连接到另一个数据库实例。

您可以使用连接的用户或固定用户数据库链接以 OCI IAM 用户身份连接到数据库。

注:当前用户数据库链接不支持以 OCI IAM 用户身份连接到基本数据库服务中的数据库。

禁用 IAM 验证

可以使用 ALTER SYSTEM 命令禁用对数据库实例的 IAM 用户访问权限,如下所示:

ALTER SYSTEM RESET IDENTITY_PROVIDER_TYPE SCOPE=BOTH;

如果您还想从资源更新对 IAM 的访问权限,则可能需要删除或修改 IAM 组以及为允许从这些资源访问 IAM 而设置的策略。