Network Working Group Tatu Ylonen INTERNET-DRAFT Timo J. Rinne draft-ietf-secsh-agent-02.txt Sami Lehtinen Expires: July 30, 2004 SSH Communications Security 30 January, 2004 Secure Shell Authentication Agent Protocol Status of This Memo This document is an Internet-Draft and is in full conformance with all provisions of Section 10 of RFC2026. Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents as Internet-Drafts. Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet- Drafts as reference material or to cite them other than as "work in progress." The list of current Internet-Drafts can be accessed at http://www.ietf.org/ietf/1id-abstracts.txt The list of Internet-Draft Shadow Directories can be accessed at http://www.ietf.org/shadow.html. Abstract This document describes the Secure Shell authentication agent protocol (i.e., the protocol used between a client requesting authentication and the authentication agent). This protocol usually runs in a machine-spe- cific local channel or over a forwarded authentication channel. It is assumed that the channel is trusted, so no protection for the communica- tions channel is provided by this protocol. Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 1] INTERNET-DRAFT 30 January, 2004 Table of Contents 1. Authentication Agent Protocol . . . . . . . . . . . . . . . . . 2 1.1. Packet Format . . . . . . . . . . . . . . . . . . . . . . . 3 1.2. Forwarding Notices . . . . . . . . . . . . . . . . . . . . . 3 1.3. Requesting Version Number . . . . . . . . . . . . . . . . . 4 1.4. Adding Keys to the Agent . . . . . . . . . . . . . . . . . . 4 1.4.1. Key types . . . . . . . . . . . . . . . . . . . . . . . 5 1.4.2. Forwarding constraints . . . . . . . . . . . . . . . . . 5 1.5. Deleting Keys from the Agent . . . . . . . . . . . . . . . . 7 1.6. Deleting specific key from the Agent . . . . . . . . . . . . 7 1.7. Listing the Keys that the Agent Can Use . . . . . . . . . . 7 2. Performing Private Key Operations . . . . . . . . . . . . . . . 7 2.1. Signing . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.2. Decrypting . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.3. Secure Shell Challenge-Response Authentication . . . . . . . 8 3. Administrative Messages . . . . . . . . . . . . . . . . . . . . 9 3.1. Locking and unlocking the agent . . . . . . . . . . . . . . 9 3.2. Miscellaneous Agent Commands . . . . . . . . . . . . . . . . 9 4. Agent Forwarding With Secure Shell . . . . . . . . . . . . . . . 10 4.1. Requesting Agent Forwarding . . . . . . . . . . . . . . . . 10 4.2. Agent Forwarding Channels . . . . . . . . . . . . . . . . . 10 5. Vendor-Specific Extensions . . . . . . . . . . . . . . . . . . . 10 6. Security Considerations . . . . . . . . . . . . . . . . . . . . 11 7. Intellectual Property . . . . . . . . . . . . . . . . . . . . . 12 8. Additional Information . . . . . . . . . . . . . . . . . . . . . 12 9. Changes from previous versions . . . . . . . . . . . . . . . . . 12 9.1. Changes between versions 3 and 2 . . . . . . . . . . . . . . 12 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 12 11. Address of Authors . . . . . . . . . . . . . . . . . . . . . . 13 1. Authentication Agent Protocol The authentication agent is a piece of software that runs in a user's local workstation, laptop, or other trusted device. It is used to implement single sign-on. It holds the user's private keys in its own storage, and can perform requested operations using the private key. It allows the keys to be kept on a smartcard or other special hardware that can perform cryptographic operations. The authentication agent protocol is used to communicate between the authentication agent and clients wanting to authenticate something or wanting to perform private key operations. The actual communication between the client and the agent happens using a machine-dependent trusted communications channel. This channel would typically be a local socket, named pipe, or some kind of secure messaging system that works inside the local machine. The protocol works by the client sending requests to the agent, and the agent responding to these requests. Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 2] INTERNET-DRAFT 30 January, 2004 1.1. Packet Format All messages passed to/from the authentication agent have the following format: uint32 length byte type data[length -1] data payload The following packet types are currently defined: /* Messages sent by the client. */ #define SSH_AGENT_REQUEST_VERSION 1 #define SSH_AGENT_ADD_KEY 202 #define SSH_AGENT_DELETE_ALL_KEYS 203 #define SSH_AGENT_LIST_KEYS 204 #define SSH_AGENT_PRIVATE_KEY_OP 205 #define SSH_AGENT_FORWARDING_NOTICE 206 #define SSH_AGENT_DELETE_KEY 207 #define SSH_AGENT_LOCK 208 #define SSH_AGENT_UNLOCK 209 #define SSH_AGENT_PING 212 #define SSH_AGENT_RANDOM 213 #define SSH_AGENT_EXTENSION 301 /* Messages sent by the agent. */ #define SSH_AGENT_SUCCESS 101 #define SSH_AGENT_FAILURE 102 #define SSH_AGENT_VERSION_RESPONSE 103 #define SSH_AGENT_KEY_LIST 104 #define SSH_AGENT_OPERATION_COMPLETE 105 #define SSH_AGENT_RANDOM_DATA 106 #define SSH_AGENT_ALIVE 150 1.2. Forwarding Notices If the agent connection is forwarded through intermediate hosts (using the SSH Connection Protocol agent forwarding feature (described in Section ``Agent Forwarding With Secure Shell'' of this document), or some other means), each intermediate node (Secure Shell client) should insert the following message into the agent channel before forwarding any other messages. The real agent will then receive these messages in sequence the nearest node first, and can determine whether the connection is from a local machine and if not, can log the path where the connection came from. These messages must be wrapped in the appropriate header. byte SSH_AGENT_FORWARDING_NOTICE string remote host name (as typed by the user, preferably) string remote host ip uint32 remote host port Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 3] INTERNET-DRAFT 30 January, 2004 1.3. Requesting Version Number When the client opens a connection, it must send the following message to the server. This must be the first message sent. The real agent will receive this after zero or more forwarding notice messages. byte SSH_AGENT_REQUEST_VERSION string version string of the application sending the request (optional) If the agent follows this protocol, it will respond with byte SSH_AGENT_VERSION_RESPONSE uint32 version number, 3 for this protocol If the version number request is ever sent to the Secure Shell 1.x agent, it will interpret it as a request to list identities. It will then respond with a message whose first byte is 2. This can be used to determine the version of the agent if compatibility with Secure Shell 1.x is desired. If the version string query arrives without trailing string identifying the client software version, it can be translated list identities request sent by Secure Shell 1.x and handled accordingly. If agent software does not support the agent protocol of Secure Shell 1.x, it MAY also interpret this query as valid SSH_AGENT_REQUEST_VERSION packet. The extension data in the SSH_AGENT_VERSION_RESPONSE may be empty, or may be a sequence of string extension_name string extension_data pairs (both strings MUST always be present if one is, but the `exten- sion_data' string may be of zero length). If present, these strings indicate extensions to the baseline protocol. The `extension_name' field(s) identify the name of the extension. The name should be of the form "name@domain", where the domain is the DNS domain name of the orga- nization defining the extension. Additional names that are not of this format may be defined later by the IETF. Implementations MUST silently ignore any extensions whose name they do not recognize. 1.4. Adding Keys to the Agent The client can add a new private key to the agent with the following message. Using this message over the net has security implications, and the implementation SHOULD warn the user before decryption or sending the private key. (XXX how does ssh-add detect this condition?) byte SSH_AGENT_ADD_KEY string private key encoding string private key blob Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 4] INTERNET-DRAFT 30 January, 2004 string public key encoding string public key and/or certificates for it string description of the key ... 0, 1 or several constraints follow 1.4.1. Key types Key blobs are preceeded by the encoding field, which defines how the blob should be interpreted. Defined values for public key encoding are "ssh-dss" and "ssh-rsa". Additional key types may be defined as specified in [SECSH-ARCH], under Section IANA Considerations (Section 8). "ssh-dss" and "ssh-rsa" public key format encodings are defined in [SECSH-TRANS]. The "ssh-dss" private key format has the following specific encoding: string "ssh-dss" mpint p mpint q mpint g mpint y mpint x The "ssh-rsa" private key format has the following specific encoding: string "ssh-rsa" mpint e mpint d mpint n mpint u mpint p mpint q XXX Additional key-types (for private keys), for example "ssh-rsa- encrypted"? 1.4.2. Forwarding constraints All constraints are pairs of following format: byte SSH_AGENT_CONSTRAINT_* variable argument for the constraint The type of the argument is dependent on the constraint type. Following constraint types are currently defined: /* Constraints 50-99 have a uint32 argument */ /* Argument is uint32 defining key expiration time-out in seconds. After this timeout expires, the key can't be used. 0 == no timeout */ Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 5] INTERNET-DRAFT 30 January, 2004 #define SSH_AGENT_CONSTRAINT_TIMEOUT 50 /* Argument is uint32 defining the number of operations that can be performed with this key. 0xffffffff == no limit */ #define SSH_AGENT_CONSTRAINT_USE_LIMIT 51 /* Argument is uint32 defining the number of forwarding steps that this key can be forwarded. 0xffffffff == no limit */ #define SSH_AGENT_CONSTRAINT_FORWARDING_STEPS 52 /* Constraints 100-149 have a string argument */ /* Argument is string defining the allowed forwarding steps for this key. XXX define this. */ #define SSH_AGENT_CONSTRAINT_FORWARDING_PATH 100 /* Constraints 150-199 have a boolean argument */ /* Argument is a boolean telling whether the key can be used in Secure Shell 1.x compatibility operations. */ #define SSH_AGENT_CONSTRAINT_SSH1_COMPAT 150 /* Argument is a boolean telling whether operations performed with this key should be confirmed interactively by the user or not. */ #define SSH_AGENT_CONSTRAINT_NEED_USER_VERIFICATION 151 Message can contain zero, one or multiple constraints. If the operation is successful, the agent will respond with the following message. byte SSH_AGENT_SUCCESS If the operation fails for some reason, the following message will be returned instead. byte SSH_AGENT_FAILURE uint32 error code string additional textual information (ISO-10646 UTF-8 [RFC-2279]) string language tag (as defined in [RFC-1766]) The last two fields are optional; they don't need to be present in SSH_AGENT_FAILURE message. However, both MUST be provided if they are to be used. If client is version 2, the agent SHOULD NOT use these fields. The error code is one of the following: #define SSH_AGENT_ERROR_TIMEOUT 1 #define SSH_AGENT_ERROR_KEY_NOT_FOUND 2 #define SSH_AGENT_ERROR_DECRYPT_FAILED 3 Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 6] INTERNET-DRAFT 30 January, 2004 #define SSH_AGENT_ERROR_SIZE_ERROR 4 #define SSH_AGENT_ERROR_KEY_NOT_SUITABLE 5 #define SSH_AGENT_ERROR_DENIED 6 #define SSH_AGENT_ERROR_FAILURE 7 #define SSH_AGENT_ERROR_UNSUPPORTED_OP 8 1.5. Deleting Keys from the Agent All keys that are in possession of the agent can be deleted with the following message. (The client is allowed to ignore this for some keys if desired.) byte SSH_AGENT_DELETE_ALL_KEYS The agent responds with either SSH_AGENT_SUCCESS or SSH_AGENT_FAILURE. 1.6. Deleting specific key from the Agent The client can delete a specific key with given public key with following message. byte SSH_AGENT_DELETE_KEY string public key and/or certificates for it string description of the key The agent responds with either SSH_AGENT_SUCCESS or SSH_AGENT_FAILURE. 1.7. Listing the Keys that the Agent Can Use The following message requests a list of all keys that the agent can use. byte SSH_AGENT_LIST_KEYS The agent will respond with the following message. byte SSH_AGENT_KEY_LIST uint32 number_of_keys repeats number_of_keys times: string public key blob or certificates string description 2. Performing Private Key Operations The real purpose of the agent is to perform private key operations. Such operations are performed with the following message. byte SSH_AGENT_PRIVATE_KEY_OP string operation name string key or certificates, as returned in SSH_AGENT_KEY_LIST ... operation-specific data follows The operation to be performed is identified by a name (string). Custom Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 7] INTERNET-DRAFT 30 January, 2004 operations can be added by suffixing the operation name by the fully qualified domain name of the person/organization adding the new operation. When the operation is complete, the agent will respond with either SSH_AGENT_FAILURE or with the following message if the operation is successful: byte SSH_AGENT_OPERATION_COMPLETE string resulting data If an operation is attempted that is not supported by the agent, the agent will respond with SSH_AGENT_FAILURE with error code set to SSH_AGENT_ERROR_UNSUPPORTED_OP. The standard operations are defined below. 2.1. Signing The agent can be used to create a digital signature using a key held by the agent. The operation name is "sign", and data in is a hash (suitable for the key) that is to be signed. This normally performs the raw private key operation, without hashing data first. The resulting data will be a binary representation of the output of the private key operation. The exact details of the operations to be performed depend on the key being used. The operation-specific data has the following format: string data to be signed Alternatively, it is possible to give the actual data to be signed to the agent. This is done using the operation "hash-and-sign". This is otherwise equal, but performs key-dependent hashing before signing. If the requested operation is not legal for the key, SSH_AGENT_FAILURE will be returned with error code set to SSH_AGENT_ERROR_KEY_NOT_SUITABLE. 2.2. Decrypting The agent can be used to decrypt a public key encrypted message with the operation "decrypt". This takes in raw public-key encrypted data, and returns the resulting decrypted data. This may also fail. If the requested operation is not legal for the key, error code is set to SSH_AGENT_ERROR_KEY_NOT_SUITABLE. The operation-specific data has the following format: string data to be decrypted Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 8] INTERNET-DRAFT 30 January, 2004 2.3. Secure Shell Challenge-Response Authentication Performs Secure Shell challenge-response authentication. This operation has the name "ssh1-challenge-response". This operation works by first decrypting the challenge, then computing MD5 of the concatenation of the decrypted challenge and the session id (in this order), and returns the resulting 16 byte hash. The operation- specific data is in the following format: string challenge encrypted using the public key string session id Normally, the length of the challenge before encryption will be 32 bytes and the length of the session id 16 bytes. The length of the encrypted challenge depends on the key and algorithm used. 3. Administrative Messages There are also a number of messages that are only used to administer the agent. These might e.g. be used by a user interface for the agent. The agent should only allow these messages from local connection (i.e., if no forwarding notice messages were received before the version number request). 3.1. Locking and unlocking the agent The agent can be temporarily locked by message: byte SSH_AGENT_LOCK string locking password The agent responds with either SSH_AGENT_SUCCESS or SSH_AGENT_FAILURE. Particularily SSH_AGENT_FAILURE is sent, if agent is already locked. After this message, agent responds to all commands with SSH_AGENT_FAILURE until it receives a following command. byte SSH_AGENT_UNLOCK string locking password The agent responds with either SSH_AGENT_SUCCESS or SSH_AGENT_FAILURE. Particularily SSH_AGENT_FAILURE is sent, if agent is not locked or if the submitted password does not match with one given with SSH_AGENT_LOCK message. 3.2. Miscellaneous Agent Commands byte SSH_AGENT_PING ... arbitrary padding data Any agent or client receiving this message, should respond with byte SSH_AGENT_ALIVE Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 9] INTERNET-DRAFT 30 January, 2004 ... padding data from the SSH_AGENT_PING request where the padding data is identical to the data sent with SSH_AGENT_PING. byte SSH_AGENT_RANDOM uint32 the length of the requested random buffer Client can request random data from the agent by this message. Agent responds either with SSH_AGENT_RANDOM_DATA or SSH_AGENT_FAILURE message. byte SSH_AGENT_RANDOM_DATA string random data This message is a successful response to SSH_AGENT_RANDOM message. Message contains the random string of requested length. 4. Agent Forwarding With Secure Shell The agent connection is typically forwarded over a Secure Shell connection. This requires small additions to the SSH Connection Protocol [SSH-CONN]. 4.1. Requesting Agent Forwarding Agent forwarding may be requested for a session by sending byte SSH_MSG_CHANNEL_REQUEST uint32 recipient channel string "auth-agent-req" boolean want reply This will, on success, create an agent listener to the remote end. 4.2. Agent Forwarding Channels When a connection comes to the forwarded agent listener, a channel is opened to forward the connection to the other side. byte SSH_MSG_CHANNEL_OPEN string "auth-agent" uint32 sender channel uint32 initial window size uint32 maximum packet size Implementations MUST reject these messages unless they have previously requested agent forwarding. Forwarded agent channels are independent of any sessions, and closing a session channel does not in any way imply that forwarded connections should be closed. Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 10] INTERNET-DRAFT 30 January, 2004 5. Vendor-Specific Extensions The SSH_AGENT_EXTENSION request provides a generic extension mechanism for adding vendor-specific commands. The request has the following format: byte SSH_AGENT_EXTENSION string extension_id ... extension-specific data follows ... `extension_id' is a string of the format "name@domain", where domain is an internet domain name of the vendor defining the request. The rest of the request is completely vendor-specific, and servers should only attempt to interpret it if they recognize the `extension_id' name. These messages can be sent to either direction. However, the agent MUST send these messages only as responses to the client's requests. As an implementation note, the agent should use the standard responses if at all possible. If the agent sees an extension message it doesn't understand, it should respond with SSH_AGENT_FAILURE with error SSH_AGENT_ERROR_UNSUPPORTED_OP. 6. Security Considerations The authentication agent is used to control security-sensitive operations, and is used to implement single sign-on. Anyone with access to the authentication agent can perform private key operations with the agent. This is a power equivalent to possession of the private key as long as the connection to the key is maintained. It is not possible to retrieve the key from the agent. It is recommended that agent implementations allow and perform some form of logging and access control. This access control may utilize information about the path through which the connection was received (as collected with SSH_AGENT_FORWARDING_NOTICE messages; however, the path is reliable only up to and including the first unreliable machine.). Implementations should also allow restricting the operations that can be performed with keys - e.g., limiting them to challenge-response only. One should note that a local superuser will be able to obtain access to agents running on the local machine. This cannot be prevented; in most operating systems, a user with sufficient privileges will be able to read the keys from the physical memory. The authentication agent should not be run or forwarded to machine whose integrity is not trusted, as security on such machines might be compromised and might allow an attacker to obtain unauthorized access to the agent. Adding a key with SSH_AGENT_ADD_KEY over the net (especially over the Internet) is generally not recommended, because at present the private Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 11] INTERNET-DRAFT 30 January, 2004 key has to be moved unencrypted. Implementations SHOULD warn the user of the implications. Even moving the key in encrypted form could be considered unwise. 7. Intellectual Property The IETF takes no position regarding the validity or scope of any intellectual property or other rights that might be claimed to pertain to the implementation or use of the technology described in this document or the extent to which any license under such rights might or might not be available; neither does it represent that it has made any effort to identify any such rights. Information on the IETF's procedures with respect to rights in standards-track and standards- related documentation can be found in BCP-11. Copies of claims of rights made available for publication and any assurances of licenses to be made available, or the result of an attempt made to obtain a general license or permission for the use of such proprietary rights by implementers or users of this specification can be obtained from the IETF Secretariat. The IETF has been notified of intellectual property rights claimed in regard to some or all of the specification contained in this document. For more information consult the online list of claimed rights. 8. Additional Information The current document editor is: Sami Lehtinen . Comments on this Internet-Draft should be sent to the IETF SECSH working group, details at: http://ietf.org/html.charters/secsh-charter.html 9. Changes from previous versions 9.1. Changes between versions 3 and 2 o Added error message and language tag to SSH_AGENT_FAILURE. o Added SSH_AGENT_EXTENSION. o Added extension data to SSH_AGENT_VERSION_RESPONSE. o Defined SSH_AGENT_ADD_KEY message better (previous version was underspecified). 10. References Normative: [SECSH-CONNECT] Ylonen, T., et al: "Secure Shell Connection Protocol", Internet-Draft, draft-ietf-secsh-connect-16.txt [SECSH-TRANS] Ylonen, T., et al: "Secure Shell Transport Layer Protocol", Internet-Draft, draft-ietf-secsh-transport-10.txt Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 12] INTERNET-DRAFT 30 January, 2004 [RFC-2279] Yergeau, F: "UTF-8, a transformation format of ISO 10646", January 1998. [RFC-1766] Alvestrand, H: "Tags for the Identification of Languages", March 1995. Informative: 11. Address of Authors Tatu Ylonen SSH Communications Security Corp Fredrikinkatu 42 FIN-00100 HELSINKI Finland E-mail: ylo@ssh.com Timo J. Rinne SSH Communications Security Corp Fredrikinkatu 42 FIN-00100 HELSINKI Finland E-mail: tri@ssh.com Sami Lehtinen SSH Communications Security Corp Fredrikinkatu 42 FIN-00100 HELSINKI Finland E-mail: sjl@ssh.com Tatu Ylonen, Timo J. Rinne and Sami Lehtinen [page 13]