Re: RFC: add a 'policy' value to GSSAPIDelegateCredentials (OK-AS-DELEGATE)

Alexander Bokovoy via openssh-unix-dev <[email protected]> Sat, 11 Jul 2026 07:36:03 +0300
Newsgroups gmane.network.openssh.devel
Message-ID <[email protected]>
On to, 09 hein=E4kuuta 2026, Avinash Duduskar wrote:
> Hi,
> =

> GSSAPIDelegateCredentials forwards the user's TGT to any host the
> client authenticates to. Kerberos has the OK-AS-DELEGATE ticket flag
> (RFC 4120) so a realm can mark which services are trusted to receive
> delegated credentials, and GSS-API exposes it through
> GSS_C_DELEG_POLICY_FLAG (RFC 5896), which for the Kerberos mechanism
> requests delegation only when the service ticket carries
> OK-AS-DELEGATE.
> =

> In the client today, ssh_gssapi_init_ctx() in gss-genr.c always sets
> GSS_C_DELEG_FLAG when delegation is enabled, so ssh requests
> delegation unconditionally and ignores the realm policy.
> =

> I'd like to add a third value to the ssh_config client option, making
> it no / yes / policy. Under policy the client requests
> GSS_C_DELEG_POLICY_FLAG instead of GSS_C_DELEG_FLAG (RFC 5896 defines
> both flags together as unconditional delegation, so policy sets the
> policy flag alone). The core change is one flag choice in
> ssh_gssapi_init_ctx() and an #ifdef for GSS_C_DELEG_POLICY_FLAG,
> which is not defined on every GSSAPI implementation. Client side
> only; sshd and the monitor are unchanged, including sshd's new
> same named accept side option. Existing yes/no semantics and the
> default are untouched; policy is strictly opt-in.
> =

> Where the macro is missing at build time, policy would degrade to
> requesting no delegation (or reject at parse; no strong preference);
> a library that predates RFC 5896 ignores the unknown bit, which is
> also no delegation. Under policy no build or library combination
> delegates unconditionally. Since non-delegation becomes a normal
> outcome under policy, the patch would check ret_flags after the
> final gss_init_sec_context() and log at verbose whether credentials
> were delegated.
> =

> MIT and Heimdal both have enforce_ok_as_delegate in krb5.conf, but
> that knob is [libdefaults] only: it demotes GSS_C_DELEG_FLAG for
> every GSSAPI application, not just ssh, and it demotes even a
> deliberate yes, so delegating unconditionally to one legacy host
> while policy-gating everywhere else is not expressible with the
> existing knobs. Both manpages document the alternative: without the
> knob, the ticket flag is "only enforced when an application
> specifically requests enforcement". ssh cannot make that request
> today; the policy value is that request, made per destination with
> Host and Match, where ssh already keeps this kind of trust decision
> (ForwardAgent). curl has shipped the same tri-state for years
> (--delegation none/policy/always).
> =

> I found no prior proposal to honor OK-AS-DELEGATE and no mention of
> GSS_C_DELEG_POLICY_FLAG in the openssh-unix-dev archives or on
> bugzilla.mindrot.org.
> =

> Before writing a patch: is this something you would consider, and
> would you rather extend GSSAPIDelegateCredentials or add a separate
> keyword? I will go with whichever fits.

Unconditional delegation is typically blocked in Active Directory
environments between trusted forests already. It is also not secure in
itself, so following a KDC-derived policy would be a tiny bit better.
Since this is purely a client side feature, I'd say adding a tristate is
fine.

-- =

/ Alexander Bokovoy