While
today, we take security seriously,
unfortunately we don�t take database
security as seriously as other
security. The database information
is the most valuable asset that an
organization owns. The database
security today should be taken more
seriously; and it should not be
compromised to save money.
This
article only will address the most
important security holes that we as
a DBA may encounter in our database
setup. This topic is endless and
remembers that there is no such a
secure environment. What we will try
to do is: to make a safer and
securer environment for ourselves.
First, you should
always try to keep up to date with
Oracle Security
vulnerabilities on Oracles Security
Alert page on the Oracle web site.
Oracle�s
Security
Site:
Oracle Security and Oracle�s
Customer information Site:
Oracle Metalink to check a
security alerts and patches
regularly.
A
check list to protect your database
(Minimum compromising)
The
following items may or maybe
applicable to your database
environment. It is very important at
least to pay attention to following
basic items.
1-
Make sure to change passwords (not
easy to find) of your SYS, and
SYSTEM usernames and lock or drop
other usernames if you don�t use
them. To lock an account (ALTER USER
username ACCOUNT LOCK; DROP USER
username CASCADE;)
1-
Make sure to change the orcladmin/welcome
and sysman/oem_temp passwords if you
use OEM and Oracle9ias.
2-
Consider to lock ORACLE account if
needed. Be sure to have supper
account to access to ORACLE account
and then run the ORACLE�s profile.
3-
Make sure to have a secure ORACLE
password.
For Oracle Net Password
Protection:
Non-encrypted Password
Protection:
/* Add PASSWORDS_listener
entry to listener.ora.
PASSWORDS_listener=(mypassword)
$lsnrctl
lsnrctl> SET
current_listener
your_listener_name
lsnrctl> SET password
mypassword
lsnrctl> STOP or START
Encrypted Password
Protection;
/* There should not be any
PASSWORDS_listener
entry */
$lsnrctl
lsnrctl> SET
current_listener
your_listener_name
lsnrctl> SET
save_config_on_stop ON
lsnrctl> CHANGE_PASSWORD
lsnrctl> SET password
/* since it is
encrypted you can not say
�SET password newpassword�
*/
lsnrctl> STOP or START
Forgot your password:
/* Comment the following
lines in the listener.ora
file */
PASSWORDS_listener
= 77DE8751BF7645921
SAVE_CONFIG_ON_STOP_LISTERNER=ON
Restrict operator to SET
commands
/* Add the following line */
ADMIN_RESTRICTIONS_LISTENER
=ON
|
4-
Use SSH or SUDO to disable remote
log-in to the ORACLE account.
5-
On Unix System, change the
$ORACLE_HOME/bin files� permissions
to 0751 or less if possible.
6-
Make sure to set
REMOTE_LOGIN_PASSWORD_FILE=NONE.
7-
Make sure that the ORACLE account is
not a member of root (UNIX) and it
is only a member of the dba group.
$ grep
�i root /etc/group
$ grep
�i dba /etc/group
8-
Make sure that datafiles have only
read/write accesses. ($cdmod �R 600
/u02/oradata)
9-
Don�t hard code a user name and
password in your sql scripts. If you
have to, make sure to use /nolog to
instead of entering the username and
password.
$sqlplus /nolog @mysqlscripts.sql
(still this is not good since your
username and password is in sql
scripts but it is better than
$sqlplus scott/tiger @mysqlscripts
that the whole world can find out.
Or for
exporting do the following:
$exp
UP=scott/tiger
$exp
parfile=yourparm.ctl
(If
you can restrict the �ps� command at
the operating system level.)
10- You can use
Oracle Advanced Security
to
encrypt data over networks. Read
This Link
11- Make sure to set
the following environment variables
to TRUE to prevent password to be
revealing to others.
(ORA_ENCRYTP_LOGIN in client and
server, and DBLINK_ENCRYPT_LOGIN
in
both servers)
12-
Make sure in UNIX add �set
noexec_user_stack=1� in the
/etc/system file to make the stack
non-executable.
13- Don�t give the
�ALTER SESSION� system privilege to
users that they don�t need it. No
way you should give any one the
�ALTER SYSTEM
�
system privilege unless there are
DBAs.
14-
Use the following UNIX script to
check to see if there are any �exp,
connect or sqlplus� command with a
password in them.
# find
/u01 -name �*� �print | while read
filename
do
egrep �i
�exp|connect|sqlplus� $filename >>
exp.lis 2> /dev/null
done
#
15-
Don�t use any external files if you
can. Make sure the count is zero.
(SELECT count(*) FROM
dba_external_tables)
16- Be
aware of the following files that
contains passwords:
File name
|
Type of password
|
orapwd<sid>.ora
|
Remote login passwords
|
snmp_rw.ora
|
Intelligent agent password
|
exported complete dmp
|
Oracle Hashkeys
|
htaccess
|
Apache passwords
|
wdbsvr.app
|
Contains mod_plsql passwords
|
webcache.xml
|
Weekly encrypted passwords
|
listener.ora
|
Listener
passwords (encrypted or
text)
|
Database creation scripts
|
Oracle passwords if not
changed.
|
17-
Make sure to delete the �MDSYS or
FINANCE� username since they are
granted ALL PRIVILEDGES.
18-
Alter default profile to have
password management features.
SQL>
ALTER PROFILE default
2 LIMIT
FAILED_LOGIN_ATTEMPTS
10
3 PASSWORD_LIFE_TIME
90
4 PASSWORD_REUSE_MAX
5
5
PASSWORD_GRACE_TIME
5
/
19- If
needed write a password in house
verification function. The following
is a sample of a function verifies
password that checks to ensure old
password is not the same of new
password and the length of a new
password. You can make this very
complex due to your company business
rules. Check also the
%ORACLE_HOME%\rdbm\admin\utlpwdmg.sql
file. Then alter your profile.
(ALTER PROFILE DEFAULT limit
password_verify_function
verify_password)
CREATE
OR REPLACE FUNCTION verify_password
(
v_user IN
VARCHAR2,
v_new_pw IN VARCHAR2,
v_old_pw IN VARCHAR2)
RETURN BOOLEAN IS
BEGIN
IF
LENGTH (v_new_pw) < 8 THEN
RAISE_APPLICATION_ERROR(-20100,
�Your password is too short.�);
ELSIF v_new_pw = v_user THEN
RAISE_APPLICATION_ERROR(-20104, �New
password same as username.�);
ELSIF v_new_pw = v_old_pw THEN
RAISE_APPLICATION_ERROR(-20108, �New
password same as old.�);
ELSE
RETURN(TRUE);
END
IF;
END;
/
20-
Lock or drop all the username
account that was not used for more
certain time for ex: 90 days.
SQL>
AUDIT CREATE SESSION WHENEVER
SUCCESSFUL;
SQL>
-- after 90 days, do the following.
SQL>
SELECT distinct (u.username) FROM
dba_users u
2 WHERE NOT EXISTS
(SELECT �T� FROM dba_audit_trail a
3 WHERE a.username =
u.username and a.logoff_time >
sysdate � 90)
/
21-
Don�t hardcode any password in your
scribe. If you have to, make sure
immediately when your job was done.
22- Make sure that an
access to the �UTL_FILE
,�
�UTL_TCP
,�
�UTL_HTTP
,�
UTL_SMTP
,�
�DBMS_JAVA,� �DBMS_RANDOM
,�
�DBMS_SQL,� �DBMS_SYS_SQL� and
�DBMS_BACKUP_RESTORE� packages
weren�t granted to PUBLIC; revoke
them if they are and give access to
those only needed. (REVOKE EXECUTE
ON utl_file FROM PUBLIC;)
23-
Revoke access the �ALL_USERS� table
from public. (REVOKE SELECT ON
all_users FROM PUBLIC;)
24- If
you don�t need c library then remove
the EXTPROC (c library) from the
listener.ora.
25-
Make sure that the
SELECT_CATALOG_ROLE,
EXECUTE_CATALOG_ROLE AND
DELETE_CATALOG_ROLE system
privileges or all DBA_ were granted
only to DBAs. (dba_role_privs)
26-
Avoid creating account externally.
Check their privileges with no
SYSDBA or SYSOPER roles.
27- Make sure that
the �O7_DICTIONARY_ACCESSIBILITY
�
parameter is set to �FALSE.�
28- Make sure that
the �REMOTE_OS_AUTHENT
� and
�REMOTE_OS_ROLES� are not set to
�TRUE.� These parameters are set to
�FALSE� by default.
29-
Don�t grant the �EXEMPT ACCESS
POLICY� system privilege to any
users, unless you have to.
30-
Make sure that no other objects
except sys�s objects are in the
system tablespace. If there are,
please move them to an alternative
location.
SELECT
owner, segment_name, segment_type
FROM dba_segments
WHERE
tablespace_name = �SYSTEM� and owner
!= �SYS�;
31-
Make sure that an ordinary users do
not have any system privileges. Also
check for the �SELECT ANY TABLE�
privilege.
32-
Revoke any PUBLIC privileges on
DICTIONAY objects.
33-
Check on the �RESOURCE� role. It
gives unlimited tablespace on all
tablespaces.
34- Be
sure to revoke the key dangerous
privileges from the �RESOURCE� and
�CONNECT� roles.
35-
Change at least the �IDLE_TIME�
parameter of the default and users
profile.
36-
Prevent any access to dba_users,
sys.link$, sys.user$, and
sys.user_history$ tables. These
tables or views contain users�
password.
37-
Make sure to audit the auditors by
�AUDIT ALL ON sys.aud$ BY ACCESS,�
if you are auditing.
38-
Regularly check the following Oracle
log files.
Type
|
File/System
|
Window OS
|
Eventviewer
|
UNIX OS
|
syslog
|
Oracle
|
listener.log (Connection
attempts are logged)
|
Oracle
|
access_log (Every access to
Oracle)
|
Oracle
|
error_log (Oracle errors)
|
Oracle
|
sqlnet.log (Connection
failuers)
|
Oracle
|
apache.log (access
violations)
|
39- Make sure that
the
�ADMIN_RESTRICTIONS_listernername
�
parameter is set to �ON� to prevent
the listener from accepting SET
commands while is running.
40-
Set reasonable file permissions on
the listener configuration file. ($
chmod 600 listerner.ora)
41- If
you need a very tide security,
ensure that the following parameters
are set in the
�network/admin/protocol.ora� file.
tcp.validnode_checking=YES
tcp.invited_nodes=(xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx)
or tcp.excluded_nodes
The
invited_nodes parameter will allow
connections only from specific nodes
and deny any others.
42- If
you need to tide your network much
more, use Connection Manager (CMAN).
You can have your own firewall
beside your network firewall and
De-Militarised Zone (DMZ). It means
3 firewalls.
43-
Ensure that the listener password
has been set.
$
lsnrctl
$ LSNRCTL
>
change_password (Notice automatic
start/stop is a big problem.
44-
Disable logging to listener.log or
sqlnet.log if that is possible.
LOGGING_listener
= OFF
or lsnrctl set log_status off
45-
Never have a link to production
database from test or development
database. Use exp/imp utilities to
copy the files.
46- If
you have hardcoded procedures, you
should wrap your functions,
procedures, and packages source
programs. (wrap iname=myproc.sql
oname=myprocx.sql)
|