Oracle数据库系统安全配置手册.docx
《Oracle数据库系统安全配置手册.docx》由会员分享,可在线阅读,更多相关《Oracle数据库系统安全配置手册.docx(19页珍藏版)》请在冰豆网上搜索。
![Oracle数据库系统安全配置手册.docx](https://file1.bdocx.com/fileroot1/2023-4/28/886640a6-1de0-48e4-a56e-3648720ea252/886640a6-1de0-48e4-a56e-3648720ea2521.gif)
Oracle数据库系统安全配置手册
Oracle数据库系统安全配置
本标准适用于Unix/Linux操作系统下的Oracle数据库系统,版本为8i、9i、10g。
1将Oracle用户设置为DBA组的成员
查看dba组下的成员是否有Oracle用户:
cat/etc/group|grepdba
若Oracle用户不在dba组,则将其加入:
usermod-Gdba用户名
2最小权限使用规则
加固目的
1.应该只提供最小权限给用户(包括SYSTEM和OBJECT权限)
2.从PUBLIC组中撤回不必要的权限或角色。
(如:
UTL_SMTP、UTL_TCP、UTL_HTTP、UTL_、DBMS_SQL、DBMS_SYS_SQL、DBMS_BACKUP_RESTORE)
加固方法
撤销不需要的权限和角色,使用SQL语句
REVOKEEXECUTEONSYS.UTL_HTTPFROMPUBLIC;
REVOKEEXECUTEONSYS.UTL_PUBLIC;
REVOKEEXECUTEONSYS.UTL_SMTPFROMPUBLIC;
REVOKESELECTONALL_USERSFROMPUBLIC;
验证:
OEM管理器中,安全性->用户->PUBLIC->已授予的对象权限
colppformata35
SELECTs.privilege||'ON'||s.owner||'.'||NVL(l.longname,s.table_name)pp,s.grantableFROM
sys.dba_tab_privss,javasnmlWHEREs.table_name=l.short(+)ANDs.grantee='PUBLIC'
ands.privilege='EXECUTE'ands.table_namelike'UTL%';
3修改所有系统账户默认口令,锁定不需要的账户
加固目的
为了安全考虑,应用锁定Oracle当中不需要的用户;或改变缺省用户的密码。
加固方法
在sqlplus中查看所有账户及其状态:
selectusername,account_statusfromdba_users;
修改默认账户的口令:
ALTERUSERuser_nameIDENTIFIEDBYpassword;
锁定不需要的用户,使用SQL语句:
ALTERUSERuserPASSWORDEXPIRE;
注意锁定MGMT_VIEW、DBSNMP、SYSMAN帐号或修改密码。
(如果要使用DBConsole,MGMT_VIEW,DBSNMP、SYSMAN不能锁定,请修改密码)
DIP、EXFSYS、OUTLN、TSMSYS、WMSYS默认已锁定,请验证。
4删除多余自建账号
dropuseruser_namecascade;
5$ORACLE_HOME/bin目录权限保护
加固目的
确保对$ORACLE_HOME/bin目录的访问权限尽可能少
加固方法
运行命令:
chown-Roracle:
dba$ORACLE_HOME/bin(此命令在root用户下操作)
验证:
ls-l$ORACLE_HOME/bin确保该目录下的文件属主为oracle用户,且其他用户没有写权限。
6监听listener作ip访问限制
修改(需重启监听)
$ORACLE_HOME/network/admin/sqlnet.ora:
tcp.validnode_checking=yes
tcp.invited_nodes=(localhost,本机ip,应用服务器ip,管理机ip等)
重启监听:
lsnrctlstop;lsnrctlstart。
7关闭远程操作系统认证
加固目的
设置正确识别客户端用户,并限制操作系统用户数量(包括管理员权限、root权限、普通用户权限等)
加固方法
1.使用文本方式,打开数据库配置文件init.ora;设置参数REMOTE_OS_AUTHENT值为FALSE(SAP系统不可设置为False)
2.在数据库的账户管理中删除不必要的操作系统账号
设置(需重启数据库):
altersystemsetremote_os_authent=falsescope=spfile;
验证:
SQL>showparameterremote_os_authent
NAMETYPEVALUE
----------------------------------------------------------------------------
remote_os_authentbooleanFALSE
8修改默认的监听端口
修改(需重启监听)
$ORACLE_HOME/network/admin/listener.ora:
(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))
修改PORT的值为新的监听端口->
(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=3521))
确认:
lsnrctlstatus
9监听程序的管理
加固目的
通过设置listener.ora文件中的参数ADMIN_RESTRICTIONS_listener_name来防止远程对监听程序的非授权管理。
加固方法
在$ORACLE_HOME/network/admin/listener.ora文件中,设置ADMIN_RESTRICTIONS_(listener_name)=ON。
LISTENER加访问密码:
(only9i)
$ORACLE_HOME/network/admin/listener.ora
PASSWORDS_LISTENER=
10g:
(监听默认为本地操作系统帐号认证,即禁止远程管理)
验证:
Lsnrctlstatus,查看输出
SecurityON:
LocalOSAuthentication
10密码策略
加固目的
在Oracle,我们可以通过修改用户概要文件来设置密码的安全策略,可以自定义密码的复杂度。
在概要文件中有以下参数是和密码安全有关心的:
FAILED_LOGIN_ATTEMPTS:
最大错误登录次数
PASSWORD_GRACE_TIME:
口令失效后锁定时间
PASSWORD_LIFE_TIME:
口令有效时间
PASSWORD_LOCK_TIME:
登录超过有效次数锁定时间
PASSWORD_REUSE_MAX:
口令历史记录保留次数
PASSWORD_REUSE_TIME:
口令历史记录保留时间
PASSWORD_VERIFY_FUNCTION:
口令复杂度审计函数
加固方法
解释:
PASSWORD_LIFE_TIME:
口令有效时间
口令使用期限(按照国网要求,三个月修改一次密码,即90天)。
password_grace_time指的是在你的密码已经过期以后,第一次登录时间开始往后统计,使系统可以使用的日期限度.
PASSWORD_REUSE_TIME是重用密码的最小时间间隔,单位是天。
可以给出整数或分数,如1/1440表示1分钟(出于效率的考虑,oracle不会每分钟都去进行检查,一般来说,有5分钟左右的误差,因此如果这个数小于1/144则没有多大的意义)。
PASSWORD_REUSE_MAX是重用密码前更换密码的最小次数。
ALTERPROLIMITFAILED_LOGIN_ATTEMPTS60;(三级系统应设置在10次以内,二级系统在20次以内)
ALTERPROLIMITPASSWORD_LOCK_TIME0.5;
修改Oracle提供的验证函数文件$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
其中IFlength(password)<4一行改为<8,并将最后一段修改为
ALTERPROLIMIT
PASSWORD_LIFE_TIME90
FAILED_LOGIN_ATTEMPTS20
PASSWORD_LOCK_TIME30/1440
PASSWORD_VERIFY_FUNCTIONverify_function;
在sqlplus中执行start$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
设置后,密码复杂度必须包含字母、数字、标点(密码不区分大小写),最小长度为8。
最大错误登录次数为20次,账号锁定时间为30分钟
验证:
OEM-》安全性-》概要文件
select*fromdba_profiles;
创建验证函数:
(建议使用sys来创建该函数,否则可能出现问题)
CREATEORREPLACEFUNCTIONverify_function
(usernamevarchar2,
passwordvarchar2,
old_passwordvarchar2)
RETURNbooleanIS
nboolean;
minteger;
differinteger;
isdigitboolean;
ischarboolean;
ispunctboolean;
digitarrayvarchar2(20);
punctarrayvarchar2(25);
chararrayvarchar2(52);
BEGIN
digitarray:
='0123456789';
chararray:
='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
punctarray:
='!
"#$%&()``*+,-/:
;<=>?
_';
--Checkifthepasswordissameastheusername
IFNLS_LOWER(password)=NLS_LOWER(username)THEN
raise_application_error(-20001,'Passwordsameasorsimilartouser');
ENDIF;
--Checkfortheminimumlengthofthepassword
IFlength(password)<8THEN
raise_application_error(-20002,'Passwordlengthlessthan8');
ENDIF;
--Checkifthepasswordistoosimple.Adictionaryofwordsmaybe
--maintainedandacheckmaybemadesoasnottoallowthewords
--thataretoosimpleforthepassword.
IFNLS_LOWER(password)IN('welcome','database','account','user','password','oracle','computer','abcd')THEN
raise_application_error(-20002,'Passwordtoosimple');
ENDIF;
--Checkifthepasswordcontainsatleastoneletter,onedigitandone
--punctuationmark.
--1.Checkforthedigit
isdigit:
=FALSE;
m:
=length(password);
FORiIN1..10LOOP
FORjIN1..mLOOP
IFsubstr(password,j,1)=substr(digitarray,i,1)THEN
isdigit:
=TRUE;
GOTOfindchar;
ENDIF;
ENDLOOP;
ENDLOOP;
IFisdigit=FALSETHEN
raise_application_error(-20003,'Passwordshouldcontainatleastonedigit,onecharacterandonepunctuation');
ENDIF;
--2.Checkforthecharacter
<>
ischar:
=FALSE;
FORiIN1..length(chararray)LOOP
FORjIN1..mLOOP
IFsubstr(password,j,1)=substr(chararray,i,1)THEN
ischar:
=TRUE;
GOTOfindpunct;
ENDIF;
ENDLOOP;
ENDLOOP;
IFischar=FALSETHEN
raise_application_error(-20003,'Passwordshouldcontainatleastone\
digit,onecharacterandonepunctuation');
ENDIF;
--3.Checkforthepunctuation
<>
ispunct:
=FALSE;
FORiIN1..length(punctarray)LOOP
FORjIN1..mLOOP
IFsubstr(password,j,1)=substr(punctarray,i,1)THEN
ispunct:
=TRUE;
GOTOendsearch;
ENDIF;
ENDLOOP;
ENDLOOP;
IFispunct=FALSETHEN
raise_application_error(-20003,'Passwordshouldcontainatleastone\
digit,onecharacterandonepunctuation');
ENDIF;
<>
--Checkifthepassworddiffersfromthepreviouspasswordbyatleast
--3letters
IFold_passwordISNOTNULLTHEN
differ:
=length(old_password)-length(password);
IFabs(differ)<3THEN
IFlength(password)m:
=length(password);
ELSE
m:
=length(old_password);
ENDIF;
differ:
=abs(differ);
FORiIN1..mLOOP
IFsubstr(password,i,1)!
=substr(old_password,i,1)THEN
differ:
=differ+1;
ENDIF;
ENDLOOP;
IFdiffer<3THEN
raise_application_error(-20004,'Passwordshoulddifferbyat\
least3characters');
ENDIF;
ENDIF;
ENDIF;
--Everythingisfine;returnTRUE;
RETURN(TRUE);
END;
/
11数据库操作审计
加固目的
ORACLE数据库具有对其内部所有发生的活动的审计能力,审计日志一般放在sys.aud$表中,也可以写入操作系统的审计跟踪文件中。
可审计的活动有三种类型:
登录尝试、数据库活动和对象存取,缺省情况下,数据库不启动审计,要求管理员配置数据库后才能启动审计。
加固方法
使用文本方式,打开数据库配置文件init.ora,更改以下参数配置AUDIT_TRAIL=True。
init.ora所在路径:
$ORACLE_HOME/database/(windows)
$ORACLE_HOME/dbs/(Unix\Linux)
接下来在sqlplus中执行以下两条命令:
altersystemsetaudit_trail='OS'scope=spfile;
altersystemsetAudit_sys_operations=truescope=spfile;
默认为false,当设置为true时,所有sys用户(包括以sysdba,sysoper身份登录的用户)的操作都会被记录
验证:
SQL>showparameteraudit
NAMETYPEVALUE
----------------------------------------------------------------------------
audit_sys_operationsbooleanTRUE
audit_trailstringOS
TRANSACTION_AUDITING:
thetransactionlayergeneratesaspecialredorecordwhichcontainssessionanduserinformation.Theserecordsmightbeusefulifusingaredologanalysistool.
AUDIT_指定了当审外部审记文件目标存储路径,其缺省值是$ORACLE_HOME/rdbms/audit
audit_string/opt/oracle/admin/cognos/adump
监听器日志错误登录
/opt/oracle/product/10.2.0/db_1/network/log/listener.log
12安全补丁的更新
加固目的
及时更新数据库的安全补丁,减少数据库系统可能受到的攻击。
加固方法
查看,下载并安装相关的安全补丁。
参考Oracle厂商建议,仅对已发现的特定漏洞或缺陷安装相应补丁。
13Oracle数据字典的保护
加固目的
设置保护后,可防止其他用户(具有‘ANY’systemprivileges)使用数据字典时,具有相同的‘ANY’权限。
加固方法
使用文本方式,打开数据库配置文件init.ora;更改以下参数O7_DICTIONARY_ACCESSIBILITY=。
1.Oracle9i、10g:
缺省值是False
2.Oracle8i:
缺省值是True,需要改成False
3.如果用户必须需要该权限,赋予其权限SELECTANYDICTIONARY
验证:
SQL>showparameterO7_DICTIONARY_ACCESSIBILITY
NAMETYPEVALUE
----------------------------------------------------------------------------
O7_DICTIONARY_ACCESSIBILITYbooleanFALSE
14关闭Extproc功能
加固目的
由于extproc存在安全问题允许用户不进行身份认证就可以调用系统函数,因此,如果不需要该功能必须关闭。
加固方法
修改TNSNAMES.ORA和LISTENER.ORA文件,删除以下条目:
●icache_extproc
●PLSExtproc
●Extproc
tnsnames.ora:
#EXTPROC_CONNECTION_DATA=
#(DESCRIPTION=
#(ADDRESS_LIST=
#(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))
#)
#(CONNECT_DATA=
#(SID=PLSExtProc)
#(PRESENTATION=RO)
#)
#)
listener.ora:
#(SID_DESC=
#(SID_NAME=PLSExtProc)
#(ORACLE_HOME=/opt/oracle/product/10.2.0/db_1)
#(PROGRAM=extproc)
#)
#(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))
15DBSNMP用户的保护
加固目的
Oracle数据库系统如果采用典型安装后,自动创建一个叫做DBSNMP的用户,该用户允许Oracle系统的智能代理(intelligentAgent),该用户的缺省密码也是“DBSNMP”。
如果忘记修改该用户的口令,任何人都可以通过该用户存取数据库系统。
其他有威胁的帐号还有:
CTXSYS,MDSYS,ORDPLUGINS,ORDSYS,OUTLN等。
加固方法
锁定该账号,或者更换密码
16SYS用户
加固目的
Oracle数据库系统安装后,自动创建一个叫做SYS的数据库管理员用户,当该用户sysdba方式连接数据库时,便具有全部系统权限,因而对它的保护尤为重要。
加固方法
更换SYS用户密码,符合密码复杂度要求;
新建一个DBA用户,作为日常管理使用。
17本地缓存区溢出防护
加固目的
'oracle'程序存在本地缓冲区溢出。
在传递命令行参数给'oracle'程序时缺少充分的边界缓冲区检查,可导致以'oracle'进程权限在系统上执行任意代码,需要进行有效加固。
加固方法
以系统管理员权限登录操作系统,进入Oracle安装目录
运行:
chmodo-xoracle加强对Oracle文件的可执行控制
验证非oracle帐号对该文件没有读取、运行权限:
ll$ORACLE_HOME/bin/oracle
-rwsr-s---1oracledba1107589762008-01-23/opt/oracle/product/10.2.0/db_1/bin/oracle
chmodo-x$ORACLE_HOME/bin/oracle
18日志目录
SQL>showparameterdump
NAMETYPE