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

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

注意:

Oracle Database 支持 OCI IAM 的基本数据库服务集成与身份域以及不包括身份域的旧 IAM。对身份域使用 IAM 时,支持默认和非默认域用户和组。

仅 Oracle Database 发行版 19c、版本 19.21 及更高版本(但 Oracle Database 发行版 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 为用户请求数据库令牌,并且可以通过客户端 API 传递数据库令牌。使用 API 发送令牌会覆盖数据库客户端中的其他设置。IAM 数据库标记使用需要 Oracle Database 客户端 19.16 及更高版本(而非 21c)。某些 Oracle Database 客户端 21.5 及更高版本提供了有限(不是完整)的 IAM 数据库令牌功能。
  • 如果应用程序或工具不支持请求 IAM 数据库令牌并通过客户端 API 将其发送到数据库,则 IAM 用户可以首先使用 OCI 命令行界面 (CLI) 检索 IAM 数据库令牌并将其保存在文件位置。例如,要使用此连接方法使用 SQL*Plus 及其他应用程序和工具,首先使用 OCI CLI 获取数据库令牌。如果为数据库客户机配置了 IAM 数据库标记,则当用户使用斜杠登录表单登录时,数据库驱动程序将使用已保存在默认或指定文件位置的 IAM 数据库标记。
  • 客户端应用程序或工具可以使用 OCI IAM 实例主体或资源主体获取 IAM 数据库标记,并使用 IAM 数据库标记向数据库实例验证自身。
  • IAM 用户和 OCI 应用可以通过多种方法(包括使用 API 密钥)从 IAM 请求数据库令牌。

    有关配置客户机连接的更多信息,请参见 Configure Client Connection for SQL*Plus that Uses an IAM Token 。有关其他方法(例如在 OCI 云 shell 中使用委派令牌)的更多信息,请参见 Authenticating and Authorizing IAM Users for Oracle DBaaS Databases

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

Prerequisites

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

网络设置

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

  1. 请按照创建服务网关中的说明,在数据库资源所在的 VCN 中创建服务网关。
  2. 创建服务网关后,请向数据库资源所在的每个子网(VCN 中)添加路由规则和出站安全规则,以便这些资源可以使用网关进行 IAM 验证:
    1. 转到子网的子网详细信息页。
    2. 子网信息选项卡中,单击子网的路由表的名称以显示其路由表详细信息页。
    3. 在现有路由规则表中,检查是否已存在具有以下特征的规则:
      • 目标:Oracle 服务网络中的所有 IAD 服务
      • 目标类型:服务网关
      • 目标:刚在 VCN 中创建的服务网关的名称

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

    4. 返回到子网的子网详细信息页。
    5. 在子网的安全列表表中,单击子网的安全列表的名称以显示其安全列表详细信息页。
    6. 在侧边菜单的资源下,单击出站规则
    7. 在现有出站规则表中,检查是否已存在具有以下特征的规则:
      • 无状态:否
      • 目标:Oracle 服务网络中的所有 IAD 服务
      • 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 时,需要考虑多个选项。

  • 使用自签名数据库服务器证书与由已知证书颁发机构签名的数据库服务器证书。
  • 单向 TLS (TLS) 与相互或双向 TLS (mTLS)。
  • 有或没有钱包的客户端。

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

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

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

双向 TLS(也称为相互 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. 配置 CMU-AD,如 Configuring Centrally Managed Users with Microsoft Active Directory 中所述。

禁用 CMU-AD

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

  1. 使用 ALTER SYSTEM 命令禁用 CMU-AD。
    ALTER SYSTEM SET LDAP_DIRECTORY_ACCESS = 'NONE';

重新启用 OCI IAM 身份验证和授权

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

  1. Disable CMU-AD 中所述禁用 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 用户一起使用的策略需要以下内容。

  • 策略可以允许 IAM 用户访问整个租户、区间中的数据库实例,也可以限制对单个数据库实例的访问。

  • 您可以使用实例主体或资源主体检索数据库令牌,以建立从应用程序到数据库实例的连接。如果使用实例主用户或资源主用户,则必须映射动态组。因此,您无法独占映射实例和资源主体;只能通过共享映射对其进行映射,并将实例或资源实例放入 IAM 动态组中。

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

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

添加 IAM 用户

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

IAM 用户对数据库实例的授权通过将数据库全局用户(方案)映射到 IAM 用户(专用映射)或 IAM 组(共享方案映射)来实现。

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

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

  1. 以 ADMIN 用户身份登录启用 IAM 的数据库(ADMIN 用户具有这些步骤所需的 CREATE USERALTER USER 系统权限)。
  2. 使用 CREATE USERALTER 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 USERALTER USER 系统权限)。
  2. 使用 CREATE USERALTER 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 USERALTER USER 系统权限)。
  2. 使用 CREATE ROLEALTER 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 Passwords

使用 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 Requests by an IAM User Name and Database Password

使用令牌的客户机连接

对于对数据库的 IAM 标记访问,客户机应用程序或工具会向 IAM 用户请求 IAM 的数据库标记。

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

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

  • 安全标记(使用 IAM 验证)、委派标记(在 OCI 云 shell 中)和 API-keys,它们是表示 IAM 用户以启用验证的身份证明。
  • IAM 用户名和 IAM 数据库密码,数据库客户机可在配置为直接检索 IAM 数据库令牌时使用该密码。
  • 实例主体令牌,用于使实例成为授权操作者(或主体)在验证后对服务资源执行操作。
  • 资源主用户令牌,是一种身份证明,允许应用程序向其他 OCI 服务验证自身。
  • 使用 IAM 用户名和 IAM 数据库密码(只能由数据库客户端请求)。

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

以下主题说明如何:

为使用 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_namepassword 周围使用双引号。例如:

"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 检索带有 API-keydb-token
        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_AUTHTOKEN_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,因为 TOKEN_AUTH 已通过 sqlnet.ora 文件或连接字符串进行设置。数据库客户机将获取 db-token 并使用私钥对其进行签名,然后将令牌发送到数据库。如果指定了 IAM 用户名和 IAM 数据库口令而不是斜杠 /,则数据库客户机将使用口令而不是使用 db-token 进行连接,除非指定了其他参数:PASSWORD_AUTH = OCI_TOKEN。这将指示数据库客户机使用 IAM 用户名和 IAM 数据库密码从 IAM 获取令牌。除了设置 PASSWORD_AUTH, 之外,还需要设置 OCI_IAM_URLOCI_TENANCY 以及可选的 OCI_COMPARTMENTOCI_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 用户)和目标数据库 user.In 之间创建代理,例如,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 USERALTER USER 系统权限的用户身份登录到数据库实例。
  2. 以 IAM 用户身份连接并执行 SHOW USERSELECT 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 用户映射到通过数据库链接连接的源数据库和目标数据库中的方案。可以使用数据库密码验证器或 IAM 数据库令牌来使用连接的用户数据库链接。

  • 固定用户数据库链接:可以使用数据库用户或 IAM 用户创建固定用户数据库链接。将 IAM 用户用作固定用户数据库链接时,IAM 用户必须在目标数据库中具有方案映射。数据库链接的 IAM 用户只能配置密码验证器。

禁用 IAM 验证

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

ALTER SYSTEM RESET IDENTITY_PROVIDER_TYPE SCOPE=BOTH;

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