Chapter 3. Using system-wide cryptographic policies The system-wide cryptographic policies is a system component that configures the core cryptographic subsystems, covering the TLS, IPsec, SSH, DNSSec, and Kerberos protocols. It provides a small set of policies, which the administrator can select. 3.1. System-wide cryptographic policies When a system-wide policy is set up, applications in RHEL follow it and refuse to use algorithms and protocols that do not meet the policy, unless you explicitly request the application to do so. That is, the policy applies to the default behavior of applications when running with the system-provided configuration but you can override it if required. RHEL 9 contains the following predefined policies: DEFAULT The default system-wide cryptographic policy level offers secure settings for current threat models. It allows the TLS 1.2 and 1.3 protocols, as well as the IKEv2 and SSH2 protocols. The RSA keys and Diffie-Hellman parameters are accepted if they are at least 2048 bits long. LEGACY Ensures maximum compatibility with Red Hat Enterprise Linux 6 and earlier; it is less secure due to an increased attack surface. SHA-1 is allowed to be used as TLS hash, signature, and algorithm. CBC-mode ciphers are allowed to be used with SSH. Applications using GnuTLS allow certificates signed with SHA-1. It allows the TLS 1.2 and 1.3 protocols, as well as the IKEv2 and SSH2 protocols. The RSA keys and Diffie-Hellman parameters are accepted if they are at least 2048 bits long. FUTURE A stricter forward-looking security level intended for testing a possible future policy. This policy does not allow the use of SHA-1 in DNSSec or as an HMAC. SHA2-224 and SHA3-224 hashes are rejected. 128-bit ciphers are disabled. CBC-mode ciphers are disabled except in Kerberos. It allows the TLS 1.2 and 1.3 protocols, as well as the IKEv2 and SSH2 protocols. The RSA keys and Diffie-Hellman parameters are accepted if they are at least 3072 bits long. If your system communicates on the public internet, you might face interoperability problems. Important Because a cryptographic key used by a certificate on the Customer Portal API does not meet the requirements by the FUTURE system-wide cryptographic policy, the redhat-support-tool utility does not work with this policy level at the moment. To work around this problem, use the DEFAULT cryptographic policy while connecting to the Customer Portal API. FIPS Conforms with the FIPS 140 requirements. The fips-mode-setup tool, which switches the RHEL system into FIPS mode, uses this policy internally. Switching to the FIPS policy does not guarantee compliance with the FIPS 140 standard. You also must re-generate all cryptographic keys after you set the system to FIPS mode. This is not possible in many scenarios. RHEL also provides the FIPS:OSPP system-wide subpolicy, which contains further restrictions for cryptographic algorithms required by the Common Criteria (CC) certification. The system becomes less interoperable after you set this subpolicy. For example, you cannot use RSA and DH keys shorter than 3072 bits, additional SSH algorithms, and several TLS groups. Setting FIPS:OSPP also prevents connecting to Red Hat Content Delivery Network (CDN) structure. Furthermore, you cannot integrate Active Directory (AD) into the IdM deployments that use FIPS:OSPP , communication between RHEL hosts using FIPS:OSPP and AD domains might not work, or some AD accounts might not be able to authenticate. Note Your system is not CC-compliant after you set the FIPS:OSPP cryptographic subpolicy. The only correct way to make your RHEL system compliant with the CC standard is by following the guidance provided in the cc-config package. See Common Criteria section on the Product compliance Red Hat Customer Portal page for a list of certified RHEL versions, validation reports, and links to CC guides. Red Hat continuously adjusts all policy levels so that all libraries provide secure defaults, except when using the LEGACY policy. Even though the LEGACY profile does not provide secure defaults, it does not include any algorithms that are easily exploitable. As such, the set of enabled algorithms or acceptable key sizes in any provided policy may change during the lifetime of Red Hat Enterprise Linux. Such changes reflect new security standards and new security research. If you must ensure interoperability with a specific system for the whole lifetime of Red Hat Enterprise Linux, you should opt-out from the system-wide cryptographic policies for components that interact with that system or re-enable specific algorithms using custom cryptographic policies. The specific algorithms and ciphers described as allowed in the policy levels are available only if an application supports them: Table 3.1. Cipher suites and protocols enabled in the cryptographic policies LEGACY DEFAULT FIPS FUTURE IKEv1 no no no no 3DES no no no no RC4 no no no no DH min. 2048-bit min. 2048-bit min. 2048-bit min. 3072-bit RSA min. 2048-bit min. 2048-bit min. 2048-bit min. 3072-bit DSA no no no no TLS v1.1 and older no no no no TLS v1.2 and newer yes yes yes yes SHA-1 in digital signatures and certificates yes no no no CBC mode ciphers yes no [a] no [b] no [c] Symmetric ciphers with keys < 256 bits yes yes yes no [a] CBC ciphers are disabled for SSH [b] CBC ciphers are disabled for all protocols except Kerberos [c] CBC ciphers are disabled for all protocols except Kerberos Additional resources crypto-policies(7) and update-crypto-policies(8) man pages on your system Product compliance (Red Hat Customer Portal) 3.2. Changing the system-wide cryptographic policy You can change the system-wide cryptographic policy on your system by using the update-crypto-policies tool and restarting your system. Prerequisites You have root privileges on the system. Procedure Optional: Display the current cryptographic policy: Set the new cryptographic policy: Replace <POLICY> with the policy or subpolicy you want to set, for example FUTURE , LEGACY or FIPS:OSPP . Restart the system: Verification Display the current cryptographic policy: Additional resources For more information on system-wide cryptographic policies, see System-wide cryptographic policies 3.3. Switching the system-wide cryptographic policy to mode compatible with earlier releases The default system-wide cryptographic policy in Red Hat Enterprise Linux 9 does not allow communication using older, insecure protocols. For environments that require to be compatible with Red Hat Enterprise Linux 6 and in some cases also with earlier releases, the less secure LEGACY policy level is available. Warning Switching to the LEGACY policy level results in a less secure system and applications. Procedure To switch the system-wide cryptographic policy to the LEGACY level, enter the following command as root : Additional resources For the list of available cryptographic policy levels, see the update-crypto-policies(8) man page on your system. For defining custom cryptographic policies, see the Custom Policies section in the update-crypto-policies(8) man page and the Crypto Policy Definition Format section in the crypto-policies(7) man page on your system. 3.4. Re-enabling SHA-1 The use of the SHA-1 algorithm for creating and verifying signatures is restricted in the DEFAULT cryptographic policy. If your scenario requires the use of SHA-1 for verifying existing or third-party cryptographic signatures, you can enable it by applying the SHA1 subpolicy, which RHEL 9 provides by default. Note that it weakens the security of the system. Prerequisites The system uses the DEFAULT system-wide cryptographic policy. Procedure Apply the SHA1 subpolicy to the DEFAULT cryptographic policy: Restart the system: Verification Display the current cryptographic policy: Important Switching to the LEGACY cryptographic policy by using the update-crypto-policies --set LEGACY command also enables SHA-1 for signatures. However, the LEGACY cryptographic policy makes your system much more vulnerable by also enabling other weak cryptographic algorithms. Use this workaround only for scenarios that require the enablement of other legacy cryptographic algorithms than SHA-1 signatures. Additional resources SSH from RHEL 9 to RHEL 6 systems does not work (Red Hat Knowledgebase) Packages signed with SHA-1 cannot be installed or upgraded (Red Hat Knowledgebase) 3.5. Setting up system-wide cryptographic policies in the web console You can set one of system-wide cryptographic policies and subpolicies directly in the RHEL web console interface. Besides the four predefined system-wide cryptographic policies, you can also apply the following combinations of policies and subpolicies through the graphical interface now: DEFAULT:SHA1 The DEFAULT policy with the SHA-1 algorithm enabled. LEGACY:AD-SUPPORT The LEGACY policy with less secure settings that improve interoperability for Active Directory services. FIPS:OSPP The FIPS policy with further restrictions required by the Common Criteria for Information Technology Security Evaluation standard. Warning Because the FIPS:OSPP system-wide subpolicy contains further restrictions for cryptographic algorithms required by the Common Criteria (CC) certification, the system is less interoperable after you set it. For example, you cannot use RSA and DH keys shorter than 3072 bits, additional SSH algorithms, and several TLS groups. Setting FIPS:OSPP also prevents connecting to Red Hat Content Delivery Network (CDN) structure. Furthermore, you cannot integrate Active Directory (AD) into the IdM deployments that use FIPS:OSPP , communication between RHEL hosts using FIPS:OSPP and AD domains might not work, or some AD accounts might not be able to authenticate. Note that your system is not CC-compliant after you set the FIPS:OSPP cryptographic subpolicy. The only correct way to make your RHEL system compliant with the CC standard is by following the guidance provided in the cc-config package. See the Common Criteria section on the Product compliance Red Hat Customer Portal page for a list of certified RHEL versions, validation reports, and links to CC guides hosted at the National Information Assurance Partnership (NIAP) website. Prerequisites You have installed the RHEL 9 web console. You have enabled the cockpit service. Your user account is allowed to log in to the web console. For instructions, see Installing and enabling the web console . You have root privileges or permissions to enter administrative commands with sudo . Procedure Log in to the RHEL 9 web console. For details, see Logging in to the web console . In the Configuration card of the Overview page, click your current policy value to Crypto policy . In the Change crypto policy dialog window, click on the policy you want to start using on your system. Click the Apply and reboot button. Verification After the restart, log back in to web console, and check that the Crypto policy value corresponds to the one you selected. Alternatively, you can enter the update-crypto-policies --show command to display the current system-wide cryptographic policy in your terminal. 3.6. Excluding an application from following system-wide cryptographic policies You can customize cryptographic settings used by your application preferably by configuring supported cipher suites and protocols directly in the application. You can also remove a symlink related to your application from the /etc/crypto-policies/back-ends directory and replace it with your customized cryptographic settings. This configuration prevents the use of system-wide cryptographic policies for applications that use the excluded back end. Furthermore, this modification is not supported by Red Hat. 3.6.1. Examples of opting out of the system-wide cryptographic policies wget To customize cryptographic settings used by the wget network downloader, use --secure-protocol and --ciphers options. For example: See the HTTPS (SSL/TLS) Options section of the wget(1) man page for more information. curl To specify ciphers used by the curl tool, use the --ciphers option and provide a colon-separated list of ciphers as a value. For example: See the curl(1) man page for more information. Firefox Even though you cannot opt out of system-wide cryptographic policies in the Firefox web browser, you can further restrict supported ciphers and TLS versions in Firefox's Configuration Editor. Type about:config in the address bar and change the value of the security.tls.version.min option as required. Setting security.tls.version.min to 1 allows TLS 1.0 as the minimum required, security.tls.version.min 2 enables TLS 1.1, and so on. OpenSSH To opt out of the system-wide cryptographic policies for your OpenSSH server, specify the cryptographic policy in a drop-in configuration file located in the /etc/ssh/sshd_config.d/ directory, with a two-digit number prefix smaller than 50, so that it lexicographically precedes the 50-redhat.conf file, and with a .conf suffix, for example, 49-crypto-policy-override.conf . See the sshd_config(5) man page for more information. To opt out of system-wide cryptographic policies for your OpenSSH client, perform one of the following tasks: For a given user, override the global ssh_config with a user-specific configuration in the ~/.ssh/config file. For the entire system, specify the cryptographic policy in a drop-in configuration file located in the /etc/ssh/ssh_config.d/ directory, with a two-digit number prefix smaller than 50, so that it lexicographically precedes the 50-redhat.conf file, and with a .conf suffix, for example, 49-crypto-policy-override.conf . See the ssh_config(5) man page for more information. Libreswan See the Configuring IPsec connections that opt out of the system-wide crypto policies in the Securing networks document for detailed information. Additional resources update-crypto-policies(8) man page on your system 3.7. Customizing system-wide cryptographic policies with subpolicies Use this procedure to adjust the set of enabled cryptographic algorithms or protocols. You can either apply custom subpolicies on top of an existing system-wide cryptographic policy or define such a policy from scratch. The concept of scoped policies allows enabling different sets of algorithms for different back ends. You can limit each configuration directive to specific protocols, libraries, or services. Furthermore, directives can use asterisks for specifying multiple values using wildcards. The /etc/crypto-policies/state/CURRENT.pol file lists all settings in the currently applied system-wide cryptographic policy after wildcard expansion. To make your cryptographic policy more strict, consider using values listed in the /usr/share/crypto-policies/policies/FUTURE.pol file. You can find example subpolicies in the /usr/share/crypto-policies/policies/modules/ directory. The subpolicy files in this directory contain also descriptions in lines that are commented out. Procedure Checkout to the /etc/crypto-policies/policies/modules/ directory: Create subpolicies for your adjustments, for example: Important Use upper-case letters in file names of policy modules. Open the policy modules in a text editor of your choice and insert options that modify the system-wide cryptographic policy, for example: Save the changes in the module files. Apply your policy adjustments to the DEFAULT system-wide cryptographic policy level: To make your cryptographic settings effective for already running services and applications, restart the system: Verification Check that the /etc/crypto-policies/state/CURRENT.pol file contains your changes, for example: Additional resources Custom Policies section in the update-crypto-policies(8) man page on your system Crypto Policy Definition Format section in the crypto-policies(7) man page on your system How to customize crypto policies in RHEL 8.2 Red Hat blog article 3.8. Creating and setting a custom system-wide cryptographic policy For specific scenarios, you can customize the system-wide cryptographic policy by creating and using a complete policy file. Procedure Create a policy file for your customizations: Alternatively, start by copying one of the four predefined policy levels: Edit the file with your custom cryptographic policy in a text editor of your choice to fit your requirements, for example: Switch the system-wide cryptographic policy to your custom level: To make your cryptographic settings effective for already running services and applications, restart the system: Additional resources Custom Policies section in the update-crypto-policies(8) man page and the Crypto Policy Definition Format section in the crypto-policies(7) man page on your system How to customize crypto policies in RHEL Red Hat blog article 3.9. Enhancing security with the FUTURE cryptographic policy using the crypto_policies RHEL system role You can use the crypto_policies RHEL system role to configure the FUTURE policy on your managed nodes. This policy helps to achieve for example: Future-proofing against emerging threats: anticipates advancements in computational power. Enhanced security: stronger encryption standards require longer key lengths and more secure algorithms. Compliance with high-security standards: for example in healthcare, telco, and finance the data sensitivity is high, and availability of strong cryptography is critical. Typically, FUTURE is suitable for environments handling highly sensitive data, preparing for future regulations, or adopting long-term security strategies. Warning Legacy systems or software does not have to support the more modern and stricter algorithms and protocols enforced by the FUTURE policy. For example, older systems might not support TLS 1.3 or larger key sizes. This could lead to compatibility problems. Also, using strong algorithms usually increases the computational workload, which could negatively affect your system performance. Prerequisites You have prepared the control node and the managed nodes You are logged in to the control node as a user who can run playbooks on the managed nodes. The account you use to connect to the managed nodes has sudo permissions on them. Procedure Create a playbook file, for example ~/playbook.yml , with the following content: --- - name: Configure cryptographic policies hosts: managed-node-01.example.com tasks: - name: Configure the FUTURE cryptographic security policy on the managed node ansible.builtin.include_role: name: rhel-system-roles.crypto_policies vars: - crypto_policies_policy: FUTURE - crypto_policies_reboot_ok: true The settings specified in the example playbook include the following: crypto_policies_policy: FUTURE Configures the required cryptographic policy ( FUTURE ) on the managed node. It can be either the base policy or a base policy with some sub-policies. The specified base policy and sub-policies have to be available on the managed node. The default value is null . It means that the configuration is not changed and the crypto_policies RHEL system role will only collect the Ansible facts. crypto_policies_reboot_ok: true Causes the system to reboot after the cryptographic policy change to make sure all of the services and applications will read the new configuration files. The default value is false . For details about all variables used in the playbook, see the /usr/share/ansible/roles/rhel-system-roles.crypto_policies/README.md file on the control node. Validate the playbook syntax: Note that this command only validates the syntax and does not protect against a wrong but valid configuration. Run the playbook: Warning Because the FIPS:OSPP system-wide subpolicy contains further restrictions for cryptographic algorithms required by the Common Criteria (CC) certification, the system is less interoperable after you set it. For example, you cannot use RSA and DH keys shorter than 3072 bits, additional SSH algorithms, and several TLS groups. Setting FIPS:OSPP also prevents connecting to Red Hat Content Delivery Network (CDN) structure. Furthermore, you cannot integrate Active Directory (AD) into the IdM deployments that use FIPS:OSPP , communication between RHEL hosts using FIPS:OSPP and AD domains might not work, or some AD accounts might not be able to authenticate. Note that your system is not CC-compliant after you set the FIPS:OSPP cryptographic subpolicy. The only correct way to make your RHEL system compliant with the CC standard is by following the guidance provided in the cc-config package. See the Common Criteria section on the Product compliance Red Hat Customer Portal page for a list of certified RHEL versions, validation reports, and links to CC guides hosted at the National Information Assurance Partnership (NIAP) website. Verification On the control node, create another playbook named, for example, verify_playbook.yml : --- - name: Verification hosts: managed-node-01.example.com tasks: - name: Verify active cryptographic policy ansible.builtin.include_role: name: rhel-system-roles.crypto_policies - name: Display the currently active cryptographic policy ansible.builtin.debug: var: crypto_policies_active The settings specified in the example playbook include the following: crypto_policies_active An exported Ansible fact that contains the currently active policy name in the format as accepted by the crypto_policies_policy variable. Validate the playbook syntax: Run the playbook: The crypto_policies_active variable shows the active policy on the managed node. Additional resources /usr/share/ansible/roles/rhel-system-roles.crypto_policies/README.md file /usr/share/doc/rhel-system-roles/crypto_policies/ directory update-crypto-policies(8) and crypto-policies(7) manual pages

Commands:
update-crypto-policies --show DEFAULT
update-crypto-policies --set <POLICY> <POLICY>
reboot
update-crypto-policies --show <POLICY>
update-crypto-policies --set LEGACY Setting system policy to LEGACY
update-crypto-policies --set DEFAULT:SHA1 Setting system policy to DEFAULT:SHA1 Note: System-wide crypto policies are applied on application start-up. It is recommended to restart the system for the change of policies to fully take place.
reboot
update-crypto-policies --show DEFAULT:SHA1
wget --secure-protocol= TLSv1_1 --ciphers=" SECURE128 " https://example.com
curl https://example.com --ciphers '@SECLEVEL=0:DES-CBC3-SHA:RSA-DES-CBC3-SHA'
cd /etc/crypto-policies/policies/modules/
touch MYCRYPTO-1 .pmod touch SCOPES-AND-WILDCARDS .pmod
vi MYCRYPTO-1 .pmod
min_rsa_size = 3072 hash = SHA2-384 SHA2-512 SHA3-384 SHA3-512
vi SCOPES-AND-WILDCARDS .pmod
Disable the AES-128 cipher, all modes cipher = -AES-128-* Disable CHACHA20-POLY1305 for the TLS protocol (OpenSSL, GnuTLS, NSS, and OpenJDK) cipher@TLS = -CHACHA20-POLY1305 Allow using the FFDHE-1024 group with the SSH protocol (libssh and OpenSSH) group@SSH = FFDHE-1024+ Disable all CBC mode ciphers for the SSH protocol (libssh and OpenSSH) cipher@SSH = -*-CBC Allow the AES-256-CBC cipher in applications using libssh cipher@libssh = AES-256-CBC+
update-crypto-policies --set DEFAULT: MYCRYPTO-1 : SCOPES-AND-WILDCARDS
reboot
cat /etc/crypto-policies/state/CURRENT.pol | grep rsa_size min_rsa_size = 3072
cd /etc/crypto-policies/policies/ touch MYPOLICY .pol
cp /usr/share/crypto-policies/policies/ DEFAULT .pol /etc/crypto-policies/policies/ MYPOLICY .pol
vi /etc/crypto-policies/policies/ MYPOLICY .pol
update-crypto-policies --set MYPOLICY
reboot
--- - name: Configure cryptographic policies hosts: managed-node-01.example.com tasks: - name: Configure the FUTURE cryptographic security policy on the managed node ansible.builtin.include_role: name: rhel-system-roles.crypto_policies vars: - crypto_policies_policy: FUTURE - crypto_policies_reboot_ok: true
ansible-playbook --syntax-check ~/playbook.yml
ansible-playbook ~/playbook.yml
--- - name: Verification hosts: managed-node-01.example.com tasks: - name: Verify active cryptographic policy ansible.builtin.include_role: name: rhel-system-roles.crypto_policies - name: Display the currently active cryptographic policy ansible.builtin.debug: var: crypto_policies_active
ansible-playbook --syntax-check ~/verify_playbook.yml
ansible-playbook ~/verify_playbook.yml TASK [debug] ************************** ok: [host] => { "crypto_policies_active": "FUTURE" }