mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
smb3: add support for IAKerb
[ Upstream commit eea5119fa5979c350af5783a8148eacdd4219715 ] 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: 605b249ea967 ("smb: client: Fix match_session bug preventing session reuse") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
0f928c11e7
commit
98bbcf4cca
@@ -52,6 +52,8 @@ int cifs_neg_token_init_mech_type(void *context, size_t hdrlen,
|
|||||||
server->sec_kerberos = true;
|
server->sec_kerberos = true;
|
||||||
else if (oid == OID_ntlmssp)
|
else if (oid == OID_ntlmssp)
|
||||||
server->sec_ntlmssp = true;
|
server->sec_ntlmssp = true;
|
||||||
|
else if (oid == OID_IAKerb)
|
||||||
|
server->sec_iakerb = true;
|
||||||
else {
|
else {
|
||||||
char buf[50];
|
char buf[50];
|
||||||
|
|
||||||
|
|||||||
@@ -130,11 +130,13 @@ cifs_get_spnego_key(struct cifs_ses *sesInfo,
|
|||||||
|
|
||||||
dp = description + strlen(description);
|
dp = description + strlen(description);
|
||||||
|
|
||||||
/* for now, only sec=krb5 and sec=mskrb5 are valid */
|
/* for now, only sec=krb5 and sec=mskrb5 and iakerb are valid */
|
||||||
if (server->sec_kerberos)
|
if (server->sec_kerberos)
|
||||||
sprintf(dp, ";sec=krb5");
|
sprintf(dp, ";sec=krb5");
|
||||||
else if (server->sec_mskerberos)
|
else if (server->sec_mskerberos)
|
||||||
sprintf(dp, ";sec=mskrb5");
|
sprintf(dp, ";sec=mskrb5");
|
||||||
|
else if (server->sec_iakerb)
|
||||||
|
sprintf(dp, ";sec=iakerb");
|
||||||
else {
|
else {
|
||||||
cifs_dbg(VFS, "unknown or missing server auth type, use krb5\n");
|
cifs_dbg(VFS, "unknown or missing server auth type, use krb5\n");
|
||||||
sprintf(dp, ";sec=krb5");
|
sprintf(dp, ";sec=krb5");
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ enum securityEnum {
|
|||||||
NTLMv2, /* Legacy NTLM auth with NTLMv2 hash */
|
NTLMv2, /* Legacy NTLM auth with NTLMv2 hash */
|
||||||
RawNTLMSSP, /* NTLMSSP without SPNEGO, NTLMv2 hash */
|
RawNTLMSSP, /* NTLMSSP without SPNEGO, NTLMv2 hash */
|
||||||
Kerberos, /* Kerberos via SPNEGO */
|
Kerberos, /* Kerberos via SPNEGO */
|
||||||
|
IAKerb, /* Kerberos proxy */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct session_key {
|
struct session_key {
|
||||||
@@ -685,6 +686,7 @@ struct TCP_Server_Info {
|
|||||||
bool sec_kerberosu2u; /* supports U2U Kerberos */
|
bool sec_kerberosu2u; /* supports U2U Kerberos */
|
||||||
bool sec_kerberos; /* supports plain Kerberos */
|
bool sec_kerberos; /* supports plain Kerberos */
|
||||||
bool sec_mskerberos; /* supports legacy MS Kerberos */
|
bool sec_mskerberos; /* supports legacy MS Kerberos */
|
||||||
|
bool sec_iakerb; /* supports pass-through auth for Kerberos (krb5 proxy) */
|
||||||
bool large_buf; /* is current buffer large? */
|
bool large_buf; /* is current buffer large? */
|
||||||
/* use SMBD connection instead of socket */
|
/* use SMBD connection instead of socket */
|
||||||
bool rdma;
|
bool rdma;
|
||||||
@@ -2049,6 +2051,8 @@ static inline char *get_security_type_str(enum securityEnum sectype)
|
|||||||
return "Kerberos";
|
return "Kerberos";
|
||||||
case NTLMv2:
|
case NTLMv2:
|
||||||
return "NTLMv2";
|
return "NTLMv2";
|
||||||
|
case IAKerb:
|
||||||
|
return "IAKerb";
|
||||||
default:
|
default:
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1209,12 +1209,13 @@ cifs_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
|
|||||||
switch (requested) {
|
switch (requested) {
|
||||||
case Kerberos:
|
case Kerberos:
|
||||||
case RawNTLMSSP:
|
case RawNTLMSSP:
|
||||||
|
case IAKerb:
|
||||||
return requested;
|
return requested;
|
||||||
case Unspecified:
|
case Unspecified:
|
||||||
if (server->sec_ntlmssp &&
|
if (server->sec_ntlmssp &&
|
||||||
(global_secflags & CIFSSEC_MAY_NTLMSSP))
|
(global_secflags & CIFSSEC_MAY_NTLMSSP))
|
||||||
return RawNTLMSSP;
|
return RawNTLMSSP;
|
||||||
if ((server->sec_kerberos || server->sec_mskerberos) &&
|
if ((server->sec_kerberos || server->sec_mskerberos || server->sec_iakerb) &&
|
||||||
(global_secflags & CIFSSEC_MAY_KRB5))
|
(global_secflags & CIFSSEC_MAY_KRB5))
|
||||||
return Kerberos;
|
return Kerberos;
|
||||||
fallthrough;
|
fallthrough;
|
||||||
|
|||||||
@@ -1270,7 +1270,7 @@ smb2_select_sectype(struct TCP_Server_Info *server, enum securityEnum requested)
|
|||||||
if (server->sec_ntlmssp &&
|
if (server->sec_ntlmssp &&
|
||||||
(global_secflags & CIFSSEC_MAY_NTLMSSP))
|
(global_secflags & CIFSSEC_MAY_NTLMSSP))
|
||||||
return RawNTLMSSP;
|
return RawNTLMSSP;
|
||||||
if ((server->sec_kerberos || server->sec_mskerberos) &&
|
if ((server->sec_kerberos || server->sec_mskerberos || server->sec_iakerb) &&
|
||||||
(global_secflags & CIFSSEC_MAY_KRB5))
|
(global_secflags & CIFSSEC_MAY_KRB5))
|
||||||
return Kerberos;
|
return Kerberos;
|
||||||
fallthrough;
|
fallthrough;
|
||||||
|
|||||||
Reference in New Issue
Block a user