Oracle Security
Overview
• oracle数据库安全性包括以下方面:
 – 创建和管理数据库账户(user account)
 – 授予和撤销权限(grant and revoke privileges)
 – 创建和管理角色(role)
 – 创建和管理配置(Profile)
 – 实现数据库安全性和最小权限原则
 – 标准数据库审计
User Account
• User vs. User Account vs. Schema
  用户账户包含了登录数据库的验证信息, 包含用户名和密码等.
  用户可以理解为一个运行时的概念, 用户通过某个账户登录并创
  建会话, 用户与账户的关系是多对一的关系. 模式则是数据库对
  象的集合, 属于某个用户账户.
• User Account Attributes
  在创建用户账户时, 相关的属性被定义, 这些属性在使用该账户
  创建会话时被应用. 包含:
   – 用户名
   – 验证方法
   – 默认表空间
   – 表空间配额(tablespace quotas)
   – 临时表空间
   – 用户配置(User Profile)
   – 账户状态
  所有属性均可以在创建账户时使用选项指定, 但其中只有用户名
  和密码是强制的. 下面逐一介绍这些属性:
User Account
– Username
使用CREATE USER语句创建账户, 账户名必须遵循以下规则:
   • 使用字母开头, 不能超过30个字符;
   • 只能由字母, 数字, $, _等字符组成;
   • 不能是保留字, 比如table, index etc.
当使用双引号指定账户名时, 可以绕过这些规则. 示例:
    create user “table” identified by abc
用户名被自动转换为大写, 并存储在数据字典表中, 可以通过DBA_USERS查看所有数据库账户. 登录时与大小写无关.
– Default tablespace and quotas
每一个用户账户都有一个默认表空间用户存储与该账户对应的模式对象(表/视图 etc), 创建数据库对象时, 除非指
定了其他表空间, 对象将会存储在默认表空间中. 在创建账户时如果没有指定默认表空间, 那么会使用数据库默认
表空间(如果没有设置则使用SYSTEM, 不推荐), 通过以下方式查询和修改数据库默认表空间:
    SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES
      WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE';
    ALERT DATABASE DEFAULT TABLESPACE USERS;
配额是指账户在某个表空间能使用的空间, 如果超过了配额该账户不能在该表空间上创建其
他的任何对象. 使用下面的SQL修改空间配额:
    alert user john quota 10m on users;
    alert user john quota unlimited on example;
使用以下sql查询表空间配额:
    select tablespace_name, bytes, max_bytes from dba_ts_quotas
       where username = 'DEMO'
User Account
– Temporary Tablespace
数据库会话在执行某些操作时如果pga内存不够则会使用账户相应的临时
表空间进行操作, 临时表空间被所有的账户共享使用.在创建账户时如果
没有指定临时表空间, 那么会使用数据库默认的临时表空间, 通过以下SQL
进行查询:
  SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES
             WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE';
Tip: 无需设置账户在临时表空间上的配额, 因为临时表空间的对象是SYS用
户所有的, 而SYS用户在临时表空间上的配额是unlimited.使用下面的SQL修
改账户的临时表空间:
   ALTER USER username TEMPORARY TABLESPACE tablespace_name;
Tip: 如果多个用户使用同一个数据库账户登录, 它们会共享同一个临时表
空间, 这样会带来性能瓶颈. 可以通过临时表空间组来解决这个问题.
– Profile
profile用于控制账户的密码设置和资源使用, 之后会详细介绍.
User Account
– Account Status
在一个数据库账户的声明周期中, 可能会处在不同的
状态下, 可以通过DBA_USERS查看账户的状态
(ACCOUNT_STATUS列), 常见的账户状态包括以下:
 •   OPEN 账户可用
 •   LOCKED      账户被锁定, 无法连接.
 •   EXPIRED     账户密码已过期, 账户密码需要被重新设定
 •   EXPIRED & LOCKED 账户被锁定且密码已经过期
使用以下sql锁定或者解锁一个账户:
     ALTER USER username ACCOUNT LOCK ;
     ALTER USER username ACCOUNT UNLOCK ;
使用以下sql使迫使用户修改密码:
     ALTER USER username PASSWORD EXPIRE;
User Account
– Authentication Methods
用户账户必须至少能够通过数据库存储的账户信息进行验证和登
录, 同时oracle还提供了其他的方式如下:
  • 操作系统验证
  • 密码文件验证(Password file auth)
    以上两种方式用于dba用户进行数据库的管理工作, 数据库不需要被打开.
  • 密码验证(Password auth)
    使用此类验证方式必须保证数据库被打开.
  • 外部验证(External auth)
  • 全球验证(Global auth)
    此验证方式需要安装LDAP服务器.
 1, Operating System and Password file Auth
  为数据库账户开启操作系统和密码文件验证, 需要授以
  该账户SYSDBA或者SYSOPER角色, 使用以 下SQL语句:
  grant sysdba|sysoper to username;
User Account
1, Operating System and Password file Auth
授以账户这些角色会将该账户的密码从数据字典拷贝到外部密码文
件, 因此即使当数据库没有被打开实例仍然能够通过读取这些文件
对用户进行验证. 密码文件验证使用如下语法:
    CONNECT username / password [@db_alias] AS [ SYSOPER | SYSDBA ] ;
操作系统验证使用如下语法, 前提是必须先登录oracle服务器所在的
操作系统,且当前操作系统用户属于ORACLE HOME目录的拥有组, 操
作系统验证无需验证信息:
    CONNECT / AS [ SYSOPER | SYSDBA ] ;
2, Password Auth
密码验证用于非SYS用户的普通登录, 此时数据库必须处在OPEN状
态,
使用存储在数据字典中的账户信息进行登录验证. 使用以下SQL语句
修改账户密码:
  ALTER USER username IDENTIFIED BY password ;
Tip: 在oracle 11g中, 账户密码是大小写敏感的, 而在之前的版本中密
码大小写不敏感.
User Account
                              - Creating
•   使用CREATE USER语句创建一个账户, 该语句必须指定账户名和验证方式, 其他账户属性
    均可以使用默认值, 典型的示例:
          create user scott identified by tiger
          default tablespace users temporary tablespace temp
          quota 100m on users, quota unlimited on example
          profile developer_profile
          password expire
          account unlock;
    逐行解释如下:
    1, 设置账户名, 验证方式为密码验证;                           2, 设置默认表空间和临时表空间;
    3, 设置默认表空间以及其它表空间的配额;                          4, 设置用户配置项;
    5, 设置用户必须立即修改密码;                               6, 设置账户可以被使用(默认设置).
    所有的这些属性均可以使用ALTER USER语句进行修改, 如下;
          alter user scott identified by lion;
          alter user scott quota unlimited on store_data, quota 0 on users;
          alter user scott profile prod_profile;
          alter user scott password expire;
          alter user scott account lock;
    使用DROP USER语句删除账户, 示例如下:
       DROP USER SCOTT;
    如果使用scott账户创建了某些对象, 那么必须加上cascade选项, 否则失败:
        DROP USER SCOTT CASCADE;
Privileges
        - Grant and Revoke
• 权限(privilege)指的是执行特定数据库操作的许
  可, 在创建一个账户之后必须授予该账户某些权
  限, 否则该账户甚至无法创建会话. oracle提供了
  grant和revoke语句对账户授予和撤销权限, 默认情况
  下只有数据库管理员用户才有权限进行此操作(SYS
  & SYSTEM).
• 权限可以分为两种类型:
 – 系统权限
 与系统权限相关的动作会修改数据字典, 比如创建表;
 – 对象权限
 对象权限允许用户修改数据, 比如对表进行插入和更新等
 操作.
Privileges
              - System Privileges
• oracle大概有200个系统权限, 大部分对应数据字典的操作, 比如创建
  表和用户; 其它的对应实例/数据库的操作, 比如创建表空间, 调整系
  统参数或者创建会话等, 下面是常用的权限:
  – CREATE SESSION
  创建会话, 如果没有此权限用户无法连接数据库.
  – RESTRICTED SESSION
  如果数据库使用startup restricted或者执行了alter system enable restricted
  session, 拥有此权限的用户才可以登录.
  – ALTER DATABASE
  执行alter database命令的权限.
  – ALTER SYSTEM
  执行alter system命令的权限.
  – CREATE TABLESPACE
  创建表空间权限.
  – CREATE TABLE
  创建表权限.
Privileges
                          - System Privileges
    – GRANT ANY OBJECT PRIVILEGE
    允许grantee将他们不属于他们的对象的权限授予
    其他人, 但不能授予自己.
    – CREATE ANY TABLE
    grantee能够创建数据其他用户的表, 比如user1执
    行下面的SQL:
       create table user2.tablename...
    – DROP ANY TABLE
    grantee可以删除属于其他用户的表.
    – INSERT|UPDATE|DELETE ANY TABLE
    grantee可以对其他用户的表执行插入,更新和删除.
    – SELECT ANY TABLE
    grantee可以对数据库内所有的表执行查询.
•    授予系统权限的语法如下: GRANT privilege [, privilege...] TO username ;
     可以通过视图DBA_SYS_PRIVS查看系统权限的授予情况.
• 使用下面的语法撤销用户的系统权限: REVOKE privilege [, privilege...] from username;
     示例: revoke create table from user1;
Tip: 在授予系统权限时, 如果指定with admin option, 那么grantee可以将该系统权限授予给其他
     人, 使用revoke语句撤销系统权限时, 不会递归地将grantee授予给其他人的系统权限撤销;
     授予ANY权限通常是一个不好的做法, 尽量避免使用.
Privileges
                      - Object Privileges
•   对象权限涉及到数据库表及相关对象的SELECT, INSERT, UPDATE和DELETE操作, 以及执行
    PLSQL过程或者函数. 对象权限是针对不属于当前用户的对象而言的, 比如某个用户创建
    了一个table, 那么该用户无需授予权限就就能够对该表执行SELECT和DML操作. 下面是不
    同的对象权限以及它们分别作用的对象类型:




•   授予对象权限的语法:
    GRANT privilege ON [schema.]object TO username [WITH GRANT OPTION] ;
    示例如下:
        grant select on store.orders to scott;
        grant update (order_status) on store.orders to scott;
        grant all on store.regions to scott; -- 使用ALL关键字代表SELECT+DML
•   with grant option
    当使用此选项授予权限时, grantee可以将权限授予其他人; 与系统权限不同的是, 如果撤
    销grantee的权限那么会递归撤销grantee授予其他人的权限.
Roles
                           - Create
• 通过直接操作权限的方式带来了两个问题: 一是巨大的工作量, 这是
  显而易见的; 其次是这种方式不能实现如下要求: 权限仅在某些情况
  下是可用的. 角色(role)解决了这个问题, 角色是系统权限/对象权限
  的集合, 通过一个整体对权限进行授予和撤销操作, 角色可以临时地
  激活(activate)或者失效(deactivate).
• Creation
  角色并不属于任何用户, 它们与用户名共享相同的命名空间, 角色和
  用户名称不能重叠. 使用如下命令创建角色: CREATE ROLE rolename;
  可以通过与授予用户权限相同的方式将权限授予给角色, 如下:
   create role hr_junior;
   grant create session to hr_junior with admin option;
   grant select on hr.regions to hr_junior;
 授予角色的语法格式如下:
   GRANT rolename to username [WITH ADMIN OPTION];
 如果指定了with admin option选项, 那么grantee可以将该角色授予其
 他的账户. 与系统权限相同, 在撤销grantee的角色时, 如果grantee将
 该角色授予了其他账户, 那么不会递归进行撤销.
Roles
            - Predefined roles
• Oracle有50多个预定义的角色, dba应该了解以下角色:
  – CONNECT
  11g版本中这个角色仅用于保持向后兼容, 在之前的版本中该角色包含了创建数据
  存储对象(比如: 表)的权限, 11g中仅用于创建会话(= create session).
  – RESOURCE
  11g版本中这个角色仅用于保证向后兼容性, 拥有该角色能够创建数据对象以及过
  程对象(比如: PLSQL过程), 同时它有unlimited tablespace权限.
  – DBA
  拥有大部分的系统权限, 以及一些对象权限; 拥有DBA角色的用户几乎能够管理数
  据库的所有方面, 除了启动和关闭操作.
  – SELECT_CATALOG_ROLE
  拥有绝大部分数据字典对象权限, 没有系统权限; 此角色通常授予初级的DBA.
  – SCEHDULER_ADMIN
  拥有管理系统定时任务的系统权限.
  另外一个预定义的角色是PUBLIC, 如果一个权限被授予PUBLIC, 那么所有拥有该角
  色的账户均拥有该权限.
Roles
             - Enable & Disable
• 可以通过视图dba_role_privs查看分配给某个账户
  的角色, 比如:
   select * from dba_role_privs where grantee = 'DEMO‘
 结果如右:
 需要关注default_role列, 如果一个角色是默认的
 那么在创建会话时, 该角色下的所有权限默认被
 启用. 通过修改该角色为非默认的, 则会禁用该角
 色. 语法如下:
    ALTER USER DEMO default role none; -- disable all
    ALTER USER DEMO default role connect; -- enable one
    ALTER USER DEMO default role RESOURCE, connect; -- enable multiple
Profiles
                        - Overview
• 配置项(profile)使用在两个方面: 密码控制和限制会话的资源使用; 密
  码控制始终是启用的, 资源限制则需设置数据库参数RESOURCE_LIMIT
  为TRUE, 默认为FALSE. 默认的配置项(DEFAULT)被应用到所有的数据
  库账户(包含SYS和SYSTEM), 但该配置项几乎没有做任何事情. 使用以
  下语句修改该参数的值:
   alter system set resource_limit=true;
• Password Management
  有以下配置选项可以用作密码控制:
    • FAILED_LOGIN_ATTEMPTS
    设置连续登陆失败的次数, 如果超过了该次数则锁定账户; 登陆成功则将登陆失败
      次数归零.
    • PASSWORD_LOCK_TIME
    设置锁定账户的天数, 如果账户因超过连续登陆失败的次数被锁定.
    • PASSWORD_LIFE_TIME    密码过期的天数.
    • PASSWORD_GRACE_TIME
    设置密码过期之后, 在该时间(天)内仍允许使用过期密码.
    • PASSWORD_REUSE_MAX 密码可以被重用的次数.
    • PASSWORD_VERIFY_FUNCTION
    密码验证函数, 用于验证密码的复杂度等信息.
Profiles
                - Overview
• Resource Limit
  Profile可以使用下面的资源限制选项:
    • SESSIONS_PER_USER
    用户账户的最大用户数(会话), 如果达到该设置新的会话被阻塞.
    • CPU_PER_SESSION
    会话服务端进程能够使用的CPU时间(以厘秒为单位), 如果超过该设置, 进程被强制终止.
    • CPU_PER_CALL
    会话服务端进程在执行SQL语句时允许使用的最大CPU时间, 如果超过则该SQL执行被终止.
    • LOGICAL_READS_PER_SESSION
    会话执行允许读取的数据库数目, 超过则终止该会话.
    • LOGICAL_READS_PER_CALL
    会话执行一条SQL语句允许读取的数据块数目, 超过则终止该语句.
    • PRIVATE_SGA
    在共享服务器模式下, 会话数据允许占用的SGA内存大小(k为单位).
    • CONNECT_TIME
    会话的最大连接时间(单位: 分钟), 超过则终止该会话.
    • IDLE_TIME
    会话的最大闲置时间(单位: 分钟),超过则终止该会话.
  当会话因为资源限制被终止时, 正在进行的事务将会被回滚; 当正在执行的SQL语
  句被终止时该sql语句产生的变化将会被回滚.
Profiles
                                       - DEFAULT
•   可以使用database control或者sql*plus对用户配置进行管理, 通过视图dba_users查看用户
    当前使用的配置:
            select username, profile from dba_users where username = 'DEMO‘;
    默认情况下DEFAULT配置被分配给所有的数据库账户, 通过dba_profiles视图查看配置, 如
    下:
            select * from dba_profiles where profile='DEFAULT';
    默认的配置项没有资源限制, 只是设置了一些密码限制, 如下:




    可以运行oracle提供的相关脚本默认配置的密码限制, linux/unix平台:
        $ORACLE_HOME/rdbms/admin/utlpwdmg.sql
    windows平台:
        %ORACLE_HOME%rdbmsadminutlpwdmg.sql
    该脚本会运行alter profile语句对默认的配置项添加一个密码验证函数
    verify_function_11g, 该函数要求用户在修改密码时:
    –   必须至少包含8个字符
    –   不能与用户名和数据库名称相同, 不区分大小写
    –   密码必须包含至少一个数字字符和字母字符
    –   与之前的密码必须至少有3个字符不同
Profiles
          - CREATE & ALTER & DROP
• 使用create profile语句创建配置项, 示例:
   create profile dba_profile limit sessions_per_user unlimited
     password_life_time 7 password_grace_time 1;

 使用alter user语句设置账户的配置项, 示例:
   alter user system profile dba_profile;
• 使用alter profile语句修改配置项, 示例:
   alter profile default limit sessions_per_user 1;

  这里限制应用该配置项的账户只允许最多一个会话.
• 使用drop profile语句删除配置项, 如果该配置项已经分
  配给用户, 那么必须加上cascade选项, 如下:
   DROP PROFILE profile_name CASCADE ;

 所有使用该配置项的账户将被重新设置为DEFAULT.
Database Security &
        Principle of Least Privilege
• 系统安全的一个重要原则是: 最小权限原则, 即通
  过赋予最小的权限并确保用户能够完成他们的工
  作, oracle数据库系统很好地遵循了这个原则.
• PUBLIC privilege
  PUBLIC角色是oracle数据库中被隐式授予给所有用
  户的角色, PUBLIC角色包含了一些存储过程的执行
  权限. 基于数据库安全性的考虑, 需要从该角色中
  撤销以下对象的执行权限:
 –   UTL_FILE
 –   UTL_TCP
 –   UTL_SMTP
 –   UTL_HTTP
Security-Critical Instance
                    Parameter
• 有以下的一些参数是与数据库安全性相关的, 这些参数都是静态参数:
 – UTL_FILE_DIR
 默认情况下该参数被设置为NULL, 可以通过如下语句为该参数设置多个值:
     alter system set utl_file_dir='/oracle/tmp','/oracle/interface' scope=spfile;
 可以通过UTL_FILE过程往读写该参数指定目录中的文件, 前提是oracle进程的拥有
 者有该目录的读写权限. 这有可能会造成一定的安全隐患.
 – REMOTE_OS_AUTHENT, OS_AUTHENT_PREFIX
 REMOTE_OS_AUTHENT参数用于限制远程用户是否可以通过操作系统验证
 登陆(无需输入密码), 默认情况下为false.
 – O7_DICTIONARY_ACCESSIBILITY
 此参数用于控制grant...any语句的执行, 默认情况下为false表示不包含SYS用
 户对象的权限. 以grant select any table为例, 如果该参数设置为false, 那么用
 户将不能查询数据字典表.
 如果需要授予用于读取数据字典的权限, 应该考虑授予select any dictionary
 权限.
 – REMOTE_LOGIN_PASSWORDFILE
 控制用户是否可以远程以SYSDBA, 或者SYSOPER角色登录, 默认为NONE.
Database Auditing
           & SYSDBA Audit
• 可以通过配置审计DBA用户的活动, 除此之外Oracle数
  据库提供了以下三种审计(audit)技术:
  – 基础数据库审计. 跟踪某些权限的使用, 特定命令的执行, 特
    定表的访问, 以及用户登录等;
  – 基于触发器的数据库审计;
  – 细粒度审计(FGA, fine-grained auditing);
• Audit SYSDBA Activity
  将实例参数AUDIT_SYS_OPERATIONS设置为TRUE, 可以记
  录以SYSDBA/SYSOPER角色登录的用户的所有活动. 审计
  日志的存放根据平台不同而有所不同, 在windows平台
  上存放为系统应用日志(application log), 在linux/unix平
  台则由数据库参数AUDIT_FILE_DEST指定, 指定的目录需
  要确保oracle数据库拥有者有写权限.
Database Auditing
•   通过AUDIT_TRAIL实例参数设置基础的数据库审计, 该参数控制审计日志的存放地址, 有以下几个选项:
     –   NONE(或者FALSE)
         禁用基础数据库审计;
     –   OS
         审计记录将写入操作系统文件, 文件目录与DBA审计的目录相同.
     –   DB
         审计记录写入数据字典表SYS.AUD$, 基于该表有相应的视图用于查询.
     –   DB_EXTENDED
         与DB选项相同, 同时包含了SQL语句及其绑定变量.
     –   XML
         与OS相同, 但是用XML格式记录.
     –   XML_EXTENDED
         与XML相同, 同时包含了SQL语句及其绑定变量.
•   配置好AUDIT_TRAIL参数之后, 接下来需要使用audit命令配置具体需要审计的动作, 这些动作可以是: 用户
    登录, 系统权限和用户权限的使用, 以及SQL语句的执行. 还可以选择记录成功的动作, 失败的动作或者两
    者. 示例:
    audit create any trigger;                -- 创建触发器
    audit select any table by session;       -- 审计select语句, by session表示针对一个会话产生一条记
                                             录, 这是默认选项; 还可以指定by access则每次执行select时
                                             会产生一条记录
    audit insert on sometable whenever successful;     -- 审计执行insert成功的动作, 使用whenever not
                                                       successful审计失败的动作
•   Views
    可以通过DBA_AUDIT_TRAIL视图查询审计记录, 另外
    DBA_AUDIT_OBJECT, DBA_AUDIT_STATEMENT, DBA_AUDIT_SESSION是该视图的子视图
Value-Based auditing
                    with triggers
• 基础数据库审计可以记录哪些动作已经发生, 但是无法记录动作相关的具
  体内容. 以audit insert on hr.employees为例, 每当一条记录被插入该表时, 会
  相应地生成一条审计信息, 但是该信息不会包含插入记录的值. 可以使用基
  于触发器的方式对这些动作进行审计以包含相应的值信息. 示例:
     CREATE OR REPLACE TRIGGER system.creditrating_audit
     AFTER UPDATE OF creditrating ON store.customers
     REFERENCING NEW AS NEW OLD AS OLD
     FOR EACH ROW
     BEGIN
       IF :old.creditrating != :new.creditrating THEN
       INSERT INTO system.creditrating_audit VALUES (sys_context('userenv','os_user'),
                 sys_context(‘userenv','ip_address'),
                 :new.customer_id ||' credit rating changed from
                  '||:old.creditrating|| ' to '||:new.creditrating);
       END IF;
     END;
     /
  Tip: 基于数据库触发器的审计方式在效率上比如基础数据库审计, 但是它
  提供了额外的信息.
FGA
                      - Fine-grained Audit
•   基础数据库审计可以记录对表的访问(查询或者其它DML), 但它不能设定只针对某些行或者字段的访问进行审计.
    FGA能设定对表的某些行或者字段的访问进行审计, 使用过程DBMS_FGA.ADD_POLICY添加审计规则, 该过程的参数
    如下:
     –   OBJECT_SCHEMA       对象的拥有者, 默认为规则创建者
     –   OBJECT_NAME         对象名称, 表名
     –   POLICY_NAME         规则名称, 必须唯一
     –   AUDIT_CONDITION     表达式, 判断哪些行需要生成审计信息, 如果为NULL则针对所有的行.
     –   AUDIT_COLUMNS       指定需要审计的列, 如果为NULL则审计所有的列
     –   HANDLER_SCHEMA      当审计条件符合时, 可以运行指定的过程, 此参数指定过程的拥有者. 默认
                             为规则创建者
     –   HANDLER_MODULE      指定的过程在审计条件符合时运行
     –   ENABLE              默认为TRUE, 使用disable_policy和enable_policy分别对审计规则进行禁用和
                             启用
     –   STATEMENT_TYPES     指定需要审计的SQL语句的类型, 可以是SELECT, INSERT, UPDATE, DELETE.
                             默 认仅SELECT
     –   AUDIT_TRAIL         是否记录SQL语句及绑定变量, 默认YES
     –   AUDIT_COLUMN_OPTS   有两个选项: DBMS_FGA.ANY_COLUMNS和DBMS_FGA_ALL_COLUMNS, 前者
                             表示访问AUDIT_COLUMNS任意列进行审计, 后者表示访问所有的列才进行
         审计.
    示例:
    execute dbms_fga.add_policy(
             object_schema=>'HR',
             object_name=>'EMPLOYEES',
             policy_name=>'POL1',
             audit_condition=>'department_id=80',
             audit_column=>'SALARY');
•   通过DBA_FGA_AUDIT_TRAIL视图查看FGA审计记录.
    TIP: DBA_FGA_AUDIT_TRAIL视图查看FGA审计信息, DBA_AUDIT_TRIAL用于查看基础数据库审计信息. 对于基于触发器的审计则需要手动
    创建相应的视图.

6, OCP - oracle security

  • 1.
  • 2.
    Overview • oracle数据库安全性包括以下方面: –创建和管理数据库账户(user account) – 授予和撤销权限(grant and revoke privileges) – 创建和管理角色(role) – 创建和管理配置(Profile) – 实现数据库安全性和最小权限原则 – 标准数据库审计
  • 3.
    User Account • Uservs. User Account vs. Schema 用户账户包含了登录数据库的验证信息, 包含用户名和密码等. 用户可以理解为一个运行时的概念, 用户通过某个账户登录并创 建会话, 用户与账户的关系是多对一的关系. 模式则是数据库对 象的集合, 属于某个用户账户. • User Account Attributes 在创建用户账户时, 相关的属性被定义, 这些属性在使用该账户 创建会话时被应用. 包含: – 用户名 – 验证方法 – 默认表空间 – 表空间配额(tablespace quotas) – 临时表空间 – 用户配置(User Profile) – 账户状态 所有属性均可以在创建账户时使用选项指定, 但其中只有用户名 和密码是强制的. 下面逐一介绍这些属性:
  • 4.
    User Account – Username 使用CREATEUSER语句创建账户, 账户名必须遵循以下规则: • 使用字母开头, 不能超过30个字符; • 只能由字母, 数字, $, _等字符组成; • 不能是保留字, 比如table, index etc. 当使用双引号指定账户名时, 可以绕过这些规则. 示例: create user “table” identified by abc 用户名被自动转换为大写, 并存储在数据字典表中, 可以通过DBA_USERS查看所有数据库账户. 登录时与大小写无关. – Default tablespace and quotas 每一个用户账户都有一个默认表空间用户存储与该账户对应的模式对象(表/视图 etc), 创建数据库对象时, 除非指 定了其他表空间, 对象将会存储在默认表空间中. 在创建账户时如果没有指定默认表空间, 那么会使用数据库默认 表空间(如果没有设置则使用SYSTEM, 不推荐), 通过以下方式查询和修改数据库默认表空间: SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_PERMANENT_TABLESPACE'; ALERT DATABASE DEFAULT TABLESPACE USERS; 配额是指账户在某个表空间能使用的空间, 如果超过了配额该账户不能在该表空间上创建其 他的任何对象. 使用下面的SQL修改空间配额: alert user john quota 10m on users; alert user john quota unlimited on example; 使用以下sql查询表空间配额: select tablespace_name, bytes, max_bytes from dba_ts_quotas where username = 'DEMO'
  • 5.
    User Account – TemporaryTablespace 数据库会话在执行某些操作时如果pga内存不够则会使用账户相应的临时 表空间进行操作, 临时表空间被所有的账户共享使用.在创建账户时如果 没有指定临时表空间, 那么会使用数据库默认的临时表空间, 通过以下SQL 进行查询: SELECT PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME = 'DEFAULT_TEMP_TABLESPACE'; Tip: 无需设置账户在临时表空间上的配额, 因为临时表空间的对象是SYS用 户所有的, 而SYS用户在临时表空间上的配额是unlimited.使用下面的SQL修 改账户的临时表空间: ALTER USER username TEMPORARY TABLESPACE tablespace_name; Tip: 如果多个用户使用同一个数据库账户登录, 它们会共享同一个临时表 空间, 这样会带来性能瓶颈. 可以通过临时表空间组来解决这个问题. – Profile profile用于控制账户的密码设置和资源使用, 之后会详细介绍.
  • 6.
    User Account – AccountStatus 在一个数据库账户的声明周期中, 可能会处在不同的 状态下, 可以通过DBA_USERS查看账户的状态 (ACCOUNT_STATUS列), 常见的账户状态包括以下: • OPEN 账户可用 • LOCKED 账户被锁定, 无法连接. • EXPIRED 账户密码已过期, 账户密码需要被重新设定 • EXPIRED & LOCKED 账户被锁定且密码已经过期 使用以下sql锁定或者解锁一个账户: ALTER USER username ACCOUNT LOCK ; ALTER USER username ACCOUNT UNLOCK ; 使用以下sql使迫使用户修改密码: ALTER USER username PASSWORD EXPIRE;
  • 7.
    User Account – AuthenticationMethods 用户账户必须至少能够通过数据库存储的账户信息进行验证和登 录, 同时oracle还提供了其他的方式如下: • 操作系统验证 • 密码文件验证(Password file auth) 以上两种方式用于dba用户进行数据库的管理工作, 数据库不需要被打开. • 密码验证(Password auth) 使用此类验证方式必须保证数据库被打开. • 外部验证(External auth) • 全球验证(Global auth) 此验证方式需要安装LDAP服务器. 1, Operating System and Password file Auth 为数据库账户开启操作系统和密码文件验证, 需要授以 该账户SYSDBA或者SYSOPER角色, 使用以 下SQL语句: grant sysdba|sysoper to username;
  • 8.
    User Account 1, OperatingSystem and Password file Auth 授以账户这些角色会将该账户的密码从数据字典拷贝到外部密码文 件, 因此即使当数据库没有被打开实例仍然能够通过读取这些文件 对用户进行验证. 密码文件验证使用如下语法: CONNECT username / password [@db_alias] AS [ SYSOPER | SYSDBA ] ; 操作系统验证使用如下语法, 前提是必须先登录oracle服务器所在的 操作系统,且当前操作系统用户属于ORACLE HOME目录的拥有组, 操 作系统验证无需验证信息: CONNECT / AS [ SYSOPER | SYSDBA ] ; 2, Password Auth 密码验证用于非SYS用户的普通登录, 此时数据库必须处在OPEN状 态, 使用存储在数据字典中的账户信息进行登录验证. 使用以下SQL语句 修改账户密码: ALTER USER username IDENTIFIED BY password ; Tip: 在oracle 11g中, 账户密码是大小写敏感的, 而在之前的版本中密 码大小写不敏感.
  • 9.
    User Account - Creating • 使用CREATE USER语句创建一个账户, 该语句必须指定账户名和验证方式, 其他账户属性 均可以使用默认值, 典型的示例: create user scott identified by tiger default tablespace users temporary tablespace temp quota 100m on users, quota unlimited on example profile developer_profile password expire account unlock; 逐行解释如下: 1, 设置账户名, 验证方式为密码验证; 2, 设置默认表空间和临时表空间; 3, 设置默认表空间以及其它表空间的配额; 4, 设置用户配置项; 5, 设置用户必须立即修改密码; 6, 设置账户可以被使用(默认设置). 所有的这些属性均可以使用ALTER USER语句进行修改, 如下; alter user scott identified by lion; alter user scott quota unlimited on store_data, quota 0 on users; alter user scott profile prod_profile; alter user scott password expire; alter user scott account lock; 使用DROP USER语句删除账户, 示例如下: DROP USER SCOTT; 如果使用scott账户创建了某些对象, 那么必须加上cascade选项, 否则失败: DROP USER SCOTT CASCADE;
  • 10.
    Privileges - Grant and Revoke • 权限(privilege)指的是执行特定数据库操作的许 可, 在创建一个账户之后必须授予该账户某些权 限, 否则该账户甚至无法创建会话. oracle提供了 grant和revoke语句对账户授予和撤销权限, 默认情况 下只有数据库管理员用户才有权限进行此操作(SYS & SYSTEM). • 权限可以分为两种类型: – 系统权限 与系统权限相关的动作会修改数据字典, 比如创建表; – 对象权限 对象权限允许用户修改数据, 比如对表进行插入和更新等 操作.
  • 11.
    Privileges - System Privileges • oracle大概有200个系统权限, 大部分对应数据字典的操作, 比如创建 表和用户; 其它的对应实例/数据库的操作, 比如创建表空间, 调整系 统参数或者创建会话等, 下面是常用的权限: – CREATE SESSION 创建会话, 如果没有此权限用户无法连接数据库. – RESTRICTED SESSION 如果数据库使用startup restricted或者执行了alter system enable restricted session, 拥有此权限的用户才可以登录. – ALTER DATABASE 执行alter database命令的权限. – ALTER SYSTEM 执行alter system命令的权限. – CREATE TABLESPACE 创建表空间权限. – CREATE TABLE 创建表权限.
  • 12.
    Privileges - System Privileges – GRANT ANY OBJECT PRIVILEGE 允许grantee将他们不属于他们的对象的权限授予 其他人, 但不能授予自己. – CREATE ANY TABLE grantee能够创建数据其他用户的表, 比如user1执 行下面的SQL: create table user2.tablename... – DROP ANY TABLE grantee可以删除属于其他用户的表. – INSERT|UPDATE|DELETE ANY TABLE grantee可以对其他用户的表执行插入,更新和删除. – SELECT ANY TABLE grantee可以对数据库内所有的表执行查询. • 授予系统权限的语法如下: GRANT privilege [, privilege...] TO username ; 可以通过视图DBA_SYS_PRIVS查看系统权限的授予情况. • 使用下面的语法撤销用户的系统权限: REVOKE privilege [, privilege...] from username; 示例: revoke create table from user1; Tip: 在授予系统权限时, 如果指定with admin option, 那么grantee可以将该系统权限授予给其他 人, 使用revoke语句撤销系统权限时, 不会递归地将grantee授予给其他人的系统权限撤销; 授予ANY权限通常是一个不好的做法, 尽量避免使用.
  • 13.
    Privileges - Object Privileges • 对象权限涉及到数据库表及相关对象的SELECT, INSERT, UPDATE和DELETE操作, 以及执行 PLSQL过程或者函数. 对象权限是针对不属于当前用户的对象而言的, 比如某个用户创建 了一个table, 那么该用户无需授予权限就就能够对该表执行SELECT和DML操作. 下面是不 同的对象权限以及它们分别作用的对象类型: • 授予对象权限的语法: GRANT privilege ON [schema.]object TO username [WITH GRANT OPTION] ; 示例如下: grant select on store.orders to scott; grant update (order_status) on store.orders to scott; grant all on store.regions to scott; -- 使用ALL关键字代表SELECT+DML • with grant option 当使用此选项授予权限时, grantee可以将权限授予其他人; 与系统权限不同的是, 如果撤 销grantee的权限那么会递归撤销grantee授予其他人的权限.
  • 14.
    Roles - Create • 通过直接操作权限的方式带来了两个问题: 一是巨大的工作量, 这是 显而易见的; 其次是这种方式不能实现如下要求: 权限仅在某些情况 下是可用的. 角色(role)解决了这个问题, 角色是系统权限/对象权限 的集合, 通过一个整体对权限进行授予和撤销操作, 角色可以临时地 激活(activate)或者失效(deactivate). • Creation 角色并不属于任何用户, 它们与用户名共享相同的命名空间, 角色和 用户名称不能重叠. 使用如下命令创建角色: CREATE ROLE rolename; 可以通过与授予用户权限相同的方式将权限授予给角色, 如下: create role hr_junior; grant create session to hr_junior with admin option; grant select on hr.regions to hr_junior; 授予角色的语法格式如下: GRANT rolename to username [WITH ADMIN OPTION]; 如果指定了with admin option选项, 那么grantee可以将该角色授予其 他的账户. 与系统权限相同, 在撤销grantee的角色时, 如果grantee将 该角色授予了其他账户, 那么不会递归进行撤销.
  • 15.
    Roles - Predefined roles • Oracle有50多个预定义的角色, dba应该了解以下角色: – CONNECT 11g版本中这个角色仅用于保持向后兼容, 在之前的版本中该角色包含了创建数据 存储对象(比如: 表)的权限, 11g中仅用于创建会话(= create session). – RESOURCE 11g版本中这个角色仅用于保证向后兼容性, 拥有该角色能够创建数据对象以及过 程对象(比如: PLSQL过程), 同时它有unlimited tablespace权限. – DBA 拥有大部分的系统权限, 以及一些对象权限; 拥有DBA角色的用户几乎能够管理数 据库的所有方面, 除了启动和关闭操作. – SELECT_CATALOG_ROLE 拥有绝大部分数据字典对象权限, 没有系统权限; 此角色通常授予初级的DBA. – SCEHDULER_ADMIN 拥有管理系统定时任务的系统权限. 另外一个预定义的角色是PUBLIC, 如果一个权限被授予PUBLIC, 那么所有拥有该角 色的账户均拥有该权限.
  • 16.
    Roles - Enable & Disable • 可以通过视图dba_role_privs查看分配给某个账户 的角色, 比如: select * from dba_role_privs where grantee = 'DEMO‘ 结果如右: 需要关注default_role列, 如果一个角色是默认的 那么在创建会话时, 该角色下的所有权限默认被 启用. 通过修改该角色为非默认的, 则会禁用该角 色. 语法如下: ALTER USER DEMO default role none; -- disable all ALTER USER DEMO default role connect; -- enable one ALTER USER DEMO default role RESOURCE, connect; -- enable multiple
  • 17.
    Profiles - Overview • 配置项(profile)使用在两个方面: 密码控制和限制会话的资源使用; 密 码控制始终是启用的, 资源限制则需设置数据库参数RESOURCE_LIMIT 为TRUE, 默认为FALSE. 默认的配置项(DEFAULT)被应用到所有的数据 库账户(包含SYS和SYSTEM), 但该配置项几乎没有做任何事情. 使用以 下语句修改该参数的值: alter system set resource_limit=true; • Password Management 有以下配置选项可以用作密码控制: • FAILED_LOGIN_ATTEMPTS 设置连续登陆失败的次数, 如果超过了该次数则锁定账户; 登陆成功则将登陆失败 次数归零. • PASSWORD_LOCK_TIME 设置锁定账户的天数, 如果账户因超过连续登陆失败的次数被锁定. • PASSWORD_LIFE_TIME 密码过期的天数. • PASSWORD_GRACE_TIME 设置密码过期之后, 在该时间(天)内仍允许使用过期密码. • PASSWORD_REUSE_MAX 密码可以被重用的次数. • PASSWORD_VERIFY_FUNCTION 密码验证函数, 用于验证密码的复杂度等信息.
  • 18.
    Profiles - Overview • Resource Limit Profile可以使用下面的资源限制选项: • SESSIONS_PER_USER 用户账户的最大用户数(会话), 如果达到该设置新的会话被阻塞. • CPU_PER_SESSION 会话服务端进程能够使用的CPU时间(以厘秒为单位), 如果超过该设置, 进程被强制终止. • CPU_PER_CALL 会话服务端进程在执行SQL语句时允许使用的最大CPU时间, 如果超过则该SQL执行被终止. • LOGICAL_READS_PER_SESSION 会话执行允许读取的数据库数目, 超过则终止该会话. • LOGICAL_READS_PER_CALL 会话执行一条SQL语句允许读取的数据块数目, 超过则终止该语句. • PRIVATE_SGA 在共享服务器模式下, 会话数据允许占用的SGA内存大小(k为单位). • CONNECT_TIME 会话的最大连接时间(单位: 分钟), 超过则终止该会话. • IDLE_TIME 会话的最大闲置时间(单位: 分钟),超过则终止该会话. 当会话因为资源限制被终止时, 正在进行的事务将会被回滚; 当正在执行的SQL语 句被终止时该sql语句产生的变化将会被回滚.
  • 19.
    Profiles - DEFAULT • 可以使用database control或者sql*plus对用户配置进行管理, 通过视图dba_users查看用户 当前使用的配置: select username, profile from dba_users where username = 'DEMO‘; 默认情况下DEFAULT配置被分配给所有的数据库账户, 通过dba_profiles视图查看配置, 如 下: select * from dba_profiles where profile='DEFAULT'; 默认的配置项没有资源限制, 只是设置了一些密码限制, 如下: 可以运行oracle提供的相关脚本默认配置的密码限制, linux/unix平台: $ORACLE_HOME/rdbms/admin/utlpwdmg.sql windows平台: %ORACLE_HOME%rdbmsadminutlpwdmg.sql 该脚本会运行alter profile语句对默认的配置项添加一个密码验证函数 verify_function_11g, 该函数要求用户在修改密码时: – 必须至少包含8个字符 – 不能与用户名和数据库名称相同, 不区分大小写 – 密码必须包含至少一个数字字符和字母字符 – 与之前的密码必须至少有3个字符不同
  • 20.
    Profiles - CREATE & ALTER & DROP • 使用create profile语句创建配置项, 示例: create profile dba_profile limit sessions_per_user unlimited password_life_time 7 password_grace_time 1; 使用alter user语句设置账户的配置项, 示例: alter user system profile dba_profile; • 使用alter profile语句修改配置项, 示例: alter profile default limit sessions_per_user 1; 这里限制应用该配置项的账户只允许最多一个会话. • 使用drop profile语句删除配置项, 如果该配置项已经分 配给用户, 那么必须加上cascade选项, 如下: DROP PROFILE profile_name CASCADE ; 所有使用该配置项的账户将被重新设置为DEFAULT.
  • 21.
    Database Security & Principle of Least Privilege • 系统安全的一个重要原则是: 最小权限原则, 即通 过赋予最小的权限并确保用户能够完成他们的工 作, oracle数据库系统很好地遵循了这个原则. • PUBLIC privilege PUBLIC角色是oracle数据库中被隐式授予给所有用 户的角色, PUBLIC角色包含了一些存储过程的执行 权限. 基于数据库安全性的考虑, 需要从该角色中 撤销以下对象的执行权限: – UTL_FILE – UTL_TCP – UTL_SMTP – UTL_HTTP
  • 22.
    Security-Critical Instance Parameter • 有以下的一些参数是与数据库安全性相关的, 这些参数都是静态参数: – UTL_FILE_DIR 默认情况下该参数被设置为NULL, 可以通过如下语句为该参数设置多个值: alter system set utl_file_dir='/oracle/tmp','/oracle/interface' scope=spfile; 可以通过UTL_FILE过程往读写该参数指定目录中的文件, 前提是oracle进程的拥有 者有该目录的读写权限. 这有可能会造成一定的安全隐患. – REMOTE_OS_AUTHENT, OS_AUTHENT_PREFIX REMOTE_OS_AUTHENT参数用于限制远程用户是否可以通过操作系统验证 登陆(无需输入密码), 默认情况下为false. – O7_DICTIONARY_ACCESSIBILITY 此参数用于控制grant...any语句的执行, 默认情况下为false表示不包含SYS用 户对象的权限. 以grant select any table为例, 如果该参数设置为false, 那么用 户将不能查询数据字典表. 如果需要授予用于读取数据字典的权限, 应该考虑授予select any dictionary 权限. – REMOTE_LOGIN_PASSWORDFILE 控制用户是否可以远程以SYSDBA, 或者SYSOPER角色登录, 默认为NONE.
  • 23.
    Database Auditing & SYSDBA Audit • 可以通过配置审计DBA用户的活动, 除此之外Oracle数 据库提供了以下三种审计(audit)技术: – 基础数据库审计. 跟踪某些权限的使用, 特定命令的执行, 特 定表的访问, 以及用户登录等; – 基于触发器的数据库审计; – 细粒度审计(FGA, fine-grained auditing); • Audit SYSDBA Activity 将实例参数AUDIT_SYS_OPERATIONS设置为TRUE, 可以记 录以SYSDBA/SYSOPER角色登录的用户的所有活动. 审计 日志的存放根据平台不同而有所不同, 在windows平台 上存放为系统应用日志(application log), 在linux/unix平 台则由数据库参数AUDIT_FILE_DEST指定, 指定的目录需 要确保oracle数据库拥有者有写权限.
  • 24.
    Database Auditing • 通过AUDIT_TRAIL实例参数设置基础的数据库审计, 该参数控制审计日志的存放地址, 有以下几个选项: – NONE(或者FALSE) 禁用基础数据库审计; – OS 审计记录将写入操作系统文件, 文件目录与DBA审计的目录相同. – DB 审计记录写入数据字典表SYS.AUD$, 基于该表有相应的视图用于查询. – DB_EXTENDED 与DB选项相同, 同时包含了SQL语句及其绑定变量. – XML 与OS相同, 但是用XML格式记录. – XML_EXTENDED 与XML相同, 同时包含了SQL语句及其绑定变量. • 配置好AUDIT_TRAIL参数之后, 接下来需要使用audit命令配置具体需要审计的动作, 这些动作可以是: 用户 登录, 系统权限和用户权限的使用, 以及SQL语句的执行. 还可以选择记录成功的动作, 失败的动作或者两 者. 示例: audit create any trigger; -- 创建触发器 audit select any table by session; -- 审计select语句, by session表示针对一个会话产生一条记 录, 这是默认选项; 还可以指定by access则每次执行select时 会产生一条记录 audit insert on sometable whenever successful; -- 审计执行insert成功的动作, 使用whenever not successful审计失败的动作 • Views 可以通过DBA_AUDIT_TRAIL视图查询审计记录, 另外 DBA_AUDIT_OBJECT, DBA_AUDIT_STATEMENT, DBA_AUDIT_SESSION是该视图的子视图
  • 25.
    Value-Based auditing with triggers • 基础数据库审计可以记录哪些动作已经发生, 但是无法记录动作相关的具 体内容. 以audit insert on hr.employees为例, 每当一条记录被插入该表时, 会 相应地生成一条审计信息, 但是该信息不会包含插入记录的值. 可以使用基 于触发器的方式对这些动作进行审计以包含相应的值信息. 示例: CREATE OR REPLACE TRIGGER system.creditrating_audit AFTER UPDATE OF creditrating ON store.customers REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW BEGIN IF :old.creditrating != :new.creditrating THEN INSERT INTO system.creditrating_audit VALUES (sys_context('userenv','os_user'), sys_context(‘userenv','ip_address'), :new.customer_id ||' credit rating changed from '||:old.creditrating|| ' to '||:new.creditrating); END IF; END; / Tip: 基于数据库触发器的审计方式在效率上比如基础数据库审计, 但是它 提供了额外的信息.
  • 26.
    FGA - Fine-grained Audit • 基础数据库审计可以记录对表的访问(查询或者其它DML), 但它不能设定只针对某些行或者字段的访问进行审计. FGA能设定对表的某些行或者字段的访问进行审计, 使用过程DBMS_FGA.ADD_POLICY添加审计规则, 该过程的参数 如下: – OBJECT_SCHEMA 对象的拥有者, 默认为规则创建者 – OBJECT_NAME 对象名称, 表名 – POLICY_NAME 规则名称, 必须唯一 – AUDIT_CONDITION 表达式, 判断哪些行需要生成审计信息, 如果为NULL则针对所有的行. – AUDIT_COLUMNS 指定需要审计的列, 如果为NULL则审计所有的列 – HANDLER_SCHEMA 当审计条件符合时, 可以运行指定的过程, 此参数指定过程的拥有者. 默认 为规则创建者 – HANDLER_MODULE 指定的过程在审计条件符合时运行 – ENABLE 默认为TRUE, 使用disable_policy和enable_policy分别对审计规则进行禁用和 启用 – STATEMENT_TYPES 指定需要审计的SQL语句的类型, 可以是SELECT, INSERT, UPDATE, DELETE. 默 认仅SELECT – AUDIT_TRAIL 是否记录SQL语句及绑定变量, 默认YES – AUDIT_COLUMN_OPTS 有两个选项: DBMS_FGA.ANY_COLUMNS和DBMS_FGA_ALL_COLUMNS, 前者 表示访问AUDIT_COLUMNS任意列进行审计, 后者表示访问所有的列才进行 审计. 示例: execute dbms_fga.add_policy( object_schema=>'HR', object_name=>'EMPLOYEES', policy_name=>'POL1', audit_condition=>'department_id=80', audit_column=>'SALARY'); • 通过DBA_FGA_AUDIT_TRAIL视图查看FGA审计记录. TIP: DBA_FGA_AUDIT_TRAIL视图查看FGA审计信息, DBA_AUDIT_TRIAL用于查看基础数据库审计信息. 对于基于触发器的审计则需要手动 创建相应的视图.