Select any two versions of this STIG to compare the individual requirements
Select any old version/release of this STIG to view the previous requirements
Retrieve the settings for concurrent sessions for each profile with the query: SELECT * FROM SYS.DBA_PROFILES WHERE RESOURCE_NAME = 'SESSIONS_PER_USER'; If the DBMS settings for concurrent sessions for each profile are greater than the site-specific maximum number of sessions, this is a finding.
Limit concurrent connections for each system account to a number less than or equal to the organization-defined number of sessions using the following SQL. Create profiles that conform to the requirements. Assign users to the appropriate profile. The user profile, ORA_STIG_PROFILE, has been provided with Oracle 19c to satisfy the STIG requirements pertaining to the profile parameters. Oracle recommends that this profile be customized with any site-specific requirements and assigned to all users where applicable. Note: It remains necessary to create a customized replacement for the password validation function, ORA12C_STRONG_VERIFY_FUNCTION, if relying on this technique to verify password complexity. The defaults for ORA_STIG_PROFILE are set as follows: Resource Name Limit --------------------------- ----------------------- COMPOSITE_LIMIT DEFAULT SESSIONS_PER_USER DEFAULT CPU_PER_SESSION DEFAULT CPU_PER_CALL DEFAULT LOGICAL_READS_PER_SESSION DEFAULT LOGICAL_READS_PER_CALL DEFAULT IDLE_TIME 15 CONNECT_TIME DEFAULT PRIVATE_SGA DEFAULT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LIFE_TIME 60 PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 10 PASSWORD_VERIFY_FUNCTION ORA12C_STRONG_VERIFY_FUNCTION PASSWORD_LOCK_TIME UNLIMITED PASSWORD_GRACE_TIME 5 The recommended value for the SESSIONS_PER_USER setting in Oracle 19c is 10 or less. Limiting the number of concurrent sessions can help prevent: Memory resource exhaustion from poorly formed requests, denial-of-service attacks, and one user from tying up all resources. Change the value of SESSIONS_PER_USER (along with the other parameters, where relevant) from UNLIMITED to DOD-compliant, site-specific requirements for the ORA_STIG_PROFILE and then assign users to the ORA_STIG_PROFILE profile. Example: ALTER PROFILE ORA_STIG_PROFILE LIMIT SESSIONS_PER_USER 10; To assign the user to the profile do the following: ALTER USER <username> PROFILE ORA_STIG_PROFILE;
Review database management system (DBMS) settings to verify the DBMS implements measures to limit the effects of the organization-defined types of DoS attacks. Check the $ORACLE_HOME/network/admin/listener.ora to verify a Rate Limit has been established. A rate limit is used to prevent DoS attacks on a database or to control a logon storm such as may be caused by an application server reboot. If a rate limit has not been set similar to the example below, this is a finding. - - - - - Example of a listener configuration with rate limiting in effect: CONNECTION_RATE_LISTENER=10 LISTENER= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)(RATE_LIMIT=yes)) (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1522)(RATE_LIMIT=yes)) (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1526)) ) LISTENER= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)(RATE_LIMIT=8)) (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1522)(RATE_LIMIT=12)) (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1526)) )
Implement measures to limit the effects of organization-defined types of DoS attacks. Modify the $ORACLE_HOME/network/admin/listener.ora to establish a Rate Limit. Restart the listener for changes to take effect. More information can be found at https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/oracle-net-listener-parameters-in-listener-ora.html#GUID-980ED9B7-2D41-4419-BF3E-A1C96FF0F880.
Review system documentation to obtain the organization's definition of circumstances requiring automatic session termination. If the documentation explicitly states that such termination is not required or is prohibited, this is not a finding. If no documentation exists or an automatic session termination time is not explicitly defined, assume a time of 15 minutes. To check the max_idle_time set, run the following query: SELECT VALUE FROM V$PARAMETER WHERE NAME = 'max_idle_time'; If the value returned does not match the documented requirement (or 15 when none is specified), this is a finding.
Configure the database management system (DBMS) to automatically terminate a user session after organization-defined conditions or trigger events requiring session termination. To terminate session after a certain amount of time independent of the consumed resources needed by other users, then set the MAX_IDLE_TIME initialization parameter. The MAX_IDLE_TIME parameter specifies the maximum number of minutes that a session can be idle. After the specified amount of time, MAX_IDLE_TIME kills sessions. ALTER SYSTEM SET max_idle_time=15;
If no data has been identified as being sensitive or classified in the system documentation, this is not a finding. If security labeling is not required, this is not a finding. If security labeling requirements have been specified, but the security labeling is not implemented or does not reliably maintain labels on information in storage, this is a finding.
Define the policy for security labels defined for the data. Document the security label requirements and configure database security labels in accordance with the policy. To provide reliable security labeling of information in storage, enable DBMS features; deploy third-party software; or add custom data structures, data elements and application code. For additional information on Oracle Label Security: https://docs.oracle.com/en/database/oracle/oracle-database/19/olsag/label-security-administrators-guide.pdf.
If all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism, and not by Oracle, this is not a finding. If an Oracle feature/product, an OS feature, a third-party product, or custom code is used to automate account management, this is not a finding. If there are any accounts managed by the Oracle Database, review the system documentation for justification and approval of these accounts. If any Oracle-managed accounts exist that are not documented and approved, this is a finding.
Integrate database management system (DBMS) security with an organization-level authentication/access mechanism providing account management for all users, groups, roles, and any other principals. For each Oracle-managed account that is not documented and approved, either transfer it to management by the external mechanism, or document the need for it and obtain approval, as appropriate. Utilize an Oracle feature/product, an OS feature, a third-party product, or custom code to automate as much account maintenance functionality as possible.
Check DBMS settings to determine whether users are restricted from accessing objects and data they are not authorized to access. If appropriate access controls are not implemented to restrict access to authorized users and to restrict the access of those users to objects and data they are authorized to verify, this is a finding. One option to isolate access is by using the Oracle Database Vault. To check to verify the Oracle Database Vault is installed, issue the following query: SQL> SELECT * FROM V$OPTION WHERE PARAMETER = 'Oracle Database Vault'; If Oracle Database Vault is installed, review its settings for appropriateness and completeness of the access it permits and denies to each type of user. If appropriate and complete, this is not a finding. If Oracle Database Vault is not installed, review the roles and profiles in the database and the assignment of users to these for appropriateness and completeness of the access permitted and denied each type of user. If appropriate and complete, this is not a finding. If the access permitted and denied each type of user is inappropriate or incomplete, this is a finding. Following are code examples for reviewing roles, profiles, etc. Find out what role the users have: select * from dba_role_privs where granted_role = '<role>' List all roles given to a user: select * from dba_role_privs where grantee = '<username>'; List all roles for all users: column grantee format a32 column granted_role format a32 break on grantee select grantee, granted_role from dba_role_privs; Use the following query to list all privileges given to a user: select lpad(' ', 2*level) || granted_role "User roles and privileges" from ( /* THE USERS */ select null grantee, username granted_role from dba_users where username like upper('<enter_username>') /* THE ROLES TO ROLES RELATIONS */ union select grantee, granted_role from dba_role_privs /* THE ROLES TO PRIVILEGE RELATIONS */ union select grantee, privilege from dba_sys_privs ) start with grantee is null connect by grantee = prior granted_role; List which tables a certain role gives SELECT access to using the query: select * from role_tab_privs where role='<role>' and privilege = 'SELECT'; List all tables a user can SELECT from using the query: select * from dba_tab_privs where GRANTEE ='<username>' and privilege = 'SELECT'; List all users who can SELECT on a particular table (either through being given a relevant role or through a direct grant - e.g., grant select on a table to Joe). The result of this query should also show through which role the user has this access or whether it was a direct grant. select Grantee,'Granted Through Role' as Grant_Type, role, table_name from role_tab_privs rtp, dba_role_privs drp where rtp.role = drp.granted_role and table_name = '<TABLENAME>' union select Grantee, 'Direct Grant' as Grant_type, null as role, table_name from dba_tab_privs where table_name = '<TABLENAME>';
If Oracle Database Vault is in use, use it to configure the correct access privileges for each type of user. If Oracle Database Vault is not in use, configure the correct access privileges for each type of user using Roles and Profiles. For more information on the configuration of Database Vault, refer to the Database Vault Administrator's Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/dvadm/database-vault-administrators-guide.pdf.
If there are no shared accounts available to more than one user, this is not a finding. Review database, application, and/or OS settings to determine whether users can be identified as individuals when using shared accounts. If the individual user who is using a shared account cannot be identified, this is a finding. If Standard Auditing is used: To ensure that user activities other than SELECT, INSERT, UPDATE, and DELETE are also monitored and attributed to individuals, verify that Oracle auditing is enabled. To verify Oracle is configured to capture audit data, enter the following SQL*Plus command: SHOW PARAMETER AUDIT_TRAIL or the following SQL query: SELECT * FROM SYS.V$PARAMETER WHERE NAME = 'audit_trail'; If the query returns the value "NONE", this is a finding. If Unified Auditing is used: To ensure that user activities other than SELECT, INSERT, UPDATE, and DELETE are also monitored and attributed to individuals, verify that Oracle auditing is enabled. To verify Oracle is configured to capture audit data, enter the following SQL*Plus command: SELECT * FROM V$OPTION WHERE PARAMETER = 'Unified Auditing'; If the query returns something other than "TRUE", this is a finding.
Use accounts assigned to individual users. Configure DBMS to provide individual accountability at the DBMS level, and in audit logs, for actions performed under a shared database account. Modify applications and data tables that are not capturing individual user identity to do so. Create and enforce the use of individual user IDs for logging on to Oracle tools and third-party products. If Oracle auditing is not already enabled, enable it. If Standard Auditing is used: If Oracle (or third-party) auditing is not already enabled, enable it. For Oracle auditing, use this query: ALTER SYSTEM SET AUDIT_TRAIL=<audit trail type> SCOPE=SPFILE; Audit trail type can be 'OS', 'DB', 'DB,EXTENDED', 'XML' or 'XML,EXTENDED'. After executing this statement, it may be necessary to shut down and restart the Oracle database. If Unified Auditing is used: Link the oracle binary with uniaud_on, and then restart the database. Oracle Database Upgrade Guide describes how to enable unified auditing. For more information on the configuration of auditing, refer to the following documents: "Auditing Database Activity" in the Oracle Database 19c Security Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html "Monitoring Database Activity with Auditing" in the Oracle Database Security Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html "DBMS_AUDIT_MGMT" in the Oracle Database PL/SQL Packages and Types Reference: https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/ Oracle Database Upgrade Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/upgrd/index.html If the site-specific audit requirements are not covered by the default audit options, deploy and configure Fine-Grained Auditing. For details, refer to Oracle documentation at the locations above. If this level of auditing does not meet site-specific requirements, consider deploying the Oracle Audit Vault. The Audit Vault is a highly configurable option from Oracle made specifically for performing the audit functions. It has reporting capabilities as well as user-defined rules that provide additional flexibility for complex auditing requirements.
Using vendor and system documentation, if necessary, verify the DBMS is configured to use Oracle's auditing features, or that a third-party product or custom code is deployed and configured to satisfy this requirement. If a third-party product or custom code is used, compare its current configuration with the audit requirements. If any of the requirements is not covered by the configuration, this is a finding. The remainder of this Check is applicable specifically where Oracle auditing is in use. If Standard Auditing is used: To verify Oracle is configured to capture audit data, enter the following SQL*Plus command: SHOW PARAMETER AUDIT_TRAIL or the following SQL query: SELECT * FROM SYS.V$PARAMETER WHERE NAME = 'audit_trail'; If Oracle returns the value "NONE", this is a finding. To confirm that Oracle audit is capturing information on the required events, review the contents of the SYS.AUD$ table or the audit file, whichever is in use. If auditable events are not listed, this is a finding. If Unified Auditing is used: To verify Oracle is configured to capture audit data, enter the following SQL*Plus command: SELECT * FROM V$OPTION WHERE PARAMETER = 'Unified Auditing'; If the query returns something other than "TRUE", this is a finding. To confirm that Oracle audit is capturing information on the required events, review the contents of the SYS.UNIFIED_AUDIT_TRAIL view. If auditable events are not listed, this is a finding.
Configure the DBMS's auditing to audit organization-defined auditable events. If preferred, use a third-party tool. The tool must provide the minimum capability to audit the required events. If using a third-party product, proceed in accordance with the product documentation. If using Oracle's capabilities, proceed as follows. If Standard Auditing is used: Use this process to ensure auditable events are captured: ALTER SYSTEM SET AUDIT_TRAIL=<audit trail type> SCOPE=SPFILE; Audit trail type can be 'OS', 'DB', 'DB,EXTENDED', 'XML' or 'XML,EXTENDED'. After executing this statement, it may be necessary to shut down and restart the Oracle database. If the site-specific audit requirements are not covered by the default audit options, deploy and configure Fine-Grained Auditing. For details, refer to Oracle documentation at the locations below. If Unified Auditing is used: Use this process to ensure auditable events are captured: Link the oracle binary with uniaud_on, and then restart the database. Oracle Database Upgrade Guide describes how to enable unified auditing. For more information on the configuration of auditing, refer to the following documents: "Auditing Database Activity" in the Oracle Database 2 Day + Security Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html "Monitoring Database Activity with Auditing" in the Oracle Database Security Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html "DBMS_AUDIT_MGMT" in the Oracle Database PL/SQL Packages and Types Reference: https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/ Oracle Database Upgrade Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/upgrd/index.html If the site-specific audit requirements are not covered by the default audit options, deploy and configure Fine-Grained Auditing. For details, refer to Oracle documentation at the locations above.
Check database management system (DBMS) settings and documentation to determine whether designated personnel are able to select which auditable events are being audited. If designated personnel are not able to configure auditable events, this is a finding.
Configure the DBMS's settings to allow designated personnel to select which auditable events are audited. Note: In Oracle, any user can configure auditing for the objects in their own schema by using the AUDIT statement. To undo the audit configuration for an object, the user can use the NOAUDIT statement. No additional privileges are needed to perform this task. To audit objects in another schema, the user must have the AUDIT ANY system privilege. To audit system privileges, the user must have the AUDIT SYSTEM privilege. For more information on the configuration of auditing, refer to the following documents: "Monitoring Database Activity with Auditing" in the Oracle Database Security Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/part_6.html
Check Oracle Database settings to determine if auditing is being performed on the DOD-required list of auditable events supplied in the discussion. If Standard Auditing is used: To verify Oracle is configured to capture audit data, enter the following SQL*Plus command: SHOW PARAMETER AUDIT_TRAIL or the following SQL query: SELECT * FROM SYS.V$PARAMETER WHERE NAME = 'audit_trail'; If Oracle returns the value "NONE", this is a finding. To confirm that Oracle audit is capturing information on the required events, review the contents of the SYS.AUD$ table or the audit file, whichever is in use. If auditable events are not listed, this is a finding. If Unified Auditing is used: To verify Oracle is configured to capture audit data, enter the following SQL*Plus command: SELECT * FROM V$OPTION WHERE PARAMETER = 'Unified Auditing'; If Oracle returns a value something other than "TRUE", this is a finding. Unified Audit supports named audit policies, which are defined using the CREATE AUDIT POLICY statement. A policy specifies the actions that should be audited and the objects to which it should apply. If no specific objects are included in the policy definition, it applies to all objects. A named policy is enabled using the AUDIT POLICY statement. It can be enabled for all users, for specific users only, or for all except a specified list of users. The policy can audit successful actions, unsuccessful actions, or both. Verifying existing audit policy: existing Unified Audit policies are listed in the view AUDIT_UNIFIED_POLICIES. The AUDIT_OPTION column contains one of the actions specified in a CREATE AUDIT POLICY statement. The AUDIT_OPTION_TYPE column contains "STANDARD ACTION" for a policy that applies to all objects or "OBJECT ACTION" for a policy that audits actions on a specific object. select POLICY_NAME from SYS.AUDIT_UNIFIED_POLICIES where AUDIT_OPTION='GRANT' and AUDIT_OPTION_TYPE='STANDARD ACTION'; To find policies that audit privilege grants on specific objects: select POLICY_NAME,OBJECT_SCHEMA,OBJECT_NAME from SYS.AUDIT_UNIFIED_POLICIES where AUDIT_OPTION='GRANT' and AUDIT_OPTION_TYPE='OBJECT ACTION'; The view AUDIT_UNIFIED_ENABLED_POLICIES shows which Unified Audit policies are enabled. The ENABLED_OPT and USER_NAME columns show the users for whom the policy is enabled or "ALL USERS". The SUCCESS and FAILURE columns indicate if the policy is enabled for successful or unsuccessful actions, respectively. select POLICY_NAME,ENABLED_OPTION,ENTITY_NAME,SUCCESS,FAILURE from SYS.AUDIT_UNIFIED_ENABLED_POLICIES; If auditing is not being performed for all the events listed above, this is a finding.
Both Standard and Unified Auditing are allowed in Oracle Database 19c. The default is mixed auditing mode. The predefined policy ORA_SECURECONFIG is enabled by default in mixed mode. Configure the DBMS's auditing settings to include auditing of events on the DOD-selected list of auditable events. 1. Successful attempts to access, modify, or delete privileges, security objects, security levels, or categories of information (e.g., classification levels). To audit granting and revocation of any privilege: create audit policy policy1 actions grant; create audit policy policy2 actions revoke; To audit grants of object privileges on a specific object: create audit policy policy3 actions grant on <schema>.<object>; If Oracle Label Security is enabled, this will audit all OLS administrative actions: create audit policy policy4 actions component = OLS all; 2. Successful and unsuccessful logon attempts, privileged activities or other system-level access. To audit all user logon attempts: create audit policy policy5 actions logon; To audit only logon attempts using administrative privileges (e.g. AS SYSDBA): audit policy policy5 by SYS, SYSOPER, SYSBACKUP, SYSDG, SYSKM; 3. Starting and ending time for user access to the system, concurrent logons from different workstations. This policy will audit all logon and logoff events. An individual session is identified in the UNIFIED_AUDIT_TRAIL by the tuple (DBID, INSTANCE_ID, SESSIONID) and the start and end time will be indicated by the EVENT_TIMESTAMP of the logon and logoff events: create audit policy policy6 actions logon, logoff; 4. Successful and unsuccessful accesses to objects. To audit all accesses to a specific table: create audit policy policy7 actions select, insert, delete, alter on <schema>.<object>; Different actions are defined for other object types. To audit all supported actions on a specific object: create audit policy policy8 actions all on <schema>.<object>; 5. All program initiations. To audit execution of any PL/SQL program unit: create audit policy policy9 actions EXECUTE; To audit execution of a specific function, procedure, or package: create audit policy policy10 actions EXECUTE on <schema>.<object>; 6. All direct access to the information system. [Not applicable to Database audit. Monitor using OS auditing.] 7. All account creations, modifications, disabling, and terminations. To audit all user administration actions: create audit policy policy11 actions create user, alter user, drop user, change password; 8. All kernel module loads, unloads, and restarts. [Not applicable to Database audit. Monitor using OS auditing.] 9. All database parameter changes. To audit any database parameter changes, dynamic or static: create audit policy policy12 actions alter database, alter system, create spfile; Applying the Policy The following command will enable the policy in all database sessions and audit both successful and unsuccessful actions: audit policy policy1; To audit only unsuccessful actions, add the WHENEVER NOT SUCCESSFUL modifier: audit policy policy1 whenever not successful; Either command above can be limited to only database sessions started by a specific user as follows: audit policy policy1 by <user>; audit policy policy1 by <user> whenever not successful;
Review the system documentation to identify what additional site-specific information not covered by the default audit options, the organization has determined to be necessary. If there are none, this is not a finding. If any additional information is defined, compare those auditable events that are not covered by unified auditing with the existing Fine-Grained Auditing (FGA) specifications returned by the following query: SELECT * FROM SYS.UNIFIED_AUDIT_TRAIL WHERE AUDIT_TYPE = 'FineGrainedAudit'; If any such auditable event is not covered by the existing FGA specifications, this is a finding.
If the site-specific audit requirements are not covered by the default audit options, deploy and configure FGA. For details, refer to Oracle documentation, at the location below. For more information on the configuration of fine-grained auditing, refer to the following documents: https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-audit-policies.html#GUID-88DA3AF8-5F6A-4C6E-80EE-F65071E5BF46.
Review the database management system (DBMS) settings to determine whether audit logging is configured to produce logs consistent with the amount of space allocated for logging. If auditing will generate excessive logs so that they may outgrow the space reserved for logging, this is a finding. If file-based auditing is in use, check that sufficient space is available to support the file(s). If not, this is a finding. If standard, table-based auditing is used, the audit logs are written to a table called AUD$; and if a Virtual Private Database is deployed, a table is created called FGA_LOG$. First, check the current location of the audit trail tables. CONN / AS SYSDBA SELECT table_name, tablespace_name FROM dba_tables WHERE table_name IN ('AUD$', 'FGA_LOG$') ORDER BY table_name; TABLE_NAME TABLESPACE_NAME ------------------------------ ------------------------------ AUD$ SYSTEM FGA_LOG$ SYSTEM If the tablespace name is SYSTEM, the table needs to be relocated to its own tablespace. Ensure that adequate space is allocated to that tablespace. If Unified Auditing is used: Audit logs are written to tables in the AUDSYS schema. The default tablespace for AUDSYS is USERS. A separate tablespace should be created to contain audit data. Ensure that adequate space is allocated to that tablespace. Investigate whether there have been any incidents where the database management system (DBMS) ran out of audit log space since the last time the space was allocated or other corrective measures were taken. If there have been, this is a finding.
Allocate sufficient audit file/table space to support peak demand. Ensure that audit tables are in their own tablespaces and that the tablespaces have enough room for the volume of log data that will be produced. Detailed procedures for how to alter the tablespace for audit logs can be found here: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ALTER-TABLESPACE.html.
Review the system documentation for a description of how audit records are off-loaded. If there is no centralized audit log management system, for the audit data to be written to, this is a finding. If the DBMS has a continuous network connection to the centralized log management system, but the DBMS audit records are not written directly to the centralized log management system or transferred in near-real-time, this is a finding. If the DBMS does not have a continuous network connection to the centralized log management system, and the DBMS audit records are not transferred to the centralized log management system weekly or more often, this is a finding.
Configure the DBMS or deploy and configure software tools to transfer audit records to a centralized log management system, continuously and in near-real-time where a continuous network connection to the log management system exists, or at least weekly in the absence of such a connection. Consider deploying the Oracle Audit Vault, which is Oracle's centralized audit log management system. Oracle Audit Vault is a powerful enterprise-wide audit solution that provides centralized location and configuration of audit information that is captured in audit records which are generated by all databases including Oracle, or other databases (SQL Server, MySQL, etc.), and various components of the DBMS, as well as, operating systems, file systems, directory services, or custom audit data in either database tables or XML files. Oracle Audit Vault consumes audit data from databases, which may be automatically purged from the target database after it has been moved to the Oracle Audit Vault Server, freeing up valuable space for business data. Oracle Audit Vault Server supports data retention policies on a per source basis, making it possible to meet internal or external compliance requirements. To prevent unauthorized access or tampering, Oracle Audit Vault encrypts audit and event data at every stage, in transmission and at rest. For Oracle Databases, Oracle Audit Vault can track changes to data, user entitlements, and stored procedures. Historical tracking of important data attributes allows users to quickly report on the lifecycle of a data attribute. User entitlements tracking enables easy reporting on which users have what privileges, along with differential reporting on what has changed since the last report. Maliciously modified stored procedures are a frequent vector for data theft-stored procedure tracking helps users quickly spot changes. With support for Oracle's unified audit, it is easy to implement best practices for auditing using preseeded audit policies.
Review OS or third-party logging application settings to determine whether a warning will be provided when 75 percent of DBMS audit log storage capacity is reached. If no warning will be provided, this is a finding.
Modify DBMS, OS, or third-party logging application settings to alert appropriate personnel when 75 percent of log storage capacity is reached. For ease of management, it is recommended that the audit tables be kept in a dedicated tablespace. If Oracle Enterprise Manager is in use, the capability to issue such an alert is built in and configurable via the console so an email can be sent to a designated administrator. If Enterprise Manager is unavailable, the following script can be used to monitor storage space; this can be combined with additional code to email the appropriate administrator so they can take action. sqlplus connect as sysdba set pagesize 300 set linesize 120 column sumb format 9,999,999,999,999 column extents format 999999 column bytes format 9,999,999,999,999 column largest format 9,999,999,999,999 column Tot_Size format 9,999,999,999,999 column Tot_Free format 9,999,999,999,999 column Pct_Free format 9,999,999,999,999 column Chunks_Free format 9,999,999,999,999 column Max_Free format 9,999,999,999,999 set echo off spool TSINFO.txt PROMPT SPACE AVAILABLE IN TABLESPACES select a.tablespace_name,sum(a.tots) Tot_Size, sum(a.sumb) Tot_Free, sum(a.sumb)*100/sum(a.tots) Pct_Free, sum(a.largest) Max_Free,sum(a.chunks) Chunks_Free from ( select tablespace_name,0 tots,sum(bytes) sumb, max(bytes) largest,count(*) chunks from dba_free_space a group by tablespace_name union select tablespace_name,sum(bytes) tots,0,0,0 from dba_data_files group by tablespace_name) a group by a.tablespace_name; Sample Output SPACE AVAILABLE IN TABLESPACES TABLESPACE_NAME TOT_SIZE TOT_FREE PCT_FREE MAX_FREE CHUNKS_FREE ----------------------------- -------------- -------------- --------------- ---------------- --------------------- DES2 41,943,040 30,935,040 74 30,935,040 1 DES2_I 31,457,280 23,396,352 74 23,396,352 1 RBS 60,817,408 57,085,952 94 52,426,752 16 SYSTEM 94,371,840 5,386,240 6 5,013,504 3 TEMP 563,200 561,152 100 133,120 5 TOOLS 120,586,240 89,407,488 74 78,190,592 12 USERS 1,048,576 26,624 3 26,624 1
Review Oracle Database, OS, or third-party logging software settings to determine whether a real-time alert will be sent to the appropriate personnel when auditing fails for any reason. If real-time alerts are not sent upon auditing failure, this is a finding.
Configure logging software to send a real-time alert to appropriate personnel when auditing fails for any reason. Oracle recommends the use of Oracle Enterprise Manager.
Review locations of audit logs, both internal to the database and database audit logs located at the operating system level. Verify there are appropriate controls and permissions to protect the audit information from unauthorized access. If appropriate controls and permissions do not exist, this is a finding. - - - - - From SQL*Plus or SQL Developer: select value from v$parameter where name = 'audit_trail'; select value from v$parameter where name = 'audit_file_dest'; If audit_trail is set to OS, XML or XML EXTENDED, this means logs are stored at the operating system level. If audit_trail is set to OS, but the audit records are routed directly to a separate log server without writing to the local file system, this is not a finding. If audit_trail is set to DB or "DB, EXTENDED" this means logs are stored in the database. If any logs are written to the database, DBA_TAB_PRIVS describes all object grants in the database. If standard auditing is in use, follow the below, check permissions on the AUD$ table. sqlplus connect as sysdba; SQL> SELECT GRANTEE, TABLE_NAME, PRIVILEGE FROM DBA_TAB_PRIVS where table_name = 'AUD$'; If Unified Auditing is used, check permissions on the AUDSYS tables. sqlplus connect as sysdba; SQL> SELECT GRANTEE, TABLE_NAME, PRIVILEGE FROM DBA_TAB_PRIVS where owner='AUDSYS'; If appropriate controls and permissions are not implemented, this is a finding. If audit logs located at the operating system level: On Unix Systems: ls -ld [pathname] Substitute [pathname] with the directory paths listed from the above SQL statements for audit_file_dest. If permissions are granted for world access, this is a finding. If any groups that include members other than software owner accounts, DBAs, auditors, oracle processes, or any account not listed as authorized, this is a finding. On Windows Systems (from Windows Explorer): Browse to the directory specified. Select and right-click on the directory >> Properties >> Security tab. On Windows hosts, records are also written to the Windows application event log. The location of the application event log is listed under Properties for the log under the Windows console. The default location is C:\WINDOWS\system32\config\EventLogs\AppEvent.Evt. Select and right-click on the directory >> Properties >> Security tab. If permissions are granted to everyone, this is a finding. If any accounts other than the administrators, software owner accounts, DBAs, auditors, Oracle processes, or any account not listed as authorized, this is a finding. Compare path to %ORACLE_HOME%. If audit_file_dest is a subdirectory of %ORACLE_HOME%, this is a finding.
Add controls and modify permissions to protect database audit log data from unauthorized modification, whether stored in the database itself or at the OS level. Logs are stored in the database: For Standard Auditing, Revoke access to the AUD$ table to anyone who should not have access to it. For Unified Auditing, Revoke access to the tables with AUDSYS as the owner. Use the REVOKE statement to remove permissions from a specific user or from all users to perform actions on database objects. REVOKE privilege-type ON [ TABLE ] { table-Name | view-Name } FROM grantees Use the ALL PRIVILEGES privilege type to revoke all of the permissions from the user for the specified table. Can also revoke one or more table privileges by specifying a privilege-list. Use the DELETE privilege type to revoke permission to delete rows from the specified table. Use the INSERT privilege type to revoke permission to insert rows into the specified table. Use the REFERENCES privilege type to revoke permission to create a foreign key reference to the specified table. If a column list is specified with the REFERENCES privilege, the permission is revoked on only the foreign key reference to the specified columns. Use the SELECT privilege type to revoke permission to perform SELECT statements on a table or view. If a column list is specified with the SELECT privilege, the permission is revoked on only those columns. If no column list is specified, then the privilege is valid on all of the columns in the table. Use the TRIGGER privilege type to revoke permission to create a trigger on the specified table. Use the UPDATE privilege type to revoke permission to use the UPDATE statement on the specified table. If a column list is specified, the permission is revoked only on the specified columns. For file-based/OS level auditing, establish an audit file directory separate from the Oracle Home. Alter host system permissions to the AUDIT_FILE_DEST directory to the Oracle process and software owner accounts, DBAs, backup accounts, SAs (if required), and auditors. Authorize and document user access requirements to the directory outside of the Oracle, DBA, and SA account list in the system documentation.
Review access permissions to tools used to view or modify audit log data. These tools may include the database management system (DBMS) itself or tools external to the database. If appropriate permissions and access controls are not applied to prevent unauthorized access, modification, or deletion of these tools, this is a finding.
Add or modify access controls and permissions to tools used to view or modify audit log data. Tools must be accessible by authorized personnel only.
Review access restrictions associated with changes to the configuration of the DBMS or database(s). On Unix Systems: ls -ld [pathname] Replace [pathname] with the directory path where the Oracle Database software is installed (e.g., /u01/app/oracle/product/19.0.0/dbhome_1). If permissions are granted for world access, this is a finding. If any groups that include members other than the software owner account, database administrators (DBAs), or any accounts not listed as authorized, this is a finding. For Windows Systems: Review the permissions that control access to the Oracle installation software directories (e.g., \Program Files\Oracle\). If access is given to members other than the software owner account, DBAs, or any accounts not listed as authorized, this is a finding. Compare the access control employed with that documented in the system documentation. If access does not match the documented requirement, this is a finding.
For Unix Systems: Set the umask of the Oracle software owner account to 022. Determine the shell being used for the Oracle software owner account: env | grep -i shell Startup files for each shell are as follows (located in users $HOME directory): C-Shell (CSH) = .cshrc Bourne Shell (SH) = .profile Korn Shell (KSH) = .kshrc TC Shell (TCS) = .tcshrc BASH Shell = .bash_profile or .bashrc Edit the shell startup file for the account and add or modify the line: umask 022 Log off and log on, then enter the umask command to confirm the setting. Note: To effect this change for all Oracle processes, a reboot of the DBMS server may be required. For Windows Systems: Restrict access to the DBMS software libraries to the fewest accounts that clearly require access based on job function. Document authorized access controls and justify any access grants that do not fall under DBA, DBMS process, ownership, or system administrator (SA) accounts.
Review the system documentation and interview the database administrator. Identify all database software components. Review the version and release information. From SQL*Plus: Select version from v$instance; Access the vendor website or use other means to verify the version is still supported. Oracle Release schedule: https://support.oracle.com/knowledge/Oracle%20Database%20Products/742060_1.html If the Oracle version or any of the software components are not supported by the vendor, this is a finding.
Remove or decommission all unsupported software products. Upgrade unsupported DBMS or unsupported components to a supported version of the product.
Review monitoring procedures and implementation evidence to verify that monitoring of changes to database software libraries, related applications, and configuration files is done. Verify that the list of files and directories being monitored is complete. If monitoring does not occur or is not complete, this is a finding.
Implement procedures to monitor for unauthorized changes to database management system (DBMS) software libraries, related software application libraries, and configuration files. If a third-party automated tool is not employed, an automated job that reports file information on the directories and files of interest and compares them to the baseline report for the same will meet the requirement. File hashes or checksums should be used for comparisons since file dates may be manipulated by malicious users.
Review permissions that control access to the DBMS software libraries. The software library location may be determined from vendor documentation or service/process executable paths. Typically, only the DBMS software installation/maintenance account or system administrator (SA) account requires access to the software library for operational support such as backups. Any other accounts should be scrutinized and the reason for access documented. Accounts should have the least amount of privilege required to accomplish the job. Below is one example for how to review accounts with access to software libraries for a Linux-based system: cat /etc/group |grep -i dba --Example output: dba:x:102: --take above number and input in below grep command cat /etc/passwd |grep 102 If any accounts are returned that are not required and authorized to have access to the software library location do have access, this is a finding.
Restrict access to the DBMS software libraries to accounts that require access based on job function.
Review procedures for controlling and granting access to use of the database management system (DBMS) software installation account. If access or use of this account is not restricted to the minimum number of personnel required, or if unauthorized access to the account has been granted, this is a finding.
Develop, document, and implement procedures to restrict use of the DBMS software installation account.
Review the DBMS software library directory and note other root directories located on the same disk directory or any subdirectories. If any non-DBMS software directories exist on the disk directory, examine or investigate their use. If any of the directories are used by other applications, including third-party applications that use the DBMS, this is a finding. Only applications that are required for the functioning and administration, not use, of the DBMS should be located on the same disk directory as the DBMS software libraries. For databases located on mainframes, confirm that the database and its configuration files are isolated in their own DASD pools. If database software and database configuration files share DASD with other applications, this is a finding.
Install all applications on directories, or pools, separate from the DBMS software library directory. Relocate any directories or reinstall other application software that currently shares the DBMS software library directory to separate directories. For mainframe-based databases, locate database software and configuration files in separate DASD pools from other mainframe applications.
Review system documentation to identify accounts authorized to own database objects. Review accounts in the database management systems (DBMSs) that own objects. If any database objects are found to be owned by users not authorized to own database objects, this is a finding. - - - - - Query the object DBA_OBJECTS to show the users who own objects in the database. The query below will return all of the users who own objects. sqlplus connect as sysdba SQL>select owner, object_type, count(*) from dba_objects group by owner, object_type order by owner, object_type; If these owners are not authorized owners, select all of the objects these owners have generated and decide who they should belong to. To make a list of all of the objects, the unauthorized owner has to perform the following query. SQL>select * from dba_objects where owner =&unauthorized_owner;
Update system documentation to include list of accounts authorized for object ownership. Reassign ownership of authorized objects to authorized object owner accounts.
Review accounts for direct assignment of administrative privileges. Connected as SYSDBA, run the query: SELECT grantee, privilege FROM dba_sys_privs WHERE grantee IN ( SELECT username FROM dba_users WHERE username NOT IN ( 'XDB', 'SYSTEM', 'SYS', 'LBACSYS', 'DVSYS', 'DVF', 'SYSMAN_RO', 'SYSMAN_BIPLATFORM', 'SYSMAN_MDS', 'SYSMAN_OPSS', 'SYSMAN_STB', 'DBSNMP', 'SYSMAN', 'APEX_040200', 'WMSYS', 'SYSDG', 'SYSBACKUP', 'SPATIAL_WFS_ADMIN_USR', 'SPATIAL_CSW_ADMIN_US', 'GSMCATUSER', 'OLAPSYS', 'SI_INFORMTN_SCHEMA', 'OUTLN', 'ORDSYS', 'ORDDATA', 'OJVMSYS', 'ORACLE_OCM', 'MDSYS', 'ORDPLUGINS', 'GSMADMIN_INTERNAL', 'MDDATA', 'FLOWS_FILES', 'DIP', 'CTXSYS', 'AUDSYS', 'APPQOSSYS', 'APEX_PUBLIC_USER', 'ANONYMOUS', 'SPATIAL_CSW_ADMIN_USR', 'SYSKM', 'SYSMAN_TYPES', 'MGMT_VIEW', 'EUS_ENGINE_USER', 'EXFSYS', 'SYSMAN_APM' ) ) AND privilege NOT IN ('UNLIMITED TABLESPACE' , 'REFERENCES', 'INDEX', 'SYSDBA', 'SYSOPER' ) ORDER BY 1, 2; If any administrative privileges have been assigned directly to a database account, this is a finding. The list of special accounts that are excluded from this requirement may not be complete. It is expected that the database administrator (DBA) will edit the list to suit local circumstances, adding other special accounts as necessary, and removing any that are not supposed to be in use in the Oracle deployment that is under review.
Create roles for administrative function assignments. Assign the necessary privileges for the administrative functions to a role. Do not assign administrative privileges directly to users, except for those that Oracle does not permit to be assigned via roles.
Download the latest version of the Oracle Database Security Assessment Tool (DBSAT). DBSAT is provided by Oracle at no additional cost: https://www.oracle.com/database/technologies/security/dbsat.html DBSAT analyzes information on the database and listener configuration to identify configuration settings that may unnecessarily introduce risk. DBSAT goes beyond simple configuration checking, examining user accounts, privilege and role grants, authorization control, separation of duties, fine-grained access control, data encryption and key management, auditing policies, and OS file permissions. DBSAT applies rules to quickly assess the current security status of a database and produce findings in all the areas above. If the DBMS is not configured in accordance with security configuration settings, this is a finding.
For each finding, DBSAT recommends remediation activities that follow best practices to reduce or mitigate risk. Review the security status, provided by the DBSAT report, check the categories (sections) and review the findings by risk level and recommendations. For each recommendation, each organization must determine which remediation activities to implement according to their security policies.
From SQL*Plus: select instance_name from v$instance; select version from v$instance; If the instance name returned references the Oracle release number, this is a finding. Numbers used that include version numbers by coincidence are not a finding. The database administrator (DBA) should be able to relate the significance of the presence of a digit in the SID.
Follow the instructions in Oracle MetaLink Note 15390.1 (and related documents) to change the SID for the database without recreating the database to a value that does not identify the Oracle version.
Use the following query to get a list of database links. From SQL*Plus: select owner||': '||db_link from dba_db_links; If no records are returned, this is not a finding. Confirm all database links listed are documented and approved. If any are not, this is a finding.
Document all authorized connections from the database to remote databases. Remove all unauthorized remote database connection definitions from the database. From SQL*Plus: drop database link [link name]; OR drop public database link [link name]; Review remote database connection definitions periodically and confirm their use is still required and authorized.
Execute the query: select grantee||': '||owner||'.'||table_name from dba_tab_privs where grantable = 'YES' and grantee not in (select distinct owner from dba_objects) and grantee not in (select grantee from dba_role_privs where granted_role = 'DBA') and table_name not like 'SYS_PLSQL_%' order by grantee; If any accounts are listed, this is a finding.
Revoke privileges granted the WITH GRANT OPTION from non-DBA and accounts that do not own application objects. Re-grant privileges without specifying WITH GRANT OPTION. Note: Do not revoke the system-generated grants such as those found on The SYS_PLSQL_% objects. They are system generated object types (aka ShadowTypes) which are created internally by Oracle when using the Pipelined Table Functions. This can result in (incorrect) compilation failures and/or invalidations when the users who are supposed to have access to the shadow types find themselves without access.
To verify the current status of the remote_os_roles parameter use the SQL statement: COLUMN name format a20 COLUMN parameter_value format a20 SELECT p.name, p.con_id, p.value AS PARAMETER_VALUE FROM sys.v_$parameter p WHERE vp.name = 'remote_os_roles' ORDER BY 1; For every standalone instance or container database, if the PARAMETER_VALUE is not FALSE, that is a finding.
Set the parameter to FALSE for all instances. If using Oracle Multitenant, set the value to FALSE for the container database and all pluggable databases will be set to FALSE as well. ALTER SYSTEM SET remote_os_roles = FALSE scope=spfile; sid='container_name' is optional Restart the database for the change to take effect.
From SQL*Plus: select value from v$parameter where name = 'sql92_security'; If the value returned is set to FALSE, this is a finding. If the parameter is set to TRUE or does not exist, this is not a finding.
Enable SQL92 security. From SQL*Plus: alter system set sql92_security = TRUE scope = spfile; The above SQL*Plus command will set the parameter to take effect at next system startup.
From SQL*Plus: select value from v$parameter where upper(name) = 'REMOTE_LOGIN_PASSWORDFILE'; If the value returned does not equal 'EXCLUSIVE' or 'NONE', this is a finding. On Unix Systems: ls -ld $ORACLE_HOME/dbs/orapw${ORACLE_SID} Substitute ${ORACLE_SID} with the name of the ORACLE_SID for the database. If permissions are granted for world access, this is a finding. On Windows Systems (From Windows Explorer): Browse to the %ORACLE_HOME%\database\directory. Select and right-click on the PWD%ORACLE_SID%.ora file, select Properties, select the Security tab. Substitute %ORACLE_SID% with the name of the ORACLE_SID for the database. If permissions are granted to everyone, this is a finding. If any account other than the database management system (DBMS) software installation account is listed, this is a finding.
Disable use of the REMOTE_LOGIN_PASSWORDFILE where remote administration is not authorized by specifying a value of NONE. If authorized, restrict use of a password file to exclusive use by each database by specifying a value of EXCLUSIVE. From SQL*Plus: alter system set REMOTE_LOGIN_PASSWORDFILE = 'EXCLUSIVE' scope = spfile; OR alter system set REMOTE_LOGIN_PASSWORDFILE = 'NONE' scope = spfile; The above SQL*Plus command will set the parameter to take effect at next system startup. Restrict ownership and permissions on the Oracle password file to exclude world (Unix) or everyone (Windows). More information regarding the ORAPWD file and the REMOTE_LOGIN_PASSWORDFILE parameter can be found here: https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/REMOTE_LOGIN_PASSWORDFILE.html
A default Oracle Database installation provides a set of predefined administrative accounts and nonadministrative accounts. These are accounts that have special privileges required to administer areas of the database, such as the CREATE ANY TABLE or ALTER SESSION privilege or EXECUTE privileges on packages owned by the SYS schema. The default tablespace for administrative accounts is either SYSTEM or SYSAUX. Nonadministrative user accounts only have the minimum privileges needed to perform their jobs. Their default tablespace is USERS. To protect these accounts from unauthorized access, the installation process expires and locks most of these accounts, except where noted below. The database administrator is responsible for unlocking and resetting these accounts, as required. Nonadministrative Accounts - Expired and locked: APEX_PUBLIC_USER, DIP, FLOWS_040100*, FLOWS_FILES, MDDATA, SPATIAL_WFS_ADMIN_USR, XS$NULL Administrative Accounts - Expired and Locked: ANONYMOUS, CTXSYS, EXFSYS, LBACSYS, MDSYS, OLAPSYS, ORACLE_OCM, ORDDATA, OWBSYS, ORDPLUGINS, ORDSYS, OUTLN, SI_INFORMTN_SCHEMA, SPATIAL_CSW_ADMIN_USR, WK_TEST, WK_SYS, WKPROXY, WMSYS, XDB Administrative Accounts - Open: DBSNMP, MGMT_VIEW, SYS, SYSMAN, SYSTEM, SYSKM *Subject to change based on version installed. Run the SQL query: From SQL*Plus: select grantee, privilege from dba_sys_privs where grantee not in (<list of nonapplicable accounts>) and admin_option = 'YES' and grantee not in (select grantee from dba_role_privs where granted_role = 'DBA'); (With respect to the list of special accounts that are excluded from this requirement, it is expected that the DBA will maintain the list to suit local circumstances, adding special accounts as necessary and removing any that are not supposed to be in use in the Oracle deployment that is under review.) If any accounts that are not authorized to have the ADMIN OPTION are listed, this is a finding.
Revoke assignment of privileges with the WITH ADMIN OPTION from unauthorized users and regrant them without the option. From SQL*Plus: revoke [privilege name] from user [username]; Replace [privilege name] with the named privilege and [username] with the named user. Restrict use of the WITH ADMIN OPTION to authorized administrators. Document authorized privilege assignments with the WITH ADMIN OPTION in the system documentation.
From SQL*Plus: Select privilege from dba_sys_privs where grantee = 'PUBLIC'; If any records are returned, this is a finding.
Revoke any system privileges assigned to PUBLIC: From SQL*Plus: revoke [system privilege] from PUBLIC; Replace [system privilege] with the named system privilege. Note: System privileges are not granted to PUBLIC by default and would indicate a custom action.
A default Oracle Database installation provides a set of predefined administrative accounts and nonadministrative accounts. These are accounts that have special privileges required to administer areas of the database, such as the CREATE ANY TABLE or ALTER SESSION privilege or EXECUTE privileges on packages owned by the SYS schema. The default tablespace for administrative accounts is either SYSTEM or SYSAUX. Nonadministrative user accounts only have the minimum privileges needed to perform their jobs. Their default tablespace is USERS. To protect these accounts from unauthorized access, the installation process expires and locks most of these accounts, except where noted below. The database administrator is responsible for unlocking and resetting these accounts, as required. Non-Administrative Accounts - Expired and locked: APEX_PUBLIC_USER, DIP, FLOWS_040100*, FLOWS_FILES, MDDATA, SPATIAL_WFS_ADMIN_USR, XS$NULL Administrative Accounts - Expired and Locked: ANONYMOUS, CTXSYS, EXFSYS, LBACSYS, MDSYS, OLAPSYS, ORACLE_OCM, ORDDATA, OWBSYS, ORDPLUGINS, ORDSYS, OUTLN, SI_INFORMTN_SCHEMA, SPATIAL_CSW_ADMIN_USR, WK_TEST, WK_SYS, WKPROXY, WMSYS, XDB Administrative Accounts - Open: DBSNMP, MGMT_VIEW, SYS, SYSMAN, SYSTEM *Subject to change based on version installed. Run the SQL statement: select grantee||': '||granted_role from dba_role_privs where grantee not in (<list of nonapplicable accounts>) and admin_option = 'YES' and grantee not in (select distinct owner from dba_objects) and grantee not in (select grantee from dba_role_privs where granted_role = 'DBA') order by grantee; (With respect to the list of special accounts that are excluded from this requirement, it is expected that the DBA will maintain the list to suit local circumstances, adding special accounts as necessary and removing any that are not supposed to be in use in the Oracle deployment that is under review.) Review the system documentation to confirm any grantees listed are information system security officer (ISSO)-authorized DBA accounts or application administration roles. If any grantees listed are not authorized and documented, this is a finding.
Revoke assignment of roles with the WITH ADMIN OPTION from unauthorized grantees and regrant them without the option if required. SQL statements to remove the admin option from an unauthorized grantee: revoke <role name> from <grantee>; grant <role name> to <grantee>; Restrict use of the WITH ADMIN OPTION to authorized administrators. Document authorized role assignments with the WITH ADMIN OPTION in the system documentation.
A default Oracle Database installation provides a set of predefined administrative accounts and nonadministrative accounts. These are accounts that have special privileges required to administer areas of the database, such as the "CREATE ANY TABLE" or "ALTER SESSION" privilege, or "EXECUTE" privileges on packages owned by the SYS schema. The default tablespace for administrative accounts is either "SYSTEM" or "SYSAUX". Nonadministrative user accounts only have the minimum privileges needed to perform their jobs. Their default tablespace is "USERS". To protect these accounts from unauthorized access, the installation process expires and locks most of these accounts, except where noted below. The database administrator is responsible for unlocking and resetting these accounts, as required. Non-Administrative Accounts - Expired and locked: APEX_PUBLIC_USER, DIP, FLOWS_040100*, FLOWS_FILES, MDDATA, SPATIAL_WFS_ADMIN_USR, XS$NULL Administrative Accounts - Expired and Locked: ANONYMOUS, CTXSYS, EXFSYS, LBACSYS, , GSMADMIN_INTERNAL, MDSYS, OLAPSYS, ORACLE_OCM, ORDDATA, OWBSYS, ORDPLUGINS, ORDSYS, OUTLN, SI_INFORMTN_SCHEMA, SPATIAL_CSW_ADMIN_USR, WK_TEST, WK_SYS, WKPROXY, WMSYS, XDB Administrative Accounts - Open: DBSNMP, MGMT_VIEW, SYS, SYSMAN, SYSTEM * Subject to change based on version installed. Run the SQL query: select owner ||'.'|| table_name ||':'|| privilege from dba_tab_privs where grantee = 'PUBLIC' and owner not in (<list of nonapplicable accounts>); With respect to the list of special accounts that are excluded from this requirement, it is expected that the database administrator (DBA) will maintain the list to suit local circumstances, adding special accounts as necessary and removing any that are not supposed to be in use in the Oracle deployment that is under review. If there are any records returned that are not Oracle product accounts, and are not documented and authorized, this is a finding. Note: This check may return false positives where other Oracle product accounts are not included in the exclusion list.
Revoke any privileges granted to PUBLIC for objects that are not owned by Oracle product accounts. From SQL*Plus: revoke [privilege name] from [username] on [object name]; Assign permissions to custom application user roles based on job functions: From SQL*Plus: grant [privilege name] to [user role] on [object name];
If a listener is not running on the local database host server, this check is not a finding. Note: Complete this check only once per host system and once per listener. Multiple listeners may be defined on a single host system. They must all be reviewed, but only once per database home review. For subsequent database home reviews on the same host system, this check is not a finding. Determine all listeners running on the host. For Windows hosts, view all Windows services with TNSListener embedded in the service name: - The service name format is: Oracle[ORACLE_HOME_NAME]TNSListener For Unix hosts, the Oracle Listener process will indicate the TNSLSNR executable. At a command prompt, issue the command: ps -ef | grep tnslsnr | grep -v grep The alias for the listener follows tnslsnr in the command output. Must be logged on the host system using the account that owns the tnslsnr executable (Unix). If the account is denied local logon, have the system administrator (SA) assist in this task by adding "su" to the listener account from the root account. On Windows platforms, log on using an account with administrator privileges to complete the check. From a system command prompt, execute the listener control utility: lsnrctl status [LISTENER NAME] Review the results for the value of Security. If "Security = OFF" is displayed, this is a finding. If "Security = ON: Password or Local OS Authentication", this is a finding (Instead, use Local OS Authentication). If "Security = ON: Local OS Authentication" is displayed, this is not a finding. Repeat the execution of the lsnrctl utility for all active listeners.
By default, Oracle Net Listener permits only local administration for security reasons. As a policy, the listener can be administered only by the user who started it. Oracle Listener authentication is enforced through local operating system authentication. For example, if user1 starts the listener, then only user1 can administer it. Any other user trying to administer the listener receives an error. The super user is the only exception. Remote administration of the listener must not be permitted. If listener administration from a remote system is required, granting secure remote access to the Oracle database management system (DBMS) server and performing local administration is preferred. Authorize and document this requirement in the system documentation. Refer to Oracle Database Net Services Reference for additional information.
From SQL*Plus: select granted_role from dba_role_privs where grantee = 'PUBLIC'; If any roles are listed, this is a finding.
Revoke role grants from PUBLIC. Do not assign role privileges to PUBLIC. From SQL*Plus: revoke [role name] from PUBLIC;
Run the SQL query: select grantee, granted_role from dba_role_privs where default_role='YES' and granted_role in (select grantee from dba_sys_privs where upper(privilege) like '%USER%') and grantee not in (<list of nonapplicable accounts>) and grantee not in (select distinct owner from dba_tables) and grantee not in (select distinct username from dba_users where upper(account_status) like '%LOCKED%'); With respect to the list of special accounts that are excluded from this requirement, it is expected that the database administrator (DBA) will maintain the list to suit local circumstances, adding special accounts as necessary and removing any that are not supposed to be in use in the Oracle deployment that is under review. Review the list of accounts reported for this check and ensures that they are authorized application administration roles. If any are not authorized application administration roles, this is a finding.
For each role assignment returned, issue: From SQL*Plus: alter user [username] default role all except [role]; If the user has more than one application administration role assigned, then remove assigned roles from default assignment and assign individually the appropriate default roles.
From SQL*Plus: select log_mode from v$database; select value from v$parameter where name = 'log_archive_dest'; select value from v$parameter where name = 'log_archive_duplex_dest'; select name, value from v$parameter where name LIKE 'log_archive_dest_%'; select value from v$parameter where name = 'db_recovery_file_dest'; If the value returned for LOG_MODE is NOARCHIVELOG, this check is not a finding. If a value is not returned for LOG_ARCHIVE_DEST and no values are returned for any of the LOG_ARCHIVE_DEST_[1-10] parameters, and no value is returned for DB_RECOVERY_FILE_DEST, this is a finding. Note: LOG_ARCHIVE_DEST and LOG_ARCHIVE_DUPLEX_DEST are incompatible with the LOG_ARCHIVE_DEST_n parameters, and must be defined as the null string (' ') when any LOG_ARCHIVE_DEST_n parameter has a value other than a null string. On Unix Systems: ls -ld [pathname] Substitute [pathname] with the directory paths listed from the above SQL statements for log_archive_dest and log_archive_duplex_dest. If permissions are granted for world access, this is a finding. On Windows systems (from Windows Explorer): Browse to the directory specified. Select and right-click on the directory >> Properties >> Security tab. If permissions are granted to everyone, this is a finding. If any account other than the Oracle process and software owner accounts, administrators, database administrators (DBAs), system group, or developers authorized to write and debug applications on this database are listed, this is a finding.
Specify a valid and protected directory for archive log files. Restrict access to the Oracle process and software owner accounts, DBAs, and backup operator accounts.
From SQL*Plus: select value from v$parameter where name = '_trace_files_public'; If the value returned is TRUE, this is a finding. If the parameter does not exist or is set to FALSE, this is not a finding.
From SQL*Plus (shutdown database instance): shutdown immediate From SQL*Plus (create a pfile from spfile): create pfile='[PATH]init[SID].ora' from spfile; Edit the init[SID].ora file and remove the following line: *._trace_files_public=TRUE From SQL*Plus (update the spfile using the pfile): create spfile from pfile='[PATH]init[SID].ora'; From SQL*Plus (start the database instance): startup Note: [PATH] depends on the platform (Windows or Unix). Ensure the file is directed to a writable location. [SID] is equal to the oracle SID or database instance ID.
If the DBMS or DBMS host is not shared by production and development activities, this check is not a finding. Review OS DBA group membership. If any developer accounts, as identified in the system documentation, have been assigned DBA privileges, this is a finding. Note: Though shared production/nonproduction DBMS installations was allowed under previous database STIG guidance, doing so may place it in violation of OS, Application, Network, or Enclave STIG guidance. Ensure that any shared production/nonproduction DBMS installation meets STIG guidance requirements at all levels or mitigates any conflicts in STIG guidance with the authorizing official (AO).
Create separate DBMS host OS groups for developer and production DBAs. Do not assign production DBA OS group membership to accounts used for development. Remove development accounts from production DBA OS group membership. Recommend establishing a dedicated DBMS host for production DBMS installations. A dedicated host system in this case refers to an instance of the operating system at a minimum. The operating system may reside on a virtual host machine where supported by the DBMS vendor.
Review documented and implemented procedures for monitoring the use of the DBMS software installation account in the system documentation. If use of this account is not monitored or procedures for monitoring its use do not exist or are incomplete, this is a finding. Note: On Windows systems, the Oracle DBMS software is installed using an account with administrator privileges. Ownership should be reassigned to a dedicated OS account used to operate the DBMS software. If monitoring does not include all accounts with administrator privileges on the DBMS host, this is a finding.
Develop, document, and implement a logging procedure for use of the DBMS software installation account that provides accountability to individuals for any actions taken by the account. Host system audit logs should be included in the DBMS account usage log along with an indication of the person who accessed the account and an explanation for the access. Ensure all accounts with administrator privileges are monitored for DBMS host on Windows OS platforms.
Review the disk/directory specification where database data, transaction log and audit files are stored. If DBMS data, transaction log or audit data files are stored in the same directory, this is a finding. If multiple applications are accessing the database and the database data files are stored in the same directory, this is a finding. If multiple applications are accessing the database and database data is separated into separate physical directories according to application, this check is not a finding.
Specify dedicated host system disk directories to store database data, transaction and audit files. Example directory structure: /*/app/oracle/oradata/db_name /*/app/oracle/admin/db_name/arch/* /*/app/oracle/oradata/db_name/audit /*/app/oracle/fast_recovery_area/db_name/ When multiple applications are accessing a single database, configure DBMS default file storage according to application to use dedicated disk directories. /*/app/oracle/oradata/db_name/app_name Refer to Oracle Optimal Flexible Architecture: https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/optimal-flexible-architecture.html
IP address restriction may be defined for the database listener, by use of the Oracle Connection Manager or by an external network device. Identify the method used to enforce address restriction (interview database administrator [DBA]) or review system documentation). If enforced by the database listener, then review the SQLNET.ORA file located in the ORACLE_HOME/network/admin directory (this assumes that a single sqlnet.ora file, in the default location, is in use; SQLNET.ORA could also be the directory indicated by the TNS_ADMIN environment variable or registry setting). If the following entries do not exist, then restriction by IP address is not configured and is a finding. tcp.validnode_checking=YES tcp.invited_nodes=(IP1, IP2, IP3) If enforced by an Oracle Connection Manager, then review the CMAN.ORA file for the Connection Manager (located in the TNS_ADMIN or ORACLE_HOME/network/admin directory for the connection manager). If a RULE entry allows all addresses ("/32") or does not match the address range specified in the system documentation, this is a finding. (rule=(src=[IP]/27)(dst=[IP])(srv=*)(act=accept)) Note: An IP address with a "/" indicates acceptance by subnet mask where the number after the "/" is the left most number of bits in the address that must match for the rule to apply.
Configure the database listener to restrict access by IP address or set up an external device to restrict network access to the DBMS. More information can be found at https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html#GUID-5C3AB641-7541-4CE9-BC9E-BA5DD30616A8.
For Unified or mixed auditing, from SQL*Plus: select count(*) from audit_unified_enabled_policies where entity_name = 'SYS'; If the count is less than one row, this is a finding. For Standard auditing, from SQL*Plus: select value from v$parameter where name = 'audit_sys_operations'; If the value returned is FALSE, this is a finding.
For Standard auditing, from SQL*Plus: alter system set audit_sys_operations = TRUE scope = spfile; The above SQL*Plus command will set the parameter to take effect at next system startup. If Unified Auditing is used, to ensure auditable events are captured: Link the oracle binary with uniaud_on, and then restart the database. Oracle Database Upgrade Guide describes how to enable unified auditing. For additional information on creating audit policies, refer to the Oracle Database Security Guide: https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-audit-policies.html
From SQL*Plus: select value from v$parameter where name='diagnostic_dest'; On Unix Systems: ls -ld [pathname]/diag Substitute [pathname] with the directory path listed from the above SQL command, and append "/diag" to it, as shown. If permissions are granted for world access, this is a finding. If any groups that include members other than the Oracle process and software owner accounts, DBAs, auditors, or backup accounts are listed, this is a finding. On Windows Systems (from Windows Explorer): Browse to the \diag directory under the directory specified. Select and right-click on the directory >> Properties >> Security tab. If permissions are granted to everyone, this is a finding. If any account other than the Oracle process and software owner accounts, administrators, database administrators (DBAs), system group or developers authorized to write and debug applications on this database are listed, this is a finding.
Alter host system permissions to the <DIAGNOSTIC_DEST>/diag directory to the Oracle process and software owner accounts, DBAs, system administrators (SAs) (if required), and developers or other users that may specifically require access for debugging or other purposes. Authorize and document user access requirements to the directory outside of the Oracle, DBA, and SA account list.
View the cman.ora file in the ORACLE_HOME/network/admin directory. If the file does not exist, the database is not accessed via Oracle Connection Manager and this check is not a finding. If the entry and value for REMOTE_ADMIN is not listed or is not set to a value of NO (REMOTE_ADMIN = NO), this is a finding.
View the cman.ora file in the ORACLE_HOME/network/admin directory of the Connection Manager. Include the following line in the file: REMOTE_ADMIN = NO
Note: The SQLNET.ALLOWED_LOGON_VERSION parameter is deprecated in earlier Oracle Database versions. This parameter has been replaced with two new Oracle Net Services parameters: SQLNET.ALLOWED_LOGON_VERSION_SERVER SQLNET.ALLOWED_LOGON_VERSION_CLIENT View the SQLNET.ORA file in the ORACLE_HOME/network/admin directory or the directory specified in the TNS_ADMIN environment variable. Locate the following entries: SQLNET.ALLOWED_LOGON_VERSION_SERVER = 12 SQLNET.ALLOWED_LOGON_VERSION_CLIENT = 12 If the parameters do not exist, this is a finding. If the parameters are not set to a value of 12 or 12a, this is a finding. Note: Attempting to connect with a client version lower than specified in these parameters may result in a misleading error: ORA-01017: invalid username/password: logon denied
Edit the SQLNET.ORA file to add or edit the entries: SQLNET.ALLOWED_LOGON_VERSION_SERVER = 12 SQLNET.ALLOWED_LOGON_VERSION_CLIENT = 12 Set the value to 12 or higher. Valid values for SQLNET.ALLOWED_LOGON_VERSION_SERVER are: 12 and 12a Valid values for SQLNET.ALLOWED_LOGON_VERSION_CLIENT are: 12 and 12a For more information on sqlnet.ora parameters refer to the following document: https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html
Review host system privileges assigned to the Oracle DBA group and all individual Oracle DBA accounts. Note: Do not include the Oracle software installation account in any results for this check. For Unix systems (as root): cat /etc/group | grep -i dba groups root If "root" is returned in the first list, this is a finding. If any accounts listed in the first list are also listed in the second list, this is a finding. Investigate any user account group memberships other than DBA or root groups that are returned by the following command (also as root): groups [dba user account] Replace [dba user account] with the user account name of each DBA account. If individual DBA accounts are assigned to groups that grant access or privileges for purposes other than DBA responsibilities, this is a finding. For Windows systems, click Start >> Settings >> Control Panel >> Administrative Tools >> Computer Management >> Local Users and Groups >> Groups >> ORA_DBA. Start >> Settings >> Control Panel >> Administrative Tools >> Computer Management >> Local Users and Groups >> Groups >> ORA_[SID]_DBA (if present). Note: Users assigned DBA privileges on a Windows host are granted membership in the ORA_DBA and/or ORA_[SID]_DBA groups. The ORA_DBA group grants DBA privileges to any database on the system. The ORA_[SID]_DBA groups grant DBA privileges to specific Oracle instances only. Make a note of each user listed. For each user, click Start >> Settings >> Control Panel >> Administrative Tools >> Computer Management >> Local Users and Groups >> Users >> [DBA username] >> Member of. If DBA users belong to any groups other than DBA groups and the Windows Users group, this is a finding. Examine User Rights assigned to DBA groups or group members by clicking Start >> Settings >> Control Panel >> Administrative Tools >> Local Security Policy >> Security Settings >> Local Policies >> User Rights Assignments. If any User Rights are assigned directly to the DBA group(s) or DBA user accounts, this is a finding.
Revoke all host system privileges from the DBA group accounts and DBA user accounts not required for database management system (DBMS) administration. Revoke all OS group memberships that assign excessive privileges to the DBA group accounts and DBA user accounts. Remove any directly applied permissions or user rights from the DBA group accounts and DBA user accounts. Document all DBA group accounts and individual DBA account-assigned privileges in the system documentation.
Use this query to identify the Oracle-supplied accounts that still have their default passwords: SELECT * FROM SYS.DBA_USERS_WITH_DEFPWD; If any accounts other than XS$NULL are listed, this is a finding. XS$NULL is an internal account that represents the absence of a user in a session. Because XS$NULL is not a user, this account can only be accessed by the Oracle Database instance. XS$NULL has no privileges and no one can authenticate as XS$NULL, nor can authentication credentials ever be assigned to XS$NULL.
Change passwords for database management system (DBMS) accounts to nondefault values. Where necessary, unlock or enable accounts to change the password, and then return the account to disabled or locked status.
If the organization has a policy, consistently enforced, forbidding the creation of emergency or temporary accounts, this is not a finding. If all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism and not by Oracle, this is not a finding. If using the database to identify temporary accounts, and temporary accounts exist, there should be a temporary profile. If a profile for temporary accounts cannot be identified, this is a finding. To check for a temporary profile, run the scripts below: To obtain a list of profiles: SELECT PROFILE#, NAME FROM SYS.PROFNAME$; To obtain a list of users assigned a given profile (TEMPORARY_USERS, in this example): SELECT USERNAME, PROFILE FROM SYS.DBA_USERS WHERE PROFILE = 'TEMPORARY_USERS' ORDER BY USERNAME;
Use a profile with a distinctive name (for example, TEMPORARY_USERS), so that temporary users can be easily identified. Whenever a temporary user account is created, assign it to this profile. To enable resource limiting via profiles, use the SQL statement: ALTER SYSTEM SET RESOURCE_LIMIT = TRUE; Set values in the profile as needed for temporary users; refer to below for further information. The values here are examples; set them to values appropriate to the situation: CREATE PROFILE TEMPORARY_USERS LIMIT SESSIONS_PER_USER <limit> CPU_PER_SESSION <limit> CPU_PER_CALL <limit> CONNECT_TIME <limit> LOGICAL_READS_PER_SESSION DEFAULT LOGICAL_READS_PER_CALL <limit> PRIVATE_SGA <limit> COMPOSITE_LIMIT <limit> FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LIFE_TIME 7 PASSWORD_REUSE_TIME 60 PASSWORD_REUSE_MAX 5 PASSWORD_VERIFY_FUNCTION ORA12c_STRONG_VERIFY_FUNCTION PASSWORD_LOCK_TIME UNLIMITED PASSWORD_GRACE_TIME 3; CREATE USER <username> IDENTIFIED BY <password> PROFILE TEMPORARY_USERS; Resource Parameters: COMPOSITE_LIMIT - Specify the total resource cost for a session, expressed in service units. Oracle Database calculates the total service units as a weighted sum of CPU_PER_SESSION, CONNECT_TIME, LOGICAL_READS_PER_SESSION, and PRIVATE_SGA. SESSIONS_PER_USER - Specify the number of concurrent sessions to limit the user to. CPU_PER_SESSION - Specify the CPU time limit for a session, expressed in hundredths of seconds. CPU_PER_CALL - Specify the CPU time limit for a call (a parse, execute, or fetch), expressed in hundredths of seconds. LOGICAL_READS_PER_SESSION - Specify the permitted number of data blocks read in a session, including blocks read from memory and disk. LOGICAL_READS_PER_CALL - Specify the permitted number of data blocks read for a call to process a SQL statement (a parse, execute, or fetch). PRIVATE_SGA - Specify the amount of private space a session can allocate in the shared pool of the system global area (SGA). Refer to size_clause for information on that clause. CONNECT_TIME - Specify the total elapsed time limit for a session, expressed in minutes. IDLE_TIME - Specify the permitted periods of continuous inactive time during a session, expressed in minutes. Long-running queries and other operations are not subject to this limit. COMPOSITE_LIMIT - Refer to Oracle documentation for more details. Password Parameters: Use the following clauses to set password parameters. Parameters that set lengths of time are interpreted in number of days. For testing purposes, specify minutes (n/1440) or even seconds (n/86400). FAILED_LOGIN_ATTEMPTS - Specify the number of failed attempts to log on to the user account before the account is locked. If omitting this clause, then the default is 10. PASSWORD_LIFE_TIME - Specify the number of days the same password can be used for authentication. If setting a value for PASSWORD_GRACE_TIME, then the password expires if it is not changed within the grace period, and further connections are rejected. If omitting this clause, then the default is 180 days. PASSWORD_REUSE_TIME and PASSWORD_REUSE_MAX - These two parameters must be set in conjunction with each other. PASSWORD_REUSE_TIME specifies the number of days before which a password cannot be reused. PASSWORD_REUSE_MAX specifies the number of password changes required before the current password can be reused. For these parameters to have any effect, specify an integer for both of them. If specifying a value for both of these parameters, then the user cannot reuse a password until the password has been changed the number of times specified for PASSWORD_REUSE_MAX during the number of days specified for PASSWORD_REUSE_TIME. For example, if specifying PASSWORD_REUSE_TIME to 30 and PASSWORD_REUSE_MAX to 10, then the user can reuse the password after 30 days if the password has already been changed 10 times. If specifying a value for either of these parameters and specify UNLIMITED for the other, then the user can never reuse a password. If specifying DEFAULT for either parameter, then Oracle Database uses the value defined in the DEFAULT profile. By default, all parameters are set to UNLIMITED in the DEFAULT profile. If the default setting of UNLIMITED in the DEFAULT profile has not changed, then the database treats the value for that parameter as UNLIMITED. If setting both of these parameters to UNLIMITED, then the database ignores both of them. This is the default if omitting both parameters. PASSWORD_LOCK_TIME - Specify the number of days an account will be locked after the specified number of consecutive failed logon attempts. If omitting this clause, then the default is one day. PASSWORD_GRACE_TIME - Specify the number of days after the grace period begins during which a warning is issued and logon is allowed. If omitting this clause, then the default is seven days. PASSWORD_VERIFY_FUNCTION – This clause allows a PL/SQL password complexity verification script to be passed as an argument to the CREATE PROFILE statement. Oracle Database provides a default script, but users can create their own routine or use third-party software instead.
If the organization has a policy, consistently enforced, forbidding the creation of emergency or temporary accounts, this is not a finding. If all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism, and not by Oracle, this is not a finding. Check database management system (DBMS) settings, OS settings, and/or enterprise-level authentication/access mechanisms settings to determine if the site uses a mechanism whereby temporary are terminated after a 72-hour time period. If not, this is a finding.
If using database mechanisms to satisfy this requirement, use a profile with a distinctive name (for example, TEMPORARY_USERS), so that temporary users can be easily identified. Whenever a temporary user account is created, assign it to this profile. Create a job to lock accounts under this profile that are more than 72 hours old.
Identify whether any hosts contain both development and production databases. If no hosts contain both production and development databases, this is Not Applicable. For any host containing both a development and a production database, determine if developers have been granted elevated privileges on the production database or on the OS. If they have, ask for documentation that shows these accounts have formal approval and risk acceptance. If this documentation does not exist, this is a finding. If developer accounts exist with the right to create and maintain tables (or other database objects) in production tablespaces, this is a finding. To check the number of instances on the host machine where applicable, check the /etc/oratab. The /etc/oratab file is updated by the Oracle Installer when the database is installed when the root.sh file is executed. Each line in the represents an ORACLE_SID:ORACLE_HOME:Y or N. The ORACLE_SID and ORACLE_HOME are self-explanatory. The Y or N signals the DBSTART program to automatically start or not start that specific instance when the machine is restarted. Check with the system owner and application development team to find what each entry represents. If a system is deemed to be a production system, review the system for development users.
Restrict developer privileges to production objects to only objects and data where those privileges are required and authorized. Document the approval and risk acceptance. Consider using separate accounts for a person's developer duties and production duties. At a minimum, use separate roles for developer privileges and production privileges. If developers need the ability to create and maintain tables (or other database objects) as part of their development activities, provide dedicated tablespaces, and revoke any rights that allowed them to use production tablespaces for this purpose.
The account lockout duration is defined in the profile assigned to a user. To verify what profile is assigned to a user, enter the query: SQL>SELECT profile FROM dba_users WHERE username = '<username>' This will return the profile name assigned to that user. The user profile, ORA_STIG_PROFILE, has been provided to satisfy the STIG requirements pertaining to the profile parameters. Oracle recommends that this profile be customized with any site-specific requirements and assigned to all users where applicable. Note: It remains necessary to create a customized replacement for the password validation function, ORA12C_STRONG_VERIFY_FUNCTION, if relying on this technique to verify password complexity. Now check the values assigned to the profile returned from the query above: column profile format a20 column limit format a20 SQL>SELECT PROFILE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES WHERE PROFILE = 'ORA_STIG_PROFILE'; Check the settings for password_lock_time - this specifies how long to lock the account after the number of consecutive failed logon attempts reaches the limit. If the value is not UNLIMITED, this is a finding.
Configure the database management system (DBMS) settings to specify indefinite lockout duration: ALTER PROFILE ORA_STIG_PROFILE LIMIT PASSWORD_LOCK_TIME UNLIMITED;
The limit on the number of consecutive failed logon attempts is defined in the profile assigned to a user. Check the FAILED_LOGIN_ATTEMPTS value assigned to the profiles returned from this query: SQL>SELECT PROFILE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES; Check the setting for FAILED_LOGIN_ATTEMPTS. This is the number of consecutive failed logon attempts before locking the Oracle user account. If the value is greater than three on any of the profiles, this is a finding.
Configure the database management system (DBMS) setting to specify the maximum number of consecutive failed logon attempts to three (or less): ALTER PROFILE {PROFILE_NAME} LIMIT FAILED_LOGIN_ATTEMPTS 3; ORA_STIG_PROFILE is available in DBA_PROFILES. Note: It is necessary to create a customized replacement for the password validation function, ORA12C_STRONG_VERIFY_FUNCTION, if relying on this technique to verify password complexity.
If all user accounts are managed and authenticated by the OS or an enterprise-level authentication/access mechanism, and not by Oracle, this is not a finding. For accounts managed by Oracle, check DBMS settings to determine if accounts are automatically disabled by the system after 35 days of inactivity. In Oracle 12c, Oracle introduced a new security parameter in the profile called INACTIVE_ACCOUNT_TIME. This parameter specifies the number of days permitted the account will be in OPEN state since the last login, after that will be LOCKED if no successful logins happens after the specified duration. Check to verify what profile each user is associated with, if any, with this query: select username, profile from dba_users order by 1,2; Then, check the profile to verify what the inactive_account_time is set to in the table dba_profiles; the inactive_account_time is a value stored in the LIMIT column, and identified by the value inactive_account_time in the RESOURCE_NAME column. SQL>select profile, resource_name, resource_type, limit from dba_profiles where upper(resource_name) = 'INACTIVE_ACCOUNT_TIME'; If the INACTIVE_ACCOUNT_TIME parameter is set to UNLIMITED (default) or it is set to more than 35 days, this is a finding. If INACTIVE_ACCOUNT_TIME is not a parameter associated with the profile, then check for a script or an automated job that is run daily that checks the audit trail or to ensure every user account has logged in within the last 35 days. If one is not present, this is a finding.
For accounts managed by Oracle, issue the statement: ALTER PROFILE profile_name LIMIT inactive_account_time 35; Or Change the profile for the DBMS account to ORA_STIG_PROFILE (which has the inactive_account_time parameter set to 35): ALTER USER user_name PROFILE ora_stig_profile; An alternate method is to create a script or store procedure that runs once a day. Write a SQL statement to determine accounts that have not logged in within 35 days: Example: select username from dba_audit_trail where action_name = 'LOGON' group by username having max(timestamp) < sysdate - 36 Then, disable all accounts that have not logged in within 35 days.
If Oracle is hosted on a server that does not support production systems, and is designated for the deployment of samples and demonstrations, this is Not Applicable. Review documentation and websites from Oracle and any other relevant vendors for vendor-provided demonstration or sample databases, database applications, schemas, objects, and files. Review the Oracle DBMS to determine if any of the demonstration and sample databases, schemas, database applications, or files are installed in the database or are included with the DBMS application. If any are present in the database or are included with the DBMS application, this is a finding. The Oracle Default Sample Schema User Accounts are: BI: Owns the Business Intelligence schema included in the Oracle Sample Schemas. HR: Manages the Human Resources schema. Schema stores information about the employees and the facilities of the company. OE: Manages the Order Entry schema. Schema stores product inventories and sales of the company's products through various channels. PM: Manages the Product Media schema. Schema contains descriptions and detailed information about each product sold by the company. IX: Manages the Information Exchange schema. Schema manages shipping through business-to-business (B2B) applications database. SH: Manages the Sales schema. Schema stores statistics to facilitate business decisions. SCOTT: A demonstration account with a simple schema. Connect to Oracle as SYSDBA and run the following SQL to check for presence of Oracle Default Sample Schema User Accounts: select distinct(username) from dba_users where username in ('BI','HR','OE','PM','IX','SH','SCOTT'); If any of the users listed above is returned, it means that there are demo programs installed, and this is a finding.
Remove any demonstration and sample databases, database applications, objects, and files from the DBMS. To remove an account and all objects owned by that account (using BI as an example): DROP USER BI CASCADE; To remove objects without removing their owner, use the appropriate DROP statement (DROP TABLE, DROP VIEW, etc.).
Run this query to produce a list of components and features installed with the database: SELECT comp_id, comp_name, version, status from dba_registry WHERE comp_id not in ('CATJAVA','CATALOG','CATPROC','SDO','DV','XDB') AND status <> 'OPTION OFF'; Review the list. If unused components are installed and are not documented and authorized, this is a finding.
If any components are required for operation of applications that will be accessing the DBMS, include them in the system documentation. Components cannot be removed via Database Configuration Assistant (DBCA) or manually once the database has been created, either from a container or a noncontainer database. However DBCA can be used to create a noncontainer database and remove components during the creation process before the database is created. When using DBCA to create a custom noncontainer database, select: creation mode = advanced Database Template = Custom Database Options..Database Component Components that can be selected or deselected are Oracle JVM, Oracle Text, Oracle Multimedia, Oracle OLAP, Oracle Spatial, Oracle Label Security, Oracle Application Express, and Oracle Database Vault. For a container database (CDB), the CDB$ROOT must have all possible database components available. When a pluggable database (PDB) is plugged into the CDB, the CDB must have the same components installed as the PDB. Since it is unknown what components the PDBS may have, the CDB must be able to support all possible PDB configurations. Components installed in the CDB$ROOT do not need to be licensed. Components are only considered to be used if they are installed in the PDB. To configure a PDB to only use specific components: 1. Create a non-CDB 19.0 database and configure that database with the components desired. 2. Plug the non-CDB database into a CDB database, creating a new PDB. Then if desired, create additional clones from the new PDB.
Run this query to check to verify what integrated components are installed in the database: SELECT parameter, value from v$option where parameter in ( 'Data Mining', 'Oracle Database Extensions for .NET', 'OLAP', 'Partitioning', 'Real Application Testing' ); This will return all of the relevant database options and their status. TRUE means that the option is installed. If the option is not installed, the option will be set to FALSE. Review the options and check the system documentation to verify what is required. If all listed components are authorized to be in use, this is not a finding. If any unused components or features are listed by the query as TRUE, this is a finding.
In the system documentation list the integrated components required for operation of applications that will be accessing the DBMS. For Oracle Database 12.1 and higher, only the following components can be enabled/disabled: Oracle Data Mining (dm) Oracle Database Extensions for .NET (ode_net) Oracle OLAP (olap) Oracle Partitioning (partitioning) Real Application Testing (rat) Use the chopt utility (an Oracle-supplied operating system command that resides in the <Oracle Home path>/bin directory) to disable each option that should not be available. The command format is chopt <enable|disable> <option> where <option> is any of the abbreviations in parentheses in the list above. For example, to disable Real Application Testing, issue the following command at an OS prompt: chopt disable rat Restart the Oracle service. Refer to My Oracle Support Document 948061.1 for more on the chopt command.
Determine which OS accounts are used by Oracle to run external procedures. Validate that these OS accounts have only the privileges necessary to perform the required functionality. If any OS accounts used by the database for running external procedures have privileges beyond those required for running the external procedures, this is a finding. If use of the external procedure agent is authorized, ensure extproc is restricted to execution of authorized applications. External jobs are run using the account "nobody" by default. Review the contents of the file ORACLE_HOME/rdbms/admin/externaljob.ora for the lines run_user= and run_group=. If the user assigned to these parameters is not "nobody", this is a finding. System views providing privilege information are: DBA_SYS_PRIVS DBA_TAB_PRIVS DBA_ROLE_PRIVS
Limit privileges to DBMS-related OS accounts to those required to perform their DBMS specific functionality.
Review the database for definitions of application executable objects stored external to the database. Determine if there are methods to disable use or access, or to remove definitions for external executable objects. Verify any application executable objects listed are authorized by the information system security officer (ISSO). To check for external procedures, execute the following query, which will provide the libraries containing external procedures, the owners of those libraries, users that have been granted access to those libraries, and the privileges they have been granted. If there are owners other than the owners Oracle provides, then there might be executable objects stored either in the database or external to the database that are called by objects in the database. (connect as sysdba) set linesize 130 column library_name format a25 column name format a15 column owner format a15 column grantee format a15 column privilege format a15 select library_name,owner, '' grantee, '' privilege from dba_libraries where file_spec is not null and owner not in ('SYS', 'ORDSYS') minus ( select library_name,o.name owner, '' grantee, '' privilege from dba_libraries l, sys.user$ o, sys.user$ ge, sys.obj$ obj, sys.objauth$ oa where l.owner=o.name and obj.owner#=o.user# and obj.name=l.library_name and oa.obj#=obj.obj# and ge.user#=oa.grantee# and l.file_spec is not null ) union all select library_name,o.name owner, --obj.obj#,oa.privilege#, ge.name grantee, tpm.name privilege from dba_libraries l, sys.user$ o, sys.user$ ge, sys.obj$ obj, sys.objauth$ oa, sys.table_privilege_map tpm where l.owner=o.name and obj.owner#=o.user# and obj.name=l.library_name and oa.obj#=obj.obj# and ge.user#=oa.grantee# and tpm.privilege=oa.privilege# and l.file_spec is not null / If any owners are returned other than those Oracle provides, ensure those owners are authorized to access those libraries. If there are users that have been granted access to libraries that are not authorized, this is a finding.
Disable use of or remove any external application executable object definitions that are not authorized. Revoke privileges granted to users that are not authorized access to external applications.
Review the system documentation to determine if the use of the external procedure agent is authorized. Review the ORACLE_HOME/bin directory or search the ORACLE_BASE path for the executable extproc (Unix) or extproc.exe (Windows). If external procedure agent is not authorized for use in the system documentation and the executable file does not exist or is restricted, this is not a finding. If external procedure agent is not authorized for use in the system documentation and the executable file exists and is not restricted, this is a finding. If use of the external procedure agent is authorized, ensure extproc is restricted to execution of authorized applications. External jobs are run using the account "nobody" by default. Review the contents of the file ORACLE_HOME/rdbms/admin/externaljob.ora for the lines run_user= and run_group=. If the user assigned to these parameters is not "nobody", this is a finding. The external procedure agent (extproc executable) is available directly from the database and does not require definition in the listener.ora file for use. Review the contents of the file ORACLE_HOME/hs/admin/extproc.ora. If the file does not exist, this is a finding. If the following entry does not appear in the file, this is a finding: EXTPROC_DLLS=ONLY:[dll full file name1]:[dll full file name2]:.. [dll full file name] represents a full path and file name. This list of file names is separated by ":". Note: If "ONLY" is specified, then the list is restricted to allow execution of only the DLLs specified in the list and is not a finding. If "ANY" is specified, then there are no restrictions for execution except what is controlled by operating system permissions and is a finding. If no specification is made, any files located in the %ORACLE_HOME%\bin directory on Windows systems or $ORACLE_HOME/lib directory on Unix systems can be executed (the default) and is a finding. Ensure that EXTPROC is not accessible from the listener. Review the listener.ora file. If any entries reference "extproc", this is a finding. Determine if the external procedure agent is in use per Oracle 10.x conventions. Review the listener.ora file. If any entries reference "extproc", then the agent is in use. If external procedure agent is not authorized for use in the system documentation and references to "extproc" exist, this is a finding. Sample listener.ora entries with extproc included: LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) EXTLSNR = (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) ) SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = /home/oracle/app/oracle/product/19.0/db_1) (SID_NAME = ORCL) ) ) SID_LIST_EXTLSNR = (SID_LIST = (SID_DESC = (PROGRAM = extproc) (SID_NAME = PLSExtProc) (ORACLE_HOME = /home/oracle/app/oracle/product/19.0/db_1) (ENVS="EXTPROC_DLLS=ONLY:/home/app1/app1lib.so:/home/app2/app2lib.so, LD_LIBRARY_PATH=/private/app2/lib:/private/app1, MYPATH=/usr/fso:/usr/local/packages") ) ) Sample tnsnames.ora entries with extproc included: ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ORCL) ) ) EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = extproc)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = PLSExtProc) ) ) If EXTPROC is in use, confirm that a listener is dedicated to serving the external procedure agent (as shown above). View the protocols configured for the listener. For the listener to be dedicated, the only entries will be to specify extproc. If there is not a dedicated listener in use for the external procedure agent, this is a finding. If the PROTOCOL= specified is other than IPC, this is a finding. Verify and ensure extproc is restricted executing authorized external applications only and extproc is restricted to execution of authorized applications. Review the listener.ora file. If the following entry does not exist, this is a finding: EXTPROC_DLLS=ONLY:[dll full file name1]:[dll full file name2]:... Note: [dll full file name] represents a full path and file name. This list of file names is separated by ":". Note: If "ONLY" is specified, then the list is restricted to allow execution of only the DLLs specified in the list and is not a finding. If "ANY" is specified, then there are no restrictions for execution except what is controlled by operating system permissions and is a finding. If no specification is made, any files located in the %ORACLE_HOME%\bin directory on Windows systems or $ORACLE_HOME/lib directory on Unix systems can be executed (the default) and is a finding. View the listener.ora file (usually in ORACLE_HOME/network/admin or directory specified by the TNS_ADMIN environment variable). If multiple listener processes are running, then the listener.ora file for each must be viewed. For each process, determine the directory specified in the ORACLE_HOME or TNS_ADMIN environment variable defined for the process account to locate the listener.ora file.
If use of the external procedure agent is required, then authorize and document the requirement in the system documentation. If the external procedure agent must be accessible to the Oracle listener, then specify this and authorize it in the system documentation. If use of the Oracle External Procedure agent is not required: 1. Stop the Oracle Listener process. 2. Remove all references to extproc in the listener.ora and tnsnames.ora files. 3. Alter the permissions on the executable files: Unix: Remove read/write/execute permissions from owner, group, and world. Windows: Remove Groups/Users from the executable (except groups SYSTEM and ADMINISTRATORS) and allow READ [only] for SYSTEM and ADMINISTRATORS groups. If required: 1. Restrict extproc execution to only authorized applications. 2. Specify EXTPROC_DLLS=ONLY: [list of authorized DLLS] in the extproc.ora and the listener.ora files. 3. Create a separate, dedicated listener for use by the external procedure agent. Refer to the Oracle Net Services Administrators Guides, External Procedures section for detailed configuration information.
Review the database management system (DBMS) settings for unapproved functions, ports, protocols, and services. If any are found, this is a finding. For definitive information on PPSM, refer to https://cyber.mil/ppsm/. - - - - - In the Oracle database, the communications with the database and incoming requests are performed by the Oracle Listener. The Oracle Listener listens on a specific port or ports for connections to a specific database. The Oracle Listener has configuration files located in the $ORACLE_HOME/network/admin directory. To check the ports and protocols in use, go to that directory and review the SQLNET.ora, LISTENER.ora, and the TNSNAMES.ora. If protocols or ports are in use that are not authorized, this is a finding.
Disable functions, ports, protocols, and services that are not approved. - - - - - Change the SQLNET.ora, LISTENER.ora, and TNSNAMES.ora files to reflect the proper use of ports, protocols, and services that are approved at the site. If changes to the Listener are made, the files associated with the Listener must be reloaded by issuing the following commands at the Unix/Linux or Windows prompt. Issue the command to verify what the current status is: $ lsnrctl stat Load the new file that was corrected to reflect site-specific requirements: $ lsnrctl reload Check the status again to verify that the changes have taken place: $ lsnrctl stat
Review database management system (DBMS) settings, OS settings, and/or enterprise-level authentication/access mechanism settings to determine whether shared accounts exist. If shared accounts do not exist, this is Not Applicable. Review DBMS settings to determine if individual authentication is required before shared authentication. If shared authentication does not require prior individual authentication, this is a finding. If using Oracle Access Manager: Verify the Authentication Module is set up properly: 1. Go to the Oracle Access Manager Home Screen and click the Policy Configuration tab. Select the X509Scheme. 2. Ensure the Authentication Module option is set to X509Plugin. Verify the Authentication policy is using the x509Scheme: 1. Go to Oracle Access Manager Home Screen and click the Policy Configuration tab. 2. Select Application Domains. Select Search. 3. Select the application domain protecting the Oracle Database. 4. Select the Authentication Policies tab and click Protected Resource Policy. 5. Make sure the Authentication Scheme is set to x509Scheme.
Configure the DBMS, OS, and/or enterprise-level authentication/access mechanism to require individual authentication prior to authentication for shared account access. If appropriate, install Oracle Access Manager to provide multifactor authentication of applications front-ending Oracle Databases and using shared accounts. After installation, use x509 Authentication modules provided out of the box.
Review database management system (DBMS) settings, OS settings, and/or enterprise-level authentication/access mechanism settings, and site practices, to determine whether organizational users are uniquely identified and authenticated when logging on to the system. If organizational users are not uniquely identified and authenticated, this is a finding.
Configure the DBMS, OS, and/or enterprise-level authentication/access mechanism to uniquely identify and authenticate all organizational users who log on to the system. Ensure that each user has a separate account from all other users.
If all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism and not by Oracle, this is not a finding. For each profile that can be applied to accounts where authentication is under Oracle's control, determine the password verification function that is in use: SELECT * FROM SYS.DBA_PROFILES WHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION' ORDER BY PROFILE; Note: Profiles can inherit settings from another profile so some password functions could be set to DEFAULT. If so, review the DEFAULT profile function name. If the function name is null for any profile, this is a finding. Review the password verification functions specified for the PASSWORD_VERIFY_FUNCTION settings for each profile. Determine whether the following rules are enforced by the code in those functions. a. Minimum of 15 characters, including at least one of each of the following character sets: - Uppercase - Lowercase - Numeric - Special characters (e.g., ~ ! @ # $ % ^ & * ( ) _ + = - ' [ ] / ? > <) b. Minimum number of characters changed from previous password: 50 percent of the minimum password length; that is, eight. If any of the above password requirements are not included in the function, this is a finding.
If all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism, and not by Oracle, no fix to the DBMS is required. If any user accounts are managed by Oracle, develop, test, and implement a password verification function that enforces DOD requirements. Oracle supplies a sample function called ORA12C_STRONG_VERIFY_FUNCTION. This can be used as the starting point for a customized function. The script file is found in the following location on the server depending on OS: Windows: %ORACLE_HOME%\RDBMS\ADMIN\catpvf.sql Unix/Linux: $ORACLE_HOME/rdbms/admin/catpvf.sql
If all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism, and not by Oracle, this is not a finding. Where accounts are authenticated using passwords, review procedures and implementation evidence for creation of temporary passwords. If the procedures or evidence do not exist or do not enforce passwords to meet DOD password requirements, this is a finding.
Implement procedures for assigning temporary passwords to user accounts. Procedures should include instructions to meet current DOD password length and complexity requirements and provide a secure method to relay the temporary password to the user.
If all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism, and not by Oracle, this is not a finding. Review database management system (DBMS) settings to determine if passwords must be changed periodically. Run the following script: SELECT p1.profile, CASE DECODE(p1.limit, 'DEFAULT', p3.limit, p1.limit) WHEN 'UNLIMITED' THEN 'UNLIMITED' ELSE CASE DECODE(p2.limit, 'DEFAULT', p4.limit, p2.limit) WHEN 'UNLIMITED' THEN 'UNLIMITED' ELSE TO_CHAR(DECODE(p1.limit, 'DEFAULT', p3.limit, p1.limit) + DECODE(p2.limit, 'DEFAULT', p4.limit, p2.limit)) END END effective_life_time FROM dba_profiles p1, dba_profiles p2, dba_profiles p3, dba_profiles p4 WHERE p1.profile=p2.profile AND p3.profile='DEFAULT' AND p4.profile='DEFAULT' AND p1.resource_name='PASSWORD_LIFE_TIME' AND p2.resource_name='PASSWORD_GRACE_TIME' AND p3.resource_name='PASSWORD_LIFE_TIME' -- from DEFAULT profile AND p4.resource_name='PASSWORD_GRACE_TIME' -- from DEFAULT profile order by 1; If the EFFECTIVE_LIFE_TIME is greater than 60 for any profile applied to user accounts, and the need for this has not been documented and approved, this is a finding. If PASSWORD_LIFE_TIME or PASSWORD_GRACE_TIME is set to "UNLIMITED", this is a finding.
For user accounts managed by Oracle, modify DBMS settings to force users to periodically change their passwords. For example, using "PPPPPP" to stand for a profile name: ALTER PROFILE PPPPPP LIMIT PASSWORD_LIFE_TIME 35 PASSWORD_GRACE_TIME 0; Do this for each profile applied to user accounts. Note: Although the DOD requirement is for a password change every 60 days, using a value of 35 facilitates the use of PASSWORD_LIFE_TIME as a means of locking accounts inactive for 35 days. But if 35 is not a practical or acceptable limit for password lifetime, set it to the standard DOD value of 60. Where a password lifetime longer than 60 is needed, document the reasons and obtain information system security officer (ISSO) approval.
Oracle Database stores and displays its passwords in encrypted form. Nevertheless, this should be verified by reviewing the relevant system views, along with the other items to be checked here. Review the list of DBMS database objects, database configuration files, associated scripts, and applications defined within and external to the DBMS that access the database. The list should also include files, tables, or settings used to configure the operational environment for the DBMS and for interactive DBMS user accounts. Determine whether any DBMS database objects, database configuration files, associated scripts, applications defined within or external to the DBMS that access the database, and DBMS/user environment files/settings contain database passwords. If any do, confirm that DBMS passwords stored internally or externally to the DBMS are hashed using FIPS-approved cryptographic algorithms and include a salt. If any passwords are stored in clear text, this is a finding. If any passwords are stored with reversible encryption, this is a finding. Determine if an external password store for applications, batch jobs, and scripts is in use. Verify that all passwords stored there are encrypted. If a password store is used and any password is not encrypted, this is a finding.
Develop, document, and maintain a list of DBMS database objects, database configuration files, associated scripts, applications defined within or external to the DBMS that access the database, and DBMS/user environment files/settings in the system documentation. Record whether they do or do not contain DBMS passwords. If passwords are present, ensure they are correctly hashed using one-way, salted hashing functions, and that the hashes are protected by host system security. The following are notes on implementing a Secure External Password Store using Oracle Wallet. Oracle provides the capability to provide for a secure external password facility. Use the Oracle mkstore to create a secure storage area for passwords for applications, batch jobs, and scripts to use, or deploy a site-authorized facility to perform this function. Check to verify what has been stored in the Oracle External Password Store. To view all contents of a client wallet external password store, check specific credentials by viewing them. Listing the external password store contents provides information that can be used to decide whether to add or delete credentials from the store. To list the contents of the external password store, enter the following command at the command line: $ mkstore -wrl wallet_location -listCredential For example: $ mkstore -wrl c:\oracle\product\19.0.0\db_1\wallets -listCredential The wallet_location specifies the path to the directory where the wallet, whose external password store contents is to be viewed, is located. This command lists all of the credential database service names (aliases) and the corresponding username (schema) for that database. Passwords are not listed. Configuring Clients to Use the External Password Store: If the client is already configured to use external authentication, such as Windows built-in authentication or Transport Layer Security (TLS), then Oracle Database uses that authentication method. The same credentials used for this type of authentication are typically also used to log on to the database. For clients not using such authentication methods or wanting to override them for database authentication, can set the SQLNET.WALLET_OVERRIDE parameter in sqlnet.ora to TRUE. The default value for SQLNET.WALLET_OVERRIDE is FALSE, allowing standard use of authentication credentials as before. If wanting a client to use the secure external password store feature, then perform the following configuration task: 1. Create a wallet on the client by using the following syntax at the command line: mkstore -wrl wallet_location -create For example: mkstore -wrl c:\oracle\product\19.0.0\db_1\wallets -create Enter password: password The wallet_location is the path to the directory where the wallet is to be created and stored. This command creates an Oracle wallet with the autologon feature enabled at the location specified. The autologon feature enables the client to access the wallet contents without supplying a password. The mkstore utility -create option uses password complexity verification. 2. Create database connection credentials in the wallet by using the following syntax at the command line: mkstore -wrl wallet_location -createCredential db_connect_string username Enter password: password For example: mkstore -wrl c:\oracle\product\19.0.0\db_1\wallets -createCredential oracle system Enter password: password In this specification, the wallet_location is the path to the directory where the wallet was created. The db_connect_string used in the CONNECT /@db_connect_string statement must be identical to the db_connect_string specified in the -createCredential command. The db_connect_string is the TNS alias used to specify the database in the tnsnames.ora file or any service name used to identify the database on an Oracle network. By default, tnsnames.ora is located in the $ORACLE_HOME/network/admin directory on Unix systems and in ORACLE_HOME\network\admin on Windows. The username is the database logon credential. When prompted, enter the password for this user. 3. In the client sqlnet.ora file, enter the WALLET_LOCATION parameter and set it to the directory location of the wallet created in Step 1. For example, if the wallet was created in $ORACLE_HOME/network/admin and Oracle home is set to /private/ora19, then enter the following into client sqlnet.ora file: WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /private/ora19/network/admin) ) ) 4. In the client sqlnet.ora file, enter the SQLNET.WALLET_OVERRIDE parameter and set it to TRUE as follows: SQLNET.WALLET_OVERRIDE = TRUE This setting causes all CONNECT /@db_connect_string statements to use the information in the wallet at the specified location to authenticate to databases. When external authentication is in use, an authenticated user with such a wallet can use the CONNECT /@db_connect_string syntax to access the previously specified databases without providing a username and password. However, if a user fails that external authentication, then these connect statements also fail. Below is a sample sqlnet.ora file with the WALLET_LOCATION and the SQLNET.WALLET_OVERRIDE parameters set as described in Steps 3 and 4. WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /private/ora19/network/admin) ) ) SQLNET.WALLET_OVERRIDE = TRUE SSL_CLIENT_AUTHENTICATION = FALSE SSL_VERSION = 3.0 Note: This assumes that a single sqlnet.ora file, in the default location, is in use. Refer to the following link if using a nondefault configuration: https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html
If all accounts are authenticated by the OS or an enterprise-level authentication/access mechanism and not by Oracle, this is not a finding. Review configuration settings for encrypting passwords in transit across the network. If passwords are not encrypted, this is a finding. The database supports PKI-based authentication by using digital certificates over TLS in addition to the native encryption and data integrity capabilities of these protocols. Oracle provides a complete PKI that is based on RSA Security, Inc., Public-Key Cryptography Standards, and which interoperates with Oracle servers and clients. The database uses a wallet that is a container that is used to store authentication and signing credentials, including private keys, certificates, and trusted certificates needed by TLS. In an Oracle environment, every entity that communicates over TLS must have a wallet containing an X.509 version 3 certificate, private key, and list of trusted certificates. Verify that the $ORACLE_HOME/network/admin/sqlnet.ora contains entries similar to the following to ensure TLS is installed: WALLET_LOCATION = (SOURCE= (METHOD = FILE) (METHOD_DATA = DIRECTORY=/wallet) SSL_CIPHER_SUITES=(SSL_cipher_suiteExample) SSL_VERSION = 3.0 SSL_CLIENT_AUTHENTICATION=TRUE If the sqlnet.ora file does not contain such entries, this is a finding.
Configure encryption for transmission of passwords across the network. Configure the database to support TLS protocols and the Oracle Wallet to store authentication and signing credentials, including private keys. More information can be found at https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-secure-sockets-layer-authentication.html#GUID-EF8DEC69-C8BE-462B-ABDD-E621914E617E.
Review DBMS configuration to determine whether appropriate access controls exist to protect the DBMS's private key. If strong access controls do not exist to enforce authorized access to the private key, this is a finding. The database supports authentication by using digital certificates over TLS in addition to the native encryption and data integrity capabilities of these protocols. An Oracle Wallet is a container that is used to store authentication and signing credentials, including private keys, certificates, and trusted certificates needed by TLS. In an Oracle environment, every entity that communicates over TLS must have a wallet containing an X.509 version 3 certificate, private key, and list of trusted certificates, with the exception of Diffie-Hellman. Verify the $ORACLE_HOME/network/admin/sqlnet.ora contains entries similar to the following to ensure TLS is installed: WALLET_LOCATION = (SOURCE= (METHOD = FILE) (METHOD_DATA = DIRECTORY=/wallet) SSL_CIPHER_SUITES=(SSL_cipher_suiteExample) SSL_VERSION = 3.0 SSL_CLIENT_AUTHENTICATION=TRUE If the sqlnet.ora file does not contain such entries, this is a finding.
Implement strong access and authentication controls to protect the database's private key. Configure the database to support TLS protocols and the Oracle Wallet to store authentication and signing credentials, including private keys. More information can be found at https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-secure-sockets-layer-authentication.html#GUID-EF8DEC69-C8BE-462B-ABDD-E621914E617E.
Review DBMS configuration to verify DBMS user accounts are being mapped directly to unique identifying information within the validated PKI certificate. If user accounts are not being mapped to authenticated identities, this is a finding.
Configure the DBMS to map the authenticated identity directly to the DBMS user account.
For Oracle SQL*Plus, which cannot be configured not to accept a plain-text password, and any other essential tool with the same limitation, verify that the system documentation explains the need for the tool, who uses it, and any relevant mitigations; and that authorizing official (AO) approval has been obtained. If not, this is a finding. Request evidence that all users of the tool are trained in the importance of not using the plain-text password option and in how to keep the password hidden; and that they adhere to this practice. If not, this is a finding.
For Oracle SQL*Plus, which cannot be configured not to accept a plain-text password, and any other essential tool with the same limitation: 1. Document the need for it, who uses it, and any relevant mitigations, and obtain AO approval. 2. Train all users of the tool in the importance of not using the plain-text password option and in how to keep the password hidden. Consider wrapping the startup command with a shell or wrapper and using an Oracle external password store. Oracle provides the capability to provide for a secure external password facility. Use the Oracle mkstore to create a secure storage area for passwords for applications, batch jobs, and scripts to use or deploy a site-authorized facility to perform this function. Check to verify what has been stored in the Oracle External Password Store. To view all contents of a client wallet external password store, check specific credentials by viewing them. Listing the external password store contents provides information used to decide whether to add or delete credentials from the store. To list the contents of the external password store, enter the following command at the command line: $ mkstore -wrl wallet_location -listCredential For example: $ mkstore -wrl c:\oracle\product\19.0.0\db_1\wallets -listCredential The wallet_location specifies the path to the directory where the wallet, whose external password store contents is to be viewed, is located. This command lists all of the credential database service names (aliases) and the corresponding username (schema) for that database. Passwords are not listed. Configuring Clients to Use the External Password Store If the client is already configured to use external authentication, such as Windows native authentication or Transport Layer Security (TLS), then Oracle Database uses that authentication method. The same credentials used for this type of authentication are typically also used to log on to the database. For clients not using such authentication methods or wanting to override them for database authentication, set the SQLNET.WALLET_OVERRIDE parameter in sqlnet.ora to TRUE. The default value for SQLNET.WALLET_OVERRIDE is FALSE, allowing standard use of authentication credentials as before. If wanting a client to use the secure external password store feature, then perform the following configuration task: 1. Create a wallet on the client by using the following syntax at the command line: orapki create -wallet wallet_location -auto_login_local For example: orapki wallet create -wallet c:\oracle\product\19.0.0\db_1\wallets -auto_login_local Enter password: password The wallet_location is the path to the directory where the wallet is to be created and stored. This command creates an Oracle wallet with the autologon feature enabled at the location specified. The autologon feature enables the client to access the wallet contents without supplying a password. The mkstore utility -create option uses password complexity verification. 2. Create database connection credentials in the wallet by using the following syntax at the command line: mkstore -wrl wallet_location -createCredential db_connect_string username Enter password: password For example: mkstore -wrl c:\oracle\product\19.0.0\db_1\wallets -createCredential oracle system Enter password: password In this specification: The wallet_location is the path to the directory where the wallet was created. The db_connect_string used in the CONNECT /@db_connect_string statement must be identical to the db_connect_string specified in the -createCredential command. The db_connect_string is the TNS alias used to specify the database in the tnsnames.ora file or any service name used to identify the database on an Oracle network. By default, tnsnames.ora is located in the $ORACLE_HOME/network/admin directory on Unix systems and in ORACLE_HOME\network\admin on Windows. The username is the database logon credential. When prompted, enter the password for this user. 3. In the client sqlnet.ora file, enter the WALLET_LOCATION parameter and set it to the directory location of the wallet created in Step 1. For example, if the wallet was created in $ORACLE_HOME/network/admin and the Oracle home is set to /private/ora12, then need to enter the following into the client sqlnet.ora file: WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /private/ora19/network/admin) ) ) 4. In the client sqlnet.ora file, enter the SQLNET.WALLET_OVERRIDE parameter and set it to TRUE as follows: SQLNET.WALLET_OVERRIDE = TRUE This setting causes all CONNECT /@db_connect_string statements to use the information in the wallet at the specified location to authenticate to databases. When external authentication is in use, an authenticated user with such a wallet can use the CONNECT /@db_connect_string syntax to access the previously specified databases without providing a username and password. However, if a user fails that external authentication, then these connect statements also fail. Below is a sample sqlnet.ora file with the WALLET_LOCATION and the SQLNET.WALLET_OVERRIDE parameters set as described in Steps 3 and 4. Below is a sample SQLNET.ORA File with wallet parameters set. WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /private/ora19/network/admin) ) ) SQLNET.WALLET_OVERRIDE = TRUE SSL_CLIENT_AUTHENTICATION = FALSE SSL_VERSION = 3.0 Note: This assumes that a single sqlnet.ora file, in the default location, is in use. Refer to the following link if using a nondefault configuration: https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html.
Check the following settings to verify FIPS 140-2 or FIPS 140-3 authentication/encryption is configured. If encryption is required but not configured, check with the database administrator (DBA) and system administrator to verify if other mechanisms or third-party cryptography products are deployed for authentication. To verify if Oracle is configured for FIPS 140 Secure Sockets Layer (SSL)/Transport Layer Security (TLS) authentication and/or encryption: Open the fips.ora file in a browser or editor. (The default location for fips.ora is $ORACLE_HOME/ldap/admin/ but alternate locations are possible. An alternate location, if it is in use, is specified in the FIPS_HOME environment variable.) If the line "SSLFIPS_140=TRUE" is not found in fips.ora, or the file does not exist, this is a finding.
Utilize NIST-validated FIPS 140-2/140-3 compliant cryptography for all authentication mechanisms. Open the fips.ora file in an editor. (The default location for fips.ora is $ORACLE_HOME/ldap/admin/ but alternate locations are possible. An alternate location, if it is in use, is specified in the FIPS_HOME environment variable.) Create or modify fips.ora to include the line "SSLFIPS_140=TRUE". The strength requirements are dependent upon data classification. For unclassified data, where cryptography is required: AES 128 for encryption SHA 256 for hashing NSA has established the suite B encryption requirements for protecting National Security Systems (NSS) as follows: AES 128 for Secret AES 256 for Top Secret SHA 256 for Secret SHA 384 for Top Secret NSS is defined as: (OMB Circular A-130) Any telecommunications or information system operated by the United States Government, the function, operation, or use of which (1) involves intelligence activities; (2) involves cryptologic activities related to national security; (3) involves command and control of military forces; (4) involves equipment that is an integral part of a weapon or weapons system; or (5) is critical to the direct fulfillment of military or intelligence missions, but excluding any system that is to be used for routine administrative and business applications (including payroll, finance, logistics, and personnel management applications). There is more information on this topic in the Oracle Database 19c Advanced Security Administrator's Guide, located at https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/oracle-database-fips-140-settings.html. Note: Because of changes in Oracle's licensing policy, it is no longer necessary to purchase Oracle Advanced Security to use network encryption and advanced authentication. FIPS documentation can be downloaded from https://csrc.nist.gov/publications/fips.
Review database management system (DBMS) settings to determine whether nonorganizational users are uniquely identified and authenticated when logging onto the system. If nonorganizational users are not uniquely identified and authenticated, this is a finding.
Configure DBMS settings to uniquely identify and authenticate all nonorganizational users who log onto the system.
If encryption is not required for the database, this is not a finding. If the database management system (DBMS) has not implemented federally required cryptographic protections for the level of classification of the data it contains, this is a finding. Check the following settings to verify FIPS 140-2/140-3 encryption is configured. If encryption is not configured, check with the database administrator (DBA) and system administrator (SA) to verify if other mechanisms or third-party products are deployed to encrypt data during the transmission or storage of data. For Transparent Data Encryption and DBMS_CRYPTO: To verify if Oracle is configured for FIPS 140 Transparent Data Encryption and/or DBMS_CRYPTO, enter the following SQL*Plus command: SHOW PARAMETER DBFIPS_140 or the following SQL query: SELECT * FROM SYS.V$PARAMETER WHERE NAME = 'DBFIPS_140'; If Oracle returns the value "FALSE", or returns no rows, this is a finding. To verify if Oracle is configured for FIPS 140 Secure Sockets Layer (SSL)/Transport Layer Security (TLS) authentication and/or encryption: Open the fips.ora file in a browser or editor. (The default location for fips.ora is $ORACLE_HOME/ldap/admin/ but alternate locations are possible. An alternate location, if it is in use, is specified in the FIPS_HOME environment variable.) If the line "SSLFIPS_140=TRUE" is not found in fips.ora, or the file does not exist, this is a finding. For (Native) Network Data Encryption: If the line, SQLNET.FIPS_140=TRUE is not found in $ORACLE_HOME/network/admin/sqlnet.ora, this is a finding. (Note: This assumes that a single sqlnet.ora file, in the default location, is in use).
Implement required cryptographic protections using cryptographic modules complying with applicable federal laws, Executive Orders, directives, policies, regulations, standards, and guidance. Open the fips.ora file in an editor. (The default location for fips.ora is $ORACLE_HOME/ldap/admin/ but alternate locations are possible. An alternate location, if it is in use, is specified in the FIPS_HOME environment variable.) Create or modify fips.ora to include the line "SSLFIPS_140=TRUE". The strength requirements are dependent upon data classification. For unclassified data, where cryptography is required: AES 128 for encryption SHA 256 for hashing NSA has established the suite B encryption requirements for protecting National Security Systems (NSS) as follows: AES 128 for Secret AES 256 for Top Secret SHA 256 for Secret SHA 384 for Top Secret NSS is defined as: (OMB Circular A-130) Any telecommunications or information system operated by the United States Government, the function, operation, or use of which (1) involves intelligence activities; (2) involves cryptologic activities related to national security; (3) involves command and control of military forces; (4) involves equipment that is an integral part of a weapon or weapons system; or (5) is critical to the direct fulfillment of military or intelligence missions, but excluding any system that is to be used for routine administrative and business applications (including payroll, finance, logistics, and personnel management applications). More information on implementing FIPS settings can be found at https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/oracle-database-fips-140-settings.html.
Check DBMS settings and vendor documentation to verify administrative functionality is separate from user functionality. If administrator and general user functionality is not separated either physically or logically, this is a finding.
Configure DBMS settings to separate database administration and general user functionality. Provide those who have both administrative and general-user responsibilities with separate accounts for these separate functions. This includes separation of duties for administrative users, schema owners, and application (general) users. Oracle's recommendation is Oracle Database Vault to solve this problem. Oracle Database Vault provides controls to prevent unauthorized privileged users from accessing sensitive data and to prevent unauthorized database changes. Oracle Database Vault provides database roles that enable different users to perform specific tasks, based on separation-of-duty guidelines. One of the biggest benefits resulting from regulatory compliance has been security awareness. Oracle Database Vault helps DBAs design flexible security policies for their database.
If the database is used solely for transient data (such as one dedicated to Extract-Transform-Load [ETL]), and a clear plan exists for the recovery of the database by means other than archiving, this is not a finding. If it has been determined that up-to-the second recovery is not necessary and this fact is recorded in the system documentation, with appropriate approval, this is not a finding. Check database management system (DBMS) settings to determine whether system state information is being preserved in the event of a system failure. The necessary state information is defined as "information necessary to determine cause of failure and to return to operations with least disruption to mission/business processes". Oracle creates what is known as archive logs. Archive logs contain information required to replay a transaction should something happen. The redo logs are also used to copy transactions or pieces of transactions. Issue the following commands to check the status of archive log mode: $ sqlplus connect as sysdba --Check current archivelog mode in database SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /home/oracle/app/oracle/arc2/ORCL Oldest online log sequence 433 Next log sequence to archive 435 Current log sequence 435 If archive log mode is not enabled, this is a finding.
Configure DBMS settings to preserve all required system state information in the event of a system failure. If the database is not in archive log mode, issue the following commands to put the database in archive log mode. The database must be normally shutdown and restarted before it can be placed in archive log mode. $ sqlplus connect as sysdba -- stop and dismount database and shutdown instance. SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount; -- Restart instance. ORACLE instance started. Total System Global Area 1653518336 bytes Fixed Size 2228904 bytes Variable Size 1325403480 bytes Database Buffers 318767104 bytes Redo Buffers 7118848 bytes Database mounted. SQL> alter database archivelog; -- Enable ArchiveLog Database altered. SQL> alter database open; -- Re-open database Database altered. Issue the following command to verify the new status: SQL> select log_mode from v$database; LOG_MODE ------------ ARCHIVELOG SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 294 Next log sequence to archive 296 Current log sequence 296 The database is now in archive log mode, and transactions are either being recorded to transport to another database or being reapplied if the database becomes corrupt and needs to be restored from the last backup. Use the redo logs to replay transactions not captured in the backup.
If the application owner and authorizing official (AO) have determined that encryption of data at rest is not required, this is not a finding. Review database management system (DBMS) settings to determine whether controls exist to protect the confidentiality and integrity of data at rest in the database. If controls do not exist or are not enabled, this is a finding. To ensure that the appropriate controls are in place, discuss the precautions taken with the site database administrators (DBAs) and system administrators (SAs) and try to modify data at rest. Oracle recommends using Transparent Data Encryption, which is part of Oracle Advanced Security Option, to protect data. To check to verify the data is encrypted, for example, upon an auditor's request Oracle provides views that document the encryption status of the database. For TDE column encryption, use the view "dba_encrypted_columns", which lists the owner, table name, column name, encryption algorithm, and salt for all encrypted columns. For TDE tablespace encryption, the following SQL statement lists all encrypted tablespaces with their encryption algorithm and corresponding, encrypted, data files. Issue the following commands to check to verify the data at rest is encrypted. $ sqlplus connect as sysdba SQL> SELECT t.name "TSName", e.encryptionalg "Algorithm", d.file_name "File Name" FROM v$tablespace t, v$encrypted_tablespaces e, dba_data_files d WHERE t.ts# = e.ts# and t.name = d.tablespace_name; The next SQL statement lists the table owner, tables within encrypted tablespaces, and the encryption algorithm: SQL> SELECT a.owner "Owner", a.table_name "Table Name", e.encryptionalg "Algorithm" FROM dba_tables a, v$encrypted_tablespaces e WHERE a.tablespace_name in (select t.name from v$tablespace t, v$encrypted_tablespaces e where t.ts# = e.ts#);
Apply appropriate controls to protect the confidentiality and integrity of data at rest in the database. If no site-specific precautions are in place, use Oracle Advanced Security Option to encrypt data at rest. If Oracle Advanced Security Option is not an option, use site-specific procedures to secure data at rest.
Review the system documentation to determine whether the organization has defined the information at rest that is to be protected from modification, which must include, at a minimum, PII and classified information. If no information is identified as requiring such protection, this is not a finding. Review the configuration of the DBMS, operating system/file system, and additional software as relevant. If any of the information defined as requiring cryptographic protection from modification is not encrypted in a manner that provides the required level of protection, this is a finding.
Configure the DBMS, operating system/file system, and additional software as relevant, to provide the required level of cryptographic protection.
Check DBMS settings to determine whether objects or code implementing security functionality are located in a separate security domain, such as a separate database or schema created specifically for security functionality. If security-related database objects or code are not kept separate, this is a finding. The Oracle elements of security functionality, such as the roles, permissions, and profiles, along with password complexity requirements, are stored in separate schemas in the database. Review any site-specific applications security modules built into the database and determine what schema they are located in and take appropriate action. The Oracle objects will be in the Oracle Data Dictionary.
Locate security-related database objects and code in a separate database, schema, or other separate security domain from database objects and code implementing application logic. (This is the default behavior for Oracle.) Review any site-specific applications security modules built into the database: determine what schema they are located in and take appropriate action.
Review the procedures for the refreshing of development/test data from production. Review any scripts or code that exists for the movement of production data to development/test systems, or to any other location or for any other purpose. Verify that copies of production data are not left in unprotected locations. If the code that exists for data movement does not comply with the organization-defined data transfer policy and/or fails to remove any copies of production data from unprotected locations, this is a finding. If sensitive data is included in the exports and no procedures are in place to remove or modify the data to render it not sensitive prior to import into a development database or policy and procedures are not in place to ensure authorization of development personnel to access sensitive information contained in production data, this is a finding.
Restrict accessibility of Oracle system tables and other configuration information or metadata to database administrators (DBAs) or other authorized users. Modify any code used for moving data from production to development/test systems to comply with the organization-defined data transfer policy, and to ensure copies of production data are not left in unsecured locations. Implement policy and procedures to modify or remove sensitive information in production exports prior to import into development databases.
Review the permissions granted to users on the database files, database log files and database backup files. To obtain a list of users and roles that have been granted access to any dictionary table, run the query: SELECT unique grantee from dba_tab_privs where table_name in (select table_name from dictionary) order by grantee; To obtain a list of dictionary tables and assigned privileges granted to a specific user or role, run the query: SELECT grantee, table_name, privilege from dba_tab_privs where table_name in (select table_name from dictionary) and grantee = '<applicable account>'; If any user/role who is not an authorized system administrator with a need to know or database administrator with a need to know, or a system account for running DBMS processes, is permitted to read/view any of these files, this is a finding.
Configure the permissions of the database files, database log files, and database backup files so that only relevant system accounts and authorized system administrators and database administrators with a need to know are permitted to read/view these files.
Check database management system (DBMS) settings to determine whether cryptographic mechanisms are used to prevent the unauthorized disclosure of information during transmission. Determine whether physical measures are being used instead of cryptographic mechanisms. If neither cryptographic nor physical measures are being used, this is a finding. To check that network encryption is enabled and using site-specified encryption procedures, look in SQLNET.ORA located at $ORACLE_HOME/network/admin/sqlnet.ora. If encryption is set, entries like the following will be present: SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT= (SHA384) SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER= (SHA384) SQLNET.ENCRYPTION_TYPES_CLIENT= (AES256) SQLNET.ENCRYPTION_TYPES_SERVER= (AES256) SQLNET.CRYPTO_CHECKSUM_CLIENT = requested SQLNET.CRYPTO_CHECKSUM_SERVER = required The values assigned to the parameters may be different, the combination of parameters may be different, and not all of the example parameters will necessarily exist in the file.
Configure DBMS and/or operating system to use cryptographic mechanisms to prevent unauthorized disclosure of information during transmission where physical measures are not being used.
Review database management system (DBMS) code, settings, field definitions, constraints, and triggers to determine whether or not data being input into the database is validated. If code exists that allows invalid data to be acted upon or input into the database, this is a finding. If field definitions do not exist in the database, this is a finding. If fields do not contain enabled constraints where required, this is a finding.
Modify database code to properly validate data before it is put into the database or acted upon by the database. Modify database to contain field definitions for each field in the database. Modify database to contain constraints on database columns and tables that require them for data validity. Review the application schemas implemented on the system. Check the DDL for the tables that are created for the applications to verify constraints have been enabled. Enabling Constraints Upon Definition: The following CREATE TABLE and ALTER TABLE statements both define and enable integrity constraints: CREATE TABLE emp ( empno NUMBER(5) CONSTRAINT emp.pk PRIMARY KEY, . . . ) ; ALTER TABLE emp ADD CONSTRAINT emp.pk PRIMARY KEY (empno); An ALTER TABLE statement that defines and attempts to enable an integrity constraint can fail because existing rows of the table violate the integrity constraint. In this case, the statement is rolled back, and the constraint definition is not stored and not enabled. When enabling a UNIQUE or PRIMARY KEY constraint, an associated index is created. For details about the meaning of these states and an understanding of their consequences, refer to the Oracle Database SQL Language Reference. Some of these consequences are discussed here. Disabling Constraints: To enforce the rules defined by integrity constraints, the constraints should always be enabled. However, consider temporarily disabling the integrity constraints of a table for the following performance reasons: - When loading large amounts of data into a table; - When performing batch operations that make massive changes to a table (for example, changing every employee's number by adding 1000 to the existing number); or - When importing or exporting one table at a time. In all three cases, temporarily disabling integrity constraints can improve the performance of the operation, especially in data warehouse configurations. It is possible to enter data that violates a constraint while that constraint is disabled. Thus, always enable the constraint after completing any of the operations listed in the preceding bullet list. Enabling Constraints: While a constraint is enabled, no row violating the constraint can be inserted into the table. However, while the constraint is disabled, such a row can be inserted. This row is known as an exception to the constraint. If the constraint is in the ENABLE, NOVALIDATE state, violations resulting from data entered while the constraint was disabled remain. The rows that violate the constraint must be either updated or deleted in order for the constraint to be put in the validated state. Can identify exceptions to a specific integrity constraint while attempting to enable the constraint. Refer to "Reporting Constraint Exceptions". All rows violating constraints are noted in an EXCEPTIONS table, which can be examined. ENABLE, NOVALIDATE Constraint State: When a constraint is in the ENABLE, NOVALIDATE state, all subsequent statements are checked for conformity to the constraint. However, any existing data in the table is not checked. A table with ENABLE, NOVALIDATE constraints can contain invalid data, but it is not possible to add new invalid data to it. Constraints in the ENABLE, NOVALIDATE state is most useful in data warehouse configurations that are uploading valid OLTP data. Enabling a constraint does not require validation. Enabling a constraint NOVALIDATE is much faster than enabling and validating a constraint. Also, validating a constraint that is already enabled does not require any DML locks during validation (unlike validating a previously disabled constraint). Enforcement guarantees that no violations are introduced during the validation. Hence, enabling without validating reduces the downtime typically associated with enabling a constraint. Efficient Use of Integrity Constraints: A Procedure: Using integrity constraint states in the following order can ensure the best benefits: - Disable state. - Perform the operation (load, export, import). - ENABLE, NOVALIDATE state. - Enable state. Some benefits of using constraints in this order are: - No locks are held. - All constraints can go to enable state concurrently. - Constraint enabling is done in parallel. - Concurrent activity on table is permitted. Setting Integrity Constraints Upon Definition: When an integrity constraint is defined in a CREATE TABLE or ALTER TABLE statement, it can be enabled, disabled, or validated or not validated as determined by the specification of the ENABLE/DISABLE clause. If the ENABLE/DISABLE clause is not specified in a constraint definition, the database automatically enables and validates the constraint. Disabling Constraints Upon Definition: The following CREATE TABLE and ALTER TABLE statements both define and disable integrity constraints: CREATE TABLE emp ( empno NUMBER(5) PRIMARY KEY DISABLE, . . . ; ALTER TABLE emp ADD PRIMARY KEY (empno) DISABLE; An ALTER TABLE statement that defines and disables an integrity constraint never fails because of rows in the table that violate the integrity constraint. The definition of the constraint is allowed because its rule is not enforced. Enabling Constraints Upon Definition: The following CREATE TABLE and ALTER TABLE statements both define and enable integrity constraints: CREATE TABLE emp ( empno NUMBER(5) CONSTRAINT emp.pk PRIMARY KEY, . . . ; ALTER TABLE emp ADD CONSTRAINT emp.pk PRIMARY KEY (empno); An ALTER TABLE statement that defines and attempts to enable an integrity constraint can fail because rows of the table violate the integrity constraint. If this case, the statement is rolled back, and the constraint definition is not stored and not enabled.
Review DBMS source code (stored procedures, functions, triggers) and application source code, to identify cases of dynamic code execution. If dynamic code execution is employed in circumstances where the objective could practically be satisfied by static execution with strongly typed parameters, this is a finding.
Where dynamic code execution is employed in circumstances where the objective could practically be satisfied by static execution with strongly typed parameters, modify the code to do so.
Review DBMS source code (stored procedures, functions, triggers) and application source code to identify cases of dynamic code execution. If dynamic code execution is employed without protective measures against code injection, this is a finding.
Where dynamic code execution is used, modify the code to implement protections against code injection.
Check DBMS settings and custom database and application code to verify error messages do not contain information beyond what is needed for troubleshooting the issue. If database errors contain PII data, sensitive business data, or information useful for identifying the host system, this is a finding.
Configure DBMS and custom database and application code not to divulge sensitive information or information useful for system identification in error information.
Check DBMS settings and custom database code to determine if error messages are ever displayed to unauthorized individuals: i) Review all end-user-facing applications that use the database, to determine whether they display any DBMS-generated error messages to general users. If they do, this is a finding. ii) Review whether the database is accessible to users who are not authorized system administrators or database administrators, via the following types of software: iia) Oracle SQL*Plus. iib) Reporting and analysis tools. iic) Database management and/or development tools, such as, but not limited to, Toad. iid) Application development tools, such as, but not limited to, Oracle JDeveloper, Microsoft Visual Studio, PowerBuilder, or Eclipse. If the answer to the preceding question (iia through iid) is Yes, inquire whether, for each role or individual with respect to each tool, this access is required to enable the user(s) to perform authorized job duties. If No, this is a finding. If Yes, continue: For each tool in use, determine whether it is capable of suppressing DBMS-generated error messages, and if it is, whether it is configured to do so. Determine whether the role or individual, with respect to each tool, needs to verify detailed DBMS-generated error messages. If No, and if the tool is not configured to suppress such messages, this is a finding. If Yes, determine whether the role/user's need to verify such messages is documented in the system documentation. If so, this is not a finding. If not, this is a finding.
For each end-user-facing application that displays DBMS-generated error messages, configure or recode it to suppress these messages. If the application is coded in Oracle PL/SQL, the EXCEPTION block can be used to suppress or divert error messages. Most other programming languages provide comparable facilities, such as TRY ... CATCH. For each unauthorized user of each tool, remove the ability to access it. For each tool where access to DBMS error messages is not required and can be configured, suppress the messages. For each role/user that needs access to the error messages or needs a tool where the messages cannot be suppressed, document the need in the system documentation.
When the Quarterly CPU is released, check the CPU Notice and note the specific patch number for the system. Then, issue the following command: SELECT patch_id, source_version, action, status, description from dba_registry_sqlpatch; This will generate the patch levels for the home and any specific patches that have been applied to it. If the currently installed patch levels are lower than the latest, this is a finding.
Institute and adhere to policies and procedures to ensure that patches are consistently applied to the Oracle Database within the time allowed. Follow the instructions provided by Oracle to download and apply the appropriate security patches. Log on to My Oracle Support. Select patches and download the specific patch number and corresponding sha256 checksum. Once the patch is downloaded to the server, check the sha256 checksum to make sure the patch is valid. To check the sha256 Checksum in Linux/Unix, the command is: $ sha256sum /home/myuser/test_file4 09b4b51a60d6913b82e3353eef179969ad0968ff8acfb37ca891f04df67b93f0 /home/myuser/test_file5 Once the checksum is validated, apply the patch: $ cd $ORACLE_HOME $ opatch apply
Retrieve the settings for PASSWORD_LIFE_TIME for each profile with the query: SELECT * FROM SYS.DBA_PROFILES WHERE RESOURCE_NAME = 'PASSWORD_LIFE_TIME'; If the Oracle Database settings for PASSWORD_LIFE_TIME for any profile is greater than 60, this is a finding. If the database management system (DBMS) is not configured to disable accounts when the accounts have expired, this is a finding.
Configure the DBMS to disable accounts when the accounts have expired. The user profile, ORA_STIG_PROFILE, has been provided to satisfy the STIG requirements pertaining to the profile parameters. Oracle recommends that this profile be customized with any site-specific requirements and assigned to all users where applicable. Note: It remains necessary to create a customized replacement for the password validation function, ORA12C_STRONG_VERIFY_FUNCTION, if relying on this technique to verify password complexity. The defaults for ORA_STIG_PROFILE are set as follows: Resource Name Limit ------------- ------ COMPOSITE_LIMIT DEFAULT SESSIONS_PER_USER DEFAULT CPU_PER_SESSION DEFAULT CPU_PER_CALL DEFAULT LOGICAL_READS_PER_SESSION DEFAULT LOGICAL_READS_PER_CALL DEFAULT IDLE_TIME 15 CONNECT_TIME DEFAULT PRIVATE_SGA DEFAULT FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LIFE_TIME 60 PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 10 PASSWORD_VERIFY_FUNCTION ORA12C_STRONG_VERIFY_FUNCTION PASSWORD_LOCK_TIME UNLIMITED PASSWORD_GRACE_TIME 5 Change the value of PASSWORD_LIFE_TIME (along with the other parameters, where relevant) from UNLIMITED to 60 and then assign users to the profile. ALTER PROFILE ORA_STIG_PROFILE LIMIT PASSWORD_LIFE_TIME 60; To assign the user to the profile do the following: ALTER USER <username> PROFILE ORA_STIG_PROFILE;
Verify the database management system (DBMS) is configured to verify when users create or update passwords, that the passwords are not found on the list of commonly used, expected, or compromised passwords in IA-5 (1) (a). If all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism, and not by Oracle, this is not a finding. For each profile that can be applied to accounts where authentication is under Oracle's control, determine the password verification function that is in use: SELECT * FROM SYS.DBA_PROFILES WHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION' ORDER BY PROFILE; Note: Profiles can inherit settings from another profile so some password functions could be set to DEFAULT. If so, review the DEFAULT profile function name. If the function name is null for any profile, this is a finding. Review the password verification functions specified for the PASSWORD_VERIFY_FUNCTION settings for each profile. Determine whether it is configured for when users create or update passwords, that the passwords are not found on the list of commonly-used, expected, or compromised passwords. If the verify_function is not configured to verify when users create or update passwords, that the passwords are not found on the list of commonly-used, expected, or compromised passwords in IA-5 (1) (a), this is a finding.
If any user accounts are managed by Oracle, develop, test, and implement a password verification function that enforces DOD requirements. Configure the password verify function to verify when users create or update passwords, that the passwords are not found on the list of commonly-used, expected, or compromised passwords in IA-5 (1) (a). Oracle supplies a sample function called ORA12C_STRONG_VERIFY_FUNCTION. This can be used as the starting point for a customized function. The script file is found in the following location on the server depending on OS: Windows: %ORACLE_HOME%\RDBMS\ADMIN\catpvf.sql Unix/Linux: $ORACLE_HOME/rdbms/admin/catpvf.sql
Verify the database management system (DBMS) is configured to require immediate selection of a new password upon account recovery. All scripts, functions, triggers, and stored procedures that are used to create a user or reset a user's password should include a line similar to the following: alter user <username> password expire; If they do not, this is a finding. If the DBMS is not configured to require immediate selection of a new password upon account recovery, this is a finding.
Configure the DBMS to require immediate selection of a new password upon account recovery. One way to configure this is to ensure that all scripts, functions, triggers, and stored procedures that are used to create a user or reset a user's password should include a line similar to the following: alter user <username> password expire;
If all accounts are authenticated by the OS or an enterprise-level authentication/access mechanism and not by Oracle, this is not a finding. Verify the database management system (DBMS) is configured to include only approved trust anchors in trust stores or certificate stores managed by the organization. If trust stores or certification paths are not being validated back to a trust anchor, this is a finding. The database supports PKI-based authentication by using digital certificates over Transport Layer Security (TLS) in addition to the native encryption and data integrity capabilities of these protocols. Oracle provides a complete PKI that is based on RSA Security, Inc., Public-Key Cryptography Standards, and which interoperates with Oracle servers and clients. The database uses a wallet that is a container that is used to store authentication and signing credentials, including private keys, certificates, and trusted certificates needed by TLS. In an Oracle environment, every entity that communicates over TLS must have a wallet containing an X.509 version 3 certificate, private key, and list of trusted certificates. If the $ORACLE_HOME/network/admin/sqlnet.ora contains the following entries, TLS is installed. WALLET_LOCATION = (SOURCE= (METHOD = FILE) (METHOD_DATA = DIRECTORY=/wallet) SSL_CIPHER_SUITES=(SSL_cipher_suiteExample) SSL_VERSION = 3.0 SSL_CLIENT_AUTHENTICATION=TRUE
Configure the DBMS to include only approved trust anchors in trust stores or certificate stores managed by the organization. Configure the database to support TLS protocols and the Oracle Wallet to store authentication and signing credentials, including private keys.