1use serde_json::Value;
4
5use crate::Secret;
6use crate::model;
7use crate::models::KnownValues;
8
9pub const LOG_TYPES: &[&str] = &["configuration", "network"];
11
12pub const DESTINATION_TYPES: &[&str] = &[
14 "splunk",
15 "elastic",
16 "panther",
17 "cribl",
18 "crowdstrike",
19 "datadog",
20 "axiom",
21 "s3",
22];
23
24pub const COMPRESSION_FORMATS: &[&str] = &["zstd", "gzip", "none"];
26
27pub const S3_AUTHENTICATION_TYPES: &[&str] = &["accesskey", "rolearn"];
29
30pub const AUDIT_LOG_TYPES: &[&str] = &["CONFIG"];
33
34pub const AUDIT_ORIGINS: &[&str] = &[
36 "ADMIN_CONSOLE",
37 "CONFIG_API",
38 "CONTROL",
39 "IDENTITY_PROVIDER",
40 "NODE",
41 "SUPPORT_REQUEST",
42 "STRIPE",
43 "SECURITY_NOTIFICATION",
44 "LEGAL_NOTIFICATION",
45 "BORDER0_API",
46];
47
48pub const AUDIT_ACTOR_TYPES: &[&str] = &[
50 "USER",
51 "NODE",
52 "AUTOMATED_WORKER",
53 "OAUTH_CLIENT",
54 "SCIM",
55 "MULLVAD",
56 "LOGSTREAM",
57 "SECRET_SCANNER",
58 "PAM_CONNECTOR",
59 "PAM_SERVICE_ACCOUNT",
60];
61
62pub const AUDIT_TARGET_TYPES: &[&str] = &[
64 "TAILNET",
65 "USER",
66 "GROUP",
67 "NODE",
68 "API_KEY",
69 "INVITE",
70 "SHARE",
71 "BILLING",
72 "ADMIN_CONSOLE",
73 "WEB_INTERFACE",
74 "WEBHOOK_ENDPOINT",
75 "FAILED_REQUEST",
76];
77
78pub const AUDIT_TARGET_PROPERTIES: &[&str] = &[
81 "ACL",
82 "ACL_TAGS",
83 "ACCOUNT_EMAIL",
84 "ADDRESS",
85 "ALLOWED_IPS",
86 "AUTO_APPROVED_ROUTES",
87 "ATTRIBUTES",
88 "BILLING_OWNER",
89 "COLLECT_SERVICES",
90 "COLLECT_POSTURE_IDENTITY",
91 "MULLVAD_VPN",
92 "DNS_CONFIG",
93 "EMAIL",
94 "EXIT_NODE",
95 "FEATURE",
96 "FILE_SHARING",
97 "HTTPS",
98 "KEY_EXPIRY_TIME",
99 "KEY_EXPIRY",
100 "LOG_EXIT_FLOWS",
101 "LOGSTREAM_ENDPOINT",
102 "MAGIC_DNS",
103 "MACHINE_AUTH_NEEDED",
104 "MACHINE_APPROVAL_NEEDED",
105 "USER_APPROVAL_REQUIRED",
106 "MACHINE_NAME",
107 "MAX_KEY_DURATION",
108 "NETWORK_FLOW_LOGGING",
109 "GEOSTEERING",
110 "NODE_SHARE",
111 "TAILNET_INVITE",
112 "PAYMENT_INFO",
113 "POSTURE_IDENTITY",
114 "POSTURE_INTEGRATION",
115 "USER_ROLE",
116 "SCIM",
117 "SECURITY_EMAIL",
118 "STRIPE_CUSTOMER_ID",
119 "SUBSCRIPTION",
120 "SUBSCRIBED_EVENTS",
121 "SUPPORT_EMAIL",
122 "SECRET",
123 "TCD",
124 "TKA",
125 "AUTH_PROVIDER",
126];
127
128pub const AUDIT_ACTIONS: &[&str] = &[
130 "LOGIN",
131 "LOGOUT",
132 "CREATE",
133 "UPDATE",
134 "DELETE",
135 "CANCEL",
136 "REVOKE",
137 "APPROVE",
138 "SUSPEND",
139 "RESTORE",
140 "ENABLE",
141 "DISABLE",
142 "ACCEPT",
143 "EXPIRED",
144 "PUSH_USER",
145 "PUSH_GROUP",
146 "VERIFY",
147 "JOIN_WAITLIST",
148 "INVITE",
149 "JOIN",
150 "LEAVE",
151 "RESEND",
152 "MIGRATE_AUTH_PROVIDER",
153];
154
155pub const FLOW_PROTOCOLS: &[&str] = &[
158 "ah",
159 "dccp",
160 "egp",
161 "esp",
162 "gre",
163 "icmp",
164 "igmp",
165 "igp",
166 "ipv4",
167 "ipv6-icmp",
168 "sctp",
169 "tcp",
170 "udp",
171];
172
173pub const AUDIT_EVENTS: &[&str] = &[
179 "ADMIN_CONSOLE.LOGIN", "ADMIN_CONSOLE.LOGOUT", "API_KEY.CREATE", "API_KEY.EXPIRED",
180 "API_KEY.REVOKE", "BILLING.CANCEL.SUBSCRIPTION", "BILLING.CREATE.SUBSCRIPTION",
181 "BILLING.UPDATE.ADDRESS", "BILLING.UPDATE.BILLING_OWNER", "BILLING.UPDATE.EMAIL",
182 "BILLING.UPDATE.PAYMENT_INFO", "BILLING.UPDATE.STRIPE_CUSTOMER_ID",
183 "BILLING.UPDATE.SUBSCRIPTION", "FAILED_REQUEST.UPDATE", "GROUP.PUSH_GROUP.ATTRIBUTES",
184 "GROUP.UPDATE.USER_ROLE",
185 "INVITE.ACCEPT.FEATURE", "INVITE.ACCEPT.NODE_SHARE", "INVITE.ACCEPT.TAILNET_INVITE",
186 "INVITE.CREATE.FEATURE", "INVITE.CREATE.NODE_SHARE", "INVITE.CREATE.TAILNET_INVITE",
187 "INVITE.DELETE.NODE_SHARE", "INVITE.DELETE.TAILNET_INVITE", "INVITE.RESEND.NODE_SHARE",
188 "INVITE.RESEND.TAILNET_INVITE", "NODE.APPROVE", "NODE.CREATE", "NODE.CREATE.ATTRIBUTES",
189 "NODE.DELETE", "NODE.DELETE.ATTRIBUTES", "NODE.DISABLE.KEY_EXPIRY",
190 "NODE.DISCONNECT_NODE.CLIENT_LOG", "NODE.ENABLE.KEY_EXPIRY",
191 "NODE.EXPIRED.KEY_EXPIRY_TIME", "NODE.LOGIN", "NODE.LOGOUT", "NODE.REVOKE",
192 "NODE.UPDATE.ACL_TAGS", "NODE.UPDATE.ALLOWED_IPS", "NODE.UPDATE.ATTRIBUTES",
193 "NODE.UPDATE.AUTO_APPROVED_ROUTES", "NODE.UPDATE.EXIT_NODE",
194 "NODE.UPDATE.KEY_EXPIRY_TIME", "NODE.UPDATE.MACHINE_NAME",
195 "NODE.UPDATE.POSTURE_IDENTITY", "NODE.UPDATE.TKA", "SHARE.CREATE", "SHARE.DELETE",
196 "SHARE.UPDATE", "TAILNET.ACCEPT.FEATURE", "TAILNET.CREATE",
197 "TAILNET.CREATE.LOGSTREAM_ENDPOINT", "TAILNET.CREATE.POSTURE_INTEGRATION",
198 "TAILNET.CREATE.TKA", "TAILNET.DELETE.LOGSTREAM_ENDPOINT",
199 "TAILNET.DELETE.POSTURE_INTEGRATION", "TAILNET.DELETE.TKA",
200 "TAILNET.DISABLE.COLLECT_POSTURE_IDENTITY", "TAILNET.DISABLE.COLLECT_SERVICES",
201 "TAILNET.DISABLE.FILE_SHARING", "TAILNET.DISABLE.GEOSTEERING", "TAILNET.DISABLE.HTTPS",
202 "TAILNET.DISABLE.LOG_EXIT_FLOWS", "TAILNET.DISABLE.MACHINE_APPROVAL_NEEDED",
203 "TAILNET.DISABLE.MAGIC_DNS", "TAILNET.DISABLE.MULLVAD_VPN",
204 "TAILNET.DISABLE.NETWORK_FLOW_LOGGING", "TAILNET.DISABLE.SCIM", "TAILNET.DISABLE.TKA",
205 "TAILNET.DISABLE.USER_APPROVAL_REQUIRED", "TAILNET.ENABLE.COLLECT_POSTURE_IDENTITY",
206 "TAILNET.ENABLE.COLLECT_SERVICES", "TAILNET.ENABLE.FILE_SHARING",
207 "TAILNET.ENABLE.GEOSTEERING", "TAILNET.ENABLE.HTTPS", "TAILNET.ENABLE.LOG_EXIT_FLOWS",
208 "TAILNET.ENABLE.MACHINE_APPROVAL_NEEDED", "TAILNET.ENABLE.MAGIC_DNS",
209 "TAILNET.ENABLE.MULLVAD_VPN", "TAILNET.ENABLE.NETWORK_FLOW_LOGGING",
210 "TAILNET.ENABLE.SCIM", "TAILNET.ENABLE.TKA", "TAILNET.ENABLE.USER_APPROVAL_REQUIRED",
211 "TAILNET.JOIN", "TAILNET.JOIN_WAITLIST.FEATURE", "TAILNET.LEAVE",
212 "TAILNET.UPDATE.ACCOUNT_EMAIL", "TAILNET.UPDATE.ACL", "TAILNET.UPDATE.DNS_CONFIG",
213 "TAILNET.UPDATE.LOGSTREAM_ENDPOINT", "TAILNET.UPDATE.MAX_KEY_DURATION",
214 "TAILNET.UPDATE.POSTURE_INTEGRATION", "TAILNET.UPDATE.SECURITY_EMAIL",
215 "TAILNET.UPDATE.SUPPORT_EMAIL", "TAILNET.UPDATE.TCD", "TAILNET.UPDATE.TKA",
216 "TAILNET.VERIFY.ACCOUNT_EMAIL", "TAILNET.VERIFY.SECURITY_EMAIL",
217 "TAILNET.VERIFY.SUPPORT_EMAIL", "USER.APPROVE", "USER.CREATE", "USER.DELETE",
218 "USER.INVITE", "USER.PUSH_USER.ATTRIBUTES", "USER.RESEND.TAILNET_INVITE",
219 "USER.RESTORE", "USER.RESTORE_GLOBAL", "USER.SUSPEND", "USER.SUSPEND_GLOBAL",
220 "USER.UPDATE.USER_ROLE", "WEBHOOK_ENDPOINT.CREATE", "WEBHOOK_ENDPOINT.DELETE",
221 "WEBHOOK_ENDPOINT.UPDATE.SECRET", "WEBHOOK_ENDPOINT.UPDATE.SUBSCRIBED_EVENTS",
222 "WEB_INTERFACE.LOGIN", "WEB_INTERFACE.LOGOUT", "PAM_CONNECTOR.CREATE",
223 "PAM_CONNECTOR.CREATE.ACCESS_TOKEN", "PAM_CONNECTOR.DELETE",
224 "PAM_CONNECTOR.DISABLE.ACCESS_TOKEN", "PAM_CONNECTOR.UPDATE", "PAM_SERVICE.CREATE",
225 "PAM_SERVICE.DELETE", "PAM_SERVICE.UPDATE", "PAM_SERVICE_ACCOUNT.CREATE",
226 "PAM_SERVICE_ACCOUNT.CREATE.ACCESS_TOKEN", "PAM_SERVICE_ACCOUNT.DELETE",
227 "PAM_SERVICE_ACCOUNT.UPDATE", "PAM_SETTINGS.CREATE.CUSTOM_DOMAIN",
228 "PAM_SETTINGS.CREATE.NOTIFICATION", "PAM_SETTINGS.CREATE.RECORDING_STORAGE",
229 "PAM_SETTINGS.DELETE.CUSTOM_DOMAIN", "PAM_SETTINGS.DELETE.NOTIFICATION",
230 "PAM_SETTINGS.DELETE.RECORDING_STORAGE", "PAM_SETTINGS.UPDATE",
231 "PAM_SETTINGS.UPDATE.CUSTOM_DOMAIN", "PAM_SETTINGS.UPDATE.NOTIFICATION",
232 "PAM_SETTINGS.UPDATE.SETUP_WIZARD",
233];
234
235pub const KNOWN_VALUES: &[KnownValues] = &[
236 ("LogType", LOG_TYPES),
237 (
238 "LogstreamEndpointConfiguration.destinationType",
239 DESTINATION_TYPES,
240 ),
241 (
242 "LogstreamEndpointConfiguration.compressionFormat",
243 COMPRESSION_FORMATS,
244 ),
245 (
246 "LogstreamEndpointConfiguration.s3AuthenticationType",
247 S3_AUTHENTICATION_TYPES,
248 ),
249 ("ConfigurationAuditLog.type", AUDIT_LOG_TYPES),
250 ("ConfigurationAuditLog.origin", AUDIT_ORIGINS),
251 ("ConfigurationAuditLog.actor.type", AUDIT_ACTOR_TYPES),
252 ("ConfigurationAuditLog.target.type", AUDIT_TARGET_TYPES),
253 (
254 "ConfigurationAuditLog.target.property",
255 AUDIT_TARGET_PROPERTIES,
256 ),
257 ("ConfigurationAuditLog.action", AUDIT_ACTIONS),
258 ("ConnectionCounts.proto", FLOW_PROTOCOLS),
259 ("?event[]", AUDIT_EVENTS),
260];
261
262model! {
263 ConfigurationAuditLog {
265 event_time: "eventTime" => String,
266 log_type: "type" => String,
268 deferred_at: "deferredAt" => String,
271 event_group_id: "eventGroupID" => String,
273 origin: "origin" => String,
275 actor: "actor" => AuditActor,
276 target: "target" => AuditTarget,
277 action: "action" => String,
279 old: "old" => Value,
282 new: "new" => Value,
284 action_details: "actionDetails" => String,
286 error: "error" => String,
289 }
290
291 AuditActor as "ConfigurationAuditLog.actor" {
293 id: "id" => String,
295 actor_type: "type" => String,
297 login_name: "loginName" => String,
299 display_name: "displayName" => String,
300 tags: "tags" => Vec<String>,
301 }
302
303 AuditTarget as "ConfigurationAuditLog.target" {
305 id: "id" => String,
306 name: "name" => String,
308 target_type: "type" => String,
310 is_ephemeral: "isEphemeral" => bool,
312 property: "property" => String,
314 }
315
316 ConnectionCounts {
318 proto: "proto" => String,
320 src: "src" => String,
322 dst: "dst" => String,
324 tx_pkts: "txPkts" => i64,
325 tx_bytes: "txBytes" => i64,
326 rx_pkts: "rxPkts" => i64,
327 rx_bytes: "rxBytes" => i64,
328 }
329
330 NetworkFlowLog {
332 logged: "logged" => String,
333 node_id: "nodeId" => String,
334 start: "start" => String,
335 end: "end" => String,
336 virtual_traffic: "virtualTraffic" => Vec<ConnectionCounts>,
338 subnet_traffic: "subnetTraffic" => Vec<ConnectionCounts>,
340 exit_traffic: "exitTraffic" => Vec<ConnectionCounts>,
342 physical_traffic: "physicalTraffic" => Vec<ConnectionCounts>,
344 }
345
346 LogstreamEndpointConfiguration {
352 log_type: "logType" => String,
354 destination_type: "destinationType" => String,
356 url: "url" => String,
358 user: "user" => String,
359 upload_period_minutes: "uploadPeriodMinutes" => i64,
362 compression_format: "compressionFormat" => String,
364 token: "token" => Secret,
365 s3_bucket: "s3Bucket" => String,
366 s3_region: "s3Region" => String,
367 s3_key_prefix: "s3KeyPrefix" => String,
368 s3_authentication_type: "s3AuthenticationType" => String,
370 s3_access_key_id: "s3AccessKeyId" => String,
371 s3_secret_access_key: "s3SecretAccessKey" => Secret,
372 s3_role_arn: "s3RoleArn" => String,
374 s3_external_id: "s3ExternalId" => String,
377 gcs_bucket: "gcsBucket" => String,
378 gcs_key_prefix: "gcsKeyPrefix" => String,
379 gcs_scopes: "gcsScopes" => Vec<String>,
380 gcs_credentials: "gcsCredentials" => Secret,
382 }
383
384 AwsExternalId {
389 external_id: "externalId" => String,
390 tailscale_aws_account_id: "tailscaleAwsAccountId" => String,
391 }
392
393 LogstreamEndpointPublishingStatus {
395 last_activity: "lastActivity" => String,
396 last_error: "lastError" => String,
397 max_body_size: "maxBodySize" => i64,
398 num_bytes_sent: "numBytesSent" => i64,
399 num_entries_sent: "numEntriesSent" => i64,
400 num_spoofed_entries: "numSpoofedEntries" => i64,
401 num_total_requests: "numTotalRequests" => i64,
402 num_failed_requests: "numFailedRequests" => i64,
403 rate_bytes_sent: "rateBytesSent" => f64,
404 rate_entries_sent: "rateEntriesSent" => f64,
405 rate_total_requests: "rateTotalRequests" => f64,
406 rate_failed_requests: "rateFailedRequests" => f64,
407 }
408
409 AuditLogPage as "GET /tailnet/{tailnet}/logging/configuration 200" {
418 version: "version" => String,
419 tailnet: "tailnet" => String,
420 logs: "logs" => Vec<ConfigurationAuditLog>,
421 }
422
423 NetworkFlowLogPage as "GET /tailnet/{tailnet}/logging/network 200" {
425 logs: "logs" => Vec<NetworkFlowLog>,
426 }
427
428 AwsExternalIdRequest as "POST /tailnet/{tailnet}/aws-external-id body" {
430 reusable: "reusable" => bool,
432 }
433
434 AwsTrustPolicyRequest
436 as "POST /tailnet/{tailnet}/aws-external-id/{id}/validate-aws-trust-policy body" {
437 role_arn: "roleArn" => String,
439 }
440
441 AwsTrustPolicyFailure
447 as "POST /tailnet/{tailnet}/aws-external-id/{id}/validate-aws-trust-policy 422" {
448 message: "message" => String,
449 }
450}