Skip to content

Commit eea5119

Browse files
author
Steve French
committed
smb3: add support for IAKerb
There are now more servers which advertise support for IAKerb (passthrough Kerberos authentication via proxy). IAKerb is a public extension industry standard Kerberos protocol that allows a client without line-of-sight to a Domain Controller to authenticate. There can be cases where we would fail to mount if the server only advertises the OID for IAKerb in SPNEGO/GSSAPI. Add code to allow us to still upcall to userspace in these cases to obtain the Kerberos ticket. Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 021840c commit eea5119

File tree

5 files changed

+12
-3
lines changed

5 files changed

+12
-3
lines changed

fs/smb/client/asn1.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ int cifs_neg_token_init_mech_type(void *context, size_t hdrlen,
5252
server->sec_kerberos = true;
5353
else if (oid == OID_ntlmssp)
5454
server->sec_ntlmssp = true;
55+
else if (oid == OID_IAKerb)
56+
server->sec_iakerb = true;
5557
else {
5658
char buf[50];
5759

fs/smb/client/cifs_spnego.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,13 @@ cifs_get_spnego_key(struct cifs_ses *sesInfo,
138138

139139
dp = description + strlen(description);
140140

141-
/* for now, only sec=krb5 and sec=mskrb5 are valid */
141+
/* for now, only sec=krb5 and sec=mskrb5 and iakerb are valid */
142142
if (server->sec_kerberos)
143143
sprintf(dp, ";sec=krb5");
144144
else if (server->sec_mskerberos)
145145
sprintf(dp, ";sec=mskrb5");
146+
else if (server->sec_iakerb)
147+
sprintf(dp, ";sec=iakerb");
146148
else {
147149
cifs_dbg(VFS, "unknown or missing server auth type, use krb5\n");
148150
sprintf(dp, ";sec=krb5");

fs/smb/client/cifsglob.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ enum securityEnum {
151151
NTLMv2, /* Legacy NTLM auth with NTLMv2 hash */
152152
RawNTLMSSP, /* NTLMSSP without SPNEGO, NTLMv2 hash */
153153
Kerberos, /* Kerberos via SPNEGO */
154+
IAKerb, /* Kerberos proxy */
154155
};
155156

156157
enum upcall_target_enum {
@@ -781,6 +782,7 @@ struct TCP_Server_Info {
781782
bool sec_kerberosu2u; /* supports U2U Kerberos */
782783
bool sec_kerberos; /* supports plain Kerberos */
783784
bool sec_mskerberos; /* supports legacy MS Kerberos */
785+
bool sec_iakerb; /* supports pass-through auth for Kerberos (krb5 proxy) */
784786
bool large_buf; /* is current buffer large? */
785787
/* use SMBD connection instead of socket */
786788
bool rdma;
@@ -2148,6 +2150,8 @@ static inline char *get_security_type_str(enum securityEnum sectype)
21482150
return "Kerberos";
21492151
case NTLMv2:
21502152
return "NTLMv2";
2153+
case IAKerb:
2154+
return "IAKerb";
21512155
default:
21522156
return "Unknown";
21532157
}

fs/smb/client/sess.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1235,12 +1235,13 @@ cifs_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
12351235
switch (requested) {
12361236
case Kerberos:
12371237
case RawNTLMSSP:
1238+
case IAKerb:
12381239
return requested;
12391240
case Unspecified:
12401241
if (server->sec_ntlmssp &&
12411242
(global_secflags & CIFSSEC_MAY_NTLMSSP))
12421243
return RawNTLMSSP;
1243-
if ((server->sec_kerberos || server->sec_mskerberos) &&
1244+
if ((server->sec_kerberos || server->sec_mskerberos || server->sec_iakerb) &&
12441245
(global_secflags & CIFSSEC_MAY_KRB5))
12451246
return Kerberos;
12461247
fallthrough;

fs/smb/client/smb2pdu.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1429,7 +1429,7 @@ smb2_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
14291429
if (server->sec_ntlmssp &&
14301430
(global_secflags & CIFSSEC_MAY_NTLMSSP))
14311431
return RawNTLMSSP;
1432-
if ((server->sec_kerberos || server->sec_mskerberos) &&
1432+
if ((server->sec_kerberos || server->sec_mskerberos || server->sec_iakerb) &&
14331433
(global_secflags & CIFSSEC_MAY_KRB5))
14341434
return Kerberos;
14351435
fallthrough;

0 commit comments

Comments
 (0)