summaryrefslogtreecommitdiffstats
path: root/source4/kdc/authn_policy_util.h
blob: 48958037455aa6a4b0a7acbb744f774ecc031087 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
/*
   Unix SMB/CIFS implementation.
   Samba Active Directory authentication policy utility functions

   Copyright (C) Catalyst.Net Ltd 2023

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef KDC_AUTHN_POLICY_UTIL_H
#define KDC_AUTHN_POLICY_UTIL_H

#include "lib/replace/replace.h"
#include "auth/authn_policy.h"
#include "auth/session.h"
#include <talloc.h>

struct ldb_context;
struct loadparm_context;
struct ldb_message;

bool authn_policy_silos_and_policies_in_effect(struct ldb_context *samdb);

bool authn_policy_allowed_ntlm_network_auth_in_effect(struct ldb_context *samdb);

/*
 * Look up the silo assigned to an account. If one exists, returns its details
 * and whether it is enforced or not. ‘silo_attrs’ comprises the attributes to
 * include in the search result, the relevant set of which can differ depending
 * on the account’s objectClass.
 */
int authn_policy_get_assigned_silo(struct ldb_context *samdb,
				   TALLOC_CTX *mem_ctx,
				   const struct ldb_message *msg,
				   const char *const *silo_attrs,
				   const struct ldb_message **silo_msg_out,
				   bool *is_enforced);

struct auth_user_info_dc;

/* Authentication policies for Kerberos clients. */

/*
 * Get the applicable authentication policy for an account acting as a Kerberos
 * client.
 */
int authn_policy_kerberos_client(struct ldb_context *samdb,
				 TALLOC_CTX *mem_ctx,
				 const struct ldb_message *msg,
				 const struct authn_kerberos_client_policy **policy_out);

/*
 * Perform an access check for the device with which the client is
 * authenticating. ‘device_info’ must be talloc-allocated so that we can make a
 * reference to it.
 */
NTSTATUS authn_policy_authenticate_from_device(TALLOC_CTX *mem_ctx,
					       struct ldb_context *samdb,
					       struct loadparm_context* lp_ctx,
					       const struct auth_user_info_dc *device_info,
					       const struct auth_claims auth_claims,
					       const struct authn_kerberos_client_policy *client_policy,
					       struct authn_audit_info **client_audit_info_out);

/* Return whether an authentication policy enforces device restrictions. */
bool authn_policy_device_restrictions_present(const struct authn_kerberos_client_policy *policy);

/* Authentication policies for NTLM clients. */

struct authn_ntlm_client_policy;

/*
 * Get the applicable authentication policy for an account acting as an NTLM
 * client.
 */
int authn_policy_ntlm_client(struct ldb_context *samdb,
			     TALLOC_CTX *mem_ctx,
			     const struct ldb_message *msg,
			     const struct authn_ntlm_client_policy **policy_out);

/* Check whether the client is allowed to authenticate using NTLM. */
NTSTATUS authn_policy_ntlm_apply_device_restriction(TALLOC_CTX *mem_ctx,
						    const struct authn_ntlm_client_policy *client_policy,
						    struct authn_audit_info **client_audit_info_out);

/* Authentication policies for servers. */

struct authn_server_policy;

/*
 * Get the applicable authentication policy for an account acting as a
 * server.
 */
int authn_policy_server(struct ldb_context *samdb,
			TALLOC_CTX *mem_ctx,
			const struct ldb_message *msg,
			const struct authn_server_policy **policy_out);

/* Return whether an authentication policy enforces restrictions. */
bool authn_policy_restrictions_present(const struct authn_server_policy *policy);

enum authn_policy_auth_type {
	AUTHN_POLICY_AUTH_TYPE_KERBEROS,
	AUTHN_POLICY_AUTH_TYPE_NTLM,
};

struct authn_policy_flags {
	bool force_compounded_authentication : 1;
};

/*
 * Perform an access check for the client attempting to authenticate to the
 * server. ‘user_info’ must be talloc-allocated so that we can make a reference
 * to it.
 */
NTSTATUS authn_policy_authenticate_to_service(TALLOC_CTX *mem_ctx,
					      struct ldb_context *samdb,
					      struct loadparm_context* lp_ctx,
					      enum authn_policy_auth_type auth_type,
					      const struct auth_user_info_dc *user_info,
					      const struct auth_user_info_dc *device_info,
					      const struct auth_claims auth_claims,
					      const struct authn_server_policy *server_policy,
					      const struct authn_policy_flags authn_policy_flags,
					      struct authn_audit_info **server_audit_info_out);

/* Create a structure containing auditing information. */
NTSTATUS _authn_kerberos_client_policy_audit_info(
	TALLOC_CTX *mem_ctx,
	const struct authn_kerberos_client_policy *client_policy,
	const struct auth_user_info_dc *client_info,
	enum authn_audit_event event,
	enum authn_audit_reason reason,
	NTSTATUS policy_status,
	const char *location,
	struct authn_audit_info **audit_info_out);

/* Create a structure containing auditing information. */
#define authn_kerberos_client_policy_audit_info( \
	mem_ctx, \
	policy, \
	client_info, \
	event, \
	reason, \
	policy_status, \
	audit_info_out) \
	_authn_kerberos_client_policy_audit_info( \
		mem_ctx, \
		policy, \
		client_info, \
		event, \
		reason, \
		policy_status, \
		__location__, \
		audit_info_out)

/* Create a structure containing auditing information. */
NTSTATUS _authn_ntlm_client_policy_audit_info(
	TALLOC_CTX *mem_ctx,
	const struct authn_ntlm_client_policy *policy,
	const struct auth_user_info_dc *client_info,
	enum authn_audit_event event,
	enum authn_audit_reason reason,
	NTSTATUS policy_status,
	const char *location,
	struct authn_audit_info **audit_info_out);

/* Create a structure containing auditing information. */
#define authn_ntlm_client_policy_audit_info( \
	mem_ctx, \
	policy, \
	client_info, \
	event, \
	reason, \
	policy_status, \
	audit_info_out) \
	_authn_ntlm_client_policy_audit_info( \
		mem_ctx, \
		policy, \
		client_info, \
		event, \
		reason, \
		policy_status, \
		__location__, \
		audit_info_out)

/* Create a structure containing auditing information. */
NTSTATUS _authn_server_policy_audit_info(
	TALLOC_CTX *mem_ctx,
	const struct authn_server_policy *policy,
	const struct auth_user_info_dc *client_info,
	enum authn_audit_event event,
	enum authn_audit_reason reason,
	NTSTATUS policy_status,
	const char *location,
	struct authn_audit_info **audit_info_out);

/* Create a structure containing auditing information. */
#define authn_server_policy_audit_info( \
	mem_ctx, \
	policy, \
	client_info, \
	event, \
	reason, \
	policy_status, \
	audit_info_out) \
	_authn_server_policy_audit_info( \
		mem_ctx, \
		policy, \
		client_info, \
		event, \
		reason, \
		policy_status, \
		__location__, \
		audit_info_out)

#endif