Oracle ¶
-
发行商
-
Oracle
-
-
是否免费
-
Oracle Database Express Edition:免费&受限
-
Up to 12 GB of user data
-
Up to 2 GB of database RAM
-
Up to 2 CPU threads
-
Up to 3 Pluggable Databases
-
-
Oracle Database:收费
-
Oracle Cloud Free Tier:永久免费计划
-
2 databases total, each with 1 OCPU and 20 GB storage.
-
2 virtual machines with 1/8 OCPU and 1 GB memory each.
-
2 Block Volumes, 100 GB total. 10 GB Object Storage. 10 GB Archive Storage.
-
-
Oracle Cloud:收费(常规云服务)
-
-
Latest Patch查询
备注
Oracle数据库的安全补丁属于增值服务,部分补丁需要购买。
目录
身份鉴别 ¶
体系架构 ¶
Oracle的实例和数据库代表不同的概念。实例代表Oracle的即时状态,数据库代表Oracle的文件集合。一个实例在其生存期内只能装载(ALTER DATABASE MOUNT)和打开(ALTER DATABASE OPEN)一个数据库,但一个数据库可被许多实例同时装载和打开(即RAC模式)。两者涵盖的内容主要如下:
-
Oracle实例 = 进程 + 进程所使用的内存(SGA)
-
数据库 = 重做文件 + 控制文件 + 数据文件 + 临时文件
显然地,一个Oracle实例只能运行在单台计算节点上,且只能监听来自本地共享内存的请求。因此Oracle提供了名为SQLNet的外壳程序,在操作系统层面注册了TNS服务,由TNS服务监听来自IPC、TCP/IP的请求,并根据配置中注册的实例信息,将请求转发到对应数据库实例的共享内存中。转发时通过SID或服务名对实例进行标识。
外壳认证 ¶
SQLNet组件以外壳方式提供一些额外身份鉴别机制,对应参数为
$ORACLE_HOME/network/admin/sqlnet.ora
文件中的
SQLNET.AUTHENTICATION_SERVICES
,其参数包括:
-
beq:Linux或Unix操作系统级别身份认证
-
nts:Windows操作系统级别身份认证
-
kerberos5/radius
-
tcps:基于SSL层的公私钥认证
特别地,beq(Bequeath Protocol)是Oracle在类Unix操作系统中提供的特殊通信协议。该协议可用于客户端与数据库之间的本地通信,且 不需要通过Listener 。因此,在数据库实例未启动时,可以直接经由beq协议连接数据库,能起到应急连接的作用。
提示
如果该参数没有配置,Windows操作系统的默认值为none,Linux操作系统的默认值为beq。
若启用了基于操作系统的认证方式,如果用户在操作系统中的管理员用户组,该用户可直接通过
sqlplus
/
as
sysdba
登录。管理员用户组默认值如下:
-
dba用户组(Linux)
-
ora_dba组(Windows)
实例认证 ¶
提示
以下三种认证均为独立配置。此外,上节所述的外壳认证与实例认证也互相独立。
基本方式(local) ¶
实例可通过数据库中DB帐户的信息(存放于
DBA_USERS
)对登录用户进行身份鉴别。在鉴别时,需输入DB帐户的用户名+口令。采用基本方式鉴别时,所有帐户仅能以普通权限连接数据库(as normal)。若要以sysdba等特权身份连接,则必须配置密码文件,详见下节。除了JDBC外,可通过Oracle自带的sqlplus连接实例。
# name和pass不可省略
# 要是省略了还登录成功,说明用了其他方式
sqlplus name/pass @host:port/sid
密码文件方式(remote) ¶
备注
remote概念与local相对,表示采用 数据库文件中存储的帐户信息 以外的方式进行认证。
Oracle实例支持将部分帐户的密码存放在操作系统中(加密方式),制作成密码文件,并可在密码文件中定义该帐户是否可以特权方式连接实例(as sysdba / as sysoper)。Oracle初始安装后,默认为SYS帐户生成密码文件,且SYS帐户同时拥有sysdba和sysoper的特权。之后可以使用
orapwd
工具配置密码文件的相关参数。密码文件的存放位置如下:
-
(Linux)
$ORACLE_HOME/dbs/orapw\*
-
(Windows)
$ORACLE_HOME\database\PWDsid.ora
可在Oracle中查看密码文件认证的变量参数
REMOTE_LOGIN_PASSWORDFILE
。其有效参数值如下:
-
NONE
忽视任何密码文件,关闭密码文件认证开关。 -
EXCLUSIVE
启用密码文件认证开关,设置为独占模式(密码文件仅可被单个实例使用)。该模式下,可以将SYSDBA权限给非SYS用户。 -
SHARED
启用密码文件认证开关,设置为共享模式(密码文件可以被一台服务器上的多个实例或者RAC集群实例共享)。该模式下,无法将SYSDBA权限给非SYS用户,且密码文件无法编辑。
可以在Oracle中查看
V$PWFILE_USERS
视图,查看密码文件中设置了哪些数据库帐户。这些帐户可以以特权方式连接 Oracle 实例。
操作系统方式(remote) ¶
可在Oracle中查看操作系统认证的变量参数
REMOTE_OS_AUTHENT
。
此外,Oracle中存在相关参数
OS_AUTHENT_PREFIX
,默认值为
ops$
,只有以prefix为前缀的数据库帐户才能使用操作系统认证的方式。启用了操作系统认证之后,在数据库中只要存在prefix+username的帐户,用户在使用username帐户成功登录客户端操作系统之后,就可以直接通过sqlplus等工具免密码登录数据库。
注意
Oracle官方文档也不建议启用这种认证方式。测评时看到该认证方式启用的话,身份鉴别(a)应判不符合。
Profile ¶
Oracle系统中的profile可以用来对用户所能使用的数据库资源进行限制。使用
CREATE PROFILE
profileA
命令创建一个profile,并把该profile分配给帐户,则帐户所能使用的数据库资源都在该profile的限制之内。
提示
创建profile必须要有CREATE PROFILE的系统权限。
口令复杂度、定期更换 ¶
在profile中可以查找到相关的参数,用于控制帐户的口令使用周期、口令复杂度等。
注意
SYS帐户不受口令复杂度参数的限制。
参数 |
说明 |
---|---|
PASSWORD_LIFE_TIME |
口令最长使用时间 |
PASSWORD_GRACE_TIME |
口令有效期 到期后的宽恕时间(宽恕时间内,连接数据库 将产生一个告警。超过宽恕时间则拒绝连接) |
PASSWORD_REUSE_MAX |
口令历史记录保留次数 |
PASSWORD_REUSE_TIME |
口令历史记录保留时间 |
PASSWORD_VERIFY_FUNCTION |
口令复杂度校验函数 |
提示
Oracle 11g对口令复杂度校验函数进行略微修改,命名为verify_function_11G。要求口令长度不低于9位,需要同时包含数字、字母,比verify_function弱点。如果数据库未安装该函数的话,执行
$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
即可。
登录失败、连接超时 ¶
参数 |
说明 |
---|---|
FAILED_LOGIN_ATTEMPTS |
最大错误登录次数 |
PASSWORD_LOCK_TIME |
锁定帐户时间(天) |
CONNECT_TIME |
会话的总最大时间,超过该时间则 回滚当前事务,结束会话,并返回错误(分钟) |
IDLE_TIME |
会话的最大连续空闲时间(分钟) |
提示
IDLE_TIME和CONNECT_TIME属于资源限制类参数,通过全局参数resource_limit统一控制开关。该参数设置为true的话,超时设置就会生效,false的话超时配置就不会生效。
SQLNet配置示例 ¶
SQLNet的配置文件默认位于
$ORACLE_HOME/network/admin
中,由三个文件组成:
-
sqlnet.ora:记录SQLNet的配置、连接参数、登录地址限制等
SQLNET.AUTHENTICATION_SERVICES = (beq)
tcp_validnode_checking = YES
tcp_invited_nodes = (192.168.0.1,ip2,ip3…..) # 允许登录IP地址
TCP.EXCLUDED_NODES = (1.1.1.2) # 禁止登录IP地址
-
listener.ora:TNS服务的监听配置,控制TNS服务开启的监听方式
LISTENER = (
DESCRIPTION_LIST = (
DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
)
)
-
tnsnames.ora:记录注册的实例信息。特别地,如果采用hostname转发,必须在本地host文件中配置相应地址。
XE = (
DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ae2470d5c0d3)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = XE)
)
)
EXTPROC_CONNECTION_DATA = (
DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
核查命令 ¶
认证相关 ¶
-- 查看密码文件中设置的帐户
SELECT * FROM V$PWFILE_USERS;
-- 查看操作系统认证相关参数
SHOW PARAMETER REMOTE_OS_AUTHENT;
-- 核查默认口令的帐户
SELECT d.username, u.account_status
FROM DBA_USERS_WITH_DEFPWD d, DBA_USERS u
WHERE u.account_status = 'OPEN' and d.username=u.username
ORDER BY 2, 1;
Profile相关 ¶
-- 查看profile的配置参数
SELECT * FROM DBA_PROFILES WHERE RESOURCE_TYPE='PASSWORD';
SELECT * FROM DBA_PROFILES WHERE RESOURCE_TYPE='KERNEL';
-- 查看每个数据库帐户的profile设置情况
SELECT username, profile FROM DBA_USERS;
-- 查看是否开启资源限制
SHOW PARAMETER resource_limit;
运维命令 ¶
设置实例认证 ¶
-- 开启密码文件认证
-- 注:该参数为只读属性,只允许写入配置文件(SCOPE=SPFILE)。重启实例后生效
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;
-- 开启操作系统认证
ALTER SYSTEM SET REMOTE_OS_AUTHENT=TRUE SCOPE=SPFILE;
-- 创建外部认证帐户,其密码字段显示为EXTERNAL
CREATE USER ops$cv IDENTIFIED EXTERNALLY;
GRANT CREATE SESSION TO ops$cv;
设置Profile ¶
-- 修改登录失败次数限制
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 6;
访问控制 ¶
权限模型 ¶
Oracle数据库分为系统权限以及对象权限,其中:
-
系统权限包括一些全局范围的强大命令,如
ALTER ANY ROLE
、ALTER ANY TABLE
、DROP ANY VIEW
等。这些命令权限默认仅授予SYS帐户。 -
对象权限表示针对某个特定数据库对象的权限,如表级别权限、列级别权限等。对象权限的操作符包括select、update、insert、alter、index、delete。
所有的系统权限和对象权限均可以被授予一个帐户或一个角色。在授予角色的情况下,可将系统帐户与该角色绑定,形成间接授权。进行授权操作时,授权主体自身必须拥有该权限的转授权,即admin option。在
dba_sys_privs
表中可以查询数据库的授权情况。该表中的字段含义如下:
-
GRANTEE
被授权的用户或者角色 -
PRIVILEGE
具体的授予的系统权限 -
ADMIN_OPTION
grant时是否使用了with admin option关键词,如果使用,则代表被授予该权限的用户或者角色,可以将被授予的这个权限再次授予给其它的用户或角色。
此外,在
DBA_ROLE_PRIVS
表中,可以查看帐户和角色的绑定关系。
特权身份 ¶
Oracle预置了三个特权身份SYSDBA、SYSOPER、SYSASM。在密码文件中妥善配置特权后,指定用户就可以以特权身份连接实例(忽视原有的权限)。其中:
-
SYSDBA拥有数据库的所有权限。
-
SYSOPER可进行STARTUP、SHUTDOWN、ALTER DATABASE OPEN、ALTER DATABASE MOUNT等基本操作,不能新建和删除数据库,登录后等同于public角色。
-
SYSASM拥有ASM的管理权。ASM:自动存储管理,是Oracle对文件管理的抽象。ASM抽象层使得Oracle实例不再需要关心文件的存储方式,方便管理员通过ASM管理工具轻松实现多个物理设备之间的RAID组织。
默认角色 ¶
-
CONNECT
具有创建表、视图、序列等权限 -
RESOURCE
具有创建过程,触发器,表,序列等权限 -
DBA
具有全部系统权限 -
EXP_FULL_DATABASE
具有导出数据库的权限 -
IMP_FULL_DATABASE
具有导入数据库的权限 -
SELECT_CATALOG_ROLE
查看数据字典角色 -
EXECUTE_CATALOG_ROLE
执行数据字典中部分函数的角色 -
DELETE_CATALOG_ROLE
删除数据字典记录的角色 -
RECOVERY_CATALOG_OWNER
备份目录的拥有者 RMAN使用 -
AQ_USER_ROLE
AQ_ADMINISTRATOR_ROLE
这两个角色用于oracle高级查询功能 -
RECOVERY_CATALOG_OWNER
用于创建拥有恢复库的用户 -
PUBLIC
特殊角色,下方详述
重要
public角色是一个特殊的隐藏角色,不存在于DBA_USERS表以及DBA_ROLES表中,而是存在于USER$表中。public角色无法删除,且所有数据库帐户均强制具有public角色。如果把某权限赋予给PUBLIC,那么所有的数据库用户都会具有这个权限。默认情况下,public具有很多系统程序包的权限。若有安全性需求,可视情况REVOKE不必要权限。
默认帐户 ¶
某些版本的Oracle安装时会创建样例帐户及样例数据库,需要注意是否禁用了相关帐户,具体如下:
-
Anonymous
-
ctxsys
-
SYS
-
SYSTEM
-
DBSNMP
-
ANONYMOUS
-
CTXSYS
-
DIP
-
DMSYS
-
EXFSYS
-
HR
-
LBACSYS
-
MDDATA
-
MDSYS
-
MGMT_VIEW
-
ODM
-
ODM_MTR
-
OE
-
OLAPSYS
-
ORDPLUGINS
-
ORDSYS
-
OUTLN
-
PM
-
QS
-
QS_ADM
-
QS_CB
-
QB_CBADM
-
QS_CS
-
QS_ES
-
QS_OS
-
QS_WS
-
RMAN
-
SCOTT
-
SH
-
SI_INFORMTN_SCHEMA
-
TSMSYS
-
WK_TEST
-
WKPROXY
-
WKSYS
-
WMSYS
-
XDB
三权分立 ¶
系统管理、审计管理和安全管理的权限集中在系统权限中,其中:
-
审计管理相关权限:
-
audit any 为任意的数据库对象设置审计选项
-
audit system 允许系统操作审计
-
create session(授予该权限用户才能登录)
-
alter system(修改审计配置)
-
grant select on sys.aud$ to shtec;(授予审计表查看权限,最好仅审计员可查看)
-
-
安全管理相关权限:
-
alter any role 修改任意角色的权限
-
alter user 修改用户的权限
-
create role 创建角色的权限
-
create user 创建用户的权限
-
drop any role 删除任意角色的权限
-
drop user 删除用户的权限
-
grant any role 授予任意角色的权限
-
grant any privilege 授予任意系统权限的权限(没有权限也能授予)
-
create session(授予该权限用户才能登录)
-
grant any object privilege 授予任意对象权限的权限(没有权限也能授予)
-
全局权限列表 ¶
-
alter any cluster 修改任意簇的权限
-
alter any index 修改任意索引的权限
-
alter any role 修改任意角色的权限
-
alter any sequence 修改任意序列的权限
-
alter any snapshot 修改任意快照的权限
-
alter any table 修改任意表的权限
-
alter any trigger 修改任意触发器的权限
-
alter cluster 修改拥有簇的权限
-
alter database 修改数据库的权限
-
alter procedure 修改拥有的存储过程权限
-
alter profile 修改资源限制的权限
-
alter resource cost 设置资源开销的权限
-
alter rollback segment 修改回滚段的权限
-
alter sequence 修改拥有的序列权限
-
alter session 修改数据库会话的权限
-
alter sytem 修改数据库服务器设置的权限
-
alter table 修改拥有的表权限
-
alter tablespace 修改表空间的权限
-
alter user 修改用户的权限
-
analyze 使用analyze命令分析数据库中任意的表、索引和簇
-
audit any 为任意的数据库对象设置审计选项
-
audit system 允许系统操作审计
-
backup any table 备份任意表的权限
-
become user 切换用户状态的权限
-
commit any table 提交表的权限
-
create any cluster 为任意用户创建簇的权限
-
create any index 为任意用户创建索引的权限
-
create any procedure 为任意用户创建存储过程的权限
-
create any sequence 为任意用户创建序列的权限
-
create any snapshot 为任意用户创建快照的权限
-
create any synonym 为任意用户创建同义名的权限
-
create any table 为任意用户创建表的权限
-
create any trigger 为任意用户创建触发器的权限
-
create any view 为任意用户创建视图的权限
-
create cluster 为用户创建簇的权限
-
create database link 为用户创建的权限
-
create procedure 为用户创建存储过程的权限
-
create profile 创建资源限制简表的权限
-
create public database link 创建公共数据库链路的权限
-
create public synonym 创建公共同义名的权限
-
create role 创建角色的权限
-
create rollback segment 创建回滚段的权限
-
create session 创建会话的权限
-
create sequence 为用户创建序列的权限
-
create snapshot 为用户创建快照的权限
-
create synonym 为用户创建同义名的权限
-
create table 为用户创建表的权限
-
create tablespace 创建表空间的权限
-
create user 创建用户的权限
-
create view 为用户创建视图的权限
-
delete any table 删除任意表行的权限
-
delete any view 删除任意视图行的权限
-
delete snapshot 删除快照中行的权限
-
delete table 为用户删除表行的权限
-
delete view 为用户删除视图行的权限
-
drop any cluster 删除任意簇的权限
-
drop any index 删除任意索引的权限
-
drop any procedure 删除任意存储过程的权限
-
drop any role 删除任意角色的权限
-
drop any sequence 删除任意序列的权限
-
drop any snapshot 删除任意快照的权限
-
drop any synonym 删除任意同义名的权限
-
drop any table 删除任意表的权限
-
drop any trigger 删除任意触发器的权限
-
drop any view 删除任意视图的权限
-
drop profile 删除资源限制简表的权限
-
drop public cluster 删除公共簇的权限
-
drop public database link 删除公共数据链路的权限
-
drop public synonym 删除公共同义名的权限
-
drop rollback segment 删除回滚段的权限
-
drop tablespace 删除表空间的权限
-
drop user 删除用户的权限
-
execute any procedure 执行任意存储过程的权限
-
execute function 执行存储函数的权限
-
execute package 执行存储包的权限
-
execute procedure 执行用户存储过程的权限
-
force any transaction 管理未提交的任意事务的输出权限
-
force transaction 管理未提交的用户事务的输出权限
-
grant any privilege 授予任意系统特权的权限
-
grant any role 授予任意角色的权限
-
index table 给表加索引的权限
-
insert any table 向任意表中插入行的权限
-
insert snapshot 向快照中插入行的权限
-
insert table 向用户表中插入行的权限
-
insert view 向用户视图中插行的权限
-
lock any table 给任意表加锁的权限
-
manager tablespace 管理(备份可用性)表空间的权限
-
references table 参考表的权限
-
restricted session 创建有限制的数据库会话的权限
-
select any sequence 使用任意序列的权限
-
select any table 使用任意表的权限
-
select snapshot 使用快照的权限
-
select sequence 使用用户序列的权限
-
select table 使用用户表的权限
-
select view 使用视图的权限
-
unlimited tablespace 对表空间大小不加限制的权限
-
update any table 修改任意表中行的权限
-
update snapshot 修改快照中行的权限
-
update table 修改用户表中的行的权限
-
update view 修改视图中行的权限
核查命令 ¶
public角色 ¶
– 查看public角色是否被授予了不必要的权限
SELECT table_name
FROM dba_tab_privs
WHERE grantee='PUBLIC' and privilege='EXECUTE' and table_name in (
'UTL_FILE', 'UTL_TCP', 'UTL_HTTP', 'UTL_SMTP', 'DBMS_LOB',
'DBMS_SYS_SQL', 'DBMS_JOB','DBMS_ADVISOR','DBMS_CRYPTO','DBMS_JAVA',
'DBMS_JAVA_TEST','DBMS_JOB','DBMS_LDAP','DBMS_LOB','DBMS_OBFUSCATION_TOOLKIT','DBMS_RANDOM'
);
系统权限 ¶
-- 查看帐户或角色被授予的权限清单
SELECT * FROM dba_sys_privs WHERE grantee='user';
-- 查询数据库角色列表
SELECT * FROM dba_roles;
-- 查询某角色或某帐户拥有的角色
SELECT * FROM dba_role_privs WHERE grantee='user' ORDER BY GRANTEE;
-- 查询DBA角色被赋予哪个帐户
SELECT * FROM dba_role_privs WHERE GRANTED_ROLE='DBA' ORDER BY GRANTEE;
-- 查询当前登录帐户拥有的权限
SELECT * FROM user_sys_privs;
-- 查询当前帐户被赋予的角色:
SELECT * FROM user_role_privs;
-- 一句话查询某个帐户拥有的所有系统权限
SELECT *
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'TEST_USER'
UNION ALL
SELECT *
FROM DBA_SYS_PRIVS
WHERE GRANTEE IN (SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'TEST_USER');
对象权限 ¶
-- 查询某个帐户拥有的被直接授予的对象权限:
SELECT * FROM dba_tab_privs WHERE GRANTEE = 'user';
SELECT * FROM dba_col_privs WHERE GRANTEE = 'user';
-- 查询某个帐户拥有的表
select * from dba_tables where owner='user';
-- 一句话查询某个帐户拥有的所有表权限
SELECT *
FROM dba_tab_privs
WHERE GRANTEE = 'SYS'
UNION ALL
SELECT *
FROM dba_tab_privs
WHERE GRANTEE IN
(SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'SYS');
-- 检查普通用户对审计表的权限
SELECT GRANTEE, PRIVILEGE
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME='AUD$' AND GRANTEE NOT IN ('DELETE_CATALOG_ROLE');
运维命令 ¶
-- 创建数据库帐户
CREATE USER userA IDENTIFIED BY passA;
-- 允许roleA下的所有帐户连接
GRANT CREATE SESSION TO roleA;
-- 赋予角色
GRANT CONNECT, RESOURCE TO userA;
-- 赋予单个权限
GRANT SELECT ON tableA TO userA;
-- 赋予权限并可转授
GRANT ALERT TABLE ON tableA TO userA WITH ADMIN OPTION;
-- 移除权限
REVOKE CREATE USER FROM userA;
-- 赋予列权限(列权限只有INSERT和UPDATE)
GRANT INSERT(id) ON tableA TO userA;
安全审计 ¶
强制审计 ¶
Oracle强制启用的审计包括:
-
以SYSDBA或SYSOPER的特权身份连接到实例的行为(不包括之后的操作)。记录连接用户、特权、终端编号。
-
实例启动事件。记录操作用户、终端编号、时间戳。
-
实例关闭事件。记录操作用户、终端编号、时间戳。
强制审计的记录均存放于OS层面,与其相关的参数为
audit_file_dest
和
audit_syslog_level
。对于Windows操作系统,Oracle无视以上两个参数并将日志强制写入事件查看器中。
对于Linux操作系统,可以配置
audit_file_dest
参数(默认为
$ORACLE_BASE/admin/$ORACLE_SID/adump
),控制日志文件的位置。日志文件的属主为Oracle,权限420。
此外,还可以配置
audit_syslog_level
参数,将日志发送至syslog的组件。这个参数的默认值是空,有效格式为
facility.priority
(组件.级别)。其中组件有效值包括:
-
USER
-
LOCAL0-LOCAL7
-
SYSLOG
-
DAEMON
-
KERN
-
MAIL
-
AUTH
-
LRP
-
NEW
-
UUCP
-
CRON
级别有效值包括(低到高):
-
NOTICE
-
INFO
-
DEBUG
-
WARNING
-
ERR
-
CIRT
-
ALERT
-
EMERG
如通过以下配置可将所有警告消息记录到
/var/log/audit.log
文件中:
-
设置AUDIT_SYSLOG_LEVEL=
local1.warning
-
在syslog配置中增加:
local1.warning /var/log/audit.log
审计特权 ¶
Oracle 9i开始提供
audit_sys_operations
功能。开启后可以对特权管理员的操作行为记录日志。特权管理员包括SYS帐户、以SYSDBA特权连接的帐户、以SYSOPER特权连接的帐户。考虑到特权管理员对所有系统表都有读写权限,为了安全起见,特权审计的记录强制存放于OS层面,且每个特权帐户连接时,都会生成独立的aud文件(Linux)。
审计跟踪 ¶
Oracle自带有审计跟踪的功能,相关的参数为
audit_trail
,可配置参数如下:
-
none
:禁用审计跟踪 -
os
:将所有审核记录定向到操作系统文件,Windows系统会定向到事件查看器中的应用程序中 -
db
:将所有审计跟踪记录定向到SYS.AUD$
表 -
db, extended
:同上,同时SYS.AUD$
表的SQL bind and SQL text列中记录详情 -
xml
:记录的内容和参数值为db
时一致,但将记录定向到xml文件中 -
xml, extended
:记录的内容和参数值为db, extended
时一致,同时将记录定向到xml文件中。
审计策略 ¶
Oracle的审计策略分为:Statement(sql语句审计)、Privilege(权限审计)、Object(对象审计),三种审计的配置方法类似。以语句审计为例,语句审计是对特定的SQL语句进行审计,与具体的对象没有关系。所有的审计策略均存放于
dba_stmt_audit_opts
表中。其中:
-
USER_NAME
列为空时,意味着这个审计是针对所有用户的,否则针对特定用户。 -
SUCCESS
列及FAILURE
列,分别代表是对执行成功和执行失败的语句进行审计。其有效值如下:-
BY ACCESS
:每个操作进行审计 -
BY SESSION
:同类的操作只进行一次记录 -
NULL
:不进行审计
-
提示
语句审核对SYS帐户不生效,需使用
audit_sys_operations
。
Oracle 11g自带一个sql文件
$ORACLE_HOME/rdbms/admin/secconf.sql
,运行后会生成默认的语句审计策略(安装时已经默认运行过)。具体的审计语句如下:
-
ALTER ANY PROCEDURE
-
ALERT ANY TABLE
-
ALTER DATABASE
-
ALTER PROFILE
-
ALTER SYSTEM
-
ALTER USER
-
AUDIT SYSTEM
-
CREATE ANY JOB
-
CREATE ANY LIBRARY
-
CREATE ANY PROCEDURE
-
CREATE ANY TABLE
-
CREATE EXTERNAL JOB
-
CREATE PUBLIC DATABASE
-
CREATE SESSION
-
CREATE USER
-
GRANT ANY OBJECT PRIVILEGE
-
GRANT ANY PRIVILEGE
-
GRANT ANY ROLE
-
DROP ANY ROLE
-
DROP ANY TABLE
-
DROP PROFILE
-
DROP USER
-
EXEMPT ACCESS POLICY
审计视图 ¶
Oracle提供了一些审计相关视图,用于增加日志可读性:
-
dba_audit_object
视图,可以查询所有对象跟踪信息: -
dba_audit_session
视图,所得到的数据都是有关logon或者logout的信息: -
dba_audit_statement
视图,列出grant, revoke, audit, noaudit, alter system语句的审计跟踪信息: -
audit_actions
视图,可以查询出在aud$等视图中actions列的含义(如果是将记录定位至操作系统的文件中,则日志文件中也会有类似actions的列): -
system_privilege_map
视图,可以查询出aud$等视图中priv$used列的含义(如果是将记录定位至操作系统的文件中,则日志文件中可能也会有类似priv$used的列)
核查命令 ¶
-- 查看审计参数配置
SELECT name, value FROM v$parameter WHERE name LIKE 'audit%'; -- jdbc执行
SHOW PARAMETER LIKE audit; -- sqlplus执行
-- 查看审计策略
SELECT * FROM dba_stmt_audit_opts;
SELECT * FROM dba_priv_audit_opts;
SELECT * FROM dba_obj_audit_opts;
-- 查看审计记录条数
SELECT userid, count(1) FROM aud$ GROUP BY userid;
-- 查看审计记录内容(DB模式下)
SELECT * FROM AUD$;
SELECT * FROM dba_audit_trail;
-- 查看日志存储空间
SELECT owner, segment_name, bytes/1024/1024 mb
FROM dba_segments
WHERE segment_name = 'AUD$';
运维命令 ¶
-- 修改审计相关变量
ALTER SYSTEM SET audit_trail='OS' SCOPE=spfile;
ALTER SYSTEM SET audit_sys_operations=TRUE SCOPE=spfile;
-- 维护审计策略
-- 全局语句审核
AUDIT ALTER USER BY ACCESS;
AUDIT SESSION WHENEVER NOT SUCCESSFUL;
NOAUDIT DELETE ANY TABLE;
-- 针对特定帐户的语句审核
AUDIT SELECT tableA BY userA BY ACCESS;
安全通信 ¶
默认口令传输安全性 ¶
Oracle使用挑战/应答(Challenge/Response)方式进行身份鉴别。每个版本的机制和算法有略微差别,但大致流程相同:
-
客户端发送userName给服务器端
-
服务器端查询这个UserName是否存在,存在的话生成随机字符串randomStr,然后发回去
-
客户端接收到randomString,用你输入的明文password的hash值(其实就是数据库里存储的password的hash值)加上randomString,再算出其hash值,得到一个hashStr,然后传给服务器。
-
服务器有password的hash值,也有randomStr,根据客户端的算法也生成一个hashStr与传来的hashStr进行对比,如果对比一致,就说明验证成功。
传输加密和完整性校验 ¶
Oracle提供了一个自建的传输加密和完整性校验功能(不是基于SSL),可以在服务器端以及客户端的
sqlnet.ora
文件中进行配置,涉及到4个参数配置:
-
SQLNET.ENCRYPTION_SERVER
指定加密方式-
rejected
禁用该安全机制。 -
accepted
(默认值)启用并设置为被动模式,仅在对端要求时启用加密。 -
requested
启用并设置为主动模式,优先尝试加密,如果对端支持加密,则自动启用加密。 -
required
启用并设置为强制模式,如果对端未启用加密,则中止连接。
-
-
SQLNET.CRYPTO_CHECKSUM_SERVER
指定校验方式(参数同上,略) -
SQLNET.ENCRYPTION_TYPES_SERVER
指定加密算法(AES256等) -
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER
指定哈希算法(SHA1等)
SSL传输 ¶
Oracle数据库仅支持基于X509的SSL配置,需要在服务端和客户端分别配置Wallet,使用生成的CA、Cert、Key进行SSL传输(配置过程麻烦,没试成功)。核查时只需在
sqlnet.ora
文件以及
listener.ora
文件查看即可。
# sqlnet.ora
# 有TCPS证明支持X509认证
SQLNET.AUTHENTICATION_SERVICES= (BEQ, TCPS, NTS);
# listener.ora
# 有TCPS证明需要使用SSL协议连接
# 默认使用SSLv3,使用更高版本的话需要安装补丁
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 192.168.239.128)(PORT = 1521))
警告
不要让客户直接这么配,会挂。让客户自己百度Wallet的配置方法。