Skip to content

Commit 7dc9abf

Browse files
smfrenchgregkh
authored andcommitted
smb3: add support for IAKerb
[ Upstream commit eea5119 ] 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> Stable-dep-of: 605b249 ("smb: client: Fix match_session bug preventing session reuse") Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 643607a commit 7dc9abf

5 files changed

Lines changed: 12 additions & 3 deletions

File tree

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
@@ -130,11 +130,13 @@ cifs_get_spnego_key(struct cifs_ses *sesInfo,
130130

131131
dp = description + strlen(description);
132132

133-
/* for now, only sec=krb5 and sec=mskrb5 are valid */
133+
/* for now, only sec=krb5 and sec=mskrb5 and iakerb are valid */
134134
if (server->sec_kerberos)
135135
sprintf(dp, ";sec=krb5");
136136
else if (server->sec_mskerberos)
137137
sprintf(dp, ";sec=mskrb5");
138+
else if (server->sec_iakerb)
139+
sprintf(dp, ";sec=iakerb");
138140
else {
139141
cifs_dbg(VFS, "unknown or missing server auth type, use krb5\n");
140142
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 cifs_reparse_type {
@@ -749,6 +750,7 @@ struct TCP_Server_Info {
749750
bool sec_kerberosu2u; /* supports U2U Kerberos */
750751
bool sec_kerberos; /* supports plain Kerberos */
751752
bool sec_mskerberos; /* supports legacy MS Kerberos */
753+
bool sec_iakerb; /* supports pass-through auth for Kerberos (krb5 proxy) */
752754
bool large_buf; /* is current buffer large? */
753755
/* use SMBD connection instead of socket */
754756
bool rdma;
@@ -2156,6 +2158,8 @@ static inline char *get_security_type_str(enum securityEnum sectype)
21562158
return "Kerberos";
21572159
case NTLMv2:
21582160
return "NTLMv2";
2161+
case IAKerb:
2162+
return "IAKerb";
21592163
default:
21602164
return "Unknown";
21612165
}

fs/smb/client/sess.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1295,12 +1295,13 @@ cifs_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
12951295
switch (requested) {
12961296
case Kerberos:
12971297
case RawNTLMSSP:
1298+
case IAKerb:
12981299
return requested;
12991300
case Unspecified:
13001301
if (server->sec_ntlmssp &&
13011302
(global_secflags & CIFSSEC_MAY_NTLMSSP))
13021303
return RawNTLMSSP;
1303-
if ((server->sec_kerberos || server->sec_mskerberos) &&
1304+
if ((server->sec_kerberos || server->sec_mskerberos || server->sec_iakerb) &&
13041305
(global_secflags & CIFSSEC_MAY_KRB5))
13051306
return Kerberos;
13061307
fallthrough;

fs/smb/client/smb2pdu.c

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

0 commit comments

Comments
 (0)