Re: [dhcwg] Benjamin Kaduk's Discuss on draft-ietf-dhc-dhcpv6-yang-24: (with DISCUSS and COMMENT)
Timothy Winters <tim@qacafe.com> Tue, 01 February 2022 16:08 UTC
Return-Path: <tim@qacafe.com>
X-Original-To: dhcwg@ietfa.amsl.com
Delivered-To: dhcwg@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id F119D3A1492 for <dhcwg@ietfa.amsl.com>; Tue, 1 Feb 2022 08:08:28 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.099
X-Spam-Level:
X-Spam-Status: No, score=-2.099 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001] autolearn=unavailable autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (1024-bit key) header.d=qacafe.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WUmFei47F8tz for <dhcwg@ietfa.amsl.com>; Tue, 1 Feb 2022 08:08:22 -0800 (PST)
Received: from mail-lf1-x12c.google.com (mail-lf1-x12c.google.com [IPv6:2a00:1450:4864:20::12c]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id E75C53A1490 for <dhcwg@ietf.org>; Tue, 1 Feb 2022 08:08:21 -0800 (PST)
Received: by mail-lf1-x12c.google.com with SMTP id o12so34828877lfg.12 for <dhcwg@ietf.org>; Tue, 01 Feb 2022 08:08:21 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qacafe.com; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=wsNHpB/I0Pm6UN8zqIvkQKFzIs00PncoSammCdhKTfM=; b=WySQkKBi+dhV0dMcEM79YnLYAuzCnXmEydmE2BdRKUDlCEgbDGAu82u9kIdIBBMrIK LCvgZtBPxXuxmau6BXpwi9YJg8osnCIVGfMxd7rvLZipke9HqCTXe41XVdE6PxETJoqW NmqcWfeuZCKrB6uDkIdmRSTtIamKM1WURaGc8=
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=wsNHpB/I0Pm6UN8zqIvkQKFzIs00PncoSammCdhKTfM=; b=W2qv2L9nPekSaGDiUc6x+DbDNOq2oH/zjOsyJ65eOB37eMmY2AZGFAJQv5UWmtSItB Hnc/Db8wkoTrZOGxF086tuemCGxBgnP1/pfe5rrZEyuRxizKyKn3IwW08DaLJKJ6Vaf4 MgyKlTyFw/DfNd3X4+G/VFE37F0joH/6RIFGhqoR8yFpmA/AeERSCj6oubV58Ykud+GM Xot3h9P5NfIZj6q4aBZwSq60rCwJJ91mOztQYo1QtGz6zozop/8OyUFLz+hr0DRQL2a+ AD6RH2YypemNsFYXPiyjeTwrhLGuWGEBasMhDVzsvfxgQlFFYVxCL7wn3geJjcVlUiRv z2sw==
X-Gm-Message-State: AOAM532kQ9De8FkFClnHwWiOGqECbePGg8BrJP7QGiaVJcZ8Pp1rprMX fPxYeVBx/9W3QndTYh3thRhLp4/MuwkS3yjukNJfeg==
X-Google-Smtp-Source: ABdhPJxarBok/9XjWM7oOhodtP7FEFRH6Fwtavu1ys7K6LCdqTxta0xJyMMKuyYwLorWCTyQEVfNTYS3oLrUNZaqJME=
X-Received: by 2002:ac2:5690:: with SMTP id 16mr18704476lfr.181.1643731698965; Tue, 01 Feb 2022 08:08:18 -0800 (PST)
MIME-Version: 1.0
References: <163952685584.6395.6879611267419166159@ietfa.amsl.com> <F7517675-B8E0-4777-AB7D-A7A8A6283D75@gmx.com> <CAJgLMKt26RMRcveWQ1uXCFqvUf_JBmF6VBykO4TAi0PUop0Ewg@mail.gmail.com> <68B4C304-6759-48E7-B4A1-A212310ABA13@gmx.com>
In-Reply-To: <68B4C304-6759-48E7-B4A1-A212310ABA13@gmx.com>
From: Timothy Winters <tim@qacafe.com>
Date: Tue, 01 Feb 2022 11:08:06 -0500
Message-ID: <CAJgLMKvYhyo-v1QsTozwypXhPK6nXk_ua6a7E5mmM_K0EZSE3Q@mail.gmail.com>
To: ianfarrer@gmx.com
Cc: Benjamin Kaduk <kaduk@mit.edu>, The IESG <iesg@ietf.org>, draft-ietf-dhc-dhcpv6-yang@ietf.org, dhc-chairs@ietf.org, dhcwg <dhcwg@ietf.org>
Content-Type: multipart/alternative; boundary="00000000000006015a05d6f71ccb"
Archived-At: <https://mailarchive.ietf.org/arch/msg/dhcwg/y2NI1YZDtMSo6zivOti_qjDIFKQ>
X-Mailman-Approved-At: Tue, 01 Feb 2022 08:09:16 -0800
Subject: Re: [dhcwg] Benjamin Kaduk's Discuss on draft-ietf-dhc-dhcpv6-yang-24: (with DISCUSS and COMMENT)
X-BeenThere: dhcwg@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Dynamic Host Configuration <dhcwg.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/dhcwg>, <mailto:dhcwg-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/dhcwg/>
List-Post: <mailto:dhcwg@ietf.org>
List-Help: <mailto:dhcwg-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/dhcwg>, <mailto:dhcwg-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 01 Feb 2022 16:08:29 -0000
Hi Ian, On Tue, Feb 1, 2022 at 10:07 AM <ianfarrer@gmx.com> wrote: > Hi Tim, > > Thanks for your reply. There’s one clarification question in line below. > I’ve changed the other 2 types to binary per your suggestion. > > Thanks, > Ian > > On 21. Jan 2022, at 14:00, Timothy Winters <tim@qacafe.com> wrote: > > Hi Ian, > > I've responded below anywhere @Bernie/Tim. Thanks for you all your work > on this. > > ~Tim > > On Mon, Jan 17, 2022 at 12:39 PM <ianfarrer@gmx.com> wrote: > >> Hi Benjamin, >> >> First of all, many thanks for the detailed review and my apologies that >> it’s taken so long for me to >> reply. >> >> Please see inline below. >> >> @Bernie/@Tim, there are a couple of points below that I would appreciate >> your input on (specifically, restructuring of the OPTION_AUTH modelling and >> the best type for interface-id-option-group and user-class-option-group to >> use). >> >> Thanks, >> Ian >> >> >> > On 15. Dec 2021, at 01:07, Benjamin Kaduk via Datatracker < >> noreply@ietf.org> wrote: >> > >> > Benjamin Kaduk has entered the following ballot position for >> > draft-ietf-dhc-dhcpv6-yang-24: Discuss >> > >> > When responding, please keep the subject line intact and reply to all >> > email addresses included in the To and CC lines. (Feel free to cut this >> > introductory paragraph, however.) >> > >> > >> > Please refer to >> https://www.ietf.org/blog/handling-iesg-ballot-positions/ >> > for more information about how to handle DISCUSS and COMMENT positions. >> > >> > >> > The document, along with other ballot positions, can be found here: >> > https://datatracker.ietf.org/doc/draft-ietf-dhc-dhcpv6-yang/ >> > >> > >> > >> > ---------------------------------------------------------------------- >> > DISCUSS: >> > ---------------------------------------------------------------------- >> > >> > Roman's comment touched on a related point, but I'd like to (hopefully >> > briefly) discuss the way we encode certain opaque protocol fields. >> > There are some places where we clearly intend a hex representation (a >> > string with a pattern that's marked out as pairs of hex digits), but >> > there are others where we just say "type string" with no indication of >> > encoding, and even a "type binary". If we want the specification to >> > admit interoperable implementation we need to be more clear about what >> > encoding we expect for all of these nodes. I have noted most (possibly >> > all, but please double check) in the COMMENT section, with a preference >> > for "type binary" where we don't need to apply regex restrictions. But >> > that's just a personal preference, and choosing to use hex (or base64, >> > or any other well-defined) encoding will suffice to resolve the discuss >> > point. >> >> [if - I’ve changed from type string to binary where-ever possible >> throughout according >> To the specific comments below. The one exception is for the auth-option, >> which >> Allows for different formats depending on the auth protocol in use. I’ve >> reworked the >> Format of the option to make this explicit.] >> >> > >> > >> > ---------------------------------------------------------------------- >> > COMMENT: >> > ---------------------------------------------------------------------- >> > >> > Thanks to the shepherd for answering the second part of question (1) in >> > the template, as well as the first; this part of the question is often >> > missed. (There is, however, a third part as well...) >> > >> > Section 1.2.1 >> > >> > Table 1 is described as showing "the DHCPv6 options that are modeled, >> > the element(s) they are sent by, and the relevant YANG module name". In >> > my interpretation that means that: >> > >> > - the only options that are in the table are ones that are modeled >> > - the contents of the table shows which elements send those options >> > >> > But the contents of the table don't quite seem to match that -- it seems >> > that they only indicate which nodes have YANG modeling for how to send >> > the option, and not indicate nodes that send the option but do not need >> > YANG configuration to control how to populate the option. (E.g., >> > OPTION_AUTH and OPTION_USER_CLASS.) If this is the intent, then perhaps >> > it's clearer to say "which YANG modules they are modeled for" or >> > something similar, rather than "the element(s) they are sent by". >> >> [if - Changed] >> >> >> > >> > Section 3.1 >> > >> > * address/prefix-pool-utilization-threshold-exceeded: Raised when >> > the number of leased addresses or prefixes exceeds the configured >> > usage threshold. >> > >> > The node that seems to be where the "configured usage threshold" is >> > configured is scoped to an address pool or prefix pool. Should this >> > description say "number of leased [...] in an address pool exceeds the >> > configured usage threshold"? >> >> [if - I’ve changed this to read: >> "address/prefix-pool-utilization-threshold-exceeded: Raised when the >> number >> of leased addresses or prefixes in a pool exceeds the configured usage >> threshold." >> >> > >> > Section 4.1 >> > >> > +------+------+----------+--------------+ >> > | 0001 | 0006 | 28490058 | 00005E005300 | >> > +------+------+----------+--------------+ >> > >> > This example includes the 2-octet DUID type of 1 (0x01), the >> > hardware type is 0x06 (IEEE Hardware Types) the creation >> > time is 0x028490058 (constructed as described above). Finally, >> > the link-layer address is 0x5E005300 (EUI-48 address >> > 00-00-5E-00-53-00)"; >> > >> > Should there be some more zeros in here (e.g., in the artwork before >> > 28490058)? >> >> [if - The creation time is a 4-octet field, so the artwork is correct. >> I’ve >> changed the value in the description to 0x28490058] >> >> > >> > typedef duid-en { >> > type duid-base { >> > pattern '0002' >> > + '[0-9a-fA-F]{4,}'; >> > } >> > description >> > "DUID type 2, assigned by vendor based on Enterprise >> > Number (DUID-EN). This DUID consists of the 4-octet vendor's >> > registered Private Enterprise Number as maintained by IANA >> > followed by a unique identifier assigned by the vendor. For >> > example: >> > >> > A 4-octet PEN would be 8 hex digits (the YANG allows as few as 4). >> >> [if - Changed to 8] >> >> > >> > typedef duid-unstructured { >> > type duid-base { >> > pattern '(000[1-4].*|.*[^0-9a-fA-F].*)' { >> > modifier invert-match; >> > } >> > } >> > >> > My understanding is that the "pattern" modifiers from the base type and >> > the derived type are "and"-ed together, so the "|.*[^0-9a-fA-F].*" >> > clause is redundant with the pattern in the base type and thus not >> > needed. >> >> [if - Changed to >> pattern '(000[1-4].*)'] >> >> > >> > container status { >> > [...] >> > leaf message { >> > type string; >> > description >> > "A UTF-8 encoded text string suitable for display to an >> > end user. It MUST NOT be null-terminated."; >> > >> > (Related to Roman's comment) >> > This is probably more of a comment on RFC 8415 than this document, but >> > BCP 18 seems pretty clear that a string destined for display to a human >> > should be accompanied by a language indicator. >> > (This comment probably applies to every "leaf message" but I will just >> > mention it this once.) >> >> [if - I’m not sure how we can handle this as the leaf(s) is only used for >> Holding RO state data which it obtains from the client/relay/server >> implementation. As >> You mention, RFC8415 does not place any requirements on the message to >> contain >> a language identifier.] >> >> > >> > grouping auth-option-group { >> > [...] >> > container auth-option { >> > [...] >> > leaf auth-information { >> > type string; >> > description >> > "The authentication information, as specified by the >> > protocol and algorithm used in this Authentication >> > option."; >> > >> > This should probably be binary, not a string. Or, if it needs to be a >> > string, it should specify an encoding (e.g., hex). >> >> [if - The authentication information format is dependant on the value >> Of the protocol field. I’ve re-modelled this option to take this into >> account. >> >> The configuration-token (RFC3118) does allow for plain text and >> specifically >> Gives a clear text password as an example use case. >> >> @Bernie, @Tim, please can you review this an make sure that I’ve >> Understood DHCPv6 auth properly? >> > [tim] - I think it can be any data based on the protocol field. So maybe > this should be a binary? > > > [if - To be clear, in the updated model that I proposed below, there are > two fields that contain auth information, one for conf-token > (which was typed as string) and one for rkap (which is binary). > > I’ve changed both to type binary. Was this your intention?] > [tw] - Yes that was my intention. > > >> >> >> grouping auth-option-group { >> description >> "OPTION_AUTH (11) Authentication Option."; >> reference "RFC 8415: Dynamic Host Configuration Protocol >> for IPv6 (DHCPv6), Section 21.11 >> >> RFC 3118: Authentication for DHCP Messages >> IANA 'Dynamic Host Configuration Protocol (DHCP) Authentication >> Option Name Spaces' registry. >> <https://www.iana.org/assignments/auth-namespaces>"; >> container auth-option { >> description >> "OPTION_AUTH (11) Authentication Option container."; >> leaf algorithm { >> type uint8; >> description >> "The algorithm used in the authentication protocol."; >> } >> leaf rdm { >> type uint8; >> description >> "The Replay Detection Method (RDM) used in this >> Authentication option."; >> } >> leaf replay-detection { >> type uint64; >> description >> "The replay detection information for the RDM."; >> } >> choice protocol { >> >> description >> "The authentication protocol used in the option. Namespace >> values 1 (delayed authentication) and 2 (Delayed >> Authentication (Obsolete) are not applicable and so are >> not modelled."; >> case conf-token { >> leaf token-auth-information { >> type string; >> description >> >> "Protocol Namespace Value 0. The authentication >> >> information, as specified by the protocol and >> algorithm used in this Authentication option."; >> } >> } >> case rkap { >> >> description >> "Protocol Namespace Value 3. RKAP provides protection >> against misconfiguration of a client caused by a Reconfigure >> message sent by a malicious DHCP server."; >> leaf datatype { >> type uint8 { >> range "1 .. 2"; >> } >> description >> "Type of data in the Value field carried in this >> option. >> 1 Reconfigure key value (used in the Reply >> message). >> 2 HMAC-MD5 digest of the message (used in >> the Reconfigure message)."; >> } >> leaf auth-info-value { >> >> type binary { >> >> length 16; >> >> } >> description "Data as defined by the Type field. A 16-octet >> field."; >> } >> } >> } >> } >> } >> >> ] >> >> > >> > grouping status-code-option-group { >> > >> > FWIW, this grouping seems unused by the rest of the document. (Perhaps >> > a remnant of a decision to move the status information out of the >> > options section and into a higher level of the relevant YANG trees?) >> >> [if - Yes, this was an unused remanent. Removed] >> >> > >> > leaf sub-option-data { >> > type string { >> > pattern '([0-9a-fA-F]{2}){0,}'; >> > } >> > description >> > "The data area for the sub-option."; >> > >> > Why does this need to be hex-encoded (vs. YANG binary)? >> > And, if it is hex-encoded, we should probably say so explicitly in the >> > description. >> >> [if - Changed to binary] >> >> > >> > Section 4.2 >> > >> > leaf preferred-lifetime { >> > type dhc6:timer-seconds32; >> > description >> > "Preferred lifetime for the Identity Association (IA)."; >> > reference "RFC 8415: Dynamic Host Configuration Protocol for >> > IPv6 (DHCPv6), Section 6"; >> > >> > Is Section 6 really the best section reference for this concept? >> >> [if - Changed to Section 12.1 (also changed for the valid-lifetime leaf)] >> >> > >> > grouping message-stats { >> > >> > The relay module has a counter for discarded messages; would a similar >> > counter make sense here? (Also for the server module, I think.) >> >> [if - Added - also for the client module.] >> >> > >> > Also, YANG does have dedicated "counter" types to more precisely >> > indicate semantics than just "uint32". They are by definition >> > monotonically increasing, though, and are their use is typically >> > accompanied by a "last discontinuity time" node to indicate when they >> > have been reset. >> >> [if - Changed to yang:counter32 throughout and added a discontinuity-time >> node to server/relay/client modules] >> >> > >> > grouping info-refresh-time-option-group { >> > [...] >> > leaf info-refresh-time { >> > type dhc6:timer-seconds32; >> > description >> > "Time duration relative to the current time, expressed >> > in units of seconds."; >> > >> > Is this really "relative to the current time" for purposes of the YANG >> > module? This is the description that RFC 8415 uses, yes, but that >> > refers to the current time when the protocol message is received, and >> > YANG interactions may be asynchronous to that. >> >> [if - Changed to read: >> "Time duration specifying an upper bound for how long a >> client should wait before refreshing information retrieved >> from a DHCP server.”; ] >> >> > >> > container address-pools { >> > [...] >> > list address-pool { >> > key pool-id; >> > [...] >> > leaf pool-id { >> > type string; >> > >> > What's the motivation for making the pool-id a string vs the option-set >> > and allocation-range lists that have an integer identifier? (Also >> > applies to prefix pools.) >> >> [If - Initially all of the identifiers were integers. The change to string >> >> Specifically for Pool-id was made by Éric during the AD review. >> >> Agree that it makes sense to use the same format, so the option-set-id >> And allocation-range id are now type string.] >> >> > >> > leaf pool-prefix { >> > type inet:ipv6-prefix; >> > mandatory true; >> > description >> > "IPv6 prefix for the pool."; >> > >> > Does this prefix need to be contained within the overall >> > "network-prefix"? (Same question for prefix-pools' pool-prefix.) >> >> [if - With the DHCP server implementations that I am familiar with, yes >> it would >> need to be contained, but I guess other implementations may not. I’m not >> aware >> of any way of enforcing this in the YANG.] >> >> > >> > leaf max-address-utilization { >> > type dhc6:threshold; >> > description >> > "Maximum amount of the addresses in the >> > pool which can be simultaneously allocated, >> > calculated as a percentage of the available >> > addresses (end-address minus start-address plus >> > one)."; >> > >> > Do we want to mention the relationship between this node and the >> > "address-pool-utiliziation-threshold-exceeded" notification? I see the >> > pointer the other direction, but since we don't use the word "threshold" >> > in the description here I wouldn't mind a more explicit linkage. >> > (Likewise for the prefix-allocation case.) >> >> [if - I’ve updated the description with: >> " Used to set the value for the >> address-pool-utilization-threshold-exceeded >> notification”; >> >> And the equivalent change for prefix-allocation.] >> >> > >> > list active-lease { >> > key leased-prefix; >> > description >> > "List of active prefix leases."; >> > leaf leased-prefix { >> > type inet:ipv6-prefix; >> > description >> > "Active leased prefix entry."; >> > >> > Is the prefix length available from some other information in the tree? >> > If not, should it be listed here? >> >> [if I’m not sure I understand the comment. The prefix pool has the >> ‘Client-prefix-length’ leaf which defines the length of prefixes that >> are offered for the pd-pool. >> >> However, client’s may hint that they want a different prefix length in >> TOheir pd request and depending on implementation / policy the server >> May honour this (for a longer prefix than the defined >> client-prefix-length). >> RFC8168 discusses this.] >> >> > >> > notification decline-received { >> > if-feature na-assignment; >> > description >> > "Notification sent when the server has received a >> > Decline (9) message from a client."; >> > >> > Is this a potential DoS vector to the notification recipient (if a >> > malicious client just starts declining everything)? Should we say >> > anything about rate-limiting? >> >> [if - From the perspective of the YANG module and its implementation, >> I don’t think so. The reason is that state/counter data is accessed via >> the YANG >> Operational data store and this is only retrieved from the process / >> function >> Being managed when a NETCONF request Is made for the information, >> so that it is as current as possible. >> >> This is for every YANG module implementation that we\ve done, but I think >> this is general best practice.] >> >> > >> > notification non-success-code-sent { >> > description >> > "Notification sent when the server responded >> > to a client with non-success status code."; >> > >> > (similarly here) >> >> [if - See above] >> >> > >> > Section 4.3 >> > >> > grouping interface-id-option-group { >> > [...] >> > leaf interface-id { >> > type string; >> > description >> > "An opaque value of arbitrary length generated by the >> > relay agent to identify one of the relay agent's >> > interfaces."; >> > >> > I think this is better as a YANG "binary" type than a string. If not, >> > we should say something about the encoding. >> >> [if - I’m familiar with the use of this option in Cisco and ALU relay >> Implementations and both allow clear text configuration of the >> value that is carried in this field. >> >> RFC8415 doesn’t give any specific guidance on whether this >> Should be ASCII or can be UTF-8. >> >> RFC7227 Section 5.8 does state that future options should use UTF-8, >> But this option would have been defined before RFC7227 was published. >> >> @Bernie/@Tim, do you have any guidance on this?] >> > [tim] - According to RFC 8415 this is an opaque value, therefore it can > be anything so I think binary makes sense. > > > [if - Changed] > > >> > >> > Section 4.4 >> > >> > Why do we use "prefix-del" for the feature name in this module but the >> > full "prefix-delegation" in the other modules? >> >> [if - now using prefix-delegation throughout] >> >> > >> > grouping message-statistics { >> > >> > The relay module has a counter for discarded messages; should we? >> >> [if - Added] >> >> > >> > grouping option-request-option-group { >> > description >> > "OPTION_ORO (6) Option Request Option. A client MUST include >> > an Option Request option in a Solicit, Request, Renew, >> > Rebind, or Information-request message to inform the server >> > about options the client wants the server to send to the >> > client."; >> > >> > If I understand correctly, there are further MUST-level requirements for >> > what options must be present in the ORO. E.g., INFORMATION_REFRESH_TIME >> > is required in Information-Request. Do we want to mention that here? >> > Are there any considerations for how that requirement interacts with the >> > values configured by YANG? E.g., do we expect implementations to >> > forcibly add those required options on top of the configured ones, in >> > scenarios where they are required? >> >> [if - Description now updated to: >> "List of options that the client is requesting, >> identified by option code. This list MUST include the >> code for option SOL_MAX_RT (82) when included in a >> >> Solicit-message. If this option is being >> sent in an Infoformation-request message, then the code >> for option OPTION_INFORMATION_REFRESH_TIME (32) and >> >> INF_MAX_RT (83) MUST be included.”; >> >> The references also updated for the sections of RFC8415 defining the >> requirements.] >> >> > >> > grouping user-class-option-group { >> > [...] >> > leaf user-class-data { >> > type string; >> > description >> > "Opaque field representing a User Class >> > of which the client is a member."; >> > >> > I think this would be better as YANG binary than string. If we keep it >> > as string, we need to say what encoding is used. >> >> > >> > container vendor-class-option { >> > [...] >> > list vendor-class-option-instances { >> > [...] >> > list vendor-class-data-element { >> > [...] >> > leaf vendor-class-data { >> > type string; >> > description >> > "Opaque field representing a vendor class of which >> > the client is a member."; >> > >> > (likewise here) >> >> [if - IME these are usually a user configurable text string on client / >> server implementations. >> >> I think the same comment for the format as for Section 4.3 >> interface-id-option group >> Applies here. >> >> @Bernie/@Tim, any thoughts?] >> > [tim] - Since anything can be put in this field as a opaque value, I think > this a binary for yang model. > > > [if - Changed.] > > >> ] >> > >> > leaf client-duid { >> > if-feature "non-temp-addr or prefix-del " + >> > "or temp-addr and not anon-profile"; >> > >> > Does the default YANG operator precedence do what we want with respect >> > to ((non-temp-addr or prefix-del or temp-addr) and not anon-profile) vs >> > (non-temp-addr or prefix-del or (temp-addr and not anon-profile))? >> >> From the context in the rest of the document, it's clear that we want >> > the former, but I'm not familiar enough with YANG minutiae to say if >> > that's what we actually are specifying. >> >> [if - Changed to "(non-temp-addr or prefix-delegation or temp-addr) and >> not anon-profile”. >> >> Per RFC7950, groupings in parentheses are evaluated first, then the ‘not' >> statement.] >> >> > >> > notification invalid-ia-address-detected { >> > if-feature "non-temp-addr or temp-addr"; >> > [...] >> > leaf ia-id { >> > type uint32; >> > mandatory true; >> > description >> > "IA-ID"; >> > >> > If I understand correctly, in DHCP the IA-ID is scoped per client DUID. >> > Does this notification convey enough information to disambiguate what >> > scope this IA-ID value belongs to? >> >> [if - The IA-ID is a 4-octet field which is present in options requesting >> an address or prefix (OPTION_IA_NA/IA_TA/IA_PD). >> The client will normally have a single DUID for all of it’s requests on >> all DHCP >> Enabled interfaces, but could make requests for multiple >> addresses/prefixes in >> each DHCP request. In this case each IA_xA option would have the same >> DUID, and a unique IA-ID field so the >> Client can associate the allocated address/prefix from the server to the >> specific request option.] >> >> > >> > [...] >> > leaf ia-na-t1-timer { >> > type uint32; >> > description >> > "The value of the T1 time field for non-temporary address >> > allocations (OPTION_IA_NA)."; >> > } >> > leaf ia-na-t2-timer { >> > type uint32; >> > description >> > "The value of the preferred-lifetime field for non-temporary >> > address allocations (OPTION_IA_NA)."; >> > >> > Should these two be here without a feature conditional? They seem to be >> > NA-specific but we could send this notification if NA is not >> > implemented. >> >> [if - notification invalid-ia-address-detected has if-feature >> non-temp-addr or temp-addr which >> Is applicable to all of the nodes defined in the notification. >> >> The notification can only be triggered if an address is requested and >> allocated then found to >> Be invalid, e.g. it fails DAD, so this couldn’t happen if the client >> doesn’t implement IA_NA/IA_TA >> (And has the relevant feature enabled).] >> >> > >> > notification transmission-failed { >> > [...] >> > leaf failure-type { >> > type enumeration { >> > >> > (side note?) I get antsy about not leaving an extension point for other >> > types of (re)transmission failure, but I also don't have any specific >> > scenario in mind that's not already covered, so. >> >> [if - I think that all of the client message transmission failures can be >> boiled down to >> ‘I tried/retried sending this type of message and didn’t get an answer’ >> which is what’s >> Covered in the notification. We could add an other/unspecified to the >> enum, but I also >> Can’t think of what would trigger this.] >> >> > >> > notification unsuccessful-status-code { >> > description >> > "Notification sent when the client receives a message that >> > includes an unsuccessful Status Code option."; >> > >> > As for the other notifications on failure, is this a potential DoS >> > vector? >> >> [if - I don’t think so. For Netconf notifications, the network management >> system >> Creates a session and subscribes to the notifications from the DHCP >> client. >> If one (or many) DHCP clients were generating too many notifications, >> then the NMS would >> Close the session and stop receiving the DHCP client’s notifications.] >> >> > >> > Section 5 >> > >> > It's probably worth mentioning the risk of notifications turning into a >> > DoS vector (absent rate-limiting) here. >> >> [if - This is surely a problem with Netconf notifications overall, rather >> than specifically >> For the DHCP modules? I’ve checked through RFC5277 (Netconf event >> notifications) and >> There is nothing on rate-limiting messages or in the Security >> Considerations section >> on this subject.] >> >> > >> > Can a misconfigured client cause problems for a (honest) server, e.g., >> > by sending a lot of requests for a lot of things, very quickly? >> >> [if - I’m sure that it would be possible. RFC8415 only places requirements >> On clients to limit the rate for messages that they send, but not on a >> server >> To limit the rate of received messages it will try and process. >> >> >From a little research, I see that some DHCP server implementations have >> >> configuration for this, but others do not. It’s feasible that this could >> also be >> Done through e.g. ip6tables rules on a host. >> >> I would see this as being a feature that should be configured (if >> available) through the >> Implementation specific YANG module or possibly the ACL YANG (RFC8519)] >> >> > >> > All data nodes defined in the YANG modules which can be created, >> > modified, and deleted (i.e., config true, which is the default) are >> > considered sensitive. Write operations (e.g., edit-config) to these >> > data nodes without proper protection can have a negative effect on >> > network operations. >> > >> > Do we want to go further and give some broad treatment of how the >> > negative effects would come about (e.g., by disrupting address >> > allocation and the routability of addresses/prefixes that clients >> > attempt to use)? >> > >> > An attacker with read/write access the DHCPv6 relay can undertake >> > various attacks, such as: >> > >> > * Modifying the relay's "destination-address" to send messages to a >> > rogue DHCPv6 server. >> > >> > * Deleting information about a client's delegated prefix, causing a >> > denial of service attack as traffic will no longer be routed to >> > the client. >> > >> > I'd considering reiterating the "full denial of service" capability >> > (which is currently implicit in "send messages to a rouge DHCPv6 server" >> > combined with the list of attacks that a compromised server can >> > undertake). >> >> [if - I’ve updated the examples as follows: >> >> Server: >> >> Denial of service attacks, such as disabling the DHCP >> server sevice, or removing address/prefix pool >> >> configuration. >> >> Various attacks based on re-configuring the contents >> of DHCPv6 options, leading to several types of security or >> privacy threats. For example, changing the address of a >> >> DNS server supplied in a DHCP option to point >> to a rogue server. >> >> >> And for the relay >> >> Denial of service attacks, based on disabling the >> DHCP relay function, or modifying the relay's >> "destination-address" to a non-existant address. >> >> >> Modifying the relay's "destination-address" to send >> messages to a rogue DHCPv6 server. >> >> Deleting information about a client's delegated >> prefix, causing a denial of service attack as traffic >> will no longer be routed to the client. >> >> ] >> >> >> > >> > Some of the readable data nodes in this YANG module may be considered >> > sensitive or vulnerable in some network environments. Therefore, it >> > is important to control read access (e.g., only permitting get, get- >> > config, or notifications) to these data nodes. These subtrees and >> > data nodes can be misused to track the activity of a host: >> > >> > First off, thank you for stating this consideration so clearly. >> > >> > Second, there may be an additional consideration for read-only access -- >> > knowledge of what pools of addresses are available for allocation might >> > facilitate network reconaissance (viz. RFC 7707). >> >> [if - I’ve added the following text: >> >> Information about a server's configured address and prefix pools may >> be used by an attacker for network reconnaissance [RFC7707]. The >> following subtrees and data nodes could be used for this purpose: >> >> * Information about client address allocation ranges: (dhc6-srv/ >> allocation-ranges/allocation-range/address-pools/ address-pool/ >> pool-prefix) >> >> * Information about client prefix allocation ranges: (dhc6-srv/ >> >> allocation-ranges/allocation-range/prefix-pools/ prefix-pool/pool- >> prefix) >> ] >> >> > >> > [RFC7824] covers privacy considerations for DHCPv6 and is applicable >> > here. >> > >> > I'd suggest mentioning the RFC 7844 privacy profile as a partial >> > mitigation that is sometimes applicable. >> >> [if - Do you mean that RFC7844 can provide partial mitigation of the >> server >> Privacy issues in RFC7824?] >> >> > >> > Section 9.2 >> > >> > RFC 8987 is used as in a few YANG reference stanzas, but is not >> > mentioned in the preface before the containing YANG module. It could >> > arguably be classified as normative based on that usage. >> >> [if - I’ve added >> "The RPCs in the module are taken from requirements defined [RFC8987].” >> >> To the preface before the relay tree diagram. RFC8987 is now normative.] >> >> > >> > Appendix D >> > >> > case user-class-option-id { >> > description >> > "Client class selection based on the value of the >> > OPTION_USER_CLASS(15) and its user-class-data field."; >> > leaf user-class-data { >> > type string; >> > mandatory true; >> > description >> > "Value of the enterprise-number field."; >> > >> > This description doesn't look right. >> >> [if - Changed to “User Class value to match”] >> >> > >> > NITS >> > >> > We might check the spelling of "grouping message-stats" (vs "grouping >> > message-statistics") across modules. >> >> [if - now uses ‘message-statistics’ throughout] >> >> > >> > Section 4.2 >> > >> > leaf rapid-commit { >> > type boolean; >> > description >> > "When set to 'true', Specifies that the pool supports >> > client-server exchanges involving two messages."; >> > >> > This is in the "grouping resource-config" that may or may not be used >> > within a "pool" container. A more generic phrasing might be in order. >> >> [if - Changed to >> "When set to 'true', Specifies that client-server exchanges involving >> two messages is supported.”;] >> >> > >> > grouping sol-max-rt-option-group { >> > [...] >> > leaf sol-max-rt-value { >> > type dhc6:timer-seconds32; >> > description >> > "sol max rt value"; >> > >> > That's a pretty sparse description. >> >> [if - Changed to: >> "Maximum Solicit timeout value.”] >> >> > >> > grouping inf-max-rt-option-group { >> > [...] >> > leaf inf-max-rt-value { >> > type dhc6:timer-seconds32; >> > description >> > "inf max rt value"; >> > >> > (ditto) >> >> [if - Changed to: >> "Maximum Information-request timeout value.”] >> >> > >> > leaf max-address-utilization { >> > type dhc6:threshold; >> > description >> > "Maximum amount of the addresses in the >> > pool which can be simultaneously allocated, >> > calculated as a percentage of the available >> > addresses (end-address minus start-address plus >> > one)."; >> > >> > The analogous prefix-allocation node has "rounded up" stated >> > explicitly. Should we do so here as well? >> >> [if - added] >> >> > >> > Section 4.3 >> > >> > leaf reply-sent-count { >> > type uint32; >> > config "false"; >> > description >> > "Number of Reply (7) messages received."; >> > } >> > leaf release-received-count { >> > type uint32; >> > config "false"; >> > description >> > "Number of Release (8) messages sent."; >> > } >> > leaf decline-received-count { >> > type uint32; >> > config "false"; >> > description >> > "Number of Decline (9) messages sent."; >> > >> > The descriptions seem out of sync about sent vs received, here. >> >> [if - fixed] >> >> > >> > Section 5 >> > >> > As the RPCs for deleting/clearing active address and prefix entries >> > in the server and relay modules are particularly sensitive, these use >> > 'nacm:default-deny-all'. >> > >> > This looks like a comma splice. >> >> [if - Reworded to: >> >> The RPCs for deleting/clearing active address and prefix >> entries in the server and relay modules are particularly >> sensitive. These RPCs use 'nacm:default-deny-all'. ] >> >> > >> > An attacker with read/write access the DHCPv6 server can undertake >> > various attacks, such as: >> > [...] >> > An attacker with read/write access the DHCPv6 relay can undertake >> > various attacks, such as: >> > >> > s/access/access to/ >> >> [if - fixed] >> >> > >> > Some of the readable data nodes in this YANG module may be considered >> > sensitive or vulnerable in some network environments. Therefore, it >> > is important to control read access (e.g., only permitting get, get- >> > config, or notifications) to these data nodes. These subtrees and >> > >> > This doesn't match the template at >> > https://trac.ietf.org/trac/ops/wiki/yang-security-guidelines , where >> the >> > parenthetical is "(e.g., via get, get-config, or notification)" -- the >> > meaning is different! >> >> [if - Changed to ‘via’] >> >> > >> > Appendix A.1 >> > >> > The 'max-pd-space-utilization' is set to 80 so that a 'prefix-pool- >> > utilization-threshold-exceeded' notification will be raised if the >> > number of prefix allocations exceeds this. >> > >> > the max-pd-space-utilitization is a percentage, so the "number of prefix >> > allocations" needs a unit conversion to be comparable to it. >> >> [if - added 'percent' to the description] >> >> > >> > Appendix C >> > >> > container lease-storage { >> > description >> > "Configures how the server will stores leases."; >> > choice storage-type { >> > description >> > "The type storage that will be used for lease >> > information."; >> > >> > s/type storage/type of storage/ >> >> [if - fixed] >> >> > >> > case mysql { >> > leaf mysql-name { >> > type string; >> > description >> > "Name of the database."; >> > } >> > [...] >> > >> > This seems to not have provision for configuring mandatory TLS usage for >> > connection to the mysql server. >> > (Same for the postgres case.) >> >> [if - I’ve just found draft-ietf-netconf-tls-client-server-26 which >> covers this and >> Would seem to be the right way to do this. >> >> However, importing this module and its dependencies and using the >> tis-client-grouping for >> Mysql and Postgres results in the tree diagram growing from 49 lines to >> 401 with the TLS configuration, which somewhat detracts from the point of >> the example. >> >> Given that this is provided as an example module for a theoretical >> implementation, >> Would it make more sense to remove the mysql-host choice and add text in >> The mysql-host configuration description to say that the database must be >> running >> On the localhost? This could be noted in the Appendix descriptive text as >> well.] >> >> > >> > leaf mysql-port { >> > type inet:port-number; >> > default 5432; >> > >> > mysql's registered port seems to be 3306 (5432 is assigned for >> > postgres). >> >> [if - changed] >> >> > >> > Appendix D >> > >> > classifying clients. So this standard does not try to provide full >> > specification for class selection, it only shows an example how it >> > could be defined. >> > >> > s/example/example of/ >> >> [if - changed] >> >> > >> > grouping client-class-id { >> > description >> > "Definitions of client message classification for >> > authorization and assignment purposes."; >> > leaf client-class-name { >> > type string; >> > description >> > "Unique Identifier for client class identification list >> > entries."; >> > >> > Shouldn't this be mandatory if it's going to be the only way we refer to >> > class IDs? I guess the grouping is currently only used in one place, >> > and it's a list key there (so implicitly mandatory), but I still wonder >> > if the grouping is more reusable with "mandatory true". >> >> [if - Added mandatory true] >> >> > >> > leaf relay-interface { >> > type string; >> > description >> > "Reference to the interface entry for the incoming >> > DHCPv6 message."; >> > >> > Whatever we do in the main module for the encoding of the interface >> > entry should be reflected here as well. >> >> [if - Changed the descriptions to align with the interface-id option text >> in the relay module: >> >> case relay-interface-id { >> description >> "Client class selection based on a received instance of >> OPTION_INTERFACE_ID (18)."; >> leaf relay-interface { >> type string; >> description >> "An opaque value of arbitrary length generated by the >> >> relay agent to identify one of the relay agent's >> interfaces.”; >> ] >> >> >> > >> > leaf vendor-class-data { >> > type string; >> > mandatory true; >> > description >> > "Vendor class data to match."; >> > >> > (likewise) >> >> [if - Changed to: >> >> container vendor-class-option-data { >> description >> "Vendor class option data container."; >> leaf enterprise-number { >> type uint32; >> description >> "The vendor's registered Enterprise Number as >> maintained by IANA."; >> } >> leaf vendor-class-data-id { >> type uint8; >> description >> "Vendor class data ID"; >> } >> leaf vendor-class-data { >> type string; >> description >> "Opaque field for matching the client's vendor class >> data."; >> } >> >> ] >> >> > >> > leaf remote-id { >> > type string; >> > mandatory true; >> > description >> > "Remote-ID data to match."; >> > >> > (and here) >> >> [if - The remote-id option case in the class selction example module was >> left over from a previous version of the draft. >> As remote-id is not defined in RFC8415 it’s no longer modelled in this >> doc, so I’ve removed it from the example.] >> >> > >> > >> > > > >
- [dhcwg] Benjamin Kaduk's Discuss on draft-ietf-dh… Benjamin Kaduk via Datatracker
- Re: [dhcwg] Benjamin Kaduk's Discuss on draft-iet… ianfarrer
- Re: [dhcwg] Benjamin Kaduk's Discuss on draft-iet… Timothy Winters
- Re: [dhcwg] Benjamin Kaduk's Discuss on draft-iet… Timothy Winters
- Re: [dhcwg] Benjamin Kaduk's Discuss on draft-iet… ianfarrer
- Re: [dhcwg] Benjamin Kaduk's Discuss on draft-iet… ianfarrer
- Re: [dhcwg] Benjamin Kaduk's Discuss on draft-iet… Benjamin Kaduk
- Re: [dhcwg] Benjamin Kaduk's Discuss on draft-iet… Benjamin Kaduk
- Re: [dhcwg] Benjamin Kaduk's Discuss on draft-iet… ianfarrer
- Re: [dhcwg] Benjamin Kaduk's Discuss on draft-iet… ian.farrer