๐Ÿ“ž +880 1715-151882 โœ‰๏ธ info@khannasir.com
๐Ÿ“ New Eskaton, Dhaka-1000

Oracle Database Security & Hardening: Least Privilege, TDE, Database Vault, Auditing & Patching

A database breach is rarely a Hollywood-style hack. In real production environments it is far more ordinary: a shared DBA account with a password that never changes, a developer who still has SELECT on production salary tables two years after leaving that project, an unencrypted backup tape sitting in a cupboard, or an audit trail that nobody ever reads. Oracle ships with one of the most complete security toolkits in the database world โ€” Transparent Data Encryption, Database Vault, Unified Auditing, Data Redaction, fine-grained access control โ€” yet most databases I am asked to review use almost none of it. This guide walks through a practical, layered hardening methodology I apply to production Oracle databases in manufacturing, banking, and pharmaceutical environments, with the exact commands and the reasoning behind each control.

1. The Right Model: Defense in Depth

Security is not a single switch you flip. It is a series of independent layers, each of which an attacker โ€” or an honest mistake โ€” must pass through. If one layer fails, the next still protects you. For an Oracle database, the layers that matter are:

  1. Access control: Who can connect, and what can each account do? (least privilege, roles, password profiles)
  2. Encryption at rest: If someone steals a datafile or a backup, is it useless to them? (TDE)
  3. Encryption in transit: Can someone sniff data off the network between the application and the database? (native network encryption / TLS)
  4. Separation of duties: Can a DBA read the business data they administer? (Database Vault)
  5. Accountability: Is every privileged action recorded and reviewable? (Unified Auditing)
  6. Data minimisation: Do users see sensitive columns they do not need? (Data Redaction)
  7. Patching: Are known vulnerabilities closed promptly? (quarterly Critical Patch Updates)

The biggest mistake I see is teams investing heavily in one layer โ€” usually a network firewall โ€” while leaving the database itself wide open behind it. A firewall does nothing against a contractor who already has a valid login and over-broad privileges.

2. Least Privilege and User Management

The foundation of database security is that every account has exactly the privileges it needs to do its job, and no more. This is the control that prevents the most damage, and it costs nothing but discipline.

2.1 Find Over-Privileged Accounts

-- Who has powerful system privileges directly granted?
SELECT grantee, privilege, admin_option
FROM DBA_SYS_PRIVS
WHERE privilege IN ('SELECT ANY TABLE','UPDATE ANY TABLE','DELETE ANY TABLE',
                    'ALTER ANY TABLE','DROP ANY TABLE','CREATE ANY PROCEDURE',
                    'EXECUTE ANY PROCEDURE','GRANT ANY ROLE','GRANT ANY PRIVILEGE')
ORDER BY grantee, privilege;

-- Who has the DBA role (should be a very short list)?
SELECT grantee FROM DBA_ROLE_PRIVS
WHERE granted_role = 'DBA'
ORDER BY grantee;

-- Accounts that can log in but have never been used recently
SELECT username, account_status, last_login, profile
FROM DBA_USERS
WHERE account_status = 'OPEN'
ORDER BY last_login NULLS FIRST;

Every name that appears in those first two queries should be justifiable. ANY privileges are particularly dangerous โ€” SELECT ANY TABLE lets an account read every table in the database, including the data dictionary and other schemas. Grant object privileges on specific tables instead.

2.2 Lock Down Default and Unused Accounts

-- Lock and expire any sample / default account that is open
ALTER USER hr ACCOUNT LOCK;
ALTER USER scott ACCOUNT LOCK;

-- Revoke EXECUTE on powerful packages from PUBLIC
REVOKE EXECUTE ON UTL_FILE FROM PUBLIC;
REVOKE EXECUTE ON UTL_TCP FROM PUBLIC;
REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC;
REVOKE EXECUTE ON DBMS_SCHEDULER FROM PUBLIC;

2.3 Enforce Password Profiles

A password policy that is enforced by the database is far stronger than one written in a document nobody follows.

-- Create a strong profile and assign it to application/DBA accounts
CREATE PROFILE app_secure_profile LIMIT
  FAILED_LOGIN_ATTEMPTS     5
  PASSWORD_LIFE_TIME       90
  PASSWORD_REUSE_MAX       10
  PASSWORD_REUSE_TIME     365
  PASSWORD_LOCK_TIME        1
  PASSWORD_GRACE_TIME       7
  PASSWORD_VERIFY_FUNCTION ORA12C_STRONG_VERIFY_FUNCTION
  INACTIVE_ACCOUNT_TIME    60;

ALTER USER erp_app PROFILE app_secure_profile;

The INACTIVE_ACCOUNT_TIME setting automatically locks any account unused for 60 days โ€” this alone closes one of the most common doors, the forgotten contractor login.

3. Transparent Data Encryption (TDE) โ€” Encryption at Rest

TDE encrypts data as it is written to disk and decrypts it as it is read back, transparently to the application. If someone steals a datafile, an RMAN backup, or an export, the data is unreadable without the encryption keys. For any database holding personal, financial, or health data, TDE is no longer optional โ€” it is a baseline expectation of every regulator and every serious client.

3.1 Configure the Keystore

-- In the database parameter file, point to the keystore location
ALTER SYSTEM SET WALLET_ROOT='/u01/app/oracle/admin/PRODDB/wallet' SCOPE=SPFILE;
-- restart, then:
ALTER SYSTEM SET TDE_CONFIGURATION="KEYSTORE_CONFIGURATION=FILE" SCOPE=BOTH;

-- Create and open the software keystore
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE IDENTIFIED BY "StrongKeystorePwd#26";
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "StrongKeystorePwd#26";

-- Set the master encryption key
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY "StrongKeystorePwd#26" WITH BACKUP;

-- Create an auto-login keystore so the DB opens without manual key entry
ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE
  IDENTIFIED BY "StrongKeystorePwd#26";

3.2 Encrypt Tablespaces

-- Encrypt a new tablespace
CREATE TABLESPACE erp_secure_data
  DATAFILE '/u02/oradata/PRODDB/erp_secure01.dbf' SIZE 2G
  ENCRYPTION USING 'AES256' ENCRYPT;

-- Online-encrypt an existing tablespace (19c+ โ€” no downtime)
ALTER TABLESPACE erp_data ENCRYPTION ONLINE USING 'AES256' ENCRYPT
  FILE_NAME_CONVERT=('erp_data','erp_data_enc');

-- Verify what is encrypted
SELECT tablespace_name, encrypted FROM DBA_TABLESPACES ORDER BY 1;

Critically, keep the keystore backup somewhere separate from the database backup. If you lose the keys, the encrypted data is gone forever โ€” that is the whole point of encryption, and it cuts both ways.

4. Network Encryption โ€” Encryption in Transit

Data is just as exposed travelling across the network as it is sitting on disk. Without network encryption, anyone who can capture traffic between the application server and the database can read query results and even credentials. Oracle Native Network Encryption requires no certificates and can be enabled with a few sqlnet.ora settings.

# sqlnet.ora on both database and client side
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256)
-- Confirm a session is actually encrypted
SELECT s.sid, n.network_service_banner
FROM V$SESSION_CONNECT_INFO n
JOIN V$SESSION s ON s.sid = n.sid
WHERE n.network_service_banner LIKE '%Encryption%'
  AND s.sid = SYS_CONTEXT('USERENV','SID');

Setting ENCRYPTION_SERVER = REQUIRED means the database will refuse any connection that will not negotiate encryption โ€” the safest setting for a production system on a shared network.

5. Database Vault โ€” Separation of Duties

Here is an uncomfortable truth most organisations never address: a DBA with SYSDBA can read every row of business data โ€” salaries, patient records, account balances โ€” even though their job is to keep the database running, not to look at its contents. In a regulated environment this is a genuine compliance gap. Oracle Database Vault solves it by creating realms that block even powerful accounts from accessing protected data.

-- After enabling Database Vault, create a realm around sensitive schemas
BEGIN
  DBMS_MACADM.CREATE_REALM(
    realm_name    => 'HR Salary Realm',
    description   => 'Protect HR salary and personal data from DBAs',
    enabled       => DBMS_MACUTL.G_YES,
    audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL);

  DBMS_MACADM.ADD_OBJECT_TO_REALM(
    realm_name   => 'HR Salary Realm',
    object_owner => 'HR',
    object_name  => '%',
    object_type  => '%');
END;
/

After this, even a user with SELECT ANY TABLE or SYSDBA is denied access to the HR schema unless they are an authorised realm participant. The administrator can still back up, tune, and patch the database โ€” they simply cannot read the protected business data. This is exactly the control bank and pharma auditors look for.

6. Unified Auditing โ€” Accountability

If something goes wrong, can you answer the question "who did this, and when?" Unified Auditing (the modern audit framework, replacing the old AUD$ approach) captures privileged activity into a single, secure, tamper-resistant trail with very low overhead because it is policy-based rather than capturing everything.

-- Audit all activity by powerful users and all privilege/role changes
CREATE AUDIT POLICY priv_user_activity
  ACTIONS ALL
  WHEN 'SYS_CONTEXT(''USERENV'',''CURRENT_USER'') IN (''SYSTEM'',''DBA_OPS'')'
  EVALUATE PER STATEMENT;

CREATE AUDIT POLICY ddl_and_grants
  ACTIONS CREATE USER, ALTER USER, DROP USER, GRANT, REVOKE,
          CREATE ROLE, ALTER PROFILE;

-- Audit failed logins (detect brute-force attempts)
CREATE AUDIT POLICY failed_logons ACTIONS LOGON;

AT POLICY priv_user_activity;
AUDIT POLICY ddl_and_grants;
AUDIT POLICY failed_logons WHENEVER NOT SUCCESSFUL;
-- Review the audit trail โ€” failed logins in the last 24 hours
SELECT dbusername, action_name, return_code,
       TO_CHAR(event_timestamp,'DD-MON HH24:MI') AS when_happened,
       userhost, terminal
FROM UNIFIED_AUDIT_TRAIL
WHERE event_timestamp > SYSTIMESTAMP - 1
  AND action_name = 'LOGON'
  AND return_code <> 0
ORDER BY event_timestamp DESC;

An audit trail that nobody reads is just disk usage. The real control is a short weekly review of failed logins, privilege grants, and access to sensitive objects โ€” even ten minutes a week catches the anomalies that matter.

7. Data Redaction โ€” Showing Only What Is Needed

Often the problem is not that a user should have zero access to a table, but that they should not see one sensitive column in full. A support agent may need to confirm the last four digits of a national ID without seeing the whole number. Data Redaction masks column values at query time, with no change to the stored data and no application code change.

-- Show only the last 4 digits of a national ID to non-privileged users
BEGIN
  DBMS_REDACT.ADD_POLICY(
    object_schema => 'HR',
    object_name   => 'EMPLOYEES',
    column_name   => 'NATIONAL_ID',
    policy_name   => 'redact_national_id',
    function_type => DBMS_REDACT.PARTIAL,
    function_parameters => 'VVVVVVVVV,VVVVVVVVV,*,1,9',
    expression    => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') NOT IN (''HR_MANAGER'')');
END;
/

The HR manager sees the full value; everyone else sees a masked one โ€” from the same table, with no duplicate "masked" copy to maintain.

8. Patching โ€” Closing Known Vulnerabilities

Oracle releases Release Updates (RUs) and security fixes on a quarterly cycle (the Critical Patch Update). The single most exploited category of database vulnerability is one for which a fix was already available but never applied. A patching discipline is a security control:

  • Track your current patch level: SELECT * FROM DBA_REGISTRY_SQLPATCH ORDER BY action_time DESC;
  • Apply RUs on a predictable quarterly schedule, tested in non-production first.
  • Use a standby database (Data Guard) to patch with near-zero downtime via a rolling approach.
  • Keep an inventory of every database and its patch level โ€” you cannot secure what you have not catalogued.

9. A Practical Hardening Checklist

Control What to Check Priority
Default passwords No account using a known default (check DBA_USERS_WITH_DEFPWD) Critical
Least privilege No unjustified ANY privileges or DBA grants Critical
Encryption at rest TDE on tablespaces holding sensitive data High
Encryption in transit Native network encryption REQUIRED High
Auditing Unified Auditing enabled, trail reviewed weekly High
Listener security Listener password / local OS auth, no remote admin Medium
Patching Quarterly Release Updates applied and tracked High

10. Real Security Cases

Two anonymised examples from production reviews:

Case 1 โ€” The Forgotten Contractor Account

Finding: A privilege review at a manufacturing group revealed an account belonging to an integration contractor whose project had ended 18 months earlier. The account was still open, had SELECT ANY TABLE, and its password had never expired.

Fix: The account was locked immediately, the ANY privilege removed, and an INACTIVE_ACCOUNT_TIME password profile applied across all application accounts so any future dormant login auto-locks after 60 days. A quarterly privilege review was added to the operations calendar.

Case 2 โ€” Unencrypted Backups for a Pharma Database

Finding: A pharmaceutical client's RMAN backups were written unencrypted to a network share accessible by the whole IT team โ€” meaning anyone with file access effectively had a full copy of regulated production data.

Fix: Enabled TDE on the sensitive tablespaces and configured RMAN backup encryption, so both the live datafiles and every backup are now useless without the keystore. The keystore backup was moved to separate, restricted custody โ€” satisfying the data-integrity expectations of the next regulatory inspection.

๐Ÿ”’ Is Your Oracle Database Actually Secure?

I perform Oracle security reviews โ€” privilege audits, TDE and network encryption, Database Vault, Unified Auditing, and hardening to banking and pharma standards. Bangladesh and worldwide clients.

Book a Security Review โ†’ ๐Ÿ’ฌ WhatsApp Me

11. Common Hardening Mistakes

Over many reviews, the same avoidable errors recur. Watch for these, because each one quietly undoes the controls around it:

  • Storing the TDE keystore with the backups. Encrypting datafiles is pointless if the key travels in the same backup set an attacker would steal. Keep keystore custody separate and restricted.
  • Granting roles "to save time." Handing a developer the DBA role to unblock them on a Friday is how over-privilege becomes permanent. Grant the specific privilege needed, and remove it when the task ends.
  • Enabling auditing but never reading it. An audit trail is a detection control only if someone reviews it. Schedule a short, regular review of failed logins and privilege grants โ€” automation can surface the anomalies for you.
  • Leaving the listener wide open. An unprotected listener allows remote reconnaissance and, on older versions, remote administration. Restrict it to local OS authentication and lock down valid node checking.
  • Treating security as a one-time project. Privileges drift, people leave, new schemas appear. Without a recurring review, a database that was hardened last year is exposed again this year. Put a quarterly security review on the calendar and treat it as routine maintenance, not an emergency.

None of these are sophisticated attacks โ€” they are housekeeping failures. The good news is that the fix for every one of them is process, not budget.

Final Thoughts

Oracle gives you everything you need to run a genuinely secure database โ€” the gap is almost never the technology, it is whether the controls are actually turned on, configured correctly, and reviewed. Start with least privilege, because it prevents the most damage for the least effort. Add encryption at rest and in transit so stolen data is worthless. Use Database Vault to separate administration from data access, Unified Auditing for accountability, and a quarterly patch discipline to close known holes. None of this is exotic; all of it is the difference between "we hope we are secure" and "we can prove it to an auditor." Security is a posture you maintain, not a project you finish.

Nasir Uddin Khan โ€” Oracle DBA Consultant

About the Author

Nasir Uddin Khan Senior IT Consultant · Oracle DBA · ERP & AI Specialist OCP · Red Hat Certified · MBA · CSV · 18+ Years Experience

Nasir is an Oracle Certified Professional and CSV-certified IT consultant based in Dhaka, Bangladesh. He has 18+ years of hands-on experience in Oracle database administration, security hardening, ERP system design, and AI integration for manufacturing, pharmaceutical, banking, and healthcare organisations worldwide.

References & Further Reading

The hardening methodology and cases in this article are based on 18+ years of Oracle administration and security reviews across manufacturing, banking, and pharmaceutical production environments. Client examples are anonymised.

Related Articles

Secure Your Oracle Database โ€” Before Someone Else Tests It.

Privilege audit ยท TDE & network encryption ยท Database Vault ยท Unified Auditing ยท hardening. 18+ years of Oracle security experience. Bangladesh and worldwide.

๐Ÿ’ฌ