SSHD_CONFIG(5)                File Formats Manual               SSHD_CONFIG(5)

NAME
     sshd_config M-bM-^@M-^S OpenSSH SSH daemon configuration file

SYNOPSIS
     /etc/ssh/sshd_config

DESCRIPTION
     sshd(8) reads configuration data from /etc/ssh/sshd_config (or the file
     specified with -f on the command line).  The file contains keyword-
     argument pairs, one per line.  Lines starting with M-bM-^@M-^X#M-bM-^@M-^Y and empty lines
     are interpreted as comments.  Arguments may optionally be enclosed in
     double quotes (") in order to represent arguments containing spaces.

     The possible keywords and their meanings are as follows (note that
     keywords are case-insensitive and arguments are case-sensitive):

     AcceptEnv
             Specifies what environment variables sent by the client will be
             copied into the session's environ(7).  See SendEnv in
             ssh_config(5) for how to configure the client.  Note that
             environment passing is only supported for protocol 2.  Variables
             are specified by name, which may contain the wildcard characters
             M-bM-^@M-^X*M-bM-^@M-^Y and M-bM-^@M-^X?M-bM-^@M-^Y.  Multiple environment variables may be separated by
             whitespace or spread across multiple AcceptEnv directives.  Be
             warned that some environment variables could be used to bypass
             restricted user environments.  For this reason, care should be
             taken in the use of this directive.  The default is not to accept
             any environment variables.

     AddressFamily
             Specifies which address family should be used by sshd(8).  Valid
             arguments are M-bM-^@M-^\anyM-bM-^@M-^], M-bM-^@M-^\inetM-bM-^@M-^] (use IPv4 only), or M-bM-^@M-^\inet6M-bM-^@M-^] (use IPv6
             only).  The default is M-bM-^@M-^\anyM-bM-^@M-^].

     AllowAgentForwarding
             Specifies whether ssh-agent(1) forwarding is permitted.  The
             default is M-bM-^@M-^\yesM-bM-^@M-^].  Note that disabling agent forwarding does not
             improve security unless users are also denied shell access, as
             they can always install their own forwarders.

     AllowGroups
             This keyword can be followed by a list of group name patterns,
             separated by spaces.  If specified, login is allowed only for
             users whose primary group or supplementary group list matches one
             of the patterns.  Only group names are valid; a numerical group
             ID is not recognized.  By default, login is allowed for all
             groups.  The allow/deny directives are processed in the following
             order: DenyUsers, AllowUsers, DenyGroups, and finally
             AllowGroups.

             See PATTERNS in ssh_config(5) for more information on patterns.

     AllowTcpForwarding
             Specifies whether TCP forwarding is permitted.  The available
             options are M-bM-^@M-^\yesM-bM-^@M-^] or M-bM-^@M-^\allM-bM-^@M-^] to allow TCP forwarding, M-bM-^@M-^\noM-bM-^@M-^] to
             prevent all TCP forwarding, M-bM-^@M-^\localM-bM-^@M-^] to allow local (from the
             perspective of ssh(1)) forwarding only or M-bM-^@M-^\remoteM-bM-^@M-^] to allow
             remote forwarding only.  The default is M-bM-^@M-^\yesM-bM-^@M-^].  Note that
             disabling TCP forwarding does not improve security unless users
             are also denied shell access, as they can always install their
             own forwarders.

     AllowStreamLocalForwarding
             Specifies whether StreamLocal (Unix-domain socket) forwarding is
             permitted.  The available options are M-bM-^@M-^\yesM-bM-^@M-^] or M-bM-^@M-^\allM-bM-^@M-^] to allow
             StreamLocal forwarding, M-bM-^@M-^\noM-bM-^@M-^] to prevent all StreamLocal
             forwarding, M-bM-^@M-^\localM-bM-^@M-^] to allow local (from the perspective of
             ssh(1)) forwarding only or M-bM-^@M-^\remoteM-bM-^@M-^] to allow remote forwarding
             only.  The default is M-bM-^@M-^\yesM-bM-^@M-^].  Note that disabling StreamLocal
             forwarding does not improve security unless users are also denied
             shell access, as they can always install their own forwarders.

     AllowUsers
             This keyword can be followed by a list of user name patterns,
             separated by spaces.  If specified, login is allowed only for
             user names that match one of the patterns.  Only user names are
             valid; a numerical user ID is not recognized.  By default, login
             is allowed for all users.  If the pattern takes the form
             USER@HOST then USER and HOST are separately checked, restricting
             logins to particular users from particular hosts.  The allow/deny
             directives are processed in the following order: DenyUsers,
             AllowUsers, DenyGroups, and finally AllowGroups.

             See PATTERNS in ssh_config(5) for more information on patterns.

     AuthenticationMethods
             Specifies the authentication methods that must be successfully
             completed for a user to be granted access.  This option must be
             followed by one or more comma-separated lists of authentication
             method names.  Successful authentication requires completion of
             every method in at least one of these lists.

             For example, an argument of M-bM-^@M-^\publickey,password
             publickey,keyboard-interactiveM-bM-^@M-^] would require the user to
             complete public key authentication, followed by either password
             or keyboard interactive authentication.  Only methods that are
             next in one or more lists are offered at each stage, so for this
             example, it would not be possible to attempt password or
             keyboard-interactive authentication before public key.

             For keyboard interactive authentication it is also possible to
             restrict authentication to a specific device by appending a colon
             followed by the device identifier M-bM-^@M-^\bsdauthM-bM-^@M-^], M-bM-^@M-^\pamM-bM-^@M-^], or M-bM-^@M-^\skeyM-bM-^@M-^],
             depending on the server configuration.  For example,
             M-bM-^@M-^\keyboard-interactive:bsdauthM-bM-^@M-^] would restrict keyboard
             interactive authentication to the M-bM-^@M-^\bsdauthM-bM-^@M-^] device.

             If the M-bM-^@M-^\publickeyM-bM-^@M-^] method is listed more than once, sshd(8)
             verifies that keys that have been used successfully are not
             reused for subsequent authentications.  For example, an
             AuthenticationMethods of M-bM-^@M-^\publickey,publickeyM-bM-^@M-^] will require
             successful authentication using two different public keys.

             This option is only available for SSH protocol 2 and will yield a
             fatal error if enabled if protocol 1 is also enabled.  Note that
             each authentication method listed should also be explicitly
             enabled in the configuration.  The default is not to require
             multiple authentication; successful completion of a single
             authentication method is sufficient.

     AuthorizedKeysCommand
             Specifies a program to be used to look up the user's public keys.
             The program must be owned by root and not writable by group or
             others.  It will be invoked with a single argument of the
             username being authenticated, and should produce on standard
             output zero or more lines of authorized_keys output (see
             AUTHORIZED_KEYS in sshd(8)).  If a key supplied by
             AuthorizedKeysCommand does not successfully authenticate and
             authorize the user then public key authentication continues using
             the usual AuthorizedKeysFile files.  By default, no
             AuthorizedKeysCommand is run.

     AuthorizedKeysCommandUser
             Specifies the user under whose account the AuthorizedKeysCommand
             is run.  It is recommended to use a dedicated user that has no
             other role on the host than running authorized keys commands.  If
             AuthorizedKeysCommand is specified but AuthorizedKeysCommandUser
             is not, then sshd(8) will refuse to start.

     AuthorizedKeysFile
             Specifies the file that contains the public keys that can be used
             for user authentication.  The format is described in the
             AUTHORIZED_KEYS FILE FORMAT section of sshd(8).
             AuthorizedKeysFile may contain tokens of the form %T which are
             substituted during connection setup.  The following tokens are
             defined: %% is replaced by a literal '%', %h is replaced by the
             home directory of the user being authenticated, and %u is
             replaced by the username of that user.  After expansion,
             AuthorizedKeysFile is taken to be an absolute path or one
             relative to the user's home directory.  Multiple files may be
             listed, separated by whitespace.  The default is
             M-bM-^@M-^\.ssh/authorized_keys .ssh/authorized_keys2M-bM-^@M-^].

     AuthorizedPrincipalsFile
             Specifies a file that lists principal names that are accepted for
             certificate authentication.  When using certificates signed by a
             key listed in TrustedUserCAKeys, this file lists names, one of
             which must appear in the certificate for it to be accepted for
             authentication.  Names are listed one per line preceded by key
             options (as described in AUTHORIZED_KEYS FILE FORMAT in sshd(8)).
             Empty lines and comments starting with M-bM-^@M-^X#M-bM-^@M-^Y are ignored.

             AuthorizedPrincipalsFile may contain tokens of the form %T which
             are substituted during connection setup.  The following tokens
             are defined: %% is replaced by a literal '%', %h is replaced by
             the home directory of the user being authenticated, and %u is
             replaced by the username of that user.  After expansion,
             AuthorizedPrincipalsFile is taken to be an absolute path or one
             relative to the user's home directory.

             The default is M-bM-^@M-^\noneM-bM-^@M-^], i.e. not to use a principals file M-bM-^@M-^S in
             this case, the username of the user must appear in a
             certificate's principals list for it to be accepted.  Note that
             AuthorizedPrincipalsFile is only used when authentication
             proceeds using a CA listed in TrustedUserCAKeys and is not
             consulted for certification authorities trusted via
             ~/.ssh/authorized_keys, though the principals= key option offers
             a similar facility (see sshd(8) for details).

     Banner  The contents of the specified file are sent to the remote user
             before authentication is allowed.  If the argument is M-bM-^@M-^\noneM-bM-^@M-^] then
             no banner is displayed.  This option is only available for
             protocol version 2.  By default, no banner is displayed.

     ChallengeResponseAuthentication
             Specifies whether challenge-response authentication is allowed
             (e.g. via PAM or through authentication styles supported in
             login.conf(5)) The default is M-bM-^@M-^\yesM-bM-^@M-^].

     ChrootDirectory
             Specifies the pathname of a directory to chroot(2) to after
             authentication.  At session startup sshd(8) checks that all
             components of the pathname are root-owned directories which are
             not writable by any other user or group.  After the chroot,
             sshd(8) changes the working directory to the user's home
             directory.

             The pathname may contain the following tokens that are expanded
             at runtime once the connecting user has been authenticated: %% is
             replaced by a literal '%', %h is replaced by the home directory
             of the user being authenticated, and %u is replaced by the
             username of that user.

             The ChrootDirectory must contain the necessary files and
             directories to support the user's session.  For an interactive
             session this requires at least a shell, typically sh(1), and
             basic /dev nodes such as null(4), zero(4), stdin(4), stdout(4),
             stderr(4), and tty(4) devices.  For file transfer sessions using
             M-bM-^@M-^\sftpM-bM-^@M-^], no additional configuration of the environment is
             necessary if the in-process sftp server is used, though sessions
             which use logging may require /dev/log inside the chroot
             directory on some operating systems (see sftp-server(8) for
             details).

             For safety, it is very important that the directory hierarchy be
             prevented from modification by other processes on the system
             (especially those outside the jail).  Misconfiguration can lead
             to unsafe environments which sshd(8) cannot detect.

             The default is not to chroot(2).

     Ciphers
             Specifies the ciphers allowed for protocol version 2.  Multiple
             ciphers must be comma-separated.  The supported ciphers are:

                   3des-cbc
                   aes128-cbc
                   aes192-cbc
                   aes256-cbc
                   aes128-ctr
                   aes192-ctr
                   aes256-ctr
                   aes128-gcm@openssh.com
                   aes256-gcm@openssh.com
                   arcfour
                   arcfour128
                   arcfour256
                   blowfish-cbc
                   cast128-cbc
                   chacha20-poly1305@openssh.com

             The default is:

                   aes128-ctr,aes192-ctr,aes256-ctr,
                   aes128-gcm@openssh.com,aes256-gcm@openssh.com,
                   chacha20-poly1305@openssh.com

             The list of available ciphers may also be obtained using the -Q
             option of ssh(1) with an argument of M-bM-^@M-^\cipherM-bM-^@M-^].

     ClientAliveCountMax
             Sets the number of client alive messages (see below) which may be
             sent without sshd(8) receiving any messages back from the client.
             If this threshold is reached while client alive messages are
             being sent, sshd will disconnect the client, terminating the
             session.  It is important to note that the use of client alive
             messages is very different from TCPKeepAlive (below).  The client
             alive messages are sent through the encrypted channel and
             therefore will not be spoofable.  The TCP keepalive option
             enabled by TCPKeepAlive is spoofable.  The client alive mechanism
             is valuable when the client or server depend on knowing when a
             connection has become inactive.

             The default value is 3.  If ClientAliveInterval (see below) is
             set to 15, and ClientAliveCountMax is left at the default,
             unresponsive SSH clients will be disconnected after approximately
             45 seconds.  This option applies to protocol version 2 only.

     ClientAliveInterval
             Sets a timeout interval in seconds after which if no data has
             been received from the client, sshd(8) will send a message
             through the encrypted channel to request a response from the
             client.  The default is 0, indicating that these messages will
             not be sent to the client.  This option applies to protocol
             version 2 only.

     Compression
             Specifies whether compression is allowed, or delayed until the
             user has authenticated successfully.  The argument must be M-bM-^@M-^\yesM-bM-^@M-^],
             M-bM-^@M-^\delayedM-bM-^@M-^], or M-bM-^@M-^\noM-bM-^@M-^].  The default is M-bM-^@M-^\delayedM-bM-^@M-^].

     DenyGroups
             This keyword can be followed by a list of group name patterns,
             separated by spaces.  Login is disallowed for users whose primary
             group or supplementary group list matches one of the patterns.
             Only group names are valid; a numerical group ID is not
             recognized.  By default, login is allowed for all groups.  The
             allow/deny directives are processed in the following order:
             DenyUsers, AllowUsers, DenyGroups, and finally AllowGroups.

             See PATTERNS in ssh_config(5) for more information on patterns.

     DenyUsers
             This keyword can be followed by a list of user name patterns,
             separated by spaces.  Login is disallowed for user names that
             match one of the patterns.  Only user names are valid; a
             numerical user ID is not recognized.  By default, login is
             allowed for all users.  If the pattern takes the form USER@HOST
             then USER and HOST are separately checked, restricting logins to
             particular users from particular hosts.  The allow/deny
             directives are processed in the following order: DenyUsers,
             AllowUsers, DenyGroups, and finally AllowGroups.

             See PATTERNS in ssh_config(5) for more information on patterns.

     FingerprintHash
             Specifies the hash algorithm used when logging key fingerprints.
             Valid options are: M-bM-^@M-^\md5M-bM-^@M-^] and M-bM-^@M-^\sha256M-bM-^@M-^].  The default is M-bM-^@M-^\sha256M-bM-^@M-^].

     ForceCommand
             Forces the execution of the command specified by ForceCommand,
             ignoring any command supplied by the client and ~/.ssh/rc if
             present.  The command is invoked by using the user's login shell
             with the -c option.  This applies to shell, command, or subsystem
             execution.  It is most useful inside a Match block.  The command
             originally supplied by the client is available in the
             SSH_ORIGINAL_COMMAND environment variable.  Specifying a command
             of M-bM-^@M-^\internal-sftpM-bM-^@M-^] will force the use of an in-process sftp
             server that requires no support files when used with
             ChrootDirectory.

     GatewayPorts
             Specifies whether remote hosts are allowed to connect to ports
             forwarded for the client.  By default, sshd(8) binds remote port
             forwardings to the loopback address.  This prevents other remote
             hosts from connecting to forwarded ports.  GatewayPorts can be
             used to specify that sshd should allow remote port forwardings to
             bind to non-loopback addresses, thus allowing other hosts to
             connect.  The argument may be M-bM-^@M-^\noM-bM-^@M-^] to force remote port
             forwardings to be available to the local host only, M-bM-^@M-^\yesM-bM-^@M-^] to
             force remote port forwardings to bind to the wildcard address, or
             M-bM-^@M-^\clientspecifiedM-bM-^@M-^] to allow the client to select the address to
             which the forwarding is bound.  The default is M-bM-^@M-^\noM-bM-^@M-^].

     GSSAPIAuthentication
             Specifies whether user authentication based on GSSAPI is allowed.
             The default is M-bM-^@M-^\noM-bM-^@M-^].  Note that this option applies to protocol
             version 2 only.

     GSSAPICleanupCredentials
             Specifies whether to automatically destroy the user's credentials
             cache on logout.  The default is M-bM-^@M-^\yesM-bM-^@M-^].  Note that this option
             applies to protocol version 2 only.

     HostbasedAcceptedKeyTypes
             Specifies the key types that will be accepted for hostbased
             authentication as a comma-separated pattern list.  The default
             M-bM-^@M-^\*M-bM-^@M-^] will allow all key types.  The -Q option of ssh(1) may be
             used to list supported key types.

     HostbasedAuthentication
             Specifies whether rhosts or /etc/hosts.equiv authentication
             together with successful public key client host authentication is
             allowed (host-based authentication).  This option is similar to
             RhostsRSAAuthentication and applies to protocol version 2 only.
             The default is M-bM-^@M-^\noM-bM-^@M-^].

     HostbasedUsesNameFromPacketOnly
             Specifies whether or not the server will attempt to perform a
             reverse name lookup when matching the name in the ~/.shosts,
             ~/.rhosts, and /etc/hosts.equiv files during
             HostbasedAuthentication.  A setting of M-bM-^@M-^\yesM-bM-^@M-^] means that sshd(8)
             uses the name supplied by the client rather than attempting to
             resolve the name from the TCP connection itself.  The default is
             M-bM-^@M-^\noM-bM-^@M-^].

     HostCertificate
             Specifies a file containing a public host certificate.  The
             certificate's public key must match a private host key already
             specified by HostKey.  The default behaviour of sshd(8) is not to
             load any certificates.

     HostKey
             Specifies a file containing a private host key used by SSH.  The
             default is /etc/ssh/ssh_host_key for protocol version 1, and
             /etc/ssh/ssh_host_dsa_key, /etc/ssh/ssh_host_ecdsa_key,
             /etc/ssh/ssh_host_ed25519_key and /etc/ssh/ssh_host_rsa_key for
             protocol version 2.  Note that sshd(8) will refuse to use a file
             if it is group/world-accessible.  It is possible to have multiple
             host key files.  M-bM-^@M-^\rsa1M-bM-^@M-^] keys are used for version 1 and M-bM-^@M-^\dsaM-bM-^@M-^],
             M-bM-^@M-^\ecdsaM-bM-^@M-^], M-bM-^@M-^\ed25519M-bM-^@M-^] or M-bM-^@M-^\rsaM-bM-^@M-^] are used for version 2 of the SSH
             protocol.  It is also possible to specify public host key files
             instead.  In this case operations on the private key will be
             delegated to an ssh-agent(1).

     HostKeyAgent
             Identifies the UNIX-domain socket used to communicate with an
             agent that has access to the private host keys.  If
             M-bM-^@M-^\SSH_AUTH_SOCKM-bM-^@M-^] is specified, the location of the socket will be
             read from the SSH_AUTH_SOCK environment variable.

     IgnoreRhosts
             Specifies that .rhosts and .shosts files will not be used in
             RhostsRSAAuthentication or HostbasedAuthentication.

             /etc/hosts.equiv and /etc/shosts.equiv are still used.  The
             default is M-bM-^@M-^\yesM-bM-^@M-^].

     IgnoreUserKnownHosts
             Specifies whether sshd(8) should ignore the user's
             ~/.ssh/known_hosts during RhostsRSAAuthentication or
             HostbasedAuthentication.  The default is M-bM-^@M-^\noM-bM-^@M-^].

     IPQoS   Specifies the IPv4 type-of-service or DSCP class for the
             connection.  Accepted values are M-bM-^@M-^\af11M-bM-^@M-^], M-bM-^@M-^\af12M-bM-^@M-^], M-bM-^@M-^\af13M-bM-^@M-^], M-bM-^@M-^\af21M-bM-^@M-^],
             M-bM-^@M-^\af22M-bM-^@M-^], M-bM-^@M-^\af23M-bM-^@M-^], M-bM-^@M-^\af31M-bM-^@M-^], M-bM-^@M-^\af32M-bM-^@M-^], M-bM-^@M-^\af33M-bM-^@M-^], M-bM-^@M-^\af41M-bM-^@M-^], M-bM-^@M-^\af42M-bM-^@M-^], M-bM-^@M-^\af43M-bM-^@M-^],
             M-bM-^@M-^\cs0M-bM-^@M-^], M-bM-^@M-^\cs1M-bM-^@M-^], M-bM-^@M-^\cs2M-bM-^@M-^], M-bM-^@M-^\cs3M-bM-^@M-^], M-bM-^@M-^\cs4M-bM-^@M-^], M-bM-^@M-^\cs5M-bM-^@M-^], M-bM-^@M-^\cs6M-bM-^@M-^], M-bM-^@M-^\cs7M-bM-^@M-^], M-bM-^@M-^\efM-bM-^@M-^],
             M-bM-^@M-^\lowdelayM-bM-^@M-^], M-bM-^@M-^\throughputM-bM-^@M-^], M-bM-^@M-^\reliabilityM-bM-^@M-^], or a numeric value.
             This option may take one or two arguments, separated by
             whitespace.  If one argument is specified, it is used as the
             packet class unconditionally.  If two values are specified, the
             first is automatically selected for interactive sessions and the
             second for non-interactive sessions.  The default is M-bM-^@M-^\lowdelayM-bM-^@M-^]
             for interactive sessions and M-bM-^@M-^\throughputM-bM-^@M-^] for non-interactive
             sessions.

     KbdInteractiveAuthentication
             Specifies whether to allow keyboard-interactive authentication.
             The argument to this keyword must be M-bM-^@M-^\yesM-bM-^@M-^] or M-bM-^@M-^\noM-bM-^@M-^].  The default
             is to use whatever value ChallengeResponseAuthentication is set
             to (by default M-bM-^@M-^\yesM-bM-^@M-^]).

     KerberosAuthentication
             Specifies whether the password provided by the user for
             PasswordAuthentication will be validated through the Kerberos
             KDC.  To use this option, the server needs a Kerberos servtab
             which allows the verification of the KDC's identity.  The default
             is M-bM-^@M-^\noM-bM-^@M-^].

     KerberosGetAFSToken
             If AFS is active and the user has a Kerberos 5 TGT, attempt to
             acquire an AFS token before accessing the user's home directory.
             The default is M-bM-^@M-^\noM-bM-^@M-^].

     KerberosOrLocalPasswd
             If password authentication through Kerberos fails then the
             password will be validated via any additional local mechanism
             such as /etc/passwd.  The default is M-bM-^@M-^\yesM-bM-^@M-^].

     KerberosTicketCleanup
             Specifies whether to automatically destroy the user's ticket
             cache file on logout.  The default is M-bM-^@M-^\yesM-bM-^@M-^].

     KexAlgorithms
             Specifies the available KEX (Key Exchange) algorithms.  Multiple
             algorithms must be comma-separated.  The supported algorithms
             are:

                   curve25519-sha256@libssh.org
                   diffie-hellman-group1-sha1
                   diffie-hellman-group14-sha1
                   diffie-hellman-group-exchange-sha1
                   diffie-hellman-group-exchange-sha256
                   ecdh-sha2-nistp256
                   ecdh-sha2-nistp384
                   ecdh-sha2-nistp521

             The default is:

                   curve25519-sha256@libssh.org,
                   ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,
                   diffie-hellman-group-exchange-sha256,
                   diffie-hellman-group14-sha1

             The list of available key exchange algorithms may also be
             obtained using the -Q option of ssh(1) with an argument of M-bM-^@M-^\kexM-bM-^@M-^].

     KeyRegenerationInterval
             In protocol version 1, the ephemeral server key is automatically
             regenerated after this many seconds (if it has been used).  The
             purpose of regeneration is to prevent decrypting captured
             sessions by later breaking into the machine and stealing the
             keys.  The key is never stored anywhere.  If the value is 0, the
             key is never regenerated.  The default is 3600 (seconds).

     ListenAddress
             Specifies the local addresses sshd(8) should listen on.  The
             following forms may be used:

                   ListenAddress host|IPv4_addr|IPv6_addr
                   ListenAddress host|IPv4_addr:port
                   ListenAddress [host|IPv6_addr]:port

             If port is not specified, sshd will listen on the address and all
             prior Port options specified.  The default is to listen on all
             local addresses.  Multiple ListenAddress options are permitted.
             Additionally, any Port options must precede this option for non-
             port qualified addresses.

     LoginGraceTime
             The server disconnects after this time if the user has not
             successfully logged in.  If the value is 0, there is no time
             limit.  The default is 120 seconds.

     LogLevel
             Gives the verbosity level that is used when logging messages from
             sshd(8).  The possible values are: QUIET, FATAL, ERROR, INFO,
             VERBOSE, DEBUG, DEBUG1, DEBUG2, and DEBUG3.  The default is INFO.
             DEBUG and DEBUG1 are equivalent.  DEBUG2 and DEBUG3 each specify
             higher levels of debugging output.  Logging with a DEBUG level
             violates the privacy of users and is not recommended.

     MACs    Specifies the available MAC (message authentication code)
             algorithms.  The MAC algorithm is used in protocol version 2 for
             data integrity protection.  Multiple algorithms must be comma-
             separated.  The algorithms that contain M-bM-^@M-^\-etmM-bM-^@M-^] calculate the MAC
             after encryption (encrypt-then-mac).  These are considered safer
             and their use recommended.  The supported MACs are:

                   hmac-md5
                   hmac-md5-96
                   hmac-ripemd160
                   hmac-sha1
                   hmac-sha1-96
                   hmac-sha2-256
                   hmac-sha2-512
                   umac-64@openssh.com
                   umac-128@openssh.com
                   hmac-md5-etm@openssh.com
                   hmac-md5-96-etm@openssh.com
                   hmac-ripemd160-etm@openssh.com
                   hmac-sha1-etm@openssh.com
                   hmac-sha1-96-etm@openssh.com
                   hmac-sha2-256-etm@openssh.com
                   hmac-sha2-512-etm@openssh.com
                   umac-64-etm@openssh.com
                   umac-128-etm@openssh.com

             The default is:

                   umac-64-etm@openssh.com,umac-128-etm@openssh.com,
                   hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,
                   umac-64@openssh.com,umac-128@openssh.com,
                   hmac-sha2-256,hmac-sha2-512

             The list of available MAC algorithms may also be obtained using
             the -Q option of ssh(1) with an argument of M-bM-^@M-^\macM-bM-^@M-^].

     Match   Introduces a conditional block.  If all of the criteria on the
             Match line are satisfied, the keywords on the following lines
             override those set in the global section of the config file,
             until either another Match line or the end of the file.  If a
             keyword appears in multiple Match blocks that are satisfied, only
             the first instance of the keyword is applied.

             The arguments to Match are one or more criteria-pattern pairs or
             the single token All which matches all criteria.  The available
             criteria are User, Group, Host, LocalAddress, LocalPort, and
             Address.  The match patterns may consist of single entries or
             comma-separated lists and may use the wildcard and negation
             operators described in the PATTERNS section of ssh_config(5).

             The patterns in an Address criteria may additionally contain
             addresses to match in CIDR address/masklen format, e.g.
             M-bM-^@M-^\192.0.2.0/24M-bM-^@M-^] or M-bM-^@M-^\3ffe:ffff::/32M-bM-^@M-^].  Note that the mask length
             provided must be consistent with the address - it is an error to
             specify a mask length that is too long for the address or one
             with bits set in this host portion of the address.  For example,
             M-bM-^@M-^\192.0.2.0/33M-bM-^@M-^] and M-bM-^@M-^\192.0.2.0/8M-bM-^@M-^] respectively.

             Only a subset of keywords may be used on the lines following a
             Match keyword.  Available keywords are AcceptEnv,
             AllowAgentForwarding, AllowGroups, AllowStreamLocalForwarding,
             AllowTcpForwarding, AllowUsers, AuthenticationMethods,
             AuthorizedKeysCommand, AuthorizedKeysCommandUser,
             AuthorizedKeysFile, AuthorizedPrincipalsFile, Banner,
             ChrootDirectory, DenyGroups, DenyUsers, ForceCommand,
             GatewayPorts, GSSAPIAuthentication, HostbasedAcceptedKeyTypes,
             HostbasedAuthentication, HostbasedUsesNameFromPacketOnly, IPQoS,
             KbdInteractiveAuthentication, KerberosAuthentication,
             MaxAuthTries, MaxSessions, PasswordAuthentication,
             PermitEmptyPasswords, PermitOpen, PermitRootLogin, PermitTTY,
             PermitTunnel, PermitUserRC, PubkeyAcceptedKeyTypes,
             PubkeyAuthentication, RekeyLimit, RevokedKeys,
             RhostsRSAAuthentication, RSAAuthentication, StreamLocalBindMask,
             StreamLocalBindUnlink, TrustedUserCAKeys, X11DisplayOffset,
             X11Forwarding and X11UseLocalHost.

     MaxAuthTries
             Specifies the maximum number of authentication attempts permitted
             per connection.  Once the number of failures reaches half this
             value, additional failures are logged.  The default is 6.

     MaxSessions
             Specifies the maximum number of open sessions permitted per
             network connection.  The default is 10.

     MaxStartups
             Specifies the maximum number of concurrent unauthenticated
             connections to the SSH daemon.  Additional connections will be
             dropped until authentication succeeds or the LoginGraceTime
             expires for a connection.  The default is 10:30:100.

             Alternatively, random early drop can be enabled by specifying the
             three colon separated values M-bM-^@M-^\start:rate:fullM-bM-^@M-^] (e.g. "10:30:60").
             sshd(8) will refuse connection attempts with a probability of
             M-bM-^@M-^\rate/100M-bM-^@M-^] (30%) if there are currently M-bM-^@M-^\startM-bM-^@M-^] (10)
             unauthenticated connections.  The probability increases linearly
             and all connection attempts are refused if the number of
             unauthenticated connections reaches M-bM-^@M-^\fullM-bM-^@M-^] (60).

     PasswordAuthentication
             Specifies whether password authentication is allowed.  The
             default is M-bM-^@M-^\yesM-bM-^@M-^].

     PermitEmptyPasswords
             When password authentication is allowed, it specifies whether the
             server allows login to accounts with empty password strings.  The
             default is M-bM-^@M-^\noM-bM-^@M-^].

     PermitOpen
             Specifies the destinations to which TCP port forwarding is
             permitted.  The forwarding specification must be one of the
             following forms:

                   PermitOpen host:port
                   PermitOpen IPv4_addr:port
                   PermitOpen [IPv6_addr]:port

             Multiple forwards may be specified by separating them with
             whitespace.  An argument of M-bM-^@M-^\anyM-bM-^@M-^] can be used to remove all
             restrictions and permit any forwarding requests.  An argument of
             M-bM-^@M-^\noneM-bM-^@M-^] can be used to prohibit all forwarding requests.  By
             default all port forwarding requests are permitted.

     PermitRootLogin
             Specifies whether root can log in using ssh(1).  The argument
             must be M-bM-^@M-^\yesM-bM-^@M-^], M-bM-^@M-^\without-passwordM-bM-^@M-^], M-bM-^@M-^\forced-commands-onlyM-bM-^@M-^], or
             M-bM-^@M-^\noM-bM-^@M-^].  The default is M-bM-^@M-^\yesM-bM-^@M-^].

             If this option is set to M-bM-^@M-^\without-passwordM-bM-^@M-^], password
             authentication is disabled for root.

             If this option is set to M-bM-^@M-^\forced-commands-onlyM-bM-^@M-^], root login with
             public key authentication will be allowed, but only if the
             command option has been specified (which may be useful for taking
             remote backups even if root login is normally not allowed).  All
             other authentication methods are disabled for root.

             If this option is set to M-bM-^@M-^\noM-bM-^@M-^], root is not allowed to log in.

     PermitTunnel
             Specifies whether tun(4) device forwarding is allowed.  The
             argument must be M-bM-^@M-^\yesM-bM-^@M-^], M-bM-^@M-^\point-to-pointM-bM-^@M-^] (layer 3), M-bM-^@M-^\ethernetM-bM-^@M-^]
             (layer 2), or M-bM-^@M-^\noM-bM-^@M-^].  Specifying M-bM-^@M-^\yesM-bM-^@M-^] permits both
             M-bM-^@M-^\point-to-pointM-bM-^@M-^] and M-bM-^@M-^\ethernetM-bM-^@M-^].  The default is M-bM-^@M-^\noM-bM-^@M-^].

             Independent of this setting, the permissions of the selected
             tun(4) device must allow access to the user.

     PermitTTY
             Specifies whether pty(4) allocation is permitted.  The default is
             M-bM-^@M-^\yesM-bM-^@M-^].

     PermitUserEnvironment
             Specifies whether ~/.ssh/environment and environment= options in
             ~/.ssh/authorized_keys are processed by sshd(8).  The default is
             M-bM-^@M-^\noM-bM-^@M-^].  Enabling environment processing may enable users to bypass
             access restrictions in some configurations using mechanisms such
             as LD_PRELOAD.

     PermitUserRC
             Specifies whether any ~/.ssh/rc file is executed.  The default is
             M-bM-^@M-^\yesM-bM-^@M-^].

     PidFile
             Specifies the file that contains the process ID of the SSH
             daemon.  The default is /var/run/sshd.pid.

     Port    Specifies the port number that sshd(8) listens on.  The default
             is 22.  Multiple options of this type are permitted.  See also
             ListenAddress.

     PrintLastLog
             Specifies whether sshd(8) should print the date and time of the
             last user login when a user logs in interactively.  The default
             is M-bM-^@M-^\yesM-bM-^@M-^].

     PrintMotd
             Specifies whether sshd(8) should print /etc/motd when a user logs
             in interactively.  (On some systems it is also printed by the
             shell, /etc/profile, or equivalent.)  The default is M-bM-^@M-^\yesM-bM-^@M-^].

     Protocol
             Specifies the protocol versions sshd(8) supports.  The possible
             values are M-bM-^@M-^X1M-bM-^@M-^Y and M-bM-^@M-^X2M-bM-^@M-^Y.  Multiple versions must be comma-
             separated.  The default is M-bM-^@M-^X2M-bM-^@M-^Y.  Note that the order of the
             protocol list does not indicate preference, because the client
             selects among multiple protocol versions offered by the server.
             Specifying M-bM-^@M-^\2,1M-bM-^@M-^] is identical to M-bM-^@M-^\1,2M-bM-^@M-^].

     PubkeyAcceptedKeyTypes
             Specifies the key types that will be accepted for public key
             authentication as a comma-separated pattern list.  The default
             M-bM-^@M-^\*M-bM-^@M-^] will allow all key types.  The -Q option of ssh(1) may be
             used to list supported key types.

     PubkeyAuthentication
             Specifies whether public key authentication is allowed.  The
             default is M-bM-^@M-^\yesM-bM-^@M-^].  Note that this option applies to protocol
             version 2 only.

     RekeyLimit
             Specifies the maximum amount of data that may be transmitted
             before the session key is renegotiated, optionally followed a
             maximum amount of time that may pass before the session key is
             renegotiated.  The first argument is specified in bytes and may
             have a suffix of M-bM-^@M-^XKM-bM-^@M-^Y, M-bM-^@M-^XMM-bM-^@M-^Y, or M-bM-^@M-^XGM-bM-^@M-^Y to indicate Kilobytes,
             Megabytes, or Gigabytes, respectively.  The default is between
             M-bM-^@M-^X1GM-bM-^@M-^Y and M-bM-^@M-^X4GM-bM-^@M-^Y, depending on the cipher.  The optional second
             value is specified in seconds and may use any of the units
             documented in the TIME FORMATS section.  The default value for
             RekeyLimit is M-bM-^@M-^\default noneM-bM-^@M-^], which means that rekeying is
             performed after the cipher's default amount of data has been sent
             or received and no time based rekeying is done.  This option
             applies to protocol version 2 only.

     RevokedKeys
             Specifies revoked public keys.  Keys listed in this file will be
             refused for public key authentication.  Note that if this file is
             not readable, then public key authentication will be refused for
             all users.  Keys may be specified as a text file, listing one
             public key per line, or as an OpenSSH Key Revocation List (KRL)
             as generated by ssh-keygen(1).  For more information on KRLs, see
             the KEY REVOCATION LISTS section in ssh-keygen(1).

     RhostsRSAAuthentication
             Specifies whether rhosts or /etc/hosts.equiv authentication
             together with successful RSA host authentication is allowed.  The
             default is M-bM-^@M-^\noM-bM-^@M-^].  This option applies to protocol version 1 only.

     RSAAuthentication
             Specifies whether pure RSA authentication is allowed.  The
             default is M-bM-^@M-^\yesM-bM-^@M-^].  This option applies to protocol version 1
             only.

     ServerKeyBits
             Defines the number of bits in the ephemeral protocol version 1
             server key.  The minimum value is 512, and the default is 1024.

     StreamLocalBindMask
             Sets the octal file creation mode mask (umask) used when creating
             a Unix-domain socket file for local or remote port forwarding.
             This option is only used for port forwarding to a Unix-domain
             socket file.

             The default value is 0177, which creates a Unix-domain socket
             file that is readable and writable only by the owner.  Note that
             not all operating systems honor the file mode on Unix-domain
             socket files.

     StreamLocalBindUnlink
             Specifies whether to remove an existing Unix-domain socket file
             for local or remote port forwarding before creating a new one.
             If the socket file already exists and StreamLocalBindUnlink is
             not enabled, sshd will be unable to forward the port to the Unix-
             domain socket file.  This option is only used for port forwarding
             to a Unix-domain socket file.

             The argument must be M-bM-^@M-^\yesM-bM-^@M-^] or M-bM-^@M-^\noM-bM-^@M-^].  The default is M-bM-^@M-^\noM-bM-^@M-^].

     StrictModes
             Specifies whether sshd(8) should check file modes and ownership
             of the user's files and home directory before accepting login.
             This is normally desirable because novices sometimes accidentally
             leave their directory or files world-writable.  The default is
             M-bM-^@M-^\yesM-bM-^@M-^].  Note that this does not apply to ChrootDirectory, whose
             permissions and ownership are checked unconditionally.

     Subsystem
             Configures an external subsystem (e.g. file transfer daemon).
             Arguments should be a subsystem name and a command (with optional
             arguments) to execute upon subsystem request.

             The command sftp-server(8) implements the M-bM-^@M-^\sftpM-bM-^@M-^] file transfer
             subsystem.

             Alternately the name M-bM-^@M-^\internal-sftpM-bM-^@M-^] implements an in-process
             M-bM-^@M-^\sftpM-bM-^@M-^] server.  This may simplify configurations using
             ChrootDirectory to force a different filesystem root on clients.

             By default no subsystems are defined.  Note that this option
             applies to protocol version 2 only.

     SyslogFacility
             Gives the facility code that is used when logging messages from
             sshd(8).  The possible values are: DAEMON, USER, AUTH, LOCAL0,
             LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7.  The
             default is AUTH.

     TCPKeepAlive
             Specifies whether the system should send TCP keepalive messages
             to the other side.  If they are sent, death of the connection or
             crash of one of the machines will be properly noticed.  However,
             this means that connections will die if the route is down
             temporarily, and some people find it annoying.  On the other
             hand, if TCP keepalives are not sent, sessions may hang
             indefinitely on the server, leaving M-bM-^@M-^\ghostM-bM-^@M-^] users and consuming
             server resources.

             The default is M-bM-^@M-^\yesM-bM-^@M-^] (to send TCP keepalive messages), and the
             server will notice if the network goes down or the client host
             crashes.  This avoids infinitely hanging sessions.

             To disable TCP keepalive messages, the value should be set to
             M-bM-^@M-^\noM-bM-^@M-^].

     TrustedUserCAKeys
             Specifies a file containing public keys of certificate
             authorities that are trusted to sign user certificates for
             authentication.  Keys are listed one per line; empty lines and
             comments starting with M-bM-^@M-^X#M-bM-^@M-^Y are allowed.  If a certificate is
             presented for authentication and has its signing CA key listed in
             this file, then it may be used for authentication for any user
             listed in the certificate's principals list.  Note that
             certificates that lack a list of principals will not be permitted
             for authentication using TrustedUserCAKeys.  For more details on
             certificates, see the CERTIFICATES section in ssh-keygen(1).

     UseDNS  Specifies whether sshd(8) should look up the remote host name and
             check that the resolved host name for the remote IP address maps
             back to the very same IP address.  The default is M-bM-^@M-^\noM-bM-^@M-^].

     UseLogin
             Specifies whether login(1) is used for interactive login
             sessions.  The default is M-bM-^@M-^\noM-bM-^@M-^].  Note that login(1) is never used
             for remote command execution.  Note also, that if this is
             enabled, X11Forwarding will be disabled because login(1) does not
             know how to handle xauth(1) cookies.  If UsePrivilegeSeparation
             is specified, it will be disabled after authentication.

     UsePAM  Enables the Pluggable Authentication Module interface.  If set to
             M-bM-^@M-^\yesM-bM-^@M-^] this will enable PAM authentication using
             ChallengeResponseAuthentication and PasswordAuthentication in
             addition to PAM account and session module processing for all
             authentication types.

             Because PAM challenge-response authentication usually serves an
             equivalent role to password authentication, you should disable
             either PasswordAuthentication or ChallengeResponseAuthentication.

             If UsePAM is enabled, you will not be able to run sshd(8) as a
             non-root user.  The default is M-bM-^@M-^\noM-bM-^@M-^].

     UsePrivilegeSeparation
             Specifies whether sshd(8) separates privileges by creating an
             unprivileged child process to deal with incoming network traffic.
             After successful authentication, another process will be created
             that has the privilege of the authenticated user.  The goal of
             privilege separation is to prevent privilege escalation by
             containing any corruption within the unprivileged processes.  The
             default is M-bM-^@M-^\yesM-bM-^@M-^].  If UsePrivilegeSeparation is set to M-bM-^@M-^\sandboxM-bM-^@M-^]
             then the pre-authentication unprivileged process is subject to
             additional restrictions.

     VersionAddendum
             Optionally specifies additional text to append to the SSH
             protocol banner sent by the server upon connection.  The default
             is M-bM-^@M-^\noneM-bM-^@M-^].

     X11DisplayOffset
             Specifies the first display number available for sshd(8)'s X11
             forwarding.  This prevents sshd from interfering with real X11
             servers.  The default is 10.

     X11Forwarding
             Specifies whether X11 forwarding is permitted.  The argument must
             be M-bM-^@M-^\yesM-bM-^@M-^] or M-bM-^@M-^\noM-bM-^@M-^].  The default is M-bM-^@M-^\noM-bM-^@M-^].

             When X11 forwarding is enabled, there may be additional exposure
             to the server and to client displays if the sshd(8) proxy display
             is configured to listen on the wildcard address (see
             X11UseLocalhost below), though this is not the default.
             Additionally, the authentication spoofing and authentication data
             verification and substitution occur on the client side.  The
             security risk of using X11 forwarding is that the client's X11
             display server may be exposed to attack when the SSH client
             requests forwarding (see the warnings for ForwardX11 in
             ssh_config(5)).  A system administrator may have a stance in
             which they want to protect clients that may expose themselves to
             attack by unwittingly requesting X11 forwarding, which can
             warrant a M-bM-^@M-^\noM-bM-^@M-^] setting.

             Note that disabling X11 forwarding does not prevent users from
             forwarding X11 traffic, as users can always install their own
             forwarders.  X11 forwarding is automatically disabled if UseLogin
             is enabled.

     X11UseLocalhost
             Specifies whether sshd(8) should bind the X11 forwarding server
             to the loopback address or to the wildcard address.  By default,
             sshd binds the forwarding server to the loopback address and sets
             the hostname part of the DISPLAY environment variable to
             M-bM-^@M-^\localhostM-bM-^@M-^].  This prevents remote hosts from connecting to the
             proxy display.  However, some older X11 clients may not function
             with this configuration.  X11UseLocalhost may be set to M-bM-^@M-^\noM-bM-^@M-^] to
             specify that the forwarding server should be bound to the
             wildcard address.  The argument must be M-bM-^@M-^\yesM-bM-^@M-^] or M-bM-^@M-^\noM-bM-^@M-^].  The
             default is M-bM-^@M-^\yesM-bM-^@M-^].

     XAuthLocation
             Specifies the full pathname of the xauth(1) program.  The default
             is /usr/X11R6/bin/xauth.

TIME FORMATS
     sshd(8) command-line arguments and configuration file options that
     specify time may be expressed using a sequence of the form:
     time[qualifier], where time is a positive integer value and qualifier is
     one of the following:

           M-bM-^_M-(noneM-bM-^_M-)  seconds
           s | S   seconds
           m | M   minutes
           h | H   hours
           d | D   days
           w | W   weeks

     Each member of the sequence is added together to calculate the total time
     value.

     Time format examples:

           600     600 seconds (10 minutes)
           10m     10 minutes
           1h30m   1 hour 30 minutes (90 minutes)

FILES
     /etc/ssh/sshd_config
             Contains configuration data for sshd(8).  This file should be
             writable by root only, but it is recommended (though not
             necessary) that it be world-readable.

SEE ALSO
     sshd(8)

AUTHORS
     OpenSSH is a derivative of the original and free ssh 1.2.12 release by
     Tatu Ylonen.  Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo
     de Raadt and Dug Song removed many bugs, re-added newer features and
     created OpenSSH.  Markus Friedl contributed the support for SSH protocol
     versions 1.5 and 2.0.  Niels Provos and Markus Friedl contributed support
     for privilege separation.

OpenBSD 5.7                    February 20, 2015                   OpenBSD 5.7
