4932 lines
189 KiB
Plaintext
4932 lines
189 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
Network Working Group U. Blumenthal
|
||
Request for Comments: 3414 B. Wijnen
|
||
STD: 62 Lucent Technologies
|
||
Obsoletes: 2574 December 2002
|
||
Category: Standards Track
|
||
|
||
|
||
User-based Security Model (USM) for version 3 of the
|
||
Simple Network Management Protocol (SNMPv3)
|
||
|
||
Status of this Memo
|
||
|
||
This document specifies an Internet standards track protocol for the
|
||
Internet community, and requests discussion and suggestions for
|
||
improvements. Please refer to the current edition of the "Internet
|
||
Official Protocol Standards" (STD 1) for the standardization state
|
||
and status of this protocol. Distribution of this memo is unlimited.
|
||
|
||
Copyright Notice
|
||
|
||
Copyright (C) The Internet Society (2002). All Rights Reserved.
|
||
|
||
Abstract
|
||
|
||
This document describes the User-based Security Model (USM) for
|
||
Simple Network Management Protocol (SNMP) version 3 for use in the
|
||
SNMP architecture. It defines the Elements of Procedure for
|
||
providing SNMP message level security. This document also includes a
|
||
Management Information Base (MIB) for remotely monitoring/managing
|
||
the configuration parameters for this Security Model. This document
|
||
obsoletes RFC 2574.
|
||
|
||
Table of Contents
|
||
|
||
1. Introduction.......................................... 4
|
||
1.1. Threats............................................... 4
|
||
1.2. Goals and Constraints................................. 6
|
||
1.3. Security Services..................................... 6
|
||
1.4. Module Organization................................... 7
|
||
1.4.1. Timeliness Module..................................... 8
|
||
1.4.2. Authentication Protocol............................... 8
|
||
1.4.3. Privacy Protocol...................................... 8
|
||
1.5. Protection against Message Replay, Delay
|
||
and Redirection....................................... 9
|
||
1.5.1. Authoritative SNMP engine............................. 9
|
||
1.5.2. Mechanisms............................................ 9
|
||
1.6. Abstract Service Interfaces........................... 11
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 1]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
1.6.1. User-based Security Model Primitives
|
||
for Authentication.................................... 11
|
||
1.6.2. User-based Security Model Primitives
|
||
for Privacy........................................... 12
|
||
2. Elements of the Model................................. 12
|
||
2.1. User-based Security Model Users....................... 12
|
||
2.2. Replay Protection..................................... 13
|
||
2.2.1. msgAuthoritativeEngineID.............................. 14
|
||
2.2.2. msgAuthoritativeEngineBoots and
|
||
msgAuthoritativeEngineTime............................ 14
|
||
2.2.3. Time Window........................................... 15
|
||
2.3. Time Synchronization.................................. 15
|
||
2.4. SNMP Messages Using this Security Model............... 16
|
||
2.5. Services provided by the User-based Security Model.... 17
|
||
2.5.1. Services for Generating an Outgoing SNMP Message...... 17
|
||
2.5.2. Services for Processing an Incoming SNMP Message...... 20
|
||
2.6. Key Localization Algorithm............................ 22
|
||
3. Elements of Procedure................................. 22
|
||
3.1. Generating an Outgoing SNMP Message................... 22
|
||
3.2. Processing an Incoming SNMP Message................... 26
|
||
4. Discovery............................................. 31
|
||
5. Definitions........................................... 32
|
||
6. HMAC-MD5-96 Authentication Protocol................... 51
|
||
6.1. Mechanisms............................................ 51
|
||
6.1.1. Digest Authentication Mechanism....................... 51
|
||
6.2. Elements of the Digest Authentication Protocol........ 52
|
||
6.2.1. Users................................................. 52
|
||
6.2.2. msgAuthoritativeEngineID.............................. 53
|
||
6.2.3. SNMP Messages Using this Authentication Protocol...... 53
|
||
6.2.4. Services provided by the HMAC-MD5-96
|
||
Authentication Module................................. 53
|
||
6.2.4.1. Services for Generating an Outgoing SNMP Message...... 53
|
||
6.2.4.2. Services for Processing an Incoming SNMP Message...... 54
|
||
6.3. Elements of Procedure................................. 55
|
||
6.3.1. Processing an Outgoing Message........................ 55
|
||
6.3.2. Processing an Incoming Message........................ 56
|
||
7. HMAC-SHA-96 Authentication Protocol................... 57
|
||
7.1. Mechanisms............................................ 57
|
||
7.1.1. Digest Authentication Mechanism....................... 57
|
||
7.2. Elements of the HMAC-SHA-96 Authentication Protocol... 58
|
||
7.2.1. Users................................................. 58
|
||
7.2.2. msgAuthoritativeEngineID.............................. 58
|
||
7.2.3. SNMP Messages Using this Authentication Protocol...... 59
|
||
7.2.4. Services provided by the HMAC-SHA-96
|
||
Authentication Module................................. 59
|
||
7.2.4.1. Services for Generating an Outgoing SNMP Message...... 59
|
||
7.2.4.2. Services for Processing an Incoming SNMP Message...... 60
|
||
7.3. Elements of Procedure................................. 61
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 2]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
7.3.1. Processing an Outgoing Message........................ 61
|
||
7.3.2. Processing an Incoming Message........................ 61
|
||
8. CBC-DES Symmetric Encryption Protocol................. 63
|
||
8.1. Mechanisms............................................ 63
|
||
8.1.1. Symmetric Encryption Protocol......................... 63
|
||
8.1.1.1. DES key and Initialization Vector..................... 64
|
||
8.1.1.2. Data Encryption....................................... 65
|
||
8.1.1.3. Data Decryption....................................... 65
|
||
8.2. Elements of the DES Privacy Protocol.................. 65
|
||
8.2.1. Users................................................. 65
|
||
8.2.2. msgAuthoritativeEngineID.............................. 66
|
||
8.2.3. SNMP Messages Using this Privacy Protocol............. 66
|
||
8.2.4. Services provided by the DES Privacy Module........... 66
|
||
8.2.4.1. Services for Encrypting Outgoing Data................. 66
|
||
8.2.4.2. Services for Decrypting Incoming Data................. 67
|
||
8.3. Elements of Procedure................................. 68
|
||
8.3.1. Processing an Outgoing Message........................ 68
|
||
8.3.2. Processing an Incoming Message........................ 69
|
||
9. Intellectual Property................................. 69
|
||
10. Acknowledgements...................................... 70
|
||
11. Security Considerations............................... 71
|
||
11.1. Recommended Practices................................. 71
|
||
11.2. Defining Users........................................ 73
|
||
11.3. Conformance........................................... 74
|
||
11.4. Use of Reports........................................ 75
|
||
11.5. Access to the SNMP-USER-BASED-SM-MIB.................. 75
|
||
12. References............................................ 75
|
||
A.1. SNMP engine Installation Parameters................... 78
|
||
A.2. Password to Key Algorithm............................. 80
|
||
A.2.1. Password to Key Sample Code for MD5................... 81
|
||
A.2.2. Password to Key Sample Code for SHA................... 82
|
||
A.3. Password to Key Sample Results........................ 83
|
||
A.3.1. Password to Key Sample Results using MD5.............. 83
|
||
A.3.2. Password to Key Sample Results using SHA.............. 83
|
||
A.4. Sample encoding of msgSecurityParameters.............. 83
|
||
A.5. Sample keyChange Results.............................. 84
|
||
A.5.1. Sample keyChange Results using MD5.................... 84
|
||
A.5.2. Sample keyChange Results using SHA.................... 85
|
||
B. Change Log............................................ 86
|
||
Editors' Addresses.................................... 87
|
||
Full Copyright Statement.............................. 88
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 3]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
1. Introduction
|
||
|
||
The Architecture for describing Internet Management Frameworks
|
||
[RFC3411] describes that an SNMP engine is composed of:
|
||
|
||
1) a Dispatcher,
|
||
2) a Message Processing Subsystem,
|
||
3) a Security Subsystem, and
|
||
4) an Access Control Subsystem.
|
||
|
||
Applications make use of the services of these subsystems.
|
||
|
||
It is important to understand the SNMP architecture and the
|
||
terminology of the architecture to understand where the Security
|
||
Model described in this document fits into the architecture and
|
||
interacts with other subsystems within the architecture. The reader
|
||
is expected to have read and understood the description of the SNMP
|
||
architecture, as defined in [RFC3411].
|
||
|
||
This memo describes the User-based Security Model as it is used
|
||
within the SNMP Architecture. The main idea is that we use the
|
||
traditional concept of a user (identified by a userName) with which
|
||
to associate security information.
|
||
|
||
This memo describes the use of HMAC-MD5-96 and HMAC-SHA-96 as the
|
||
authentication protocols and the use of CBC-DES as the privacy
|
||
protocol. The User-based Security Model however allows for other
|
||
such protocols to be used instead of or concurrent with these
|
||
protocols. Therefore, the description of HMAC-MD5-96, HMAC-SHA-96
|
||
and CBC-DES are in separate sections to reflect their self-contained
|
||
nature and to indicate that they can be replaced or supplemented in
|
||
the future.
|
||
|
||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
|
||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
|
||
document are to be interpreted as described in [RFC2119].
|
||
|
||
1.1. Threats
|
||
|
||
Several of the classical threats to network protocols are applicable
|
||
to the network management problem and therefore would be applicable
|
||
to any SNMP Security Model. Other threats are not applicable to the
|
||
network management problem. This section discusses principal
|
||
threats, secondary threats, and threats which are of lesser
|
||
importance.
|
||
|
||
The principal threats against which this SNMP Security Model should
|
||
provide protection are:
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 4]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
- Modification of Information The modification threat is the danger
|
||
that some unauthorized entity may alter in-transit SNMP messages
|
||
generated on behalf of an authorized principal in such a way as to
|
||
effect unauthorized management operations, including falsifying the
|
||
value of an object.
|
||
|
||
- Masquerade The masquerade threat is the danger that management
|
||
operations not authorized for some user may be attempted by
|
||
assuming the identity of another user that has the appropriate
|
||
authorizations.
|
||
|
||
Two secondary threats are also identified. The Security Model
|
||
defined in this memo provides limited protection against:
|
||
|
||
- Disclosure The disclosure threat is the danger of eavesdropping on
|
||
the exchanges between managed agents and a management station.
|
||
Protecting against this threat may be required as a matter of local
|
||
policy.
|
||
|
||
- Message Stream Modification The SNMP protocol is typically based
|
||
upon a connection-less transport service which may operate over any
|
||
sub-network service. The re-ordering, delay or replay of messages
|
||
can and does occur through the natural operation of many such sub-
|
||
network services. The message stream modification threat is the
|
||
danger that messages may be maliciously re-ordered, delayed or
|
||
replayed to an extent which is greater than can occur through the
|
||
natural operation of a sub-network service, in order to effect
|
||
unauthorized management operations.
|
||
|
||
There are at least two threats that an SNMP Security Model need not
|
||
protect against. The security protocols defined in this memo do not
|
||
provide protection against:
|
||
|
||
- Denial of Service This SNMP Security Model does not attempt to
|
||
address the broad range of attacks by which service on behalf of
|
||
authorized users is denied. Indeed, such denial-of-service attacks
|
||
are in many cases indistinguishable from the type of network
|
||
failures with which any viable network management protocol must
|
||
cope as a matter of course.
|
||
|
||
- Traffic Analysis This SNMP Security Model does not attempt to
|
||
address traffic analysis attacks. Indeed, many traffic patterns
|
||
are predictable - devices may be managed on a regular basis by a
|
||
relatively small number of management applications - and therefore
|
||
there is no significant advantage afforded by protecting against
|
||
traffic analysis.
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 5]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
1.2. Goals and Constraints
|
||
|
||
Based on the foregoing account of threats in the SNMP network
|
||
management environment, the goals of this SNMP Security Model are as
|
||
follows.
|
||
|
||
1) Provide for verification that each received SNMP message has not
|
||
been modified during its transmission through the network.
|
||
|
||
2) Provide for verification of the identity of the user on whose
|
||
behalf a received SNMP message claims to have been generated.
|
||
|
||
3) Provide for detection of received SNMP messages, which request or
|
||
contain management information, whose time of generation was not
|
||
recent.
|
||
|
||
4) Provide, when necessary, that the contents of each received SNMP
|
||
message are protected from disclosure.
|
||
|
||
In addition to the principal goal of supporting secure network
|
||
management, the design of this SNMP Security Model is also influenced
|
||
by the following constraints:
|
||
|
||
1) When the requirements of effective management in times of network
|
||
stress are inconsistent with those of security, the design of USM
|
||
has given preference to the former.
|
||
|
||
2) Neither the security protocol nor its underlying security
|
||
mechanisms should depend upon the ready availability of other
|
||
network services (e.g., Network Time Protocol (NTP) or key
|
||
management protocols).
|
||
|
||
3) A security mechanism should entail no changes to the basic SNMP
|
||
network management philosophy.
|
||
|
||
1.3. Security Services
|
||
|
||
The security services necessary to support the goals of this SNMP
|
||
Security Model are as follows:
|
||
|
||
- Data Integrity is the provision of the property that data has not
|
||
been altered or destroyed in an unauthorized manner, nor have data
|
||
sequences been altered to an extent greater than can occur non-
|
||
maliciously.
|
||
|
||
- Data Origin Authentication is the provision of the property that
|
||
the claimed identity of the user on whose behalf received data was
|
||
originated is corroborated.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 6]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
- Data Confidentiality is the provision of the property that
|
||
information is not made available or disclosed to unauthorized
|
||
individuals, entities, or processes.
|
||
|
||
- Message timeliness and limited replay protection is the provision
|
||
of the property that a message whose generation time is outside of
|
||
a specified time window is not accepted. Note that message
|
||
reordering is not dealt with and can occur in normal conditions
|
||
too.
|
||
|
||
For the protocols specified in this memo, it is not possible to
|
||
assure the specific originator of a received SNMP message; rather, it
|
||
is the user on whose behalf the message was originated that is
|
||
authenticated.
|
||
|
||
For these protocols, it not possible to obtain data integrity without
|
||
data origin authentication, nor is it possible to obtain data origin
|
||
authentication without data integrity. Further, there is no
|
||
provision for data confidentiality without both data integrity and
|
||
data origin authentication.
|
||
|
||
The security protocols used in this memo are considered acceptably
|
||
secure at the time of writing. However, the procedures allow for new
|
||
authentication and privacy methods to be specified at a future time
|
||
if the need arises.
|
||
|
||
1.4. Module Organization
|
||
|
||
The security protocols defined in this memo are split in three
|
||
different modules and each has its specific responsibilities such
|
||
that together they realize the goals and security services described
|
||
above:
|
||
|
||
- The authentication module MUST provide for:
|
||
|
||
- Data Integrity,
|
||
|
||
- Data Origin Authentication,
|
||
|
||
- The timeliness module MUST provide for:
|
||
|
||
- Protection against message delay or replay (to an extent greater
|
||
than can occur through normal operation).
|
||
|
||
- The privacy module MUST provide for
|
||
|
||
- Protection against disclosure of the message payload.
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 7]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
The timeliness module is fixed for the User-based Security Model
|
||
while there is provision for multiple authentication and/or privacy
|
||
modules, each of which implements a specific authentication or
|
||
privacy protocol respectively.
|
||
|
||
1.4.1. Timeliness Module
|
||
|
||
Section 3 (Elements of Procedure) uses the timeliness values in an
|
||
SNMP message to do timeliness checking. The timeliness check is only
|
||
performed if authentication is applied to the message. Since the
|
||
complete message is checked for integrity, we can assume that the
|
||
timeliness values in a message that passes the authentication module
|
||
are trustworthy.
|
||
|
||
1.4.2. Authentication Protocol
|
||
|
||
Section 6 describes the HMAC-MD5-96 authentication protocol which is
|
||
the first authentication protocol that MUST be supported with the
|
||
User-based Security Model. Section 7 describes the HMAC-SHA-96
|
||
authentication protocol which is another authentication protocol that
|
||
SHOULD be supported with the User-based Security Model. In the
|
||
future additional or replacement authentication protocols may be
|
||
defined as new needs arise.
|
||
|
||
The User-based Security Model prescribes that, if authentication is
|
||
used, then the complete message is checked for integrity in the
|
||
authentication module.
|
||
|
||
For a message to be authenticated, it needs to pass authentication
|
||
check by the authentication module and the timeliness check which is
|
||
a fixed part of this User-based Security model.
|
||
|
||
1.4.3. Privacy Protocol
|
||
|
||
Section 8 describes the CBC-DES Symmetric Encryption Protocol which
|
||
is the first privacy protocol to be used with the User-based Security
|
||
Model. In the future additional or replacement privacy protocols may
|
||
be defined as new needs arise.
|
||
|
||
The User-based Security Model prescribes that the scopedPDU is
|
||
protected from disclosure when a message is sent with privacy.
|
||
|
||
The User-based Security Model also prescribes that a message needs to
|
||
be authenticated if privacy is in use.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 8]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
1.5. Protection against Message Replay, Delay and Redirection
|
||
|
||
1.5.1. Authoritative SNMP Engine
|
||
|
||
In order to protect against message replay, delay and redirection,
|
||
one of the SNMP engines involved in each communication is designated
|
||
to be the authoritative SNMP engine. When an SNMP message contains a
|
||
payload which expects a response (those messages that contain a
|
||
Confirmed Class PDU [RFC3411]), then the receiver of such messages is
|
||
authoritative. When an SNMP message contains a payload which does
|
||
not expect a response (those messages that contain an Unconfirmed
|
||
Class PDU [RFC3411]), then the sender of such a message is
|
||
authoritative.
|
||
|
||
1.5.2. Mechanisms
|
||
|
||
The following mechanisms are used:
|
||
|
||
1) To protect against the threat of message delay or replay (to an
|
||
extent greater than can occur through normal operation), a set of
|
||
timeliness indicators (for the authoritative SNMP engine) are
|
||
included in each message generated. An SNMP engine evaluates the
|
||
timeliness indicators to determine if a received message is
|
||
recent. An SNMP engine may evaluate the timeliness indicators to
|
||
ensure that a received message is at least as recent as the last
|
||
message it received from the same source. A non-authoritative
|
||
SNMP engine uses received authentic messages to advance its notion
|
||
of the timeliness indicators at the remote authoritative source.
|
||
|
||
An SNMP engine MUST also use a mechanism to match incoming
|
||
Responses to outstanding Requests and it MUST drop any Responses
|
||
that do not match an outstanding request. For example, a msgID
|
||
can be inserted in every message to cater for this functionality.
|
||
|
||
These mechanisms provide for the detection of authenticated
|
||
messages whose time of generation was not recent.
|
||
|
||
This protection against the threat of message delay or replay does
|
||
not imply nor provide any protection against unauthorized deletion
|
||
or suppression of messages. Also, an SNMP engine may not be able
|
||
to detect message reordering if all the messages involved are sent
|
||
within the Time Window interval. Other mechanisms defined
|
||
independently of the security protocol can also be used to detect
|
||
the re-ordering replay, deletion, or suppression of messages
|
||
containing Set operations (e.g., the MIB variable snmpSetSerialNo
|
||
[RFC3418]).
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 9]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
2) Verification that a message sent to/from one authoritative SNMP
|
||
engine cannot be replayed to/as-if-from another authoritative SNMP
|
||
engine.
|
||
|
||
Included in each message is an identifier unique to the
|
||
authoritative SNMP engine associated with the sender or intended
|
||
recipient of the message.
|
||
|
||
A message containing an Unconfirmed Class PDU sent by an
|
||
authoritative SNMP engine to one non-authoritative SNMP engine can
|
||
potentially be replayed to another non-authoritative SNMP engine.
|
||
The latter non-authoritative SNMP engine might (if it knows about
|
||
the same userName with the same secrets at the authoritative SNMP
|
||
engine) as a result update its notion of timeliness indicators of
|
||
the authoritative SNMP engine, but that is not considered a
|
||
threat. In this case, A Report or Response message will be
|
||
discarded by the Message Processing Model, because there should
|
||
not be an outstanding Request message. A Trap will possibly be
|
||
accepted. Again, that is not considered a threat, because the
|
||
communication was authenticated and timely. It is as if the
|
||
authoritative SNMP engine was configured to start sending Traps to
|
||
the second SNMP engine, which theoretically can happen without the
|
||
knowledge of the second SNMP engine anyway. Anyway, the second
|
||
SNMP engine may not expect to receive this Trap, but is allowed to
|
||
see the management information contained in it.
|
||
|
||
3) Detection of messages which were not recently generated.
|
||
|
||
A set of time indicators are included in the message, indicating
|
||
the time of generation. Messages without recent time indicators
|
||
are not considered authentic. In addition, an SNMP engine MUST
|
||
drop any Responses that do not match an outstanding request. This
|
||
however is the responsibility of the Message Processing Model.
|
||
|
||
This memo allows the same user to be defined on multiple SNMP
|
||
engines. Each SNMP engine maintains a value, snmpEngineID, which
|
||
uniquely identifies the SNMP engine. This value is included in each
|
||
message sent to/from the SNMP engine that is authoritative (see
|
||
section 1.5.1). On receipt of a message, an authoritative SNMP
|
||
engine checks the value to ensure that it is the intended recipient,
|
||
and a non-authoritative SNMP engine uses the value to ensure that the
|
||
message is processed using the correct state information.
|
||
|
||
Each SNMP engine maintains two values, snmpEngineBoots and
|
||
snmpEngineTime, which taken together provide an indication of time at
|
||
that SNMP engine. Both of these values are included in an
|
||
authenticated message sent to/received from that SNMP engine. On
|
||
receipt, the values are checked to ensure that the indicated
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 10]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
timeliness value is within a Time Window of the current time. The
|
||
Time Window represents an administrative upper bound on acceptable
|
||
delivery delay for protocol messages.
|
||
|
||
For an SNMP engine to generate a message which an authoritative SNMP
|
||
engine will accept as authentic, and to verify that a message
|
||
received from that authoritative SNMP engine is authentic, such an
|
||
SNMP engine must first achieve timeliness synchronization with the
|
||
authoritative SNMP engine. See section 2.3.
|
||
|
||
1.6. Abstract Service Interfaces
|
||
|
||
Abstract service interfaces have been defined to describe the
|
||
conceptual interfaces between the various subsystems within an SNMP
|
||
entity. Similarly a set of abstract service interfaces have been
|
||
defined within the User-based Security Model (USM) to describe the
|
||
conceptual interfaces between the generic USM services and the
|
||
self-contained authentication and privacy services.
|
||
|
||
These abstract service interfaces are defined by a set of primitives
|
||
that define the services provided and the abstract data elements that
|
||
must be passed when the services are invoked. This section lists the
|
||
primitives that have been defined for the User-based Security Model.
|
||
|
||
1.6.1. User-based Security Model Primitives for Authentication
|
||
|
||
The User-based Security Model provides the following internal
|
||
primitives to pass data back and forth between the Security Model
|
||
itself and the authentication service:
|
||
|
||
statusInformation =
|
||
authenticateOutgoingMsg(
|
||
IN authKey -- secret key for authentication
|
||
IN wholeMsg -- unauthenticated complete message
|
||
OUT authenticatedWholeMsg -- complete authenticated message
|
||
)
|
||
|
||
statusInformation =
|
||
authenticateIncomingMsg(
|
||
IN authKey -- secret key for authentication
|
||
IN authParameters -- as received on the wire
|
||
IN wholeMsg -- as received on the wire
|
||
OUT authenticatedWholeMsg -- complete authenticated message
|
||
)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 11]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
1.6.2. User-based Security Model Primitives for Privacy
|
||
|
||
The User-based Security Model provides the following internal
|
||
primitives to pass data back and forth between the Security Model
|
||
itself and the privacy service:
|
||
|
||
statusInformation =
|
||
encryptData(
|
||
IN encryptKey -- secret key for encryption
|
||
IN dataToEncrypt -- data to encrypt (scopedPDU)
|
||
OUT encryptedData -- encrypted data (encryptedPDU)
|
||
OUT privParameters -- filled in by service provider
|
||
)
|
||
|
||
statusInformation =
|
||
decryptData(
|
||
IN decryptKey -- secret key for decrypting
|
||
IN privParameters -- as received on the wire
|
||
IN encryptedData -- encrypted data (encryptedPDU)
|
||
OUT decryptedData -- decrypted data (scopedPDU)
|
||
)
|
||
|
||
2. Elements of the Model
|
||
|
||
This section contains definitions required to realize the security
|
||
model defined by this memo.
|
||
|
||
2.1. User-based Security Model Users
|
||
|
||
Management operations using this Security Model make use of a defined
|
||
set of user identities. For any user on whose behalf management
|
||
operations are authorized at a particular SNMP engine, that SNMP
|
||
engine must have knowledge of that user. An SNMP engine that wishes
|
||
to communicate with another SNMP engine must also have knowledge of a
|
||
user known to that engine, including knowledge of the applicable
|
||
attributes of that user.
|
||
|
||
A user and its attributes are defined as follows:
|
||
|
||
userName
|
||
A string representing the name of the user.
|
||
|
||
securityName
|
||
A human-readable string representing the user in a format that is
|
||
Security Model independent. There is a one-to-one relationship
|
||
between userName and securityName.
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 12]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
authProtocol
|
||
An indication of whether messages sent on behalf of this user can
|
||
be authenticated, and if so, the type of authentication protocol
|
||
which is used. Two such protocols are defined in this memo:
|
||
|
||
- the HMAC-MD5-96 authentication protocol.
|
||
- the HMAC-SHA-96 authentication protocol.
|
||
|
||
authKey
|
||
If messages sent on behalf of this user can be authenticated, the
|
||
(private) authentication key for use with the authentication
|
||
protocol. Note that a user's authentication key will normally be
|
||
different at different authoritative SNMP engines. The authKey is
|
||
not accessible via SNMP. The length requirements of the authKey
|
||
are defined by the authProtocol in use.
|
||
|
||
authKeyChange and authOwnKeyChange
|
||
The only way to remotely update the authentication key. Does that
|
||
in a secure manner, so that the update can be completed without
|
||
the need to employ privacy protection.
|
||
|
||
privProtocol
|
||
An indication of whether messages sent on behalf of this user can
|
||
be protected from disclosure, and if so, the type of privacy
|
||
protocol which is used. One such protocol is defined in this
|
||
memo: the CBC-DES Symmetric Encryption Protocol.
|
||
|
||
privKey
|
||
If messages sent on behalf of this user can be en/decrypted, the
|
||
(private) privacy key for use with the privacy protocol. Note
|
||
that a user's privacy key will normally be different at different
|
||
authoritative SNMP engines. The privKey is not accessible via
|
||
SNMP. The length requirements of the privKey are defined by the
|
||
privProtocol in use.
|
||
|
||
privKeyChange and privOwnKeyChange
|
||
The only way to remotely update the encryption key. Does that in
|
||
a secure manner, so that the update can be completed without the
|
||
need to employ privacy protection.
|
||
|
||
2.2. Replay Protection
|
||
|
||
Each SNMP engine maintains three objects:
|
||
|
||
- snmpEngineID, which (at least within an administrative domain)
|
||
uniquely and unambiguously identifies an SNMP engine.
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 13]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
- snmpEngineBoots, which is a count of the number of times the SNMP
|
||
engine has re-booted/re-initialized since snmpEngineID was last
|
||
configured; and,
|
||
|
||
- snmpEngineTime, which is the number of seconds since the
|
||
snmpEngineBoots counter was last incremented.
|
||
|
||
Each SNMP engine is always authoritative with respect to these
|
||
objects in its own SNMP entity. It is the responsibility of a non-
|
||
authoritative SNMP engine to synchronize with the authoritative SNMP
|
||
engine, as appropriate.
|
||
|
||
An authoritative SNMP engine is required to maintain the values of
|
||
its snmpEngineID and snmpEngineBoots in non-volatile storage.
|
||
|
||
2.2.1. msgAuthoritativeEngineID
|
||
|
||
The msgAuthoritativeEngineID value contained in an authenticated
|
||
message is used to defeat attacks in which messages from one SNMP
|
||
engine to another SNMP engine are replayed to a different SNMP
|
||
engine. It represents the snmpEngineID at the authoritative SNMP
|
||
engine involved in the exchange of the message.
|
||
|
||
When an authoritative SNMP engine is first installed, it sets its
|
||
local value of snmpEngineID according to a enterprise-specific
|
||
algorithm (see the definition of the Textual Convention for
|
||
SnmpEngineID in the SNMP Architecture document [RFC3411]).
|
||
|
||
2.2.2. msgAuthoritativeEngineBoots and msgAuthoritativeEngineTime
|
||
|
||
The msgAuthoritativeEngineBoots and msgAuthoritativeEngineTime values
|
||
contained in an authenticated message are used to defeat attacks in
|
||
which messages are replayed when they are no longer valid. They
|
||
represent the snmpEngineBoots and snmpEngineTime values at the
|
||
authoritative SNMP engine involved in the exchange of the message.
|
||
|
||
Through use of snmpEngineBoots and snmpEngineTime, there is no
|
||
requirement for an SNMP engine to have a non-volatile clock which
|
||
ticks (i.e., increases with the passage of time) even when the
|
||
SNMP engine is powered off. Rather, each time an SNMP engine
|
||
re-boots, it retrieves, increments, and then stores snmpEngineBoots
|
||
in non-volatile storage, and resets snmpEngineTime to zero.
|
||
|
||
When an SNMP engine is first installed, it sets its local values of
|
||
snmpEngineBoots and snmpEngineTime to zero. If snmpEngineTime ever
|
||
reaches its maximum value (2147483647), then snmpEngineBoots is
|
||
incremented as if the SNMP engine has re-booted and snmpEngineTime is
|
||
reset to zero and starts incrementing again.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 14]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
Each time an authoritative SNMP engine re-boots, any SNMP engines
|
||
holding that authoritative SNMP engine's values of snmpEngineBoots
|
||
and snmpEngineTime need to re-synchronize prior to sending correctly
|
||
authenticated messages to that authoritative SNMP engine (see Section
|
||
2.3 for (re-)synchronization procedures). Note, however, that the
|
||
procedures do provide for a notification to be accepted as authentic
|
||
by a receiving SNMP engine, when sent by an authoritative SNMP engine
|
||
which has re-booted since the receiving SNMP engine last (re-
|
||
)synchronized.
|
||
|
||
|
||
If an authoritative SNMP engine is ever unable to determine its
|
||
latest snmpEngineBoots value, then it must set its snmpEngineBoots
|
||
value to 2147483647.
|
||
|
||
Whenever the local value of snmpEngineBoots has the value 2147483647
|
||
it latches at that value and an authenticated message always causes
|
||
an notInTimeWindow authentication failure.
|
||
|
||
In order to reset an SNMP engine whose snmpEngineBoots value has
|
||
reached the value 2147483647, manual intervention is required. The
|
||
engine must be physically visited and re-configured, either with a
|
||
new snmpEngineID value, or with new secret values for the
|
||
authentication and privacy protocols of all users known to that SNMP
|
||
engine. Note that even if an SNMP engine re-boots once a second that
|
||
it would still take approximately 68 years before the max value of
|
||
2147483647 would be reached.
|
||
|
||
2.2.3. Time Window
|
||
|
||
The Time Window is a value that specifies the window of time in which
|
||
a message generated on behalf of any user is valid. This memo
|
||
specifies that the same value of the Time Window, 150 seconds, is
|
||
used for all users.
|
||
|
||
2.3. Time Synchronization
|
||
|
||
Time synchronization, required by a non-authoritative SNMP engine
|
||
in order to proceed with authentic communications, has occurred
|
||
when the non-authoritative SNMP engine has obtained a local notion
|
||
of the authoritative SNMP engine's values of snmpEngineBoots and
|
||
snmpEngineTime from the authoritative SNMP engine. These values
|
||
must be (and remain) within the authoritative SNMP engine's Time
|
||
Window. So the local notion of the authoritative SNMP engine's
|
||
values must be kept loosely synchronized with the values stored
|
||
at the authoritative SNMP engine. In addition to keeping a local
|
||
copy of snmpEngineBoots and snmpEngineTime from the authoritative
|
||
SNMP engine, a non-authoritative SNMP engine must also keep one
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 15]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
local variable, latestReceivedEngineTime. This value records the
|
||
highest value of snmpEngineTime that was received by the
|
||
non-authoritative SNMP engine from the authoritative SNMP engine
|
||
and is used to eliminate the possibility of replaying messages
|
||
that would prevent the non-authoritative SNMP engine's notion of
|
||
the snmpEngineTime from advancing.
|
||
|
||
A non-authoritative SNMP engine must keep local notions of these
|
||
values (snmpEngineBoots, snmpEngineTime and latestReceivedEngineTime)
|
||
for each authoritative SNMP engine with which it wishes to
|
||
communicate. Since each authoritative SNMP engine is uniquely and
|
||
unambiguously identified by its value of snmpEngineID, the
|
||
non-authoritative SNMP engine may use this value as a key in order to
|
||
cache its local notions of these values.
|
||
|
||
Time synchronization occurs as part of the procedures of receiving an
|
||
SNMP message (Section 3.2, step 7b). As such, no explicit time
|
||
synchronization procedure is required by a non-authoritative SNMP
|
||
engine. Note, that whenever the local value of snmpEngineID is
|
||
changed (e.g., through discovery) or when secure communications are
|
||
first established with an authoritative SNMP engine, the local values
|
||
of snmpEngineBoots and latestReceivedEngineTime should be set to
|
||
zero. This will cause the time synchronization to occur when the
|
||
next authentic message is received.
|
||
|
||
2.4. SNMP Messages Using this Security Model
|
||
|
||
The syntax of an SNMP message using this Security Model adheres to
|
||
the message format defined in the version-specific Message Processing
|
||
Model document (for example [RFC3412]).
|
||
|
||
The field msgSecurityParameters in SNMPv3 messages has a data type of
|
||
OCTET STRING. Its value is the BER serialization of the following
|
||
ASN.1 sequence:
|
||
|
||
USMSecurityParametersSyntax DEFINITIONS IMPLICIT TAGS ::= BEGIN
|
||
|
||
UsmSecurityParameters ::=
|
||
SEQUENCE {
|
||
-- global User-based security parameters
|
||
msgAuthoritativeEngineID OCTET STRING,
|
||
msgAuthoritativeEngineBoots INTEGER (0..2147483647),
|
||
msgAuthoritativeEngineTime INTEGER (0..2147483647),
|
||
msgUserName OCTET STRING (SIZE(0..32)),
|
||
-- authentication protocol specific parameters
|
||
msgAuthenticationParameters OCTET STRING,
|
||
-- privacy protocol specific parameters
|
||
msgPrivacyParameters OCTET STRING
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 16]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
}
|
||
END
|
||
|
||
The fields of this sequence are:
|
||
|
||
- The msgAuthoritativeEngineID specifies the snmpEngineID of the
|
||
authoritative SNMP engine involved in the exchange of the message.
|
||
|
||
- The msgAuthoritativeEngineBoots specifies the snmpEngineBoots value
|
||
at the authoritative SNMP engine involved in the exchange of the
|
||
message.
|
||
|
||
- The msgAuthoritativeEngineTime specifies the snmpEngineTime value
|
||
at the authoritative SNMP engine involved in the exchange of the
|
||
message.
|
||
|
||
- The msgUserName specifies the user (principal) on whose behalf the
|
||
message is being exchanged. Note that a zero-length userName will
|
||
not match any user, but it can be used for snmpEngineID discovery.
|
||
|
||
- The msgAuthenticationParameters are defined by the authentication
|
||
protocol in use for the message, as defined by the
|
||
usmUserAuthProtocol column in the user's entry in the usmUserTable.
|
||
|
||
- The msgPrivacyParameters are defined by the privacy protocol in use
|
||
for the message, as defined by the usmUserPrivProtocol column in
|
||
the user's entry in the usmUserTable).
|
||
|
||
See appendix A.4 for an example of the BER encoding of field
|
||
msgSecurityParameters.
|
||
|
||
2.5. Services provided by the User-based Security Model
|
||
|
||
This section describes the services provided by the User-based
|
||
Security Model with their inputs and outputs.
|
||
|
||
The services are described as primitives of an abstract service
|
||
interface and the inputs and outputs are described as abstract data
|
||
elements as they are passed in these abstract service primitives.
|
||
|
||
2.5.1. Services for Generating an Outgoing SNMP Message
|
||
|
||
When the Message Processing (MP) Subsystem invokes the User-based
|
||
Security module to secure an outgoing SNMP message, it must use the
|
||
appropriate service as provided by the Security module. These two
|
||
services are provided:
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 17]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
1) A service to generate a Request message. The abstract service
|
||
primitive is:
|
||
|
||
statusInformation = -- success or errorIndication
|
||
generateRequestMsg(
|
||
IN messageProcessingModel -- typically, SNMP version
|
||
IN globalData -- message header, admin data
|
||
IN maxMessageSize -- of the sending SNMP entity
|
||
IN securityModel -- for the outgoing message
|
||
IN securityEngineID -- authoritative SNMP entity
|
||
IN securityName -- on behalf of this principal
|
||
IN securityLevel -- Level of Security requested
|
||
IN scopedPDU -- message (plaintext) payload
|
||
OUT securityParameters -- filled in by Security Module
|
||
OUT wholeMsg -- complete generated message
|
||
OUT wholeMsgLength -- length of generated message
|
||
)
|
||
|
||
2) A service to generate a Response message. The abstract service
|
||
primitive is:
|
||
|
||
statusInformation = -- success or errorIndication
|
||
generateResponseMsg(
|
||
IN messageProcessingModel -- typically, SNMP version
|
||
IN globalData -- message header, admin data
|
||
IN maxMessageSize -- of the sending SNMP entity
|
||
IN securityModel -- for the outgoing message
|
||
IN securityEngineID -- authoritative SNMP entity
|
||
IN securityName -- on behalf of this principal
|
||
IN securityLevel -- Level of Security requested
|
||
IN scopedPDU -- message (plaintext) payload
|
||
IN securityStateReference -- reference to security state
|
||
-- information from original
|
||
-- request
|
||
OUT securityParameters -- filled in by Security Module
|
||
OUT wholeMsg -- complete generated message
|
||
OUT wholeMsgLength -- length of generated message
|
||
)
|
||
|
||
The abstract data elements passed as parameters in the abstract
|
||
service primitives are as follows:
|
||
|
||
statusInformation
|
||
An indication of whether the encoding and securing of the message
|
||
was successful. If not it is an indication of the problem.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 18]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
messageProcessingModel
|
||
The SNMP version number for the message to be generated. This
|
||
data is not used by the User-based Security module.
|
||
|
||
globalData
|
||
The message header (i.e., its administrative information). This
|
||
data is not used by the User-based Security module.
|
||
|
||
maxMessageSize
|
||
The maximum message size as included in the message. This data is
|
||
not used by the User-based Security module.
|
||
|
||
securityParameters
|
||
These are the security parameters. They will be filled in by the
|
||
User-based Security module.
|
||
|
||
securityModel
|
||
The securityModel in use. Should be User-based Security Model.
|
||
This data is not used by the User-based Security module.
|
||
|
||
securityName
|
||
Together with the snmpEngineID it identifies a row in the
|
||
usmUserTablethat is to be used for securing the message. The
|
||
securityName has a format that is independent of the Security
|
||
Model. In case of a response this parameter is ignored and the
|
||
value from the cache is used.
|
||
|
||
securityLevel
|
||
The Level of Security from which the User-based Security module
|
||
determines if the message needs to be protected from disclosure
|
||
and if the message needs to be authenticated.
|
||
|
||
securityEngineID
|
||
The snmpEngineID of the authoritative SNMP engine to which a
|
||
dateRequest message is to be sent. In case of a response it is
|
||
implied to be the processing SNMP engine's snmpEngineID and so if
|
||
it is specified, then it is ignored.
|
||
|
||
scopedPDU
|
||
The message payload. The data is opaque as far as the User-based
|
||
Security Model is concerned.
|
||
|
||
securityStateReference
|
||
A handle/reference to cachedSecurityData to be used when securing
|
||
an outgoing Response message. This is the exact same
|
||
handle/reference as it was generated by the User-based Security
|
||
module when processing the incoming Request message to which this
|
||
is the Response message.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 19]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
wholeMsg
|
||
The fully encoded and secured message ready for sending on the
|
||
wire.
|
||
|
||
wholeMsgLength
|
||
The length of the encoded and secured message (wholeMsg).
|
||
|
||
Upon completion of the process, the User-based Security module
|
||
returns statusInformation. If the process was successful, the
|
||
completed message with privacy and authentication applied if such was
|
||
requested by the specified securityLevel is returned. If the process
|
||
was not successful, then an errorIndication is returned.
|
||
|
||
2.5.2. Services for Processing an Incoming SNMP Message
|
||
|
||
When the Message Processing (MP) Subsystem invokes the User-based
|
||
Security module to verify proper security of an incoming message, it
|
||
must use the service provided for an incoming message. The abstract
|
||
service primitive is:
|
||
|
||
statusInformation = -- errorIndication or success
|
||
-- error counter OID/value if error
|
||
processIncomingMsg(
|
||
IN messageProcessingModel -- typically, SNMP version
|
||
IN maxMessageSize -- of the sending SNMP entity
|
||
IN securityParameters -- for the received message
|
||
IN securityModel -- for the received message
|
||
IN securityLevel -- Level of Security
|
||
IN wholeMsg -- as received on the wire
|
||
IN wholeMsgLength -- length as received on the wire
|
||
OUT securityEngineID -- authoritative SNMP entity
|
||
OUT securityName -- identification of the principal
|
||
OUT scopedPDU, -- message (plaintext) payload
|
||
OUT maxSizeResponseScopedPDU -- maximum size of the Response PDU
|
||
OUT securityStateReference -- reference to security state
|
||
) -- information, needed for response
|
||
|
||
The abstract data elements passed as parameters in the abstract
|
||
service primitives are as follows:
|
||
|
||
statusInformation
|
||
An indication of whether the process was successful or not. If
|
||
not, then the statusInformation includes the OID and the value of
|
||
the error counter that was incremented.
|
||
|
||
messageProcessingModel
|
||
The SNMP version number as received in the message. This data is
|
||
not used by the User-based Security module.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 20]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
maxMessageSize
|
||
The maximum message size as included in the message. The User-bas
|
||
User-based Security module uses this value to calculate the
|
||
maxSizeResponseScopedPDU.
|
||
|
||
securityParameters
|
||
These are the security parameters as received in the message.
|
||
|
||
securityModel
|
||
The securityModel in use. Should be the User-based Security
|
||
Model. This data is not used by the User-based Security module.
|
||
|
||
securityLevel
|
||
The Level of Security from which the User-based Security module
|
||
determines if the message needs to be protected from disclosure
|
||
and if the message needs to be authenticated.
|
||
|
||
wholeMsg
|
||
The whole message as it was received.
|
||
|
||
wholeMsgLength
|
||
The length of the message as it was received (wholeMsg).
|
||
|
||
securityEngineID
|
||
The snmpEngineID that was extracted from the field
|
||
msgAuthoritativeEngineID and that was used to lookup the secrets
|
||
in the usmUserTable.
|
||
|
||
securityName
|
||
The security name representing the user on whose behalf the
|
||
message was received. The securityName has a format that is
|
||
independent of the Security Model.
|
||
|
||
scopedPDU
|
||
The message payload. The data is opaque as far as the User-based
|
||
Security Model is concerned.
|
||
|
||
maxSizeResponseScopedPDU
|
||
The maximum size of a scopedPDU to be included in a possible
|
||
Response message. The User-based Security module calculates this
|
||
size based on the msgMaxSize (as received in the message) and the
|
||
space required for the message header (including the
|
||
securityParameters) for such a Response message.
|
||
|
||
securityStateReference
|
||
A handle/reference to cachedSecurityData to be used when securing
|
||
an outgoing Response message. When the Message Processing
|
||
Subsystem calls the User-based Security module to generate a
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 21]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
response to this incoming message it must pass this
|
||
handle/reference.
|
||
|
||
Upon completion of the process, the User-based Security module
|
||
returns statusInformation and, if the process was successful, the
|
||
additional data elements for further processing of the message. If
|
||
the process was not successful, then an errorIndication, possibly
|
||
with a OID and value pair of an error counter that was incremented.
|
||
|
||
2.6. Key Localization Algorithm.
|
||
|
||
A localized key is a secret key shared between a user U and one
|
||
authoritative SNMP engine E. Even though a user may have only one
|
||
password and therefore one key for the whole network, the actual
|
||
secrets shared between the user and each authoritative SNMP engine
|
||
will be different. This is achieved by key localization [Localized-
|
||
key].
|
||
|
||
First, if a user uses a password, then the user's password is
|
||
converted into a key Ku using one of the two algorithms described in
|
||
Appendices A.2.1 and A.2.2.
|
||
|
||
To convert key Ku into a localized key Kul of user U at the
|
||
authoritative SNMP engine E, one appends the snmpEngineID of the
|
||
authoritative SNMP engine to the key Ku and then appends the key Ku
|
||
to the result, thus enveloping the snmpEngineID within the two copies
|
||
of user's key Ku. Then one runs a secure hash function (which one
|
||
depends on the authentication protocol defined for this user U at
|
||
authoritative SNMP engine E; this document defines two authentication
|
||
protocols with their associated algorithms based on MD5 and SHA).
|
||
The output of the hash-function is the localized key Kul for user U
|
||
at the authoritative SNMP engine E.
|
||
|
||
3. Elements of Procedure
|
||
|
||
This section describes the security related procedures followed by an
|
||
SNMP engine when processing SNMP messages according to the User-based
|
||
Security Model.
|
||
|
||
3.1. Generating an Outgoing SNMP Message
|
||
|
||
This section describes the procedure followed by an SNMP engine
|
||
whenever it generates a message containing a management operation
|
||
(like a request, a response, a notification, or a report) on behalf
|
||
of a user, with a particular securityLevel.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 22]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
1) a) If any securityStateReference is passed (Response or Report
|
||
message), then information concerning the user is extracted
|
||
from the cachedSecurityData. The cachedSecurityData can now be
|
||
discarded. The securityEngineID is set to the local
|
||
snmpEngineID. The securityLevel is set to the value specified
|
||
by the calling module.
|
||
|
||
Otherwise,
|
||
|
||
b) based on the securityName, information concerning the user at
|
||
the destination snmpEngineID, specified by the
|
||
securityEngineID, is extracted from the Local Configuration
|
||
Datastore (LCD, usmUserTable). If information about the user
|
||
is absent from the LCD, then an error indication
|
||
(unknownSecurityName) is returned to the calling module.
|
||
|
||
2) If the securityLevel specifies that the message is to be protected
|
||
from disclosure, but the user does not support both an
|
||
authentication and a privacy protocol then the message cannot be
|
||
sent. An error indication (unsupportedSecurityLevel) is returned
|
||
to the calling module.
|
||
|
||
3) If the securityLevel specifies that the message is to be
|
||
authenticated, but the user does not support an authentication
|
||
protocol, then the message cannot be sent. An error indication
|
||
(unsupportedSecurityLevel) is returned to the calling module.
|
||
|
||
4) a) If the securityLevel specifies that the message is to be
|
||
protected from disclosure, then the octet sequence representing
|
||
the serialized scopedPDU is encrypted according to the user's
|
||
privacy protocol. To do so a call is made to the privacy
|
||
module that implements the user's privacy protocol according to
|
||
the abstract primitive:
|
||
|
||
statusInformation = -- success or failure
|
||
encryptData(
|
||
IN encryptKey -- user's localized privKey
|
||
IN dataToEncrypt -- serialized scopedPDU
|
||
OUT encryptedData -- serialized encryptedPDU
|
||
OUT privParameters -- serialized privacy parameters
|
||
)
|
||
|
||
statusInformation
|
||
indicates if the encryption process was successful or not.
|
||
|
||
encryptKey
|
||
the user's localized private privKey is the secret key that
|
||
can be used by the encryption algorithm.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 23]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
dataToEncrypt
|
||
the serialized scopedPDU is the data to be encrypted.
|
||
|
||
encryptedData
|
||
the encryptedPDU represents the encrypted scopedPDU, encoded
|
||
as an OCTET STRING.
|
||
|
||
privParameters
|
||
the privacy parameters, encoded as an OCTET STRING.
|
||
|
||
If the privacy module returns failure, then the message cannot
|
||
be sent and an error indication (encryptionError) is returned
|
||
to the calling module.
|
||
|
||
If the privacy module returns success, then the returned
|
||
privParameters are put into the msgPrivacyParameters field of
|
||
the securityParameters and the encryptedPDU serves as the
|
||
payload of the message being prepared.
|
||
|
||
Otherwise,
|
||
|
||
b) If the securityLevel specifies that the message is not to be be
|
||
protected from disclosure, then a zero-length OCTET STRING is
|
||
encoded into the msgPrivacyParameters field of the
|
||
securityParameters and the plaintext scopedPDU serves as the
|
||
payload of the message being prepared.
|
||
|
||
5) The securityEngineID is encoded as an OCTET STRING into the
|
||
msgAuthoritativeEngineID field of the securityParameters. Note
|
||
that an empty (zero length) securityEngineID is OK for a Request
|
||
message, because that will cause the remote (authoritative) SNMP
|
||
engine to return a Report PDU with the proper securityEngineID
|
||
included in the msgAuthoritativeEngineID in the securityParameters
|
||
of that returned Report PDU.
|
||
|
||
6) a) If the securityLevel specifies that the message is to be
|
||
authenticated, then the current values of snmpEngineBoots and
|
||
snmpEngineTime corresponding to the securityEngineID from the
|
||
LCD are used.
|
||
|
||
Otherwise,
|
||
|
||
b) If this is a Response or Report message, then the current value
|
||
of snmpEngineBoots and snmpEngineTime corresponding to the
|
||
local snmpEngineID from the LCD are used.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 24]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
Otherwise,
|
||
|
||
c) If this is a Request message, then a zero value is used for
|
||
both snmpEngineBoots and snmpEngineTime. This zero value gets
|
||
used if snmpEngineID is empty.
|
||
|
||
The values are encoded as INTEGER respectively into the
|
||
msgAuthoritativeEngineBoots and msgAuthoritativeEngineTime
|
||
fields of the securityParameters.
|
||
|
||
7) The userName is encoded as an OCTET STRING into the msgUserName
|
||
field of the securityParameters.
|
||
|
||
8) a) If the securityLevel specifies that the message is to be
|
||
authenticated, the message is authenticated according to the
|
||
user's authentication protocol. To do so a call is made to the
|
||
authentication module that implements the user's authentication
|
||
protocol according to the abstract service primitive:
|
||
|
||
statusInformation =
|
||
authenticateOutgoingMsg(
|
||
IN authKey -- the user's localized authKey
|
||
IN wholeMsg -- unauthenticated message
|
||
OUT authenticatedWholeMsg -- authenticated complete message
|
||
)
|
||
|
||
statusInformation
|
||
indicates if authentication was successful or not.
|
||
|
||
authKey
|
||
the user's localized private authKey is the secret key that
|
||
can be used by the authentication algorithm.
|
||
|
||
wholeMsg
|
||
the complete serialized message to be authenticated.
|
||
|
||
authenticatedWholeMsg
|
||
the same as the input given to the authenticateOutgoingMsg
|
||
service, but with msgAuthenticationParameters properly
|
||
filled in.
|
||
|
||
If the authentication module returns failure, then the message
|
||
cannot be sent and an error indication (authenticationFailure)
|
||
is returned to the calling module.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 25]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
If the authentication module returns success, then the
|
||
msgAuthenticationParameters field is put into the
|
||
securityParameters and the authenticatedWholeMsg represents the
|
||
serialization of the authenticated message being prepared.
|
||
|
||
Otherwise,
|
||
|
||
b) If the securityLevel specifies that the message is not to be
|
||
authenticated then a zero-length OCTET STRING is encoded into
|
||
the msgAuthenticationParameters field of the
|
||
securityParameters. The wholeMsg is now serialized and then
|
||
represents the unauthenticated message being prepared.
|
||
|
||
9) The completed message with its length is returned to the calling
|
||
module with the statusInformation set to success.
|
||
|
||
3.2. Processing an Incoming SNMP Message
|
||
|
||
This section describes the procedure followed by an SNMP engine
|
||
whenever it receives a message containing a management operation on
|
||
behalf of a user, with a particular securityLevel.
|
||
|
||
To simplify the elements of procedure, the release of state
|
||
information is not always explicitly specified. As a general rule,
|
||
if state information is available when a message gets discarded, the
|
||
state information should also be released. Also, an error indication
|
||
can return an OID and value for an incremented counter and optionally
|
||
a value for securityLevel, and values for contextEngineID or
|
||
contextName for the counter. In addition, the securityStateReference
|
||
data is returned if any such information is available at the point
|
||
where the error is detected.
|
||
|
||
1) If the received securityParameters is not the serialization
|
||
(according to the conventions of [RFC3417]) of an OCTET STRING
|
||
formatted according to the UsmSecurityParameters defined in
|
||
section 2.4, then the snmpInASNParseErrs counter [RFC3418] is
|
||
incremented, and an error indication (parseError) is returned to
|
||
the calling module. Note that we return without the OID and
|
||
value of the incremented counter, because in this case there is
|
||
not enough information to generate a Report PDU.
|
||
|
||
2) The values of the security parameter fields are extracted from
|
||
the securityParameters. The securityEngineID to be returned to
|
||
the caller is the value of the msgAuthoritativeEngineID field.
|
||
The cachedSecurityData is prepared and a securityStateReference
|
||
is prepared to reference this data. Values to be cached are:
|
||
|
||
msgUserName
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 26]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
3) If the value of the msgAuthoritativeEngineID field in the
|
||
securityParameters is unknown then:
|
||
|
||
a) a non-authoritative SNMP engine that performs discovery may
|
||
optionally create a new entry in its Local Configuration
|
||
Datastore (LCD) and continue processing;
|
||
|
||
or
|
||
|
||
b) the usmStatsUnknownEngineIDs counter is incremented, and an
|
||
error indication (unknownEngineID) together with the OID and
|
||
value of the incremented counter is returned to the calling
|
||
module.
|
||
|
||
Note in the event that a zero-length, or other illegally sized
|
||
msgAuthoritativeEngineID is received, b) should be chosen to
|
||
facilitate engineID discovery. Otherwise the choice between a)
|
||
and b) is an implementation issue.
|
||
|
||
4) Information about the value of the msgUserName and
|
||
msgAuthoritativeEngineID fields is extracted from the Local
|
||
Configuration Datastore (LCD, usmUserTable). If no information
|
||
is available for the user, then the usmStatsUnknownUserNames
|
||
counter is incremented and an error indication
|
||
(unknownSecurityName) together with the OID and value of the
|
||
incremented counter is returned to the calling module.
|
||
|
||
5) If the information about the user indicates that it does not
|
||
support the securityLevel requested by the caller, then the
|
||
usmStatsUnsupportedSecLevels counter is incremented and an error
|
||
indication (unsupportedSecurityLevel) together with the OID and
|
||
value of the incremented counter is returned to the calling
|
||
module.
|
||
|
||
6) If the securityLevel specifies that the message is to be
|
||
authenticated, then the message is authenticated according to the
|
||
user's authentication protocol. To do so a call is made to the
|
||
authentication module that implements the user's authentication
|
||
protocol according to the abstract service primitive:
|
||
|
||
statusInformation = -- success or failure
|
||
authenticateIncomingMsg(
|
||
IN authKey -- the user's localized authKey
|
||
IN authParameters -- as received on the wire
|
||
IN wholeMsg -- as received on the wire
|
||
OUT authenticatedWholeMsg -- checked for authentication
|
||
)
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 27]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
statusInformation
|
||
indicates if authentication was successful or not.
|
||
|
||
authKey
|
||
the user's localized private authKey is the secret key that
|
||
can be used by the authentication algorithm.
|
||
|
||
wholeMsg
|
||
the complete serialized message to be authenticated.
|
||
|
||
authenticatedWholeMsg
|
||
the same as the input given to the authenticateIncomingMsg
|
||
service, but after authentication has been checked.
|
||
|
||
If the authentication module returns failure, then the message
|
||
cannot be trusted, so the usmStatsWrongDigests counter is
|
||
incremented and an error indication (authenticationFailure)
|
||
together with the OID and value of the incremented counter is
|
||
returned to the calling module.
|
||
|
||
If the authentication module returns success, then the message is
|
||
authentic and can be trusted so processing continues.
|
||
|
||
7) If the securityLevel indicates an authenticated message, then the
|
||
local values of snmpEngineBoots, snmpEngineTime and
|
||
latestReceivedEngineTime corresponding to the value of the
|
||
msgAuthoritativeEngineID field are extracted from the Local
|
||
Configuration Datastore.
|
||
|
||
a) If the extracted value of msgAuthoritativeEngineID is the same
|
||
as the value of snmpEngineID of the processing SNMP engine
|
||
(meaning this is the authoritative SNMP engine), then if any
|
||
of the following conditions is true, then the message is
|
||
considered to be outside of the Time Window:
|
||
|
||
- the local value of snmpEngineBoots is 2147483647;
|
||
|
||
- the value of the msgAuthoritativeEngineBoots field differs
|
||
from the local value of snmpEngineBoots; or,
|
||
|
||
- the value of the msgAuthoritativeEngineTime field differs
|
||
from the local notion of snmpEngineTime by more than +/- 150
|
||
seconds.
|
||
|
||
If the message is considered to be outside of the Time Window
|
||
then the usmStatsNotInTimeWindows counter is incremented and
|
||
an error indication (notInTimeWindow) together with the OID,
|
||
the value of the incremented counter, and an indication that
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 28]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
the error must be reported with a securityLevel of authNoPriv,
|
||
is returned to the calling module
|
||
|
||
b) If the extracted value of msgAuthoritativeEngineID is not the
|
||
same as the value snmpEngineID of the processing SNMP engine
|
||
(meaning this is not the authoritative SNMP engine), then:
|
||
|
||
1) if at least one of the following conditions is true:
|
||
|
||
- the extracted value of the msgAuthoritativeEngineBoots
|
||
field is greater than the local notion of the value of
|
||
snmpEngineBoots; or,
|
||
|
||
- the extracted value of the msgAuthoritativeEngineBoots
|
||
field is equal to the local notion of the value of
|
||
snmpEngineBoots, and the extracted value of
|
||
msgAuthoritativeEngineTime field is greater than the
|
||
value of latestReceivedEngineTime,
|
||
|
||
then the LCD entry corresponding to the extracted value of
|
||
the msgAuthoritativeEngineID field is updated, by setting:
|
||
|
||
- the local notion of the value of snmpEngineBoots to the
|
||
value of the msgAuthoritativeEngineBoots field,
|
||
|
||
- the local notion of the value of snmpEngineTime to the
|
||
value of the msgAuthoritativeEngineTime field, and
|
||
|
||
- the latestReceivedEngineTime to the value of the value of
|
||
the msgAuthoritativeEngineTime field.
|
||
|
||
2) if any of the following conditions is true, then the
|
||
message is considered to be outside of the Time Window:
|
||
|
||
- the local notion of the value of snmpEngineBoots is
|
||
2147483647;
|
||
|
||
- the value of the msgAuthoritativeEngineBoots field is
|
||
less than the local notion of the value of
|
||
snmpEngineBoots; or,
|
||
|
||
- the value of the msgAuthoritativeEngineBoots field is
|
||
equal to the local notion of the value of snmpEngineBoots
|
||
and the value of the msgAuthoritativeEngineTime field is
|
||
more than 150 seconds less than the local notion of the
|
||
value of snmpEngineTime.
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 29]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
If the message is considered to be outside of the Time
|
||
Window then an error indication (notInTimeWindow) is
|
||
returned to the calling module.
|
||
|
||
Note that this means that a too old (possibly replayed)
|
||
message has been detected and is deemed unauthentic.
|
||
|
||
Note that this procedure allows for the value of
|
||
msgAuthoritativeEngineBoots in the message to be greater
|
||
than the local notion of the value of snmpEngineBoots to
|
||
allow for received messages to be accepted as authentic
|
||
when received from an authoritative SNMP engine that has
|
||
re-booted since the receiving SNMP engine last
|
||
(re-)synchronized.
|
||
|
||
8) a) If the securityLevel indicates that the message was protected
|
||
from disclosure, then the OCTET STRING representing the
|
||
encryptedPDU is decrypted according to the user's privacy
|
||
protocol to obtain an unencrypted serialized scopedPDU value.
|
||
To do so a call is made to the privacy module that implements
|
||
the user's privacy protocol according to the abstract
|
||
primitive:
|
||
|
||
statusInformation = -- success or failure
|
||
decryptData(
|
||
IN decryptKey -- the user's localized privKey
|
||
IN privParameters -- as received on the wire
|
||
IN encryptedData -- encryptedPDU as received
|
||
OUT decryptedData -- serialized decrypted scopedPDU
|
||
)
|
||
|
||
statusInformation
|
||
indicates if the decryption process was successful or not.
|
||
|
||
decryptKey
|
||
the user's localized private privKey is the secret key that
|
||
can be used by the decryption algorithm.
|
||
|
||
privParameters
|
||
the msgPrivacyParameters, encoded as an OCTET STRING.
|
||
|
||
encryptedData
|
||
the encryptedPDU represents the encrypted scopedPDU,
|
||
encoded as an OCTET STRING.
|
||
|
||
decryptedData
|
||
the serialized scopedPDU if decryption is successful.
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 30]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
If the privacy module returns failure, then the message can
|
||
not be processed, so the usmStatsDecryptionErrors counter is
|
||
incremented and an error indication (decryptionError) together
|
||
with the OID and value of the incremented counter is returned
|
||
to the calling module.
|
||
|
||
If the privacy module returns success, then the decrypted
|
||
scopedPDU is the message payload to be returned to the calling
|
||
module.
|
||
|
||
Otherwise,
|
||
|
||
b) The scopedPDU component is assumed to be in plain text and is
|
||
the message payload to be returned to the calling module.
|
||
|
||
9) The maxSizeResponseScopedPDU is calculated. This is the maximum
|
||
size allowed for a scopedPDU for a possible Response message.
|
||
Provision is made for a message header that allows the same
|
||
securityLevel as the received Request.
|
||
|
||
10) The securityName for the user is retrieved from the usmUserTable.
|
||
|
||
11) The security data is cached as cachedSecurityData, so that a
|
||
possible response to this message can and will use the same
|
||
authentication and privacy secrets. Information to be
|
||
saved/cached is as follows:
|
||
|
||
msgUserName,
|
||
usmUserAuthProtocol, usmUserAuthKey
|
||
usmUserPrivProtocol, usmUserPrivKey
|
||
|
||
12) The statusInformation is set to success and a return is made to
|
||
the calling module passing back the OUT parameters as specified
|
||
in the processIncomingMsg primitive.
|
||
|
||
4. Discovery
|
||
|
||
The User-based Security Model requires that a discovery process
|
||
obtains sufficient information about other SNMP engines in order to
|
||
communicate with them. Discovery requires an non-authoritative SNMP
|
||
engine to learn the authoritative SNMP engine's snmpEngineID value
|
||
before communication may proceed. This may be accomplished by
|
||
generating a Request message with a securityLevel of noAuthNoPriv, a
|
||
msgUserName of zero-length, a msgAuthoritativeEngineID value of zero
|
||
length, and the varBindList left empty. The response to this message
|
||
will be a Report message containing the snmpEngineID of the
|
||
authoritative SNMP engine as the value of the
|
||
msgAuthoritativeEngineID field within the msgSecurityParameters
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 31]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
field. It contains a Report PDU with the usmStatsUnknownEngineIDs
|
||
counter in the varBindList.
|
||
|
||
If authenticated communication is required, then the discovery
|
||
process should also establish time synchronization with the
|
||
authoritative SNMP engine. This may be accomplished by sending an
|
||
authenticated Request message with the value of
|
||
msgAuthoritativeEngineID set to the newly learned snmpEngineID and
|
||
with the values of msgAuthoritativeEngineBoots and
|
||
msgAuthoritativeEngineTime set to zero. For an authenticated Request
|
||
message, a valid userName must be used in the msgUserName field. The
|
||
response to this authenticated message will be a Report message
|
||
containing the up to date values of the authoritative SNMP engine's
|
||
snmpEngineBoots and snmpEngineTime as the value of the
|
||
msgAuthoritativeEngineBoots and msgAuthoritativeEngineTime fields
|
||
respectively. It also contains the usmStatsNotInTimeWindows counter
|
||
in the varBindList of the Report PDU. The time synchronization then
|
||
happens automatically as part of the procedures in section 3.2 step
|
||
7b. See also section 2.3.
|
||
|
||
5. Definitions
|
||
|
||
SNMP-USER-BASED-SM-MIB DEFINITIONS ::= BEGIN
|
||
|
||
IMPORTS
|
||
MODULE-IDENTITY, OBJECT-TYPE,
|
||
OBJECT-IDENTITY,
|
||
snmpModules, Counter32 FROM SNMPv2-SMI
|
||
TEXTUAL-CONVENTION, TestAndIncr,
|
||
RowStatus, RowPointer,
|
||
StorageType, AutonomousType FROM SNMPv2-TC
|
||
MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF
|
||
SnmpAdminString, SnmpEngineID,
|
||
snmpAuthProtocols, snmpPrivProtocols FROM SNMP-FRAMEWORK-MIB;
|
||
|
||
snmpUsmMIB MODULE-IDENTITY
|
||
LAST-UPDATED "200210160000Z" -- 16 Oct 2002, midnight
|
||
ORGANIZATION "SNMPv3 Working Group"
|
||
CONTACT-INFO "WG-email: snmpv3@lists.tislabs.com
|
||
Subscribe: majordomo@lists.tislabs.com
|
||
In msg body: subscribe snmpv3
|
||
|
||
Chair: Russ Mundy
|
||
Network Associates Laboratories
|
||
postal: 15204 Omega Drive, Suite 300
|
||
Rockville, MD 20850-4601
|
||
USA
|
||
email: mundy@tislabs.com
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 32]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
phone: +1 301-947-7107
|
||
|
||
Co-Chair: David Harrington
|
||
Enterasys Networks
|
||
Postal: 35 Industrial Way
|
||
P. O. Box 5004
|
||
Rochester, New Hampshire 03866-5005
|
||
USA
|
||
EMail: dbh@enterasys.com
|
||
Phone: +1 603-337-2614
|
||
|
||
Co-editor Uri Blumenthal
|
||
Lucent Technologies
|
||
postal: 67 Whippany Rd.
|
||
Whippany, NJ 07981
|
||
USA
|
||
email: uri@lucent.com
|
||
phone: +1-973-386-2163
|
||
|
||
Co-editor: Bert Wijnen
|
||
Lucent Technologies
|
||
postal: Schagen 33
|
||
3461 GL Linschoten
|
||
Netherlands
|
||
email: bwijnen@lucent.com
|
||
phone: +31-348-480-685
|
||
"
|
||
DESCRIPTION "The management information definitions for the
|
||
SNMP User-based Security Model.
|
||
|
||
Copyright (C) The Internet Society (2002). This
|
||
version of this MIB module is part of RFC 3414;
|
||
see the RFC itself for full legal notices.
|
||
"
|
||
-- Revision history
|
||
|
||
REVISION "200210160000Z" -- 16 Oct 2002, midnight
|
||
DESCRIPTION "Changes in this revision:
|
||
- Updated references and contact info.
|
||
- Clarification to usmUserCloneFrom DESCRIPTION
|
||
clause
|
||
- Fixed 'command responder' into 'command generator'
|
||
in last para of DESCRIPTION clause of
|
||
usmUserTable.
|
||
This revision published as RFC3414.
|
||
"
|
||
REVISION "199901200000Z" -- 20 Jan 1999, midnight
|
||
DESCRIPTION "Clarifications, published as RFC2574"
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 33]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
REVISION "199711200000Z" -- 20 Nov 1997, midnight
|
||
DESCRIPTION "Initial version, published as RFC2274"
|
||
|
||
::= { snmpModules 15 }
|
||
|
||
-- Administrative assignments ****************************************
|
||
|
||
usmMIBObjects OBJECT IDENTIFIER ::= { snmpUsmMIB 1 }
|
||
usmMIBConformance OBJECT IDENTIFIER ::= { snmpUsmMIB 2 }
|
||
|
||
-- Identification of Authentication and Privacy Protocols ************
|
||
|
||
usmNoAuthProtocol OBJECT-IDENTITY
|
||
STATUS current
|
||
DESCRIPTION "No Authentication Protocol."
|
||
::= { snmpAuthProtocols 1 }
|
||
|
||
usmHMACMD5AuthProtocol OBJECT-IDENTITY
|
||
STATUS current
|
||
DESCRIPTION "The HMAC-MD5-96 Digest Authentication Protocol."
|
||
REFERENCE "- H. Krawczyk, M. Bellare, R. Canetti HMAC:
|
||
Keyed-Hashing for Message Authentication,
|
||
RFC2104, Feb 1997.
|
||
- Rivest, R., Message Digest Algorithm MD5, RFC1321.
|
||
"
|
||
::= { snmpAuthProtocols 2 }
|
||
|
||
usmHMACSHAAuthProtocol OBJECT-IDENTITY
|
||
STATUS current
|
||
DESCRIPTION "The HMAC-SHA-96 Digest Authentication Protocol."
|
||
REFERENCE "- H. Krawczyk, M. Bellare, R. Canetti, HMAC:
|
||
Keyed-Hashing for Message Authentication,
|
||
RFC2104, Feb 1997.
|
||
- Secure Hash Algorithm. NIST FIPS 180-1.
|
||
"
|
||
::= { snmpAuthProtocols 3 }
|
||
|
||
usmNoPrivProtocol OBJECT-IDENTITY
|
||
STATUS current
|
||
DESCRIPTION "No Privacy Protocol."
|
||
::= { snmpPrivProtocols 1 }
|
||
|
||
usmDESPrivProtocol OBJECT-IDENTITY
|
||
STATUS current
|
||
DESCRIPTION "The CBC-DES Symmetric Encryption Protocol."
|
||
REFERENCE "- Data Encryption Standard, National Institute of
|
||
Standards and Technology. Federal Information
|
||
Processing Standard (FIPS) Publication 46-1.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 34]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
Supersedes FIPS Publication 46,
|
||
(January, 1977; reaffirmed January, 1988).
|
||
|
||
- Data Encryption Algorithm, American National
|
||
Standards Institute. ANSI X3.92-1981,
|
||
(December, 1980).
|
||
|
||
- DES Modes of Operation, National Institute of
|
||
Standards and Technology. Federal Information
|
||
Processing Standard (FIPS) Publication 81,
|
||
(December, 1980).
|
||
|
||
- Data Encryption Algorithm - Modes of Operation,
|
||
American National Standards Institute.
|
||
ANSI X3.106-1983, (May 1983).
|
||
"
|
||
::= { snmpPrivProtocols 2 }
|
||
|
||
-- Textual Conventions ***********************************************
|
||
|
||
KeyChange ::= TEXTUAL-CONVENTION
|
||
STATUS current
|
||
DESCRIPTION
|
||
"Every definition of an object with this syntax must identify
|
||
a protocol P, a secret key K, and a hash algorithm H
|
||
that produces output of L octets.
|
||
|
||
The object's value is a manager-generated, partially-random
|
||
value which, when modified, causes the value of the secret
|
||
key K, to be modified via a one-way function.
|
||
|
||
The value of an instance of this object is the concatenation
|
||
of two components: first a 'random' component and then a
|
||
'delta' component.
|
||
|
||
The lengths of the random and delta components
|
||
are given by the corresponding value of the protocol P;
|
||
if P requires K to be a fixed length, the length of both the
|
||
random and delta components is that fixed length; if P
|
||
allows the length of K to be variable up to a particular
|
||
maximum length, the length of the random component is that
|
||
maximum length and the length of the delta component is any
|
||
length less than or equal to that maximum length.
|
||
For example, usmHMACMD5AuthProtocol requires K to be a fixed
|
||
length of 16 octets and L - of 16 octets.
|
||
usmHMACSHAAuthProtocol requires K to be a fixed length of
|
||
20 octets and L - of 20 octets. Other protocols may define
|
||
other sizes, as deemed appropriate.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 35]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
When a requester wants to change the old key K to a new
|
||
key keyNew on a remote entity, the 'random' component is
|
||
obtained from either a true random generator, or from a
|
||
pseudorandom generator, and the 'delta' component is
|
||
computed as follows:
|
||
|
||
- a temporary variable is initialized to the existing value
|
||
of K;
|
||
- if the length of the keyNew is greater than L octets,
|
||
then:
|
||
- the random component is appended to the value of the
|
||
temporary variable, and the result is input to the
|
||
the hash algorithm H to produce a digest value, and
|
||
the temporary variable is set to this digest value;
|
||
- the value of the temporary variable is XOR-ed with
|
||
the first (next) L-octets (16 octets in case of MD5)
|
||
of the keyNew to produce the first (next) L-octets
|
||
(16 octets in case of MD5) of the 'delta' component.
|
||
- the above two steps are repeated until the unused
|
||
portion of the keyNew component is L octets or less,
|
||
- the random component is appended to the value of the
|
||
temporary variable, and the result is input to the
|
||
hash algorithm H to produce a digest value;
|
||
- this digest value, truncated if necessary to be the same
|
||
length as the unused portion of the keyNew, is XOR-ed
|
||
with the unused portion of the keyNew to produce the
|
||
(final portion of the) 'delta' component.
|
||
|
||
For example, using MD5 as the hash algorithm H:
|
||
|
||
iterations = (lenOfDelta - 1)/16; /* integer division */
|
||
temp = keyOld;
|
||
for (i = 0; i < iterations; i++) {
|
||
temp = MD5 (temp || random);
|
||
delta[i*16 .. (i*16)+15] =
|
||
temp XOR keyNew[i*16 .. (i*16)+15];
|
||
}
|
||
temp = MD5 (temp || random);
|
||
delta[i*16 .. lenOfDelta-1] =
|
||
temp XOR keyNew[i*16 .. lenOfDelta-1];
|
||
|
||
The 'random' and 'delta' components are then concatenated as
|
||
described above, and the resulting octet string is sent to
|
||
the recipient as the new value of an instance of this object.
|
||
|
||
At the receiver side, when an instance of this object is set
|
||
to a new value, then a new value of K is computed as follows:
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 36]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
- a temporary variable is initialized to the existing value
|
||
of K;
|
||
- if the length of the delta component is greater than L
|
||
octets, then:
|
||
- the random component is appended to the value of the
|
||
temporary variable, and the result is input to the
|
||
hash algorithm H to produce a digest value, and the
|
||
temporary variable is set to this digest value;
|
||
- the value of the temporary variable is XOR-ed with
|
||
the first (next) L-octets (16 octets in case of MD5)
|
||
of the delta component to produce the first (next)
|
||
L-octets (16 octets in case of MD5) of the new value
|
||
of K.
|
||
- the above two steps are repeated until the unused
|
||
portion of the delta component is L octets or less,
|
||
- the random component is appended to the value of the
|
||
temporary variable, and the result is input to the
|
||
hash algorithm H to produce a digest value;
|
||
- this digest value, truncated if necessary to be the same
|
||
length as the unused portion of the delta component, is
|
||
XOR-ed with the unused portion of the delta component to
|
||
produce the (final portion of the) new value of K.
|
||
|
||
For example, using MD5 as the hash algorithm H:
|
||
|
||
iterations = (lenOfDelta - 1)/16; /* integer division */
|
||
temp = keyOld;
|
||
for (i = 0; i < iterations; i++) {
|
||
temp = MD5 (temp || random);
|
||
keyNew[i*16 .. (i*16)+15] =
|
||
temp XOR delta[i*16 .. (i*16)+15];
|
||
}
|
||
temp = MD5 (temp || random);
|
||
keyNew[i*16 .. lenOfDelta-1] =
|
||
temp XOR delta[i*16 .. lenOfDelta-1];
|
||
|
||
The value of an object with this syntax, whenever it is
|
||
retrieved by the management protocol, is always the zero
|
||
length string.
|
||
|
||
Note that the keyOld and keyNew are the localized keys.
|
||
|
||
Note that it is probably wise that when an SNMP entity sends
|
||
a SetRequest to change a key, that it keeps a copy of the old
|
||
key until it has confirmed that the key change actually
|
||
succeeded.
|
||
"
|
||
SYNTAX OCTET STRING
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 37]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
-- Statistics for the User-based Security Model **********************
|
||
|
||
|
||
usmStats OBJECT IDENTIFIER ::= { usmMIBObjects 1 }
|
||
|
||
|
||
usmStatsUnsupportedSecLevels OBJECT-TYPE
|
||
SYNTAX Counter32
|
||
MAX-ACCESS read-only
|
||
STATUS current
|
||
DESCRIPTION "The total number of packets received by the SNMP
|
||
engine which were dropped because they requested a
|
||
securityLevel that was unknown to the SNMP engine
|
||
or otherwise unavailable.
|
||
"
|
||
::= { usmStats 1 }
|
||
|
||
usmStatsNotInTimeWindows OBJECT-TYPE
|
||
SYNTAX Counter32
|
||
MAX-ACCESS read-only
|
||
STATUS current
|
||
DESCRIPTION "The total number of packets received by the SNMP
|
||
engine which were dropped because they appeared
|
||
outside of the authoritative SNMP engine's window.
|
||
"
|
||
::= { usmStats 2 }
|
||
|
||
usmStatsUnknownUserNames OBJECT-TYPE
|
||
SYNTAX Counter32
|
||
MAX-ACCESS read-only
|
||
STATUS current
|
||
DESCRIPTION "The total number of packets received by the SNMP
|
||
engine which were dropped because they referenced a
|
||
user that was not known to the SNMP engine.
|
||
"
|
||
::= { usmStats 3 }
|
||
|
||
usmStatsUnknownEngineIDs OBJECT-TYPE
|
||
SYNTAX Counter32
|
||
MAX-ACCESS read-only
|
||
STATUS current
|
||
DESCRIPTION "The total number of packets received by the SNMP
|
||
engine which were dropped because they referenced an
|
||
snmpEngineID that was not known to the SNMP engine.
|
||
"
|
||
::= { usmStats 4 }
|
||
|
||
usmStatsWrongDigests OBJECT-TYPE
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 38]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
SYNTAX Counter32
|
||
MAX-ACCESS read-only
|
||
STATUS current
|
||
DESCRIPTION "The total number of packets received by the SNMP
|
||
engine which were dropped because they didn't
|
||
contain the expected digest value.
|
||
"
|
||
::= { usmStats 5 }
|
||
|
||
usmStatsDecryptionErrors OBJECT-TYPE
|
||
SYNTAX Counter32
|
||
MAX-ACCESS read-only
|
||
STATUS current
|
||
DESCRIPTION "The total number of packets received by the SNMP
|
||
engine which were dropped because they could not be
|
||
decrypted.
|
||
"
|
||
::= { usmStats 6 }
|
||
|
||
-- The usmUser Group ************************************************
|
||
|
||
usmUser OBJECT IDENTIFIER ::= { usmMIBObjects 2 }
|
||
|
||
usmUserSpinLock OBJECT-TYPE
|
||
SYNTAX TestAndIncr
|
||
MAX-ACCESS read-write
|
||
STATUS current
|
||
DESCRIPTION "An advisory lock used to allow several cooperating
|
||
Command Generator Applications to coordinate their
|
||
use of facilities to alter secrets in the
|
||
usmUserTable.
|
||
"
|
||
::= { usmUser 1 }
|
||
|
||
-- The table of valid users for the User-based Security Model ********
|
||
|
||
usmUserTable OBJECT-TYPE
|
||
SYNTAX SEQUENCE OF UsmUserEntry
|
||
MAX-ACCESS not-accessible
|
||
STATUS current
|
||
DESCRIPTION "The table of users configured in the SNMP engine's
|
||
Local Configuration Datastore (LCD).
|
||
|
||
To create a new user (i.e., to instantiate a new
|
||
conceptual row in this table), it is recommended to
|
||
follow this procedure:
|
||
|
||
1) GET(usmUserSpinLock.0) and save in sValue.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 39]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
2) SET(usmUserSpinLock.0=sValue,
|
||
usmUserCloneFrom=templateUser,
|
||
usmUserStatus=createAndWait)
|
||
You should use a template user to clone from
|
||
which has the proper auth/priv protocol defined.
|
||
|
||
If the new user is to use privacy:
|
||
|
||
3) generate the keyChange value based on the secret
|
||
privKey of the clone-from user and the secret key
|
||
to be used for the new user. Let us call this
|
||
pkcValue.
|
||
4) GET(usmUserSpinLock.0) and save in sValue.
|
||
5) SET(usmUserSpinLock.0=sValue,
|
||
usmUserPrivKeyChange=pkcValue
|
||
usmUserPublic=randomValue1)
|
||
6) GET(usmUserPulic) and check it has randomValue1.
|
||
If not, repeat steps 4-6.
|
||
|
||
If the new user will never use privacy:
|
||
|
||
7) SET(usmUserPrivProtocol=usmNoPrivProtocol)
|
||
|
||
If the new user is to use authentication:
|
||
|
||
8) generate the keyChange value based on the secret
|
||
authKey of the clone-from user and the secret key
|
||
to be used for the new user. Let us call this
|
||
akcValue.
|
||
9) GET(usmUserSpinLock.0) and save in sValue.
|
||
10) SET(usmUserSpinLock.0=sValue,
|
||
usmUserAuthKeyChange=akcValue
|
||
usmUserPublic=randomValue2)
|
||
11) GET(usmUserPulic) and check it has randomValue2.
|
||
If not, repeat steps 9-11.
|
||
|
||
If the new user will never use authentication:
|
||
|
||
12) SET(usmUserAuthProtocol=usmNoAuthProtocol)
|
||
|
||
Finally, activate the new user:
|
||
|
||
13) SET(usmUserStatus=active)
|
||
|
||
The new user should now be available and ready to be
|
||
used for SNMPv3 communication. Note however that access
|
||
to MIB data must be provided via configuration of the
|
||
SNMP-VIEW-BASED-ACM-MIB.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 40]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
The use of usmUserSpinlock is to avoid conflicts with
|
||
another SNMP command generator application which may
|
||
also be acting on the usmUserTable.
|
||
"
|
||
::= { usmUser 2 }
|
||
|
||
usmUserEntry OBJECT-TYPE
|
||
SYNTAX UsmUserEntry
|
||
MAX-ACCESS not-accessible
|
||
STATUS current
|
||
DESCRIPTION "A user configured in the SNMP engine's Local
|
||
Configuration Datastore (LCD) for the User-based
|
||
Security Model.
|
||
"
|
||
INDEX { usmUserEngineID,
|
||
usmUserName
|
||
}
|
||
::= { usmUserTable 1 }
|
||
|
||
UsmUserEntry ::= SEQUENCE
|
||
{
|
||
usmUserEngineID SnmpEngineID,
|
||
usmUserName SnmpAdminString,
|
||
usmUserSecurityName SnmpAdminString,
|
||
usmUserCloneFrom RowPointer,
|
||
usmUserAuthProtocol AutonomousType,
|
||
usmUserAuthKeyChange KeyChange,
|
||
usmUserOwnAuthKeyChange KeyChange,
|
||
usmUserPrivProtocol AutonomousType,
|
||
usmUserPrivKeyChange KeyChange,
|
||
usmUserOwnPrivKeyChange KeyChange,
|
||
usmUserPublic OCTET STRING,
|
||
usmUserStorageType StorageType,
|
||
usmUserStatus RowStatus
|
||
}
|
||
|
||
usmUserEngineID OBJECT-TYPE
|
||
SYNTAX SnmpEngineID
|
||
MAX-ACCESS not-accessible
|
||
STATUS current
|
||
DESCRIPTION "An SNMP engine's administratively-unique identifier.
|
||
|
||
In a simple agent, this value is always that agent's
|
||
own snmpEngineID value.
|
||
|
||
The value can also take the value of the snmpEngineID
|
||
of a remote SNMP engine with which this user can
|
||
communicate.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 41]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
"
|
||
::= { usmUserEntry 1 }
|
||
|
||
usmUserName OBJECT-TYPE
|
||
SYNTAX SnmpAdminString (SIZE(1..32))
|
||
MAX-ACCESS not-accessible
|
||
STATUS current
|
||
DESCRIPTION "A human readable string representing the name of
|
||
the user.
|
||
|
||
This is the (User-based Security) Model dependent
|
||
security ID.
|
||
"
|
||
::= { usmUserEntry 2 }
|
||
|
||
usmUserSecurityName OBJECT-TYPE
|
||
SYNTAX SnmpAdminString
|
||
MAX-ACCESS read-only
|
||
STATUS current
|
||
DESCRIPTION "A human readable string representing the user in
|
||
Security Model independent format.
|
||
|
||
The default transformation of the User-based Security
|
||
Model dependent security ID to the securityName and
|
||
vice versa is the identity function so that the
|
||
securityName is the same as the userName.
|
||
"
|
||
::= { usmUserEntry 3 }
|
||
|
||
usmUserCloneFrom OBJECT-TYPE
|
||
SYNTAX RowPointer
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "A pointer to another conceptual row in this
|
||
usmUserTable. The user in this other conceptual
|
||
row is called the clone-from user.
|
||
|
||
When a new user is created (i.e., a new conceptual
|
||
row is instantiated in this table), the privacy and
|
||
authentication parameters of the new user must be
|
||
cloned from its clone-from user. These parameters are:
|
||
- authentication protocol (usmUserAuthProtocol)
|
||
- privacy protocol (usmUserPrivProtocol)
|
||
They will be copied regardless of what the current
|
||
value is.
|
||
|
||
Cloning also causes the initial values of the secret
|
||
authentication key (authKey) and the secret encryption
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 42]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
key (privKey) of the new user to be set to the same
|
||
values as the corresponding secrets of the clone-from
|
||
user to allow the KeyChange process to occur as
|
||
required during user creation.
|
||
|
||
The first time an instance of this object is set by
|
||
a management operation (either at or after its
|
||
instantiation), the cloning process is invoked.
|
||
Subsequent writes are successful but invoke no
|
||
action to be taken by the receiver.
|
||
The cloning process fails with an 'inconsistentName'
|
||
error if the conceptual row representing the
|
||
clone-from user does not exist or is not in an active
|
||
state when the cloning process is invoked.
|
||
|
||
When this object is read, the ZeroDotZero OID
|
||
is returned.
|
||
"
|
||
::= { usmUserEntry 4 }
|
||
|
||
usmUserAuthProtocol OBJECT-TYPE
|
||
SYNTAX AutonomousType
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "An indication of whether messages sent on behalf of
|
||
this user to/from the SNMP engine identified by
|
||
usmUserEngineID, can be authenticated, and if so,
|
||
the type of authentication protocol which is used.
|
||
|
||
An instance of this object is created concurrently
|
||
with the creation of any other object instance for
|
||
the same user (i.e., as part of the processing of
|
||
the set operation which creates the first object
|
||
instance in the same conceptual row).
|
||
|
||
If an initial set operation (i.e. at row creation time)
|
||
tries to set a value for an unknown or unsupported
|
||
protocol, then a 'wrongValue' error must be returned.
|
||
|
||
The value will be overwritten/set when a set operation
|
||
is performed on the corresponding instance of
|
||
usmUserCloneFrom.
|
||
|
||
Once instantiated, the value of such an instance of
|
||
this object can only be changed via a set operation to
|
||
the value of the usmNoAuthProtocol.
|
||
|
||
If a set operation tries to change the value of an
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 43]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
existing instance of this object to any value other
|
||
than usmNoAuthProtocol, then an 'inconsistentValue'
|
||
error must be returned.
|
||
|
||
If a set operation tries to set the value to the
|
||
usmNoAuthProtocol while the usmUserPrivProtocol value
|
||
in the same row is not equal to usmNoPrivProtocol,
|
||
then an 'inconsistentValue' error must be returned.
|
||
That means that an SNMP command generator application
|
||
must first ensure that the usmUserPrivProtocol is set
|
||
to the usmNoPrivProtocol value before it can set
|
||
the usmUserAuthProtocol value to usmNoAuthProtocol.
|
||
"
|
||
DEFVAL { usmNoAuthProtocol }
|
||
::= { usmUserEntry 5 }
|
||
|
||
usmUserAuthKeyChange OBJECT-TYPE
|
||
SYNTAX KeyChange -- typically (SIZE (0 | 32)) for HMACMD5
|
||
-- typically (SIZE (0 | 40)) for HMACSHA
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "An object, which when modified, causes the secret
|
||
authentication key used for messages sent on behalf
|
||
of this user to/from the SNMP engine identified by
|
||
usmUserEngineID, to be modified via a one-way
|
||
function.
|
||
|
||
The associated protocol is the usmUserAuthProtocol.
|
||
The associated secret key is the user's secret
|
||
authentication key (authKey). The associated hash
|
||
algorithm is the algorithm used by the user's
|
||
usmUserAuthProtocol.
|
||
|
||
When creating a new user, it is an 'inconsistentName'
|
||
error for a set operation to refer to this object
|
||
unless it is previously or concurrently initialized
|
||
through a set operation on the corresponding instance
|
||
of usmUserCloneFrom.
|
||
|
||
When the value of the corresponding usmUserAuthProtocol
|
||
is usmNoAuthProtocol, then a set is successful, but
|
||
effectively is a no-op.
|
||
|
||
When this object is read, the zero-length (empty)
|
||
string is returned.
|
||
|
||
The recommended way to do a key change is as follows:
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 44]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
1) GET(usmUserSpinLock.0) and save in sValue.
|
||
2) generate the keyChange value based on the old
|
||
(existing) secret key and the new secret key,
|
||
let us call this kcValue.
|
||
|
||
If you do the key change on behalf of another user:
|
||
|
||
3) SET(usmUserSpinLock.0=sValue,
|
||
usmUserAuthKeyChange=kcValue
|
||
usmUserPublic=randomValue)
|
||
|
||
If you do the key change for yourself:
|
||
|
||
4) SET(usmUserSpinLock.0=sValue,
|
||
usmUserOwnAuthKeyChange=kcValue
|
||
usmUserPublic=randomValue)
|
||
|
||
If you get a response with error-status of noError,
|
||
then the SET succeeded and the new key is active.
|
||
If you do not get a response, then you can issue a
|
||
GET(usmUserPublic) and check if the value is equal
|
||
to the randomValue you did send in the SET. If so, then
|
||
the key change succeeded and the new key is active
|
||
(probably the response got lost). If not, then the SET
|
||
request probably never reached the target and so you
|
||
can start over with the procedure above.
|
||
"
|
||
DEFVAL { ''H } -- the empty string
|
||
::= { usmUserEntry 6 }
|
||
|
||
usmUserOwnAuthKeyChange OBJECT-TYPE
|
||
SYNTAX KeyChange -- typically (SIZE (0 | 32)) for HMACMD5
|
||
-- typically (SIZE (0 | 40)) for HMACSHA
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "Behaves exactly as usmUserAuthKeyChange, with one
|
||
notable difference: in order for the set operation
|
||
to succeed, the usmUserName of the operation
|
||
requester must match the usmUserName that
|
||
indexes the row which is targeted by this
|
||
operation.
|
||
In addition, the USM security model must be
|
||
used for this operation.
|
||
|
||
The idea here is that access to this column can be
|
||
public, since it will only allow a user to change
|
||
his own secret authentication key (authKey).
|
||
Note that this can only be done once the row is active.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 45]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
When a set is received and the usmUserName of the
|
||
requester is not the same as the umsUserName that
|
||
indexes the row which is targeted by this operation,
|
||
then a 'noAccess' error must be returned.
|
||
|
||
When a set is received and the security model in use
|
||
is not USM, then a 'noAccess' error must be returned.
|
||
"
|
||
DEFVAL { ''H } -- the empty string
|
||
::= { usmUserEntry 7 }
|
||
|
||
usmUserPrivProtocol OBJECT-TYPE
|
||
SYNTAX AutonomousType
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "An indication of whether messages sent on behalf of
|
||
this user to/from the SNMP engine identified by
|
||
usmUserEngineID, can be protected from disclosure,
|
||
and if so, the type of privacy protocol which is used.
|
||
|
||
An instance of this object is created concurrently
|
||
with the creation of any other object instance for
|
||
the same user (i.e., as part of the processing of
|
||
the set operation which creates the first object
|
||
instance in the same conceptual row).
|
||
|
||
If an initial set operation (i.e. at row creation time)
|
||
tries to set a value for an unknown or unsupported
|
||
protocol, then a 'wrongValue' error must be returned.
|
||
|
||
The value will be overwritten/set when a set operation
|
||
is performed on the corresponding instance of
|
||
usmUserCloneFrom.
|
||
|
||
Once instantiated, the value of such an instance of
|
||
this object can only be changed via a set operation to
|
||
the value of the usmNoPrivProtocol.
|
||
|
||
If a set operation tries to change the value of an
|
||
existing instance of this object to any value other
|
||
than usmNoPrivProtocol, then an 'inconsistentValue'
|
||
error must be returned.
|
||
|
||
Note that if any privacy protocol is used, then you
|
||
must also use an authentication protocol. In other
|
||
words, if usmUserPrivProtocol is set to anything else
|
||
than usmNoPrivProtocol, then the corresponding instance
|
||
of usmUserAuthProtocol cannot have a value of
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 46]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
usmNoAuthProtocol. If it does, then an
|
||
'inconsistentValue' error must be returned.
|
||
"
|
||
DEFVAL { usmNoPrivProtocol }
|
||
::= { usmUserEntry 8 }
|
||
|
||
usmUserPrivKeyChange OBJECT-TYPE
|
||
SYNTAX KeyChange -- typically (SIZE (0 | 32)) for DES
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "An object, which when modified, causes the secret
|
||
encryption key used for messages sent on behalf
|
||
of this user to/from the SNMP engine identified by
|
||
usmUserEngineID, to be modified via a one-way
|
||
function.
|
||
|
||
The associated protocol is the usmUserPrivProtocol.
|
||
The associated secret key is the user's secret
|
||
privacy key (privKey). The associated hash
|
||
algorithm is the algorithm used by the user's
|
||
usmUserAuthProtocol.
|
||
|
||
When creating a new user, it is an 'inconsistentName'
|
||
error for a set operation to refer to this object
|
||
unless it is previously or concurrently initialized
|
||
through a set operation on the corresponding instance
|
||
of usmUserCloneFrom.
|
||
|
||
When the value of the corresponding usmUserPrivProtocol
|
||
is usmNoPrivProtocol, then a set is successful, but
|
||
effectively is a no-op.
|
||
|
||
When this object is read, the zero-length (empty)
|
||
string is returned.
|
||
See the description clause of usmUserAuthKeyChange for
|
||
a recommended procedure to do a key change.
|
||
"
|
||
DEFVAL { ''H } -- the empty string
|
||
::= { usmUserEntry 9 }
|
||
|
||
usmUserOwnPrivKeyChange OBJECT-TYPE
|
||
SYNTAX KeyChange -- typically (SIZE (0 | 32)) for DES
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "Behaves exactly as usmUserPrivKeyChange, with one
|
||
notable difference: in order for the Set operation
|
||
to succeed, the usmUserName of the operation
|
||
requester must match the usmUserName that indexes
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 47]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
the row which is targeted by this operation.
|
||
In addition, the USM security model must be
|
||
used for this operation.
|
||
|
||
The idea here is that access to this column can be
|
||
public, since it will only allow a user to change
|
||
his own secret privacy key (privKey).
|
||
Note that this can only be done once the row is active.
|
||
|
||
When a set is received and the usmUserName of the
|
||
requester is not the same as the umsUserName that
|
||
indexes the row which is targeted by this operation,
|
||
then a 'noAccess' error must be returned.
|
||
|
||
When a set is received and the security model in use
|
||
is not USM, then a 'noAccess' error must be returned.
|
||
"
|
||
DEFVAL { ''H } -- the empty string
|
||
::= { usmUserEntry 10 }
|
||
|
||
usmUserPublic OBJECT-TYPE
|
||
SYNTAX OCTET STRING (SIZE(0..32))
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "A publicly-readable value which can be written as part
|
||
of the procedure for changing a user's secret
|
||
authentication and/or privacy key, and later read to
|
||
determine whether the change of the secret was
|
||
effected.
|
||
"
|
||
DEFVAL { ''H } -- the empty string
|
||
::= { usmUserEntry 11 }
|
||
|
||
usmUserStorageType OBJECT-TYPE
|
||
SYNTAX StorageType
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "The storage type for this conceptual row.
|
||
|
||
Conceptual rows having the value 'permanent' must
|
||
allow write-access at a minimum to:
|
||
|
||
- usmUserAuthKeyChange, usmUserOwnAuthKeyChange
|
||
and usmUserPublic for a user who employs
|
||
authentication, and
|
||
- usmUserPrivKeyChange, usmUserOwnPrivKeyChange
|
||
and usmUserPublic for a user who employs
|
||
privacy.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 48]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
Note that any user who employs authentication or
|
||
privacy must allow its secret(s) to be updated and
|
||
thus cannot be 'readOnly'.
|
||
|
||
If an initial set operation tries to set the value to
|
||
'readOnly' for a user who employs authentication or
|
||
privacy, then an 'inconsistentValue' error must be
|
||
returned. Note that if the value has been previously
|
||
set (implicit or explicit) to any value, then the rules
|
||
as defined in the StorageType Textual Convention apply.
|
||
|
||
It is an implementation issue to decide if a SET for
|
||
a readOnly or permanent row is accepted at all. In some
|
||
contexts this may make sense, in others it may not. If
|
||
a SET for a readOnly or permanent row is not accepted
|
||
at all, then a 'wrongValue' error must be returned.
|
||
"
|
||
DEFVAL { nonVolatile }
|
||
::= { usmUserEntry 12 }
|
||
|
||
usmUserStatus OBJECT-TYPE
|
||
SYNTAX RowStatus
|
||
MAX-ACCESS read-create
|
||
STATUS current
|
||
DESCRIPTION "The status of this conceptual row.
|
||
|
||
Until instances of all corresponding columns are
|
||
appropriately configured, the value of the
|
||
corresponding instance of the usmUserStatus column
|
||
is 'notReady'.
|
||
|
||
In particular, a newly created row for a user who
|
||
employs authentication, cannot be made active until the
|
||
corresponding usmUserCloneFrom and usmUserAuthKeyChange
|
||
have been set.
|
||
|
||
Further, a newly created row for a user who also
|
||
employs privacy, cannot be made active until the
|
||
usmUserPrivKeyChange has been set.
|
||
|
||
The RowStatus TC [RFC2579] requires that this
|
||
DESCRIPTION clause states under which circumstances
|
||
other objects in this row can be modified:
|
||
|
||
The value of this object has no effect on whether
|
||
other objects in this conceptual row can be modified,
|
||
except for usmUserOwnAuthKeyChange and
|
||
usmUserOwnPrivKeyChange. For these 2 objects, the
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 49]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
value of usmUserStatus MUST be active.
|
||
"
|
||
::= { usmUserEntry 13 }
|
||
|
||
-- Conformance Information *******************************************
|
||
|
||
usmMIBCompliances OBJECT IDENTIFIER ::= { usmMIBConformance 1 }
|
||
usmMIBGroups OBJECT IDENTIFIER ::= { usmMIBConformance 2 }
|
||
|
||
-- Compliance statements
|
||
|
||
usmMIBCompliance MODULE-COMPLIANCE
|
||
STATUS current
|
||
DESCRIPTION "The compliance statement for SNMP engines which
|
||
implement the SNMP-USER-BASED-SM-MIB.
|
||
"
|
||
|
||
MODULE -- this module
|
||
MANDATORY-GROUPS { usmMIBBasicGroup }
|
||
|
||
OBJECT usmUserAuthProtocol
|
||
MIN-ACCESS read-only
|
||
DESCRIPTION "Write access is not required."
|
||
|
||
OBJECT usmUserPrivProtocol
|
||
MIN-ACCESS read-only
|
||
DESCRIPTION "Write access is not required."
|
||
|
||
::= { usmMIBCompliances 1 }
|
||
|
||
-- Units of compliance
|
||
usmMIBBasicGroup OBJECT-GROUP
|
||
OBJECTS {
|
||
usmStatsUnsupportedSecLevels,
|
||
usmStatsNotInTimeWindows,
|
||
usmStatsUnknownUserNames,
|
||
usmStatsUnknownEngineIDs,
|
||
usmStatsWrongDigests,
|
||
usmStatsDecryptionErrors,
|
||
usmUserSpinLock,
|
||
usmUserSecurityName,
|
||
usmUserCloneFrom,
|
||
usmUserAuthProtocol,
|
||
usmUserAuthKeyChange,
|
||
usmUserOwnAuthKeyChange,
|
||
usmUserPrivProtocol,
|
||
usmUserPrivKeyChange,
|
||
usmUserOwnPrivKeyChange,
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 50]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
usmUserPublic,
|
||
usmUserStorageType,
|
||
usmUserStatus
|
||
}
|
||
STATUS current
|
||
DESCRIPTION "A collection of objects providing for configuration
|
||
of an SNMP engine which implements the SNMP
|
||
User-based Security Model.
|
||
"
|
||
::= { usmMIBGroups 1 }
|
||
|
||
END
|
||
|
||
6. HMAC-MD5-96 Authentication Protocol
|
||
|
||
This section describes the HMAC-MD5-96 authentication protocol. This
|
||
authentication protocol is the first defined for the User-based
|
||
Security Model. It uses MD5 hash-function which is described in
|
||
[RFC1321], in HMAC mode described in [RFC2104], truncating the output
|
||
to 96 bits.
|
||
|
||
This protocol is identified by usmHMACMD5AuthProtocol.
|
||
|
||
Over time, other authentication protocols may be defined either as a
|
||
replacement of this protocol or in addition to this protocol.
|
||
|
||
6.1. Mechanisms
|
||
|
||
- In support of data integrity, a message digest algorithm is
|
||
required. A digest is calculated over an appropriate portion of an
|
||
SNMP message and included as part of the message sent to the
|
||
recipient.
|
||
|
||
- In support of data origin authentication and data integrity, a
|
||
secret value is prepended to SNMP message prior to computing the
|
||
digest; the calculated digest is partially inserted into the SNMP
|
||
message prior to transmission, and the prepended value is not
|
||
transmitted. The secret value is shared by all SNMP engines
|
||
authorized to originate messages on behalf of the appropriate user.
|
||
|
||
6.1.1. Digest Authentication Mechanism
|
||
|
||
The Digest Authentication Mechanism defined in this memo provides
|
||
for:
|
||
|
||
- verification of the integrity of a received message, i.e., the
|
||
message received is the message sent.
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 51]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
The integrity of the message is protected by computing a digest
|
||
over an appropriate portion of the message. The digest is computed
|
||
by the originator of the message, transmitted with the message, and
|
||
verified by the recipient of the message.
|
||
|
||
- verification of the user on whose behalf the message was generated.
|
||
|
||
A secret value known only to SNMP engines authorized to generate
|
||
messages on behalf of a user is used in HMAC mode (see [RFC2104]).
|
||
It also recommends the hash-function output used as Message
|
||
Authentication Code, to be truncated.
|
||
|
||
This protocol uses the MD5 [RFC1321] message digest algorithm. A
|
||
128-bit MD5 digest is calculated in a special (HMAC) way over the
|
||
designated portion of an SNMP message and the first 96 bits of this
|
||
digest is included as part of the message sent to the recipient. The
|
||
size of the digest carried in a message is 12 octets. The size of
|
||
the private authentication key (the secret) is 16 octets. For the
|
||
details see section 6.3.
|
||
|
||
6.2. Elements of the Digest Authentication Protocol
|
||
|
||
This section contains definitions required to realize the
|
||
authentication module defined in this section of this memo.
|
||
|
||
6.2.1. Users
|
||
|
||
Authentication using this authentication protocol makes use of a
|
||
defined set of userNames. For any user on whose behalf a message
|
||
must be authenticated at a particular SNMP engine, that SNMP engine
|
||
must have knowledge of that user. An SNMP engine that wishes to
|
||
communicate with another SNMP engine must also have knowledge of a
|
||
user known to that engine, including knowledge of the applicable
|
||
attributes of that user.
|
||
|
||
A user and its attributes are defined as follows:
|
||
|
||
<userName>
|
||
A string representing the name of the user.
|
||
<authKey>
|
||
A user's secret key to be used when calculating a digest.
|
||
It MUST be 16 octets long for MD5.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 52]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
6.2.2. msgAuthoritativeEngineID
|
||
|
||
The msgAuthoritativeEngineID value contained in an authenticated
|
||
message specifies the authoritative SNMP engine for that particular
|
||
message (see the definition of SnmpEngineID in the SNMP Architecture
|
||
document [RFC3411]).
|
||
|
||
The user's (private) authentication key is normally different at each
|
||
authoritative SNMP engine and so the snmpEngineID is used to select
|
||
the proper key for the authentication process.
|
||
|
||
6.2.3. SNMP Messages Using this Authentication Protocol
|
||
|
||
Messages using this authentication protocol carry a
|
||
msgAuthenticationParameters field as part of the
|
||
msgSecurityParameters. For this protocol, the
|
||
msgAuthenticationParameters field is the serialized OCTET STRING
|
||
representing the first 12 octets of the HMAC-MD5-96 output done over
|
||
the wholeMsg.
|
||
|
||
The digest is calculated over the wholeMsg so if a message is
|
||
authenticated, that also means that all the fields in the message are
|
||
intact and have not been tampered with.
|
||
|
||
6.2.4. Services provided by the HMAC-MD5-96 Authentication Module
|
||
|
||
This section describes the inputs and outputs that the HMAC-MD5-96
|
||
Authentication module expects and produces when the User-based
|
||
Security module calls the HMAC-MD5-96 Authentication module for
|
||
services.
|
||
|
||
6.2.4.1. Services for Generating an Outgoing SNMP Message
|
||
|
||
The HMAC-MD5-96 authentication protocol assumes that the selection of
|
||
the authKey is done by the caller and that the caller passes the
|
||
secret key to be used.
|
||
|
||
Upon completion the authentication module returns statusInformation
|
||
and, if the message digest was correctly calculated, the wholeMsg
|
||
with the digest inserted at the proper place. The abstract service
|
||
primitive is:
|
||
|
||
statusInformation = -- success or failure
|
||
authenticateOutgoingMsg(
|
||
IN authKey -- secret key for authentication
|
||
IN wholeMsg -- unauthenticated complete message
|
||
OUT authenticatedWholeMsg -- complete authenticated message
|
||
)
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 53]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
The abstract data elements are:
|
||
|
||
statusInformation
|
||
An indication of whether the authentication process was successful.
|
||
If not it is an indication of the problem.
|
||
|
||
authKey
|
||
The secret key to be used by the authentication algorithm. The
|
||
length of this key MUST be 16 octets.
|
||
|
||
wholeMsg
|
||
The message to be authenticated.
|
||
|
||
authenticatedWholeMsg
|
||
The authenticated message (including inserted digest) on output.
|
||
|
||
Note, that authParameters field is filled by the authentication
|
||
module and this module and this field should be already present in
|
||
the wholeMsg before the Message Authentication Code (MAC) is
|
||
generated.
|
||
|
||
6.2.4.2. Services for Processing an Incoming SNMP Message
|
||
|
||
The HMAC-MD5-96 authentication protocol assumes that the selection of
|
||
the authKey is done by the caller and that the caller passes the
|
||
secret key to be used.
|
||
|
||
Upon completion the authentication module returns statusInformation
|
||
and, if the message digest was correctly calculated, the wholeMsg as
|
||
it was processed. The abstract service primitive is:
|
||
|
||
statusInformation = -- success or failure
|
||
authenticateIncomingMsg(
|
||
IN authKey -- secret key for authentication
|
||
IN authParameters -- as received on the wire
|
||
IN wholeMsg -- as received on the wire
|
||
OUT authenticatedWholeMsg -- complete authenticated message
|
||
)
|
||
|
||
The abstract data elements are:
|
||
|
||
statusInformation
|
||
An indication of whether the authentication process was successful.
|
||
If not it is an indication of the problem.
|
||
|
||
authKey
|
||
The secret key to be used by the authentication algorithm. The
|
||
length of this key MUST be 16 octets.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 54]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
authParameters
|
||
The authParameters from the incoming message.
|
||
|
||
wholeMsg
|
||
The message to be authenticated on input and the authenticated
|
||
message on output.
|
||
|
||
authenticatedWholeMsg
|
||
The whole message after the authentication check is complete.
|
||
|
||
6.3. Elements of Procedure
|
||
|
||
This section describes the procedures for the HMAC-MD5-96
|
||
authentication protocol.
|
||
|
||
6.3.1. Processing an Outgoing Message
|
||
|
||
This section describes the procedure followed by an SNMP engine
|
||
whenever it must authenticate an outgoing message using the
|
||
usmHMACMD5AuthProtocol.
|
||
|
||
1) The msgAuthenticationParameters field is set to the serialization,
|
||
according to the rules in [RFC3417], of an OCTET STRING containing
|
||
12 zero octets.
|
||
|
||
2) From the secret authKey, two keys K1 and K2 are derived:
|
||
|
||
a) extend the authKey to 64 octets by appending 48 zero octets;
|
||
save it as extendedAuthKey
|
||
|
||
b) obtain IPAD by replicating the octet 0x36 64 times;
|
||
|
||
c) obtain K1 by XORing extendedAuthKey with IPAD;
|
||
|
||
d) obtain OPAD by replicating the octet 0x5C 64 times;
|
||
|
||
e) obtain K2 by XORing extendedAuthKey with OPAD.
|
||
|
||
3) Prepend K1 to the wholeMsg and calculate MD5 digest over it
|
||
according to [RFC1321].
|
||
|
||
4) Prepend K2 to the result of the step 4 and calculate MD5 digest
|
||
over it according to [RFC1321]. Take the first 12 octets of the
|
||
final digest - this is Message Authentication Code (MAC).
|
||
|
||
5) Replace the msgAuthenticationParameters field with MAC obtained in
|
||
the step 4.
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 55]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
6) The authenticatedWholeMsg is then returned to the caller together
|
||
with statusInformation indicating success.
|
||
|
||
6.3.2. Processing an Incoming Message
|
||
|
||
This section describes the procedure followed by an SNMP engine
|
||
whenever it must authenticate an incoming message using the
|
||
usmHMACMD5AuthProtocol.
|
||
|
||
1) If the digest received in the msgAuthenticationParameters field is
|
||
not 12 octets long, then an failure and an errorIndication
|
||
(authenticationError) is returned to the calling module.
|
||
|
||
2) The MAC received in the msgAuthenticationParameters field is
|
||
saved.
|
||
|
||
3) The digest in the msgAuthenticationParameters field is replaced by
|
||
the 12 zero octets.
|
||
|
||
4) From the secret authKey, two keys K1 and K2 are derived:
|
||
|
||
a) extend the authKey to 64 octets by appending 48 zero octets;
|
||
save it as extendedAuthKey
|
||
|
||
b) obtain IPAD by replicating the octet 0x36 64 times;
|
||
|
||
c) obtain K1 by XORing extendedAuthKey with IPAD;
|
||
|
||
d) obtain OPAD by replicating the octet 0x5C 64 times;
|
||
|
||
e) obtain K2 by XORing extendedAuthKey with OPAD.
|
||
|
||
5) The MAC is calculated over the wholeMsg:
|
||
|
||
a) prepend K1 to the wholeMsg and calculate the MD5 digest over
|
||
it;
|
||
|
||
b) prepend K2 to the result of step 5.a and calculate the MD5
|
||
digest over it;
|
||
|
||
c) first 12 octets of the result of step 5.b is the MAC.
|
||
|
||
The msgAuthenticationParameters field is replaced with the MAC
|
||
value that was saved in step 2.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 56]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
6) Then the newly calculated MAC is compared with the MAC saved in
|
||
step 2. If they do not match, then an failure and an
|
||
errorIndication (authenticationFailure) is returned to the calling
|
||
module.
|
||
|
||
7) The authenticatedWholeMsg and statusInformation indicating success
|
||
are then returned to the caller.
|
||
|
||
7. HMAC-SHA-96 Authentication Protocol
|
||
|
||
This section describes the HMAC-SHA-96 authentication protocol. This
|
||
protocol uses the SHA hash-function which is described in [SHA-NIST],
|
||
in HMAC mode described in [RFC2104], truncating the output to 96
|
||
bits.
|
||
|
||
This protocol is identified by usmHMACSHAAuthProtocol.
|
||
|
||
Over time, other authentication protocols may be defined either as a
|
||
replacement of this protocol or in addition to this protocol.
|
||
|
||
7.1. Mechanisms
|
||
|
||
- In support of data integrity, a message digest algorithm is
|
||
required. A digest is calculated over an appropriate portion of an
|
||
SNMP message and included as part of the message sent to the
|
||
recipient.
|
||
|
||
- In support of data origin authentication and data integrity, a
|
||
secret value is prepended to the SNMP message prior to computing
|
||
the digest; the calculated digest is then partially inserted into
|
||
the message prior to transmission. The prepended secret is not
|
||
transmitted. The secret value is shared by all SNMP engines
|
||
authorized to originate messages on behalf of the appropriate user.
|
||
|
||
7.1.1. Digest Authentication Mechanism
|
||
|
||
The Digest Authentication Mechanism defined in this memo provides
|
||
for:
|
||
|
||
- verification of the integrity of a received message, i.e., the
|
||
message received is the message sent.
|
||
|
||
The integrity of the message is protected by computing a digest
|
||
over an appropriate portion of the message. The digest is computed
|
||
by the originator of the message, transmitted with the message, and
|
||
verified by the recipient of the message.
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 57]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
- verification of the user on whose behalf the message was generated.
|
||
|
||
A secret value known only to SNMP engines authorized to generate
|
||
messages on behalf of a user is used in HMAC mode (see [RFC2104]).
|
||
It also recommends the hash-function output used as Message
|
||
Authentication Code, to be truncated.
|
||
|
||
This mechanism uses the SHA [SHA-NIST] message digest algorithm. A
|
||
160-bit SHA digest is calculated in a special (HMAC) way over the
|
||
designated portion of an SNMP message and the first 96 bits of this
|
||
digest is included as part of the message sent to the recipient. The
|
||
size of the digest carried in a message is 12 octets. The size of
|
||
the private authentication key (the secret) is 20 octets. For the
|
||
details see section 7.3.
|
||
|
||
7.2. Elements of the HMAC-SHA-96 Authentication Protocol
|
||
|
||
This section contains definitions required to realize the
|
||
authentication module defined in this section of this memo.
|
||
|
||
7.2.1. Users
|
||
|
||
Authentication using this authentication protocol makes use of a
|
||
defined set of userNames. For any user on whose behalf a message
|
||
must be authenticated at a particular SNMP engine, that SNMP engine
|
||
must have knowledge of that user. An SNMP engine that wishes to
|
||
communicate with another SNMP engine must also have knowledge of a
|
||
user known to that engine, including knowledge of the applicable
|
||
attributes of that user.
|
||
|
||
A user and its attributes are defined as follows:
|
||
|
||
<userName>
|
||
A string representing the name of the user.
|
||
<authKey>
|
||
A user's secret key to be used when calculating a digest.
|
||
It MUST be 20 octets long for SHA.
|
||
|
||
7.2.2. msgAuthoritativeEngineID
|
||
|
||
The msgAuthoritativeEngineID value contained in an authenticated
|
||
message specifies the authoritative SNMP engine for that particular
|
||
message (see the definition of SnmpEngineID in the SNMP Architecture
|
||
document [RFC3411]).
|
||
|
||
The user's (private) authentication key is normally different at each
|
||
authoritative SNMP engine and so the snmpEngineID is used to select
|
||
the proper key for the authentication process.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 58]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
7.2.3. SNMP Messages Using this Authentication Protocol
|
||
|
||
Messages using this authentication protocol carry a
|
||
msgAuthenticationParameters field as part of the
|
||
msgSecurityParameters. For this protocol, the
|
||
msgAuthenticationParameters field is the serialized OCTET STRING
|
||
representing the first 12 octets of HMAC-SHA-96 output done over the
|
||
wholeMsg.
|
||
|
||
The digest is calculated over the wholeMsg so if a message is
|
||
authenticated, that also means that all the fields in the message are
|
||
intact and have not been tampered with.
|
||
|
||
7.2.4. Services Provided by the HMAC-SHA-96 Authentication Module
|
||
|
||
This section describes the inputs and outputs that the HMAC-SHA-96
|
||
Authentication module expects and produces when the User-based
|
||
Security module calls the HMAC-SHA-96 Authentication module for
|
||
services.
|
||
|
||
7.2.4.1. Services for Generating an Outgoing SNMP Message
|
||
|
||
HMAC-SHA-96 authentication protocol assumes that the selection of the
|
||
authKey is done by the caller and that the caller passes the secret
|
||
key to be used.
|
||
|
||
Upon completion the authentication module returns statusInformation
|
||
and, if the message digest was correctly calculated, the wholeMsg
|
||
with the digest inserted at the proper place. The abstract service
|
||
primitive is:
|
||
|
||
statusInformation = -- success or failure
|
||
authenticateOutgoingMsg(
|
||
IN authKey -- secret key for authentication
|
||
IN wholeMsg -- unauthenticated complete message
|
||
OUT authenticatedWholeMsg -- complete authenticated message
|
||
)
|
||
|
||
The abstract data elements are:
|
||
|
||
statusInformation
|
||
An indication of whether the authentication process was successful.
|
||
If not it is an indication of the problem.
|
||
|
||
authKey
|
||
The secret key to be used by the authentication algorithm. The
|
||
length of this key MUST be 20 octets.
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 59]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
wholeMsg
|
||
The message to be authenticated.
|
||
|
||
authenticatedWholeMsg
|
||
The authenticated message (including inserted digest) on output.
|
||
|
||
Note, that authParameters field is filled by the authentication
|
||
module and this field should be already present in the wholeMsg
|
||
before the Message Authentication Code (MAC) is generated.
|
||
|
||
7.2.4.2. Services for Processing an Incoming SNMP Message
|
||
|
||
HMAC-SHA-96 authentication protocol assumes that the selection of the
|
||
authKey is done by the caller and that the caller passes the secret
|
||
key to be used.
|
||
|
||
Upon completion the authentication module returns statusInformation
|
||
and, if the message digest was correctly calculated, the wholeMsg as
|
||
it was processed. The abstract service primitive is:
|
||
|
||
statusInformation = -- success or failure
|
||
authenticateIncomingMsg(
|
||
IN authKey -- secret key for authentication
|
||
IN authParameters -- as received on the wire
|
||
IN wholeMsg -- as received on the wire
|
||
OUT authenticatedWholeMsg -- complete authenticated message
|
||
)
|
||
|
||
The abstract data elements are:
|
||
|
||
statusInformation
|
||
An indication of whether the authentication process was successful.
|
||
If not it is an indication of the problem.
|
||
|
||
authKey
|
||
The secret key to be used by the authentication algorithm. The
|
||
length of this key MUST be 20 octets.
|
||
|
||
authParameters
|
||
The authParameters from the incoming message.
|
||
|
||
wholeMsg
|
||
The message to be authenticated on input and the authenticated
|
||
message on output.
|
||
|
||
authenticatedWholeMsg
|
||
The whole message after the authentication check is complete.
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 60]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
7.3. Elements of Procedure
|
||
|
||
This section describes the procedures for the HMAC-SHA-96
|
||
authentication protocol.
|
||
|
||
7.3.1. Processing an Outgoing Message
|
||
|
||
This section describes the procedure followed by an SNMP engine
|
||
whenever it must authenticate an outgoing message using the
|
||
usmHMACSHAAuthProtocol.
|
||
|
||
1) The msgAuthenticationParameters field is set to the serialization,
|
||
according to the rules in [RFC3417], of an OCTET STRING containing
|
||
12 zero octets.
|
||
|
||
2) From the secret authKey, two keys K1 and K2 are derived:
|
||
|
||
a) extend the authKey to 64 octets by appending 44 zero octets;
|
||
save it as extendedAuthKey
|
||
|
||
b) obtain IPAD by replicating the octet 0x36 64 times;
|
||
|
||
c) obtain K1 by XORing extendedAuthKey with IPAD;
|
||
|
||
d) obtain OPAD by replicating the octet 0x5C 64 times;
|
||
|
||
e) obtain K2 by XORing extendedAuthKey with OPAD.
|
||
|
||
3) Prepend K1 to the wholeMsg and calculate the SHA digest over it
|
||
according to [SHA-NIST].
|
||
|
||
4) Prepend K2 to the result of the step 4 and calculate SHA digest
|
||
over it according to [SHA-NIST]. Take the first 12 octets of the
|
||
final digest - this is Message Authentication Code (MAC).
|
||
|
||
5) Replace the msgAuthenticationParameters field with MAC obtained in
|
||
the step 5.
|
||
|
||
6) The authenticatedWholeMsg is then returned to the caller together
|
||
with statusInformation indicating success.
|
||
|
||
7.3.2. Processing an Incoming Message
|
||
|
||
This section describes the procedure followed by an SNMP engine
|
||
whenever it must authenticate an incoming message using the
|
||
usmHMACSHAAuthProtocol.
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 61]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
1) If the digest received in the msgAuthenticationParameters field is
|
||
not 12 octets long, then an failure and an errorIndication
|
||
(authenticationError) is returned to the calling module.
|
||
|
||
2) The MAC received in the msgAuthenticationParameters field is
|
||
saved.
|
||
|
||
3) The digest in the msgAuthenticationParameters field is replaced by
|
||
the 12 zero octets.
|
||
|
||
4) From the secret authKey, two keys K1 and K2 are derived:
|
||
|
||
a) extend the authKey to 64 octets by appending 44 zero octets;
|
||
save it as extendedAuthKey
|
||
|
||
b) obtain IPAD by replicating the octet 0x36 64 times;
|
||
|
||
c) obtain K1 by XORing extendedAuthKey with IPAD;
|
||
|
||
d) obtain OPAD by replicating the octet 0x5C 64 times;
|
||
|
||
e) obtain K2 by XORing extendedAuthKey with OPAD.
|
||
|
||
5) The MAC is calculated over the wholeMsg:
|
||
|
||
a) prepend K1 to the wholeMsg and calculate the SHA digest over
|
||
it;
|
||
|
||
b) prepend K2 to the result of step 5.a and calculate the SHA
|
||
digest over it;
|
||
|
||
c) first 12 octets of the result of step 5.b is the MAC.
|
||
|
||
The msgAuthenticationParameters field is replaced with the MAC
|
||
value that was saved in step 2.
|
||
|
||
6) The the newly calculated MAC is compared with the MAC saved in
|
||
step 2. If they do not match, then a failure and an
|
||
errorIndication (authenticationFailure) are returned to the
|
||
calling module.
|
||
|
||
7) The authenticatedWholeMsg and statusInformation indicating success
|
||
are then returned to the caller.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 62]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
8. CBC-DES Symmetric Encryption Protocol
|
||
|
||
This section describes the CBC-DES Symmetric Encryption Protocol.
|
||
This protocol is the first privacy protocol defined for the
|
||
User-based Security Model.
|
||
|
||
This protocol is identified by usmDESPrivProtocol.
|
||
|
||
Over time, other privacy protocols may be defined either as a
|
||
replacement of this protocol or in addition to this protocol.
|
||
|
||
8.1. Mechanisms
|
||
|
||
- In support of data confidentiality, an encryption algorithm is
|
||
required. An appropriate portion of the message is encrypted prior
|
||
to being transmitted. The User-based Security Model specifies that
|
||
the scopedPDU is the portion of the message that needs to be
|
||
encrypted.
|
||
|
||
- A secret value in combination with a timeliness value is used to
|
||
create the en/decryption key and the initialization vector. The
|
||
secret value is shared by all SNMP engines authorized to originate
|
||
messages on behalf of the appropriate user.
|
||
|
||
8.1.1. Symmetric Encryption Protocol
|
||
|
||
The Symmetric Encryption Protocol defined in this memo provides
|
||
support for data confidentiality. The designated portion of an SNMP
|
||
message is encrypted and included as part of the message sent to the
|
||
recipient.
|
||
|
||
Two organizations have published specifications defining the DES:
|
||
the National Institute of Standards and Technology (NIST) [DES-NIST]
|
||
and the American National Standards Institute [DES-ANSI]. There is a
|
||
companion Modes of Operation specification for each definition
|
||
([DESO-NIST] and [DESO-ANSI], respectively).
|
||
|
||
The NIST has published three additional documents that implementors
|
||
may find useful.
|
||
|
||
- There is a document with guidelines for implementing and using the
|
||
DES, including functional specifications for the DES and its modes
|
||
of operation [DESG-NIST].
|
||
|
||
- There is a specification of a validation test suite for the DES
|
||
[DEST-NIST]. The suite is designed to test all aspects of the DES
|
||
and is useful for pinpointing specific problems.
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 63]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
- There is a specification of a maintenance test for the DES [DESM-
|
||
NIST]. The test utilizes a minimal amount of data and processing
|
||
to test all components of the DES. It provides a simple yes-or-no
|
||
indication of correct operation and is useful to run as part of an
|
||
initialization step, e.g., when a computer re-boots.
|
||
|
||
8.1.1.1. DES key and Initialization Vector
|
||
|
||
The first 8 octets of the 16-octet secret (private privacy key) are
|
||
used as a DES key. Since DES uses only 56 bits, the Least
|
||
Significant Bit in each octet is disregarded.
|
||
|
||
The Initialization Vector for encryption is obtained using the
|
||
following procedure.
|
||
|
||
The last 8 octets of the 16-octet secret (private privacy key) are
|
||
used as pre-IV.
|
||
|
||
In order to ensure that the IV for two different packets encrypted by
|
||
the same key, are not the same (i.e., the IV does not repeat) we need
|
||
to "salt" the pre-IV with something unique per packet. An 8-octet
|
||
string is used as the "salt". The concatenation of the generating
|
||
SNMP engine's 32-bit snmpEngineBoots and a local 32-bit integer, that
|
||
the encryption engine maintains, is input to the "salt". The 32-bit
|
||
integer is initialized to an arbitrary value at boot time.
|
||
|
||
The 32-bit snmpEngineBoots is converted to the first 4 octets (Most
|
||
Significant Byte first) of our "salt". The 32-bit integer is then
|
||
converted to the last 4 octet (Most Significant Byte first) of our
|
||
"salt". The resulting "salt" is then XOR-ed with the pre-IV to
|
||
obtain the IV. The 8-octet "salt" is then put into the
|
||
privParameters field encoded as an OCTET STRING. The "salt" integer
|
||
is then modified. We recommend that it be incremented by one and
|
||
wrap when it reaches the maximum value.
|
||
|
||
How exactly the value of the "salt" (and thus of the IV) varies, is
|
||
an implementation issue, as long as the measures are taken to avoid
|
||
producing a duplicate IV.
|
||
|
||
The "salt" must be placed in the privParameters field to enable the
|
||
receiving entity to compute the correct IV and to decrypt the
|
||
message.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 64]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
8.1.1.2. Data Encryption
|
||
|
||
The data to be encrypted is treated as sequence of octets. Its
|
||
length should be an integral multiple of 8 - and if it is not, the
|
||
data is padded at the end as necessary. The actual pad value is
|
||
irrelevant.
|
||
|
||
The data is encrypted in Cipher Block Chaining mode.
|
||
|
||
The plaintext is divided into 64-bit blocks.
|
||
|
||
The plaintext for each block is XOR-ed with the ciphertext of the
|
||
previous block, the result is encrypted and the output of the
|
||
encryption is the ciphertext for the block. This procedure is
|
||
repeated until there are no more plaintext blocks.
|
||
|
||
For the very first block, the Initialization Vector is used instead
|
||
of the ciphertext of the previous block.
|
||
|
||
8.1.1.3. Data Decryption
|
||
|
||
Before decryption, the encrypted data length is verified. If the
|
||
length of the OCTET STRING to be decrypted is not an integral
|
||
multiple of 8 octets, the decryption process is halted and an
|
||
appropriate exception noted. When decrypting, the padding is
|
||
ignored.
|
||
|
||
The first ciphertext block is decrypted, the decryption output is
|
||
XOR-ed with the Initialization Vector, and the result is the first
|
||
plaintext block.
|
||
|
||
For each subsequent block, the ciphertext block is decrypted, the
|
||
decryption output is XOR-ed with the previous ciphertext block and
|
||
the result is the plaintext block.
|
||
|
||
8.2. Elements of the DES Privacy Protocol
|
||
|
||
This section contains definitions required to realize the privacy
|
||
module defined by this memo.
|
||
|
||
8.2.1. Users
|
||
|
||
Data en/decryption using this Symmetric Encryption Protocol makes use
|
||
of a defined set of userNames. For any user on whose behalf a
|
||
message must be en/decrypted at a particular SNMP engine, that SNMP
|
||
engine must have knowledge of that user. An SNMP engine that wishes
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 65]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
to communicate with another SNMP engine must also have knowledge of a
|
||
user known to that SNMP engine, including knowledge of the applicable
|
||
attributes of that user.
|
||
|
||
A user and its attributes are defined as follows:
|
||
|
||
<userName>
|
||
An octet string representing the name of the user.
|
||
|
||
<privKey>
|
||
A user's secret key to be used as input for the DES key and IV.
|
||
The length of this key MUST be 16 octets.
|
||
|
||
8.2.2. msgAuthoritativeEngineID
|
||
|
||
The msgAuthoritativeEngineID value contained in an authenticated
|
||
message specifies the authoritative SNMP engine for that particular
|
||
message (see the definition of SnmpEngineID in the SNMP Architecture
|
||
document [RFC3411]).
|
||
|
||
The user's (private) privacy key is normally different at each
|
||
authoritative SNMP engine and so the snmpEngineID is used to select
|
||
the proper key for the en/decryption process.
|
||
|
||
8.2.3. SNMP Messages Using this Privacy Protocol
|
||
|
||
Messages using this privacy protocol carry a msgPrivacyParameters
|
||
field as part of the msgSecurityParameters. For this protocol, the
|
||
msgPrivacyParameters field is the serialized OCTET STRING
|
||
representing the "salt" that was used to create the IV.
|
||
|
||
8.2.4. Services Provided by the DES Privacy Module
|
||
|
||
This section describes the inputs and outputs that the DES Privacy
|
||
module expects and produces when the User-based Security module
|
||
invokes the DES Privacy module for services.
|
||
|
||
8.2.4.1. Services for Encrypting Outgoing Data
|
||
|
||
This DES privacy protocol assumes that the selection of the privKey
|
||
is done by the caller and that the caller passes the secret key to be
|
||
used.
|
||
|
||
Upon completion the privacy module returns statusInformation and, if
|
||
the encryption process was successful, the encryptedPDU and the
|
||
msgPrivacyParameters encoded as an OCTET STRING. The abstract
|
||
service primitive is:
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 66]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
statusInformation = -- success of failure
|
||
encryptData(
|
||
IN encryptKey -- secret key for encryption
|
||
IN dataToEncrypt -- data to encrypt (scopedPDU)
|
||
OUT encryptedData -- encrypted data (encryptedPDU)
|
||
OUT privParameters -- filled in by service provider
|
||
)
|
||
|
||
The abstract data elements are:
|
||
|
||
statusInformation
|
||
An indication of the success or failure of the encryption process.
|
||
In case of failure, it is an indication of the error.
|
||
|
||
encryptKey
|
||
The secret key to be used by the encryption algorithm. The length
|
||
of this key MUST be 16 octets.
|
||
|
||
dataToEncrypt
|
||
The data that must be encrypted.
|
||
|
||
encryptedData
|
||
The encrypted data upon successful completion.
|
||
|
||
privParameters
|
||
The privParameters encoded as an OCTET STRING.
|
||
|
||
8.2.4.2. Services for Decrypting Incoming Data
|
||
|
||
This DES privacy protocol assumes that the selection of the privKey
|
||
is done by the caller and that the caller passes the secret key to be
|
||
used.
|
||
|
||
Upon completion the privacy module returns statusInformation and, if
|
||
the decryption process was successful, the scopedPDU in plain text.
|
||
The abstract service primitive is:
|
||
|
||
statusInformation =
|
||
decryptData(
|
||
IN decryptKey -- secret key for decryption
|
||
IN privParameters -- as received on the wire
|
||
IN encryptedData -- encrypted data (encryptedPDU)
|
||
OUT decryptedData -- decrypted data (scopedPDU)
|
||
)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 67]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
The abstract data elements are:
|
||
|
||
statusInformation
|
||
An indication whether the data was successfully decrypted and if
|
||
not an indication of the error.
|
||
|
||
decryptKey
|
||
The secret key to be used by the decryption algorithm. The length
|
||
of this key MUST be 16 octets.
|
||
|
||
privParameters
|
||
The "salt" to be used to calculate the IV.
|
||
|
||
encryptedData
|
||
The data to be decrypted.
|
||
|
||
decryptedData
|
||
The decrypted data.
|
||
|
||
8.3. Elements of Procedure.
|
||
|
||
This section describes the procedures for the DES privacy protocol.
|
||
|
||
8.3.1. Processing an Outgoing Message
|
||
|
||
This section describes the procedure followed by an SNMP engine
|
||
whenever it must encrypt part of an outgoing message using the
|
||
usmDESPrivProtocol.
|
||
|
||
1) The secret cryptKey is used to construct the DES encryption key,
|
||
the "salt" and the DES pre-IV (from which the IV is computed as
|
||
described in section 8.1.1.1).
|
||
|
||
2) The privParameters field is set to the serialization according to
|
||
the rules in [RFC3417] of an OCTET STRING representing the "salt"
|
||
string.
|
||
|
||
3) The scopedPDU is encrypted (as described in section 8.1.1.2)
|
||
and the encrypted data is serialized according to the rules in
|
||
[RFC3417] as an OCTET STRING.
|
||
|
||
4) The serialized OCTET STRING representing the encrypted scopedPDU
|
||
together with the privParameters and statusInformation indicating
|
||
success is returned to the calling module.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 68]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
8.3.2. Processing an Incoming Message
|
||
|
||
This section describes the procedure followed by an SNMP engine
|
||
whenever it must decrypt part of an incoming message using the
|
||
usmDESPrivProtocol.
|
||
|
||
1) If the privParameters field is not an 8-octet OCTET STRING, then
|
||
an error indication (decryptionError) is returned to the calling
|
||
module.
|
||
|
||
2) The "salt" is extracted from the privParameters field.
|
||
|
||
3) The secret cryptKey and the "salt" are then used to construct the
|
||
DES decryption key and pre-IV (from which the IV is computed as
|
||
described in section 8.1.1.1).
|
||
|
||
4) The encryptedPDU is then decrypted (as described in section
|
||
8.1.1.3).
|
||
|
||
5) If the encryptedPDU cannot be decrypted, then an error indication
|
||
(decryptionError) is returned to the calling module.
|
||
|
||
6) The decrypted scopedPDU and statusInformation indicating success
|
||
are returned to the calling module.
|
||
|
||
9. 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 implementors or users of this specification can
|
||
be obtained from the IETF Secretariat.
|
||
|
||
The IETF invites any interested party to bring to its attention any
|
||
copyrights, patents or patent applications, or other proprietary
|
||
rights which may cover technology that may be required to practice
|
||
this standard. Please address the information to the IETF Executive
|
||
Director.
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 69]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
10. Acknowledgements
|
||
|
||
This document is the result of the efforts of the SNMPv3 Working
|
||
Group. Some special thanks are in order to the following SNMPv3 WG
|
||
members:
|
||
|
||
Harald Tveit Alvestrand (Maxware)
|
||
Dave Battle (SNMP Research, Inc.)
|
||
Alan Beard (Disney Worldwide Services)
|
||
Paul Berrevoets (SWI Systemware/Halcyon Inc.)
|
||
Martin Bjorklund (Ericsson)
|
||
Uri Blumenthal (IBM T.J. Watson Research Center)
|
||
Jeff Case (SNMP Research, Inc.)
|
||
John Curran (BBN)
|
||
Mike Daniele (Compaq Computer Corporation))
|
||
T. Max Devlin (Eltrax Systems)
|
||
John Flick (Hewlett Packard)
|
||
Rob Frye (MCI)
|
||
Wes Hardaker (U.C.Davis, Information Technology - D.C.A.S.)
|
||
David Harrington (Cabletron Systems Inc.)
|
||
Lauren Heintz (BMC Software, Inc.)
|
||
N.C. Hien (IBM T.J. Watson Research Center)
|
||
Michael Kirkham (InterWorking Labs, Inc.)
|
||
Dave Levi (SNMP Research, Inc.)
|
||
Louis A Mamakos (UUNET Technologies Inc.)
|
||
Joe Marzot (Nortel Networks)
|
||
Paul Meyer (Secure Computing Corporation)
|
||
Keith McCloghrie (Cisco Systems)
|
||
Bob Moore (IBM)
|
||
Russ Mundy (TIS Labs at Network Associates)
|
||
Bob Natale (ACE*COMM Corporation)
|
||
Mike O'Dell (UUNET Technologies Inc.)
|
||
Dave Perkins (DeskTalk)
|
||
Peter Polkinghorne (Brunel University)
|
||
Randy Presuhn (BMC Software, Inc.)
|
||
David Reeder (TIS Labs at Network Associates)
|
||
David Reid (SNMP Research, Inc.)
|
||
Aleksey Romanov (Quality Quorum)
|
||
Shawn Routhier (Epilogue)
|
||
Juergen Schoenwaelder (TU Braunschweig)
|
||
Bob Stewart (Cisco Systems)
|
||
Mike Thatcher (Independent Consultant)
|
||
Bert Wijnen (IBM T.J. Watson Research Center)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 70]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
The document is based on recommendations of the IETF Security and
|
||
Administrative Framework Evolution for SNMP Advisory Team. Members
|
||
of that Advisory Team were:
|
||
|
||
David Harrington (Cabletron Systems Inc.)
|
||
Jeff Johnson (Cisco Systems)
|
||
David Levi (SNMP Research Inc.)
|
||
John Linn (Openvision)
|
||
Russ Mundy (Trusted Information Systems) chair
|
||
Shawn Routhier (Epilogue)
|
||
Glenn Waters (Nortel)
|
||
Bert Wijnen (IBM T. J. Watson Research Center)
|
||
|
||
As recommended by the Advisory Team and the SNMPv3 Working Group
|
||
Charter, the design incorporates as much as practical from previous
|
||
RFCs and drafts. As a result, special thanks are due to the authors
|
||
of previous designs known as SNMPv2u and SNMPv2*:
|
||
|
||
Jeff Case (SNMP Research, Inc.)
|
||
David Harrington (Cabletron Systems Inc.)
|
||
David Levi (SNMP Research, Inc.)
|
||
Keith McCloghrie (Cisco Systems)
|
||
Brian O'Keefe (Hewlett Packard)
|
||
Marshall T. Rose (Dover Beach Consulting)
|
||
Jon Saperia (BGS Systems Inc.)
|
||
Steve Waldbusser (International Network Services)
|
||
Glenn W. Waters (Bell-Northern Research Ltd.)
|
||
|
||
11. Security Considerations
|
||
|
||
11.1. Recommended Practices
|
||
|
||
This section describes practices that contribute to the secure,
|
||
effective operation of the mechanisms defined in this memo.
|
||
|
||
- An SNMP engine must discard SNMP Response messages that do not
|
||
correspond to any currently outstanding Request message. It is the
|
||
responsibility of the Message Processing module to take care of
|
||
this. For example it can use a msgID for that.
|
||
|
||
An SNMP Command Generator Application must discard any Response
|
||
Class PDU for which there is no currently outstanding Confirmed
|
||
Class PDU; for example for SNMPv2 [RFC3416] PDUs, the request-id
|
||
component in the PDU can be used to correlate Responses to
|
||
outstanding Requests.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 71]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
Although it would be typical for an SNMP engine and an SNMP Command
|
||
Generator Application to do this as a matter of course, when using
|
||
these security protocols it is significant due to the possibility
|
||
of message duplication (malicious or otherwise).
|
||
|
||
- If an SNMP engine uses a msgID for correlating Response messages to
|
||
outstanding Request messages, then it MUST use different msgIDs in
|
||
all such Request messages that it sends out during a Time Window
|
||
(150 seconds) period.
|
||
|
||
A Command Generator or Notification Originator Application MUST use
|
||
different request-ids in all Request PDUs that it sends out during
|
||
a TimeWindow (150 seconds) period.
|
||
|
||
This must be done to protect against the possibility of message
|
||
duplication (malicious or otherwise).
|
||
|
||
For example, starting operations with a msgID and/or request-id
|
||
value of zero is not a good idea. Initializing them with an
|
||
unpredictable number (so they do not start out the same after each
|
||
reboot) and then incrementing by one would be acceptable.
|
||
|
||
- An SNMP engine should perform time synchronization using
|
||
authenticated messages in order to protect against the possibility
|
||
of message duplication (malicious or otherwise).
|
||
|
||
- When sending state altering messages to a managed authoritative
|
||
SNMP engine, a Command Generator Application should delay sending
|
||
successive messages to that managed SNMP engine until a positive
|
||
acknowledgement is received for the previous message or until the
|
||
previous message expires.
|
||
|
||
No message ordering is imposed by the SNMP. Messages may be
|
||
received in any order relative to their time of generation and each
|
||
will be processed in the ordered received. Note that when an
|
||
authenticated message is sent to a managed SNMP engine, it will be
|
||
valid for a period of time of approximately 150 seconds under
|
||
normal circumstances, and is subject to replay during this period.
|
||
Indeed, an SNMP engine and SNMP Command Generator Applications must
|
||
cope with the loss and re-ordering of messages resulting from
|
||
anomalies in the network as a matter of course.
|
||
|
||
However, a managed object, snmpSetSerialNo [RFC3418], is
|
||
specifically defined for use with SNMP Set operations in order to
|
||
provide a mechanism to ensure that the processing of SNMP messages
|
||
occurs in a specific order.
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 72]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
- The frequency with which the secrets of a User-based Security Model
|
||
user should be changed is indirectly related to the frequency of
|
||
their use.
|
||
|
||
Protecting the secrets from disclosure is critical to the overall
|
||
security of the protocols. Frequent use of a secret provides a
|
||
continued source of data that may be useful to a cryptanalyst in
|
||
exploiting known or perceived weaknesses in an algorithm. Frequent
|
||
changes to the secret avoid this vulnerability.
|
||
|
||
Changing a secret after each use is generally regarded as the most
|
||
secure practice, but a significant amount of overhead may be
|
||
associated with that approach.
|
||
|
||
Note, too, in a local environment the threat of disclosure may be
|
||
less significant, and as such the changing of secrets may be less
|
||
frequent. However, when public data networks are used as the
|
||
communication paths, more caution is prudent.
|
||
|
||
11.2 Defining Users
|
||
|
||
The mechanisms defined in this document employ the notion of users on
|
||
whose behalf messages are sent. How "users" are defined is subject
|
||
to the security policy of the network administration. For example,
|
||
users could be individuals (e.g., "joe" or "jane"), or a particular
|
||
role (e.g., "operator" or "administrator"), or a combination (e.g.,
|
||
"joe-operator", "jane-operator" or "joe-admin"). Furthermore, a user
|
||
may be a logical entity, such as an SNMP Application or a set of SNMP
|
||
Applications, acting on behalf of an individual or role, or set of
|
||
individuals, or set of roles, including combinations.
|
||
|
||
Appendix A describes an algorithm for mapping a user "password" to a
|
||
16/20 octet value for use as either a user's authentication key or
|
||
privacy key (or both). Note however, that using the same password
|
||
(and therefore the same key) for both authentication and privacy is
|
||
very poor security practice and should be strongly discouraged.
|
||
Passwords are often generated, remembered, and input by a human.
|
||
Human-generated passwords may be less than the 16/20 octets required
|
||
by the authentication and privacy protocols, and brute force attacks
|
||
can be quite easy on a relatively short ASCII character set.
|
||
Therefore, the algorithm is Appendix A performs a transformation on
|
||
the password. If the Appendix A algorithm is used, SNMP
|
||
implementations (and SNMP configuration applications) must ensure
|
||
that passwords are at least 8 characters in length. Please note that
|
||
longer passwords with repetitive strings may result in exactly the
|
||
same key. For example, a password 'bertbert' will result in exactly
|
||
the same key as password 'bertbertbert'.
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 73]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
Because the Appendix A algorithm uses such passwords (nearly)
|
||
directly, it is very important that they not be easily guessed. It
|
||
is suggested that they be composed of mixed-case alphanumeric and
|
||
punctuation characters that don't form words or phrases that might be
|
||
found in a dictionary. Longer passwords improve the security of the
|
||
system. Users may wish to input multiword phrases to make their
|
||
password string longer while ensuring that it is memorable.
|
||
|
||
Since it is infeasible for human users to maintain different
|
||
passwords for every SNMP engine, but security requirements strongly
|
||
discourage having the same key for more than one SNMP engine, the
|
||
User-based Security Model employs a compromise proposed in
|
||
[Localized-key]. It derives the user keys for the SNMP engines from
|
||
user's password in such a way that it is practically impossible to
|
||
either determine the user's password, or user's key for another SNMP
|
||
engine from any combination of user's keys on SNMP engines.
|
||
|
||
Note however, that if user's password is disclosed, then key
|
||
localization will not help and network security may be compromised in
|
||
this case. Therefore a user's password or non-localized key MUST NOT
|
||
be stored on a managed device/node. Instead the localized key SHALL
|
||
be stored (if at all), so that, in case a device does get
|
||
compromised, no other managed or managing devices get compromised.
|
||
|
||
11.3. Conformance
|
||
|
||
To be termed a "Secure SNMP implementation" based on the User-based
|
||
Security Model, an SNMP implementation MUST:
|
||
|
||
- implement one or more Authentication Protocol(s). The HMAC-MD5-96
|
||
and HMAC-SHA-96 Authentication Protocols defined in this memo are
|
||
examples of such protocols.
|
||
|
||
- to the maximum extent possible, prohibit access to the secret(s) of
|
||
each user about which it maintains information in a Local
|
||
Configuration Datastore (LCD) under all circumstances except as
|
||
required to generate and/or validate SNMP messages with respect to
|
||
that user.
|
||
|
||
- implement the key-localization mechanism.
|
||
|
||
- implement the SNMP-USER-BASED-SM-MIB.
|
||
|
||
In addition, an authoritative SNMP engine SHOULD provide initial
|
||
configuration in accordance with Appendix A.1.
|
||
|
||
Implementation of a Privacy Protocol (the DES Symmetric Encryption
|
||
Protocol defined in this memo is one such protocol) is optional.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 74]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
11.4. Use of Reports
|
||
|
||
The use of unsecure reports (i.e., sending them with a securityLevel
|
||
of noAuthNoPriv) potentially exposes a non-authoritative SNMP engine
|
||
to some form of attacks. Some people consider these denial of
|
||
service attacks, others don't. An installation should evaluate the
|
||
risk involved before deploying unsecure Report PDUs.
|
||
|
||
11.5 Access to the SNMP-USER-BASED-SM-MIB
|
||
|
||
The objects in this MIB may be considered sensitive in many
|
||
environments. Specifically the objects in the usmUserTable contain
|
||
information about users and their authentication and privacy
|
||
protocols. It is important to closely control (both read and write)
|
||
access to these MIB objects by using appropriately configured Access
|
||
Control models (for example the View-based Access Control Model as
|
||
specified in [RFC3415]).
|
||
|
||
12. References
|
||
|
||
12.1 Normative References
|
||
|
||
[RFC1321] Rivest, R., "Message Digest Algorithm MD5", RFC 1321,
|
||
April 1992.
|
||
|
||
[RFC2104] Krawczyk, H., Bellare, M. and R. Canetti, "HMAC:
|
||
Keyed-Hashing for Message Authentication", RFC 2104,
|
||
February 1997.
|
||
|
||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
|
||
Requirement Levels", BCP 14, RFC 2119, March 1997.
|
||
|
||
[RFC2578] McCloghrie, K., Perkins, D., Schoenwaelder, J., Case,
|
||
J., Rose, M. and S. Waldbusser, "Structure of
|
||
Management Information Version 2 (SMIv2)", STD 58,
|
||
RFC 2578, April 1999.
|
||
|
||
[RFC2579] McCloghrie, K., Perkins, D., Schoenwaelder, J., Case,
|
||
J., Rose, M. and S. Waldbusser, "Textual Conventions
|
||
for SMIv2", STD 58, RFC 2579, April 1999.
|
||
|
||
[RFC2580] McCloghrie, K., Perkins, D., Schoenwaelder, J., Case,
|
||
J., Rose, M. and S. Waldbusser, "Conformance
|
||
Statements for SMIv2", STD 58, RFC 2580, April 1999.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 75]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
[RFC3411] Harrington, D., Presuhn, R. and B. Wijnen, "An
|
||
Architecture for Describing Simple Network Management
|
||
Protocol (SNMP) Management Frameworks", STD 62, RFC
|
||
3411, December 2002.
|
||
|
||
[RFC3412] Case, J., Harrington, D., Presuhn, R. and B. Wijnen,
|
||
"Message Processing and Dispatching for the Simple
|
||
Network Management Protocol (SNMP)", STD 62, RFC
|
||
3412, December 2002.
|
||
|
||
[RFC3415] Wijnen, B., Presuhn, R. and K. McCloghrie, "View-
|
||
based Access Control Model (VACM) for the Simple
|
||
Network Management Protocol (SNMP)", STD 62, RFC
|
||
3415, December 2002.
|
||
|
||
[RFC3416] Presuhn, R., Case, J., McCloghrie, K., Rose, M. and
|
||
S. Waldbusser, "Version 2 of the Protocol Operations
|
||
for the Simple Network Management Protocol (SNMP)",
|
||
STD 62, RFC 3416, December 2002.
|
||
|
||
[RFC3417] Presuhn, R., Case, J., McCloghrie, K., Rose, M. and
|
||
S. Waldbusser, "Transport Mappings for the Simple
|
||
Network Management Protocol (SNMP)", STD 62, RFC
|
||
3417, December 2002.
|
||
|
||
[RFC3418] Presuhn, R., Case, J., McCloghrie, K., Rose, M. and
|
||
S. Waldbusser, "Management Information Base (MIB) for
|
||
the Simple Network Management Protocol (SNMP)", STD
|
||
62, RFC 3418, December 2002.
|
||
|
||
[DES-NIST] Data Encryption Standard, National Institute of
|
||
Standards and Technology. Federal Information
|
||
Processing Standard (FIPS) Publication 46-1.
|
||
Supersedes FIPS Publication 46, (January, 1977;
|
||
reaffirmed January, 1988).
|
||
|
||
[DESO-NIST] DES Modes of Operation, National Institute of
|
||
Standards and Technology. Federal Information
|
||
Processing Standard (FIPS) Publication 81, (December,
|
||
1980).
|
||
|
||
[SHA-NIST] Secure Hash Algorithm. NIST FIPS 180-1, (April, 1995)
|
||
http://csrc.nist.gov/fips/fip180-1.txt (ASCII)
|
||
http://csrc.nist.gov/fips/fip180-1.ps (Postscript)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 76]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
12.1 Informative References
|
||
|
||
[Localized-Key] U. Blumenthal, N. C. Hien, B. Wijnen "Key Derivation
|
||
for Network Management Applications" IEEE Network
|
||
Magazine, April/May issue, 1997.
|
||
|
||
[DES-ANSI] Data Encryption Algorithm, American National
|
||
Standards Institute. ANSI X3.92-1981, (December,
|
||
1980).
|
||
|
||
[DESO-ANSI] Data Encryption Algorithm - Modes of Operation,
|
||
American National Standards Institute. ANSI X3.106-
|
||
1983, (May 1983).
|
||
|
||
[DESG-NIST] Guidelines for Implementing and Using the NBS Data
|
||
Encryption Standard, National Institute of Standards
|
||
and Technology. Federal Information Processing
|
||
Standard (FIPS) Publication 74, (April, 1981).
|
||
|
||
[DEST-NIST] Validating the Correctness of Hardware
|
||
Implementations of the NBS Data Encryption Standard,
|
||
National Institute of Standards and Technology.
|
||
Special Publication 500-20.
|
||
|
||
[DESM-NIST] Maintenance Testing for the Data Encryption Standard,
|
||
National Institute of Standards and Technology.
|
||
Special Publication 500-61, (August, 1980).
|
||
|
||
[RFC3174] Eastlake, D. 3rd and P. Jones, "US Secure Hash
|
||
Algorithm 1 (SHA1)", RFC 3174, September 2001.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 77]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
APPENDIX A - Installation
|
||
|
||
A.1. SNMP engine Installation Parameters
|
||
|
||
During installation, an authoritative SNMP engine SHOULD (in the
|
||
meaning as defined in [RFC2119]) be configured with several initial
|
||
parameters. These include:
|
||
|
||
1) A Security Posture
|
||
|
||
The choice of security posture determines if initial configuration
|
||
is implemented and if so how. One of three possible choices is
|
||
selected:
|
||
|
||
minimum-secure,
|
||
semi-secure,
|
||
very-secure (i.e., no-initial-configuration)
|
||
|
||
In the case of a very-secure posture, there is no initial
|
||
configuration, and so the following steps are irrelevant.
|
||
|
||
2) One or More Secrets
|
||
|
||
These are the authentication/privacy secrets for the first user to
|
||
be configured.
|
||
|
||
One way to accomplish this is to have the installer enter a
|
||
"password" for each required secret. The password is then
|
||
algorithmically converted into the required secret by:
|
||
|
||
- forming a string of length 1,048,576 octets by repeating the
|
||
value of the password as often as necessary, truncating
|
||
accordingly, and using the resulting string as the input to the
|
||
MD5 algorithm [RFC1321]. The resulting digest, termed
|
||
"digest1", is used in the next step.
|
||
|
||
- a second string is formed by concatenating digest1, the SNMP
|
||
engine's snmpEngineID value, and digest1. This string is used
|
||
as input to the MD5 algorithm [RFC1321].
|
||
|
||
The resulting digest is the required secret (see Appendix A.2).
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 78]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
With these configured parameters, the SNMP engine instantiates the
|
||
following usmUserEntry in the usmUserTable:
|
||
|
||
no privacy support privacy support
|
||
------------------ ---------------
|
||
usmUserEngineID localEngineID localEngineID
|
||
usmUserName "initial" "initial"
|
||
usmUserSecurityName "initial" "initial"
|
||
usmUserCloneFrom ZeroDotZero ZeroDotZero
|
||
usmUserAuthProtocol usmHMACMD5AuthProtocol usmHMACMD5AuthProtocol
|
||
usmUserAuthKeyChange "" ""
|
||
usmUserOwnAuthKeyChange "" ""
|
||
usmUserPrivProtocol none usmDESPrivProtocol
|
||
usmUserPrivKeyChange "" ""
|
||
usmUserOwnPrivKeyChange "" ""
|
||
usmUserPublic "" ""
|
||
usmUserStorageType anyValidStorageType anyValidStorageType
|
||
usmUserStatus active active
|
||
|
||
It is recommended to also instantiate a set of template
|
||
usmUserEntries which can be used as clone-from users for newly
|
||
created usmUserEntries. These are the two suggested entries:
|
||
|
||
no privacy support privacy support
|
||
------------------ ---------------
|
||
usmUserEngineID localEngineID localEngineID
|
||
usmUserName "templateMD5" "templateMD5"
|
||
usmUserSecurityName "templateMD5" "templateMD5"
|
||
usmUserCloneFrom ZeroDotZero ZeroDotZero
|
||
usmUserAuthProtocol usmHMACMD5AuthProtocol usmHMACMD5AuthProtocol
|
||
usmUserAuthKeyChange "" ""
|
||
usmUserOwnAuthKeyChange "" ""
|
||
usmUserPrivProtocol none usmDESPrivProtocol
|
||
usmUserPrivKeyChange "" ""
|
||
usmUserOwnPrivKeyChange "" ""
|
||
usmUserPublic "" ""
|
||
usmUserStorageType permanent permanent
|
||
usmUserStatus active active
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 79]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
no privacy support privacy support
|
||
------------------ ---------------
|
||
usmUserEngineID localEngineID localEngineID
|
||
usmUserName "templateSHA" "templateSHA"
|
||
usmUserSecurityName "templateSHA" "templateSHA"
|
||
usmUserCloneFrom ZeroDotZero ZeroDotZero
|
||
usmUserAuthProtocol usmHMACSHAAuthProtocol usmHMACSHAAuthProtocol
|
||
usmUserAuthKeyChange "" ""
|
||
usmUserOwnAuthKeyChange "" ""
|
||
usmUserPrivProtocol none usmDESPrivProtocol
|
||
usmUserPrivKeyChange "" ""
|
||
usmUserOwnPrivKeyChange "" ""
|
||
usmUserPublic "" ""
|
||
usmUserStorageType permanent permanent
|
||
usmUserStatus active active
|
||
|
||
A.2. Password to Key Algorithm
|
||
|
||
A sample code fragment (section A.2.1) demonstrates the password to
|
||
key algorithm which can be used when mapping a password to an
|
||
authentication or privacy key using MD5. The reference source code
|
||
of MD5 is available in [RFC1321].
|
||
|
||
Another sample code fragment (section A.2.2) demonstrates the
|
||
password to key algorithm which can be used when mapping a password
|
||
to an authentication or privacy key using SHA (documented in SHA-
|
||
NIST).
|
||
|
||
An example of the results of a correct implementation is provided
|
||
(section A.3) which an implementor can use to check if his
|
||
implementation produces the same result.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 80]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
A.2.1. Password to Key Sample Code for MD5
|
||
|
||
void password_to_key_md5(
|
||
u_char *password, /* IN */
|
||
u_int passwordlen, /* IN */
|
||
u_char *engineID, /* IN - pointer to snmpEngineID */
|
||
u_int engineLength,/* IN - length of snmpEngineID */
|
||
u_char *key) /* OUT - pointer to caller 16-octet buffer */
|
||
{
|
||
MD5_CTX MD;
|
||
u_char *cp, password_buf[64];
|
||
u_long password_index = 0;
|
||
u_long count = 0, i;
|
||
|
||
MD5Init (&MD); /* initialize MD5 */
|
||
|
||
/**********************************************/
|
||
/* Use while loop until we've done 1 Megabyte */
|
||
/**********************************************/
|
||
while (count < 1048576) {
|
||
cp = password_buf;
|
||
for (i = 0; i < 64; i++) {
|
||
/*************************************************/
|
||
/* Take the next octet of the password, wrapping */
|
||
/* to the beginning of the password as necessary.*/
|
||
/*************************************************/
|
||
*cp++ = password[password_index++ % passwordlen];
|
||
}
|
||
MD5Update (&MD, password_buf, 64);
|
||
count += 64;
|
||
}
|
||
MD5Final (key, &MD); /* tell MD5 we're done */
|
||
|
||
/*****************************************************/
|
||
/* Now localize the key with the engineID and pass */
|
||
/* through MD5 to produce final key */
|
||
/* May want to ensure that engineLength <= 32, */
|
||
/* otherwise need to use a buffer larger than 64 */
|
||
/*****************************************************/
|
||
memcpy(password_buf, key, 16);
|
||
memcpy(password_buf+16, engineID, engineLength);
|
||
memcpy(password_buf+16+engineLength, key, 16);
|
||
|
||
MD5Init(&MD);
|
||
MD5Update(&MD, password_buf, 32+engineLength);
|
||
MD5Final(key, &MD);
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 81]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
A.2.2. Password to Key Sample Code for SHA
|
||
|
||
void password_to_key_sha(
|
||
u_char *password, /* IN */
|
||
u_int passwordlen, /* IN */
|
||
u_char *engineID, /* IN - pointer to snmpEngineID */
|
||
u_int engineLength,/* IN - length of snmpEngineID */
|
||
u_char *key) /* OUT - pointer to caller 20-octet buffer */
|
||
{
|
||
SHA_CTX SH;
|
||
u_char *cp, password_buf[72];
|
||
u_long password_index = 0;
|
||
u_long count = 0, i;
|
||
|
||
SHAInit (&SH); /* initialize SHA */
|
||
|
||
/**********************************************/
|
||
/* Use while loop until we've done 1 Megabyte */
|
||
/**********************************************/
|
||
while (count < 1048576) {
|
||
cp = password_buf;
|
||
for (i = 0; i < 64; i++) {
|
||
/*************************************************/
|
||
/* Take the next octet of the password, wrapping */
|
||
/* to the beginning of the password as necessary.*/
|
||
/*************************************************/
|
||
*cp++ = password[password_index++ % passwordlen];
|
||
}
|
||
SHAUpdate (&SH, password_buf, 64);
|
||
count += 64;
|
||
}
|
||
SHAFinal (key, &SH); /* tell SHA we're done */
|
||
|
||
/*****************************************************/
|
||
/* Now localize the key with the engineID and pass */
|
||
/* through SHA to produce final key */
|
||
/* May want to ensure that engineLength <= 32, */
|
||
/* otherwise need to use a buffer larger than 72 */
|
||
/*****************************************************/
|
||
memcpy(password_buf, key, 20);
|
||
memcpy(password_buf+20, engineID, engineLength);
|
||
memcpy(password_buf+20+engineLength, key, 20);
|
||
|
||
SHAInit(&SH);
|
||
SHAUpdate(&SH, password_buf, 40+engineLength);
|
||
SHAFinal(key, &SH);
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 82]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
A.3. Password to Key Sample Results
|
||
|
||
A.3.1. Password to Key Sample Results using MD5
|
||
|
||
The following shows a sample output of the password to key algorithm
|
||
for a 16-octet key using MD5.
|
||
|
||
With a password of "maplesyrup" the output of the password to key
|
||
algorithm before the key is localized with the SNMP engine's
|
||
snmpEngineID is:
|
||
|
||
'9f af 32 83 88 4e 92 83 4e bc 98 47 d8 ed d9 63'H
|
||
|
||
After the intermediate key (shown above) is localized with the
|
||
snmpEngineID value of:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 02'H
|
||
|
||
the final output of the password to key algorithm is:
|
||
|
||
'52 6f 5e ed 9f cc e2 6f 89 64 c2 93 07 87 d8 2b'H
|
||
|
||
A.3.2. Password to Key Sample Results using SHA
|
||
|
||
The following shows a sample output of the password to key algorithm
|
||
for a 20-octet key using SHA.
|
||
|
||
With a password of "maplesyrup" the output of the password to key
|
||
algorithm before the key is localized with the SNMP engine's
|
||
snmpEngineID is:
|
||
|
||
'9f b5 cc 03 81 49 7b 37 93 52 89 39 ff 78 8d 5d 79 14 52 11'H
|
||
|
||
After the intermediate key (shown above) is localized with the
|
||
snmpEngineID value of:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 02'H
|
||
|
||
the final output of the password to key algorithm is:
|
||
|
||
'66 95 fe bc 92 88 e3 62 82 23 5f c7 15 1f 12 84 97 b3 8f 3f'H
|
||
|
||
A.4. Sample Encoding of msgSecurityParameters
|
||
|
||
The msgSecurityParameters in an SNMP message are represented as an
|
||
OCTET STRING. This OCTET STRING should be considered opaque outside
|
||
a specific Security Model.
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 83]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
The User-based Security Model defines the contents of the OCTET
|
||
STRING as a SEQUENCE (see section 2.4).
|
||
|
||
Given these two properties, the following is an example of they
|
||
msgSecurityParameters for the User-based Security Model, encoded as
|
||
an OCTET STRING:
|
||
|
||
04 <length>
|
||
30 <length>
|
||
04 <length> <msgAuthoritativeEngineID>
|
||
02 <length> <msgAuthoritativeEngineBoots>
|
||
02 <length> <msgAuthoritativeEngineTime>
|
||
04 <length> <msgUserName>
|
||
04 0c <HMAC-MD5-96-digest>
|
||
04 08 <salt>
|
||
|
||
Here is the example once more, but now with real values (except for
|
||
the digest in msgAuthenticationParameters and the salt in
|
||
msgPrivacyParameters, which depend on variable data that we have not
|
||
defined here):
|
||
|
||
Hex Data Description
|
||
-------------- -----------------------------------------------
|
||
04 39 OCTET STRING, length 57
|
||
30 37 SEQUENCE, length 55
|
||
04 0c 80000002 msgAuthoritativeEngineID: IBM
|
||
01 IPv4 address
|
||
09840301 9.132.3.1
|
||
02 01 01 msgAuthoritativeEngineBoots: 1
|
||
02 02 0101 msgAuthoritativeEngineTime: 257
|
||
04 04 62657274 msgUserName: bert
|
||
04 0c 01234567 msgAuthenticationParameters: sample value
|
||
89abcdef
|
||
fedcba98
|
||
04 08 01234567 msgPrivacyParameters: sample value
|
||
89abcdef
|
||
|
||
A.5. Sample keyChange Results
|
||
|
||
A.5.1. Sample keyChange Results using MD5
|
||
|
||
Let us assume that a user has a current password of "maplesyrup" as
|
||
in section A.3.1. and let us also assume the snmpEngineID of 12
|
||
octets:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 02'H
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 84]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
If we now want to change the password to "newsyrup", then we first
|
||
calculate the key for the new password. It is as follows:
|
||
|
||
'01 ad d2 73 10 7c 4e 59 6b 4b 00 f8 2b 1d 42 a7'H
|
||
|
||
If we localize it for the above snmpEngineID, then the localized new
|
||
key becomes:
|
||
|
||
'87 02 1d 7b d9 d1 01 ba 05 ea 6e 3b f9 d9 bd 4a'H
|
||
|
||
If we then use a (not so good, but easy to test) random value of:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'H
|
||
|
||
Then the value we must send for keyChange is:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||
88 05 61 51 41 67 6c c9 19 61 74 e7 42 a3 25 51'H
|
||
|
||
If this were for the privacy key, then it would be exactly the same.
|
||
|
||
A.5.2. Sample keyChange Results using SHA
|
||
|
||
Let us assume that a user has a current password of "maplesyrup" as
|
||
in section A.3.2. and let us also assume the snmpEngineID of 12
|
||
octets:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 02'H
|
||
|
||
If we now want to change the password to "newsyrup", then we first
|
||
calculate the key for the new password. It is as follows:
|
||
|
||
'3a 51 a6 d7 36 aa 34 7b 83 dc 4a 87 e3 e5 5e e4 d6 98 ac 71'H
|
||
|
||
If we localize it for the above snmpEngineID, then the localized new
|
||
key becomes:
|
||
|
||
'78 e2 dc ce 79 d5 94 03 b5 8c 1b ba a5 bf f4 63 91 f1 cd 25'H
|
||
|
||
If we then use a (not so good, but easy to test) random value of:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'H
|
||
|
||
Then the value we must send for keyChange is:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||
9c 10 17 f4 fd 48 3d 2d e8 d5 fa db f8 43 92 cb 06 45 70 51'
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 85]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
For the key used for privacy, the new nonlocalized key would be:
|
||
|
||
'3a 51 a6 d7 36 aa 34 7b 83 dc 4a 87 e3 e5 5e e4 d6 98 ac 71'H
|
||
|
||
For the key used for privacy, the new localized key would be (note
|
||
that they localized key gets truncated to 16 octets for DES):
|
||
|
||
'78 e2 dc ce 79 d5 94 03 b5 8c 1b ba a5 bf f4 63'H
|
||
|
||
If we then use a (not so good, but easy to test) random value of:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'H
|
||
|
||
Then the value we must send for keyChange for the privacy key is:
|
||
|
||
'00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||
'7e f8 d8 a4 c9 cd b2 6b 47 59 1c d8 52 ff 88 b5'H
|
||
|
||
B. Change Log
|
||
|
||
Changes made since RFC2574:
|
||
|
||
- Updated references
|
||
- Updated contact info
|
||
- Clarifications
|
||
- to first constraint item 1) on page 6.
|
||
- to usmUserCloneFrom DESCRIPTION clause
|
||
- to securityName in section 2.1
|
||
- Fixed "command responder" into "command generator" in last para of
|
||
DESCRIPTION clause of usmUserTable.
|
||
|
||
Changes made since RFC2274:
|
||
|
||
- Fixed msgUserName to allow size of zero and explain that this can
|
||
be used for snmpEngineID discovery.
|
||
- Clarified section 3.1 steps 4.b, 5, 6 and 8.b.
|
||
- Clarified section 3.2 paragraph 2.
|
||
- Clarified section 3.2 step 7.a last paragraph, step 7.b.1 second
|
||
bullet and step 7.b.2 third bullet.
|
||
- Clarified section 4 to indicate that discovery can use a userName
|
||
of zero length in unAuthenticated messages, whereas a valid
|
||
userName must be used in authenticated messages.
|
||
- Added REVISION clauses to MODULE-IDENTITY
|
||
- Clarified KeyChange TC by adding a note that localized keys must be
|
||
used when calculating a KeyChange value.
|
||
- Added clarifying text to the DESCRIPTION clause of usmUserTable.
|
||
Added text describes a recommended procedure for adding a new user.
|
||
- Clarified the use of usmUserCloneFrom object.
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 86]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
- Clarified how and under which conditions the usmUserAuthProtocol
|
||
and usmUserPrivProtocol can be initialized and/or changed.
|
||
- Added comment on typical sizes for usmUserAuthKeyChange and
|
||
usmUserPrivKeyChange. Also for usmUserOwnAuthKeyChange and
|
||
usmUserOwnPrivKeyChange.
|
||
- Added clarifications to the DESCRIPTION clauses of
|
||
usmUserAuthKeyChange, usmUserOwnAuthKeychange, usmUserPrivKeyChange
|
||
and usmUserOwnPrivKeychange.
|
||
- Added clarification to DESCRIPTION clause of usmUserStorageType.
|
||
- Added clarification to DESCRIPTION clause of usmUserStatus.
|
||
- Clarified IV generation procedure in section 8.1.1.1 and in
|
||
addition clarified section 8.3.1 step 1 and section 8.3.2. step 3.
|
||
- Clarified section 11.2 and added a warning that different size
|
||
passwords with repetitive strings may result in same key.
|
||
- Added template users to appendix A for cloning process.
|
||
- Fixed C-code examples in Appendix A.
|
||
- Fixed examples of generated keys in Appendix A.
|
||
- Added examples of KeyChange values to Appendix A.
|
||
- Used PDU Classes instead of RFC1905 PDU types.
|
||
- Added text in the security section about Reports and Access Control
|
||
to the MIB.
|
||
- Removed a incorrect note at the end of section 3.2 step 7.
|
||
- Added a note in section 3.2 step 3.
|
||
- Corrected various spelling errors and typos.
|
||
- Corrected procedure for 3.2 step 2.a)
|
||
- various clarifications.
|
||
- Fixed references to new/revised documents
|
||
- Change to no longer cache data that is not used
|
||
|
||
Editors' Addresses
|
||
|
||
Uri Blumenthal
|
||
Lucent Technologies
|
||
67 Whippany Rd.
|
||
Whippany, NJ 07981
|
||
USA
|
||
|
||
Phone: +1-973-386-2163
|
||
EMail: uri@lucent.com
|
||
|
||
Bert Wijnen
|
||
Lucent Technologies
|
||
Schagen 33
|
||
3461 GL Linschoten
|
||
Netherlands
|
||
|
||
Phone: +31-348-480-685
|
||
EMail: bwijnen@lucent.com
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 87]
|
||
|
||
RFC 3414 USM for SNMPv3 December 2002
|
||
|
||
|
||
Full Copyright Statement
|
||
|
||
Copyright (C) The Internet Society (2002). All Rights Reserved.
|
||
|
||
This document and translations of it may be copied and furnished to
|
||
others, and derivative works that comment on or otherwise explain it
|
||
or assist in its implementation may be prepared, copied, published
|
||
and distributed, in whole or in part, without restriction of any
|
||
kind, provided that the above copyright notice and this paragraph are
|
||
included on all such copies and derivative works. However, this
|
||
document itself may not be modified in any way, such as by removing
|
||
the copyright notice or references to the Internet Society or other
|
||
Internet organizations, except as needed for the purpose of
|
||
developing Internet standards in which case the procedures for
|
||
copyrights defined in the Internet Standards process must be
|
||
followed, or as required to translate it into languages other than
|
||
English.
|
||
|
||
The limited permissions granted above are perpetual and will not be
|
||
revoked by the Internet Society or its successors or assigns.
|
||
|
||
This document and the information contained herein is provided on an
|
||
"AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
|
||
TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
|
||
BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
|
||
HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
|
||
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||
|
||
Acknowledgement
|
||
|
||
Funding for the RFC Editor function is currently provided by the
|
||
Internet Society.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Blumenthal & Wijnen Standards Track [Page 88]
|
||
|