Oracle Profile概念与示例

Profile和SQL Profile是不同的,前者是用CREATE PROFILE创建,后者和SQL Tuning有关。

profile的定义为:

which is a set of limits on database resources. If you assign the profile to a user, then that user cannot exceed these limits.

profile用CREATE PROFILE创建,然后用CREATE USERALTER USER赋予用户。

profile分为口令相关和资源相关2类。

看下语法:
在这里插入图片描述

资源相关的限制包括:
Oracle Profile概念与示例_第1张图片

口令相关的限制包括:
Oracle Profile概念与示例_第2张图片
由于多租户的关系,profile又分为common和local两种。

以下的示例均在PDB中执行:

SQL> select username, profile from dba_users where username = 'SSB';

   USERNAME    PROFILE
___________ __________
SSB         DEFAULT

SELECT
    resource_name,
    resource_type,
    limit
FROM
    dba_profiles
WHERE
    profile = 'DEFAULT'
ORDER BY
    resource_type,
    resource_name;

               RESOURCE_NAME    RESOURCE_TYPE                            LIMIT
____________________________ ________________ ________________________________
COMPOSITE_LIMIT              KERNEL           UNLIMITED
CONNECT_TIME                 KERNEL           UNLIMITED
CPU_PER_CALL                 KERNEL           UNLIMITED
CPU_PER_SESSION              KERNEL           UNLIMITED
IDLE_TIME                    KERNEL           UNLIMITED
LOGICAL_READS_PER_CALL       KERNEL           UNLIMITED
LOGICAL_READS_PER_SESSION    KERNEL           UNLIMITED
PRIVATE_SGA                  KERNEL           UNLIMITED
SESSIONS_PER_USER            KERNEL           UNLIMITED
FAILED_LOGIN_ATTEMPTS        PASSWORD         3
INACTIVE_ACCOUNT_TIME        PASSWORD         UNLIMITED
PASSWORD_GRACE_TIME          PASSWORD         7
PASSWORD_LIFE_TIME           PASSWORD         60
PASSWORD_LOCK_TIME           PASSWORD         1
PASSWORD_REUSE_MAX           PASSWORD         5
PASSWORD_REUSE_TIME          PASSWORD         365
PASSWORD_ROLLOVER_TIME       PASSWORD         0
PASSWORD_VERIFY_FUNCTION     PASSWORD         ORA12C_STRONG_VERIFY_FUNCTION

18 rows selected.

口令相关的限制

FAILED_LOGIN_ATTEMPTS

Specify the number of consecutive failed attempts to log in to the user account before the account is locked.

这个很好理解,你输错3次口令,第4次时,会报错如下:

$ sqlplus ssb/Wrong_password@orclpdb1

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jul 17 01:47:05 2023
Version 19.19.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

ERROR:
ORA-28000: The account is locked.


Enter user-name:

此时必须通过sys用户解锁用户:

SQL> alter user ssb account unlock;

User altered.

PASSWORD_LIFE_TIME

同一密码可用于身份验证的天数。即口令的有效期。

PASSWORD_REUSE_TIME 和 PASSWORD_REUSE_MAX

这两个参数必须一起设置。而且必须同时满足,例如30天内口令修改10次。

INACTIVE_ACCOUNT_TIME

指定允许连续无登录用户帐户的天数,超过后帐户将被锁定。

PASSWORD_GRACE_TIME

指定宽限期开始后的天数,在此期间发出警告并允许登录。

PASSWORD_LOCK_TIME

指定连续尝试登录失败指定次数后帐户将被锁定的天数。

PASSWORD_ROLLOVER_TIME

Gradual Database Password Rollover是21c的功能,现已移植到19c。

简单来说,此功能允许新老口令并存一段时间,之后就只允许新口令登录了。

此功能的介绍也可以参见这里。

关于此功能的例子,可参见这里,非常全面且好理解。

核心在这里:

SQL> alter user testuser1 identified by &NewPassword;
alter user testuser1 identified by &NewPassword
*
ERROR at line 1:
ORA-28221: REPLACE not specified


SQL> !oerr ORA 28221
28221, 00000, "REPLACE not specified"
// *Cause:  User is changing password but password verification function is
//          turned on and the original password is not specified and the
//          user does not have the alter user system privilege.
// *Action: Supply the original password.

SQL> alter user testuser1 identified by &NewPassword replace &OldPassword;

User altered.

-- 新老口令都可以连接数据库
SQL> connect testuser1/&NewPassword##@orclpdb1
Connected.

SQL> connect testuser1/&OldPassword##@orclpdb1
Connected.

PASSWORD_VERIFY_FUNCTION

如果设为null,则无口令验证。

资源相关的限制

SESSIONS_PER_USER

指定要限制用户的并发会话数。

我对此参数印象如此深刻,因为Tom Kyte在其书《Expert Oracle Database Architecture》中 Solving Problems Simply一节提到过,说明了Oracle数据库的简洁性。

示例:

-- run as SYS user
create profile profile1 limit SESSIONS_PER_USER 1;
alter user ssb profile profile1;
-- run as SSB user 
SQL> connect ssb@orclpdb1
Connected.
-- issue another new connection
SQL> connect ssb@orclpdb1
ERROR:
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit

恢复:

alter user ssb profile default;

CPU_PER_SESSION

指定会话的 CPU 时间限制,单位为百分之一秒。

这个例子比较极端,不过可以说明问题:

alter profile profile1 limit CPU_PER_SESSION 1;
alter user ssb profile profile1;

-- login as ssb
connect ssb@orclpdb1;

DECLARE
    j FLOAT;
BEGIN
    FOR i IN 1..10000 LOOP
        SELECT
            sqrt(1000)
        INTO j
        FROM
            dual;

    END LOOP;
END;
/

ERROR at line 1:
ORA-02392: exceeded session limit on CPU usage, you are being logged off
ORA-06512: at line 7

CPU_PER_CALL

指定调用(解析、执行或获取)的 CPU 时间限制,以百分之一秒表示。

这个和上一个类似,就不举例了。

CONNECT_TIME

指定会话的总运行时间限制(以分钟为单位)。

这个也比较容易演示,因为connect time就是elapsed time:

alter profile profile1 limit CONNECT_TIME 1;

SQL> exec DBMS_SESSION.SLEEP(60);

PL/SQL procedure successfully completed.

SQL> exec DBMS_SESSION.SLEEP(60);
BEGIN DBMS_SESSION.SLEEP(60); END;

*
ERROR at line 1:
ORA-02399: exceeded maximum connect time, you are being logged off

IDLE_TIME

指定会话期间允许的连续不活动时间段(以分钟为单位)。 长时间运行的查询和其他操作不受此限制。

当您设置 X 分钟的空闲超时时,请注意,会话将需要额外几分钟才能终止。

在客户端应用程序端,错误消息仅在下次空闲客户端尝试发出新命令时显示。

这个也很好演示:

SQL> select 1 from dual;
select 1 from dual
*
ERROR at line 1:
ORA-02396: exceeded maximum idle time, please connect again

LOGICAL_READS_PER_SESSION

指定处理 SQL 语句(解析、执行或获取)的调用所允许读取的数据块数量。

LOGICAL_READS_PER_CALL

指定处理 SQL 语句(解析、执行或获取)的调用所允许读取的数据块数量。

PRIVATE_SGA

指定会话可以在系统全局区域 (SGA) 的共享池中分配的专用空间量。 有关该子句的信息,请参阅 size_clause。

注意:此限制仅在您使用共享服务器架构时适用。 SGA 中会话的私有空间包括私有 SQL 和 PL/SQL 区域,但不包括共享 SQL 和 PL/SQL 区域。

COMPOSITE_LIMIT

指定会话的总资源成本,以服务单位表示。 Oracle 数据库将总服务单位计算为 CPU_PER_SESSION、CONNECT_TIME、LOGICAL_READS_PER_SESSION 和 PRIVATE_SGA 的加权和。

参考

  • Oracle CREATE PROFILE
  • How to Create Profiles and Password Management in Oracle DBA
  • A Simple Guide to Lockdown Profiles
  • Limited Profiles and Private References

你可能感兴趣的:(Oracle数据库管理,Oracle,19c,Oracle数据库安全,oracle,database,profile,security,resource)