{"stig":{"title":"Oracle Database 19c Security Technical Implementation Guide","version":"1","release":"5"},"checks":[{"vulnId":"V-270495","ruleId":"SV-270495r1167748_rule","severity":"medium","ruleTitle":"Oracle Database must limit the number of concurrent sessions for each system account to an organization-defined number of sessions.","description":"Database management includes the ability to control the number of users and user sessions using a database management system (DBMS). Unlimited concurrent connections to the DBMS could allow a successful denial-of-service (DoS) attack by exhausting connection resources; and a system can also fail or be degraded by an overload of legitimate users. Limiting the number of concurrent sessions per user is helpful in reducing these risks. \n\nThis requirement addresses concurrent session control for a single account. It does not address concurrent sessions by a single user via multiple system accounts; and it does not deal with the total number of sessions across all accounts.\n\nThe capability to limit the number of concurrent sessions per user must be configured in or added to the DBMS by modifying user database profiles.\n\nNote that it is not sufficient to limit sessions via a web server or application server alone, because legitimate users and adversaries can potentially connect to the DBMS by other means.\n\nThe organization must to define the maximum number of concurrent sessions by user type, by account, or a combination thereof. In deciding on the appropriate number, it is important to consider the work requirements of the various types of users. For example, two might be an acceptable limit for general users accessing the database via an application; but three might be too few for a database administrator using a database management GUI tool, where each query tab and navigation pane may count as a separate session: An account associated with a connection pool might require hundreds or thousands.\n\n(Sessions may also be referred to as connections or logons, which for the purposes of this requirement are synonyms.)","checkContent":"Retrieve the settings for concurrent sessions for each profile with the query:\n\nSELECT con_id, inherited, limit FROM sys.cdb_profiles WHERE resource_name = 'SESSIONS_PER_USER';\n\nIf the DBMS settings for concurrent sessions for each profile are greater than the site-specific maximum number of sessions (or the database maximum number of sessions) for the user type, this is a finding.\n\nThe reason for \"site-specific\" is because two different databases at different \"sites\" could have very different requirements.\nAlso, two different databases at the same \"site\" (data center) could have very different requirements.","fixText":"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.\n\nThe user profile, ORA_STIG_PROFILE, has been provided with Oracle 19c to satisfy the STIG requirements pertaining to profile parameters. Oracle recommends that this profile be customized with requirements and assigned to all users through the creation of user type specific profiles such as (Single-Session, Administrators, Application Connection Pool) where applicable. \n\nNote: The ORA_STIG_PROFILE limit for SESSIONS_PER_USER is DEFAULT which is, on installation, not compliant and must be configured for each database and in a container database for CDB$ROOT and, potentially, for each PDB.\n\nSet concurrent sessions for each profile with the following SQL statement, as required.\n\nALTER PROFILE <profile_name> LIMIT SESSIONS_PER_USER <integer>;","ccis":["CCI-000054"]},{"vulnId":"V-270496","ruleId":"SV-270496r1167727_rule","severity":"medium","ruleTitle":"Oracle Database must protect against or limit the effects of organization-defined types of denial-of-service (DoS) attacks.","description":"DOS attacks, more correctly characterized as \"Denial-of-Service Events\" as they most often the result of run-away processes and accidents, are the result of an excessive demand for a limiting resource.\n\nA variety of technologies exist to limit, or in some cases, eliminate the effects of DoS attacks. For example, boundary protection devices can filter certain types of packets to protect devices on an organization's internal network from being directly affected by DoS attacks but within the database itself, Oracle provides the following mechanisms:\n\n1. Reduction of excessive concurrent connections from a single user (see STIG_ID O19C-00-000100).\n2. Limiting the database connection rate (LISTENER.ORA).\n3. Limiting the amount of CPU available to users with Profile kernel limits.\n4. Limiting the amount of I/O available to users with Profile kernel limits.\n5. Limiting the amount of storage space with tablespace quotas.\n6. Limiting idle time with profile kernel limits.\n\nOther best practices such as limiting the number of parallel handles available to users with Resource Manager Plans or using CMAN are also recommended as part of an overall plan for DoS prevention.","checkContent":"Review database management system (DBMS) settings to verify the DBMS implements measures to limit the effects of a DoS event.\n\nRate Limit:\n\nCheck 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 or pool restart.\n\nIf a rate limit has not been set similar to one of the two examples in Listing 1, this is a finding.\n \nListing 1\nCONNECTION_RATE_LISTENER=10\nLISTENER= (\n  ADDRESS_LIST=\n    (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)(RATE_LIMIT=yes))\n    (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1522)(RATE_LIMIT=yes))\n    (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1526))\n           )\nLISTENER=\n  (ADDRESS_LIST=\n    (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)(RATE_LIMIT=8))\n    (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1522)(RATE_LIMIT=12))\n    (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1526))\n           )\n\nDatabase Profiles:\nIf the database profiles, as shown in Listing 2 do not contain resource controls similar to those shown, but appropriate to the target database's infrastructure and utilization, that is a finding.\n\nListing 2\nSELECT cp.con_id, cp.profile, cp.resource_name, cp.limit\nFROM sys.cdb_profiles cp\nWHERE resource_name IN ('CPU_PER_CALL', 'IDLE_TIME', 'LOGICAL_READS_PER_CALL');\nORDER BY 1,2,3;\n\n\nTablespace Quota:\n\nListing 3\nSELECT ctq.con_id, ctq.tablespace_name, ctq.username, ctq.max_bytes, ctq.max_blocks\nFROM sys.cdb_ts_quotas ctq\nWHERE ((max_bytes = -1) OR (max_blocks = -1))\nAND (ctq.con_id, ctq.tablespace_name) IN (SELECT ct.con_id, ct.tablespace_name FROM sys.cdb_tablespaces ct)\nORDER BY 1;\n\nIf any rows returned have a MAX_BYTES or MAX_BLOCKS equal to minus one (-1) that is a finding.","fixText":"Implement measures to limit the effects of organization-defined types of DoS attacks.\n\nFor each of the three queries in the Check, if there are findings, make the changes required to bring the environment into compliance.\n\nFor Listing 1:\nModify the $ORACLE_HOME/network/admin/listener.ora to establish a Rate Limit.\nRestart the listener for changes to take effect.\n\nFor Listing 2:\nSet limits on all profiles for CPU_PER_CALL, IDLE_TIME, and LOGICAL_READS_PER_CALL.\n\nFor Listing 3:\nEnforce reasonable limits for tablespace consumption sufficient to prevent a DOS attack from impacting multiple applications or multiple services.","ccis":["CCI-000054"]},{"vulnId":"V-270497","ruleId":"SV-270497r1167730_rule","severity":"medium","ruleTitle":"Oracle Database must automatically terminate a user session after organization-defined conditions or trigger events requiring session disconnect.","description":"This addresses the termination of user-initiated logical sessions in contrast to the termination of network connections associated with communications sessions (i.e., network disconnect). A logical session (for local, network, and remote access) is initiated whenever a user (or process acting on behalf of a user) accesses an organizational information system. Such user sessions can be terminated (and thus terminate user access) without terminating network sessions. \n\nSession termination ends all processes associated with a user's logical session except those batch processes/jobs that are specifically created by the user (i.e., session owner) to continue after the session is terminated. \n\nConditions or trigger events requiring automatic session termination can include, for example, organization-defined periods of user inactivity, targeted responses to certain types of incidents, and time-of-day restrictions on information system use.\n\nThis capability is typically reserved for specific cases where the system owner, data owner, or organization requires additional assurance.\n\nSatisfies: SRG-APP-000295-DB-000305, SRG-APP-000296-DB-000306","checkContent":"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.\n\nIf no documentation exists or an automatic session termination time is not explicitly defined, assume a time of 15 minutes.\n\nTo check the max_idle_time set, run the following query:\n\nSELECT gp.inst_id, gp.con_id, gp.value\nFROM sys.gv_$parameter gp\nWHERE gp.name = 'max_idle_time';\n\nIf the value returned is \"0\" or does not match the documented requirement (or 15 when none is specified), this is a finding.","fixText":"Configure the database management system (DBMS) to automatically terminate a user session after organization-defined conditions, 15 minutes, or a trigger event requiring session termination.\n\nTo terminate a 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 a session can be idle. After the specified amount of time, MAX_IDLE_TIME kills sessions.\n\nALTER SYSTEM SET max_idle_time = 15 \nCOMMENT = 'Altered <date> for STIG compliance'  -- self documenting\nSID = '*'                                       -- required for RAC\nSCOPE = BOTH;","ccis":["CCI-002361","CCI-002363"]},{"vulnId":"V-270498","ruleId":"SV-270498r1167732_rule","severity":"medium","ruleTitle":"Oracle Database must associate organization-defined types of security labels having organization-defined security label values with information in storage.","description":"Without the association of security labels to information, there is no basis for the database management system (DBMS) to make security-related access-control decisions.\n\nSecurity labels are abstractions representing the basic properties or characteristics of an entity (e.g., subjects and objects) with respect to safeguarding information. \n\nThese labels are typically associated with internal data structures (e.g., tables, rows) within the database and are used to enable the implementation of access control and flow control policies, reflect special dissemination, handling, or distribution instructions, or support other aspects of the information security policy. \n\nOne example includes marking data as classified or CUI. These security labels may be assigned manually or during data processing, but, either way, it is imperative these assignments are maintained while the data is in storage. If the security labels are lost when the data is stored, there is the risk of a data compromise.\n\nSome DBMS systems provide the feature to assign security labels to data elements. If labeling is required, implementation options include the Oracle Label Security package, or a third-party product, or custom-developed functionality. The confidentiality and integrity of the data depends upon the security label assignment where this feature is in use.\n\nSatisfies: SRG-APP-000311-DB-000308, SRG-APP-000313-DB-000309, SRG-APP-000314-DB-000310","checkContent":"If no data has been identified as being sensitive or classified in the system documentation, this is not a finding.\n\nIf security labeling is not required, this is not a finding.\n\nIf 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.","fixText":"Define the policy for security labels defined for the data. \n\nDocument the security label requirements and configure database security labels in accordance with the policy.\n\nTo 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.\n\nOracle recommends Oracle Label Security.\n\nFor additional information on Oracle Label Security:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/olsag/label-security-administrators-guide.pdf.","ccis":["CCI-002262","CCI-002263","CCI-002264"]},{"vulnId":"V-270499","ruleId":"SV-270499r1064775_rule","severity":"high","ruleTitle":"Oracle Database must integrate with an organization-level authentication/access mechanism providing account management and automation for all users, groups, roles, and any other principals.","description":"Enterprise environments make account management for applications and databases challenging and complex. A manual process for account management functions adds the risk of a potential oversight or other error. Managing accounts for the same person in multiple places is inefficient and prone to problems with consistency and synchronization.\n\nA comprehensive application account management process that includes automation helps to ensure that accounts designated as requiring attention are consistently and promptly addressed. \n\nExamples include, but are not limited to, using automation to act on multiple accounts designated as inactive, suspended, or terminated, or by disabling accounts located in noncentralized account stores, such as multiple servers. Account management functions can also include assignment of group or role membership; identifying account type; specifying user access authorizations (i.e., privileges); account removal, update, or termination; and administrative alerts. The use of automated mechanisms can include, for example: using email or text messaging to notify account managers when users are terminated or transferred; using the information system to monitor account usage; and using automated telephone notification to report atypical system account usage.\n\nOracle Database must be configured to automatically use organization-level account management functions, and these functions must immediately enforce the organization's current account policy. \n\nAutomation may be comprised of differing technologies that when placed together contain an overall mechanism supporting an organization's automated account management requirements.","checkContent":"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.\n\nIf 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.\n\nIf there are any accounts managed by the Oracle Database, review the system documentation for justification and approval of these accounts.\n\nIf any Oracle-managed accounts exist that are not documented and approved, this is a finding.","fixText":"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.\n\nFor 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.\n\nUtilize an Oracle feature/product, an OS feature, a third-party product, or custom code to automate as much account maintenance functionality as possible.","ccis":["CCI-000015"]},{"vulnId":"V-270500","ruleId":"SV-270500r1167734_rule","severity":"high","ruleTitle":"Oracle Database must enforce approved authorizations for logical access to the system in accordance with applicable policy.","description":"Authentication with a DOD-approved public key infrastructure (PKI) certificate does not necessarily imply authorization to access the database management system (DBMS). To mitigate the risk of unauthorized access to sensitive information by entities that have been issued certificates by DOD-approved PKIs, all DOD systems, including databases, must be properly configured to implement access control policies. \n\nSuccessful authentication must not automatically give an entity access to an asset or security boundary. Authorization procedures and controls must be implemented to ensure each authenticated entity also has a validated and current authorization. Authorization is the process of determining whether an entity, once authenticated, is permitted to access a specific asset. Information systems use access control policies and enforcement mechanisms to implement this requirement. \n\nAccess control policies include identity-based policies, role-based policies, and attribute-based policies. Access enforcement mechanisms include access control lists, access control matrices, and cryptography. These policies and mechanisms must be employed by the application to control access between users (or processes acting on behalf of users) and objects (e.g., devices, files, records, processes, programs, and domains) in the information system.\n\nThis requirement is applicable to access control enforcement applications, a category that includes database management systems. If the DBMS does not follow applicable policy when approving access, it may be in conflict with networks or other applications in the information system. This may result in users either gaining or being denied access inappropriately and in conflict with applicable policy.\n\nSatisfies: SRG-APP-000033-DB-000084, SRG-APP-000340-DB-000304","checkContent":"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.\n\nOne 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:\n\nSQL> SELECT * FROM sys.v_$option WHERE parameter = 'Oracle Database Vault';\n\nIf 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.\n\nIf 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.\n\nIf the access permitted and denied each type of user is inappropriate or incomplete, this is a finding.\n\nFollowing are code examples for reviewing roles, profiles, etc.\n\nFind out what role the users have:\n\nselect * from sys.cdb_role_privs where granted_role = '<role>'\n\nList all roles given to a user:\n\nselect * from sys.cba_role_privs where grantee = '<username>';\n\nList all roles for all users:\n\ncolumn grantee format a32\ncolumn granted_role format a32\nbreak on grantee\n\nSELECT con_id, grantee, granted_role\nFROM sys.cdb_role_privs\nORDER BY 1,2,3;\n\nUse the following query to list all privileges given to a user:\n\nSELECT LPAD(' ', 2*level) || granted_role \"User roles and privileges\"\nFROM (\n/* THE USERS */\nSELECT con_id, NULL AS grantee, username granted_role\nFROM sys.cdb_users\nWHERE username LIKE UPPER('<enter_username>')\n/* THE ROLES TO ROLES RELATIONS */\nUNION SELECT con_id, grantee, granted_role\nFROM sys.cdb_role_privs\n/* THE ROLES TO PRIVILEGE RELATIONS */\nUNION\nSELECT con_id, grantee, privilege\nFROM sys.cdb_sys_privs)\nSTART WITH grantee IS NULL\nCONNECT BY grantee = PRIOR granted_role;\n\nList which tables a certain role gives SELECT and READ access to using the query:\n\nSELECT * FROM sys.role_tab_privs WHERE role = '<role>'\nAND privilege IN ('READ', 'SELECT');\n\nList all tables a user can SELECT and READ from using the query:\n\nSELECT * FROM sys.cdb_tab_privs\nWHERE grantee ='<username>' AND privilege IN ('READ', 'SELECT');\n\nList 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.\n\nSELECT grantee,'Granted Through Role' as Grant_Type, role, table_name\nFROM CONTAINERS(sys.role_tab_privs) rtp, sys.cdb_role_privs crp\nWHERE rtp.role = crp.granted_role\nAND rtp.con_id = crp.con_id\nAND table_name = '<TABLENAME>'\nUNION\nSELECT grantee, 'Direct Grant' as Grant_Type, NULL AS role, table_name\nFROM sys.cdb_tab_privs\nWHERE table_name = '<TABLENAME>';","fixText":"If Oracle Database Vault is in use, use it to configure the correct access privileges for each type of user.\n\nIf Oracle Database Vault is not in use, configure the correct access privileges for each type of user using Roles and Profiles.\n\nOracle recommends using Database Vault.\n\nFor more information on the configuration of Database Vault, refer to the Database Vault Administrator's Guide:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/dvadm/database-vault-administrators-guide.pdf.","ccis":["CCI-000213","CCI-002235"]},{"vulnId":"V-270501","ruleId":"SV-270501r1167736_rule","severity":"low","ruleTitle":"Oracle Database must protect against an individual who uses a shared account falsely denying having performed a particular action.","description":"Nonrepudiation of actions taken is required to maintain application integrity. Examples of particular actions taken by individuals include creating information, sending a message, approving information (e.g., indicating concurrence or signing a contract), and receiving a message.\n\nNonrepudiation protects individuals against later claims by an author of not having authored a particular document, a sender of not having transmitted a message, a receiver of not having received a message, or a signatory of not having signed a document. \n\nAuthentication via shared accounts does not provide individual accountability for actions taken on the database management system (DBMS) or data. Whenever a single database account is used to connect to the database, a secondary authentication method that provides individual accountability is required. This scenario most frequently occurs when an externally hosted application authenticates individual users to the application and the application uses a single account to retrieve or update database information on behalf of the individual users.\n\nWhen shared accounts are used without another means of identifying individual users, users may deny having performed a particular action.\n\nThis calls for inspection of application source code, which requires collaboration with the application developers. In many cases, the database administrator (DBA) is organizationally separate from the application developers and may have limited, if any, access to source code. Nevertheless, protections of this type are so important to the secure operation of databases that they must not be ignored. At a minimum, the DBA must attempt to obtain assurances from the development organization that this issue has been addressed and must document what has been discovered.\n\nSatisfies: SRG-APP-000080-DB-000063, SRG-APP-000815-DB-000160","checkContent":"If there are no shared accounts available to more than one user, this is not a finding.\n\nReview database, application, and/or OS settings to determine whether users can be identified as individuals when using shared accounts. \n\nIf the individual user of a shared account cannot be identified, this is a finding.\n\nIf Standard Auditing is used:\nTo ensure 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:\n\nSHOW PARAMETER AUDIT_TRAIL\n\nOr run the following SQL query:\n\ncol display_value format a10\ncol default_value format a10\nSELECT inst_id, con_id, display_value, default_value, isdefault\nFROM sys.gv_$parameter WHERE name = 'audit_trail';\n\nIf the query returns the display_value \"NONE\", for any instance or container, this is a finding.\n\nIf Unified Auditing is used:\nTo 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 query:\n\ncol value format a10\nSELECT inst_id, con_id, value\nFROM sys.gv_$option\nWHERE parameter = 'Unified Auditing';\n\nIf the query returns something other than \"TRUE\", for any instance or container, this is a finding.","fixText":"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.\n\nModify applications and data tables that are not capturing individual user identity to do so.\n\nCreate and enforce the use of individual user IDs for logging on to Oracle tools and third-party products.\n\nIf Oracle auditing is not already enabled, enable it.\n\nIf Standard Auditing is used:\nIf Oracle (or third-party) auditing is not already enabled, enable it. For Oracle auditing, use this query:\n\nALTER SYSTEM SET AUDIT_TRAIL=<audit trail type> SID='*' SCOPE=SPFILE;\n\nAudit trail type can be 'OS', 'DB', 'DB,EXTENDED', 'XML' or 'XML,EXTENDED'.\n\nAfter executing this statement, it may be necessary to shut down and restart the Oracle database.\n\nIf Unified Auditing is used:\nLink the oracle binary with uniaud_on, and then restart the database. Oracle Database Upgrade Guide describes how to enable unified auditing.\n\nFor more information on the configuration of auditing, refer to the following documents:\n\n\"Auditing Database Activity\" in the Oracle Database 19c Security Guide:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html\n\n\"Monitoring Database Activity with Auditing\" in the Oracle Database Security Guide:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html\n\n\"DBMS_AUDIT_MGMT\" in the Oracle Database PL/SQL Packages and Types Reference:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/\n\nOracle Database Upgrade Guide:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/upgrd/index.html\n\nIf 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.\n\nIf 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.","ccis":["CCI-000166","CCI-004045"]},{"vulnId":"V-270502","ruleId":"SV-270502r1167738_rule","severity":"medium","ruleTitle":"Oracle Database must provide audit record generation capability for organization-defined auditable events within the database.","description":"Without the capability to generate audit records, it would be difficult to establish, correlate, and investigate the events relating to an incident or identify those responsible for one. \n\nAudit records can be generated from various components within the database management system (DBMS) (e.g., process, module). Certain specific application functionalities may be audited as well. The list of audited events is the set of events for which audits are to be generated. This set of events is typically a subset of the list of all events for which the system is capable of generating audit records.\n\nDOD has defined the list of events for which the DBMS will provide an audit record generation capability as the following: \n\n(i) Successful and unsuccessful attempts to access, modify, or delete privileges, security objects, security levels, or categories of information (e.g., classification levels);\n(ii) Access actions, such as successful and unsuccessful login attempts, privileged activities, or other system-level access, starting and ending time for user access to the system, concurrent logins from different workstations, successful and unsuccessful accesses to objects, all program initiations, and all direct access to the information system; and\n(iii) All account creation, modification, disabling, and termination actions.\n\nOrganizations may define additional events requiring continuous or ad hoc auditing.","checkContent":"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.\n\nIf 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.\n\nThe remainder of this Check is applicable specifically where Oracle auditing is in use.\n\nIf Standard Auditing is used:\nTo verify Oracle is configured to capture audit data, enter the following SQL*Plus command:\n\nSHOW PARAMETER AUDIT_TRAIL\n\nOr the following SQL query:\n\ncol display_value format a10\ncol default_value format a10\nSELECT inst_id, con_id, display_value, default_value, isdefault\nFROM sys.gv_$parameter WHERE name = 'audit_trail';\n\nIf Oracle returns the value \"NONE\", this is a finding.\n\nTo confirm 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.\n\nIf Unified Auditing is used:\nTo verify Oracle is configured to capture audit data, enter the following SQL*Plus command:\n\ncol value format a10\nSELECT inst_id, con_id, value\nFROM sys.gv_$option\nWHERE parameter = 'Unified Auditing';\n\nIf the query returns something other than \"TRUE\", this is a finding.\n\nTo confirm Oracle audit is capturing information on the required events, review the contents of the SYS.UNIFIED_AUDIT_TRAIL view.\n\nIf auditable events are not listed, this is a finding.","fixText":"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.\n\nIf using a third-party product, proceed in accordance with the product documentation. If using Oracle's capabilities, proceed as follows.\n\nIf Standard Auditing is used:\nUse this process to ensure auditable events are captured:\n\nALTER SYSTEM SET AUDIT_TRAIL=<audit trail type> SID='*' SCOPE=SPFILE;\n\nAudit trail type can be 'OS', 'DB', 'DB,EXTENDED', 'XML' or 'XML,EXTENDED'.\n\nAfter executing this statement, it may be necessary to shut down and restart the Oracle database.\n\nIf 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.\n\nIf Unified Auditing is used:\nUse this process to ensure auditable events are captured:\n\nLink the oracle binary with uniaud_on, and then restart the database. Oracle Database Upgrade Guide describes how to enable unified auditing.\nFor more information on the configuration of auditing, refer to the following documents:\n\n\"Auditing Database Activity\" in the Oracle Database 2 Day + Security Guide:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html\n\n\"Monitoring Database Activity with Auditing\" in the Oracle Database Security Guide: \nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/index.html\n\n\"DBMS_AUDIT_MGMT\" in the Oracle Database PL/SQL Packages and Types Reference:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/\n\nOracle Database Upgrade Guide:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/upgrd/index.html\n\nIf 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.","ccis":["CCI-000169"]},{"vulnId":"V-270503","ruleId":"SV-270503r1064787_rule","severity":"medium","ruleTitle":"Oracle Database must allow designated organizational personnel to select which auditable events are to be audited by the database.","description":"Without the capability to restrict which roles and individuals can select which events are audited, unauthorized personnel may be able to prevent or interfere with the auditing of critical events.\n\nSuppression of auditing could permit an adversary to evade detection.\n\nMisconfigured audits can degrade the system's performance by overwhelming the audit log. Misconfigured audits may also make it more difficult to establish, correlate, and investigate the events relating to an incident or identify those responsible for one.","checkContent":"Check database management system (DBMS) settings and documentation to determine whether designated personnel are able to select which auditable events are being audited. \n\nIf designated personnel are not able to configure auditable events, this is a finding.","fixText":"Configure the DBMS's settings to allow designated personnel to select which auditable events are audited.\n\nNote: 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.\n\nTo audit objects in another schema, the user must have the AUDIT ANY system privilege.\n\nTo audit system privileges, the user must have the AUDIT SYSTEM privilege.\n\nFor more information on the configuration of auditing, refer to the following documents:\n\n\"Monitoring Database Activity with Auditing\" in the Oracle Database Security Guide:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/part_6.html","ccis":["CCI-000171"]},{"vulnId":"V-270504","ruleId":"SV-270504r1167741_rule","severity":"medium","ruleTitle":"Oracle Database must generate audit records for the DOD-selected list of auditable events, when successfully accessed, added, modified, or deleted, to the extent such information is available.","description":"Audit records can be generated from various components within the information system, such as network interfaces, hard disks, modems, etc. From an application perspective, certain specific application functionalities may be audited, as well.\n\nThe list of audited events is the set of events for which audits are to be generated. This set of events is typically a subset of the list of all events for which the system is capable of generating audit records (i.e., auditable events, timestamps, source and destination addresses, user/process identifiers, event descriptions, success/fail indications, file names involved, and access control or flow control rules invoked).\n\nOrganizations may define the organizational personnel accountable for determining which application components must provide auditable events.\n\nAuditing provides accountability for changes made to the database management system (DBMS) configuration or its objects and data. It provides a means to discover suspicious activity and unauthorized changes. Without auditing, a compromise may go undetected and without a means to determine accountability.\n\nThe Department of Defense has established the following as the minimum set of auditable events:\n- When privileges/permissions are retrieved, added, modified or deleted.\n- When unsuccessful attempts to retrieve, add, modify, delete privileges/permissions occur.\n- Enforcement of access restrictions associated with changes to the configuration of the database(s).\n- When security objects are accessed, modified, or deleted.\n- When unsuccessful attempts to access, modify, or delete security objects occur.\n- When categories of information (e.g., classification levels/security levels) are accessed, created, modified, or deleted.\n- When unsuccessful attempts to access, create, modify, or delete categorized information occur.\n- All privileged activities or other system-level access.\n- When unsuccessful attempts to execute privileged activities or other system-level access occurs.\n- When successful or unsuccessful access to any other objects occur as specifically defined by the site.\n\nSatisfies: SRG-APP-000091-DB-000066, SRG-APP-000091-DB-000325, SRG-APP-000492-DB-000333, SRG-APP-000494-DB-000344, SRG-APP-000494-DB-000345, SRG-APP-000495-DB-000326, SRG-APP-000495-DB-000327, SRG-APP-000495-DB-000328, SRG-APP-000495-DB-000329, SRG-APP-000496-DB-000334, SRG-APP-000496-DB-000335, SRG-APP-000498-DB-000346, SRG-APP-000498-DB-000347, SRG-APP-000499-DB-000330, SRG-APP-000499-DB-000331, SRG-APP-000501-DB-000336, SRG-APP-000501-DB-000337, SRG-APP-000502-DB-000348, SRG-APP-000502-DB-000349, SRG-APP-000503-DB-000350, SRG-APP-000503-DB-000351, SRG-APP-000504-DB-000354, SRG-APP-000504-DB-000355, SRG-APP-000505-DB-000352, SRG-APP-000506-DB-000353, SRG-APP-000507-DB-000357, SRG-APP-000508-DB-000358","checkContent":"Check Oracle Database settings to determine if auditing is being performed on the DOD-required list of auditable events supplied in the discussion.\n\nIf Standard Auditing is used:\nTo verify Oracle is configured to capture audit data, enter the following SQL*Plus command:\n\nSHOW PARAMETER AUDIT_TRAIL\n\nOr the following SQL query:\n\ncol display_value format a10\ncol default_value format a10\nSELECT inst_id, con_id, display_value, default_value, isdefault\nFROM sys.gv_$parameter WHERE name = 'audit_trail';\n\nIf Oracle returns the value \"NONE\", this is a finding.\n\nTo confirm 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.\n\nIf Unified Auditing is used:\nTo verify Oracle is configured to capture audit data, enter the following SQL*Plus command:\n\ncol value format a10\nSELECT inst_id, con_id, value\nFROM sys.gv_$option\nWHERE parameter = 'Unified Auditing';\n\nIf Oracle returns a value something other than \"TRUE\", this is a finding.\n\nUnified 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.\n\nA 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.\n\nVerifying 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.\n\nSELECT policy_name\nFROM sys.audit_unified_policies\nWHERE audit_option = 'GRANT'\nAND audit_option_type= 'STANDARD ACTION';\n\n\nTo find policies that audit privilege grants on specific objects:\n\ncol policy_name format a20\ncol object_schema format a20\ncol object_name format a30\nSELECT policy_name, object_schema, object_name \nFROM sys.audit_unified_policies \nWHERE audit_option = 'GRANT'\nAND audit_option_type = 'OBJECT ACTION';\n\n\nThe 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.\n\ncol entity_name format a30\nSELECT policy_name, enabled_option, entity_name, success, failure\nFROM sys.audit_unified_enabled_policies;\n\nIf auditing is not being performed for all the events listed above, this is a finding.","fixText":"Both Standard and Unified Auditing are allowed in Oracle Database 19c.\nThe default is mixed auditing mode.\nThe predefined policy ORA_SECURECONFIG is enabled by default in mixed mode.\n\nConfigure the DBMS's auditing settings to include auditing of events on the DOD-selected list of auditable events.\n\n1. Successful attempts to access, modify, or delete privileges, security objects, security levels, or categories of information (e.g., classification levels).\n\nTo audit granting and revocation of any privilege:\nCREATE AUDIT POLICY <policy_name> ACTIONS GRANT;\nCREATE AUDIT POLICY <policy_name> ACTIONS REVOKE;\n\nTo audit grants of object privileges on a specific object:\nCREATE AUDIT POLICY <policy_name> ACTIONS GRANT ON <schema>.<object>;\n\nIf Oracle Label Security is enabled, this will audit all OLS administrative actions:\nCREATE AUDIT POLICY <policy_name> ACTIONS COMPONENT = OLS ALL;\n\n2. Successful and unsuccessful logon attempts, privileged activities or other system-level access.\n \nTo audit all user logon attempts:\nCREATE AUDIT POLICY <policy_name> ACTIONS LOGON;\n\nTo audit only logon attempts using administrative privileges (e.g., AS SYSDBA):\nAUDIT POLICY <policy_name> BY sys, sysoper, sysbackup, sysdg, syskm;\n\n3. Starting and ending time for user access to the system, concurrent logons from different workstations.\n\nThis 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:\n\nCREATE AUDIT POLICY <policy_name> ACTIONS logon, logoff;\n\n4. Successful and unsuccessful accesses to objects.\n\nTo audit all accesses to a specific table:\nCREATE AUDIT POLICY <policy_name> ACTIONS select, insert, delete, alter ON <schema>.<object>; \n\nDifferent actions are defined for other object types. To audit all supported actions on a specific object:\nCREATE AUDIT POLICY <policy_name> ACTIONS all ON <schema>.<object>;\n \n5. All program initiations.\n\nTo audit execution of any PL/SQL program unit:\nCREATE AUDIT POLICY <policy_name> ACTIONS execute;\n\nTo audit execution of a specific function, procedure, or package:\nCREATE AUDIT POLICY <policy_name> ACTIONS execute ON <schema>.<object>;\n\n6. All direct access to the information system.\n[Not applicable to Database audit. Monitor using OS auditing.]\n\n7. All account creations, modifications, disabling, and terminations.\n\nTo audit all user administration actions:\nCREATE AUDIT POLICY <policy_name> actions create user, alter user, drop user, change password;\n\n8. All kernel module loads, unloads, and restarts.\n[Not applicable to Database audit. Monitor using OS auditing.]\n \n9. All database parameter changes.\n\nTo audit any database parameter changes, dynamic or static:\nCREATE AUDIT POLICY <policy_name> ACTIONS alter database, alter system, create spfile;\n\nApplying the Policy:\n\nThe following command will enable the policy in all database sessions and audit both successful and unsuccessful actions:\nAUDIT POLICY <policy_name>;\n\nTo audit only unsuccessful actions, add the WHENEVER NOT SUCCESSFUL modifier:\nAUDIT POLICY <policy_name> WHENEVER NOT SUCCESSFUL;\n\nEither command above can be limited to only database sessions started by a specific user as follows:\nAUDIT POLICY <policy_name> BY <user>;\nAUDIT POLICY <policy_name> BY <user> WHENEVER NOT SUCCESSFUL;","ccis":["CCI-000172"]},{"vulnId":"V-270505","ruleId":"SV-270505r1167742_rule","severity":"medium","ruleTitle":"Oracle Database must include organization-defined additional, more detailed information in the audit records for audit events identified by type, location, or subject.","description":"Information system auditing capability is critical for accurate forensic analysis. Audit record content that may be necessary to satisfy the requirement of this control includes timestamps, source and destination addresses, user/process identifiers, event descriptions, success/fail indications, file names involved, and access control or flow control rules invoked.\n\nIn addition, the application must have the capability to include organization-defined additional, more detailed information in the audit records for audit events. These events may be identified by type, location, or subject.\n\nAn example of detailed information the organization may require in audit records is full-text recording of privileged commands or the individual identities of shared account users.\n\nSome organizations may determine that more detailed information is required for specific database event types. If this information is not available, it could negatively impact forensic investigations into user actions or other malicious events.","checkContent":"Review the system documentation to identify 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.\n\nIf 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:\n\nSELECT COUNT(*)\nFROM audsys.unified_audit_trail\nWHERE audit_type = 'FineGrainedAudit';\n\nIf any such auditable event is not covered by the existing FGA specifications, this is a finding.","fixText":"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.\n\nFor more information on the configuration of fine-grained auditing, refer to the following documents:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-audit-policies.html#GUID-88DA3AF8-5F6A-4C6E-80EE-F65071E5BF46.","ccis":["CCI-000135"]},{"vulnId":"V-270506","ruleId":"SV-270506r1167744_rule","severity":"medium","ruleTitle":"Oracle Database must allocate audit record storage capacity in accordance with organization-defined audit record storage requirements.","description":"To ensure sufficient storage capacity for the audit logs, Oracle Database must be able to allocate audit record storage capacity. Although another requirement (SRG-APP-000515-DB-000318) mandates audit data be off-loaded to a centralized log management system, it remains necessary to provide space on the database server to serve as a buffer against outages and capacity limits of the off-loading mechanism.\n\nThe task of allocating audit record storage capacity is usually performed during initial installation of the database management system (DBMS) and is closely associated with the database administrator (DBA) and system administrator roles. The DBA or system administrator will usually coordinate the allocation of physical drive space with the application owner/installer and the application will prompt the installer to provide the capacity information, the physical location of the disk, or both.\n\nIn determining the capacity requirements, consider such factors as: total number of users; expected number of concurrent users during busy periods; number and type of events being monitored; types and amounts of data being captured; the frequency/speed with which audit records are off-loaded to the central log management system; and any limitations that exist on the DBMS's ability to reuse the space formerly occupied by off-loaded records.","checkContent":"Review the 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.\n\nIf file-based auditing is in use, check that sufficient space is available to support the file(s). If not, this is a finding.\n\nIf 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$. \n\nsqlplus connect as sysdba\n\nSELECT table_name, tablespace_name\nFROM dba_tables\nWHERE table_name IN ('AUD$')\nORDER BY table_name;\n\nTABLE_NAME                     TABLESPACE_NAME\n-----------------------------  ------------------------------\nAUD$                           SYSTEM\n\nThe AUD$ table should be in its own tablespace. If the tablespace name is SYSTEM, this is a finding.\n\nCheck the current location of the audit trail tables:\n\nSELECT inst_id, con_id, name, value\nFROM sys.gv_$parameter\nWHERE name IN ('audit_file_dest', 'unified_audit_systemlog');\n\nVerify adequate space is allocated for the audit trail location.\n\nIf Unified Auditing is used:\n\nAudit logs are written to tables in the AUDSYS schema. The default tablespace for AUDSYS is USERS, and it should be in its own tablespace.\n \nIf the tablespace name is USERS, this is a finding. \n\nInvestigate whether there have been any incidents where the 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.","fixText":"Allocate sufficient audit file/table space to support peak demand.\n\nIf audit records are being written to the table sys.aud$, create a new tablespace dedicated to the AUD$ table and move AUD$ using the statement below:\n\nexec sys.dbms_audit_mgmt.move_dbaudit_tables('<tablespace_name>');\n\nEnsure 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.\n\nDetailed procedures for how to alter the tablespace for audit logs can be found here:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ALTER-TABLESPACE.html.","ccis":["CCI-001849"]},{"vulnId":"V-270507","ruleId":"SV-270507r1065200_rule","severity":"medium","ruleTitle":"Oracle Database must off-load audit data to a separate log management facility; this must be continuous and in near-real-time for systems with a network connection to the storage facility, and weekly or more often for stand-alone systems.","description":"Information stored in one location is vulnerable to accidental or incidental deletion or alteration.\n\nOff-loading is a common process in information systems with limited audit storage capacity. \n\nThe database management system (DBMS) may write audit records to database tables, files in the file system, other kinds of local repositories, or a centralized log management system. Whatever the method used, it must be compatible with off-loading the records to the centralized system.","checkContent":"Review the system documentation for a description of how audit records are off-loaded.\n\nIf there is no centralized audit log management system, for the audit data to be written to, this is a finding.\n\nIf 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.\n\nIf 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.","fixText":"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.\n\nConsider 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.\n\nOracle 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.","ccis":["CCI-001851"]},{"vulnId":"V-270508","ruleId":"SV-270508r1065201_rule","severity":"medium","ruleTitle":"The Oracle Database, or the logging or alerting mechanism the application uses, must provide a warning when allocated audit record storage volume record storage volume reaches 75 percent of maximum audit record storage capacity.","description":"Organizations are required to use a central log management system, so, under normal conditions, the audit space allocated to the database management system (DBMS) on its own server will not be an issue. However, space will still be required on the DBMS server for audit records in transit, and, under abnormal conditions, this could fill up. Since a requirement exists to halt processing upon audit failure, a service outage would result.\n\nIf support personnel are not notified immediately upon storage volume usage reaching 75 percent, they are unable to plan for storage capacity expansion. \n\nThe appropriate support staff include, at a minimum, the information system security officer (ISSO) and the database administrator (DBA)/system administrator (SA).","checkContent":"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.\n\nIf no warning will be provided, this is a finding.","fixText":"Modify DBMS, OS, or third-party logging application settings to alert appropriate personnel when 75 percent of log storage capacity is reached.\n\nFor ease of management, it is recommended that the audit tables be kept in a dedicated tablespace.\n\nIf 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.\n\nIf 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.\n\nsqlplus connect as sysdba\n\nset pagesize 300\nset linesize 120\ncolumn sumb format 9,999,999,999,999\ncolumn extents format 999999\ncolumn bytes format 9,999,999,999,999\ncolumn largest format 9,999,999,999,999\ncolumn Tot_Size format 9,999,999,999,999\ncolumn Tot_Free format 9,999,999,999,999\ncolumn Pct_Free format 9,999,999,999,999\ncolumn Chunks_Free format 9,999,999,999,999\ncolumn Max_Free format 9,999,999,999,999\nset echo off\nspool TSINFO.txt\nPROMPT SPACE AVAILABLE IN TABLESPACES\nselect a.tablespace_name,sum(a.tots) Tot_Size,\nsum(a.sumb) Tot_Free,\nsum(a.sumb)*100/sum(a.tots) Pct_Free, \nsum(a.largest) Max_Free,sum(a.chunks) Chunks_Free\nfrom\n(\nselect tablespace_name,0 tots,sum(bytes) sumb,\nmax(bytes) largest,count(*) chunks\nfrom dba_free_space a\ngroup by tablespace_name\nunion\nselect tablespace_name,sum(bytes) tots,0,0,0 from\ndba_data_files\ngroup by tablespace_name) a\ngroup by a.tablespace_name;\n\nSample Output\n\nSPACE AVAILABLE IN TABLESPACES\n\nTABLESPACE_NAME     TOT_SIZE     TOT_FREE     PCT_FREE     MAX_FREE    CHUNKS_FREE\n-----------------------------      --------------     --------------     ---------------    ----------------    --------------------- \nDES2                                   41,943,040      30,935,040             74             30,935,040                   1 \nDES2_I                               31,457,280       23,396,352             74             23,396,352                   1 \nRBS                                     60,817,408       57,085,952             94             52,426,752                16 \nSYSTEM                             94,371,840        5,386,240                6               5,013,504                  3 \nTEMP                                       563,200           561,152            100                  133,120                  5 \nTOOLS                              120,586,240      89,407,488              74             78,190,592                12 \nUSERS                                  1,048,576             26,624                 3                   26,624                   1","ccis":["CCI-001855"]},{"vulnId":"V-270509","ruleId":"SV-270509r1065202_rule","severity":"medium","ruleTitle":"Oracle Database must provide an immediate real-time alert to appropriate support staff of all audit log failures.","description":"It is critical for the appropriate personnel to be aware if a system is at risk of failing to process audit logs as required. Without a real-time alert, security personnel may be unaware of an impending failure of the audit capability, and system operation may be adversely affected. \n\nThe appropriate support staff include, at a minimum, the information system security officer (ISSO) and the database administrator (DBA)/system administrator (SA).\n\nA failure of database auditing will result in either the database continuing to function without auditing or in a complete halt to database operations. When audit processing fails, appropriate personnel must be alerted immediately to avoid further downtime or unaudited transactions.\n\nAlerts provide organizations with urgent messages. Real-time alerts provide these messages immediately (i.e., the time from event detection to alert occurs in seconds or less).\n\nIf Oracle Enterprise Manager is in use, the capability to issue such an alert is built in and configurable via the console so an alert can be sent to a designated administrator.","checkContent":"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.\n\nIf real-time alerts are not sent upon auditing failure, this is a finding.","fixText":"Configure logging software to send a real-time alert to appropriate personnel when auditing fails for any reason.\n\nOracle recommends the use of Oracle Enterprise Manager.","ccis":["CCI-001858"]},{"vulnId":"V-270510","ruleId":"SV-270510r1068294_rule","severity":"medium","ruleTitle":"The audit information produced by the Oracle Database must be protected from unauthorized access, modification, or deletion.","description":"If audit data were to become compromised, then competent forensic analysis and discovery of the true source of potentially malicious system activity is difficult, if not impossible, to achieve. In addition, access to audit records provides information an attacker could potentially use to his or her advantage.\n\nTo ensure the veracity of audit data, the information system and/or the application must protect audit information from any and all unauthorized access. This includes read, write, copy, etc.\n\nThis requirement can be achieved through multiple methods which will depend upon system architecture and design. Some commonly employed methods include ensuring log files enjoy the proper file system permissions using file system protections and limiting log data location.\n\nAdditionally, applications with user interfaces to audit records must not allow for the unfettered manipulation of or access to those records via the application. If the application provides access to the audit data, the application becomes accountable for ensuring that audit information is protected from unauthorized access.\n\nAudit information includes all information (e.g., audit records, audit settings, and audit reports) needed to successfully audit information system activity.\n\nModification or deletion of database audit data could mask the theft of, or the unauthorized modification of, sensitive data stored in the database.\n\nSatisfies: SRG-APP-000118-DB-000059, SRG-APP-000119-DB-000060, SRG-APP-000120-DB-000061","checkContent":"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.\n\nIf appropriate controls and permissions do not exist, this is a finding.\n\n- - - - -\nFrom SQL*Plus or SQL Developer:\n\nselect value from v$parameter where name = 'audit_trail';\nselect value from v$parameter where name = 'audit_file_dest';\n\nIf audit_trail is set to OS, XML or XML EXTENDED, this means logs are stored at the operating system level.\n\nIf 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.\n\nIf audit_trail is set to DB or \"DB, EXTENDED\" this means logs are stored in the database.\n\nIf any logs are written to the database, DBA_TAB_PRIVS describes all object grants in the database. \n\nIf standard auditing is in use, follow the below, check permissions on the AUD$ table. \n\nsqlplus connect as sysdba;\n\nSQL> SELECT GRANTEE, TABLE_NAME, PRIVILEGE\nFROM DBA_TAB_PRIVS where table_name = 'AUD$';\n\nIf Unified Auditing is used, check permissions on the AUDSYS tables.\n\nsqlplus connect as sysdba;\n\nSQL> SELECT GRANTEE, TABLE_NAME, PRIVILEGE\nFROM DBA_TAB_PRIVS where owner='AUDSYS';\n\nIf appropriate controls and permissions are not implemented, this is a finding.\n\nIf audit logs located at the operating system level:\nOn Unix Systems:\n\n  ls -ld [pathname]\n\nSubstitute [pathname] with the directory paths listed from the above SQL statements for audit_file_dest.\n\nIf permissions are granted for world access, this is a finding.\n\nIf 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.\n\nOn Windows Systems (from Windows Explorer):\n\nBrowse 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.\n\nSelect and right-click on the directory >> Properties >> Security tab.\n\nIf permissions are granted to everyone, this is a finding.\n\nIf any accounts other than the administrators, software owner accounts, DBAs, auditors, Oracle processes, or any account not listed as authorized, this is a finding.\n\nCompare path to %ORACLE_HOME%. If audit_file_dest is a subdirectory of %ORACLE_HOME%, this is a finding.","fixText":"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.\n\nLogs are stored in the database:\nFor Standard Auditing, Revoke access to the AUD$ table to anyone who should not have access to it.\nFor Unified Auditing, Revoke access to the tables with AUDSYS as the owner.\n\nUse the REVOKE statement to remove permissions from a specific user or from all users to perform actions on database objects.\n\nREVOKE privilege-type ON [ TABLE ] { table-Name | view-Name } FROM grantees\n\nUse 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.\n\nUse the DELETE privilege type to revoke permission to delete rows from the specified table.\n\nUse the INSERT privilege type to revoke permission to insert rows into the specified table.\n\nUse 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.\n\nUse 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.\n\nUse the TRIGGER privilege type to revoke permission to create a trigger on the specified table.\n\nUse 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.\n\nFor file-based/OS level auditing, establish an audit file directory separate from the Oracle Home.\n\nAlter 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.\n\nAuthorize and document user access requirements to the directory outside of the Oracle, DBA, and SA account list in the system documentation.","ccis":["CCI-000162","CCI-000163","CCI-000164"]},{"vulnId":"V-270511","ruleId":"SV-270511r1065262_rule","severity":"medium","ruleTitle":"The system must protect audit tools from unauthorized access, modification, or deletion.","description":"Protecting audit data also includes identifying and protecting the tools used to view and manipulate log data.\n\nDepending upon the log format and application, system and application log tools may provide the only means to manipulate and manage application and system log data. It is, therefore, imperative that access to audit tools be controlled and protected from unauthorized access.\n\nApplications providing tools to interface with audit data will leverage user permissions and roles identifying the user accessing the tools and the corresponding rights the user enjoys in order make access decisions regarding the access to audit tools.\n\nAudit tools include, but are not limited to, OS-provided audit tools, vendor-provided audit tools, and open source audit tools needed to successfully view and manipulate audit information system activity and records.\n\nIf an attacker were to gain access to audit tools, he could analyze audit logs for system weaknesses or weaknesses in the auditing itself. An attacker could also manipulate logs to hide evidence of malicious activity.\n\nSatisfies: SRG-APP-000121-DB-000202, SRG-APP-000122-DB-000203, SRG-APP-000123-DB-000204","checkContent":"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.\n\nIf appropriate permissions and access controls are not applied to prevent unauthorized access, modification, or deletion of these tools, this is a finding.","fixText":"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.","ccis":["CCI-001493","CCI-001494","CCI-001495"]},{"vulnId":"V-270512","ruleId":"SV-270512r1065305_rule","severity":"medium","ruleTitle":"Oracle Database must support enforcement of logical access restrictions associated with changes to the database management system (DBMS) configuration and to the database itself.","description":"Failure to provide logical access restrictions associated with changes to configuration may have significant effects on the overall security of the system. \n\nWhen dealing with access restrictions pertaining to change control, it should be noted that any changes to the hardware, software, and/or firmware components of the information system can potentially have significant effects on the overall security of the system. \n\nAccordingly, only qualified and authorized individuals should be allowed to obtain access to system components for the purposes of initiating changes, including upgrades and modifications.","checkContent":"Review access restrictions associated with changes to the configuration of the DBMS or database(s).\n\nOn Unix Systems:\nls -ld [pathname]\n\nReplace [pathname] with the directory path where the Oracle Database software is installed (e.g., /u01/app/oracle/product/19.0.0/dbhome_1).\n\nIf permissions are granted for world access, this is a finding.\n\nIf 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.\n\nFor Windows Systems:\nReview the permissions that control access to the Oracle installation software directories (e.g., \\Program Files\\Oracle\\).\n\nIf access is given to members other than the software owner account, DBAs, or any accounts not listed as authorized, this is a finding.\n\nCompare the access control employed with that documented in the system documentation.\n\nIf access does not match the documented requirement, this is a finding.","fixText":"For Unix Systems:\nSet the umask of the Oracle software owner account to 022. Determine the shell being used for the Oracle software owner account:\n\n  env | grep -i shell\n\nStartup files for each shell are as follows (located in users $HOME directory):\n\n  C-Shell (CSH) = .cshrc\n  Bourne Shell (SH) = .profile\n  Korn Shell (KSH) = .kshrc\n  TC Shell (TCS) = .tcshrc\n  BASH Shell = .bash_profile or .bashrc\n\nEdit the shell startup file for the account and add or modify the line:\n\n  umask 022\n\nLog off and log on, then enter the umask command to confirm the setting.\n\nNote: To effect this change for all Oracle processes, a reboot of the DBMS server may be required.\n\nFor Windows Systems:\nRestrict access to the DBMS software libraries to the fewest accounts that clearly require access based on job function.\n\nDocument authorized access controls and justify any access grants that do not fall under DBA, DBMS process, ownership, or system administrator (SA) accounts.","ccis":["CCI-001813"]},{"vulnId":"V-270513","ruleId":"SV-270513r1138543_rule","severity":"high","ruleTitle":"Oracle Database products must be a version supported by the vendor.","description":"Unsupported commercial and database systems should not be used because fixes to newly identified bugs will not be implemented by the vendor. The lack of support can result in potential vulnerabilities. Systems at unsupported servicing levels or releases will not receive security updates for new vulnerabilities, which leaves them subject to exploitation.\n\nWhen maintenance updates and patches are no longer available, the database software is no longer considered supported and should be upgraded or decommissioned.","checkContent":"Review the system documentation and interview the database administrator.\n\nIdentify all database software components.\n\nReview the version and release information.\n\nFrom SQL*Plus:\nSelect version from v$instance;\n\nAccess the vendor website or use other means to verify the version is still supported.\nOracle Release schedule:\nhttps://support.oracle.com/knowledge/Oracle%20Database%20Products/742060_1.html\n\nIf the Oracle version or any of the software components are not supported by the vendor, this is a finding.","fixText":"Remove or decommission all unsupported software products.\n\nUpgrade unsupported DBMS or unsupported components to a supported version of the product.","ccis":["CCI-003376"]},{"vulnId":"V-270514","ruleId":"SV-270514r1064820_rule","severity":"medium","ruleTitle":"Database software, applications, and configuration files must be monitored to discover unauthorized changes.","description":"If the system were to allow any user to make changes to software libraries, then those changes might be implemented without undergoing the appropriate testing and approvals that are part of a robust change management process.\n\nAccordingly, only qualified and authorized individuals must be allowed to obtain access to information system components for purposes of initiating changes, including upgrades and modifications.\n\nUnmanaged changes that occur to the database software libraries or configuration can lead to unauthorized or compromised installations.","checkContent":"Review monitoring procedures and implementation evidence to verify that monitoring of changes to database software libraries, related applications, and configuration files is done.\n\nVerify that the list of files and directories being monitored is complete. If monitoring does not occur or is not complete, this is a finding.","fixText":"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.\n\nFile hashes or checksums should be used for comparisons since file dates may be manipulated by malicious users.","ccis":["CCI-001499"]},{"vulnId":"V-270515","ruleId":"SV-270515r1065210_rule","severity":"medium","ruleTitle":"The OS must limit privileges to change the database management system (DBMS) software resident within software libraries (including privileged programs).","description":"If the system were to allow any user to make changes to software libraries, then those changes might be implemented without undergoing the appropriate testing and approvals that are part of a robust change management process.\n\nAccordingly, only qualified and authorized individuals must be allowed to obtain access to information system components for purposes of initiating changes, including upgrades and modifications.\n\nUnmanaged changes that occur to the database software libraries or configuration can lead to unauthorized or compromised installations.","checkContent":"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.\n\nTypically, 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.\n\nBelow is one example for how to review accounts with access to software libraries for a Linux-based system:\ncat /etc/group |grep -i dba\n--Example output:\ndba:x:102: \n\n--take above number and input in below grep command\ncat /etc/passwd |grep 102\n\nIf 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.","fixText":"Restrict access to the DBMS software libraries to accounts that require access based on job function.","ccis":["CCI-001499"]},{"vulnId":"V-270516","ruleId":"SV-270516r1064826_rule","severity":"high","ruleTitle":"The Oracle Database software installation account must be restricted to authorized users.","description":"When dealing with change control issues, it should be noted any changes to the hardware, software, and/or firmware components of the information system and/or application can have significant effects on the overall security of the system. \n\nIf the system were to allow any user to make changes to software libraries, then those changes might be implemented without undergoing the appropriate testing and approvals that are part of a robust change management process.\n\nAccordingly, only qualified and authorized individuals must be allowed access to information system components for purposes of initiating changes, including upgrades and modifications.\n\nDatabase administrator (DBA) and other privileged administrative or application owner accounts are granted privileges that allow actions that can have a great impact on database security and operation. It is especially important to grant privileged access to only those persons who are qualified and authorized to use them.\n\nThis requirement is particularly important because Oracle equates the installation account with the SYS account - the super-DBA. Once logged on to the operating system, this account can connect to the database AS SYSDBA without further authentication. It is very powerful and, by virtue of not being linked to any one person, cannot be audited to the level of the individual.","checkContent":"Review procedures for controlling and granting access to use of the database management system (DBMS) software installation account.\n\nIf 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.","fixText":"Develop, document, and implement procedures to restrict use of the DBMS software installation account.","ccis":["CCI-001499"]},{"vulnId":"V-270517","ruleId":"SV-270517r1064829_rule","severity":"medium","ruleTitle":"Database software directories, including database management system (DBMS) configuration files, must be stored in dedicated directories, or DASD pools, separate from the host OS and other applications.","description":"When dealing with change control issues, it should be noted, any changes to the hardware, software, and/or firmware components of the information system and/or application can potentially have significant effects on the overall security of the system.\n\nMultiple applications can provide a cumulative negative effect. A vulnerability and subsequent exploit to one application can lead to an exploit of other applications sharing the same security context. For example, an exploit to a web server process that leads to unauthorized administrative access to host system directories can most likely lead to a compromise of all applications hosted by the same system. Database software not installed using dedicated directories both threatens and is threatened by other hosted applications. Access controls defined for one application may by default provide access to the other application's database objects or directories. Any method that provides any level of separation of security context assists in the protection between applications.","checkContent":"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.\n\nIf any of the directories are used by other applications, including third-party applications that use the DBMS, this is a finding.\n\nOnly 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.\n\nFor databases located on mainframes, confirm that the database and its configuration files are isolated in their own DASD pools.\n\nIf database software and database configuration files share DASD with other applications, this is a finding.","fixText":"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.\n\nFor mainframe-based databases, locate database software and configuration files in separate DASD pools from other mainframe applications.","ccis":["CCI-001499"]},{"vulnId":"V-270518","ruleId":"SV-270518r1064832_rule","severity":"medium","ruleTitle":"Database objects must be owned by accounts authorized for ownership.","description":"Within the database, object ownership implies full privileges to the owned object including the privilege to assign access to the owned objects to other subjects. Unmanaged or uncontrolled ownership of objects can lead to unauthorized object grants and alterations, and unauthorized modifications to data. \n\nIf critical tables or other objects rely on unauthorized owner accounts, these objects can be lost when an account is removed.\n\nIt may be the case that there are accounts that are authorized to own synonyms, but no other objects. If this is so, it should be documented.","checkContent":"Review system documentation to identify accounts authorized to own database objects. Review accounts in the database management systems (DBMSs) that own objects.\n\nIf any database objects are found to be owned by users not authorized to own database objects, this is a finding.\n\n- - - - -\nQuery 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.\n\nsqlplus connect as sysdba\n\nSQL>select owner, object_type, count(*) from dba_objects\ngroup by owner, object_type\norder by owner, object_type;\n\nIf 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.\n\nSQL>select * from dba_objects where owner =&unauthorized_owner;","fixText":"Update system documentation to include list of accounts authorized for object ownership.\n\nReassign ownership of authorized objects to authorized object owner accounts.","ccis":["CCI-001499"]},{"vulnId":"V-270519","ruleId":"SV-270519r1112463_rule","severity":"medium","ruleTitle":"The role(s)/group(s) used to modify database structure (including but not necessarily limited to tables, indexes, storage, etc.) and logic modules (stored procedures, functions, triggers, links to software external to the DBMS, etc.) must be restricted to authorized users.","description":"If the database management system (DBMS) were to allow any user to make changes to database structure or logic, then those changes might be implemented without undergoing the appropriate testing and approvals that are part of a robust change management process.\n\nAccordingly, only qualified and authorized individuals must be allowed to obtain access to information system components for purposes of initiating changes, including upgrades and modifications.\n\nUnmanaged changes that occur to the database software libraries or configuration can lead to unauthorized or compromised installations.","checkContent":"Review accounts for direct assignment of administrative privileges. Connected as SYSDBA, run the query:\n\nSELECT grantee, privilege\nFROM dba_sys_privs\nWHERE grantee IN \n(\nSELECT username\nFROM dba_users\nWHERE username NOT IN \n(\n'XDB', 'SYSTEM', 'SYS', 'LBACSYS',\n'DVSYS', 'DVF', 'SYSMAN_RO',\n'SYSMAN_BIPLATFORM', 'SYSMAN_MDS',\n'SYSMAN_OPSS', 'SYSMAN_STB', 'DBSNMP',\n'SYSMAN', 'APEX_040200', 'WMSYS',\n'SYSDG', 'SYSBACKUP', 'SPATIAL_WFS_ADMIN_USR',\n'SPATIAL_CSW_ADMIN_US', 'GSMCATUSER',\n'OLAPSYS', 'SI_INFORMTN_SCHEMA',\n'OUTLN', 'ORDSYS', 'ORDDATA', 'OJVMSYS',\n'ORACLE_OCM', 'MDSYS', 'ORDPLUGINS',\n'GSMADMIN_INTERNAL', 'MDDATA', 'FLOWS_FILES',\n'DIP', 'CTXSYS', 'AUDSYS',\n'APPQOSSYS', 'APEX_PUBLIC_USER', 'ANONYMOUS',\n'SPATIAL_CSW_ADMIN_USR', 'SYSKM',\n'SYSMAN_TYPES', 'MGMT_VIEW',\n'EUS_ENGINE_USER', 'EXFSYS', 'SYSMAN_APM'\n)\n)\nAND privilege NOT IN ('UNLIMITED TABLESPACE'\n, 'REFERENCES', 'INDEX', 'SYSDBA', 'SYSOPER', 'CREATE SESSION'\n)\nORDER BY 1, 2;\n\nIf any administrative privileges have been assigned directly to a database account, this is a finding.\n\nThe 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.","fixText":"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.","ccis":["CCI-001499"]},{"vulnId":"V-270520","ruleId":"SV-270520r1115964_rule","severity":"medium","ruleTitle":"Oracle Database must be configured in accordance with the security configuration settings based on DOD security configuration and implementation guidance, including STIGs, NSA configuration guides, CTOs, DTMs, and IAVMs.","description":"Configuring the database management system (DBMS) to implement organizationwide security implementation guides and security checklists ensures compliance with federal standards and establishes a common security baseline across DOD that reflects the most restrictive security posture consistent with operational requirements. In addition to this SRG, sources of guidance on security and information assurance exist. These include NSA configuration guides, CTOs, DTMs, and IAVMs. Oracle Database must be configured in compliance with guidance from all such relevant sources, with specific emphasis on the database security standards of each organization.","checkContent":"Oracle Database Security Assessment Tool (DBSAT) provides prioritized recommendations on how to mitigate identified security risks or gaps within Oracle Databases.\n\nWith DBSAT, DISA STIG rules that are process-related, such as review system documentation to identify accounts authorized to own database objects, are now included, and marked as \"Evaluate\" and display details that help customers validate compliance. DBSAT automates the STIG checks whenever possible, and if the checks are process-related, DBSAT provides visibility so they can be  tracked and manually validated.\n\nDownload the latest version of the Oracle Database Security Assessment Tool (DBSAT). DBSAT is provided by Oracle at no additional cost:\nhttps://www.oracle.com/database/technologies/security/dbsat.html\n\nDBSAT 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. \n\nIn addition, to the Oracle database STIG checks, DBSAT helps identify areas where your database configuration, operation, or implementation introduces risks and recommends changes and controls to mitigate those risks according Oracle database security best practices.\n\nIf there is evidence that the DBSAT tool is not used with the output reviewed regularly (annually), this is a finding.","fixText":"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.","ccis":["CCI-000366"]},{"vulnId":"V-270521","ruleId":"SV-270521r1112467_rule","severity":"medium","ruleTitle":"Oracle instance names must not contain Oracle version numbers.","description":"Service names may be discovered by unauthenticated users. If the service name includes version numbers or other database product information, a malicious user may use that information to develop a targeted attack.","checkContent":"If using a non-CDB database:\n\nFrom SQL*Plus:\n\nselect instance_name, version from v$instance;\n\nIf using a CDB database:\n\nTo check the container database (CDB):\n\nFrom SQL*Plus:\n\nselect instance_name, version from v$instance;\n\nTo check the pluggable databases (PDBs) within the CDB:\n\nselect name from v$pdbs;\n\nCheck Instance Name:\n\nIf the instance name returned references the Oracle release number, this is a finding.\n\nNumbers used that include version numbers by coincidence are not a finding.\n\nThe database administrator (DBA) should be able to relate the significance of the presence of a digit in the SID.","fixText":"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.","ccis":["CCI-000366"]},{"vulnId":"V-270522","ruleId":"SV-270522r1115956_rule","severity":"medium","ruleTitle":"Fixed user and PUBLIC Database links must be authorized for use.","description":"Database links define connections that may be used by the local Oracle database to access remote Oracle databases (homogenous links) and non-Oracle Databases (heterogeneous links). These links provide a means for a compromise to the local database to spread to remote databases and for a compromise of a remote database to the local database in a distributed database environment. Limiting or eliminating the use of database links, where they are not required to support the operational system, can help isolate compromises, mitigate risk, and reduce the potential attack surface.","checkContent":"If using a non-CDB database:\nUse the following query to get a list of database links.\n\nFrom SQL*Plus:\n\nselect owner||': '||db_link from dba_db_links;\n\nIf using a CDB database:\nUse the following query to get a list of database links.\n\nselect con_id_to_con_name(con_id) con_id, owner, db_link, username, host from cdb_db_links order by 1,2,3;\n\nCheck Results:\n\nIf no rows are returned from the first SQL statement, this check is not a finding.\n\nIf there are rows returned, verify the database links are required. If they are required and exist, this is not a finding.","fixText":"Document all authorized connections from the database to remote databases.\n\nRemove all unauthorized remote database connection definitions from the database.\n\nFrom SQL*Plus:\n\ndrop database link [link name];\nOR\ndrop public database link [link name];\n\nReview remote database connection definitions periodically and confirm their use is still required and authorized.","ccis":["CCI-000366"]},{"vulnId":"V-270523","ruleId":"SV-270523r1167746_rule","severity":"medium","ruleTitle":"The Oracle WITH GRANT OPTION privilege must be limited when granted to nondatabase administrator (DBA) or nonapplication administrator user accounts.","description":"Specifying WITH GRANT OPTION enables the grantee to grant the object privileges to other users and roles. An account permission to grant privileges within the database is an administrative function. Minimizing the number and privileges of administrative accounts reduces the chances of privileged account exploitation. Application user accounts limit WITH GRANT OPTION privileges since, by definition, they require only privileges to execute procedures or view/edit data.","checkContent":"Execute the query:\n\nselect grantee||': '||owner||'.'||table_name\nfrom dba_tab_privs \nwhere grantable = 'YES' \nand grantee not in (select distinct owner from dba_objects)\nand grantee not in (select grantee from dba_role_privs where granted_role = 'DBA')\nand table_name not like 'SYS_PLSQL_%'\norder by grantee;\n\nIf any accounts are listed, verify accounts are documented and approved for the WITH GRANT option.\nIf non-DBA interactive user or application accounts have WITH GRANT without being documented and approved, this is a finding.","fixText":"Revoke privileges granted the WITH GRANT OPTION from non-DBA and accounts that do not own application objects or document the need for WITH GRANT OPTION and get approval.\n\nRe-grant privileges without specifying WITH GRANT OPTION.\n\nNote: Do not revoke the system-generated grants such as those found on SYS_PLSQL_% objects. They are system generated object types (aka ShadowTypes), 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.","ccis":["CCI-000366"]},{"vulnId":"V-270524","ruleId":"SV-270524r1112471_rule","severity":"medium","ruleTitle":"The Oracle REMOTE_OS_ROLES parameter must be set to FALSE.","description":"Setting REMOTE_OS_ROLES to TRUE allows operating system groups to control Oracle roles. The default value of FALSE causes roles to be identified and managed by the database. If REMOTE_OS_ROLES is set to TRUE, a remote user could impersonate another operating system user over a network connection. \n \nDOD requires the REMOTE_OS_ROLES to be set to FALSE.","checkContent":"To verify the current status of the remote_os_roles parameter use the SQL statement: \n\nIf using a non-CDB database:\n\nFrom SQL*Plus:\n \nCOLUMN name format a20 \nCOLUMN parameter_value format a20 \n\nSELECT name, con_id, value AS PARAMETER_VALUE \nFROM sys.v_$parameter \nWHERE vp.name = 'remote_os_roles' \nORDER BY 1; \n\nIf the PARAMETER_VALUE is not FALSE, that is a finding.\n\nIf using a CDB database:\n\nFrom SQL*Plus (in the CDB database):\n \nCOLUMN name format a20 \nCOLUMN parameter_value format a20 \n\nSELECT name, inst_id, con_id, value AS PARAMETER_VALUE \nFROM sys.gv_$parameter \t\nWHERE vp.name = 'remote_os_roles' \nORDER BY 1; \n\nIn the CDB database, if the PARAMETER_VALUE is not FALSE, that is a finding.","fixText":"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. \n\nALTER SYSTEM SET remote_os_roles = FALSE scope=spfile; \n\nsid='container_name' is optional \n\nRestart the database for the change to take effect.","ccis":["CCI-000366"]},{"vulnId":"V-270525","ruleId":"SV-270525r1112473_rule","severity":"medium","ruleTitle":"The Oracle SQL92_SECURITY parameter must be set to TRUE.","description":"The configuration option SQL92_SECURITY specifies whether table-level SELECT privileges are required to execute an update or delete those references table column values. If this option is disabled (set to FALSE), the UPDATE privilege can be used to determine values that should require SELECT privileges.\n\nThe SQL92_SECURITY setting of TRUE prevents the exploitation of user credentials with only DELETE or UPDATE privileges on a table from being able to derive column values in that table by performing a series of update/delete statements using a where clause, and rolling back the change. In the following example, with SQL92_SECURITY set to FALSE, a user with only delete privilege on the scott.emp table is able to derive that there is one employee with a salary greater than 3000. With SQL92_SECURITY set to TRUE, that user is prevented from attempting to derive a value.\n\nSQL92_SECURITY = FALSE\nSQL> delete from scott.emp where sal > 3000;\n1 row deleted\nSQL> rollback;\nRollback complete\n\nSQL92_SECURITY = TRUE\nSQL> delete from scott.emp where sal > 3000;\ndelete from scott.emp where sal > 3000\n*\nERROR at line 1:\nORA-01031: insufficient privileges","checkContent":"To verify the current status of the SQL92_SECURITY parameter use the SQL statement: \n\nIf using a non-CDB database: \nFrom SQL*Plus:\n\nselect value from v$parameter where name = 'sql92_security';\n\nIf using a CDB database:\nFrom SQL*Plus:\n\ncolumn name format a20\ncolumn parameter_value format a20\n\nSELECT name, inst_id, con_id, value AS PARAMETER_VALUE \nFROM sys.gv_$parameter \nWHERE name = 'sql92_security' \nORDER BY 1;\n\nCheck Result:\n\nThe CDB database and all PDBs must be checked.\n\nIf the value returned is set to FALSE, this is a finding.\n\nIf the parameter is set to TRUE or does not exist, this is not a finding.\n\nIn any instance or container, if the PARAMETER_VALUE is not TRUE, that is a finding.","fixText":"Enable SQL92 security.\n\nFrom SQL*Plus:\n\nalter system set sql92_security = TRUE scope = spfile;\n\nThe above SQL*Plus command will set the parameter to take effect at next system startup.","ccis":["CCI-000366"]},{"vulnId":"V-270526","ruleId":"SV-270526r1115966_rule","severity":"medium","ruleTitle":"The Oracle password file ownership and permissions should be limited and the REMOTE_LOGIN_PASSWORDFILE parameter must be set to EXCLUSIVE or NONE.","description":"It is critically important to the security of the system to protect the password file and the environment variables that identify the location of the password file. Any user with access to these could potentially compromise the security of the connection. \n\nThe REMOTE_LOGIN_PASSWORDFILE setting of \"NONE\" disallows remote administration of the database. The REMOTE_LOGIN_PASSWORDFILE setting of \"EXCLUSIVE\" allows for auditing of individual database administrator (DBA) logons to the SYS account. If not set to \"EXCLUSIVE\", remote connections to the database as \"internal\" or \"as SYSDBA\" are not logged to an individual account.","checkContent":"To verify the current status of the REMOTE_LOGIN_PASSWORDFILE parameter: \n\nIf using a non-CDB database:\n\nFrom SQL*Plus:\n\nselect value from v$parameter where upper(name) = 'REMOTE_LOGIN_PASSWORDFILE';\n\nIf the value returned does not equal 'EXCLUSIVE' or 'NONE', this is a finding.\n\nIf using a CDB database:\n\nFrom SQL*Plus:\n\nTo verify the current status of the remote_login_passwordfile parameter use the SQL statement:\n\ncolumn name format a25\ncolumn parameter_value format a25\n\nSELECT name, inst_id, con_id, value AS PARAMETER_VALUE \nFROM sys.gv_$parameter \nWHERE name = 'REMOTE_LOGIN_PASSWORDFILE' \nORDER BY 1;\n\nIn any instance or container, if the PARAMETER_VALUE is set to SHARED, or to a value other than EXCLUSIVE or NONE, that is a finding.\n\nCheck the security permissions on password file within the OS.\n\nOn Unix Systems:\n\nls -ld $ORACLE_HOME/dbs/orapw${ORACLE_SID}\n\nSubstitute ${ORACLE_SID} with the name of the ORACLE_SID for the database.\n\nIf permissions are granted for world access, this is a finding.\n\nOn Windows Systems (from Windows Explorer), browse to the %ORACLE_HOME%\\database\\directory.\n\nSelect and right-click on the PWD%ORACLE_SID%.ora file, select Properties, then select the Security tab.\n\nSubstitute %ORACLE_SID% with the name of the ORACLE_SID for the database.\n\nIf permissions are granted to everyone, this is a finding.\n\nIf any account other than the database management system (DBMS) software installation account is listed, this is a finding.","fixText":"Disable use of the REMOTE_LOGIN_PASSWORDFILE where remote administration is not authorized by specifying a value of NONE.\n\nIf authorized, restrict use of a password file to exclusive use by each database by specifying a value of EXCLUSIVE.\n\nFrom SQL*Plus:\n\nalter system set REMOTE_LOGIN_PASSWORDFILE = 'EXCLUSIVE' scope = spfile;\n\nOR\n\nalter system set REMOTE_LOGIN_PASSWORDFILE = 'NONE' scope = spfile;\n\nThe above SQL*Plus command will set the parameter to take effect at next system startup.\n\nRestrict ownership and permissions on the Oracle password file to exclude world (Unix) or everyone (Windows).\n\nMore information regarding the ORAPWD file and the REMOTE_LOGIN_PASSWORDFILE parameter can be found here:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/REMOTE_LOGIN_PASSWORDFILE.html","ccis":["CCI-000366"]},{"vulnId":"V-270527","ruleId":"SV-270527r1065266_rule","severity":"medium","ruleTitle":"System privileges granted using the WITH ADMIN OPTION must not be granted to unauthorized user accounts.","description":"The WITH ADMIN OPTION allows the grantee to grant a privilege to another database account. Best security practice restricts the privilege of assigning privileges to authorized personnel. Authorized personnel include database administrators (DBAs), object owners, and, where designed and included in the application's functions, application administrators. Restricting privilege-granting functions to authorized accounts can help decrease mismanagement of privileges and wrongful assignments to unauthorized accounts.","checkContent":"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.\n\nTo 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.\n\nNonadministrative Accounts - Expired and locked:\nAPEX_PUBLIC_USER, DIP, FLOWS_040100*, FLOWS_FILES, MDDATA, SPATIAL_WFS_ADMIN_USR, XS$NULL\n\nAdministrative Accounts - Expired and Locked:\nANONYMOUS, 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\n\nAdministrative Accounts - Open:\nDBSNMP, MGMT_VIEW, SYS, SYSMAN, SYSTEM, SYSKM\n\n*Subject to change based on version installed.\n\nRun the SQL query:\n\nFrom SQL*Plus:\nselect grantee, privilege from dba_sys_privs \nwhere grantee not in (<list of nonapplicable accounts>)\nand admin_option = 'YES'\nand grantee not in\n(select grantee from dba_role_privs where granted_role = 'DBA');\n\n(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.)\n\nIf any accounts that are not authorized to have the ADMIN OPTION are listed, this is a finding.","fixText":"Revoke assignment of privileges with the WITH ADMIN OPTION from unauthorized users and regrant them without the option.\n\nFrom SQL*Plus:\n\nrevoke [privilege name] from user [username];\n\nReplace [privilege name] with the named privilege and [username] with the named user.\n\nRestrict use of the WITH ADMIN OPTION to authorized administrators.\n\nDocument authorized privilege assignments with the WITH ADMIN OPTION in the system documentation.","ccis":["CCI-000366"]},{"vulnId":"V-270528","ruleId":"SV-270528r1064862_rule","severity":"medium","ruleTitle":"System Privileges must not be granted to PUBLIC.","description":"System privileges can be granted to users and roles and to the user group PUBLIC. All privileges granted to PUBLIC are accessible to every user in the database. Many of these privileges convey considerable authority over the database and should be granted only to those persons responsible for administering the database. In general, these privileges should be granted to roles and then the appropriate roles should be granted to users. System privileges must never be granted to PUBLIC as this could allow users to compromise the database.","checkContent":"From SQL*Plus:\n\nSelect privilege from dba_sys_privs where grantee = 'PUBLIC';\n\nIf any records are returned, this is a finding.","fixText":"Revoke any system privileges assigned to PUBLIC:\n\nFrom SQL*Plus:\n\nrevoke [system privilege] from PUBLIC;\n\nReplace [system privilege] with the named system privilege.\n\nNote: System privileges are not granted to PUBLIC by default and would indicate a custom action.","ccis":["CCI-000366"]},{"vulnId":"V-270529","ruleId":"SV-270529r1065268_rule","severity":"medium","ruleTitle":"Oracle roles granted using the WITH ADMIN OPTION must not be granted to unauthorized accounts.","description":"The WITH ADMIN OPTION allows the grantee to grant a role to another database account. Best security practice restricts the privilege of assigning privileges to authorized personnel. Authorized personnel include database administrators (DBAs), object owners, and application administrators (where designed and included in the application's functions). Restricting privilege-granting functions to authorized accounts can help decrease mismanagement of privileges and wrongful assignments to unauthorized accounts.","checkContent":"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.\n\nTo 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.\n\nNon-Administrative Accounts - Expired and locked:\nAPEX_PUBLIC_USER, DIP, FLOWS_040100*, FLOWS_FILES, MDDATA, SPATIAL_WFS_ADMIN_USR, XS$NULL\n\nAdministrative Accounts - Expired and Locked:\nANONYMOUS, 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\n\nAdministrative Accounts - Open:\nDBSNMP, MGMT_VIEW, SYS, SYSMAN, SYSTEM\n\n*Subject to change based on version installed.\n\nRun the SQL statement:\n\nselect grantee||': '||granted_role from dba_role_privs\nwhere grantee not in\n(<list of nonapplicable accounts>)\nand admin_option = 'YES' \nand grantee not in\n(select distinct owner from dba_objects)\nand grantee not in\n(select grantee from dba_role_privs\nwhere granted_role = 'DBA')\norder by grantee;\n\n(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.)\n\nReview the system documentation to confirm any grantees listed are information system security officer (ISSO)-authorized DBA accounts or application administration roles.\n\nIf any grantees listed are not authorized and documented, this is a finding.","fixText":"Revoke assignment of roles with the WITH ADMIN OPTION from unauthorized grantees and regrant them without the option if required.\n\nSQL statements to remove the admin option from an unauthorized grantee:\nrevoke <role name> from <grantee>;\ngrant <role name> to <grantee>;\n\nRestrict use of the WITH ADMIN OPTION to authorized administrators.\n\nDocument authorized role assignments with the WITH ADMIN OPTION in the system documentation.","ccis":["CCI-000366"]},{"vulnId":"V-270530","ruleId":"SV-270530r1065320_rule","severity":"medium","ruleTitle":"Object permissions granted to PUBLIC must be restricted.","description":"Permissions on objects may be granted to the user group PUBLIC. Because every database user is a member of the PUBLIC group, granting object permissions to PUBLIC gives all users in the database access to that object. In a secure environment, granting object permissions to PUBLIC must be restricted to those objects that all users are allowed to access. The policy does not require object permissions assigned to PUBLIC by the installation of Oracle Database server components be revoked.","checkContent":"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\".\n\nTo 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.\n\nNon-Administrative Accounts - Expired and locked:\nAPEX_PUBLIC_USER, DIP, FLOWS_040100*, FLOWS_FILES, MDDATA, SPATIAL_WFS_ADMIN_USR, XS$NULL\n\nAdministrative Accounts - Expired and Locked:\nANONYMOUS, 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\n\nAdministrative Accounts - Open:\nDBSNMP, MGMT_VIEW, SYS, SYSMAN, SYSTEM\n\n* Subject to change based on version installed.\n\nRun the SQL query:\n\nselect owner ||'.'|| table_name ||':'|| privilege from dba_tab_privs\nwhere grantee = 'PUBLIC'\nand owner not in\n(<list of nonapplicable accounts>);\n\nWith 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.\n\nIf there are any records returned that are not Oracle product accounts, and are not documented and authorized, this is a finding.\n\nNote: This check may return false positives where other Oracle product accounts are not included in the exclusion list.","fixText":"Revoke any privileges granted to PUBLIC for objects that are not owned by Oracle product accounts.\n\nFrom SQL*Plus:\n\nrevoke [privilege name] from [username] on [object name];\n\nAssign permissions to custom application user roles based on job functions:\n\nFrom SQL*Plus:\n\ngrant [privilege name] to [user role] on [object name];","ccis":["CCI-000366"]},{"vulnId":"V-270531","ruleId":"SV-270531r1065272_rule","severity":"high","ruleTitle":"The Oracle Listener must be configured to require administration authentication.","description":"Oracle listener authentication helps prevent unauthorized administration of the Oracle listener. Unauthorized administration of the listener could lead to denial-of-service (DoS) exploits, loss of connection audit data, unauthorized reconfiguration, or other unauthorized access. This is a Category I finding because privileged access to the listener is not restricted to authorized users. Unauthorized access can result in stopping of the listener (DoS) and overwriting of listener audit logs.","checkContent":"If a listener is not running on the local database host server, this check is not a finding.\n\nNote: 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.\n\nFor subsequent database home reviews on the same host system, this check is not a finding.\n\nDetermine all listeners running on the host.\n\nFor Windows hosts, view all Windows services with TNSListener embedded in the service name:\n\n- The service name format is:\nOracle[ORACLE_HOME_NAME]TNSListener\n\nFor Unix hosts, the Oracle Listener process will indicate the TNSLSNR executable.\n\nAt a command prompt, issue the command:\nps -ef | grep tnslsnr | grep -v grep\n\nThe alias for the listener follows tnslsnr in the command output.\n\nMust 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.\n\nFrom a system command prompt, execute the listener control utility:\n\nlsnrctl status [LISTENER NAME]\n\nReview the results for the value of Security.\n\nIf \"Security = OFF\" is displayed, this is a finding.\n\nIf \"Security = ON: Password or Local OS Authentication\", this is a finding (Instead, use Local OS Authentication).\n\nIf \"Security = ON: Local OS Authentication\" is displayed, this is not a finding.\n\nRepeat the execution of the lsnrctl utility for all active listeners.","fixText":"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. \n\nOracle 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.\n\nRemote 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.\n\nRefer to Oracle Database Net Services Reference for additional information.","ccis":["CCI-000366"]},{"vulnId":"V-270532","ruleId":"SV-270532r1064874_rule","severity":"medium","ruleTitle":"Application role permissions must not be assigned to the Oracle PUBLIC role.","description":"Permissions granted to PUBLIC are granted to all users of the database. Custom roles must be used to assign application permissions to functional groups of application users. The installation of Oracle does not assign role permissions to PUBLIC.","checkContent":"From SQL*Plus:\n\nselect granted_role from dba_role_privs where grantee = 'PUBLIC';\n\nIf any roles are listed, this is a finding.","fixText":"Revoke role grants from PUBLIC.\n\nDo not assign role privileges to PUBLIC.\n\nFrom SQL*Plus:\n\nrevoke [role name] from PUBLIC;","ccis":["CCI-000366"]},{"vulnId":"V-270533","ruleId":"SV-270533r1065215_rule","severity":"medium","ruleTitle":"Oracle application administration roles must be disabled if not required and authorized.","description":"Application administration roles, which are assigned system or elevated application object privileges, must be protected from default activation. Application administration roles are determined by system privilege assignment (create/alter/drop user) and application user role ADMIN OPTION privileges.","checkContent":"Run the SQL query:\n\nselect grantee, granted_role from dba_role_privs\nwhere default_role='YES'\nand granted_role in\n(select grantee from dba_sys_privs where upper(privilege) like '%USER%') \nand grantee not in\n(<list of nonapplicable accounts>)\nand grantee not in (select distinct owner from dba_tables)\nand grantee not in\n(select distinct username from dba_users where upper(account_status) like\n'%LOCKED%');\n\nWith 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.\n\nReview the list of accounts reported for this check and ensures that they are authorized application administration roles.\n\nIf any are not authorized application administration roles, this is a finding.","fixText":"For each role assignment returned, issue:\n\nFrom SQL*Plus:\n\nalter user [username] default role all except [role];\n\nIf the user has more than one application administration role assigned, then remove assigned roles from default assignment and assign individually the appropriate default roles.","ccis":["CCI-000366"]},{"vulnId":"V-270534","ruleId":"SV-270534r1065274_rule","severity":"medium","ruleTitle":"The directories assigned to the LOG_ARCHIVE_DEST* parameters must be protected from unauthorized access.","description":"The LOG_ARCHIVE_DEST parameter is used to specify the directory to which Oracle archive logs are written. Where the database management system (DBMS) availability and recovery to a specific point in time is critical, the protection of archive log files is critical. Archive log files may also contain unencrypted sensitive data. If written to an inadequately protected or invalidated directory, the archive log files may be accessed by unauthorized persons or processes.","checkContent":"From SQL*Plus:\n\nselect log_mode from v$database;\nselect value from v$parameter where name = 'log_archive_dest';\nselect value from v$parameter where name = 'log_archive_duplex_dest';\nselect name, value from v$parameter where name LIKE 'log_archive_dest_%';\nselect value from v$parameter where name = 'db_recovery_file_dest';\n\nIf the value returned for LOG_MODE is NOARCHIVELOG, this check is not a finding.\n\nIf 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.\n\nNote: 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.\n\nOn Unix Systems:\n\nls -ld [pathname]\n\nSubstitute [pathname] with the directory paths listed from the above SQL statements for log_archive_dest and log_archive_duplex_dest.\n\nIf permissions are granted for world access, this is a finding.\n\nOn Windows systems (from Windows Explorer):\n\nBrowse to the directory specified.\n\nSelect and right-click on the directory >> Properties >> Security tab.\n\nIf permissions are granted to everyone, this is a finding.\n\nIf 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.","fixText":"Specify a valid and protected directory for archive log files.\n\nRestrict access to the Oracle process and software owner accounts, DBAs, and backup operator accounts.","ccis":["CCI-000366"]},{"vulnId":"V-270535","ruleId":"SV-270535r1065307_rule","severity":"medium","ruleTitle":"The Oracle _TRACE_FILES_PUBLIC parameter if present must be set to FALSE.","description":"The _TRACE_FILES_PUBLIC parameter is used to make trace files used for debugging database applications and events available to all database users. Use of this capability precludes the discrete assignment of privileges based on job function. Additionally, its use may provide access to external files and data to unauthorized users.","checkContent":"From SQL*Plus:\n\nselect value from v$parameter where name = '_trace_files_public';\n\nIf the value returned is TRUE, this is a finding.\n\nIf the parameter does not exist or is set to FALSE, this is not a finding.","fixText":"From SQL*Plus (shutdown database instance):\n\nshutdown immediate\n\nFrom SQL*Plus (create a pfile from spfile):\n\ncreate pfile='[PATH]init[SID].ora' from spfile;\n\nEdit the init[SID].ora file and remove the following line:\n\n*._trace_files_public=TRUE\n\nFrom SQL*Plus (update the spfile using the pfile):\n\ncreate spfile from pfile='[PATH]init[SID].ora';\n\nFrom SQL*Plus (start the database instance):\n\nstartup\n\nNote: [PATH] depends on the platform (Windows or Unix).\n\nEnsure the file is directed to a writable location.\n\n[SID] is equal to the oracle SID or database instance ID.","ccis":["CCI-000366"]},{"vulnId":"V-270536","ruleId":"SV-270536r1064886_rule","severity":"medium","ruleTitle":"Oracle Database production application and data directories must be protected from developers on shared production/development database management system (DBMS) host systems.","description":"Developer roles must not be assigned DBMS administrative privileges to production DBMS application and data directories. The separation of production database administrator (DBA) and developer roles helps protect the production system from unauthorized, malicious, or unintentional interruption due to development activities.","checkContent":"If the DBMS or DBMS host is not shared by production and development activities, this check is not a finding.\n\nReview OS DBA group membership.\n\nIf any developer accounts, as identified in the system documentation, have been assigned DBA privileges, this is a finding.\n\nNote: 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).","fixText":"Create separate DBMS host OS groups for developer and production DBAs.\n\nDo not assign production DBA OS group membership to accounts used for development.\n\nRemove development accounts from production DBA OS group membership.\n\nRecommend 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.","ccis":["CCI-000366"]},{"vulnId":"V-270537","ruleId":"SV-270537r1064889_rule","severity":"medium","ruleTitle":"Use of the Oracle Database installation account must be logged.","description":"The database management system (DBMS) installation account may be used by any authorized user to perform DBMS installation or maintenance. Without logging, accountability for actions attributed to the account is lost.","checkContent":"Review documented and implemented procedures for monitoring the use of the DBMS software installation account in the system documentation.\n\nIf use of this account is not monitored or procedures for monitoring its use do not exist or are incomplete, this is a finding.\n\nNote: 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.","fixText":"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.\n\nHost 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.\n\nEnsure all accounts with administrator privileges are monitored for DBMS host on Windows OS platforms.","ccis":["CCI-000366"]},{"vulnId":"V-270538","ruleId":"SV-270538r1064892_rule","severity":"medium","ruleTitle":"The Oracle Database data files, transaction logs and audit files must be stored in dedicated directories or disk partitions separate from software or other application files.","description":"Protection of database management system (DBMS) data, transaction and audit data files stored by the host operating system is dependent on OS controls. When different applications share the same database, resource contention and security controls are required to isolate and protect an application's data from other applications. In addition, it is an Oracle best practice to separate data, transaction logs, and audit logs into separate physical directories according to Oracle's Optimal Flexible Architecture (OFA). And finally, DBMS software libraries and configuration files also require differing access control lists.","checkContent":"Review the disk/directory specification where database data, transaction log and audit files are stored.\n\nIf DBMS data, transaction log or audit data files are stored in the same directory, this is a finding.\n\nIf multiple applications are accessing the database and the database data files are stored in the same directory, this is a finding.\n\nIf multiple applications are accessing the database and database data is separated into separate physical directories according to application, this check is not a finding.","fixText":"Specify dedicated host system disk directories to store database data, transaction and audit files.\n\nExample directory structure:\n/*/app/oracle/oradata/db_name\n/*/app/oracle/admin/db_name/arch/*\n/*/app/oracle/oradata/db_name/audit\n/*/app/oracle/fast_recovery_area/db_name/\n\nWhen multiple applications are accessing a single database, configure DBMS default file storage according to application to use dedicated disk directories. \n\n/*/app/oracle/oradata/db_name/app_name\n\nRefer to Oracle Optimal Flexible Architecture:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/optimal-flexible-architecture.html","ccis":["CCI-000366"]},{"vulnId":"V-270539","ruleId":"SV-270539r1064895_rule","severity":"medium","ruleTitle":"Network access to Oracle Database must be restricted to authorized personnel.","description":"Restricting remote access to specific, trusted systems helps prevent access by unauthorized and potentially malicious users.","checkContent":"IP address restriction may be defined for the database listener, by use of the Oracle Connection Manager or by an external network device.\n\nIdentify the method used to enforce address restriction (interview database administrator [DBA]) or review system documentation).\n\nIf 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).\n\nIf the following entries do not exist, then restriction by IP address is not configured and is a finding.\n\ntcp.validnode_checking=YES\ntcp.invited_nodes=(IP1, IP2, IP3)\n\nIf 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).\n\nIf a RULE entry allows all addresses (\"/32\") or does not match the address range specified in the system documentation, this is a finding.\n\n(rule=(src=[IP]/27)(dst=[IP])(srv=*)(act=accept))\n\nNote: 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.","fixText":"Configure the database listener to restrict access by IP address or set up an external device to restrict network access to the DBMS.\n\nMore 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.","ccis":["CCI-000366"]},{"vulnId":"V-270540","ruleId":"SV-270540r1064898_rule","severity":"medium","ruleTitle":"Changes to configuration options must be audited.","description":"When standard auditing is in use, the AUDIT_SYS_OPERATIONS parameter is used to enable auditing of actions taken by the user SYS. The SYS user account is a shared account by definition and holds all privileges in the Oracle database. It is the account accessed by users connecting to the database with SYSDBA or SYSOPER privileges.","checkContent":"For Unified or mixed auditing, from SQL*Plus:\n\nselect count(*) from audit_unified_enabled_policies where entity_name = 'SYS';\n\nIf the count is less than one row, this is a finding.\n\nFor Standard auditing, from SQL*Plus:\n\nselect value from v$parameter where name = 'audit_sys_operations';\n\nIf the value returned is FALSE, this is a finding.","fixText":"For Standard auditing, from SQL*Plus:\n\nalter system set audit_sys_operations = TRUE scope = spfile;\n\nThe above SQL*Plus command will set the parameter to take effect at next system startup.\n\nIf Unified Auditing is used, to ensure auditable events are captured:\nLink the oracle binary with uniaud_on, and then restart the database. Oracle Database Upgrade Guide describes how to enable unified auditing.\n\nFor additional information on creating audit policies, refer to the Oracle Database Security Guide:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-audit-policies.html","ccis":["CCI-000366"]},{"vulnId":"V-270541","ruleId":"SV-270541r1065276_rule","severity":"medium","ruleTitle":"The /diag subdirectory under the directory assigned to the DIAGNOSTIC_DEST parameter must be protected from unauthorized access.","description":"<DIAGNOSTIC_DEST>/diag indicates the directory where trace, alert, core, and incident directories and files are located. The files may contain sensitive data or information that could prove useful to potential attackers.","checkContent":"From SQL*Plus:\n\nselect value from v$parameter where name='diagnostic_dest';\n\nOn Unix Systems:\n\nls -ld [pathname]/diag\n\nSubstitute [pathname] with the directory path listed from the above SQL command, and append \"/diag\" to it, as shown.\n\nIf permissions are granted for world access, this is a finding.\n\nIf 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.\n\nOn Windows Systems (from Windows Explorer):\n\nBrowse to the \\diag directory under the directory specified.\n\nSelect and right-click on the directory >> Properties >> Security tab.\n\nIf permissions are granted to everyone, this is a finding.\n\nIf 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.","fixText":"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.\n\nAuthorize and document user access requirements to the directory outside of the Oracle, DBA, and SA account list.","ccis":["CCI-000366"]},{"vulnId":"V-270542","ruleId":"SV-270542r1064904_rule","severity":"medium","ruleTitle":"Remote administration must be disabled for the Oracle connection manager.","description":"Remote administration provides a potential opportunity for malicious users to make unauthorized changes to the Connection Manager configuration or interrupt its service.","checkContent":"View the cman.ora file in the ORACLE_HOME/network/admin directory.\n\nIf the file does not exist, the database is not accessed via Oracle Connection Manager and this check is not a finding.\n\nIf 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.","fixText":"View the cman.ora file in the ORACLE_HOME/network/admin directory of the Connection Manager.\n\nInclude the following line in the file:\n\nREMOTE_ADMIN = NO","ccis":["CCI-000366"]},{"vulnId":"V-270543","ruleId":"SV-270543r1064907_rule","severity":"medium","ruleTitle":"Network client connections must be restricted to supported versions.","description":"Unsupported Oracle network client installations may introduce vulnerabilities to the database. Restriction to use of supported versions helps to protect the database and helps to enforce newer, more robust security controls.","checkContent":"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:\n\nSQLNET.ALLOWED_LOGON_VERSION_SERVER\nSQLNET.ALLOWED_LOGON_VERSION_CLIENT\n\nView the SQLNET.ORA file in the ORACLE_HOME/network/admin directory or the directory specified in the TNS_ADMIN environment variable. \n\nLocate the following entries:\n\nSQLNET.ALLOWED_LOGON_VERSION_SERVER = 12\nSQLNET.ALLOWED_LOGON_VERSION_CLIENT = 12\n\nIf the parameters do not exist, this is a finding.\n\nIf the parameters are not set to a value of 12 or 12a, this is a finding.\n\nNote: Attempting to connect with a client version lower than specified in these parameters may result in a misleading error:\nORA-01017: invalid username/password: logon denied","fixText":"Edit the SQLNET.ORA file to add or edit the entries:\n\nSQLNET.ALLOWED_LOGON_VERSION_SERVER = 12\nSQLNET.ALLOWED_LOGON_VERSION_CLIENT = 12\n\nSet the value to 12 or higher.\nValid values for SQLNET.ALLOWED_LOGON_VERSION_SERVER are: 12 and 12a\n\nValid values for SQLNET.ALLOWED_LOGON_VERSION_CLIENT are: 12 and 12a\n\nFor more information on sqlnet.ora parameters refer to the following document:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html","ccis":["CCI-000366"]},{"vulnId":"V-270544","ruleId":"SV-270544r1065278_rule","severity":"high","ruleTitle":"Database administrator (DBA) OS accounts must be granted only those host system privileges necessary for the administration of the Oracle Database.","description":"This requirement is intended to limit exposure due to operating from within a privileged account or role. The inclusion of role is intended to address those situations where an access control policy, such as Role Based Access Control (RBAC), is being implemented and where a change of role provides the same degree of assurance in the change of access authorizations for both the user and all processes acting on behalf of the user as would be provided by a change between a privileged and nonprivileged account.\n\nDBAs, if assigned excessive OS privileges, could perform actions that could endanger the information system or hide evidence of malicious activity.","checkContent":"Review host system privileges assigned to the Oracle DBA group and all individual Oracle DBA accounts.\n\nNote: Do not include the Oracle software installation account in any results for this check.\n\nFor Unix systems (as root):\ncat /etc/group | grep -i dba\ngroups root\n\nIf \"root\" is returned in the first list, this is a finding.\n\nIf any accounts listed in the first list are also listed in the second list, this is a finding.\n\nInvestigate any user account group memberships other than DBA or root groups that are returned by the following command (also as root):\n\ngroups [dba user account]\n\nReplace [dba user account] with the user account name of each DBA account.\n\nIf individual DBA accounts are assigned to groups that grant access or privileges for purposes other than DBA responsibilities, this is a finding.\n\nFor Windows systems, click Start >> Settings >> Control Panel >> Administrative Tools >> Computer Management >> Local Users and Groups >> Groups >> ORA_DBA.\n\nStart >> Settings >> Control Panel >> Administrative Tools >> Computer Management >> Local Users and Groups >> Groups >> ORA_[SID]_DBA (if present).\n\nNote: 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.\n\nMake 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.\n\nIf DBA users belong to any groups other than DBA groups and the Windows Users group, this is a finding.\n\nExamine 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.\n\nIf any User Rights are assigned directly to the DBA group(s) or DBA user accounts, this is a finding.","fixText":"Revoke all host system privileges from the DBA group accounts and DBA user accounts not required for database management system (DBMS) administration.\n\nRevoke all OS group memberships that assign excessive privileges to the DBA group accounts and DBA user accounts.\n\nRemove any directly applied permissions or user rights from the DBA group accounts and DBA user accounts.\n\nDocument all DBA group accounts and individual DBA account-assigned privileges in the system documentation.","ccis":["CCI-000366"]},{"vulnId":"V-270545","ruleId":"SV-270545r1064913_rule","severity":"high","ruleTitle":"Oracle Database default accounts must be assigned custom passwords.","description":"Password maximum lifetime is the maximum period of time, (typically in days) a user's password may be in effect before the user is forced to change it.\n\nPasswords need to be changed at specific policy-based intervals as per policy. Any password, no matter how complex, can eventually be cracked.\n\nOne method of minimizing this risk is to use complex passwords and periodically change them. If the application does not limit the lifetime of passwords and force users to change their passwords, there is the risk that the system and/or application passwords could be compromised.\n\nDatabase management system (DBMS) default passwords provide a commonly known and exploited means for unauthorized access to database installations.","checkContent":"Use this query to identify the Oracle-supplied accounts that still have their default passwords:\n\nSELECT * FROM SYS.DBA_USERS_WITH_DEFPWD;\n\nIf any accounts other than XS$NULL are listed, this is a finding.\n\nXS$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.","fixText":"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.","ccis":["CCI-000366"]},{"vulnId":"V-270546","ruleId":"SV-270546r1112478_rule","severity":"medium","ruleTitle":"Oracle Database must provide a mechanism to automatically identify accounts designated as temporary or emergency accounts.","description":"Temporary application accounts could be used in the event of a vendor support visit where a support representative requires a temporary unique account to perform diagnostic testing or conduct some other support-related activity. When these types of accounts are created, there is a risk that the temporary account may remain in place and active after the support representative has left.\n\nTo address this in the event temporary application accounts are required, the application must automatically terminate temporary accounts after an organization-defined time period. Such a process and capability greatly reduces the risk that accounts will be misused, hijacked, or data compromised.\n\nNote that user authentication and account management should be done via an enterprise-wide mechanism whenever possible. Examples of enterprise-level authentication/access mechanisms include, but are not limited to, Active Directory and LDAP. This requirement applies to cases where it is necessary to have accounts directly managed by Oracle.\n\nTemporary database accounts must be identified in order for the system to recognize and terminate them after a given time period. The database management system (DBMS) and any administrators must have a means to recognize any temporary accounts for special handling.","checkContent":"If the organization has a policy, consistently enforced, forbidding the creation of emergency or temporary accounts, this is not a finding.\n\nIf all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism and not by Oracle, this is not a finding.\n\nIf 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.\n\nTo check for a temporary profile, run the scripts below:\n\nTo obtain a list of profiles:\n\nSELECT PROFILE#, NAME FROM SYS.PROFNAME$;\n\nTo obtain a list of users assigned a given profile (TEMPORARY_USERS, in this example):\n\nSELECT USERNAME, PROFILE FROM SYS.DBA_USERS\nWHERE PROFILE = 'TEMPORARY_USERS'\nORDER BY USERNAME;","fixText":"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.\n\nTo enable resource limiting via profiles, use the SQL statement:\n\nALTER SYSTEM SET RESOURCE_LIMIT = TRUE;\n\nSet 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:\n\nCREATE PROFILE TEMPORARY_USERS\nLIMIT\nSESSIONS_PER_USER ........... <limit>\nCPU_PER_SESSION ............. <limit>\nCPU_PER_CALL ................ <limit>\nCONNECT_TIME ................ <limit>\nLOGICAL_READS_PER_SESSION ... DEFAULT\nLOGICAL_READS_PER_CALL ...... <limit>\nPRIVATE_SGA ................. <limit>\nCOMPOSITE_LIMIT ............. <limit>\nFAILED_LOGIN_ATTEMPTS ....... 3\nPASSWORD_LIFE_TIME .......... 7\nPASSWORD_REUSE_TIME ......... 60\nPASSWORD_REUSE_MAX .......... 5\nPASSWORD_VERIFY_FUNCTION .... ORA12c_STIG_VERIFY_FUNCTION\nPASSWORD_LOCK_TIME .......... UNLIMITED\nPASSWORD_GRACE_TIME ......... 3;\n\nCREATE USER <username> IDENTIFIED BY <password> PROFILE TEMPORARY_USERS;\n\nResource Parameters:\n\nCOMPOSITE_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.\n\nSESSIONS_PER_USER - Specify the number of concurrent sessions to limit the user to.\n\nCPU_PER_SESSION - Specify the CPU time limit for a session, expressed in hundredths of seconds.\n\nCPU_PER_CALL - Specify the CPU time limit for a call (a parse, execute, or fetch), expressed in hundredths of seconds.\n\nLOGICAL_READS_PER_SESSION - Specify the permitted number of data blocks read in a session, including blocks read from memory and disk.\n\nLOGICAL_READS_PER_CALL - Specify the permitted number of data blocks read for a call to process a SQL statement (a parse, execute, or fetch).\n\nPRIVATE_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.\n\nCONNECT_TIME - Specify the total elapsed time limit for a session, expressed in minutes.\n\nIDLE_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.\n\nCOMPOSITE_LIMIT - Refer to Oracle documentation for more details.\n\nPassword 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).\n\nFAILED_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.\n\nPASSWORD_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.\n\nPASSWORD_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.\n\nIf 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.\n\nFor 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.\n\nIf specifying a value for either of these parameters and specify UNLIMITED for the other, then the user can never reuse a password.\n\nIf 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.\n\nIf setting both of these parameters to UNLIMITED, then the database ignores both of them. This is the default if omitting both parameters.\n\nPASSWORD_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.\n\nPASSWORD_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.\n\nPASSWORD_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.","ccis":["CCI-000366"]},{"vulnId":"V-270547","ruleId":"SV-270547r1064919_rule","severity":"medium","ruleTitle":"Oracle Database must provide a mechanism to automatically remove or disable temporary user accounts after 72 hours.","description":"Temporary application accounts could ostensibly be used in the event of a vendor support visit where a support representative requires a temporary unique account to perform diagnostic testing or conduct some other support related activity. When these types of accounts are created, there is a risk that the temporary account may remain in place and active after the support representative has left.\n\nTo address this, in the event temporary application accounts are required, the application must ensure accounts designated as temporary in nature must automatically terminate these accounts after a period of 72 hours. Such a process and capability greatly reduces the risk that accounts will be misused, hijacked, or data compromised.\n\nNote that user authentication and account management should be done via an enterprise-wide mechanism whenever possible. Examples of enterprise-level authentication/access mechanisms include, but are not limited to, Active Directory and LDAP. This requirement applies to cases where it is necessary to have accounts directly managed by Oracle.\n\nTemporary database accounts must be automatically terminated after a 72-hour time period to mitigate the risk of the account being used beyond its original purpose or timeframe.","checkContent":"If the organization has a policy, consistently enforced, forbidding the creation of emergency or temporary accounts, this is not a finding.\n\nIf all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism, and not by Oracle, this is not a finding.\n\nCheck 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.","fixText":"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.\n\nCreate a job to lock accounts under this profile that are more than 72 hours old.","ccis":["CCI-000366"]},{"vulnId":"V-270548","ruleId":"SV-270548r1064922_rule","severity":"medium","ruleTitle":"Oracle Database must be protected from unauthorized access by developers on shared production/development host systems.","description":"Applications employ the concept of least privilege for specific duties and information systems (including specific functions, ports, protocols, and services). The concept of least privilege is also applied to information system processes, ensuring that the processes operate at privilege levels no higher than necessary to accomplish required organizational missions and/or functions. Organizations consider the creation of additional processes, roles, and information system accounts as necessary to achieve least privilege. Organizations also apply least privilege concepts to the design, development, implementation, and operations of information systems.\n\nDevelopers granted elevated database and/or operating system privileges on systems that support both development and production databases can affect the operation and/or security of the production database system. Operating system and database privileges assigned to developers on shared development and production systems must be restricted.","checkContent":"Identify whether any hosts contain both development and production databases. If no hosts contain both production and development databases, this is Not Applicable.\n\nFor 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.\n\nIf developer accounts exist with the right to create and maintain tables (or other database objects) in production tablespaces, this is a finding.\n\nTo 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.","fixText":"Restrict developer privileges to production objects to only objects and data where those privileges are required and authorized. Document the approval and risk acceptance.\n\nConsider using separate accounts for a person's developer duties and production duties. At a minimum, use separate roles for developer privileges and production privileges.\n\nIf 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.","ccis":["CCI-000366"]},{"vulnId":"V-270549","ruleId":"SV-270549r1112480_rule","severity":"medium","ruleTitle":"Oracle Database must verify account lockouts persist until reset by an administrator.","description":"Anytime an authentication method is exposed, to allow for the use of an application, there is a risk that attempts will be made to obtain unauthorized access.\n\nTo defeat these attempts, organizations define the number of times a user account may consecutively fail a logon attempt. The organization also defines the period of time in which these consecutive failed attempts may occur.\n\nBy limiting the number of failed logon attempts, the risk of unauthorized system access via user password guessing, otherwise known as brute forcing, is reduced. Limits are imposed by locking the account.\n\nNote that user authentication and account management must be done via an enterprise-wide mechanism whenever possible. Examples of enterprise-level authentication/access mechanisms include, but are not limited to, Active Directory and LDAP. This requirement applies to cases where it is necessary to have accounts directly managed by Oracle.","checkContent":"The account lockout duration is defined in the profile assigned to a user.\n\nTo verify what profile is assigned to a user, enter the query:\n\nSQL>SELECT profile FROM dba_users WHERE username = '<username>'\n\nThis will return the profile name assigned to that user.\n\nThe 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_STIG_VERIFY_FUNCTION, if relying on this technique to verify password complexity.\n\nNow check the values assigned to the profile returned from the query above:\n\ncolumn profile format a20\ncolumn limit format a20\n\nSQL>SELECT PROFILE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES WHERE PROFILE = 'ORA_STIG_PROFILE';\n\nCheck 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.","fixText":"Configure the database management system (DBMS) settings to specify indefinite lockout duration:\n\nALTER PROFILE ORA_STIG_PROFILE LIMIT PASSWORD_LOCK_TIME UNLIMITED;","ccis":["CCI-000366"]},{"vulnId":"V-270550","ruleId":"SV-270550r1112482_rule","severity":"medium","ruleTitle":"Oracle Database must set the maximum number of consecutive invalid logon attempts to three.","description":"Anytime an authentication method is exposed, to allow for the use of an application, there is a risk that attempts will be made to obtain unauthorized access.\n\nTo defeat these attempts, organizations define the number of times a user account may consecutively fail a logon attempt. The organization also defines the period of time in which these consecutive failed attempts may occur.\n\nBy limiting the number of failed logon attempts, the risk of unauthorized system access via user password guessing, otherwise known as brute forcing, is reduced. Limits are imposed by locking the account.\n\nMore recent brute force attacks make attempts over long periods of time to circumvent intrusion detection systems and system account lockouts based entirely on the number of failed logons that are typically reset after a successful logon.\n\nNote that user authentication and account management must be done via an enterprise-wide mechanism whenever possible. Examples of enterprise-level authentication/access mechanisms include, but are not limited to, Active Directory and LDAP. This requirement applies to cases where it is necessary to have accounts directly managed by Oracle.\n\nNote also that a policy that places no limit on the length of the timeframe (for counting consecutive invalid attempts) does satisfy this requirement.","checkContent":"The limit on the number of consecutive failed logon attempts is defined in the profile assigned to a user.\n\nCheck the FAILED_LOGIN_ATTEMPTS value assigned to the profiles returned from this query:\n\nSQL>SELECT PROFILE, RESOURCE_NAME, LIMIT FROM DBA_PROFILES;\n\nCheck 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.","fixText":"Configure the database management system (DBMS) setting to specify the maximum number of consecutive failed logon attempts to three (or less):\n\nALTER PROFILE {PROFILE_NAME} LIMIT FAILED_LOGIN_ATTEMPTS 3;\n\nORA_STIG_PROFILE is available in DBA_PROFILES. \n\nNote: It is necessary to create a customized replacement for the password validation function, ORA12C_STIG_VERIFY_FUNCTION, if relying on this technique to verify password complexity.","ccis":["CCI-000366"]},{"vulnId":"V-270551","ruleId":"SV-270551r1112483_rule","severity":"medium","ruleTitle":"Oracle Database must disable user accounts after 35 days of inactivity.","description":"Attackers that are able to exploit an inactive database management system (DBMS) account can potentially obtain and maintain undetected access to the database. \n\nOwners of inactive DBMS accounts will not notice if unauthorized access to their user account has been obtained. All DBMS need to track periods of user inactivity and disable accounts after 35 days of inactivity. Such a process greatly reduces the risk that accounts will be hijacked, leading to a data compromise.\n\nTo address access requirements, some database administrators choose to integrate their databases with enterprise-level authentication/access mechanisms that meet or exceed access control policy requirements. Such integration allows the database administrator to off-load those access control functions and focus on core application features and functionality. \n\nThis policy does not apply to either emergency accounts or infrequently used accounts. Infrequently used accounts are local logon administrator accounts used by system administrators when network or normal logon/access is not available. Emergency accounts are administrator accounts created in response to crisis situations.\n\nNote that user authentication and account management must be done via an enterprise-wide mechanism whenever possible. Examples of enterprise-level authentication/access mechanisms include, but are not limited to, Active Directory and LDAP. This requirement applies to cases where it is necessary to have accounts directly managed by Oracle.","checkContent":"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.\n\nFor accounts managed by Oracle, check DBMS settings to determine if accounts are automatically disabled by the system after 35 days of inactivity. \n\nIn 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.\n\nCheck to verify what profile each user is associated with, if any, with this query:\n\nselect username, profile from dba_users order by 1,2;\n\nThen, 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.\n\nSQL>select profile, resource_name, resource_type, limit from dba_profiles where upper(resource_name) = 'INACTIVE_ACCOUNT_TIME';\n\nIf the INACTIVE_ACCOUNT_TIME parameter is set to UNLIMITED (default) or it is set to more than 35 days, this is a finding.\n\nIf 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.","fixText":"For accounts managed by Oracle, issue the statement:\n\nALTER PROFILE profile_name LIMIT inactive_account_time 35;\n\nOr\n\nChange the profile for the DBMS account to ORA_STIG_PROFILE (which has the inactive_account_time parameter set to 35):\n\nALTER USER user_name PROFILE ora_stig_profile;\n\nAn alternate method is to create a script or store procedure that runs once a day.\n\nWrite a SQL statement to determine accounts that have not logged in within 35 days:\n\nExample:\nselect username from dba_audit_trail where action_name = 'LOGON'\ngroup by username having max(timestamp) < sysdate - 36\n\nThen, disable all accounts that have not logged in within 35 days.","ccis":["CCI-003627"]},{"vulnId":"V-270552","ruleId":"SV-270552r1064934_rule","severity":"medium","ruleTitle":"Oracle Database default demonstration and sample databases, database objects, and applications must be removed.","description":"Information systems are capable of providing a wide variety of functions and services. Some of the functions and services, provided by default, may not be necessary to support essential organizational operations (e.g., key missions, functions).\n\nIt is detrimental for applications to provide, or install by default, functionality exceeding requirements or mission objectives. Examples include, but are not limited to, installing advertising software, demonstrations, or browser plugins not related to requirements or providing a wide array of functionality not required for the mission.\n\nApplications must adhere to the principles of least functionality by providing only essential capabilities.\n\nDemonstration and sample database objects and applications present publicly known attack points for malicious users. These demonstration and sample objects are meant to provide simple examples of coding specific functions and are not developed to prevent vulnerabilities from being introduced to the database management system (DBMS) and host system.","checkContent":"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.\n\nReview documentation and websites from Oracle and any other relevant vendors for vendor-provided demonstration or sample databases, database applications, schemas, objects, and files.\n\nReview 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.\n\nThe Oracle Default Sample Schema User Accounts are:\n\nBI: Owns the Business Intelligence schema included in the Oracle Sample Schemas.\n\nHR: Manages the Human Resources schema. Schema stores information about the employees and the facilities of the company.\n\nOE: Manages the Order Entry schema. Schema stores product inventories and sales of the company's products through various channels.\n\nPM: Manages the Product Media schema. Schema contains descriptions and detailed information about each product sold by the company.\n\nIX: Manages the Information Exchange schema. Schema manages shipping through business-to-business (B2B) applications database.\n\nSH: Manages the Sales schema. Schema stores statistics to facilitate business decisions.\n\nSCOTT: A demonstration account with a simple schema.\n\nConnect to Oracle as SYSDBA and run the following SQL to check for presence of Oracle Default Sample Schema User Accounts:\n\nselect distinct(username) from dba_users where username in\n('BI','HR','OE','PM','IX','SH','SCOTT');\n\nIf any of the users listed above is returned, it means that there are demo programs installed, and this is a finding.","fixText":"Remove any demonstration and sample databases, database applications, objects, and files from the DBMS.\n\nTo remove an account and all objects owned by that account (using BI as an example):\n\nDROP USER BI CASCADE;\n\nTo remove objects without removing their owner, use the appropriate DROP statement (DROP TABLE, DROP VIEW, etc.).","ccis":["CCI-000381"]},{"vulnId":"V-270553","ruleId":"SV-270553r1064937_rule","severity":"medium","ruleTitle":"Unused database components, database management system (DBMS) software, and database objects must be removed.","description":"Information systems are capable of providing a wide variety of functions and services. Some of the functions and services, provided by default, may not be necessary to support essential organizational operations (e.g., key missions, functions).\n\nIt is detrimental for applications to provide, or install by default, functionality exceeding requirements or mission objectives. Examples include, but are not limited to, installing advertising software, demonstrations, or browser plug-ins not related to requirements or providing a wide array of functionality not required for the mission.\n\nApplications must adhere to the principles of least functionality by providing only essential capabilities.\n\nDemonstration and sample database objects and applications present publicly known attack points for malicious users. These demonstration and sample objects are meant to provide simple examples of coding specific functions and are not developed to prevent vulnerabilities from being introduced to the database management system (DBMS) and host system.\n\nUnused and unnecessary DBMS components increase the attack vector for the DBMS by introducing additional targets for attack. By minimizing the services and applications installed on the system, the number of potential vulnerabilities is reduced.","checkContent":"Run this query to produce a list of components and features installed with the database:\n\nSELECT comp_id, comp_name, version, status from dba_registry\nWHERE comp_id not in ('CATJAVA','CATALOG','CATPROC','SDO','DV','XDB')\nAND status <> 'OPTION OFF';\n\nReview the list. If unused components are installed and are not documented and authorized, this is a finding.","fixText":"If any components are required for operation of applications that will be accessing the DBMS, include them in the system documentation.\n\nComponents cannot be removed via Database Configuration Assistant (DBCA) or manually once the database has been created, either from a container or a noncontainer database.\n\nHowever DBCA can be used to create a noncontainer database and remove components during the creation process before the database is created.\n\nWhen using DBCA to create a custom noncontainer database, select:\ncreation mode = advanced\nDatabase Template = Custom\nDatabase Options..Database Component\n\nComponents 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.\n\nFor 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.\n\nComponents 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.\n\nTo configure a PDB to only use specific components:\n\n1. Create a non-CDB 19.0 database and configure that database with the components desired.\n\n2. Plug the non-CDB database into a CDB database, creating a new PDB. Then if desired, create additional clones from the new PDB.","ccis":["CCI-000381"]},{"vulnId":"V-270554","ruleId":"SV-270554r1065221_rule","severity":"medium","ruleTitle":"Unused database components that are integrated in the database management system (DBMS) and cannot be uninstalled must be disabled.","description":"Information systems are capable of providing a wide variety of functions and services. Some of the functions and services, provided by default, may not be necessary to support essential organizational operations (e.g., key missions, functions).\n\nIt is detrimental for applications to provide, or install by default, any functionality exceeding requirements or mission objectives. Examples include, but are not limited to, installing advertising software, demonstrations, or browser plug-ins not related to requirements or providing a wide array of functionality not required for the mission.\n\nApplications must adhere to the principles of least functionality by providing only essential capabilities.\n\nUnused, unnecessary DBMS components increase the attack vector for the DBMS by introducing additional targets for attack. By minimizing the services and applications installed on the system, the number of potential vulnerabilities is reduced. Components of the system that are unused and cannot be uninstalled must be disabled.","checkContent":"Run this query to check to verify what integrated components are installed in the database:\n\nSELECT parameter, value\nfrom v$option\nwhere parameter in \n(\n'Data Mining',\n'Oracle Database Extensions for .NET',\n'OLAP',\n'Partitioning',\n'Real Application Testing'\n);\n\nThis 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.\n\nReview 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.\n\nIf any unused components or features are listed by the query as TRUE, this is a finding.","fixText":"In the system documentation list the integrated components required for operation of applications that will be accessing the DBMS.\n\nFor Oracle Database 12.1 and higher, only the following components can be enabled/disabled:\n\nOracle Data Mining (dm)\nOracle Database Extensions for .NET (ode_net)\nOracle OLAP (olap)\nOracle Partitioning (partitioning)\nReal Application Testing (rat)\n\nUse 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 \nchopt <enable|disable> <option>\nwhere <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:\n\nchopt disable rat\n\nRestart the Oracle service.\n\nRefer to My Oracle Support Document 948061.1 for more on the chopt command.","ccis":["CCI-000381"]},{"vulnId":"V-270555","ruleId":"SV-270555r1115550_rule","severity":"medium","ruleTitle":"OS accounts used to run external procedures called by Oracle Database must have limited privileges.","description":"This requirement is intended to limit exposure due to operating from within a privileged account or role. The inclusion of role is intended to address those situations where an access control policy, such as Role Based Access Control (RBAC) is being implemented and where a change of role provides the same degree of assurance in the change of access authorizations for both the user and all processes acting on behalf of the user as would be provided by a change between a privileged and nonprivileged account.\n\nTo limit exposure when operating from within a privileged account or role, the application must support organizational requirements that users of information system accounts, or roles, with access to organization-defined lists of security functions or security-relevant information, use nonprivileged accounts, or roles, when accessing other (nonsecurity) system functions.\n\nUse of privileged accounts for nonadministrative purposes puts data at risk of unintended or unauthorized loss, modification, or exposure. In particular, database administrator (DBA) accounts if used for nonadministration application development or application maintenance can lead to misassignment of privileges where privileges are inherited by object owners. It may also lead to loss or compromise of application data where the elevated privileges bypass controls designed in and provided by applications.\n\nExternal applications called or spawned by the database management system (DBMS) process may be executed under OS accounts with unnecessary privileges. This can lead to unauthorized access to OS resources and compromise of the OS, the DBMS or any other services provided by the host platform.","checkContent":"Determine which OS accounts are used by Oracle to run external procedures.\n\nValidate that these OS accounts have only the privileges necessary to perform the required functionality.\n\nIf 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.\n\nIf use of the external procedure agent is authorized, ensure extproc is restricted to execution of authorized applications.\n\nExternal jobs are run using the account \"nobody\" by default.\n\nReview the contents of the file ORACLE_HOME/rdbms/admin/externaljob.ora for the lines run_user= and run_group=.\n\nIf the user assigned to these parameters is not \"nobody\", this is a finding.\n\nSystem views providing privilege information are:\nDBA_SYS_PRIVS\nDBA_TAB_PRIVS\nDBA_ROLE_PRIVS","fixText":"Limit privileges to DBMS-related OS accounts to those required to perform their DBMS specific functionality.","ccis":["CCI-000381"]},{"vulnId":"V-270556","ruleId":"SV-270556r1064946_rule","severity":"medium","ruleTitle":"Use of external executables must be authorized.","description":"Information systems are capable of providing a wide variety of functions and services. Some of the functions and services, provided by default, may not be necessary to support essential organizational operations (e.g., key missions, functions).\n\nIt is detrimental for applications to provide, or install by default, functionality exceeding requirements or mission objectives. Examples include, but are not limited to, installing advertising software, demonstrations, or browser plugins not related to requirements or providing a wide array of functionality not required for the mission.\n\nApplications must adhere to the principles of least functionality by providing only essential capabilities.\n\nDatabase management systems (DBMSs) may spawn additional external processes to execute procedures that are defined in the DBMS, but stored in external host files (external procedures). The spawned process used to execute the external procedure may operate within a different OS security context than the DBMS and provide unauthorized access to the host system.","checkContent":"Review the database for definitions of application executable objects stored external to the database.\n\nDetermine if there are methods to disable use or access, or to remove definitions for external executable objects.\n\nVerify any application executable objects listed are authorized by the information system security officer (ISSO).\n\nTo 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. \n\n(connect as sysdba)\nset linesize 130\ncolumn library_name format a25\ncolumn name format a15\ncolumn owner format a15\ncolumn grantee format a15\ncolumn privilege format a15\nselect library_name,owner, '' grantee, '' privilege\nfrom dba_libraries \nwhere file_spec is not null\nand owner not in ('SYS', 'ORDSYS')\nminus\n(\nselect library_name,o.name owner, '' grantee, '' privilege\nfrom dba_libraries l,\nsys.user$ o,\nsys.user$ ge,\nsys.obj$ obj,\nsys.objauth$ oa\nwhere l.owner=o.name\nand obj.owner#=o.user#\nand obj.name=l.library_name\nand oa.obj#=obj.obj#\nand ge.user#=oa.grantee#\nand l.file_spec is not null\n)\nunion all\nselect library_name,o.name owner, --obj.obj#,oa.privilege#,\nge.name grantee,\ntpm.name privilege\nfrom dba_libraries l,\nsys.user$ o,\nsys.user$ ge,\nsys.obj$ obj,\nsys.objauth$ oa,\nsys.table_privilege_map tpm\nwhere l.owner=o.name\nand obj.owner#=o.user#\nand obj.name=l.library_name\nand oa.obj#=obj.obj#\nand ge.user#=oa.grantee#\nand tpm.privilege=oa.privilege#\nand l.file_spec is not null\n/\n\nIf 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.","fixText":"Disable use of or remove any external application executable object definitions that are not authorized.\n\nRevoke privileges granted to users that are not authorized access to external applications.","ccis":["CCI-000381"]},{"vulnId":"V-270557","ruleId":"SV-270557r1065281_rule","severity":"medium","ruleTitle":"Access to external executables must be disabled or restricted.","description":"The Oracle external procedure capability provides use of the Oracle process account outside the operation of the database management system (DBMS) process. It can be used to submit and execute applications stored externally from the database under operating system controls. The external procedure process is the subject of frequent and successful attacks as it allows unauthenticated use of the Oracle process account on the operating system. As of Oracle version 11.1, the external procedure agent may be run directly from the database and not require use of the Oracle listener. This reduces the risk of unauthorized access to the procedure from outside of the database process.","checkContent":"Review the system documentation to determine if the use of the external procedure agent is authorized.\n\nReview the ORACLE_HOME/bin directory or search the ORACLE_BASE path for the executable extproc (Unix) or extproc.exe (Windows).\n\nIf 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.\n\nIf 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.\n\nIf use of the external procedure agent is authorized, ensure extproc is restricted to execution of authorized applications.\n\nExternal jobs are run using the account \"nobody\" by default.\n\nReview the contents of the file ORACLE_HOME/rdbms/admin/externaljob.ora for the lines run_user= and run_group=.\n\nIf the user assigned to these parameters is not \"nobody\", this is a finding.\n\nThe external procedure agent (extproc executable) is available directly from the database and does not require definition in the listener.ora file for use.\n\nReview the contents of the file ORACLE_HOME/hs/admin/extproc.ora.\n\nIf the file does not exist, this is a finding.\n\nIf the following entry does not appear in the file, this is a finding:\n\nEXTPROC_DLLS=ONLY:[dll full file name1]:[dll full file name2]:..\n\n[dll full file name] represents a full path and file name.\n\nThis list of file names is separated by \":\".\n\nNote: 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.\n\nEnsure that EXTPROC is not accessible from the listener.\n\nReview the listener.ora file. If any entries reference \"extproc\", this is a finding.\n\nDetermine if the external procedure agent is in use per Oracle 10.x conventions.\n\nReview the listener.ora file.\n\nIf any entries reference \"extproc\", then the agent is in use.\n\nIf external procedure agent is not authorized for use in the system documentation and references to \"extproc\" exist, this is a finding.\n\nSample listener.ora entries with extproc included:\n\nLISTENER =\n(DESCRIPTION =\n(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))\n)\nEXTLSNR =\n(DESCRIPTION =\n(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))\n)\nSID_LIST_LISTENER =\n(SID_LIST =\n(SID_DESC =\n(GLOBAL_DBNAME = ORCL)\n(ORACLE_HOME = /home/oracle/app/oracle/product/19.0/db_1)\n(SID_NAME = ORCL)\n)\n)\nSID_LIST_EXTLSNR =\n(SID_LIST =\n(SID_DESC =\n(PROGRAM = extproc)\n(SID_NAME = PLSExtProc)\n(ORACLE_HOME = /home/oracle/app/oracle/product/19.0/db_1)\n(ENVS=\"EXTPROC_DLLS=ONLY:/home/app1/app1lib.so:/home/app2/app2lib.so,\nLD_LIBRARY_PATH=/private/app2/lib:/private/app1,\nMYPATH=/usr/fso:/usr/local/packages\")\n)\n)\n\nSample tnsnames.ora entries with extproc included:\n\nORCL =\n(DESCRIPTION =\n(ADDRESS_LIST =\n(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))\n)\n(CONNECT_DATA =\n(SERVICE_NAME = ORCL)\n)\n)\nEXTPROC_CONNECTION_DATA =\n(DESCRIPTION =\n(ADDRESS_LIST =\n(ADDRESS = (PROTOCOL = IPC)(KEY = extproc))\n)\n(CONNECT_DATA =\n(SERVER = DEDICATED)\n(SERVICE_NAME = PLSExtProc)\n)\n)\n\nIf EXTPROC is in use, confirm that a listener is dedicated to serving the external procedure agent (as shown above).\n\nView the protocols configured for the listener.\n\nFor the listener to be dedicated, the only entries will be to specify extproc.\n\nIf there is not a dedicated listener in use for the external procedure agent, this is a finding.\n\nIf the PROTOCOL= specified is other than IPC, this is a finding.\n\nVerify and ensure extproc is restricted executing authorized external applications only and extproc is restricted to execution of authorized applications.\n\nReview the listener.ora file.\n\nIf the following entry does not exist, this is a finding:\n\nEXTPROC_DLLS=ONLY:[dll full file name1]:[dll full file name2]:...\n\nNote: [dll full file name] represents a full path and file name. This list of file names is separated by \":\".\n\nNote: 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.\n\nView the listener.ora file (usually in ORACLE_HOME/network/admin or directory specified by the TNS_ADMIN environment variable).\n\nIf multiple listener processes are running, then the listener.ora file for each must be viewed.\n\nFor 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.","fixText":"If use of the external procedure agent is required, then authorize and document the requirement in the system documentation.\n\nIf the external procedure agent must be accessible to the Oracle listener, then specify this and authorize it in the system documentation.\n\nIf use of the Oracle External Procedure agent is not required:\n\n1. Stop the Oracle Listener process.\n2. Remove all references to extproc in the listener.ora and tnsnames.ora files.\n3. Alter the permissions on the executable files:\nUnix: Remove read/write/execute permissions from owner, group, and world.\nWindows: Remove Groups/Users from the executable (except groups SYSTEM and ADMINISTRATORS) and allow READ [only] for SYSTEM and ADMINISTRATORS groups.\n\nIf required:\n\n1. Restrict extproc execution to only authorized applications.\n2. Specify EXTPROC_DLLS=ONLY: [list of authorized DLLS] in the extproc.ora and the listener.ora files.\n3. Create a separate, dedicated listener for use by the external procedure agent.\n\nRefer to the Oracle Net Services Administrators Guides, External Procedures section for detailed configuration information.","ccis":["CCI-000381"]},{"vulnId":"V-270558","ruleId":"SV-270558r1065283_rule","severity":"medium","ruleTitle":"Oracle Database must be configured to prohibit or restrict the use of organization-defined functions, ports, protocols, and/or services, as defined in the Ports, Protocols, and Services Management Category Assurance List (PPSM CAL) and vulnerability assessments.","description":"To prevent unauthorized connection of devices, unauthorized transfer of information, or unauthorized tunneling (i.e., embedding of data types within data types), organizations must disable or restrict unused or unnecessary physical and logical ports/protocols/services on information systems.\n\nApplications are capable of providing a wide variety of functions and services. Some of the functions and services provided by default may not be necessary to support essential organizational operations. Additionally, it is sometimes convenient to provide multiple services from a single component (e.g., email and web services); however, doing so increases risk over limiting the services provided by any one component. \n\nTo support the requirements and principles of least functionality, the application must support the organizational requirements providing only essential capabilities and limiting the use of ports, protocols, and/or services to only those required, authorized, and approved to conduct official business or to address authorized quality of life issues.\n\nDatabase Management Systems using ports, protocols, and services deemed unsafe are open to attack through those ports, protocols, and services. This can allow unauthorized access to the database and through the database to other components of the information system.\n\nSatisfies: SRG-APP-000142-DB-000094, SRG-APP-000383-DB-000364","checkContent":"Review the database management system (DBMS) settings for unapproved functions, ports, protocols, and services.\n\nIf any are found, this is a finding.\n\nFor definitive information on PPSM, refer to https://cyber.mil/ppsm/.\n\n- - - - -\n\nIn 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.","fixText":"Disable functions, ports, protocols, and services that are not approved.\n\n- - - - -\nChange 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.\n\nIf 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.\n\nIssue the command to verify what the current status is:\n$ lsnrctl stat\n\nLoad the new file that was corrected to reflect site-specific requirements:\n$ lsnrctl reload\n\nCheck the status again to verify that the changes have taken place:\n$ lsnrctl stat","ccis":["CCI-000382","CCI-001762"]},{"vulnId":"V-270559","ruleId":"SV-270559r1068298_rule","severity":"medium","ruleTitle":"Oracle Database must ensure users are authenticated with an individual authenticator prior to using a shared authenticator.","description":"To assure individual accountability and prevent unauthorized access, application users (and any processes acting on behalf of users) must be individually identified and authenticated.\n\nA shared authenticator is a generic account used by multiple individuals. Use of a shared authenticator alone does not uniquely identify individual users. An example of a shared authenticator is the Unix OS \"root\" user account, a Windows \"administrator\" account, a \"SA\" account, or a \"helpdesk\" account.\n\nFor example, the Unix and Windows operating systems offer a \"switch user\" capability allowing users to authenticate with their individual credentials and, when needed, switch to the administrator role. This method provides for unique individual authentication prior to using a shared authenticator.\n\nSome applications may not have the need to provide a group authenticator; this is considered a matter of application design. In those instances where the application design includes the use of a shared authenticator, this requirement will apply.\n\nThere may also be instances when specific user actions need to be performed on the information system without unique user identification or authentication. An example of this type of access is a web server which contains publicly releasable information. These types of accesses are allowed but must be explicitly identified and documented by the organization.\n\nWhen shared accounts are used without another means of identifying individual users, users may deny having performed a particular action.\n\nOracle Access Manager may be helpful in meeting this requirement.\n\nOracle Access Manager is used when there is a need for multifactor authentication of applications front-ending Oracle Datasets that may use group accounts. Oracle Access Manager supports using PKI-based smart cards (CAC, PIV) for multifactor authentication. When a user authenticates to a smart card application, the smart card engine produces a certificate-based authentication token. Can configure a certificate-based authentication scheme in Oracle Access Manager that uses information from the smart card certificate. Certificate-based authentication works with any smart card or similar device that presents an X.509 certificate.","checkContent":"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.\n\nReview DBMS settings to determine if individual authentication is required before shared authentication.\n\nIf shared authentication does not require prior individual authentication, this is a finding.\n\nIf using Oracle Access Manager:\nVerify the Authentication Module is set up properly:\n1. Go to the Oracle Access Manager Home Screen and click the Policy Configuration tab. Select the X509Scheme.\n2. Ensure the Authentication Module option is set to X509Plugin.\n\nVerify the Authentication policy is using the x509Scheme:\n1. Go to Oracle Access Manager Home Screen and click the Policy Configuration tab.\n2. Select Application Domains. Select Search.\n3. Select the application domain protecting the Oracle Database.\n4. Select the Authentication Policies tab and click Protected Resource Policy.\n5. Make sure the Authentication Scheme is set to x509Scheme.","fixText":"Configure the DBMS, OS, and/or enterprise-level authentication/access mechanism to require individual authentication prior to authentication for shared account access.\n\nIf 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.","ccis":["CCI-000764"]},{"vulnId":"V-270560","ruleId":"SV-270560r1065286_rule","severity":"medium","ruleTitle":"Oracle Database must uniquely identify and authenticate organizational users (or processes acting on behalf of organizational users).","description":"To ensure accountability and prevent unauthorized access, organizational users must be identified and authenticated.\n\nOrganizational users include organizational employees or individuals the organization deems to have equivalent status of employees (e.g., contractors, guest researchers, individuals from allied nations).\n\nUsers (and any processes acting on behalf of users) are uniquely identified and authenticated for all accesses other than those accesses explicitly identified and documented by the organization which outlines specific user actions that can be performed on the information system without identification or authentication.","checkContent":"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.\n\nIf organizational users are not uniquely identified and authenticated, this is a finding.","fixText":"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.","ccis":["CCI-000764"]},{"vulnId":"V-270561","ruleId":"SV-270561r1112485_rule","severity":"medium","ruleTitle":"Oracle Database must enforce the DOD standards for password complexity.","description":"OS/enterprise authentication and identification must be used (SRG-APP-000023-DB-000001). Native database management system (DBMS) authentication may be used only when circumstances make it unavoidable; and must be documented and authorizing official (AO)-approved.\n\nThe DOD standard for authentication is DOD-approved PKI certificates. Authentication based on User ID and Password may be used only when it is not possible to employ a PKI certificate and requires AO approval.\n\nIn such cases, the DOD standards for password complexity and lifetime must be implemented. DBMS products that can inherit the rules for these from the operating system or access control program (e.g., Microsoft Active Directory) must be configured to do so. For other DBMSs, the rules must be enforced using available configuration parameters or custom code.\n\nNote that user authentication and account management must be done via an enterprise-wide mechanism whenever possible. Examples of enterprise-level authentication/access mechanisms include, but are not limited to, Active Directory and LDAP. This requirement applies to cases where it is necessary to have accounts directly managed by Oracle.","checkContent":"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.\n\nFor each profile that can be applied to accounts where authentication is under Oracle's control, determine the password verification function that is in use:\n\nSELECT * FROM SYS.DBA_PROFILES \nWHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION'\nORDER BY PROFILE;\n\nNote: Profiles can inherit settings from another profile so some password functions could be set to DEFAULT. If so, review the DEFAULT profile function name. \n\nIf the function name is null for any profile, this is a finding.\n\nReview 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. \na. Minimum of 15 characters, including at least one of each of the following character sets:\n- Uppercase\n- Lowercase\n- Numeric\n- Special characters (e.g., ~ ! @ # $ % ^ & * ( ) _ + = - ' [ ] / ? > <)\nb. Minimum number of characters changed from previous password: 50 percent of the minimum password length; that is, eight.\n\nIf any of the above password requirements are not included in the function, this is a finding.","fixText":"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.\n\nIf any user accounts are managed by Oracle, develop, test, and implement a password verification function that enforces DOD requirements.\n\nOracle supplies a sample function called ORA12C_STIG_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:\n\nWindows:\n%ORACLE_HOME%\\RDBMS\\ADMIN\\catpvf.sql\n\nUnix/Linux:\n$ORACLE_HOME/rdbms/admin/catpvf.sql","ccis":["CCI-000192"]},{"vulnId":"V-270562","ruleId":"SV-270562r1064964_rule","severity":"medium","ruleTitle":"Procedures for establishing temporary passwords that meet DOD password requirements for new accounts must be defined, documented, and implemented.","description":"Password maximum lifetime is the maximum period of time, (typically in days) a user's password may be in effect before the user is forced to change it.\n\nPasswords need to be changed at specific policy-based intervals as per policy. Any password, no matter how complex, can eventually be cracked.\n\nOne method of minimizing this risk is to use complex passwords and periodically change them. If the application does not limit the lifetime of passwords and force users to change their passwords, there is the risk that the system and/or application passwords could be compromised.\n\nNew accounts authenticated by passwords that are created without a password or with an easily guessed password are vulnerable to unauthorized access. Procedures for creating new accounts with passwords should include the required assignment of a temporary password to be modified by the user upon first use.\n\nNote that user authentication and account management must be done via an enterprise-wide mechanism whenever possible. Examples of enterprise-level authentication/access mechanisms include, but are not limited to, Active Directory and LDAP With respect to Oracle, this requirement applies to cases where it is necessary to have accounts directly managed by Oracle.","checkContent":"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.\n\nWhere accounts are authenticated using passwords, review procedures and implementation evidence for creation of temporary passwords.\n\nIf the procedures or evidence do not exist or do not enforce passwords to meet DOD password requirements, this is a finding.","fixText":"Implement procedures for assigning temporary passwords to user accounts.\n\nProcedures 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.","ccis":["CCI-000192"]},{"vulnId":"V-270563","ruleId":"SV-270563r1064967_rule","severity":"medium","ruleTitle":"Oracle Database must enforce password maximum lifetime restrictions.","description":"Password maximum lifetime is the maximum period of time, (typically in days) a user's password may be in effect before the user is forced to change it.\n\nPasswords need to be changed at specific policy-based intervals as per policy. Any password, no matter how complex, can eventually be cracked.\n\nOne method of minimizing this risk is to use complex passwords and periodically change them. If the application does not limit the lifetime of passwords and force users to change their passwords, there is the risk that the system and/or application passwords could be compromised.\n\nThe PASSWORD_LIFE_TIME parameter defines the number of days a password remains valid. This can must not be set to UNLIMITED. Further, the PASSWORD_GRACE_TIME parameter, if set to UNLIMITED, can nullify the PASSWORD_LIFE_TIME. PASSWORD_GRACE_TIME must be set to 0 days (or another small integer).\n\nNote: User authentication and account management must be done via an enterprise-wide mechanism whenever possible. Examples of enterprise-level authentication/access mechanisms include, but are not limited to, Active Directory and LDAP. With respect to Oracle, this requirement applies to cases where it is necessary to have accounts directly managed by Oracle.","checkContent":"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.\n\nReview database management system (DBMS) settings to determine if passwords must be changed periodically. Run the following script:\n\nSELECT p1.profile,\nCASE DECODE(p1.limit, 'DEFAULT', p3.limit, p1.limit) WHEN 'UNLIMITED' THEN 'UNLIMITED' ELSE\nCASE DECODE(p2.limit, 'DEFAULT', p4.limit, p2.limit) WHEN 'UNLIMITED' THEN 'UNLIMITED' ELSE\nTO_CHAR(DECODE(p1.limit, 'DEFAULT', p3.limit, p1.limit) + DECODE(p2.limit, 'DEFAULT', p4.limit, p2.limit))\nEND\nEND effective_life_time\nFROM dba_profiles p1, dba_profiles p2, dba_profiles p3, dba_profiles p4\nWHERE p1.profile=p2.profile\nAND p3.profile='DEFAULT'\nAND p4.profile='DEFAULT'\nAND p1.resource_name='PASSWORD_LIFE_TIME'\nAND p2.resource_name='PASSWORD_GRACE_TIME'\nAND p3.resource_name='PASSWORD_LIFE_TIME' -- from DEFAULT profile\nAND p4.resource_name='PASSWORD_GRACE_TIME' -- from DEFAULT profile\norder by 1;\n\nIf 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.\n\nIf PASSWORD_LIFE_TIME or PASSWORD_GRACE_TIME is set to \"UNLIMITED\", this is a finding.","fixText":"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:\n\nALTER PROFILE PPPPPP LIMIT PASSWORD_LIFE_TIME 35 PASSWORD_GRACE_TIME 0;\n\nDo this for each profile applied to user accounts.\n\nNote: 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.\n\nWhere a password lifetime longer than 60 is needed, document the reasons and obtain information system security officer (ISSO) approval.","ccis":["CCI-000192"]},{"vulnId":"V-270564","ruleId":"SV-270564r1136919_rule","severity":"high","ruleTitle":"Oracle Database must, for password-based authentication, store passwords using an approved salted key derivation function, preferably using a keyed hash.","description":"The DOD standard for authentication is DOD-approved public key infrastructure (PKI) certificates.\n\nAuthentication based on user ID and password may be used only when it is not possible to employ a PKI certificate and requires authorizing official (AO) approval.\n\nIn such cases, database passwords stored in clear text, using reversible encryption, or using unsalted hashes would be vulnerable to unauthorized disclosure. Database passwords must always be in the form of one-way, salted hashes when stored internally or externally to the database management system (DBMS).\n\nDatabase passwords stored in clear text are vulnerable to unauthorized disclosure. Database passwords must always be encoded or encrypted when stored internally or externally to the DBMS.\n\nTransport Layer Security (TLS) is the successor protocol to Secure Sockets Layer (SSL). Although the Oracle configuration parameters have names that include \"SSL\", such as SSL_VERSION and SSL_CIPHER_SUITES, they refer to TLS.","checkContent":"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.\n\nReview 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.\n\nDetermine 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. \n\nIf any passwords are stored in clear text, this is a finding. \n\nIf any passwords are stored with reversible encryption, this is a finding. \n\nDetermine if an external password store for applications, batch jobs, and scripts is in use. Verify that all passwords stored there are encrypted.\n\nIf a password store is used and any password is not encrypted, this is a finding.","fixText":"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.\n\nRecord 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.\n\nThe following are notes on implementing a Secure External Password Store using Oracle Wallet.\n\nOracle 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.\n\nCheck to verify what has been stored in the Oracle External Password Store.\n\nTo 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:\n\n$ mkstore -wrl wallet_location -listCredential\n\nFor example: $ mkstore -wrl c:\\oracle\\product\\19.0.0\\db_1\\wallets -listCredential\n\nThe 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.\n\nConfiguring Clients to Use the External Password Store:\n\nIf 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.\n\nFor 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.\n\nIf wanting a client to use the secure external password store feature, then perform the following configuration task:\n\n1. Create a wallet on the client by using the following syntax at the command line:\n\nmkstore -wrl wallet_location -create\n\nFor example: mkstore -wrl c:\\oracle\\product\\19.0.0\\db_1\\wallets -create\nEnter password: password\n\nThe 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.\n\nThe mkstore utility -create option uses password complexity verification.\n\n2. Create database connection credentials in the wallet by using the following syntax at the command line:\n\nmkstore -wrl wallet_location -createCredential db_connect_string username\nEnter password: password\n\nFor example: mkstore -wrl c:\\oracle\\product\\19.0.0\\db_1\\wallets -createCredential oracle system\nEnter password: password\n\nIn 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.\n\n3. 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:\n\nWALLET_LOCATION =\n(SOURCE =\n(METHOD = FILE)\n(METHOD_DATA =\n(DIRECTORY = /private/ora19/network/admin)\n)\n)\n\n4. In the client sqlnet.ora file, enter the SQLNET.WALLET_OVERRIDE parameter and set it to TRUE as follows:\n\nSQLNET.WALLET_OVERRIDE = TRUE\n\nThis setting causes all CONNECT /@db_connect_string statements to use the information in the wallet at the specified location to authenticate to databases.\n\nWhen 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.\n\nBelow is a sample sqlnet.ora file with the WALLET_LOCATION and the SQLNET.WALLET_OVERRIDE parameters set as described in Steps 3 and 4.\n\nWALLET_LOCATION =\n(SOURCE =\n(METHOD = FILE)\n(METHOD_DATA =\n(DIRECTORY = /private/ora19/network/admin)\n)\n)\nSQLNET.WALLET_OVERRIDE = TRUE\nSSL_CLIENT_AUTHENTICATION = FALSE\nSSL_VERSION = 1.1 or 1.2\n\nNote: 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:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html","ccis":["CCI-000196"]},{"vulnId":"V-270565","ruleId":"SV-270565r1136921_rule","severity":"medium","ruleTitle":"If passwords are used for authentication, the Oracle Database must transmit only encrypted representations of passwords.","description":"The DOD standard for authentication is DOD-approved public key infrastructure (PKI) certificates.\n\nAuthentication based on user ID and password may be used only when it is not possible to employ a PKI certificate, and requires authorizing official (AO) approval.\n\nIn such cases, passwords need to be protected at all times, and encryption is the standard method for protecting passwords during transmission.\n\nDatabase management system (DBMS) passwords sent in clear text format across the network are vulnerable to discovery by unauthorized users. Disclosure of passwords may easily lead to unauthorized access to the database.\n\nTransport Layer Security (TLS) is the successor protocol to Secure Sockets Layer (SSL). Although the Oracle configuration parameters have names including \"SSL\", such as SSL_VERSION and SSL_CIPHER_SUITES, they refer to TLS.","checkContent":"If all accounts are authenticated by the OS or an enterprise-level authentication/access mechanism and not by Oracle, this is not a finding.\n\nReview configuration settings for encrypting passwords in transit across the network. If passwords are not encrypted, this is a finding. \n\nThe database supports PKI-based authentication by using digital certificates over TLS in addition to the native encryption and data integrity capabilities of these protocols.\n\nOracle provides a complete PKI that is based on RSA Security, Inc., Public-Key Cryptography Standards, and interoperates with Oracle servers and clients. The database uses a wallet that is a container 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.\n\nVerify the $ORACLE_HOME/network/admin/sqlnet.ora contains entries similar to the following to confirm TLS is installed: \n\nWALLET_LOCATION = (SOURCE=\n(METHOD = FILE) \n(METHOD_DATA = \nDIRECTORY=/wallet)\n\nSSL_CIPHER_SUITES=(SSL_cipher_suiteExample) \nSSL_VERSION = 1.1 or 1.2\nSSL_CLIENT_AUTHENTICATION=TRUE\n\nIf the sqlnet.ora file does not contain such entries, this is a finding.","fixText":"Configure encryption for transmission of passwords across the network.\n\nConfigure the database to support TLS protocols and the Oracle Wallet to store authentication and signing credentials, including private keys. \n\nMore 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.","ccis":["CCI-000197"]},{"vulnId":"V-270566","ruleId":"SV-270566r1136923_rule","severity":"high","ruleTitle":"Oracle Database, when using public key infrastructure (PKI)-based authentication, must enforce authorized access to the corresponding private key.","description":"The cornerstone of the PKI is the private key used to encrypt or digitally sign information.\n\nIf the private key is stolen, this will lead to the compromise of the authentication and nonrepudiation gained through PKI because the attacker can use the private key to digitally sign documents and can pretend to be the authorized user.\n\nBoth the holders of a digital certificate and the issuing authority must protect the computers, storage devices, or whatever they use to keep the private keys.\n\nAll access to the private key of Oracle Database must be restricted to authorized and authenticated users. If unauthorized users have access to the database management system's (DBMS's) private key, an attacker could gain access to the primary key and use it to impersonate the database on the network.\n\nTransport Layer Security (TLS) is the successor protocol to Secure Sockets Layer (SSL). Although the Oracle configuration parameters have names including 'SSL', such as SSL_VERSION and SSL_CIPHER_SUITES, they refer to TLS.","checkContent":"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.\n\nThe database supports authentication by using digital certificates over TLS in addition to the native encryption and data integrity capabilities of these protocols.\n\nAn 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.\n\nVerify the $ORACLE_HOME/network/admin/sqlnet.ora contains entries similar to the following to confirm TLS is installed: \n\nWALLET_LOCATION = (SOURCE=\n(METHOD = FILE) \n(METHOD_DATA = \nDIRECTORY=/wallet)\n\nSSL_CIPHER_SUITES=(SSL_cipher_suiteExample) \nSSL_VERSION = 1.1 or 1.2\nSSL_CLIENT_AUTHENTICATION=TRUE\n\nIf the sqlnet.ora file does not contain such entries, this is a finding.","fixText":"Implement strong access and authentication controls to protect the database's private key.\n\nConfigure the database to support TLS protocols and the Oracle Wallet to store authentication and signing credentials, including private keys. \n\nMore 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.","ccis":["CCI-000186"]},{"vulnId":"V-270567","ruleId":"SV-270567r1064979_rule","severity":"medium","ruleTitle":"Oracle Database must map the authenticated identity to the user account using public key infrastructure (PKI)-based authentication.","description":"The DOD standard for authentication is DOD-approved PKI certificates. Once a PKI certificate has been validated, it must be mapped to a database management system (DBMS) user account for the authenticated identity to be meaningful to the DBMS and useful for authorization decisions.","checkContent":"Review DBMS configuration to verify DBMS user accounts are being mapped directly to unique identifying information within the validated PKI certificate.\n\nIf user accounts are not being mapped to authenticated identities, this is a finding.","fixText":"Configure the DBMS to map the authenticated identity directly to the DBMS user account.","ccis":["CCI-000187"]},{"vulnId":"V-270568","ruleId":"SV-270568r1136925_rule","severity":"high","ruleTitle":"When using command-line tools such as Oracle SQL*Plus, which can accept a plain-text password, users must use an alternative logon method that does not expose the password.","description":"The DOD standard for authentication is DOD-approved public key infrastructure (PKI) certificates.\n\nNormally, with PKI authentication, the interaction with the user for authentication will be handled by a software component separate from the database management system (DBMS), such as ActivIdentity ActivClient. However, in cases where the DBMS controls the interaction, this requirement applies.\n\nTo prevent the compromise of authentication information such as passwords and PINs during the authentication process, the feedback from the system must not provide any information that would allow an unauthorized user to compromise the authentication mechanism. \n\nObfuscation of user-provided authentication secrets when typed into the system is a method used in addressing this risk. \n\nDisplaying asterisks when a user types in a password or a smart card PIN is an example of obscuring feedback of authentication secrets.\n\nThis requires reviewing applications, which will involve collaboration with the application developers. It is recognized that in many cases, the database administrator (DBA) is organizationally separate from the application developers, and may have limited, if any, access to source code. Nevertheless, protections of this type are so important to the secure operation of databases that they must not be ignored. At a minimum, the DBA must attempt to obtain assurances from the development organization that this issue has been addressed and must document what has been discovered.","checkContent":"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.\n\nRequest 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.","fixText":"For Oracle SQL*Plus, which cannot be configured not to accept a plain-text password, and any other essential tool with the same limitation:\n\n1. Document the need for it, who uses it, and any relevant mitigations, and obtain AO approval.\n2. Train all users of the tool in the importance of not using the plain-text password option and how to keep the password hidden.\n\nConsider wrapping the startup command with a shell or wrapper and using an Oracle external password store.\n\nOracle 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.\n\nCheck to verify what has been stored in the Oracle External Password Store.\n\nTo 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:\n\n$ mkstore -wrl wallet_location -listCredential\n\nFor example:\n\n$ mkstore -wrl c:\\oracle\\product\\19.0.0\\db_1\\wallets -listCredential\n\nThe 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.\n\nConfiguring Clients to Use the External Password Store\n\nIf 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.\n\nFor 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.\n\nIf wanting a client to use the secure external password store feature, perform the following configuration task:\n\n1. Create a wallet on the client by using the following syntax at the command line:\norapki create -wallet wallet_location -auto_login_local\n\nFor example:\norapki wallet create -wallet c:\\oracle\\product\\19.0.0\\db_1\\wallets -auto_login_local\nEnter password: password\n\nThe 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.\n\nThe mkstore utility -create option uses password complexity verification.\n\n2. Create database connection credentials in the wallet by using the following syntax at the command line:\nmkstore -wrl wallet_location -createCredential db_connect_string username\nEnter password: password\n\nFor example:\nmkstore -wrl c:\\oracle\\product\\19.0.0\\db_1\\wallets -createCredential oracle system\nEnter password: password\n\nIn this specification:\nThe 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.\n\nThe 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.\n\nThe username is the database logon credential. When prompted, enter the password for this user.\n\n3. 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, enter the following into the client sqlnet.ora file:\n\nWALLET_LOCATION =\n(SOURCE =\n(METHOD = FILE)\n(METHOD_DATA =\n(DIRECTORY = /private/ora19/network/admin)\n)\n)\n\n4. In the client sqlnet.ora file, enter the SQLNET.WALLET_OVERRIDE parameter and set it to TRUE as follows:\n\nSQLNET.WALLET_OVERRIDE = TRUE\n\nThis setting causes all CONNECT /@db_connect_string statements to use the information in the wallet at the specified location to authenticate to databases.\n\nWhen 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, these connect statements also fail.\n\nBelow is a sample sqlnet.ora file with the WALLET_LOCATION and the SQLNET.WALLET_OVERRIDE parameters set as described in Steps 3 and 4.\n\nBelow is a sample SQLNET.ORA File with wallet parameters set.\n\nWALLET_LOCATION =\n(SOURCE =\n(METHOD = FILE)\n(METHOD_DATA =\n(DIRECTORY = /private/ora19/network/admin)\n)\n)\n\nSQLNET.WALLET_OVERRIDE = TRUE\nSSL_CLIENT_AUTHENTICATION = FALSE\nSSL_VERSION = 1.1 or 1.2\n\nNote: 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:\nhttps://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html.","ccis":["CCI-000206"]},{"vulnId":"V-270569","ruleId":"SV-270569r1065205_rule","severity":"high","ruleTitle":"Oracle Database must use NIST-validated FIPS 140-2/140-3 compliant cryptography for authentication mechanisms.","description":"Use of weak or not validated cryptographic algorithms undermines the purposes of using encryption and digital signatures to protect data. Weak algorithms can be easily broken and not validated cryptographic modules may not implement algorithms correctly. Unapproved cryptographic modules or algorithms should not be relied on for authentication, confidentiality, or integrity. Weak cryptography could allow an attacker to gain access to and modify data stored in the database as well as the administration settings of the database management system (DBMS).\n\nApplications (including DBMSs) using cryptography are required to use approved NIST FIPS 140-2/140-3 validated cryptographic modules that meet the requirements of applicable federal laws, Executive Orders, directives, policies, regulations, standards, and guidance.\n\nNSA Type-X (where X=1, 2, 3, 4) products are NSA-certified, hardware-based encryption modules.\n\nThe standard for validating cryptographic modules will transition to the NIST FIPS 140-3 publication.\n\nFIPS 140-2 modules can remain active for up to five years after validation or until September 21, 2026, when the FIPS 140-2 validations will be moved to the historical list. Even on the historical list, CMVP supports the purchase and use of these modules for existing systems. While federal agencies decide when they move to FIPS 140-3 only modules, purchasers are reminded that for several years there may be a limited selection of FIPS 140-3 modules from which to choose. CMVP recommends purchasers consider all modules that appear on the Validated Modules Search Page:\nhttps://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules.\n\nMore information on the FIPS 140-3 transition can be found here: \nhttps://csrc.nist.gov/Projects/fips-140-3-transition-effort/.","checkContent":"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.\n\nTo verify if Oracle is configured for FIPS 140 Secure Sockets Layer (SSL)/Transport Layer Security (TLS) authentication and/or encryption:\n\nOpen 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.)\n\nIf the line \"SSLFIPS_140=TRUE\" is not found in fips.ora, or the file does not exist, this is a finding.","fixText":"Utilize NIST-validated FIPS 140-2/140-3 compliant cryptography for all authentication mechanisms.\n\nOpen 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.)\nCreate or modify fips.ora to include the line \"SSLFIPS_140=TRUE\".\n\nThe strength requirements are dependent upon data classification.\n\nFor unclassified data, where cryptography is required:\nAES 128 for encryption\nSHA 256 for hashing\n\nNSA has established the suite B encryption requirements for protecting National Security Systems (NSS) as follows:\nAES 128 for Secret\nAES 256 for Top Secret\nSHA 256 for Secret\nSHA 384 for Top Secret\n\nNSS 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).\n\nThere 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.\n\nNote: 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.\n\nFIPS documentation can be downloaded from https://csrc.nist.gov/publications/fips.","ccis":["CCI-000803"]},{"vulnId":"V-270570","ruleId":"SV-270570r1065294_rule","severity":"medium","ruleTitle":"Oracle Database must uniquely identify and authenticate nonorganizational users (or processes acting on behalf of nonorganizational users).","description":"Nonorganizational users include all information system users other than organizational users which include organizational employees or individuals the organization deems to have equivalent status of employees (e.g., contractors, guest researchers, individuals from allied nations).\n\nNonorganizational users must be uniquely identified and authenticated for all accesses other than those accesses explicitly identified and documented by the organization when related to the use of anonymous access, such as accessing a web server.\n\nAccordingly, a risk assessment is used in determining the authentication needs of the organization.\n\nScalability, practicality, and security are simultaneously considered in balancing the need to ensure ease of use for access to federal information and information systems with the need to protect and adequately mitigate risk to organizational operations, organizational assets, individuals, other organizations, and the nation.","checkContent":"Review database management system (DBMS) settings to determine whether nonorganizational users are uniquely identified and authenticated when logging onto the system.\n\nIf nonorganizational users are not uniquely identified and authenticated, this is a finding.","fixText":"Configure DBMS settings to uniquely identify and authenticate all nonorganizational users who log onto the system.","ccis":["CCI-000804"]},{"vulnId":"V-270571","ruleId":"SV-270571r1137664_rule","severity":"high","ruleTitle":"Oracle Database must implement NIST FIPS 140-2/140-3 validated cryptographic modules to protect unclassified information requiring confidentiality and cryptographic protection, in accordance with the data owner's requirements.","description":"Use of weak or untested encryption algorithms undermines the purposes of using encryption to protect data. The application must implement cryptographic modules adhering to the higher standards approved by the federal government since this provides assurance they have been tested and validated.\n\nIt is the responsibility of the data owner to assess the cryptography requirements in light of applicable federal laws, Executive Orders, directives, policies, regulations, and standards.\n\nFor detailed information, refer to NIST FIPS Publication 140-3, Security Requirements For Cryptographic Modules. Note that the product's cryptographic modules must be validated and certified by NIST as FIPS-compliant.","checkContent":"If encryption is not required for the database, this is not a finding.\n\nIf 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.\n\nCheck 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.\n\nFor Transparent Data Encryption and DBMS_CRYPTO:\n\nTo verify if Oracle is configured for FIPS 140 Transparent Data Encryption and/or DBMS_CRYPTO, enter the following SQL*Plus command:\nSHOW PARAMETER DBFIPS_140\nor the following SQL query:\nSELECT * FROM SYS.V$PARAMETER WHERE NAME = 'DBFIPS_140';\n\nIf Oracle returns the value \"FALSE\", or returns no rows, this is a finding.\n\nTo verify if Oracle is configured for FIPS 140 Secure Sockets Layer (SSL)/Transport Layer Security (TLS) authentication and/or encryption:\n\nOpen 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.)\n\nIf the line \"SSLFIPS_140=TRUE\" is not found in fips.ora, or the file does not exist, this is a finding.\n\nFor (Native) Network Data Encryption:\nIf 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).","fixText":"Implement required cryptographic protections using cryptographic modules complying with applicable federal laws, Executive Orders, directives, policies, regulations, standards, and guidance.\n\nOpen 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.)\n\nCreate or modify fips.ora to include the line \"SSLFIPS_140=TRUE\".\n\nThe strength requirements are dependent upon data classification.\n\nFor unclassified data, where cryptography is required:\nAES 128 for encryption\nSHA 256 for hashing\n\nNSA has established the suite B encryption requirements for protecting National Security Systems (NSS) as follows:\nAES 128 for Secret\nAES 256 for Top Secret\nSHA 256 for Secret\nSHA 384 for Top Secret\n\nNSS 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).\n\nMore 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.","ccis":["CCI-002450"]},{"vulnId":"V-270572","ruleId":"SV-270572r1137655_rule","severity":"medium","ruleTitle":"Oracle Database must separate user functionality (including user interface services) from database management functionality.","description":"Information system management functionality includes functions necessary to administer databases, network components, workstations, or servers, and typically requires privileged user access.\n\nThe separation of user functionality from information system management functionality is either physical or logical and is accomplished by using different computers, different central processing units, different instances of the operating system, different network addresses, combinations of these methods, or other methods, as appropriate.\n\nAn example of this type of separation is observed in web administrative interfaces that use separate authentication methods for users of any other information system resources.\n\nThis may include isolating the administrative interface on a different domain and with additional access controls.\n\nIf administrative functionality or information regarding database management system (DBMS) management is presented on an interface available for users, information on DBMS settings may be inadvertently made available to the user.","checkContent":"Check DBMS settings and vendor documentation to verify administrative functionality is separate from user functionality.\n\nIf administrator and general user functionality is not separated either physically or logically, this is a finding.","fixText":"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.\n\nThis includes separation of duties for administrative users, schema owners, and application (general) users. Oracle's recommendation is Oracle Database Vault to solve this problem.\n\nOracle 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.","ccis":["CCI-001082"]},{"vulnId":"V-270573","ruleId":"SV-270573r1064997_rule","severity":"medium","ruleTitle":"Oracle Database must preserve any organization-defined system state information in the event of a system failure.","description":"Failure in a known state can address safety or security in accordance with the mission/business needs of the organization. Failure in a known secure state helps prevent a loss of confidentiality, integrity, or availability in the event of a failure of the information system or a component of the system.\n\nPreserving information system state information helps to facilitate system restart and return to the operational mode of the organization with less disruption of mission/business processes.","checkContent":"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.\n\nIf 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.\n\nCheck database management system (DBMS) settings to determine whether system state information is being preserved in the event of a system failure.\n\nThe 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\".\n\nOracle 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.\n\nIssue the following commands to check the status of archive log mode:\n\n$ sqlplus connect as sysdba --Check current archivelog mode in database\n\nSQL> archive log list\nDatabase log mode Archive Mode\nAutomatic archival Enabled\nArchive destination /home/oracle/app/oracle/arc2/ORCL\nOldest online log sequence 433\nNext log sequence to archive 435\nCurrent log sequence 435\n\nIf archive log mode is not enabled, this is a finding.","fixText":"Configure DBMS settings to preserve all required system state information in the event of a system failure.\n\nIf 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. \n\n$ sqlplus connect as sysdba -- stop and dismount database and shutdown instance.\nSQL> shutdown immediate;\n\nDatabase closed.\nDatabase dismounted.\nORACLE instance shut down.\n\nSQL> startup mount; -- Restart instance.\n\nORACLE instance started.\nTotal System Global Area 1653518336 bytes\nFixed Size 2228904 bytes\nVariable Size 1325403480 bytes\nDatabase Buffers 318767104 bytes\nRedo Buffers 7118848 bytes\nDatabase mounted.\n\nSQL> alter database archivelog; -- Enable ArchiveLog\nDatabase altered.\n\nSQL> alter database open; -- Re-open database\nDatabase altered.\n\nIssue the following command to verify the new status:\nSQL> select log_mode from v$database;\n\nLOG_MODE\n------------\nARCHIVELOG\n\nSQL> archive log list;\n\nDatabase log mode Archive Mode\nAutomatic archival Enabled\nArchive destination USE_DB_RECOVERY_FILE_DEST\nOldest online log sequence 294\nNext log sequence to archive 296\nCurrent log sequence 296\n\nThe 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.","ccis":["CCI-001665"]},{"vulnId":"V-270574","ruleId":"SV-270574r1192921_rule","severity":"high","ruleTitle":"Oracle Database must take steps to protect data at rest and ensure confidentiality and integrity of application data.","description":"This control is intended to address the confidentiality and integrity of information at rest in nonmobile devices and covers user information and system information. Information at rest refers to the state of information when it is located on a secondary storage device (e.g., disk drive, tape drive) within an organizational information system. Applications and application users generate information throughout the course of their application use.\n\nUser-generated data and application-specific configuration data must be protected. Configurations and/or rule sets for firewalls, gateways, intrusion detection/prevention systems, and filtering routers and authenticator content are examples of system information likely requiring protection. Organizations may choose to employ different mechanisms to achieve confidentiality and integrity protections, as appropriate.\n\nIf the confidentiality and integrity of application data is not protected, the data will be open to compromise and unauthorized modification.","checkContent":"Review system documentation to determine whether the system handles classified information. If the system does not handle classified information, the severity of this check is downgraded to CAT II. \n \nIf the application owner and authorizing official (AO) have determined that encryption of data at rest is required, verify the data on secondary devices is encrypted. \n \nIf full-disk encryption is being used, this is not a finding. \n\nIf data encryption is required, verify that the data is encrypted before being put on the secondary device. 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.\n\nOracle recommends using Transparent Data Encryption, which is part of Oracle Advanced Security Option, to protect data.\n\nTo verify the data is encrypted, 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 verify the data at rest is encrypted.\n\n$ sqlplus connect as sysdba\n\nSQL> SELECT t.name \"TSName\",\ne.encryptionalg \"Algorithm\",\nd.file_name \"File Name\"\nFROM v$tablespace t,\nv$encrypted_tablespaces e,\ndba_data_files d\nWHERE t.ts# = e.ts#\nand t.name = d.tablespace_name;\n\nThe next SQL statement lists the table owner, tables within encrypted tablespaces, and the encryption algorithm:\n\nSQL> SELECT a.owner \"Owner\",\na.table_name \"Table Name\",\ne.encryptionalg \"Algorithm\"\nFROM dba_tables a,\nv$encrypted_tablespaces e\nWHERE a.tablespace_name in (select t.name from v$tablespace t, v$encrypted_tablespaces e where t.ts# = e.ts#);\n\nFor each database where encryption is required, verify that encryption is in effect. If it is not, this is a finding.","fixText":"Apply appropriate controls to protect the confidentiality and integrity of data at rest in the database.\n\nIf no site-specific precautions are in place, use Oracle Advanced Security Option to encrypt data at rest.\n\nIf Oracle Advanced Security Option is not an option, use site-specific procedures to secure data at rest.","ccis":["CCI-001199"]},{"vulnId":"V-270575","ruleId":"SV-270575r1065003_rule","severity":"medium","ruleTitle":"Oracle Database must implement cryptographic mechanisms to prevent unauthorized modification of organization-defined information at rest (to include, at a minimum, PII and classified information) on organization-defined information system components.","description":"Database management systems (DBMSs) handling data requiring data at rest protections must employ cryptographic mechanisms to prevent unauthorized disclosure and modification of the information at rest. These cryptographic mechanisms may be native to the DBMS or implemented via additional software or operating system/file system settings, as appropriate to the situation.\n\nSelection of a cryptographic mechanism is based on the need to protect the integrity of organizational information. The strength of the mechanism is commensurate with the security category and/or classification of the information. Organizations have the flexibility to either encrypt all information on storage devices (i.e., full disk encryption) or encrypt specific data structures (e.g., files, records, or fields). \n\nThe decision whether and what to encrypt rests with the data owner and is also influenced by the physical measures taken to secure the equipment and media on which the information resides.","checkContent":"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.\n\nIf no information is identified as requiring such protection, this is not a finding.\n\nReview the configuration of the DBMS, operating system/file system, and additional software as relevant.\n\nIf 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.","fixText":"Configure the DBMS, operating system/file system, and additional software as relevant, to provide the required level of cryptographic protection.","ccis":["CCI-002475"]},{"vulnId":"V-270576","ruleId":"SV-270576r1065006_rule","severity":"medium","ruleTitle":"Oracle Database must isolate security functions from nonsecurity functions by means of separate security domains.","description":"An isolation boundary provides access control and protects the integrity of the hardware, software, and firmware that perform security functions. \n\nSecurity functions are the hardware, software, and/or firmware of the information system responsible for enforcing the system security policy and supporting the isolation of code and data on which the protection is based.\n\nDevelopers and implementers can increase the assurance in security functions by employing well-defined security policy models; structured, disciplined, and rigorous hardware and software development techniques; and sound system/security engineering principles. \n\nDatabase management systems (DBMSs) typically separate security functionality from nonsecurity functionality via separate databases or schemas. Database objects or code implementing security functionality should not be commingled with objects or code implementing application logic. When security and nonsecurity functionality are commingled, users who have access to nonsecurity functionality may be able to access security functionality.","checkContent":"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.\n\nIf security-related database objects or code are not kept separate, this is a finding.\n\nThe 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.","fixText":"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.","ccis":["CCI-001084"]},{"vulnId":"V-270577","ruleId":"SV-270577r1137656_rule","severity":"medium","ruleTitle":"Oracle Database contents must be protected from unauthorized and unintended information transfer by enforcement of a data-transfer policy.","description":"Applications, including database management systems (DBMSs), must prevent unauthorized and unintended information transfer via shared system resources. \n\nData used for the development and testing of applications often involves copying data from production. It is important that specific procedures exist for this process, to include the conditions under which such transfer may take place, where the copies may reside, and the rules for ensuring sensitive data are not exposed.\n\nCopies of sensitive data must not be misplaced or left in a temporary location without the proper controls.","checkContent":"Review the procedures for the refreshing of development/test data from production.\n\nReview 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.\n\nVerify that copies of production data are not left in unprotected locations. \n\nIf 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.\n\nIf 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.","fixText":"Restrict accessibility of Oracle system tables and other configuration information or metadata to database administrators (DBAs) or other authorized users.  \n\nModify 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.\n\nImplement policy and procedures to modify or remove sensitive information in production exports prior to import into development databases.","ccis":["CCI-001090"]},{"vulnId":"V-270578","ruleId":"SV-270578r1137658_rule","severity":"medium","ruleTitle":"Access to Oracle Database files must be limited to relevant processes and to authorized, administrative users.","description":"Applications, including database management systems (DBMSs), must prevent unauthorized and unintended information transfer via shared system resources. Permitting only DBMS processes and authorized, administrative users to have access to the files where the database resides helps ensure that those files are not shared inappropriately and are not open to backdoor access and manipulation.","checkContent":"Review the permissions granted to users by the operating system/file system on the database files, database log files, and database backup files.\n\nOn Unix Systems:\n\n  ls -ld [pathname]\n\nSubstitute [pathname] with the directory path where the database files, logs, and database backup files are located.\n(examples: /*/app/oracle/oradata/db_name, /*/app/oracle/oradata/db_name/audit, and /*/app/oracle/fast_recovery_area/db_name) \n\nIf permissions are granted for world access, this is a finding.\n\nIf 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.\n\nOn Windows Systems (from Windows Explorer):\n\nBrowse to the directory specified (example: %ORACLE_BASE%\\oradata and %ORACLE_BASE%\\fast_recovery_area). 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.\n\nSelect and right-click on the directory >> Properties >> Security tab.\n\nIf permissions are granted to everyone, this is a finding.\n\nIf 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 permitted to read/view any of these files, this is a finding.","fixText":"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.","ccis":["CCI-001090"]},{"vulnId":"V-270579","ruleId":"SV-270579r1065015_rule","severity":"high","ruleTitle":"Oracle Database must employ cryptographic mechanisms preventing the unauthorized disclosure of information during transmission unless the transmitted data is otherwise protected by alternative physical measures.","description":"Preventing the disclosure of transmitted information requires that applications take measures to employ some form of cryptographic mechanism to protect the information during transmission. This is usually achieved using Transport Layer Security (TLS), secure sockets layer (SSL) virtual private network (VPN), or IPsec tunnel.\n\nAlternative physical protection measures include Protected Distribution Systems (PDS). PDS are used to transmit unencrypted classified NSI through an area of lesser classification or control. Inasmuch as the classified NSI is unencrypted, the PDS must provide adequate electrical, electromagnetic, and physical safeguards to deter exploitation. Refer to NSTSSI No. 7003 for additional details on a PDS.\n\nInformation in transmission is particularly vulnerable to attack. If the database management system (DBMS) does not employ cryptographic mechanisms preventing unauthorized disclosure of information during transit, the information may be compromised.\n\nSHA-1 is in the process of being removed from service within the DOD and its use is to be limited during the transition to SHA-2. Use of SHA-1 for digital signature generation is prohibited. Allowable uses during the transition include CHECKSUM usage and verification of legacy certificate signatures. SHA-1 is considered a temporary solution during legacy application transitionary periods and should not be engineered into new applications. SHA-2 is the path forward for DOD.","checkContent":"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.\n\nTo 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:\n\nSQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT= (SHA384)\nSQLNET.CRYPTO_CHECKSUM_TYPES_SERVER= (SHA384)\nSQLNET.ENCRYPTION_TYPES_CLIENT= (AES256)\n\nSQLNET.ENCRYPTION_TYPES_SERVER= (AES256)\nSQLNET.CRYPTO_CHECKSUM_CLIENT = requested\nSQLNET.CRYPTO_CHECKSUM_SERVER = required\n\nThe 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.","fixText":"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.","ccis":["CCI-002420"]},{"vulnId":"V-270580","ruleId":"SV-270580r1068300_rule","severity":"medium","ruleTitle":"Oracle Database must check the validity of data inputs.","description":"Invalid user input occurs when a user inserts data or characters into an application's data entry fields and the application is unprepared to process that data. This results in unanticipated application behavior, potentially leading to an application or information system compromise. Invalid user input is one of the primary methods employed when attempting to compromise an application.\n\nAll applications need to validate the data users attempt to input to the application for processing. Rules for checking the valid syntax and semantics of information system inputs (e.g., character set, length, numerical range, acceptable values) are in place to verify inputs match specified definitions for format and content. Inputs passed to interpreters are prescreened to prevent the content from being unintentionally interpreted as commands.\n\nThis requires for inspection of application source code, which will involve collaboration with the application developers. It is recognized that in many cases, the database administrator (DBA) is organizationally separate from the application developers and may have limited, if any, access to source code. Nevertheless, protections of this type are so important to the secure operation of databases that they must not be ignored. At a minimum, the DBA must attempt to obtain assurances from the development organization that this issue has been addressed and must document what has been discovered.\n\nOracle provides built-in processes to keep data and its integrity intact by using constraints.\n\nIntegrity Constraint States can specify that a constraint is enabled (ENABLE) or disabled (DISABLE). If a constraint is enabled, data is checked as it is entered or updated in the database, and data that does not conform to the constraint is prevented from being entered. If a constraint is disabled, then data that does not conform can be allowed to enter the database.\n\nAdditionally, can specify that existing data in the table must conform to the constraint (VALIDATE). Conversely, if specified NOVALIDATE, are not ensured that existing data conforms.\n\nAn integrity constraint defined on a table can be in one of the following states:\nENABLE, VALIDATE\nENABLE, NOVALIDATE\nDISABLE, VALIDATE\nDISABLE, NOVALIDATE","checkContent":"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.\n\nIf code exists that allows invalid data to be acted upon or input into the database, this is a finding.\n\nIf field definitions do not exist in the database, this is a finding.\n\nIf fields do not contain enabled constraints where required, this is a finding.","fixText":"Modify database code to properly validate data before it is put into the database or acted upon by the database.\n\nModify database to contain field definitions for each field in the database.\n\nModify database to contain constraints on database columns and tables that require them for data validity.\n\nReview 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.\n\nEnabling Constraints Upon Definition: The following CREATE TABLE and ALTER TABLE statements both define and enable integrity constraints:\nCREATE TABLE emp (\nempno NUMBER(5) CONSTRAINT emp.pk PRIMARY KEY, . . . ) ;\nALTER TABLE emp\nADD CONSTRAINT emp.pk PRIMARY KEY (empno);\n\nAn 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.\n\nWhen enabling a UNIQUE or PRIMARY KEY constraint, an associated index is created.  \n\nFor 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.\n\nDisabling 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:\n\n- When loading large amounts of data into a table;\n\n- 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\n\n- When importing or exporting one table at a time.\n\nIn all three cases, temporarily disabling integrity constraints can improve the performance of the operation, especially in data warehouse configurations.\n\nIt 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.\n\nEnabling 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.\n\nCan 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.\n\nENABLE, 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.\n\nEnabling 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.\n\nEfficient Use of Integrity Constraints: A Procedure:\nUsing integrity constraint states in the following order can ensure the best benefits:\n- Disable state.\n- Perform the operation (load, export, import).\n- ENABLE, NOVALIDATE state.\n- Enable state.\n\nSome benefits of using constraints in this order are:\n- No locks are held.\n- All constraints can go to enable state concurrently.\n- Constraint enabling is done in parallel.\n- Concurrent activity on table is permitted.\n\nSetting 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.\n\nDisabling Constraints Upon Definition: The following CREATE TABLE and ALTER TABLE statements both define and disable integrity constraints:\n\nCREATE TABLE emp (\nempno NUMBER(5) PRIMARY KEY DISABLE, . . . ;\n\nALTER TABLE emp\nADD PRIMARY KEY (empno) DISABLE;\n\nAn 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.\n\nEnabling Constraints Upon Definition:\n\nThe following CREATE TABLE and ALTER TABLE statements both define and enable integrity constraints:\n\nCREATE TABLE emp (\nempno NUMBER(5) CONSTRAINT emp.pk PRIMARY KEY, . . . ;\n\nALTER TABLE emp\nADD CONSTRAINT emp.pk PRIMARY KEY (empno);\n\nAn 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.","ccis":["CCI-001310"]},{"vulnId":"V-270581","ruleId":"SV-270581r1065225_rule","severity":"medium","ruleTitle":"The database management system (DBMS) and associated applications must reserve the use of dynamic code execution for situations that require it.","description":"With respect to database management systems, one class of threat is known as SQL Injection, or more generally, code injection. It takes advantage of the dynamic execution capabilities of various programming languages, including dialects of SQL. In such cases, the attacker deduces the manner in which SQL statements are being processed, either from inside knowledge or by observing system behavior in response to invalid inputs. When the attacker identifies scenarios where SQL queries are being assembled by application code (which may be within the database or separate from it) and executed dynamically, the attacker is then able to craft input strings that subvert the intent of the query. Potentially, the attacker can gain unauthorized access to data, including security settings, and severely corrupt or destroy the database.\n\nThe principal protection against code injection is not to use dynamic execution except where it provides necessary functionality that cannot be used otherwise. Use strongly typed data items rather than general-purpose strings as input parameters to task-specific, precompiled stored procedures and functions (and triggers).\n\nThis requires inspection of application source code, which will involve collaboration with the application developers. It is recognized that in many cases, the database administrator (DBA) is organizationally separate from the application developers, and may have limited, if any, access to source code. Nevertheless, protections of this type are so important to the secure operation of databases that they must not be ignored. At a minimum, the DBA must attempt to obtain assurances from the development organization that this issue has been addressed and must document what has been discovered.","checkContent":"Review DBMS source code (stored procedures, functions, triggers) and application source code, to identify cases of dynamic code execution.\n\nIf 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.","fixText":"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.","ccis":["CCI-001310"]},{"vulnId":"V-270582","ruleId":"SV-270582r1065226_rule","severity":"medium","ruleTitle":"The database management system (DBMS) and associated applications, when making use of dynamic code execution, must take steps against invalid values that may be used in a SQL injection attack, therefore resulting in steps to prevent a SQL injection attack.","description":"With respect to database management systems, one class of threat is known as SQL Injection, or more generally, code injection. It takes advantage of the dynamic execution capabilities of various programming languages, including dialects of SQL. In such cases, the attacker deduces the manner in which SQL statements are being processed, either from inside knowledge or by observing system behavior in response to invalid inputs. When the attacker identifies scenarios where SQL queries are being assembled by application code (which may be within the database or separate from it) and executed dynamically, the attacker is then able to craft input strings that subvert the intent of the query. Potentially, the attacker can gain unauthorized access to data, including security settings, and severely corrupt or destroy the database.\n\nThe principal protection against code injection is not to use dynamic execution except where it provides necessary functionality that cannot be used otherwise. Use strongly typed data items rather than general purpose strings as input parameters to task-specific, precompiled stored procedures and functions (and triggers).\n\nWhen dynamic execution is necessary, ways to mitigate the risk include the following, which should be implemented both in the on-screen application and at the database level, in the stored procedures:\n- Allow strings as input only when necessary. \n- Rely on data typing to validate numbers, dates, etc. Do not accept invalid values. If substituting other values for them, think carefully about whether this could be subverted.\n- Limit the size of input strings to what is truly necessary.\n- If single quotes/apostrophes, double quotes, semicolons, equals signs, angle brackets, or square brackets will never be valid as input, reject them.\n- If comment markers will never be valid as input, reject them. In SQL, these are -- or /* */ \n- If HTML and XML tags, entities, comments, etc., will never be valid, reject them.\n- If wildcards are present, reject them unless truly necessary. In SQL these are the underscore and the percentage sign, and the word ESCAPE is also a clue that wildcards are in use.\n- If SQL key words, such as SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, ESCAPE, UNION, GRANT, REVOKE, DENY, MODIFY will never be valid, reject them. Use case-insensitive comparisons when searching for these. Bear in mind that some of these words, particularly Grant (as a person's name), could also be valid input. \n- If there are range limits on the values that may be entered, enforce those limits.\n- Institute procedures for inspection of programs for correct use of dynamic coding, by a party other than the developer.\n- Conduct rigorous testing of program modules that use dynamic coding, searching for ways to subvert the intended use.\n- Record the inspection and testing in the system documentation.\n- Bear in mind that all this applies not only to screen input, but also to the values in an incoming message to a web service or to a stored procedure called by a software component that has not itself been hardened in these ways. Not only can the caller be subject to such vulnerabilities; it may itself be the attacker.\n\nThis requires for inspection of application source code, which will involve collaboration with the application developers. It is recognized that in many cases, the database administrator (DBA) is organizationally separate from the application developers, and may have limited, if any, access to source code. Nevertheless, protections of this type are so important to the secure operation of databases that they must not be ignored. At a minimum, the DBA must attempt to obtain assurances from the development organization that this issue has been addressed and must document what has been discovered.","checkContent":"Review DBMS source code (stored procedures, functions, triggers) and application source code to identify cases of dynamic code execution.\n\nIf dynamic code execution is employed without protective measures against code injection, this is a finding.","fixText":"Where dynamic code execution is used, modify the code to implement protections against code injection.","ccis":["CCI-001310"]},{"vulnId":"V-270583","ruleId":"SV-270583r1065027_rule","severity":"medium","ruleTitle":"Oracle Database must only generate error messages that provide information necessary for corrective actions without revealing organization-defined sensitive or potentially harmful information in error logs and administrative messages that could be exploited.","description":"Any database management system (DBMS) or associated application providing too much information in error messages on the screen or printout risks compromising the data and security of the system. The structure and content of error messages need to be carefully considered by the organization and development team.\n\nDatabases can inadvertently provide a wealth of information to an attacker through improperly handled error messages. In addition to sensitive business or personal information, database errors can provide host names, IP addresses, usernames, and other system information not required for troubleshooting but very useful to someone targeting the system.\n\nCarefully consider the structure/content of error messages. The extent to which information systems are able to identify and handle error conditions is guided by organizational policy and operational requirements. Information that could be exploited by adversaries includes, for example, logon attempts with passwords entered by mistake as the username, mission/business information that can be derived from (if not stated explicitly by) information recorded, and personal information, such as account numbers, social security numbers, and credit card numbers.\n\nThis requires for inspection of application source code, which will involve collaboration with the application developers. It is recognized that in many cases, the database administrator (DBA) is organizationally separate from the application developers, and may have limited, if any, access to source code. Nevertheless, protections of this type are so important to the secure operation of databases that they must not be ignored. At a minimum, the database administrator (DBA) must attempt to obtain assurances from the development organization that this issue has been addressed and must document what has been discovered.\n\nOut of the box, Oracle Database covers this. For example, if a user does not have access to a table, the error is just that the table or view does not exist. The Oracle Database is not going to display a Social Security Number in an error code unless an application is programmed to do so. Oracle applications will not expose the actual transactional data to a screen. The only way Oracle will capture this information is to enable specific logging levels. Custom code would require a review to ensure compliance.","checkContent":"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.\n\nIf database errors contain PII data, sensitive business data, or information useful for identifying the host system, this is a finding.","fixText":"Configure DBMS and custom database and application code not to divulge sensitive information or information useful for system identification in error information.","ccis":["CCI-001312"]},{"vulnId":"V-270584","ruleId":"SV-270584r1065296_rule","severity":"medium","ruleTitle":"Oracle Database must restrict error messages so only authorized personnel may view them.","description":"Any database management system (DBMS) or associated application providing too much information in error messages on the screen or printout risks compromising the data and security of the system. The structure and content of error messages need to be carefully considered by the organization and development team.\n\nDatabases can inadvertently provide a wealth of information to an attacker through improperly handled error messages. In addition to sensitive business or personal information, database errors can provide host names, IP addresses, usernames, and other system information not required for troubleshooting but very useful to someone targeting the system.\n\nCarefully consider the structure/content of error messages. The extent to which information systems are able to identify and handle error conditions is guided by organizational policy and operational requirements. Information that could be exploited by adversaries includes, for example, logon attempts with passwords entered by mistake as the username, mission/business information that can be derived from (if not stated explicitly by) information recorded, and personal information, such as account numbers, social security numbers, and credit card numbers.\n\nThis requires for inspection of application source code, which will involve collaboration with the application developers. It is recognized that in many cases, the database administrator (DBA) is organizationally separate from the application developers, and may have limited, if any, access to source code. Nevertheless, protections of this type are so important to the secure operation of databases that they must not be ignored. At a minimum, the DBA must attempt to obtain assurances from the development organization that this issue has been addressed and must document what has been discovered.","checkContent":"Check DBMS settings and custom database code to determine if error messages are ever displayed to unauthorized individuals: \n\ni) 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.\nii) Review whether the database is accessible to users who are not authorized system administrators or database administrators, via the following types of software:\niia) Oracle SQL*Plus.\niib) Reporting and analysis tools.\niic) Database management and/or development tools, such as, but not limited to, Toad.\niid) Application development tools, such as, but not limited to, Oracle JDeveloper, Microsoft Visual Studio, PowerBuilder, or Eclipse.\n\nIf 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:\n\nFor 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.\n\nDetermine whether the role or individual, with respect to each tool, needs to verify detailed DBMS-generated error messages.\n\nIf No, and if the tool is not configured to suppress such messages, this is a finding.\n\nIf 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.","fixText":"For each end-user-facing application that displays DBMS-generated error messages, configure or recode it to suppress these messages.\n\nIf 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.\n\nFor 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.","ccis":["CCI-001314"]},{"vulnId":"V-270585","ruleId":"SV-270585r1137667_rule","severity":"high","ruleTitle":"Oracle Database software must be evaluated and patched against newly found vulnerabilities.","description":"Security flaws with software applications, including database management systems, are discovered daily. Vendors are constantly updating and patching their products to address newly discovered security vulnerabilities. Organizations (including any contractor to the organization) are required to promptly install security-relevant software updates (e.g., patches, service packs, and hot fixes). Flaws discovered during security assessments, continuous monitoring, incident response activities, or information system error handling must also be addressed expeditiously. \n\nOrganization-defined time periods for updating security-relevant software may vary based on a variety of factors including, for example, the security category of the information system or the criticality of the update (i.e., severity of the vulnerability related to the discovered flaw). \n\nThis requirement will apply to software patch management solutions that are used to install patches across the enclave and also to applications themselves that are not part of that patch management solution. For example, many browsers today provide the capability to install their own patch software. Patch criticality, as well as system criticality, will vary. Therefore, the tactical situations regarding the patch management process will also vary. This means that the time period used must be a configurable parameter. Time frames for application of security-relevant software updates may be dependent upon the Information Assurance Vulnerability Management (IAVM) process.\n\nThe application will be configured to check for and install security-relevant software updates within an identified time period from the availability of the update. The specific time period will be defined by an authoritative source (e.g., IAVM, CTOs, DTMs, and STIGs).","checkContent":"When the Quarterly CPU is released, check the CPU Notice and note the specific patch number for the system. Then, issue the following command:\n\nSELECT patch_id, source_version, action, status, description from dba_registry_sqlpatch;\n\nThis will generate the patch levels for the home and any specific patches that have been applied to it.\n\nIf the currently installed patch levels are lower than the latest, this is a finding.","fixText":"Institute and adhere to policies and procedures to ensure that patches are consistently applied to the Oracle Database within the time allowed.\n\nFollow the instructions provided by Oracle to download and apply the appropriate security patches.\n\nLog on to My Oracle Support.\n\nSelect 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.\n\nTo check the sha256 Checksum in Linux/Unix, the command is:\n$ sha256sum /home/myuser/test_file4\n\n09b4b51a60d6913b82e3353eef179969ad0968ff8acfb37ca891f04df67b93f0 /home/myuser/test_file5\n\nOnce the checksum is validated, apply the patch:\n$ cd $ORACLE_HOME\n$ opatch apply","ccis":["CCI-002605"]},{"vulnId":"V-270587","ruleId":"SV-270587r1112489_rule","severity":"medium","ruleTitle":"Oracle Database must, for password-based authentication, verify that when users create or update passwords, the passwords are not found on the list of commonly used, expected, or compromised passwords in IA-5 (1) (a).","description":"Password-based authentication applies to passwords regardless of whether they are used in single-factor or multifactor authentication (MFA). Long passwords or passphrases are preferable over shorter passwords. Enforced composition rules provide marginal security benefits while decreasing usability. However, organizations may choose to establish certain rules for password generation (e.g., minimum character length for long passwords) under certain circumstances and can enforce this requirement in IA-5(1)(h). Account recovery can occur, for example, in situations when a password is forgotten. Cryptographically protected passwords include salted one-way cryptographic hashes of passwords. The list of commonly used, compromised, or expected passwords includes passwords obtained from previous breach corpuses, dictionary words, and repetitive or sequential characters. The list includes context-specific words, such as the name of the service, username, and derivatives thereof.","checkContent":"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).\n\nIf all user accounts are authenticated by the OS or an enterprise-level authentication/access mechanism, and not by Oracle, this is not a finding.\n\nFor each profile that can be applied to accounts where authentication is under Oracle's control, determine the password verification function that is in use:\n\nSELECT * FROM SYS.DBA_PROFILES \nWHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION'\nORDER BY PROFILE;\n\nNote: Profiles can inherit settings from another profile so some password functions could be set to DEFAULT. If so, review the DEFAULT profile function name. \n\nIf the function name is null for any profile, this is a finding.\n\nReview 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.\n \nIf 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.","fixText":"If any user accounts are managed by Oracle, develop, test, and implement a password verification function that enforces DOD requirements.\n\nConfigure 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).\n\nOracle supplies a sample function called ORA12C_STIG_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:\n\nWindows:\n%ORACLE_HOME%\\RDBMS\\ADMIN\\catpvf.sql\n\nUnix/Linux:\n$ORACLE_HOME/rdbms/admin/catpvf.sql","ccis":["CCI-004061"]},{"vulnId":"V-270588","ruleId":"SV-270588r1065042_rule","severity":"medium","ruleTitle":"Oracle Database must, for password-based authentication, require immediate selection of a new password upon account recovery.","description":"Password-based authentication applies to passwords regardless of whether they are used in single-factor or multifactor authentication (MFA). Long passwords or passphrases are preferable over shorter passwords. Enforced composition rules provide marginal security benefits while decreasing usability. However, organizations may choose to establish certain rules for password generation (e.g., minimum character length for long passwords) under certain circumstances and can enforce this requirement in IA-5(1)(h). Account recovery can occur, for example, in situations when a password is forgotten. Cryptographically protected passwords include salted one-way cryptographic hashes of passwords. The list of commonly used, compromised, or expected passwords includes passwords obtained from previous breach corpuses, dictionary words, and repetitive or sequential characters. The list includes context-specific words, such as the name of the service, username, and derivatives thereof.","checkContent":"Verify the database management system (DBMS) is configured to require immediate selection of a new password upon account recovery.\n\nAll 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:\nalter user <username> password expire;\n\nIf they do not, this is a finding.\n\nIf the DBMS is not configured to require immediate selection of a new password upon account recovery, this is a finding.","fixText":"Configure the DBMS to require immediate selection of a new password upon account recovery.\n\nOne 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:\nalter user <username> password expire;","ccis":["CCI-004063"]},{"vulnId":"V-270589","ruleId":"SV-270589r1136927_rule","severity":"medium","ruleTitle":"Oracle Database must include only approved trust anchors in trust stores or certificate stores managed by the organization.","description":"Public key infrastructure (PKI) certificates are certificates with visibility external to organizational systems and certificates related to the internal operations of systems, such as application-specific time services. In cryptographic systems with a hierarchical structure, a trust anchor is an authoritative source (i.e., a certificate authority) for which trust is assumed and not derived. A root certificate for a PKI system is an example of a trust anchor. A trust store or certificate store maintains a list of trusted root certificates.","checkContent":"If all accounts are authenticated by the OS or an enterprise-level authentication/access mechanism and not by Oracle, this is not a finding.\n\nVerify the database management system (DBMS) is configured to include only approved trust anchors in trust stores or certificate stores managed by the organization.\n\nIf trust stores or certification paths are not being validated back to a trust anchor, this is a finding.\n\nThe 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.\n\nOracle provides a complete PKI that is based on RSA Security, Inc., Public-Key Cryptography Standards, and interoperates with Oracle servers and clients. The database uses a wallet that is a container 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.\n\nIf the $ORACLE_HOME/network/admin/sqlnet.ora contains the following entries, TLS is installed.\n\nWALLET_LOCATION = (SOURCE=\n(METHOD = FILE) \n(METHOD_DATA = \nDIRECTORY=/wallet) \n\nSSL_CIPHER_SUITES=(SSL_cipher_suiteExample) \nSSL_VERSION = 1.1 or 1.2\nSSL_CLIENT_AUTHENTICATION=TRUE","fixText":"Configure the DBMS to include only approved trust anchors in trust stores or certificate stores managed by the organization.\n\nConfigure the database to support TLS protocols and the Oracle Wallet to store authentication and signing credentials, including private keys.","ccis":["CCI-004909"]},{"vulnId":"V-275999","ruleId":"SV-275999r1115962_rule","severity":"medium","ruleTitle":"A minimum of three Oracle Control Files must be created and each stored on a separate physical and logical device.","description":"Oracle control files store information critical to Oracle database integrity. Oracle uses these files to maintain time synchronization of database files and verify the validity of system data and log files at system startup. Loss of access to the control files can affect database availability, integrity, and recovery.\n\nOracle Pluggable Databases (PDBs) do not contain their own control files; instead, all PDBs within a Container Database (CDB) share control files managed by the CDB.","checkContent":"Use the SQL statement below to obtain information on each currently existing Control File:\n\nSELECT name\nFROM sys.v$controlfile\nORDER BY 1;\n\nOracle Best Practice:\nOracle recommends a minimum of three Oracle Control Files and each stored on a separate physical and logical device (RAID 1 + 0).  \n\nDOD guidance recommends:\nEach control file must be located on a separate physical and logical (virtual) storage device.\n\nConsult with the storage administrator, system administrator, or database administrator to determine whether the mount points or partitions referenced in the file paths indicate separate physical disks or directories on RAID devices.\n\nNote: Distinct does not equal dedicated. May share directory space with other Oracle database instances if present.\n\nIf the minimum of three control files is not met, this is a finding.","fixText":"To prevent loss of service during disk failure, multiple copies of Oracle control files must be maintained on separate disks in archived directories or on separate, archived directories within one or more RAID devices.\n\nAdding or moving a control file requires careful planning and execution.\n\nConsult and follow the instructions for creating control files in the Oracle Database Administrator's Guide, under Steps for Creating New Control Files.","ccis":["CCI-000366"]},{"vulnId":"V-276000","ruleId":"SV-276000r1112495_rule","severity":"medium","ruleTitle":"A minimum of three Oracle redo log groups/files must be defined and configured to be stored on separate, archived physical disks or archived directories on a RAID device. In addition, each Oracle redo log group must have a minimum of two Oracle redo log members (files).","description":"The Oracle Database Redo Log files store detailed transactional information on changes made to the database using SQL Data Manipulation Language (DML), Data Definition Language (DDL), and Data Control Language (DCL), which is required for undo, backup, restoration, and recovery. \n\nA minimum of three Oracle redo log groups/files must be defined and configured to be stored on separate, archived physical disks or archived directories on a RAID (mirrored) device. In addition, each Oracle redo log group must have a minimum to two Oracle redo log members (files). \n\nEach side of the Redo Log Mirror (group 1, member 1) is identical to its mirror image (group 1, member 2), making it possible to continue operations if one file or even one complete mirror is lost due to corruption or accidental deletion. Writing each mirror to a physically and logically separate storage device is an important part of minimizing single points of failure.\n\nOracle redo logs, which are crucial for database recovery, are managed at the CDB level, not at the PDB level.","checkContent":"From SQL*Plus:\n\n-- Check to see how many Oracle redo log groups there are:\nselect group#, bytes, members, status, archived from v$log;\n\n-- Check to see how many Oracle redo log members there are:\nselect * from v$logfile;\n\nThis is a finding if there are less than three Oracle redo log groups a RAID storage device, or equivalent storage system, is not being used.\n\nIf one or more groups (group#) has only a single member this is a finding.\n\nIf one or more groups (group#) have more than a single member but one or more of those members are located on the same physical or logical device this is a finding.\n\nselect count(*) from V$LOG;\n\nIf the value of the count returned is less than 3, this is a finding.\n\nFrom SQL*Plus:\n\nselect count(*) from V$LOG where members > 1;\n\nIf the value of the count returned is less than 3 and a RAID storage device is not being used, this is a finding.","fixText":"To define additional redo log file groups:\n\nFrom SQL*Plus (Example):\n\n  alter database add logfile group 2 \n    ('diska:log2.log' ,\n     'diskb:log2.log') size 50K; \n\nTo add additional redo log file [members] to an existing redo log file group:\n\nFrom SQL*Plus (Example):\n\n  alter database add logfile member 'diskc:log2.log'\n  to group 2;\n\nReplace diska, diskb, diskc with valid, different disk drive specifications.\n\nReplace log#.log file with valid or custom names for the log files.","ccis":["CCI-000366"]}]}