sshd - SSH daemon

The SSH daemon, sshd, provides secure, encrypted access to Linux servers.

Overview

The STIG has several requirements for ssh server configuration and these requirements are applied by default by the role. To opt-out or change these requirements, see the section under the ## ssh server (sshd) comment in defaults/main.yml.

Deviation for PermitRootLogin

There is one deviation from the STIG for the PermitRootLogin configuration option. The STIG requires that direct root logins are disabled, and this is the recommended setting for secure production environments.

However, this can cause problems in some existing environments and the default for the role is to set it to yes (direct root logins allowed).

STIG requirements

All of the tasks for these STIG requirements are included in tasks/rhel7stig/sshd.yml.

V-71939

  • Summary: The SSH daemon must not allow authentication using an empty password.

  • Severity: High

  • Implementation Status: Implemented

Deployer/Auditor notes

The PermitEmptyPasswords configuration will be set to no in /etc/ssh/sshd_config and sshd will be restarted. This disallows logins over ssh for users with a empty or null password set.

Deployers can opt-out of this change by setting the following Ansible variable:

security_sshd_disallow_empty_password: no

V-71957

  • Summary: The operating system must not allow users to override SSH environment variables.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The PermitUserEnvironment configuration is set to no in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_disallow_environment_override: no

V-71959

  • Summary: The operating system must not allow a non-certificate trusted host SSH logon to the system.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The HostbasedAuthentication configuration is set to no in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_disallow_host_based_auth: no

V-72221

  • Summary: A FIPS 140-2 approved cryptographic algorithm must be used for SSH communications.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The Ciphers configuration is set to aes128-ctr,aes192-ctr,aes256-ctr in /etc/ssh/sshd_config and sshd is restarted.

Deployers can change the list of ciphers by setting the following Ansible variable:

security_sshd_cipher_list: 'cipher1,cipher2,cipher3'

V-72225

  • Summary: The Standard Mandatory DoD Notice and Consent Banner must be displayed immediately prior to, or as part of, remote access logon prompts.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The tasks in the security role deploy a standard notice and consent banner into /etc/motd on each server. Ubuntu, CentOS, Red Hat Enterprise Linux, openSUSE Leap and SUSE Linux Enterprise display this banner after each successful login via ssh or the console.

Deployers can choose a different destination for the banner by setting the following Ansible variable:

security_sshd_banner_file: /etc/motd

The message is customized with the following Ansible variable:

security_login_banner_text: |
  ------------------------------------------------------------------------------
  * WARNING                                                                    *
  * You are accessing a secured system and your actions will be logged along   *
  * with identifying information. Disconnect immediately if you are not an     *
  * authorized user of this system.                                            *
  ------------------------------------------------------------------------------

V-72235

  • Summary: All networked systems must use SSH for confidentiality and integrity of transmitted and received information as well as information during preparation for transmission.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The STIG has a requirement that the sshd daemon is running and enabled at boot time. The tasks in the security role ensure that these requirements are met.

Some deployers may not have sshd enabled on highly specialized systems and those deployers should opt out of this change by setting the following Ansible variable:

security_enable_sshd: no

Note

Setting security_enable_sshd to no causes the tasks to ignore the state of the service entirely. A setting of no does not stop or alter the sshd service.


V-72237

  • Summary: All network connections associated with SSH traffic must terminate at the end of the session or after 10 minutes of inactivity, except to fulfill documented and validated mission requirements.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The ClientAliveInterval configuration is set to 600 in /etc/ssh/sshd_config and sshd is restarted.

Deployers can adjust the length of the interval by changing the following Ansible variable:

security_sshd_client_alive_interval: 600

Note

The STIG requires that ClientAliveInterval is set to 600 and ClientAliveCountMax is set to zero, which sets a 10 minute session timeout. If no data is transferred in a 10 minute period, the session is disconnected.

The ClientAliveInterval specifies how long the ssh daemon waits before it sends a message to the client to see if it is still alive. The ClientAliveCountMax specifies how many of these messages are sent without receiving a response.

Deployers should refer to All network connections associated with SSH traffic must terminate after a period of inactivity. (V-72241) to customize the ClientAliveCountMax setting.


V-72239

  • Summary: The SSH daemon must not allow authentication using RSA rhosts authentication.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

This STIG is already applied by the changes for The SSH daemon must not allow authentication using known hosts authentication. (V-72249).


V-72241

  • Summary: All network connections associated with SSH traffic must terminate after a period of inactivity.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The ClientAliveCountMax configuration is set to 0 in /etc/ssh/sshd_config and sshd is restarted.

Deployers can adjust the maximum amount of client alive intervals by changing the following Ansible variable.

security_sshd_client_alive_count_max: 0

Note

The STIG requires that ClientAliveInterval is set to 600 and ClientAliveCountMax is set to zero, which sets a 10 minute session timeout. If no data is transferred in a 10 minute period, the session is disconnected.

The ClientAliveInterval specifies how long the ssh daemon waits before it sends a message to the client to see if it is still alive. The ClientAliveCountMax specifies how many of these messages are sent without receiving a response.

Deployers should refer to All network connections associated with SSH traffic must terminate at the end of the session or after 10 minutes of inactivity, except to fulfill documented and validated mission requirements. (V-72237) to customize the ClientAliveInterval setting.


V-72243

  • Summary: The SSH daemon must not allow authentication using rhosts authentication.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The IgnoreRhosts configuration is set to yes in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_disallow_rhosts_auth: no

V-72245

  • Summary: The system must display the date and time of the last successful account logon upon an SSH logon.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The PrintLastLog configuration is set to yes in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_print_last_log: no

V-72247

  • Summary: The system must not permit direct logons to the root account using remote access via SSH.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The PermitRootLogin configuration is set to no in /etc/ssh/sshd_config and sshd is restarted.

Deployers can select another setting for PermitRootLogin, from the available options without-password, prohibit-password, forced-commands-only, yes, or no by setting the following variable:

security_sshd_permit_root_login: no

Warning

Ensure that a regular user account exists with a pathway to root access (preferably via sudo) before applying the security role. This configuration change disallows any direct logins with the root user.


V-72249

  • Summary: The SSH daemon must not allow authentication using known hosts authentication.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The IgnoreUserKnownHosts configuration is set to yes in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_disallow_known_hosts_auth: no

V-72251

  • Summary: The SSH daemon must be configured to only use the SSHv2 protocol.

  • Severity: High

  • Implementation Status: Implemented

Deployer/Auditor notes

The Protocol configuration is set to 2 in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_protocol: 2

Warning

There is no reason to enable any other protocol than SSHv2. SSHv1 has multiple vulnerabilities, and it is no longer widely used.


V-72253

  • Summary: The SSH daemon must be configured to only use Message Authentication Codes (MACs) employing FIPS 140-2 approved cryptographic hash algorithms.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The MACs configuration is set to hmac-sha2-256,hmac-sha2-512 in /etc/ssh/sshd_config and sshd is restarted.

Deployers can adjust the allowed Message Authentication Codes (MACs) by setting the following Ansible variable:

security_sshd_allowed_macs: 'hmac-sha2-256,hmac-sha2-512'

V-72255

  • Summary: The SSH public host key files must have mode 0644 or less permissive.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The permissions on ssh public host keys is set to 0644. If the existing permissions are more restrictive than 0644, the tasks do not make changes to the files.


V-72257

  • Summary: The SSH private host key files must have mode 0600 or less permissive.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The permissions on ssh private host keys is set to 0600. If the existing permissions are more restrictive than 0600, the tasks do not make changes to the files.


V-72259

  • Summary: The SSH daemon must not permit Generic Security Service Application Program Interface (GSSAPI) authentication unless needed.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The GSSAPIAuthentication setting is set to no to meet the requirements of the STIG.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_disallow_gssapi: no

V-72261

  • Summary: The SSH daemon must not permit Kerberos authentication unless needed.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The KerberosAuthentication configuration is set to no in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_disable_kerberos_auth: no

V-72263

  • Summary: The SSH daemon must perform strict mode checking of home directory configuration files.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The StrictModes configuration is set to yes in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_enable_strict_modes: no

V-72265

  • Summary: The SSH daemon must use privilege separation.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The UsePrivilegeSeparation configuration is set to sandbox in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_enable_privilege_separation: no

Note

Although the STIG requires this setting to be yes, the sandbox setting actually provides more security because it enables privilege separation during the early authentication process.


V-72267

  • Summary: The SSH daemon must not allow compression or must only allow compression after successful authentication.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

The Compression configuration is set to delayed in /etc/ssh/sshd_config and sshd is restarted.

Deployers can choose another option by setting the following Ansible variable:

security_sshd_compression: 'no'

Note

The following are the available settings for Compression in the ssh configuration file:

  • delayed: Compression is enabled after authentication.

  • no: Compression is disabled.

  • yes: Compression is enabled during authentication and during the session (not allowed by the STIG).

The delayed option balances security with performance and is an approved option in the STIG.


V-72289

  • Summary: The system must prevent Internet Protocol version 4 (IPv4) Internet Control Message Protocol (ICMP) redirect messages from being accepted.

  • Severity: Medium

  • Implementation Status: Implemented

Deployer/Auditor notes

This control is implemented by the tasks for another control:


V-72303

  • Summary: Remote X connections for interactive users must be encrypted.

  • Severity: High

  • Implementation Status: Implemented

Deployer/Auditor notes

The X11Forwarding configuration is set to yes in /etc/ssh/sshd_config and sshd is restarted.

Deployers can opt out of this change by setting the following Ansible variable:

security_sshd_enable_x11_forwarding: no