Oracle Database 12c Security - 2. Essential Elements of User Security

本章重点谈User-Database Account Mapping。

UNDERSTANDING IDENTIFICATION AND AUTHENTICATION

数据库安全三步骤:

  1. 用户提供身份给数据库
  2. 用户通过口令验证证明自己身份
  3. 数据库认为用户可信任并决定其权限

Identification Methods

照片,指纹,员工号,用户名都属于身份。

身份分为用户提供的身份和技术身份两类。

用户提供的身份,如会员卡号,银行卡号,邮箱地址等。

技术身份包括如生物识别信息(声音与图像识别,指纹,虹膜),计算机身份(作为PKI一部分的数字证书)和数字身份(如主机名,IP地址,MAC地址等)。

Authentication

认证包括3类:

  • something you know,如口令
  • something you possess,如员工卡,信用卡,软件序列号等
  • something you are,如指纹,虹膜

强认证指不易猜到和破解的认证。最佳实践建议使用强认证,并且结合多因子认证。

UNDERSTANDING DATABASE ACCOUNT TYPES

典型的Oracle数据库有以下类型的账户:

  • end user,表示身份,常用于审计
  • connection pool,用于应用服务器,如JDBC数据源,对数据库中对象有直接操作权限。和end user没有关联。
  • NPE(Non-Person Entity),和pool账户类似,但用途是后台的维护任务和批处理操作,通常具有升级的权限
  • application schema,拥有数据库对象,是数据库对象的容器。schema和end user没有关联,最佳建议是锁定schema用户以避免直接登录。
  • DBA,最高权限用户,可以管理其他用户
  • application DBA,?

DATABASE ACCOUNT TYPES IN ORACLE DATABASE 12C MULTITENANT ARCHITECTURE

多租户架构介绍参见这里

CDB = CDB$ROOT + PDB$SEED + n x PDB

整合后,由于很多东西可以共享,因此管理和运维得到简化。

PRIVILEGED DATABASE ACCOUNT MANAGEMENT IN ORACLE DATABASE 12C

Administrative Privileges for Separation of Duty

SYS和SYSTEM是schema,SYSDBA和SYSOPER是权限。

SYS拥有数据字典,SYSDBA权限登录时,对应的SYS schema。

SYSOPER权限登录时,对应的是PUBLIC角色。可以执行的操作包括启停和备份恢复数据库。

SYSBACKUP权限可备份恢复数据库。

SYSDG关乎Data Guard,SYSKM关乎key management、wallet和TDE,SYSASM关乎GI和ASM。

Methods for Privileged Database Account Management

-- 账户锁定是最佳建议
SQL> SELECT username, account_status, common2  FROM dba_users WHERE username LIKE 'SYS%'3  AND username != 'SYSTEM'4  ORDER BY username;USERNAME             ACCOUNT_STATUS                   COM
-------------------- -------------------------------- ---
SYS                  OPEN                             YES
SYS$UMF              LOCKED                           YES
SYSBACKUP            LOCKED                           YES
SYSDG                LOCKED                           YES
SYSKM                LOCKED                           YES
SYSRAC               LOCKED                           YES6 rows selected.-- 可看到用户和权限的对应关系
SQL> desc v$pwfile_usersName                                      Null?    Type----------------------------------------- -------- ----------------------------USERNAME                                           VARCHAR2(128)SYSDBA                                             VARCHAR2(5)SYSOPER                                            VARCHAR2(5)SYSASM                                             VARCHAR2(5)SYSBACKUP                                          VARCHAR2(5)SYSDG                                              VARCHAR2(5)SYSKM                                              VARCHAR2(5)ACCOUNT_STATUS                                     VARCHAR2(30)PASSWORD_PROFILE                                   VARCHAR2(128)LAST_LOGIN                                         TIMESTAMP(9) WITH TIME ZONELOCK_DATE                                          DATEEXPIRY_DATE                                        DATEEXTERNAL_NAME                                      VARCHAR2(1024)AUTHENTICATION_TYPE                                VARCHAR2(8)COMMON                                             VARCHAR2(3)CON_ID                                             NUMBERSQL> select USERNAME, SYSDBA, SYSOPER, SYSASM, SYSBACKUP, SYSDG, SYSKM from v$pwfile_users;USERNAME             SYSDB SYSOP SYSAS SYSBA SYSDG SYSKM
-------------------- ----- ----- ----- ----- ----- -----
SYS                  TRUE  TRUE  FALSE FALSE FALSE FALSE

18c推出了schema only user,使得无法直接用schema user登录,详见这里,语法为:

CREATE USER schema_owner NO AUTHENTICATION QUOTA UNLIMITED ON users;

Oracle数据库的用户有两类认证方式,OS认证和标准方式。

** Privileged Database Account Management Based on Oracle OS Authentication **
OS认证是操作系统权限到数据库权限的映射。在$ORACLE_HOME/rdbms/lib/config.c中可看到映射关系:

#define SS_DBA_GRP "dba"
#define SS_OPER_GRP "oper"
#define SS_ASM_GRP ""
#define SS_BKP_GRP "dba"
#define SS_DGD_GRP "dba"
#define SS_KMT_GRP "dba"
#define SS_RAC_GRP "dba"

dba,oper是OS中定义的group:

$ egrep "^oper|^dba" /etc/group
dba:x:54322:oracle
oper:x:54323:oracle

sqlplus登录时可指定权限:

sqlplus / as SYSDBA

我们看到在config.c中,所有的权限都对应dba,你可以修改此文件,然后relink即可,参见操作和原理

以下为建立OS认证用户的示例:

# useradd operuser -g oper# sudo su - operuser
$ export ORACLE_SID=ORCLCDB
$ export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
$ id
uid=54322(operuser) gid=54323(oper) groups=54323(oper) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023$ sqlplus / as sysoperSQL*Plus: Release 19.0.0.0.0 - Production on Sun Aug 9 09:31:27 2020
Version 19.7.0.0.0Copyright (c) 1982, 2020, Oracle.  All rights reserved.Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.7.0.0.0SQL> select * from session_privs order by 1;PRIVILEGE
----------------------------------------
CREATE SESSION
RESTRICTED SESSION
SYSOPERSQL> select * from session_roles order by 1;no rows selected-- SYSOPER不允许操作用户数据
SQL> alter session set container=orclpdb1;
ERROR:
ORA-01031: insufficient privilegesSQL> SELECT SYS_CONTEXT('USERENV','OS_USER') os_user
,SYS_CONTEXT('USERENV','HOST') host
,SYS_CONTEXT('USERENV','SESSION_USER') session_user
FROM dual;OS_USER    HOST                 SESSION_US
---------- -------------------- ----------
operuser   oracle-19c-vagrant   PUBLIC

OS认证不允许直接登录PDB,而是先登录CDB再alter session:

$ sqlplus /@orclpdb1 as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Sun Aug 9 09:44:10 2020
Version 19.7.0.0.0Copyright (c) 1982, 2020, Oracle.  All rights reserved.ERROR:
ORA-01017: invalid username/password; logon denied

** Privileged Database Account Management Based on Named Accounts **

CREATE USER c##bill IDENTIFIED BY Welcome1 CONTAINER = ALL;GRANT SYSBACKUP, CREATE SESSION TO c##bill;SQL> select username, sysbackup from v$pwfile_users;USERNAME             SYSBA
-------------------- -----
SYS                  FALSE
C##BILL              TRUE

注意,当使用系统权限时,都是用OS认证,口令已经不重要了,以下都可以登录成功:

sqlplus c##bill/Welcomeabc as sysbackup
sqlplus c##bill/Welcome1 as sysbackup

默认,系统权限不允许远程使用,但此行为可以修改,此略:

SQL> show parameter REMOTE_LOGIN_PASSWORDFILENAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile            string      EXCLUSIVE

ACCOUNT MANAGEMENT IN MULTITENANT ORACLE DATABASE 12C

12c后,由于有CDB和PDB,因此账户也分common user(以c##开头)和local user。

假设已有common user c##bill, 然后新建一PDB:

SQL> select FILE_NAME from dba_data_files;FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/oradata/ORCLCDB/system01.dbf
/opt/oracle/oradata/ORCLCDB/sysaux01.dbf
/opt/oracle/oradata/ORCLCDB/undotbs01.dbf
/opt/oracle/oradata/ORCLCDB/users01.dbfSQL> alter system set db_create_file_dest='/opt/oracle/oradata';System altered.SQL> create pluggable database sales admin user pdbadmin identified by Welcome1;Pluggable database created.

即使是新建的PDB,也会有此common user:

SQL> col username format a20
SELECT u.con_id, NVL(p.pdb_name,'CDB$ROOT') con_name, u.username, u.oracle_maintained
FROM cdb_users u
LEFT OUTER JOIN (SELECT pdb_id, pdb_name FROM cdb_pdbs) pON u.con_id = p.pdb_id
WHERE u.username IN ('SYS','PDBADMIN','C##BILL')9  ORDER BY u.con_id, u.username;CON_ID CON_NAME   USERNAME             O
---------- ---------- -------------------- -1 CDB$ROOT   C##BILL              N1 CDB$ROOT   SYS                  Y3 ORCLPDB1   C##BILL              N3 ORCLPDB1   PDBADMIN             N3 ORCLPDB1   SYS                  Y4 SALES      C##BILL              N4 SALES      PDBADMIN             N4 SALES      SYS                  Y8 rows selected.

common user的好处主要是方便批量赋权,当然也可以在PDB内赋予个性化权限。

查询common user的权限:

SELECT grantee,privilege,common,con_id
FROM cdb_sys_privs
WHERE grantee = 'C##BILL';GRANTEE              PRIVILEGE                                COM     CON_ID
-------------------- ---------------------------------------- --- ----------
C##BILL              CREATE SESSION                           NO           3
C##BILL              CREATE SESSION                           NO           1

MANAGING DATABASE ACCOUNT PASSWORDS AND PROFILES

Managing Passwords for Local Database Accounts

默认,口令是大小写敏感的:

SQL> show parameter SEC_CASE_SENSITIVE_LOGONNAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sec_case_sensitive_logon             boolean     TRUE

对于schema user,建议口令过期和锁定:

ALTER USER  PASSWORD EXPIRE ACCOUNT LOCK 

当远程登录失败次数达到设定值,会删除物理连接:

SQL> show parameter SEC_MAX_FAILED_LOGIN_ATTEMPTSNAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sec_max_failed_login_attempts        integer     3

后台程序等需要口令,以明码写入配置文件不安全,可使用Secure External Password Store,即密码保护的auto-login wallet,auto-login只有当wallet为当前OS用户拥有时有效。

Managing Database Account Profiles

Account profile可用于安全和资源管理等,在安全方面可控制口令有效期,错误尝试次数等。默认的Profile名为DEFAULT.

指定profile:

alter user  PROFILE ;

DEFAULT profile的定义:

SELECT resource_name, limit, common
FROM dba_profiles
WHERE profile = 'DEFAULT' AND resource_type = 'PASSWORD'
ORDER BY resource_name;RESOURCE_NAME                    LIMIT      COM
-------------------------------- ---------- ---
FAILED_LOGIN_ATTEMPTS            10         NO
INACTIVE_ACCOUNT_TIME            UNLIMITED  NO
PASSWORD_GRACE_TIME              7          NO
PASSWORD_LIFE_TIME               180        NO
PASSWORD_LOCK_TIME               1          NO
PASSWORD_REUSE_MAX               UNLIMITED  NO
PASSWORD_REUSE_TIME              UNLIMITED  NO
PASSWORD_VERIFY_FUNCTION         NULL       NO8 rows selected.SQL> select distinct resource_type from dba_profiles;
PASSWORD
KERNEL

执行以下可部署3个口令复杂度验证函数:

sqlplus / as sysdba @$ORACLE_HOME/rdbms/admin/utlpwdmg.sql

查看此脚本发现其将口令验证函数改为ora12c_verify_function,而原来的值为null:

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX  UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
INACTIVE_ACCOUNT_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION ora12c_verify_function;

此时口令复杂度提高了:

SQL> create user c##user01 identified by Welcome1;
create user c##user01 identified by Welcome1
*
ERROR at line 1:
ORA-28003: password verification for the specified password failed
ORA-20000: password must contain 1 or more special characters

如果希望恢复原状,则改验证函数为null即可:

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 180
PASSWORD_GRACE_TIME 7
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX  UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LOCK_TIME 1
INACTIVE_ACCOUNT_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION null;

口令策略不可太机械,例如登录错误多次即锁定用户,或锁定很长时间,可能导致DoS攻击。此时可结合resource profile。

除了password profile,还有resource profile,我们看到其默认值均为UNLIMITED,最佳建议是设为特定的值:

SELECT resource_name, limit, common
FROM dba_profiles
WHERE profile = 'DEFAULT' AND resource_type = 'KERNEL'
ORDER BY resource_name;RESOURCE_NAME                    LIMIT                COM
-------------------------------- -------------------- ---
COMPOSITE_LIMIT                  UNLIMITED            NO
CONNECT_TIME                     UNLIMITED            NO
CPU_PER_CALL                     UNLIMITED            NO
CPU_PER_SESSION                  UNLIMITED            NO
IDLE_TIME                        UNLIMITED            NO
LOGICAL_READS_PER_CALL           UNLIMITED            NO
LOGICAL_READS_PER_SESSION        UNLIMITED            NO
PRIVATE_SGA                      UNLIMITED            NO
SESSIONS_PER_USER                UNLIMITED            NO9 rows selected.

比resource profile更高级的控制是DBMS_RESOURCE_MANAGER PL/SQL package,即资源管理(Resource Manager)。
可控制的资源包括CPU, Idle Time Limit, Exadata I/O, Runaway Queries, Parallel Execution Servers, Active Session Pool with Queuing, and the Undo Pool.


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部