esp_sdk 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  # EspSdk
7
7
 
8
- Ruby SDK for Evident.io API. Version 1.0.0 has a full test suite.
8
+ A Ruby interface for calling the [Evident.io](https://www.evident.io) API.
9
9
 
10
10
  ## Installation
11
11
 
@@ -21,1251 +21,9 @@ Or install it yourself as:
21
21
 
22
22
  $ gem install esp_sdk
23
23
 
24
- ## Usage
25
-
26
- ## Constructor
27
-
28
- # Required :password, :email
29
- # Optional :version
30
- # Default and current version 'v1'
31
- api = EspSdk::Api.new(email: 'me@google.com', password: 'password', version: 'optional')
32
-
33
- ## Configuration
34
-
35
- api.config => #<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>
36
-
37
- # Authorization token
38
- api.config.token => "6_4wys1a2FhqsECstavC"
39
-
40
- # Token expiration. ActiveSupport::TimeWithZone
41
- api.config.token_expires_at => Fri, 19 Sep 2014 15:39:10 UTC +00:00
42
-
43
- # Authorization email
44
- api.config.email => "me@gmail.com"
45
-
46
- ## End points array
47
-
48
- # Current and all endpoints in a single array
49
-
50
- api.end_points =>
51
- [
52
- [0] #<EspSdk::EndPoints::Reports:0x000001019bc498 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>,
53
- [1] #<EspSdk::EndPoints::Users:0x000001019bc038 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>,
54
- [2] #<EspSdk::EndPoints::ExternalAccounts:0x000001028a3ab0 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>,
55
- [3] #<EspSdk::EndPoints::CustomSignatures:0x000001028a3560 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>,
56
- [4] #<EspSdk::EndPoints::Organizations:0x000001028a3100 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>,
57
- [5] #<EspSdk::EndPoints::SubOrganizations:0x000001028a2bb0 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>,
58
- [6] #<EspSdk::EndPoints::Teams:0x000001028a2750 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>,
59
- [7] #<EspSdk::EndPoints::Signatures:0x000001028a22f0 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>,
60
- [8] #<EspSdk::EndPoints::Dashboard:0x000001028a1e90 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>,
61
- [9] #<EspSdk::EndPoints::ContactRequests:0x000001028a1940 @config=#<EspSdk::Configure:0x00000102890f28 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>
62
- [10] #<EspSdk::EndPoints::Services:0x000001031949f8 @config=#<EspSdk::Configure:0x000001010880e8 @email="me@gmail.com", @version="v1", @uri="https://api.evident.io/api", @token="6_4wys1a2FhqsECstavC", @token_expires_at=Fri, 19 Sep 2014 15:39:10 UTC +00:00>>
63
- ]
64
-
65
- ## Reports end point
66
- ### List action
67
- # List action is a pageable response with a total of 5 reports per page.
68
- api.reports.list =>
69
- {
70
- "id" => 130,
71
- "created_at" => "2014-08-06T19:59:57.540Z",
72
- "team" => "Evident"
73
- }
74
-
75
- # Current page
76
- api.reports.current_page
77
-
78
- # Next page sets current_page with the next page results.
79
- api.reports.next_page
80
-
81
- # Previous page sets current_page with the previous page results.
82
- api.reports.prev_page
83
-
84
- ### Show action
85
- # Show a specific report
86
- # Required :id
87
- api.reports.show(id: 130) =>
88
- {
89
- "report" => 130,
90
- "created_at" => "2014-08-06T19:59:57.540Z",
91
- "team" => "Evident",
92
- "alerts" => [
93
- [ 0] {
94
- "signature" => "Sss Global Any Bucket Permissions",
95
- "status" => "fail",
96
- "region" => "us_east_1",
97
- "external_account" => "Development",
98
- "identifier" => "AWS:SSS-008",
99
- "risk_level" => "Low",
100
- "service" => "SSS",
101
- "description" => "Check if S3 buckets have any global permissions enabled",
102
- "resolution" => "This signature is under active development.",
103
- "related_information" => {
104
- "message" => "A permission is granted to Everyone on the 'evident-prod' bucket",
105
- "bucket" => "evident-prod",
106
- "deep_inspection" => nil
107
- }
108
- },
109
- }
110
-
111
- # Current record shows the current record
112
- api.reports.current_record
113
-
114
- ## Dashboard end point
115
-
116
- ### List action
117
-
118
- # List your current dashboard stats
119
- api.dashboard.list =>
120
- {
121
- "enterprise" => true,
122
- "teams" => [
123
- [0] {
124
- "report" => {
125
- "name" => "Evident",
126
- "team_id" => 1,
127
- "sub_organization" => "Evident",
128
- "created_at" => "2014-08-06T19:59:57.540Z",
129
- "report_id" => 130,
130
- "stats" => {
131
- "total" => 196,
132
- "regions" => [
133
- [0] {
134
- "code" => "ap_northeast_1",
135
- "region_id" => 1,
136
- "total" => 2,
137
- "pass" => 5,
138
- "high" => 1,
139
- "medium" => 1,
140
- "low" => 0
141
- },
142
- [1] {
143
- "code" => "ap_southeast_1",
144
- "region_id" => 2,
145
- "total" => 2,
146
- "pass" => 6,
147
- "high" => 1,
148
- "medium" => 1,
149
- "low" => 0
150
- },
151
- [2] {
152
- "code" => "eu_west_1",
153
- "region_id" => 4,
154
- "total" => 2,
155
- "pass" => 5,
156
- "high" => 1,
157
- "medium" => 1,
158
- "low" => 0
159
- },
160
- [3] {
161
- "code" => "sa_east_1",
162
- "region_id" => 5,
163
- "total" => 2,
164
- "pass" => 5,
165
- "high" => 1,
166
- "medium" => 1,
167
- "low" => 0
168
- },
169
- [4] {
170
- "code" => "ap_southeast_2",
171
- "region_id" => 3,
172
- "total" => 2,
173
- "pass" => 5,
174
- "high" => 1,
175
- "medium" => 1,
176
- "low" => 0
177
- },
178
- [5] {
179
- "code" => "us_west_1",
180
- "region_id" => 7,
181
- "total" => 2,
182
- "pass" => 5,
183
- "high" => 1,
184
- "medium" => 1,
185
- "low" => 0
186
- },
187
- [6] {
188
- "code" => "us_west_2",
189
- "region_id" => 8,
190
- "total" => 1,
191
- "pass" => 7,
192
- "high" => 0,
193
- "medium" => 1,
194
- "low" => 0
195
- },
196
- [7] {
197
- "code" => "global",
198
- "region_id" => 9,
199
- "total" => 7,
200
- "pass" => 13,
201
- "high" => 1,
202
- "medium" => 6,
203
- "low" => 0
204
- },
205
- [8] {
206
- "code" => "us_east_1",
207
- "region_id" => 6,
208
- "total" => 45,
209
- "pass" => 80,
210
- "high" => 0,
211
- "medium" => 22,
212
- "low" => 23
213
- }
214
- ],
215
- "signatures" => [
216
- [ 0] {
217
- "signature_id" => 86,
218
- "unique_id" => "AWS:EC2-030",
219
- "total" => 2
220
- },
221
- [ 1] {
222
- "signature_id" => 22,
223
- "unique_id" => "AWS:VPC-009",
224
- "total" => 6
225
- },
226
- [ 2] {
227
- "signature_id" => 77,
228
- "unique_id" => "AWS:ELB-001",
229
- "total" => 6
230
- },
231
- [ 3] {
232
- "signature_id" => 76,
233
- "unique_id" => "AWS:EC2-032",
234
- "total" => 21
235
- },
236
- [ 4] {
237
- "signature_id" => 75,
238
- "unique_id" => "AWS:EC2-031",
239
- "total" => 8
240
- },
241
- [ 5] {
242
- "signature_id" => 92,
243
- "unique_id" => "AWS:ELB-007",
244
- "total" => 1
245
- },
246
- [ 6] {
247
- "signature_id" => 78,
248
- "unique_id" => "AWS:IAM-008",
249
- "total" => 1
250
- },
251
- [ 7] {
252
- "signature_id" => 90,
253
- "unique_id" => "AWS:SSS-006",
254
- "total" => 1
255
- },
256
- [ 8] {
257
- "signature_id" => 89,
258
- "unique_id" => "AWS:SSS-007",
259
- "total" => 1
260
- },
261
- [ 9] {
262
- "signature_id" => 17,
263
- "unique_id" => "AWS:EC2-001",
264
- "total" => 17
265
- },
266
- [10] {
267
- "signature_id" => 88,
268
- "unique_id" => "AWS:SSS-008",
269
- "total" => 1
270
- }
271
- ],
272
- "services" => [
273
- [0] {
274
- "service" => "VPC",
275
- "total" => 6,
276
- "service_id" => 8
277
- },
278
- [1] {
279
- "service" => "ELB",
280
- "total" => 7,
281
- "service_id" => 7
282
- },
283
- [2] {
284
- "service" => "IAM",
285
- "total" => 1,
286
- "service_id" => 2
287
- },
288
- [3] {
289
- "service" => "EC2",
290
- "total" => 48,
291
- "service_id" => 5
292
- },
293
- [4] {
294
- "service" => "SSS",
295
- "total" => 3,
296
- "service_id" => 4
297
- }
298
- ],
299
- "severities" => [
300
- [0] {
301
- "severity" => "medium",
302
- "total" => 35
303
- },
304
- [1] {
305
- "severity" => "high",
306
- "total" => 7
307
- },
308
- [2] {
309
- "severity" => "pass",
310
- "total" => 131
311
- },
312
- [3] {
313
- "severity" => "low",
314
- "total" => 23
315
- }
316
- ]
317
- }
318
- }
319
- }
320
- ]
321
- }
322
-
323
- ### Timewarp action
324
- #### This endpoint is used for returning dashboard stats at a specific hour in the past
325
- # Required params: time: => '1413999010' Unix Time
326
- # The time is floored and has five minutes subtracted. Then adds an hour for the end time. Any reports between that hour will have their stats returned.
327
- # EX:
328
- # start_time = DateTime.strptime('1413999010','%s').at_beginning_of_hour - 5.minutes
329
- # end_time = start_time + 1.hour
330
- api.dashboard.timewarp(time: '1413999010') =>
331
- {
332
- "enterprise" => false,
333
- "teams" => [
334
- [0] {
335
- "name" => "Default Team",
336
- "team_id" => 1,
337
- "sub_organization" => "Default Sub Organization",
338
- "created_at" => "2014-10-22T17:30:10.086Z",
339
- "report_id" => 5,
340
- "stats" => {
341
- "total" => 356,
342
- "regions" => [
343
- [0] {
344
- "code" => "global",
345
- "region_id" => 9,
346
- "total" => 23,
347
- "pass" => 22,
348
- "high" => 1,
349
- "medium" => 22,
350
- "low" => 0
351
- },
352
- [1] {
353
- "code" => "us_east_1",
354
- "region_id" => 6,
355
- "total" => 139,
356
- "pass" => 105,
357
- "high" => 0,
358
- "medium" => 67,
359
- "low" => 72
360
- },
361
- [2] {
362
- "code" => "eu_west_1",
363
- "region_id" => 4,
364
- "total" => 3,
365
- "pass" => 6,
366
- "high" => 2,
367
- "medium" => 1,
368
- "low" => 0
369
- },
370
- [3] {
371
- "code" => "ap_northeast_1",
372
- "region_id" => 1,
373
- "total" => 3,
374
- "pass" => 6,
375
- "high" => 2,
376
- "medium" => 1,
377
- "low" => 0
378
- },
379
- [4] {
380
- "code" => "us_west_1",
381
- "region_id" => 7,
382
- "total" => 3,
383
- "pass" => 6,
384
- "high" => 2,
385
- "medium" => 1,
386
- "low" => 0
387
- },
388
- [5] {
389
- "code" => "ap_southeast_1",
390
- "region_id" => 2,
391
- "total" => 3,
392
- "pass" => 7,
393
- "high" => 2,
394
- "medium" => 1,
395
- "low" => 0
396
- },
397
- [6] {
398
- "code" => "us_west_2",
399
- "region_id" => 8,
400
- "total" => 2,
401
- "pass" => 10,
402
- "high" => 1,
403
- "medium" => 1,
404
- "low" => 0
405
- },
406
- [7] {
407
- "code" => "sa_east_1",
408
- "region_id" => 5,
409
- "total" => 3,
410
- "pass" => 6,
411
- "high" => 2,
412
- "medium" => 1,
413
- "low" => 0
414
- },
415
- [8] {
416
- "code" => "ap_southeast_2",
417
- "region_id" => 3,
418
- "total" => 3,
419
- "pass" => 6,
420
- "high" => 2,
421
- "medium" => 1,
422
- "low" => 0
423
- }
424
- ],
425
- "signatures" => [
426
- [ 0] {
427
- "signature_id" => 88,
428
- "unique_id" => "AWS:SSS-006",
429
- "total" => 1
430
- },
431
- [ 1] {
432
- "signature_id" => 89,
433
- "unique_id" => "AWS:SSS-008",
434
- "total" => 1
435
- },
436
- [ 2] {
437
- "signature_id" => 87,
438
- "unique_id" => "AWS:SSS-007",
439
- "total" => 1
440
- },
441
- [ 3] {
442
- "signature_id" => 14,
443
- "unique_id" => "AWS:EC2-001",
444
- "total" => 21
445
- },
446
- [ 4] {
447
- "signature_id" => 70,
448
- "unique_id" => "AWS:SSS-001",
449
- "total" => 1
450
- },
451
- [ 5] {
452
- "signature_id" => 72,
453
- "unique_id" => "AWS:CLT-001",
454
- "total" => 7
455
- },
456
- [ 6] {
457
- "signature_id" => 69,
458
- "unique_id" => "AWS:EC2-031",
459
- "total" => 44
460
- },
461
- [ 7] {
462
- "signature_id" => 18,
463
- "unique_id" => "AWS:VPC-009",
464
- "total" => 6
465
- },
466
- [ 8] {
467
- "signature_id" => 68,
468
- "unique_id" => "AWS:IAM-008",
469
- "total" => 1
470
- },
471
- [ 9] {
472
- "signature_id" => 82,
473
- "unique_id" => "AWS:ELB-007",
474
- "total" => 43
475
- },
476
- [10] {
477
- "signature_id" => 81,
478
- "unique_id" => "AWS:SSS-003",
479
- "total" => 1
480
- },
481
- [11] {
482
- "signature_id" => 80,
483
- "unique_id" => "AWS:ELB-001",
484
- "total" => 8
485
- },
486
- [12] {
487
- "signature_id" => 11,
488
- "unique_id" => "AWS:IAM-007",
489
- "total" => 14
490
- },
491
- [13] {
492
- "signature_id" => 83,
493
- "unique_id" => "AWS:ELB-008",
494
- "total" => 4
495
- },
496
- [14] {
497
- "signature_id" => 77,
498
- "unique_id" => "AWS:RDS-002",
499
- "total" => 2
500
- },
501
- [15] {
502
- "signature_id" => 67,
503
- "unique_id" => "AWS:EC2-032",
504
- "total" => 24
505
- },
506
- [16] {
507
- "signature_id" => 1,
508
- "unique_id" => "AWS:EC2-030",
509
- "total" => 3
510
- }
511
- ],
512
- "services" => [
513
- [0] {
514
- "service" => "RDS",
515
- "total" => 2,
516
- "service_id" => 10
517
- },
518
- [1] {
519
- "service" => "ELB",
520
- "total" => 55,
521
- "service_id" => 8
522
- },
523
- [2] {
524
- "service" => "IAM",
525
- "total" => 15,
526
- "service_id" => 3
527
- },
528
- [3] {
529
- "service" => "VPC",
530
- "total" => 6,
531
- "service_id" => 7
532
- },
533
- [4] {
534
- "service" => "CLT",
535
- "total" => 7,
536
- "service_id" => 9
537
- },
538
- [5] {
539
- "service" => "EC2",
540
- "total" => 92,
541
- "service_id" => 1
542
- },
543
- [6] {
544
- "service" => "SSS",
545
- "total" => 5,
546
- "service_id" => 5
547
- }
548
- ],
549
- "severities" => [
550
- [0] {
551
- "severity" => "high",
552
- "total" => 14
553
- },
554
- [1] {
555
- "severity" => "medium",
556
- "total" => 96
557
- },
558
- [2] {
559
- "severity" => "low",
560
- "total" => 72
561
- },
562
- [3] {
563
- "severity" => "pass",
564
- "total" => 174
565
- }
566
- ]
567
- }
568
- }
569
- ]
570
- }
571
-
572
- ## External Accounts end point
573
- ### List action
574
-
575
- # list is a pageable response of 25 total external accounts per page
576
- api.external_accounts.list =>
577
- [
578
- [0] {
579
- "id" => 1,
580
- "created_at" => "2014-10-22T16:23:19.615Z",
581
- "updated_at" => "2014-11-03T21:39:36.891Z",
582
- "organization_id" => 1,
583
- "nickname" => "Ops",
584
- "team_id" => 1,
585
- "sub_organization_id" => 1,
586
- "arn" => "arn:aws:iam::12345:role/evident_service_role",
587
- "external_id" => "External ID"
588
- }
589
- ]
590
- # Current page
591
- api.external_accounts.current_page
592
-
593
- # Next page sets current page with the next page results.
594
- api.external_accounts.next_page
595
-
596
- # Prev page sets current page with the previous page results.
597
- api.external_accounts.prev_page
598
-
599
- ### Show action
600
- # Show a specific external account
601
- # Required :id
602
- api.external_accounts.show(id: 1) =>
603
- {
604
- "id" => 1,
605
- "created_at" => "2014-10-22T16:23:19.615Z",
606
- "updated_at" => "2014-11-03T21:39:36.891Z",
607
- "organization_id" => 1,
608
- "nickname" => "Ops",
609
- "team_id" => 1,
610
- "sub_organization_id" => 1,
611
- "arn" => "arn:aws:iam::12345:role/evident_service_role",
612
- "external_id" => "External ID"
613
- }
614
-
615
- # Current record
616
- api.external_accounts.current_record
617
-
618
- ### Update action
619
- # Update a specific external account
620
- # Required :id
621
- api.external_accounts.update(id: 1, nickname: 'Dev Ops') =>
622
- {
623
- "id" => 1,
624
- "created_at" => "2014-10-22T16:23:19.615Z",
625
- "updated_at" => "2014-11-03T21:39:36.891Z",
626
- "organization_id" => 1,
627
- "nickname" => "Dev Ops",
628
- "team_id" => 1,
629
- "sub_organization_id" => 1,
630
- "arn" => "arn:aws:iam::12345:role/evident_service_role",
631
- "external_id" => "External ID"
632
- }
633
-
634
- ### Destroy action
635
- # Destroy a specific external account
636
- # Required :id
637
- api.external_accounts.destroy(id: 1) =>
638
- {
639
- "success" => "Dev Ops has been destroyed"
640
- }
641
-
642
- ### Create action
643
- # Create a new external account
644
- Required: :arn, :external_id, :sub_organization_id, :team_id
645
- api.external_accounts.create(arn: 'arn:aws:iam::12345:role/evident_service_role',
646
- external_id: 'External ID',
647
- nickname: 'Dev ops',
648
- sub_organization_id: 1,
649
- team_id: 1) =>
650
- {
651
- "id" => 3,
652
- "created_at" => "2014-11-24T15:37:35.249Z",
653
- "updated_at" => "2014-11-24T15:37:35.249Z",
654
- "organization_id" => 1,
655
- "nickname" => "Dev Ops",
656
- "team_id" => 1,
657
- "sub_organization_id" => 1,
658
- "arn" => "arn:aws:iam::12345:role/evident_service_role",
659
- "external_id" => "External ID"
660
- }
661
-
662
-
663
- ## Services end point
664
- #### *Note this end point is a read only end point, and requires the user to have manager role access
665
- #### This end point can be used to for retrieving a service id to apply to a custom signature. Example your custom signature targets EC2 services.
666
- ### List action
667
- # list is a pageable response of 25 total signatures per page
668
- api.services.list =>
669
- [
670
- [ 4] {
671
- "id" => 5,
672
- "name" => "EC2",
673
- "code" => "EC2",
674
- "created_at" => "2014-07-15T16:45:43.457Z",
675
- "updated_at" => "2014-07-15T16:45:43.457Z"
676
- }
677
- ]
678
-
679
- ### Show action
680
- # Show a specific signature
681
- # Required :id
682
-
683
- api.services.show(id: 5) =>
684
- {
685
- "id" => 5,
686
- "name" => "EC2",
687
- "code" => "EC2",
688
- "created_at" => "2014-07-15T16:45:43.457Z",
689
- "updated_at" => "2014-07-15T16:45:43.457Z"
690
- }
691
-
692
-
693
-
694
- ## Custom Signatures end point
695
- ### List action
696
- # List is a pageable response of 25 total signatures per page
697
- api.custom_signatures.list =>
698
- [
699
- [ 0] {
700
- "id" => 4,
701
- "organization_id" => 1,
702
- "signature" => "// Demo Signature\r\ndsl.configure(function(c) {\r\n c.module = 'check_user_count_javascript'; // Required\r\n c.identifier = 'AWS:GLO-001'; // Required unique identifier for this signature\r\n c.description = 'Check IAM user count'; // Required short description\r\n c.valid_regions = ['us_east_1']; // Only run in us_east_1\r\n c.display_as = 'global'; // Display as region global instead of region us_east_1\r\n});\r\n\r\n// Required perform function\r\nfunction perform(aws) {\r\n try {\r\n var count = aws.iam.list_users().users.length || 0;\r\n if (count === 0) {\r\n return dsl.fail({\r\n user_count: count,\r\n condition: 'count == 0' });\r\n } else {\r\n return dsl.pass({\r\n user_count: count,\r\n condition: 'count >= 1' });\r\n }\r\n }\r\n catch(err) {\r\n return dsl.error({error: err.message});\r\n }\r\n}\r\n",
703
- "description" => "test",
704
- "resolution" => "test",
705
- "name" => "Testing",
706
- "active" => true,
707
- "created_at" => "2014-07-21T20:09:24.809Z",
708
- "updated_at" => "2014-08-04T14:15:28.326Z",
709
- "risk_level" => "High",
710
- "identifier" => nil,
711
- "service_id" => nil,
712
- "deleted_at" => nil
713
- }
714
- }
715
-
716
- # Current page
717
- api.custom_signatures.current_page
718
-
719
- # Next page sets current page with the next page results.
720
- api.custom_signatures.next_page
721
-
722
- # Prev page sets current page with the previous page results.
723
- api.custom_signatures.prev_page
724
-
725
- ### Show action
726
- # Show a specific custom signature
727
- # Required :id
728
-
729
- api.custom_signatures.show(id: 4) =>
730
- {
731
- "id" => 4,
732
- "organization_id" => 1,
733
- "signature" => "// Demo Signature\r\ndsl.configure(function(c) {\r\n c.module = 'check_user_count_javascript'; // Required\r\n c.identifier = 'AWS:GLO-001'; // Required unique identifier for this signature\r\n c.description = 'Check IAM user count'; // Required short description\r\n c.valid_regions = ['us_east_1']; // Only run in us_east_1\r\n c.display_as = 'global'; // Display as region global instead of region us_east_1\r\n});\r\n\r\n// Required perform function\r\nfunction perform(aws) {\r\n try {\r\n var count = aws.iam.list_users().users.length || 0;\r\n if (count === 0) {\r\n return dsl.fail({\r\n user_count: count,\r\n condition: 'count == 0' });\r\n } else {\r\n return dsl.pass({\r\n user_count: count,\r\n condition: 'count >= 1' });\r\n }\r\n }\r\n catch(err) {\r\n return dsl.error({error: err.message});\r\n }\r\n}\r\n",
734
- "description" => "test",
735
- "resolution" => "test",
736
- "name" => "Testing",
737
- "active" => true,
738
- "created_at" => "2014-07-21T20:09:24.809Z",
739
- "updated_at" => "2014-08-04T14:15:28.326Z",
740
- "risk_level" => "High",
741
- "identifier" => nil,
742
- "service_id" => 11,
743
- "deleted_at" => nil
744
- }
745
-
746
- ### Update action
747
- # Update a custom signature
748
- # Required :id
749
- # Valid :description, :resolution, :name, :active, :signature, :risk_level
750
- api.custom_signatures.update(id: 4, active: false, name: 'Updated Name') =>
751
- {
752
- "id" => 4,
753
- "organization_id" => 1,
754
- "signature" => "// Demo Signature\r\ndsl.configure(function(c) {\r\n c.module = 'check_user_count_javascript'; // Required\r\n c.identifier = 'AWS:GLO-001'; // Required unique identifier for this signature\r\n c.description = 'Check IAM user count'; // Required short description\r\n c.valid_regions = ['us_east_1']; // Only run in us_east_1\r\n c.display_as = 'global'; // Display as region global instead of region us_east_1\r\n c.deep_inspection = ['users'];\r\n c.unique_identifier = [{'user_name': 'user_id'}];\r\n});\r\n\r\n// Required perform function\r\nfunction perform(aws) {\r\n try {\r\n var count = aws.iam.list_users().users.length || 0;\r\n \r\n // Setup the deep inspection and unique identifier data\r\n dsl.set_data(aws.iam.list_users());\r\n if (count === 0) {\r\n return dsl.fail({\r\n user_count: count,\r\n condition: 'count == 0' });\r\n } else {\r\n return dsl.pass({\r\n user_count: count,\r\n condition: 'count >= 1' });\r\n }\r\n }\r\n catch(err) {\r\n return dsl.error({error: err.message});\r\n }\r\n}",
755
- "description" => "test",
756
- "resolution" => "test",
757
- "name" => "Updated Name",
758
- "active" => false,
759
- "created_at" => "2014-07-21T20:09:24.809Z",
760
- "updated_at" => "2014-09-24T20:48:21.822Z",
761
- "risk_level" => "High",
762
- "identifier" => nil,
763
- "service_id" => 11,
764
- "deleted_at" => nil
765
- }
766
-
767
- ### Create Action
768
- # Create a new custom signature
769
- # Required :signature, :name, :risk_level
770
- signature = "// Demo Signature\r\ndsl.configure(function(c) {\r\n c.module = 'check_user_count_javascript'; // Required\r\n c.identifier = 'AWS:GLO-001'; // Required unique identifier for this signature\r\n c.description = 'Check IAM user count'; // Required short description\r\n c.valid_regions = ['us_east_1']; // Only run in us_east_1\r\n c.display_as = 'global'; // Display as region global instead of region us_east_1\r\n c.deep_inspection = ['users'];\r\n c.unique_identifier = [{'user_name': 'user_id'}];\r\n});\r\n\r\n// Required perform function\r\nfunction perform(aws) {\r\n try {\r\n var count = aws.iam.list_users().users.length || 0;\r\n \r\n // Setup the deep inspection and unique identifier data\r\n dsl.set_data(aws.iam.list_users());\r\n if (count === 0) {\r\n return dsl.fail({\r\n user_count: count,\r\n condition: 'count == 0' });\r\n } else {\r\n return dsl.pass({\r\n user_count: count,\r\n condition: 'count >= 1' });\r\n }\r\n }\r\n catch(err) {\r\n return dsl.error({error: err.message});\r\n }\r\n}"
771
- api.custom_signatures.create(signature: signature, name: 'Demo Signature', risk_level: 'High') =>
772
- {
773
- "id" => 97,
774
- "organization_id" => 1,
775
- "signature" => "// Demo Signature\r\ndsl.configure(function(c) {\r\n c.module = 'check_user_count_javascript'; // Required\r\n c.identifier = 'AWS:GLO-001'; // Required unique identifier for this signature\r\n c.description = 'Check IAM user count'; // Required short description\r\n c.valid_regions = ['us_east_1']; // Only run in us_east_1\r\n c.display_as = 'global'; // Display as region global instead of region us_east_1\r\n c.deep_inspection = ['users'];\r\n c.unique_identifier = [{'user_name': 'user_id'}];\r\n});\r\n\r\n// Required perform function\r\nfunction perform(aws) {\r\n try {\r\n var count = aws.iam.list_users().users.length || 0;\r\n \r\n // Setup the deep inspection and unique identifier data\r\n dsl.set_data(aws.iam.list_users());\r\n if (count === 0) {\r\n return dsl.fail({\r\n user_count: count,\r\n condition: 'count == 0' });\r\n } else {\r\n return dsl.pass({\r\n user_count: count,\r\n condition: 'count >= 1' });\r\n }\r\n }\r\n catch(err) {\r\n return dsl.error({error: err.message});\r\n }\r\n}",
776
- "description" => nil,
777
- "resolution" => nil,
778
- "name" => "Demo Signature",
779
- "active" => nil,
780
- "created_at" => "2014-09-24T20:51:08.901Z",
781
- "updated_at" => "2014-09-24T20:51:08.901Z",
782
- "risk_level" => "High",
783
- "identifier" => nil,
784
- "service_id" => 11,
785
- "deleted_at" => nil
786
- }
787
-
788
- ### Destroy Action
789
- # Destroy a custom signature
790
- # Required :id
791
- api.custom_signatures.destroy(id: 97) =>
792
- {
793
- "success" => "Demo Signature has been destroyed"
794
- }
795
-
796
- ### Run action
797
- # Run a custom signature
798
- # Required :id => ID of the custom signature to run
799
- # Required :external_account_id => ID of the external account to use
800
- # Required :regions => Array of regions to run the signature in
801
-
802
- api.custom_signatures.run(id: 1, external_account_id: 1, regions: [:us_east_1]) =>
803
- {
804
- "alerts" => [
805
- [0] {
806
- "info" => {
807
- "user_count" => 1,
808
- "condition" => "count >= 1",
809
- "deep_inspection" => [
810
- [0] {
811
- "users" => [
812
- [ 0] {
813
- "path" => "/",
814
- "user_name" => "demouser",
815
- "user_id" => "AIDAHJFKDHGFHFGKHKGFH",
816
- "arn" => "arn:aws:iam::00000000:user/demouser",
817
- "create_date" => "2014-01-16T19:05:36.000Z"
818
- }
819
- ]
820
- }
821
- ]
822
- },
823
- "status" => "pass",
824
- "config" => {
825
- "module" => "check_user_count_javascript",
826
- "description" => "Check IAM user count",
827
- "valid_regions" => [
828
- [0] "us_east_1"
829
- ],
830
- "identifier" => "AWS:GLO-001",
831
- "deep_inspection" => [
832
- [0] "users"
833
- ],
834
- "unique_identifier" => [
835
- [0] {
836
- "user_name" => "user_id"
837
- }
838
- ],
839
- "display_as" => "global",
840
- "validation_context" => nil,
841
- "errors" => {}
842
- },
843
- "region" => "us_east_1",
844
- "unique_identifier" => {
845
- "demouser" => "AIDAHJFKDHGFHFGKHKGFH",
846
- }
847
- }
848
- ]
849
- }
850
-
851
- ### Run Raw action
852
- # Run a raw custom signature
853
- # Required: :signature => JavaScript signature to run as a string
854
- # Required :external_account_id => ID of the external account to use
855
- # Required :regions => Array of regions to run the signature in
856
- api.custom_signatures.run_raw(signature: "Javascript", regions: [:us_east_1], external_account_id: 1) =>
857
- {
858
- "alerts" => [
859
- [0] {
860
- "info" => {
861
- "user_count" => 1,
862
- "condition" => "count >= 1",
863
- "deep_inspection" => [
864
- [0] {
865
- "users" => [
866
- [ 0] {
867
- "path" => "/",
868
- "user_name" => "demouser",
869
- "user_id" => "AIDAHJFKDHGFHFGKHKGFH",
870
- "arn" => "arn:aws:iam::00000000:user/demouser",
871
- "create_date" => "2014-01-16T19:05:36.000Z"
872
- }
873
- ]
874
- }
875
- ]
876
- },
877
- "status" => "pass",
878
- "config" => {
879
- "module" => "check_user_count_javascript",
880
- "description" => "Check IAM user count",
881
- "valid_regions" => [
882
- [0] "us_east_1"
883
- ],
884
- "identifier" => "AWS:GLO-001",
885
- "deep_inspection" => [
886
- [0] "users"
887
- ],
888
- "unique_identifier" => [
889
- [0] {
890
- "user_name" => "user_id"
891
- }
892
- ],
893
- "display_as" => "global",
894
- "validation_context" => nil,
895
- "errors" => {}
896
- },
897
- "region" => "us_east_1",
898
- "unique_identifier" => {
899
- "demouser" => "AIDAHJFKDHGFHFGKHKGFH",
900
- }
901
- }
902
- ]
903
- }
904
-
905
-
906
- ## Signatures end point
907
- ### List action
908
- # List is a pageable response of 25 total signatures per page.
909
- api.signatures.list =>
910
- [
911
- [ 0] {
912
- "id" => 35,
913
- "name" => "Global Telnet",
914
- "description" => "Globally Accessible Administrative Port -- Telnet (tcp/23)",
915
- "provider" => "AWS",
916
- "scope" => "Service",
917
- "resolution" => "This alert triggers when global permission to access tcp port 23 (telnet) is detected in a security group. This is dangerous, as it permits the entire internet access to connect to tcp port 23 -- usually where a telnet daemon is listening. Reducing the permitted IP Addresses or ranges allowed to communicate to destination hosts on tcp port 23 is advised. We recommend utilizing the static office or home IP addresses of your employees as the permitted hosts, or deploying a bastion host with 2-factor authentication if this is infeasible. This bastion host is then the only permitted IP to communicate with any other nodes inside your account. If you must permit global access to tcp port 23 (telnet), then you may disable this alert to silence it.",
918
- "risk_level" => "High",
919
- "identifier" => "AWS:EC2-003",
920
- "created_at" => "2014-06-23T18:53:25.988Z",
921
- "updated_at" => "2014-07-21T16:36:29.427Z",
922
- "service_id" => 5,
923
- "service" => {
924
- "name" => "EC2"
925
- }
926
- },
927
- ]
928
-
929
- # Current page
930
- api.signatures.current_page
931
-
932
- # Next page sets current page with the next page results.
933
- api.signatures.next_page
934
-
935
- # Prev page sets current page with the previous page results.
936
- api.signatures.prev_page
937
-
938
- ### Show action
939
- # Show a specific signature
940
- # Required :id
941
- api.signatures.show(id: 35) =>
942
- {
943
- "id" => 35,
944
- "name" => "Global Telnet",
945
- "description" => "Globally Accessible Administrative Port -- Telnet (tcp/23)",
946
- "provider" => "AWS",
947
- "scope" => "Service",
948
- "resolution" => "This alert triggers when global permission to access tcp port 23 (telnet) is detected in a security group. This is dangerous, as it permits the entire internet access to connect to tcp port 23 -- usually where a telnet daemon is listening. Reducing the permitted IP Addresses or ranges allowed to communicate to destination hosts on tcp port 23 is advised. We recommend utilizing the static office or home IP addresses of your employees as the permitted hosts, or deploying a bastion host with 2-factor authentication if this is infeasible. This bastion host is then the only permitted IP to communicate with any other nodes inside your account. If you must permit global access to tcp port 23 (telnet), then you may disable this alert to silence it.",
949
- "risk_level" => "High",
950
- "identifier" => "AWS:EC2-003",
951
- "created_at" => "2014-06-23T18:53:25.988Z",
952
- "updated_at" => "2014-07-21T16:36:29.427Z",
953
- "service_id" => 5,
954
- "service" => {
955
- "name" => "EC2"
956
- }
957
- }
958
-
959
- ### Names action
960
-
961
- # List the names of signatures that can be run through the api
962
- api.signatures.names =>
963
- {
964
- "names" => [
965
- [ 0] "validate_cloud_formation_template",
966
- [ 1] "cloud_trails_enabled",
967
- [ 2] "frequent_snapshots",
968
- [ 3] "security_group_check",
969
- [ 4] "detect_unattached_ebs_volumes",
970
- [ 5] "unused_security_groups",
971
- [ 6] "ebs_encryption_enabled",
972
- [ 7] "security_group_instance_map",
973
- [ 8] "strong_ssl_ciphers",
974
- [ 9] "heartbleed",
975
- [10] "unused_security_groups_elb",
976
- [11] "check_user_count",
977
- [12] "api_keys_on_root",
978
- [13] "one_user_with_api_keys",
979
- [14] "user_console_access_strong_password",
980
- [15] "mfa_on_root",
981
- [16] "mfa_on_devices",
982
- [17] "check_assigned_role",
983
- [18] "third_party_account",
984
- [19] "key_expiry_check",
985
- [20] "count_privileged_users",
986
- [21] "check_privileged_spofs",
987
- [22] "restrict_s3_delete",
988
- [23] "evident_role_permissions",
989
- [24] "route53_in_use",
990
- [25] "rds_backup_policy_too_short",
991
- [26] "latest_restorable_time",
992
- [27] "sss_object_versioning_enabled",
993
- [28] "cloud_trails_bucket_iam_delete",
994
- [29] "sss_global_edit_bucket_permissions",
995
- [30] "sss_global_upload_bucket_permissions",
996
- [31] "sss_global_list_bucket_permissions",
997
- [32] "sss_global_view_bucket_permissions",
998
- [33] "sss_global_any_bucket_permissions",
999
- [34] "vpc_nacls",
1000
- [35] "nacls_on_subnets",
1001
- [36] "non_default_vpc_nacl"
1002
- ]
1003
- }
1004
-
1005
- ### Run action
1006
-
1007
- # Run an Evident Signature
1008
- Required :signature_name => name of signature to run
1009
- Required :external_account_id => ID of the external account with the ARN/External ID to use
1010
- Required :regions => Array of regions to run the signature in
1011
- # Requires manager role access
1012
-
1013
- api.signatures.run(signature_name: 'validate_cloud_formation_template', regions: [:us_east_1], external_account_id: 1)
1014
- {
1015
- "alerts" => [
1016
- [0] {
1017
- "info" => {
1018
- "message" => "No CloudFormation template contains globally permissive traffic",
1019
- "deep_inspection" => nil
1020
- },
1021
- "status" => "pass",
1022
- "config" => {
1023
- "module" => "validate_cloud_formation_template",
1024
- "description" => "Validate security parameters in CloudFormation templates",
1025
- "valid_regions" => [
1026
- [0] "us_east_1"
1027
- ],
1028
- "identifier" => "AWS:CFM-001",
1029
- "usage" => "metascrape.signatures.validate_cloud_formation_template.perform metascrape.customers.evident.aws.us_east_1",
1030
- "tags" => [
1031
- [0] "cfm",
1032
- [1] "signature"
1033
- ],
1034
- "tests" => [
1035
- [0] "test_validate_cloud_formation_template"
1036
- ],
1037
- "validation_context" => nil,
1038
- "errors" => {}
1039
- },
1040
- "region" => "us_east_1",
1041
- "unique_identifier" => nil
1042
- }
1043
- ]
1044
- }
1045
-
1046
- ## Organizations end point
1047
-
1048
- ### List Action
1049
- # List your organizations information
1050
- api.organizations.list =>
1051
- [
1052
- [0] {
1053
- "id" => 1,
1054
- "name" => "Evident",
1055
- "created_at" => "2014-06-23T18:53:25.500Z",
1056
- "updated_at" => "2014-07-15T18:40:30.451Z",
1057
- "external_account_setup_complete" => true,
1058
- "encrypted_stripe_customer_identifier" => nil,
1059
- "enterprise" => true,
1060
- "enterprise_contract_expires_on" => "2034-06-23",
1061
- "plan_id" => 7,
1062
- "stripe_last_payment_successful" => true,
1063
- "stripe_subscription_active" => true,
1064
- "deleted_at" => nil,
1065
- "free_trial_expires_at" => nil,
1066
- "plan_setup_complete" => true,
1067
- "enable_sso" => false,
1068
- "sso_idp_id" => nil
1069
- }
1070
- ]
1071
-
1072
- ### Show action
1073
- # Show your organizations information. Same as List just returns the object instead of an array with the object.
1074
- # Required :id
1075
- api.organizations.show(id: 1) =>
1076
- {
1077
- "id" => 1,
1078
- "name" => "Evident",
1079
- "created_at" => "2014-06-23T18:53:25.500Z",
1080
- "updated_at" => "2014-07-15T18:40:30.451Z",
1081
- "external_account_setup_complete" => true,
1082
- "encrypted_stripe_customer_identifier" => nil,
1083
- "enterprise" => true,
1084
- "enterprise_contract_expires_on" => "2034-06-23",
1085
- "plan_id" => 7,
1086
- "stripe_last_payment_successful" => true,
1087
- "stripe_subscription_active" => true,
1088
- "deleted_at" => nil,
1089
- "free_trial_expires_at" => nil,
1090
- "plan_setup_complete" => true,
1091
- "enable_sso" => false,
1092
- "sso_idp_id" => nil
1093
- }
1094
-
1095
-
1096
- ### Update action
1097
- # Update your organizations information
1098
- # Required :id
1099
- # Valid Params :name
1100
- api.organizations.update(id: 1, name: 'Updated Name') =>
1101
- {
1102
- "id" => 1,
1103
- "name" => "Updated Name",
1104
- "created_at" => "2014-06-23T18:53:25.500Z",
1105
- "updated_at" => "2014-09-19T15:36:40.521Z",
1106
- "external_account_setup_complete" => true,
1107
- "encrypted_stripe_customer_identifier" => nil,
1108
- "enterprise" => true,
1109
- "enterprise_contract_expires_on" => "2034-06-23",
1110
- "plan_id" => 7,
1111
- "stripe_last_payment_successful" => true,
1112
- "stripe_subscription_active" => true,
1113
- "deleted_at" => nil,
1114
- "free_trial_expires_at" => nil,
1115
- "plan_setup_complete" => true,
1116
- "enable_sso" => false,
1117
- "sso_idp_id" => nil
1118
- }
1119
-
1120
- ## Sub Organizations end point
1121
- ### List action
1122
- # List is a pageable response of 25 total signatures per page.
1123
- api.sub_organizations.list =>
1124
- [
1125
- [0] {
1126
- "id" => 1,
1127
- "organization_id" => 1,
1128
- "name" => "Evident",
1129
- "created_at" => "2014-06-23T18:53:25.531Z",
1130
- "updated_at" => "2014-09-03T12:32:50.472Z"
1131
- }
1132
- ]
1133
-
1134
- # Current page
1135
- api.sub_organizations.current_page
1136
-
1137
- # Next page sets current page with the next page results.
1138
- api.sub_organizations.next_page
1139
-
1140
- # Prev page sets current page with the previous page results.
1141
- api.sub_organizations.prev_page
1142
-
1143
- ### Show action
1144
- # Show a specific sub organization
1145
- # Required :id
1146
- api.sub_organizations.show(id: 1) =>
1147
- {
1148
- "id" => 1,
1149
- "organization_id" => 1,
1150
- "name" => "Evident",
1151
- "created_at" => "2014-06-23T18:53:25.531Z",
1152
- "updated_at" => "2014-09-03T12:32:50.472Z"
1153
- }
1154
-
1155
-
1156
- ### Update action
1157
- # Update a specific sub organization
1158
- # Required :id
1159
- # Valid param :name
1160
- api.sub_organizations.update(id: 1, name: 'Test') =>
1161
- {
1162
- "id" => 1,
1163
- "organization_id" => 1,
1164
- "name" => "Test",
1165
- "created_at" => "2014-06-23T18:53:25.531Z",
1166
- "updated_at" => "2014-09-24T18:37:02.252Z"
1167
- }
1168
-
1169
- ### Create action
1170
- # Create a new sub organization
1171
- # Required :name
1172
- api.sub_organizations.create(name: 'Test') =>
1173
- {
1174
- "id" => 3,
1175
- "organization_id" => 1,
1176
- "name" => "Test",
1177
- "created_at" => "2014-09-24T18:39:25.493Z",
1178
- "updated_at" => "2014-09-24T18:39:25.493Z"
1179
- }
1180
-
1181
- ### Destroy Action
1182
- #### * Note this action will also destroy every team within the sub organization and any external accounts attached.
1183
- # Destroy a sub organization
1184
- # Required :id
1185
- api.sub_organizations.destroy(id: 3) =>
1186
- {
1187
- "success" => "Test has been destroyed"
1188
- }
1189
-
1190
-
1191
- ## Teams end point
1192
- ### List action
1193
- # List is a pageable response of 25 total signatures per page.
1194
- api.teams.list =>
1195
- [
1196
- [ 0] {
1197
- "id" => 1,
1198
- "sub_organization_id" => 1,
1199
- "name" => "Evident",
1200
- "created_at" => "2014-06-23T18:53:25.552Z",
1201
- "updated_at" => "2014-06-23T18:53:25.552Z",
1202
- "organization_id" => 1,
1203
- "deleted_at" => nil
1204
- },
1205
- ]
1206
-
1207
- # Current page
1208
- api.teams.current_page
1209
-
1210
- # Next page sets current page with the next page results.
1211
- api.teams.next_page
1212
-
1213
- # Prev page sets current page with the previous page results.
1214
- api.teams.prev_page
1215
-
1216
- ### Show action
1217
- # Show a specific team
1218
- # Required :id
1219
- api.teams.show(id: 1) =>
1220
- {
1221
- "id" => 1,
1222
- "sub_organization_id" => 1,
1223
- "name" => "Evident",
1224
- "created_at" => "2014-06-23T18:53:25.552Z",
1225
- "updated_at" => "2014-06-23T18:53:25.552Z",
1226
- "organization_id" => 1,
1227
- "deleted_at" => nil
1228
- }
1229
-
1230
- ### Create action
1231
- # Create a new team
1232
- # Required :sub_organization_id => id of the sub organization to add this team to. Must have access to the sub organization as well.
1233
- # Required :name
1234
- api.teams.create(name: 'testing', sub_organization_id: 1) =>
1235
- {
1236
- "id" => 52,
1237
- "sub_organization_id" => 1,
1238
- "name" => "testing",
1239
- "created_at" => "2014-09-24T18:51:28.517Z",
1240
- "updated_at" => "2014-09-24T18:51:28.517Z",
1241
- "organization_id" => 1,
1242
- "deleted_at" => nil
1243
- }
1244
-
1245
- ### Update action
1246
- # Update a team
1247
- # Required :id
1248
- # Valid :sub_organization_id, :name
1249
- api.teams.update(id: 52, name: 'New Name') =>
1250
- {
1251
- "id" => 52,
1252
- "sub_organization_id" => 1,
1253
- "name" => "New Name",
1254
- "created_at" => "2014-09-24T18:51:28.517Z",
1255
- "updated_at" => "2014-09-24T18:53:20.313Z",
1256
- "organization_id" => 1,
1257
- "deleted_at" => nil
1258
- }
1259
-
1260
- ### Destroy Action
1261
- #### * Note this will destroy any external accounts attached.
1262
- # Destroy a team
1263
- # Required :id
1264
- api.teams.destroy(id: 52) =>
1265
- {
1266
- "success" => "New Name has been destroyed"
1267
- }
24
+ # Usage
1268
25
 
26
+ See the [**WIKI**](https://github.com/EvidentSecurity/esp_sdk/wiki) for information on using the SDK.
1269
27
 
1270
28
  ## Contributing
1271
29