mirror of
https://github.com/Security-Onion-Solutions/securityonion.git
synced 2025-12-06 17:22:49 +01:00
Compare commits
892 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ba81b7275a | ||
|
|
a1791f1e2e | ||
|
|
a74d52a986 | ||
|
|
1022bf5b99 | ||
|
|
ada0d7b8cd | ||
|
|
6410087994 | ||
|
|
2986926ce9 | ||
|
|
a9df5d75b0 | ||
|
|
0c9c7002dc | ||
|
|
0961fe7091 | ||
|
|
4573b346f8 | ||
|
|
3681f91c37 | ||
|
|
97d127218a | ||
|
|
9340b633e2 | ||
|
|
fe39179ba1 | ||
|
|
3b920b2cd8 | ||
|
|
91a50c0915 | ||
|
|
578e2b5d1d | ||
|
|
b396c39352 | ||
|
|
a91dbf0d1d | ||
|
|
1a6fc3ef6c | ||
|
|
51e500f521 | ||
|
|
91c32725fb | ||
|
|
f3c9f2e5ea | ||
|
|
206261fbe6 | ||
|
|
18547e8ea8 | ||
|
|
8403d72b8e | ||
|
|
dc56c449b7 | ||
|
|
896f081f70 | ||
|
|
aaa6cf816a | ||
|
|
87514e7da3 | ||
|
|
8b64f5b499 | ||
|
|
ce5d678ed9 | ||
|
|
f8b5593bca | ||
|
|
a125a94808 | ||
|
|
e25560bf6b | ||
|
|
1f305352a0 | ||
|
|
befc793a96 | ||
|
|
d157c0da00 | ||
|
|
bfee999688 | ||
|
|
b3d2ce0e18 | ||
|
|
cd90889b4c | ||
|
|
285468c059 | ||
|
|
03e410df68 | ||
|
|
6058d438bf | ||
|
|
42938a4e67 | ||
|
|
3c0caa4112 | ||
|
|
0b2dd5d0a4 | ||
|
|
1f0509cfd6 | ||
|
|
d02bff22ac | ||
|
|
3cc936a0a8 | ||
|
|
0559e2d16b | ||
|
|
d146e65412 | ||
|
|
322bb665a1 | ||
|
|
5fa1b038ed | ||
|
|
729a6998a2 | ||
|
|
56a821a9be | ||
|
|
b6fa01aafe | ||
|
|
253ffad853 | ||
|
|
6f3fd407dd | ||
|
|
f8b6a80d99 | ||
|
|
101673dc98 | ||
|
|
bf8278dccf | ||
|
|
73bb375662 | ||
|
|
c3a2c2321d | ||
|
|
57a6e4af41 | ||
|
|
1a85f26cf8 | ||
|
|
032c8ca4e9 | ||
|
|
9bed02934b | ||
|
|
a37faff850 | ||
|
|
16592fcc1e | ||
|
|
1c86ae4e14 | ||
|
|
ab143b3216 | ||
|
|
985c55dd62 | ||
|
|
32b4a2ff08 | ||
|
|
55e597d302 | ||
|
|
b26a7541cd | ||
|
|
9466cc5439 | ||
|
|
496696ed80 | ||
|
|
05d890901f | ||
|
|
5317ee8b5a | ||
|
|
03c43da6f2 | ||
|
|
f92ad7d671 | ||
|
|
119ce2d93f | ||
|
|
39734b6983 | ||
|
|
7c5343ebe1 | ||
|
|
23be399a68 | ||
|
|
fcb26bdaed | ||
|
|
33105c10aa | ||
|
|
4df8a973cf | ||
|
|
f89baff3d7 | ||
|
|
1933c26797 | ||
|
|
c072905717 | ||
|
|
15fd4de669 | ||
|
|
c0d24d942c | ||
|
|
accb3d536d | ||
|
|
d09e2b6468 | ||
|
|
910c809aa2 | ||
|
|
e5a23c22fd | ||
|
|
721f2682ac | ||
|
|
189d0f5f36 | ||
|
|
913c1a89bf | ||
|
|
941ad5acf6 | ||
|
|
e2c3fe3342 | ||
|
|
4b6af0cd81 | ||
|
|
35bc5f9133 | ||
|
|
51f97f5ae5 | ||
|
|
3f3990ac83 | ||
|
|
950d4077f6 | ||
|
|
ab6e36e00a | ||
|
|
33f21c05f7 | ||
|
|
88219c4827 | ||
|
|
4e4eeedb41 | ||
|
|
33712a3409 | ||
|
|
5c62fedd12 | ||
|
|
b264548a4f | ||
|
|
7edf9a67c3 | ||
|
|
79adf2012a | ||
|
|
5f9f86caa5 | ||
|
|
7043bbae9d | ||
|
|
0890171527 | ||
|
|
c8730db7b4 | ||
|
|
f6b71e3941 | ||
|
|
9b6822f325 | ||
|
|
702a14e90c | ||
|
|
5a9030883a | ||
|
|
f3fabcd93c | ||
|
|
a09991d770 | ||
|
|
3d92145bb9 | ||
|
|
3211a8a5e0 | ||
|
|
c5d6381933 | ||
|
|
126d1598ee | ||
|
|
970368c74e | ||
|
|
9f0e48e337 | ||
|
|
eaacb7b71e | ||
|
|
e6fcf75181 | ||
|
|
014274930a | ||
|
|
c91bc0e681 | ||
|
|
25aae21cf6 | ||
|
|
b507b87871 | ||
|
|
fb68506418 | ||
|
|
3096d8d988 | ||
|
|
0ea2252b5b | ||
|
|
98e0f0d7d8 | ||
|
|
8cac30728b | ||
|
|
91673a5d70 | ||
|
|
782c669835 | ||
|
|
617f60d472 | ||
|
|
e63f39a9c4 | ||
|
|
d47acd1d80 | ||
|
|
77df87880c | ||
|
|
b5cc653179 | ||
|
|
42683ddb67 | ||
|
|
07c0075fc0 | ||
|
|
b695b7f245 | ||
|
|
9d5f4049b5 | ||
|
|
69f940fe8c | ||
|
|
307cbe4b77 | ||
|
|
4b14ecf1d9 | ||
|
|
cc6a323f45 | ||
|
|
f5c8091fd6 | ||
|
|
1737b46abb | ||
|
|
80d1814f10 | ||
|
|
b091fe07c9 | ||
|
|
03f34404b1 | ||
|
|
551c663046 | ||
|
|
51f5d64ef6 | ||
|
|
fa8b88b090 | ||
|
|
d7ce3d4719 | ||
|
|
f559621f00 | ||
|
|
46dc5f42e9 | ||
|
|
5ddfb7ccce | ||
|
|
0eeafa292e | ||
|
|
4dfb58a98c | ||
|
|
5f4e480b4c | ||
|
|
17879ad88c | ||
|
|
a84203be7c | ||
|
|
828f8a0df8 | ||
|
|
d7e904e1ab | ||
|
|
9ae68b52ef | ||
|
|
16d6e4ae2e | ||
|
|
52954d8e5d | ||
|
|
15fc97e516 | ||
|
|
6db8470de7 | ||
|
|
42ea39ee35 | ||
|
|
aa24dacb86 | ||
|
|
3143643692 | ||
|
|
30641d0fa9 | ||
|
|
2db2054cce | ||
|
|
7957b51409 | ||
|
|
2601ffe902 | ||
|
|
4059121dd6 | ||
|
|
046bca626e | ||
|
|
e8e48a4beb | ||
|
|
0d8c0e1fa6 | ||
|
|
40fa5293bf | ||
|
|
3952faba85 | ||
|
|
f5300d3d5a | ||
|
|
7f75050682 | ||
|
|
aeb71bb8f0 | ||
|
|
71d381aeae | ||
|
|
7c232318ad | ||
|
|
b835c2e27e | ||
|
|
ae6f028666 | ||
|
|
12f426d4f4 | ||
|
|
8291de40cf | ||
|
|
869bfb947d | ||
|
|
9de1a25703 | ||
|
|
d2263db0ff | ||
|
|
4f15de8b77 | ||
|
|
e53e891bd6 | ||
|
|
6c4946f4e2 | ||
|
|
c775e583dd | ||
|
|
b7d7747f65 | ||
|
|
2b4cfe2b02 | ||
|
|
8304d91b0b | ||
|
|
091cc8b789 | ||
|
|
3883c8bfe0 | ||
|
|
d2b93d531e | ||
|
|
5afc05feb2 | ||
|
|
b9bdca509e | ||
|
|
f3efafc9ca | ||
|
|
60cc3e9675 | ||
|
|
2a21d7403f | ||
|
|
a75301cd0e | ||
|
|
1e5d5397a4 | ||
|
|
8b83799253 | ||
|
|
63e0a1e8a2 | ||
|
|
59cc927878 | ||
|
|
3712eb0acb | ||
|
|
04800277c2 | ||
|
|
6a935b5452 | ||
|
|
11c641fd1b | ||
|
|
6e5aa0f71b | ||
|
|
16c6b2b202 | ||
|
|
12a6da928f | ||
|
|
d018648bc0 | ||
|
|
769f5674eb | ||
|
|
40f04ef6d0 | ||
|
|
b197869a23 | ||
|
|
9595d63c01 | ||
|
|
21f1b423f3 | ||
|
|
b80eb5f73b | ||
|
|
66c65490b9 | ||
|
|
1952246c85 | ||
|
|
f07d6dfb30 | ||
|
|
b26f6826dd | ||
|
|
58f4cce4f3 | ||
|
|
d56bc4c167 | ||
|
|
3684cdf1c6 | ||
|
|
e78a3f3278 | ||
|
|
b7a0f79038 | ||
|
|
23e9ee46b8 | ||
|
|
693000afa8 | ||
|
|
f35c59e6ce | ||
|
|
9cc2614cc8 | ||
|
|
dde66a664c | ||
|
|
c614e0a880 | ||
|
|
446e0f6f4c | ||
|
|
7eb02d2af3 | ||
|
|
042618cd8f | ||
|
|
f3809cb93d | ||
|
|
65431e0fcc | ||
|
|
5d0a7f99e9 | ||
|
|
68dd333fbe | ||
|
|
1259338e6c | ||
|
|
8e95115a7c | ||
|
|
2467f5636b | ||
|
|
1eb6142f11 | ||
|
|
377d8e6336 | ||
|
|
00681649bd | ||
|
|
8d684a0341 | ||
|
|
17970beebc | ||
|
|
ec0ec79470 | ||
|
|
8e1bd32f4d | ||
|
|
001f7c6694 | ||
|
|
8c6928d95a | ||
|
|
4049df8cb4 | ||
|
|
9e1ed6983f | ||
|
|
3d3d63173e | ||
|
|
13c2c4fa4c | ||
|
|
84e3ce508e | ||
|
|
b748a86694 | ||
|
|
92c6a52496 | ||
|
|
e27facc843 | ||
|
|
413f08f1b9 | ||
|
|
21cd66d109 | ||
|
|
41935996d4 | ||
|
|
d260224dfe | ||
|
|
894bfd47f4 | ||
|
|
8723f8785e | ||
|
|
7a657d1229 | ||
|
|
3274ec0721 | ||
|
|
2cb7464086 | ||
|
|
fafb469b5c | ||
|
|
87407c9ace | ||
|
|
0b200d15fd | ||
|
|
0e51ab41cf | ||
|
|
8aa2cab680 | ||
|
|
97306d3acd | ||
|
|
3eb62287ac | ||
|
|
c28936d9e4 | ||
|
|
956926d870 | ||
|
|
330de46249 | ||
|
|
b5bd6e6144 | ||
|
|
e09027e795 | ||
|
|
ad97092589 | ||
|
|
31b3563fb3 | ||
|
|
1c207afb31 | ||
|
|
35f3498ffa | ||
|
|
56f5fbdf6b | ||
|
|
13423bed18 | ||
|
|
9a1e122c19 | ||
|
|
29726e957f | ||
|
|
d9feb0d95c | ||
|
|
ad96baab55 | ||
|
|
08564ed6d4 | ||
|
|
862631b93a | ||
|
|
19cd57bce0 | ||
|
|
579b622935 | ||
|
|
78f6261fcc | ||
|
|
4b505827b1 | ||
|
|
c790b3827d | ||
|
|
b029d9aca6 | ||
|
|
967148890c | ||
|
|
b24654002b | ||
|
|
767eda6d60 | ||
|
|
bff86ea802 | ||
|
|
c74ace89ba | ||
|
|
d0242c1da6 | ||
|
|
bd4fdaaa00 | ||
|
|
9aff026569 | ||
|
|
0a6f0efdc5 | ||
|
|
9f5a38c26f | ||
|
|
ba9ff34cff | ||
|
|
9eb4d6c1d5 | ||
|
|
35646b7945 | ||
|
|
4e9ccdb6ed | ||
|
|
4917d88db0 | ||
|
|
e07f6af156 | ||
|
|
d4840d203c | ||
|
|
51250ef751 | ||
|
|
695930a06e | ||
|
|
92c2222879 | ||
|
|
b3ccba4c7e | ||
|
|
0f2369b5cb | ||
|
|
d27b18009f | ||
|
|
320e9d7432 | ||
|
|
c045e3f936 | ||
|
|
46762e5ad9 | ||
|
|
07560463de | ||
|
|
3959e1cd10 | ||
|
|
6d5af5b07a | ||
|
|
7f08324862 | ||
|
|
064768d07d | ||
|
|
3f9d2e44b6 | ||
|
|
3b3072b002 | ||
|
|
1d072eced2 | ||
|
|
10691036e0 | ||
|
|
832d2db3f6 | ||
|
|
c8be95646c | ||
|
|
4f65d17690 | ||
|
|
29420da565 | ||
|
|
fc4afe6767 | ||
|
|
84952d5aa6 | ||
|
|
7977c47fda | ||
|
|
1d677bb529 | ||
|
|
2261fe9b66 | ||
|
|
8957af0a4d | ||
|
|
411389b68e | ||
|
|
341c70de9e | ||
|
|
e6bc8f2d26 | ||
|
|
d25fbfec84 | ||
|
|
5638c386db | ||
|
|
8202344d01 | ||
|
|
def928804f | ||
|
|
de2082c0e1 | ||
|
|
492e021fa4 | ||
|
|
6b8f2e4683 | ||
|
|
b87ac725a4 | ||
|
|
a6575e7910 | ||
|
|
3f8b6402e6 | ||
|
|
b951094ea2 | ||
|
|
b27b7d2805 | ||
|
|
8a4da01b7f | ||
|
|
7a4928e1e0 | ||
|
|
b291b242ee | ||
|
|
a10617c182 | ||
|
|
a56c776695 | ||
|
|
f144fa241f | ||
|
|
3b17bf14c1 | ||
|
|
35cb60b801 | ||
|
|
eebe0eb618 | ||
|
|
037bedb0c0 | ||
|
|
15cd0c6b49 | ||
|
|
00f6e8d61b | ||
|
|
028d84b805 | ||
|
|
f693968853 | ||
|
|
a3323c24ac | ||
|
|
2f15c30d9a | ||
|
|
43a8ec6f50 | ||
|
|
ee5937d038 | ||
|
|
228bbbea5f | ||
|
|
fbbacd205c | ||
|
|
bd4dfcb351 | ||
|
|
9cc750a90f | ||
|
|
b29decb95f | ||
|
|
f319257f8d | ||
|
|
b01209457d | ||
|
|
8a8970d9ee | ||
|
|
bc5e86bd4b | ||
|
|
329a030585 | ||
|
|
f7de391518 | ||
|
|
23eb73a943 | ||
|
|
907702441f | ||
|
|
047f4e31ad | ||
|
|
6e9784f68c | ||
|
|
3363a5a20a | ||
|
|
9d4397806b | ||
|
|
9b8cf3845a | ||
|
|
89527c533a | ||
|
|
5d7c020223 | ||
|
|
bd5cc35fc0 | ||
|
|
95141574d4 | ||
|
|
4b91ade2e8 | ||
|
|
9845ee189c | ||
|
|
f0662eed48 | ||
|
|
6a2ddd4ef6 | ||
|
|
66c89abbc6 | ||
|
|
5619768212 | ||
|
|
6c7f487a3e | ||
|
|
0086f0b71b | ||
|
|
bb2587aaa0 | ||
|
|
cc7a244d0b | ||
|
|
60d2a0818b | ||
|
|
2bd3a4ddd1 | ||
|
|
4e63477b98 | ||
|
|
e7baca16ef | ||
|
|
330ea0571f | ||
|
|
e02bf2ebb5 | ||
|
|
9d4536dcbe | ||
|
|
fc883745e5 | ||
|
|
58d59c6844 | ||
|
|
4737c0da3f | ||
|
|
6b4822d98d | ||
|
|
c89bc0b51a | ||
|
|
baf1de4b34 | ||
|
|
87afedae82 | ||
|
|
03805bd6e2 | ||
|
|
59ece8fd29 | ||
|
|
5d5f5cf105 | ||
|
|
7e1016ff07 | ||
|
|
10896c1add | ||
|
|
2f566bf6d7 | ||
|
|
1a157eb6a5 | ||
|
|
9c7481a0c7 | ||
|
|
d04f58a27e | ||
|
|
2f4ce40095 | ||
|
|
692d1d72a3 | ||
|
|
c9614f9baf | ||
|
|
74290eca2a | ||
|
|
f3a2c1fb4d | ||
|
|
f4db261baf | ||
|
|
fdae84bb74 | ||
|
|
cfec4eb5a2 | ||
|
|
b37b993eea | ||
|
|
eeb0579acb | ||
|
|
b9456dcc98 | ||
|
|
d6d27a2861 | ||
|
|
509188092c | ||
|
|
e8244cb2f2 | ||
|
|
5f1582f39f | ||
|
|
e41c1b6755 | ||
|
|
fb020f4fcd | ||
|
|
692f04727f | ||
|
|
3064af753b | ||
|
|
09368b05f7 | ||
|
|
5f4ec41497 | ||
|
|
a97594135a | ||
|
|
989dc418a8 | ||
|
|
9667f8b853 | ||
|
|
a51e590d24 | ||
|
|
34d9882987 | ||
|
|
8cd3d0c16c | ||
|
|
7f464af5fa | ||
|
|
fc582c7bf6 | ||
|
|
02cd70c2e0 | ||
|
|
80cd408821 | ||
|
|
dbef2e2832 | ||
|
|
5078ea8692 | ||
|
|
2642968089 | ||
|
|
6991900ceb | ||
|
|
5c3e7acc6d | ||
|
|
6112322bce | ||
|
|
daf2936635 | ||
|
|
554612d25f | ||
|
|
937f488a8f | ||
|
|
c7b4ab116f | ||
|
|
9186a553ca | ||
|
|
3db67de27a | ||
|
|
a37ce376a7 | ||
|
|
8a68e6adb3 | ||
|
|
0e43a948b5 | ||
|
|
367f99bf6e | ||
|
|
e8778a2ad7 | ||
|
|
d82c6c34ed | ||
|
|
f3ff8dc18c | ||
|
|
5e2a1b9346 | ||
|
|
1499a0c5fd | ||
|
|
e9deb99d2f | ||
|
|
c3627c38e3 | ||
|
|
1b764f5d90 | ||
|
|
64cddfeed3 | ||
|
|
48ee1fe016 | ||
|
|
6e4ee26a58 | ||
|
|
92bb1499c4 | ||
|
|
d7f5246dc4 | ||
|
|
8c8e0bf0e4 | ||
|
|
c0c173fd71 | ||
|
|
c4ba7b3024 | ||
|
|
a06498d8fb | ||
|
|
9d33d6ae62 | ||
|
|
8c090b180b | ||
|
|
9c98d7d570 | ||
|
|
5b57c58b84 | ||
|
|
5623f2e9a4 | ||
|
|
c7aac11868 | ||
|
|
530dd3b82b | ||
|
|
6cdcda30f4 | ||
|
|
8ce520317e | ||
|
|
bb0a89f12b | ||
|
|
23b4870ee6 | ||
|
|
db51ab9d45 | ||
|
|
e9cf0f8599 | ||
|
|
d94a76a2c7 | ||
|
|
36b16cd2fe | ||
|
|
846a875429 | ||
|
|
581000b920 | ||
|
|
10cd6dd8d9 | ||
|
|
24dd4e0489 | ||
|
|
50fc9a4713 | ||
|
|
0b0c8d8471 | ||
|
|
1230cc57d7 | ||
|
|
75af1e9920 | ||
|
|
08007a491f | ||
|
|
cb69edc6dd | ||
|
|
71f99528ae | ||
|
|
bc4b4385bf | ||
|
|
81d66207ed | ||
|
|
d270c8f32d | ||
|
|
d5b2a6f059 | ||
|
|
d1a1e6e265 | ||
|
|
56b92afb6b | ||
|
|
6956f14c0d | ||
|
|
4d3d7dc60e | ||
|
|
3d643f88fd | ||
|
|
6b837f80ff | ||
|
|
01b68e8b6a | ||
|
|
f8da001b7c | ||
|
|
abd907fee1 | ||
|
|
62bec93190 | ||
|
|
69bb422fa2 | ||
|
|
0b7568e08f | ||
|
|
d1eac195d8 | ||
|
|
4bd8e136be | ||
|
|
d3992cb6e1 | ||
|
|
09ce3e088a | ||
|
|
66e48e3294 | ||
|
|
b658f7133b | ||
|
|
09e2413695 | ||
|
|
945d50cc13 | ||
|
|
20e7331bb9 | ||
|
|
4977a8b17c | ||
|
|
02160b12ee | ||
|
|
170d799470 | ||
|
|
02ea4eb410 | ||
|
|
0f5ca7b62e | ||
|
|
47295d42f5 | ||
|
|
e3a3a01ee1 | ||
|
|
9b54a432fc | ||
|
|
fc2564e7be | ||
|
|
85708b77c6 | ||
|
|
470046dda9 | ||
|
|
986df0c573 | ||
|
|
1945c57b0d | ||
|
|
818c5025f9 | ||
|
|
34bcfd806d | ||
|
|
c393cc6594 | ||
|
|
dd8627f9dd | ||
|
|
a883af32e7 | ||
|
|
f2acf93493 | ||
|
|
3550248d39 | ||
|
|
cdd985cc57 | ||
|
|
dd96a44c05 | ||
|
|
2e6e474a54 | ||
|
|
0662245590 | ||
|
|
7b0c385920 | ||
|
|
50b352bfb6 | ||
|
|
80aca60477 | ||
|
|
72ea577c70 | ||
|
|
bc6c8c8332 | ||
|
|
1fa1277e31 | ||
|
|
48ad831f9f | ||
|
|
bc34c67f47 | ||
|
|
2e3bcf600f | ||
|
|
88df4cc7ae | ||
|
|
77b07bb6f8 | ||
|
|
13e067c20a | ||
|
|
7f2785770f | ||
|
|
6936bc9c3e | ||
|
|
fbbf9dab60 | ||
|
|
981801f23c | ||
|
|
ad7e59794a | ||
|
|
be23a85bf0 | ||
|
|
754f3ac537 | ||
|
|
a20f9e2697 | ||
|
|
aa00309f00 | ||
|
|
fc2de5a384 | ||
|
|
1c0a78e8ad | ||
|
|
0b37437102 | ||
|
|
d9a8fa0474 | ||
|
|
07df3c90ab | ||
|
|
6785b9e4d2 | ||
|
|
d9dff52104 | ||
|
|
9adf08522c | ||
|
|
457007c9c7 | ||
|
|
852c3ced3b | ||
|
|
398991de0c | ||
|
|
c42c22dc66 | ||
|
|
07726de250 | ||
|
|
81ce7b915a | ||
|
|
80aee06a67 | ||
|
|
5805d68b58 | ||
|
|
a2fbdf644c | ||
|
|
714cd522cb | ||
|
|
26e40f433b | ||
|
|
c82f55695c | ||
|
|
2c307242b1 | ||
|
|
6a4f3a526f | ||
|
|
eb2c432f22 | ||
|
|
c4741043e9 | ||
|
|
6ae91c2ff0 | ||
|
|
285d74767d | ||
|
|
2dd2289c94 | ||
|
|
174b353ce0 | ||
|
|
e2244bd839 | ||
|
|
299709108f | ||
|
|
cb59d21f5a | ||
|
|
aeebc893de | ||
|
|
a0310b1c2c | ||
|
|
90840f6d00 | ||
|
|
a44158261a | ||
|
|
6359da0010 | ||
|
|
784e2896bd | ||
|
|
4c6b841b16 | ||
|
|
793b887aea | ||
|
|
a281f59319 | ||
|
|
1f030160b0 | ||
|
|
93493b204f | ||
|
|
3d04ab59d5 | ||
|
|
0ee4aa9eb9 | ||
|
|
5e18eb6e4d | ||
|
|
bf6b525359 | ||
|
|
19eec6e1f4 | ||
|
|
cb541ebea2 | ||
|
|
9833d1754a | ||
|
|
e95842deef | ||
|
|
bf41fe838c | ||
|
|
31f9f31ff2 | ||
|
|
fcc15e283a | ||
|
|
e1a457e445 | ||
|
|
8afacd9709 | ||
|
|
05c55efe12 | ||
|
|
3cff145e2d | ||
|
|
f8dde1201e | ||
|
|
fdf5450a2e | ||
|
|
f22cb9aac1 | ||
|
|
8d2ca003fb | ||
|
|
d5075d68b1 | ||
|
|
0ea8c349fb | ||
|
|
fa09a0ef4d | ||
|
|
e6492d4852 | ||
|
|
c46a45f00f | ||
|
|
ca42850a0c | ||
|
|
7a456c2c6b | ||
|
|
54127cf77a | ||
|
|
968e3189e7 | ||
|
|
b6741daca6 | ||
|
|
34ddc69bfe | ||
|
|
1eb387dcdd | ||
|
|
af7accd1e9 | ||
|
|
b4f65955fe | ||
|
|
d88382af12 | ||
|
|
3bfaa6f8de | ||
|
|
3b5736f983 | ||
|
|
90aabde4c9 | ||
|
|
aff02e1f1c | ||
|
|
5c5a97ca75 | ||
|
|
dc8ed1978d | ||
|
|
e4afc20366 | ||
|
|
19a3354aa2 | ||
|
|
8a64ba727f | ||
|
|
d695514929 | ||
|
|
3136affc91 | ||
|
|
09abd723d1 | ||
|
|
00e12d0747 | ||
|
|
ad17c18824 | ||
|
|
3f8d063bde | ||
|
|
46fd4cf96e | ||
|
|
4197bfb348 | ||
|
|
766b56a944 | ||
|
|
805299bc75 | ||
|
|
948e6fd20d | ||
|
|
10e46b6fc3 | ||
|
|
09c22bbe43 | ||
|
|
02cd1a7623 | ||
|
|
5b3584d738 | ||
|
|
d011be3faa | ||
|
|
4024c9758c | ||
|
|
158f380dac | ||
|
|
5c9e2f1820 | ||
|
|
8404453cec | ||
|
|
212e57a16c | ||
|
|
088e9f1e7d | ||
|
|
7c1bf39ff4 | ||
|
|
a3927e2e5a | ||
|
|
1d55d00caf | ||
|
|
25432b745d | ||
|
|
89674a0697 | ||
|
|
39e6f8ecbd | ||
|
|
3f264163d4 | ||
|
|
0250bf026a | ||
|
|
7e34595f99 | ||
|
|
fd87e7bc1d | ||
|
|
95ddb80612 | ||
|
|
8b76b30266 | ||
|
|
a0c79f1a4a | ||
|
|
fe2f1f9aa3 | ||
|
|
eaf54781e8 | ||
|
|
739989473d | ||
|
|
c024bdf427 | ||
|
|
12e87d119b | ||
|
|
f271fadfec | ||
|
|
af1a44f479 | ||
|
|
c213287e07 | ||
|
|
9f1a4ddf9b | ||
|
|
a48baf528b | ||
|
|
eca8cf5502 | ||
|
|
7ea861650f | ||
|
|
8622dab0d2 | ||
|
|
977cf8d3d1 | ||
|
|
6798c35728 | ||
|
|
ff29c9741e | ||
|
|
8fd79fb6c8 | ||
|
|
e660de236a | ||
|
|
698a0d285c | ||
|
|
e2c8bdcd40 | ||
|
|
1e8bb8b887 | ||
|
|
c76ce035a6 | ||
|
|
ceb46c4eca | ||
|
|
ae9a7a4b55 | ||
|
|
b27efec2ef | ||
|
|
c851ff449b | ||
|
|
2e0e5c0014 | ||
|
|
6ec2a24cbe | ||
|
|
ef2bc3bfad | ||
|
|
8083550bb4 | ||
|
|
fcbd22318a | ||
|
|
068672ea12 | ||
|
|
3ef3c157f3 | ||
|
|
860e4fcead | ||
|
|
759204e77b | ||
|
|
a9fba05b03 | ||
|
|
ea6d78b294 | ||
|
|
137ef36f74 | ||
|
|
66b4f15a7b | ||
|
|
ff56b0db2b | ||
|
|
e6f1d487a9 | ||
|
|
2cca01fdee | ||
|
|
c95ecac7a3 | ||
|
|
b33eccf929 | ||
|
|
4b35098dfe | ||
|
|
9d04c7fb7c | ||
|
|
e8990b4009 | ||
|
|
70010db77b | ||
|
|
812e439d85 | ||
|
|
a738995b09 | ||
|
|
8cb94872e6 | ||
|
|
9f8064563e | ||
|
|
2ca8d4ed9e | ||
|
|
8fdc2a59c2 | ||
|
|
4c837c7d15 | ||
|
|
b67229783b | ||
|
|
4475ebfaa8 | ||
|
|
358d2f74b2 | ||
|
|
9216d92488 | ||
|
|
0a564a438b | ||
|
|
066f1251a7 | ||
|
|
b7f50c321b | ||
|
|
61ae94b2b3 | ||
|
|
12af856d00 | ||
|
|
ad26900a01 | ||
|
|
cca408e2d8 | ||
|
|
5f2fa0fdc5 | ||
|
|
f205d97f26 | ||
|
|
decf2ef022 | ||
|
|
9c2975a546 | ||
|
|
308ef0fc30 | ||
|
|
bd0aaab003 | ||
|
|
18450815d8 | ||
|
|
2d086b7355 | ||
|
|
093b6431f2 | ||
|
|
d3699cb9e3 | ||
|
|
a7c8df7f45 | ||
|
|
294fb67007 | ||
|
|
38d4687b78 | ||
|
|
48549cdd83 | ||
|
|
786454c8d4 | ||
|
|
8f67056c71 | ||
|
|
ab6e989663 | ||
|
|
87e6763859 | ||
|
|
6a29c81f67 | ||
|
|
35b5dfd83e | ||
|
|
5c3a56a289 | ||
|
|
ce59019967 | ||
|
|
63fd274106 | ||
|
|
1ac29c6fbe | ||
|
|
912fb6d583 | ||
|
|
74375fe839 | ||
|
|
a7539c111e | ||
|
|
6e4a6ccfeb | ||
|
|
b57b1b6689 | ||
|
|
f801cbe376 | ||
|
|
043f2df7e3 | ||
|
|
6ca5827ce6 | ||
|
|
076f161c35 | ||
|
|
2ab1fa75ee | ||
|
|
a4267fd28b | ||
|
|
723d8f6f3f | ||
|
|
b009c2677b | ||
|
|
9331ede408 | ||
|
|
159799c91d | ||
|
|
0c658d01ef | ||
|
|
a8bd50a0cd | ||
|
|
ef550fed2b | ||
|
|
19678aa977 | ||
|
|
40e683d7a6 | ||
|
|
0e3978b87c | ||
|
|
e1bd8c6d51 | ||
|
|
73f52d69d4 | ||
|
|
f2b3ca8763 | ||
|
|
a7bb014fba | ||
|
|
6d3bc4ec1d | ||
|
|
789173be98 | ||
|
|
586d231ab1 | ||
|
|
2127924066 | ||
|
|
acf9c29c83 | ||
|
|
ea7dd0763f | ||
|
|
eebc75d245 | ||
|
|
997cb8f9ae | ||
|
|
703319f66b | ||
|
|
5b0158a6c9 | ||
|
|
615eecbd5a | ||
|
|
a874807bda | ||
|
|
2da3165019 | ||
|
|
78b0b5ad18 | ||
|
|
c840f81fe6 | ||
|
|
29b5e769d6 | ||
|
|
445f44d847 | ||
|
|
3ec37b7646 | ||
|
|
8c36a732a6 | ||
|
|
69d9507758 | ||
|
|
d824b91c42 | ||
|
|
2b05ae6c08 | ||
|
|
48240498f9 | ||
|
|
3ec57eace8 | ||
|
|
638bf7e50b | ||
|
|
cd1caa5568 | ||
|
|
56326026b7 | ||
|
|
ed392ac4c2 | ||
|
|
304e43e2ae | ||
|
|
1095f01c4f | ||
|
|
88acbc4d4d | ||
|
|
4aba09c44e | ||
|
|
632aad2787 | ||
|
|
417e3ee19f | ||
|
|
70fd326041 | ||
|
|
f40d6d8ba9 | ||
|
|
1222f2cf0e | ||
|
|
2c21ade950 | ||
|
|
035a0a4ee2 | ||
|
|
a5f5eba9fb |
59
.gitignore
vendored
59
.gitignore
vendored
@@ -1,2 +1,59 @@
|
|||||||
|
|
||||||
|
# Created by https://www.gitignore.io/api/macos,windows
|
||||||
|
# Edit at https://www.gitignore.io/?templates=macos,windows
|
||||||
|
|
||||||
|
### macOS ###
|
||||||
|
# General
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.idea
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
### Windows ###
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
# End of https://www.gitignore.io/api/macos,windows
|
||||||
111
README.md
111
README.md
@@ -1,44 +1,76 @@
|
|||||||
## Hybrid Hunter Beta 1.2.1 - Beta 1
|
## Hybrid Hunter Beta 1.4.1 - Beta 3
|
||||||
|
|
||||||
### Changes:
|
- Fix install script to handle hostnames properly.
|
||||||
|
|
||||||
- Full support for Ubuntu 18.04. 16.04 is no longer supported for Hybrid Hunter.
|
|
||||||
- Introduction of the Security Onion Console. Once logged in you are directly taken to the SOC.
|
|
||||||
- New authentication using Kratos.
|
|
||||||
- During install you must specify how you would like to access the SOC ui. This is for strict cookie security.
|
|
||||||
- Ability to list and delete web users from the SOC ui.
|
|
||||||
- The soremote account is now used to add nodes to the grid vs using socore.
|
|
||||||
- Community ID support for Zeek, osquery, and Suricata. You can now tie host events to connection logs!
|
|
||||||
- Elastic 7.6.1 with ECS support.
|
|
||||||
- New set of Kibana dashboards that align with ECS.
|
|
||||||
- Eval mode no longer uses Logstash for parsing (Filebeat -> ES Ingest)
|
|
||||||
- Ingest node parsing for osquery-shipped logs (osquery, WEL, Sysmon).
|
|
||||||
- Fleet standalone mode with improved Web UI & API access control.
|
|
||||||
- Improved Fleet integration support.
|
|
||||||
- Playbook now has full Windows Sigma community ruleset builtin.
|
|
||||||
- Automatic Sigma community rule updates.
|
|
||||||
- Playbook stability enhancements.
|
|
||||||
- Zeek health check. Zeek will now auto restart if a worker crashes.
|
|
||||||
- zeekctl is now managed by salt.
|
|
||||||
- Grafana dashboard improvements and cleanup.
|
|
||||||
- Moved logstash configs to pillars.
|
|
||||||
- Salt logs moved to /opt/so/log/salt.
|
|
||||||
- Strelka integrated for file-oriented detection/analysis at scale
|
|
||||||
|
|
||||||
### Known issues:
|
## Hybrid Hunter Beta 1.4.0 - Beta 3
|
||||||
|
|
||||||
- Updating users via the SOC ui is known to fail. To change a user, delete the user and re-add them.
|
- Complete overhaul of the way we handle custom and default settings and data. You will now see a default and local directory under the saltstack directory. All customizations are stored in local.
|
||||||
|
- The way firewall rules are handled has been completely revamped. This will allow the user to customize firewall rules much easier.
|
||||||
|
- Users can now change their own password in SOC.
|
||||||
|
- Hunt now allows users to enable auto-hunt. This is a toggle which, when enabled, automatically submits a new hunt when filtering, grouping, etc.
|
||||||
|
- Title bar now reflects current Hunt query. This will assist users in locating a previous query from their browser history.
|
||||||
|
- Zeek 3.0.7
|
||||||
|
- Elastic 7.7.1
|
||||||
|
- Suricata can now be used for meta data generation.
|
||||||
|
- Suricata eve.json has been moved to `/nsm` to align with storage of other data.
|
||||||
|
- Suricata will now properly rotate its logs.
|
||||||
|
- Grafana dashboards now work properly in standalone mode.
|
||||||
|
- Kibana Dashboard updates including osquery, community_id.
|
||||||
|
- New Elasticsearch Ingest processor to generate community_id from any log that includes the required fields.
|
||||||
|
- Community_id generated for additional logs: Zeek HTTP/SMTP/ , Sysmon shipped with Osquery or Winlogbeat.
|
||||||
|
- Major streamlining of Fleet setup & configuration - no need to run a secondary setup script anymore.
|
||||||
|
- Fleet Standalone node now includes the ability to set a FQDN to point osquery endpoints to.
|
||||||
|
- Distributed installs now support ingesting Windows Eventlogs via Winlogbeat - includes full parsing support for Sysmon.
|
||||||
|
- SOC Downloads section now includes a link to the supported version of Winlogbeat.
|
||||||
|
- Basic syslog ingestion capability now included.
|
||||||
|
- Elasticsearch index name transition fixes for various components.
|
||||||
|
- Updated URLs for pivot fields in Kibana.
|
||||||
|
- Instances of `hive` renamed to `thehive`.
|
||||||
|
|
||||||
|
### Known Issues:
|
||||||
|
|
||||||
|
- The Hunt feature is currently considered "Preview" and although very useful in its current state, not everything works. We wanted to get this out as soon as possible to get the feedback from you! Let us know what you want to see! Let us know what you think we should call it!
|
||||||
|
- You cannot pivot to PCAP from Suricata alerts in Kibana or Hunt.
|
||||||
|
- Navigator is currently not working when using hostname to access SOC. IP mode works correctly.
|
||||||
- Due to the move to ECS, the current Playbook plays may not alert correctly at this time.
|
- Due to the move to ECS, the current Playbook plays may not alert correctly at this time.
|
||||||
- The osquery MacOS package does not install correctly.
|
- The osquery MacOS package does not install correctly.
|
||||||
|
|
||||||
|
|
||||||
## Version 1.2.1 Beta 1 ISO Download
|
## Hybrid Hunter Beta 1.3.0 - Beta 2
|
||||||
|
|
||||||
[HH1.2.1-6.ISO](https://download.securityonion.net/file/Hybrid-Hunter/HH-1.2.1-6.iso)
|
### Changes:
|
||||||
|
|
||||||
MD5: D7E66CA8AAC37E70E2A2F7BB12EB3C23
|
- New Feature: Codename: "Onion Hunt". Select Hunt from the menu and start hunting down your adversaries!
|
||||||
SHA1: D91D921896F9ADA600EBA0ADAA548D8630B5341F
|
- Improved ECS support.
|
||||||
SHA256: D69E327597AB429DCE13C1177BCE6C1FAD934E78A09F73D14778C2CAE616557B
|
- Complete refactor of the setup to make it easier to follow.
|
||||||
|
- Improved setup script logging to better assist on any issues.
|
||||||
|
- Setup now checks for minimal requirements during install.
|
||||||
|
- Updated Cyberchef to version 9.20.3.
|
||||||
|
- Updated Elastalert to version 0.2.4 and switched to alpine to reduce container size.
|
||||||
|
- Updated Redis to 5.0.9 and switched to alpine to reduce container size.
|
||||||
|
- Updated Salt to 2019.2.5
|
||||||
|
- Updated Grafana to 6.7.3.
|
||||||
|
- Zeek 3.0.6
|
||||||
|
- Suricata 4.1.8
|
||||||
|
- Fixes so-status to now display correct containers and status.
|
||||||
|
- local.zeek is now controlled by a pillar instead of modifying the file directly.
|
||||||
|
- Renamed so-core to so-nginx and switched to alpine to reduce container size.
|
||||||
|
- Playbook now uses MySQL instead of SQLite.
|
||||||
|
- Sigma rules have all been updated.
|
||||||
|
- Kibana dashboard improvements for ECS.
|
||||||
|
- Fixed an issue where geoip was not properly parsed.
|
||||||
|
- ATT&CK Navigator is now it's own state.
|
||||||
|
- Standlone mode is now supported.
|
||||||
|
- Mastersearch previously used the same Grafana dashboard as a Search node. It now has its own dashboard that incorporates panels from the Master node and Search node dashboards.
|
||||||
|
|
||||||
|
### Known Issues:
|
||||||
|
|
||||||
|
- The Hunt feature is currently considered "Preview" and although very useful in its current state, not everything works. We wanted to get this out as soon as possible to get the feedback from you! Let us know what you want to see! Let us know what you think we should call it!
|
||||||
|
- You cannot pivot to PCAP from Suricata alerts in Kibana or Hunt.
|
||||||
|
- Updating users via the SOC ui is known to fail. To change a user, delete the user and re-add them.
|
||||||
|
- Due to the move to ECS, the current Playbook plays may not alert correctly at this time.
|
||||||
|
- The osquery MacOS package does not install correctly.
|
||||||
|
|
||||||
### Warnings and Disclaimers
|
### Warnings and Disclaimers
|
||||||
|
|
||||||
@@ -55,33 +87,36 @@ SHA256: D69E327597AB429DCE13C1177BCE6C1FAD934E78A09F73D14778C2CAE616557B
|
|||||||
|
|
||||||
Evaluation Mode:
|
Evaluation Mode:
|
||||||
|
|
||||||
- ISO or a Single VM running Ubuntu 16.04 or CentOS 7
|
- ISO or a Single VM running Ubuntu 18.04 or CentOS 7
|
||||||
- Minimum 12GB of RAM
|
- Minimum 12GB of RAM
|
||||||
- Minimum 4 CPU cores
|
- Minimum 4 CPU cores
|
||||||
- Minimum 2 NICs
|
- Minimum 2 NICs
|
||||||
|
|
||||||
Distributed:
|
Distributed:
|
||||||
|
|
||||||
- 3 VMs running the ISO or Ubuntu 16.04 or CentOS 7 (You can mix and match)
|
- 3 VMs running the ISO or Ubuntu 18.04 or CentOS 7 (You can mix and match)
|
||||||
- Minimum 8GB of RAM per VM
|
- Minimum 8GB of RAM per VM
|
||||||
- Minimum 4 CPU cores per VM
|
- Minimum 4 CPU cores per VM
|
||||||
- Minimum 2 NICs for forward nodes
|
- Minimum 2 NICs for forward nodes
|
||||||
|
|
||||||
### Prerequisites for Network Based Install
|
### Installation
|
||||||
|
|
||||||
Install git if using a Centos 7 Minimal install:
|
For most users, we recommend installing using [our ISO image](https://github.com/Security-Onion-Solutions/securityonion-saltstack/wiki/ISO).
|
||||||
|
|
||||||
|
If instead you would like to try a manual installation (not using our ISO), you can build from CentOS 7 or Ubuntu 18.04.
|
||||||
|
|
||||||
|
If using CentOS 7 Minimal, you will need to install git:
|
||||||
|
|
||||||
```sudo yum -y install git```
|
```sudo yum -y install git```
|
||||||
|
|
||||||
### Installation
|
Once you have git, then do the following:
|
||||||
|
|
||||||
Once you resolve those requirements or are using Ubuntu 16.04 do the following:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
git clone https://github.com/Security-Onion-Solutions/securityonion-saltstack
|
git clone https://github.com/Security-Onion-Solutions/securityonion-saltstack
|
||||||
cd securityonion-saltstack
|
cd securityonion-saltstack
|
||||||
sudo bash so-setup-network
|
sudo bash so-setup-network
|
||||||
```
|
```
|
||||||
|
|
||||||
Follow the prompts and reboot if asked to do so.
|
Follow the prompts and reboot if asked to do so.
|
||||||
|
|
||||||
Then proceed to the [Hybrid Hunter Quick Start Guide](https://github.com/Security-Onion-Solutions/securityonion-saltstack/wiki/Hybrid-Hunter-Quick-Start-Guide).
|
Then proceed to the [Hybrid Hunter Quick Start Guide](https://github.com/Security-Onion-Solutions/securityonion-saltstack/wiki/Hybrid-Hunter-Quick-Start-Guide).
|
||||||
|
|||||||
20
files/firewall/assigned_hostgroups.local.map.yaml
Normal file
20
files/firewall/assigned_hostgroups.local.map.yaml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{% import_yaml 'firewall/portgroups.yaml' as default_portgroups %}
|
||||||
|
{% set default_portgroups = default_portgroups.firewall.aliases.ports %}
|
||||||
|
{% import_yaml 'firewall/portgroups.local.yaml' as local_portgroups %}
|
||||||
|
{% if local_portgroups.firewall.aliases.ports %}
|
||||||
|
{% set local_portgroups = local_portgroups.firewall.aliases.ports %}
|
||||||
|
{% else %}
|
||||||
|
{% set local_portgroups = {} %}
|
||||||
|
{% endif %}
|
||||||
|
{% set portgroups = salt['defaults.merge'](default_portgroups, local_portgroups, in_place=False) %}
|
||||||
|
|
||||||
|
role:
|
||||||
|
eval:
|
||||||
|
fleet:
|
||||||
|
heavynode:
|
||||||
|
helixsensor:
|
||||||
|
master:
|
||||||
|
mastersearch:
|
||||||
|
standalone:
|
||||||
|
searchnode:
|
||||||
|
sensor:
|
||||||
62
files/firewall/hostgroups.local.yaml
Normal file
62
files/firewall/hostgroups.local.yaml
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
firewall:
|
||||||
|
hostgroups:
|
||||||
|
analyst:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
beats_endpoint:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
beats_endpoint_ssl:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
fleet:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
heavy_node:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
master:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
minion:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
node:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
osquery_endpoint:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
search_node:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
sensor:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
syslog:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
wazuh_agent:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
wazuh_api:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
|
wazuh_authd:
|
||||||
|
ips:
|
||||||
|
delete:
|
||||||
|
insert:
|
||||||
3
files/firewall/portgroups.local.yaml
Normal file
3
files/firewall/portgroups.local.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
firewall:
|
||||||
|
aliases:
|
||||||
|
ports:
|
||||||
@@ -37,7 +37,9 @@ log_file: /opt/so/log/salt/master
|
|||||||
#
|
#
|
||||||
file_roots:
|
file_roots:
|
||||||
base:
|
base:
|
||||||
- /opt/so/saltstack/salt
|
- /opt/so/saltstack/local/salt
|
||||||
|
- /opt/so/saltstack/default/salt
|
||||||
|
|
||||||
|
|
||||||
# The master_roots setting configures a master-only copy of the file_roots dictionary,
|
# The master_roots setting configures a master-only copy of the file_roots dictionary,
|
||||||
# used by the state compiler.
|
# used by the state compiler.
|
||||||
@@ -53,7 +55,8 @@ file_roots:
|
|||||||
|
|
||||||
pillar_roots:
|
pillar_roots:
|
||||||
base:
|
base:
|
||||||
- /opt/so/saltstack/pillar
|
- /opt/so/saltstack/local/pillar
|
||||||
|
- /opt/so/saltstack/default/pillar
|
||||||
|
|
||||||
peer:
|
peer:
|
||||||
.*:
|
.*:
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# This script adds sensors/nodes/etc to the nodes tab
|
# This script adds sensors/nodes/etc to the nodes tab
|
||||||
|
default_salt_dir=/opt/so/saltstack/default
|
||||||
|
local_salt_dir=/opt/so/saltstack/local
|
||||||
TYPE=$1
|
TYPE=$1
|
||||||
NAME=$2
|
NAME=$2
|
||||||
IPADDRESS=$3
|
IPADDRESS=$3
|
||||||
@@ -15,7 +16,7 @@ MONINT=$9
|
|||||||
#HOTNAME=$11
|
#HOTNAME=$11
|
||||||
|
|
||||||
echo "Seeing if this host is already in here. If so delete it"
|
echo "Seeing if this host is already in here. If so delete it"
|
||||||
if grep -q $NAME "/opt/so/saltstack/pillar/data/$TYPE.sls"; then
|
if grep -q $NAME "$local_salt_dir/pillar/data/$TYPE.sls"; then
|
||||||
echo "Node Already Present - Let's re-add it"
|
echo "Node Already Present - Let's re-add it"
|
||||||
awk -v blah=" $NAME:" 'BEGIN{ print_flag=1 }
|
awk -v blah=" $NAME:" 'BEGIN{ print_flag=1 }
|
||||||
{
|
{
|
||||||
@@ -31,27 +32,29 @@ if grep -q $NAME "/opt/so/saltstack/pillar/data/$TYPE.sls"; then
|
|||||||
if ( print_flag == 1 )
|
if ( print_flag == 1 )
|
||||||
print $0
|
print $0
|
||||||
|
|
||||||
} ' /opt/so/saltstack/pillar/data/$TYPE.sls > /opt/so/saltstack/pillar/data/tmp.$TYPE.sls
|
} ' $local_salt_dir/pillar/data/$TYPE.sls > $local_salt_dir/pillar/data/tmp.$TYPE.sls
|
||||||
mv /opt/so/saltstack/pillar/data/tmp.$TYPE.sls /opt/so/saltstack/pillar/data/$TYPE.sls
|
mv $local_salt_dir/pillar/data/tmp.$TYPE.sls $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
echo "Deleted $NAME from the tab. Now adding it in again with updated info"
|
echo "Deleted $NAME from the tab. Now adding it in again with updated info"
|
||||||
fi
|
fi
|
||||||
echo " $NAME:" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
echo " $NAME:" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
echo " ip: $IPADDRESS" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
echo " ip: $IPADDRESS" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
echo " manint: $MANINT" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
echo " manint: $MANINT" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
echo " totalcpus: $CPUS" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
echo " totalcpus: $CPUS" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
echo " guid: $GUID" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
echo " guid: $GUID" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
echo " rootfs: $ROOTFS" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
echo " rootfs: $ROOTFS" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
echo " nsmfs: $NSM" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
echo " nsmfs: $NSM" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
if [ $TYPE == 'sensorstab' ]; then
|
if [ $TYPE == 'sensorstab' ]; then
|
||||||
echo " monint: $MONINT" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
echo " monint: $MONINT" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
salt-call state.apply common queue=True
|
salt-call state.apply grafana queue=True
|
||||||
fi
|
fi
|
||||||
if [ $TYPE == 'evaltab' ]; then
|
if [ $TYPE == 'evaltab' ] || [ $TYPE == 'standalonetab' ]; then
|
||||||
echo " monint: $MONINT" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
echo " monint: $MONINT" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
salt-call state.apply common queue=True
|
if [ ! $10 ]; then
|
||||||
salt-call state.apply utility queue=True
|
salt-call state.apply grafana queue=True
|
||||||
|
salt-call state.apply utility queue=True
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
#if [ $TYPE == 'nodestab' ]; then
|
#if [ $TYPE == 'nodestab' ]; then
|
||||||
# echo " nodetype: $NODETYPE" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
# echo " nodetype: $NODETYPE" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
# echo " hotname: $HOTNAME" >> /opt/so/saltstack/pillar/data/$TYPE.sls
|
# echo " hotname: $HOTNAME" >> $local_salt_dir/pillar/data/$TYPE.sls
|
||||||
#fi
|
#fi
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
evaltab:
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
mastertab:
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
nodestab:
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
sensorstab:
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
eval:
|
eval:
|
||||||
containers:
|
containers:
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
{% if GRAFANA == '1' %}
|
{% if GRAFANA == '1' %}
|
||||||
- so-influxdb
|
- so-influxdb
|
||||||
@@ -54,7 +54,7 @@ eval:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
heavy_node:
|
heavy_node:
|
||||||
containers:
|
containers:
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
- so-redis
|
- so-redis
|
||||||
- so-logstash
|
- so-logstash
|
||||||
@@ -69,7 +69,7 @@ heavy_node:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
helix:
|
helix:
|
||||||
containers:
|
containers:
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
- so-idstools
|
- so-idstools
|
||||||
- so-steno
|
- so-steno
|
||||||
@@ -79,14 +79,14 @@ helix:
|
|||||||
- so-filebeat
|
- so-filebeat
|
||||||
hot_node:
|
hot_node:
|
||||||
containers:
|
containers:
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
- so-logstash
|
- so-logstash
|
||||||
- so-elasticsearch
|
- so-elasticsearch
|
||||||
- so-curator
|
- so-curator
|
||||||
master_search:
|
master_search:
|
||||||
containers:
|
containers:
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
- so-soc
|
- so-soc
|
||||||
- so-kratos
|
- so-kratos
|
||||||
@@ -127,7 +127,7 @@ master_search:
|
|||||||
master:
|
master:
|
||||||
containers:
|
containers:
|
||||||
- so-dockerregistry
|
- so-dockerregistry
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
{% if GRAFANA == '1' %}
|
{% if GRAFANA == '1' %}
|
||||||
- so-influxdb
|
- so-influxdb
|
||||||
@@ -169,12 +169,12 @@ master:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
parser_node:
|
parser_node:
|
||||||
containers:
|
containers:
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
- so-logstash
|
- so-logstash
|
||||||
search_node:
|
search_node:
|
||||||
containers:
|
containers:
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
- so-logstash
|
- so-logstash
|
||||||
- so-elasticsearch
|
- so-elasticsearch
|
||||||
@@ -185,7 +185,7 @@ search_node:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
sensor:
|
sensor:
|
||||||
containers:
|
containers:
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
- so-steno
|
- so-steno
|
||||||
- so-suricata
|
- so-suricata
|
||||||
@@ -196,7 +196,7 @@ sensor:
|
|||||||
- so-filebeat
|
- so-filebeat
|
||||||
warm_node:
|
warm_node:
|
||||||
containers:
|
containers:
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
- so-elasticsearch
|
- so-elasticsearch
|
||||||
fleet:
|
fleet:
|
||||||
@@ -206,6 +206,6 @@ fleet:
|
|||||||
- so-fleet
|
- so-fleet
|
||||||
- so-redis
|
- so-redis
|
||||||
- so-filebeat
|
- so-filebeat
|
||||||
- so-core
|
- so-nginx
|
||||||
- so-telegraf
|
- so-telegraf
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# This script adds ip addresses to specific rule sets defined by the user
|
# This script adds ip addresses to specific rule sets defined by the user
|
||||||
|
local_salt_dir=/opt/so/saltstack/local
|
||||||
POLICY=$1
|
POLICY=$1
|
||||||
IPADDRESS=$2
|
IPADDRESS=$2
|
||||||
|
|
||||||
if grep -q $2 "/opt/so/saltstack/pillar/firewall/$1.sls"; then
|
if grep -q $2 "$local_salt_dir/pillar/firewall/$1.sls"; then
|
||||||
echo "Firewall Rule Already There"
|
echo "Firewall Rule Already There"
|
||||||
else
|
else
|
||||||
echo " - $2" >> /opt/so/saltstack/pillar/firewall/$1.sls
|
echo " - $2" >> $local_salt_dir/pillar/firewall/$1.sls
|
||||||
salt-call state.apply firewall queue=True
|
salt-call state.apply firewall queue=True
|
||||||
fi
|
fi
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
analyst:
|
|
||||||
- 127.0.0.1
|
|
||||||
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
beats_endpoint:
|
|
||||||
- 127.0.0.1
|
|
||||||
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
forward_nodes:
|
|
||||||
- 127.0.0.1
|
|
||||||
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
masterfw:
|
|
||||||
- 127.0.0.1
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
minions:
|
|
||||||
- 127.0.0.1
|
|
||||||
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
osquery_endpoint:
|
|
||||||
- 127.0.0.1
|
|
||||||
|
|
||||||
62
pillar/firewall/ports.sls
Normal file
62
pillar/firewall/ports.sls
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
firewall:
|
||||||
|
analyst:
|
||||||
|
ports:
|
||||||
|
tcp:
|
||||||
|
- 80
|
||||||
|
- 443
|
||||||
|
udp:
|
||||||
|
beats_endpoint:
|
||||||
|
ports:
|
||||||
|
tcp:
|
||||||
|
- 5044
|
||||||
|
forward_nodes:
|
||||||
|
ports:
|
||||||
|
tcp:
|
||||||
|
- 443
|
||||||
|
- 5044
|
||||||
|
- 5644
|
||||||
|
- 9822
|
||||||
|
udp:
|
||||||
|
master:
|
||||||
|
ports:
|
||||||
|
tcp:
|
||||||
|
- 1514
|
||||||
|
- 3200
|
||||||
|
- 3306
|
||||||
|
- 4200
|
||||||
|
- 5601
|
||||||
|
- 6379
|
||||||
|
- 8086
|
||||||
|
- 8090
|
||||||
|
- 9001
|
||||||
|
- 9200
|
||||||
|
- 9300
|
||||||
|
- 9400
|
||||||
|
- 9500
|
||||||
|
udp:
|
||||||
|
- 1514
|
||||||
|
minions:
|
||||||
|
ports:
|
||||||
|
tcp:
|
||||||
|
- 3142
|
||||||
|
- 4505
|
||||||
|
- 4506
|
||||||
|
- 5000
|
||||||
|
- 8080
|
||||||
|
- 8086
|
||||||
|
- 55000
|
||||||
|
osquery_endpoint:
|
||||||
|
ports:
|
||||||
|
tcp:
|
||||||
|
- 8090
|
||||||
|
search_nodes:
|
||||||
|
ports:
|
||||||
|
tcp:
|
||||||
|
- 6379
|
||||||
|
- 9300
|
||||||
|
wazuh_endpoint:
|
||||||
|
ports:
|
||||||
|
tcp:
|
||||||
|
- 1514
|
||||||
|
udp:
|
||||||
|
-1514
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
search_nodes:
|
|
||||||
- 127.0.0.1
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
wazuh_endpoint:
|
|
||||||
- 127.0.0.1
|
|
||||||
5
pillar/healthcheck/standalone.sls
Normal file
5
pillar/healthcheck/standalone.sls
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
healthcheck:
|
||||||
|
enabled: False
|
||||||
|
schedule: 300
|
||||||
|
checks:
|
||||||
|
- zeek
|
||||||
@@ -2,5 +2,6 @@ logstash:
|
|||||||
pipelines:
|
pipelines:
|
||||||
master:
|
master:
|
||||||
config:
|
config:
|
||||||
|
- so/0009_input_beats.conf
|
||||||
- so/0010_input_hhbeats.conf
|
- so/0010_input_hhbeats.conf
|
||||||
- so/9999_output_redis.conf.jinja
|
- so/9999_output_redis.conf.jinja
|
||||||
|
|||||||
@@ -5,12 +5,12 @@ logstash:
|
|||||||
- so/0900_input_redis.conf.jinja
|
- so/0900_input_redis.conf.jinja
|
||||||
- so/9000_output_zeek.conf.jinja
|
- so/9000_output_zeek.conf.jinja
|
||||||
- so/9002_output_import.conf.jinja
|
- so/9002_output_import.conf.jinja
|
||||||
|
- so/9034_output_syslog.conf.jinja
|
||||||
- so/9100_output_osquery.conf.jinja
|
- so/9100_output_osquery.conf.jinja
|
||||||
- so/9400_output_suricata.conf.jinja
|
- so/9400_output_suricata.conf.jinja
|
||||||
- so/9500_output_beats.conf.jinja
|
- so/9500_output_beats.conf.jinja
|
||||||
- so/9600_output_ossec.conf.jinja
|
- so/9600_output_ossec.conf.jinja
|
||||||
- so/9700_output_strelka.conf.jinja
|
- so/9700_output_strelka.conf.jinja
|
||||||
templates:
|
templates:
|
||||||
- so/so-beats-template.json
|
|
||||||
- so/so-common-template.json
|
- so/so-common-template.json
|
||||||
- so/so-zeek-template.json
|
- so/so-zeek-template.json
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
base:
|
base:
|
||||||
'*':
|
'*':
|
||||||
- patch.needs_restarting
|
- patch.needs_restarting
|
||||||
- docker.config
|
|
||||||
|
'*_eval or *_helix or *_heavynode or *_sensor or *_standalone':
|
||||||
|
- match: compound
|
||||||
|
- zeek
|
||||||
|
|
||||||
'*_mastersearch or *_heavynode':
|
'*_mastersearch or *_heavynode':
|
||||||
- match: compound
|
- match: compound
|
||||||
@@ -11,7 +14,6 @@ base:
|
|||||||
|
|
||||||
'*_sensor':
|
'*_sensor':
|
||||||
- static
|
- static
|
||||||
- firewall.*
|
|
||||||
- brologs
|
- brologs
|
||||||
- healthcheck.sensor
|
- healthcheck.sensor
|
||||||
- minions.{{ grains.id }}
|
- minions.{{ grains.id }}
|
||||||
@@ -19,7 +21,6 @@ base:
|
|||||||
'*_master or *_mastersearch':
|
'*_master or *_mastersearch':
|
||||||
- match: compound
|
- match: compound
|
||||||
- static
|
- static
|
||||||
- firewall.*
|
|
||||||
- data.*
|
- data.*
|
||||||
- secrets
|
- secrets
|
||||||
- minions.{{ grains.id }}
|
- minions.{{ grains.id }}
|
||||||
@@ -30,27 +31,34 @@ base:
|
|||||||
|
|
||||||
'*_eval':
|
'*_eval':
|
||||||
- static
|
- static
|
||||||
- firewall.*
|
|
||||||
- data.*
|
- data.*
|
||||||
- brologs
|
- brologs
|
||||||
- secrets
|
- secrets
|
||||||
- healthcheck.eval
|
- healthcheck.eval
|
||||||
- minions.{{ grains.id }}
|
- minions.{{ grains.id }}
|
||||||
|
|
||||||
|
'*_standalone':
|
||||||
|
- logstash
|
||||||
|
- logstash.master
|
||||||
|
- logstash.search
|
||||||
|
- data.*
|
||||||
|
- brologs
|
||||||
|
- secrets
|
||||||
|
- healthcheck.standalone
|
||||||
|
- static
|
||||||
|
- minions.{{ grains.id }}
|
||||||
|
|
||||||
'*_node':
|
'*_node':
|
||||||
- static
|
- static
|
||||||
- firewall.*
|
|
||||||
- minions.{{ grains.id }}
|
- minions.{{ grains.id }}
|
||||||
|
|
||||||
'*_heavynode':
|
'*_heavynode':
|
||||||
- static
|
- static
|
||||||
- firewall.*
|
|
||||||
- brologs
|
- brologs
|
||||||
- minions.{{ grains.id }}
|
- minions.{{ grains.id }}
|
||||||
|
|
||||||
'*_helix':
|
'*_helix':
|
||||||
- static
|
- static
|
||||||
- firewall.*
|
|
||||||
- fireeye
|
- fireeye
|
||||||
- brologs
|
- brologs
|
||||||
- logstash
|
- logstash
|
||||||
@@ -59,14 +67,12 @@ base:
|
|||||||
|
|
||||||
'*_fleet':
|
'*_fleet':
|
||||||
- static
|
- static
|
||||||
- firewall.*
|
|
||||||
- data.*
|
- data.*
|
||||||
- secrets
|
- secrets
|
||||||
- minions.{{ grains.id }}
|
- minions.{{ grains.id }}
|
||||||
|
|
||||||
'*_searchnode':
|
'*_searchnode':
|
||||||
- static
|
- static
|
||||||
- firewall.*
|
|
||||||
- logstash
|
- logstash
|
||||||
- logstash.search
|
- logstash.search
|
||||||
- minions.{{ grains.id }}
|
- minions.{{ grains.id }}
|
||||||
|
|||||||
55
pillar/zeek/init.sls
Normal file
55
pillar/zeek/init.sls
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
zeek:
|
||||||
|
zeekctl:
|
||||||
|
MailTo: root@localhost
|
||||||
|
MailConnectionSummary: 1
|
||||||
|
MinDiskSpace: 5
|
||||||
|
MailHostUpDown: 1
|
||||||
|
LogRotationInterval: 3600
|
||||||
|
LogExpireInterval: 0
|
||||||
|
StatsLogEnable: 1
|
||||||
|
StatsLogExpireInterval: 0
|
||||||
|
StatusCmdShowAll: 0
|
||||||
|
CrashExpireInterval: 0
|
||||||
|
SitePolicyScripts: local.zeek
|
||||||
|
LogDir: /nsm/zeek/logs
|
||||||
|
SpoolDir: /nsm/zeek/spool
|
||||||
|
CfgDir: /opt/zeek/etc
|
||||||
|
CompressLogs: 1
|
||||||
|
local:
|
||||||
|
'@load':
|
||||||
|
- misc/loaded-scripts
|
||||||
|
- tuning/defaults
|
||||||
|
- misc/capture-loss
|
||||||
|
- misc/stats
|
||||||
|
- frameworks/software/vulnerable
|
||||||
|
- frameworks/software/version-changes
|
||||||
|
- protocols/ftp/software
|
||||||
|
- protocols/smtp/software
|
||||||
|
- protocols/ssh/software
|
||||||
|
- protocols/http/software
|
||||||
|
- protocols/dns/detect-external-names
|
||||||
|
- protocols/ftp/detect
|
||||||
|
- protocols/conn/known-hosts
|
||||||
|
- protocols/conn/known-services
|
||||||
|
- protocols/ssl/known-certs
|
||||||
|
- protocols/ssl/validate-certs
|
||||||
|
- protocols/ssl/log-hostcerts-only
|
||||||
|
- protocols/ssh/geo-data
|
||||||
|
- protocols/ssh/detect-bruteforcing
|
||||||
|
- protocols/ssh/interesting-hostnames
|
||||||
|
- protocols/http/detect-sqli
|
||||||
|
- frameworks/files/hash-all-files
|
||||||
|
- frameworks/files/detect-MHR
|
||||||
|
- policy/frameworks/notice/extend-email/hostnames
|
||||||
|
- ja3
|
||||||
|
- hassh
|
||||||
|
- intel
|
||||||
|
- cve-2020-0601
|
||||||
|
- securityonion/bpfconf
|
||||||
|
- securityonion/communityid
|
||||||
|
- securityonion/file-extraction
|
||||||
|
'@load-sigs':
|
||||||
|
- frameworks/signatures/detect-windows-shells
|
||||||
|
redef:
|
||||||
|
- LogAscii::use_json = T;
|
||||||
|
- LogAscii::json_timestamps = JSON::TS_ISO8601;
|
||||||
@@ -44,5 +44,3 @@ send_x509_pem_entries_to_mine:
|
|||||||
- mine.send:
|
- mine.send:
|
||||||
- func: x509.get_pem_entries
|
- func: x509.get_pem_entries
|
||||||
- glob_path: /etc/pki/ca.crt
|
- glob_path: /etc/pki/ca.crt
|
||||||
- onchanges:
|
|
||||||
- x509: /etc/pki/ca.crt
|
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
{% set VERSION = salt['pillar.get']('static:soversion', 'HH1.2.1') %}
|
|
||||||
{% set MASTER = salt['grains.get']('master') %}
|
|
||||||
{% set GRAFANA = salt['pillar.get']('master:grafana', '0') %}
|
|
||||||
{% set FLEETMASTER = salt['pillar.get']('static:fleet_master', False) %}
|
|
||||||
{% set FLEETNODE = salt['pillar.get']('static:fleet_node', False) %}
|
|
||||||
# Add socore Group
|
# Add socore Group
|
||||||
socoregroup:
|
socoregroup:
|
||||||
group.present:
|
group.present:
|
||||||
@@ -19,7 +14,6 @@ socore:
|
|||||||
- shell: /bin/bash
|
- shell: /bin/bash
|
||||||
|
|
||||||
# Create a state directory
|
# Create a state directory
|
||||||
|
|
||||||
statedir:
|
statedir:
|
||||||
file.directory:
|
file.directory:
|
||||||
- name: /opt/so/state
|
- name: /opt/so/state
|
||||||
@@ -34,24 +28,85 @@ salttmp:
|
|||||||
- group: 939
|
- group: 939
|
||||||
- makedirs: True
|
- makedirs: True
|
||||||
|
|
||||||
# Install packages needed for the sensor
|
# Install epel
|
||||||
|
{% if grains['os'] == 'CentOS' %}
|
||||||
sensorpkgs:
|
epel:
|
||||||
pkg.installed:
|
pkg.installed:
|
||||||
- skip_suggestions: False
|
- skip_suggestions: True
|
||||||
|
- pkgs:
|
||||||
|
- epel-release
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
# Install common packages
|
||||||
|
{% if grains['os'] != 'CentOS' %}
|
||||||
|
commonpkgs:
|
||||||
|
pkg.installed:
|
||||||
|
- skip_suggestions: True
|
||||||
- pkgs:
|
- pkgs:
|
||||||
- docker-ce
|
|
||||||
- wget
|
|
||||||
- jq
|
|
||||||
{% if grains['os'] != 'CentOS' %}
|
|
||||||
- python-docker
|
|
||||||
- python-m2crypto
|
|
||||||
- apache2-utils
|
- apache2-utils
|
||||||
{% else %}
|
- wget
|
||||||
- net-tools
|
- ntpdate
|
||||||
|
- jq
|
||||||
|
- python3-docker
|
||||||
|
- docker-ce
|
||||||
|
- curl
|
||||||
|
- ca-certificates
|
||||||
|
- software-properties-common
|
||||||
|
- apt-transport-https
|
||||||
|
- openssl
|
||||||
|
- netcat
|
||||||
|
- python3-mysqldb
|
||||||
|
- sqlite3
|
||||||
|
- argon2
|
||||||
|
- libssl-dev
|
||||||
|
- python3-dateutil
|
||||||
|
- python3-m2crypto
|
||||||
|
- python3-mysqldb
|
||||||
|
- git
|
||||||
|
heldpackages:
|
||||||
|
pkg.installed:
|
||||||
|
- pkgs:
|
||||||
|
- containerd.io: 1.2.13-2
|
||||||
|
- docker-ce: 5:19.03.9~3-0~ubuntu-bionic
|
||||||
|
- hold: True
|
||||||
|
- update_holds: True
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
commonpkgs:
|
||||||
|
pkg.installed:
|
||||||
|
- skip_suggestions: True
|
||||||
|
- pkgs:
|
||||||
|
- wget
|
||||||
|
- ntpdate
|
||||||
|
- bind-utils
|
||||||
|
- jq
|
||||||
- tcpdump
|
- tcpdump
|
||||||
- httpd-tools
|
- httpd-tools
|
||||||
{% endif %}
|
- net-tools
|
||||||
|
- curl
|
||||||
|
- sqlite
|
||||||
|
- argon2
|
||||||
|
- mariadb-devel
|
||||||
|
- nmap-ncat
|
||||||
|
- python3
|
||||||
|
- python36-docker
|
||||||
|
- python36-dateutil
|
||||||
|
- python36-m2crypto
|
||||||
|
- python36-mysql
|
||||||
|
- yum-utils
|
||||||
|
- device-mapper-persistent-data
|
||||||
|
- lvm2
|
||||||
|
- openssl
|
||||||
|
- git
|
||||||
|
|
||||||
|
heldpackages:
|
||||||
|
pkg.installed:
|
||||||
|
- pkgs:
|
||||||
|
- containerd.io: 1.2.13-3.2.el7
|
||||||
|
- docker-ce: 3:19.03.11-3.el7
|
||||||
|
- hold: True
|
||||||
|
- update_holds: True
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
# Always keep these packages up to date
|
# Always keep these packages up to date
|
||||||
|
|
||||||
@@ -64,7 +119,6 @@ alwaysupdated:
|
|||||||
- skip_suggestions: True
|
- skip_suggestions: True
|
||||||
|
|
||||||
# Set time to UTC
|
# Set time to UTC
|
||||||
|
|
||||||
Etc/UTC:
|
Etc/UTC:
|
||||||
timezone.system
|
timezone.system
|
||||||
|
|
||||||
@@ -77,339 +131,3 @@ utilsyncscripts:
|
|||||||
- file_mode: 755
|
- file_mode: 755
|
||||||
- template: jinja
|
- template: jinja
|
||||||
- source: salt://common/tools/sbin
|
- source: salt://common/tools/sbin
|
||||||
|
|
||||||
# Make sure Docker is running!
|
|
||||||
docker:
|
|
||||||
service.running:
|
|
||||||
- enable: True
|
|
||||||
|
|
||||||
# Drop the correct nginx config based on role
|
|
||||||
|
|
||||||
nginxconfdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/nginx
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
nginxconf:
|
|
||||||
file.managed:
|
|
||||||
- name: /opt/so/conf/nginx/nginx.conf
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- template: jinja
|
|
||||||
- source: salt://common/nginx/nginx.conf.{{ grains.role }}
|
|
||||||
|
|
||||||
nginxlogdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/log/nginx/
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
nginxtmp:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/tmp/nginx/tmp
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
so-core:
|
|
||||||
docker_container.running:
|
|
||||||
- image: {{ MASTER }}:5000/soshybridhunter/so-core:{{ VERSION }}
|
|
||||||
- hostname: so-core
|
|
||||||
- user: socore
|
|
||||||
- binds:
|
|
||||||
- /opt/so:/opt/so:rw
|
|
||||||
- /opt/so/conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
|
||||||
- /opt/so/log/nginx/:/var/log/nginx:rw
|
|
||||||
- /opt/so/tmp/nginx/:/var/lib/nginx:rw
|
|
||||||
- /opt/so/tmp/nginx/:/run:rw
|
|
||||||
- /etc/pki/masterssl.crt:/etc/pki/nginx/server.crt:ro
|
|
||||||
- /etc/pki/masterssl.key:/etc/pki/nginx/server.key:ro
|
|
||||||
- /opt/so/conf/fleet/packages:/opt/socore/html/packages
|
|
||||||
- cap_add: NET_BIND_SERVICE
|
|
||||||
- port_bindings:
|
|
||||||
- 80:80
|
|
||||||
- 443:443
|
|
||||||
{%- if FLEETMASTER or FLEETNODE %}
|
|
||||||
- 8090:8090
|
|
||||||
{%- endif %}
|
|
||||||
- watch:
|
|
||||||
- file: /opt/so/conf/nginx/nginx.conf
|
|
||||||
|
|
||||||
# Add Telegraf to monitor all the things.
|
|
||||||
tgraflogdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/log/telegraf
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
tgrafetcdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/telegraf/etc
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
tgrafetsdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/telegraf/scripts
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
tgrafsyncscripts:
|
|
||||||
file.recurse:
|
|
||||||
- name: /opt/so/conf/telegraf/scripts
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- file_mode: 755
|
|
||||||
- template: jinja
|
|
||||||
- source: salt://common/telegraf/scripts
|
|
||||||
|
|
||||||
tgrafconf:
|
|
||||||
file.managed:
|
|
||||||
- name: /opt/so/conf/telegraf/etc/telegraf.conf
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- template: jinja
|
|
||||||
- source: salt://common/telegraf/etc/telegraf.conf
|
|
||||||
|
|
||||||
so-telegraf:
|
|
||||||
docker_container.running:
|
|
||||||
- image: {{ MASTER }}:5000/soshybridhunter/so-telegraf:{{ VERSION }}
|
|
||||||
- environment:
|
|
||||||
- HOST_PROC=/host/proc
|
|
||||||
- HOST_ETC=/host/etc
|
|
||||||
- HOST_SYS=/host/sys
|
|
||||||
- HOST_MOUNT_PREFIX=/host
|
|
||||||
- network_mode: host
|
|
||||||
- port_bindings:
|
|
||||||
- 127.0.0.1:8094:8094
|
|
||||||
- binds:
|
|
||||||
- /opt/so/log/telegraf:/var/log/telegraf:rw
|
|
||||||
- /opt/so/conf/telegraf/etc/telegraf.conf:/etc/telegraf/telegraf.conf:ro
|
|
||||||
- /var/run/utmp:/var/run/utmp:ro
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
||||||
- /:/host/root:ro
|
|
||||||
- /sys:/host/sys:ro
|
|
||||||
- /proc:/host/proc:ro
|
|
||||||
- /nsm:/host/nsm:ro
|
|
||||||
- /etc:/host/etc:ro
|
|
||||||
{% if grains['role'] == 'so-master' or grains['role'] == 'so-eval' or grains['role'] == 'so-mastersearch' %}
|
|
||||||
- /etc/pki/ca.crt:/etc/telegraf/ca.crt:ro
|
|
||||||
{% else %}
|
|
||||||
- /etc/ssl/certs/intca.crt:/etc/telegraf/ca.crt:ro
|
|
||||||
{% endif %}
|
|
||||||
- /etc/pki/influxdb.crt:/etc/telegraf/telegraf.crt:ro
|
|
||||||
- /etc/pki/influxdb.key:/etc/telegraf/telegraf.key:ro
|
|
||||||
- /opt/so/conf/telegraf/scripts:/scripts:ro
|
|
||||||
- /opt/so/log/stenographer:/var/log/stenographer:ro
|
|
||||||
- /opt/so/log/suricata:/var/log/suricata:ro
|
|
||||||
- watch:
|
|
||||||
- /opt/so/conf/telegraf/etc/telegraf.conf
|
|
||||||
- /opt/so/conf/telegraf/scripts
|
|
||||||
|
|
||||||
# If its a master or eval lets install the back end for now
|
|
||||||
{% if grains['role'] in ['so-master', 'so-mastersearch', 'so-eval'] and GRAFANA == 1 %}
|
|
||||||
|
|
||||||
# Influx DB
|
|
||||||
influxconfdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/influxdb/etc
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
influxdbdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /nsm/influxdb
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
influxdbconf:
|
|
||||||
file.managed:
|
|
||||||
- name: /opt/so/conf/influxdb/etc/influxdb.conf
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- template: jinja
|
|
||||||
- source: salt://common/influxdb/etc/influxdb.conf
|
|
||||||
|
|
||||||
so-influxdb:
|
|
||||||
docker_container.running:
|
|
||||||
- image: {{ MASTER }}:5000/soshybridhunter/so-influxdb:{{ VERSION }}
|
|
||||||
- hostname: influxdb
|
|
||||||
- environment:
|
|
||||||
- INFLUXDB_HTTP_LOG_ENABLED=false
|
|
||||||
- binds:
|
|
||||||
- /opt/so/conf/influxdb/etc/influxdb.conf:/etc/influxdb/influxdb.conf:ro
|
|
||||||
- /nsm/influxdb:/var/lib/influxdb:rw
|
|
||||||
- /etc/pki/influxdb.crt:/etc/ssl/influxdb.crt:ro
|
|
||||||
- /etc/pki/influxdb.key:/etc/ssl/influxdb.key:ro
|
|
||||||
- port_bindings:
|
|
||||||
- 0.0.0.0:8086:8086
|
|
||||||
- watch:
|
|
||||||
- file: /opt/so/conf/influxdb/etc/influxdb.conf
|
|
||||||
|
|
||||||
# Grafana all the things
|
|
||||||
grafanadir:
|
|
||||||
file.directory:
|
|
||||||
- name: /nsm/grafana
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
grafanaconfdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/grafana/etc
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
grafanadashdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/grafana/grafana_dashboards
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
grafanadashmdir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/grafana/grafana_dashboards/master
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
grafanadashevaldir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/grafana/grafana_dashboards/eval
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
grafanadashfndir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/grafana/grafana_dashboards/sensor_nodes
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
grafanadashsndir:
|
|
||||||
file.directory:
|
|
||||||
- name: /opt/so/conf/grafana/grafana_dashboards/search_nodes
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- makedirs: True
|
|
||||||
|
|
||||||
grafanaconf:
|
|
||||||
file.recurse:
|
|
||||||
- name: /opt/so/conf/grafana/etc
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- template: jinja
|
|
||||||
- source: salt://common/grafana/etc
|
|
||||||
|
|
||||||
{% if salt['pillar.get']('mastertab', False) %}
|
|
||||||
{% for SN, SNDATA in salt['pillar.get']('mastertab', {}).items() %}
|
|
||||||
{% set NODETYPE = SN.split('_')|last %}
|
|
||||||
{% set SN = SN | regex_replace('_' ~ NODETYPE, '') %}
|
|
||||||
dashboard-master:
|
|
||||||
file.managed:
|
|
||||||
- name: /opt/so/conf/grafana/grafana_dashboards/master/{{ SN }}-Master.json
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- template: jinja
|
|
||||||
- source: salt://common/grafana/grafana_dashboards/master/master.json
|
|
||||||
- defaults:
|
|
||||||
SERVERNAME: {{ SN }}
|
|
||||||
MANINT: {{ SNDATA.manint }}
|
|
||||||
MONINT: {{ SNDATA.manint }}
|
|
||||||
CPUS: {{ SNDATA.totalcpus }}
|
|
||||||
UID: {{ SNDATA.guid }}
|
|
||||||
ROOTFS: {{ SNDATA.rootfs }}
|
|
||||||
NSMFS: {{ SNDATA.nsmfs }}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if salt['pillar.get']('sensorstab', False) %}
|
|
||||||
{% for SN, SNDATA in salt['pillar.get']('sensorstab', {}).items() %}
|
|
||||||
{% set NODETYPE = SN.split('_')|last %}
|
|
||||||
{% set SN = SN | regex_replace('_' ~ NODETYPE, '') %}
|
|
||||||
dashboard-{{ SN }}:
|
|
||||||
file.managed:
|
|
||||||
- name: /opt/so/conf/grafana/grafana_dashboards/sensor_nodes/{{ SN }}-Sensor.json
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- template: jinja
|
|
||||||
- source: salt://common/grafana/grafana_dashboards/sensor_nodes/sensor.json
|
|
||||||
- defaults:
|
|
||||||
SERVERNAME: {{ SN }}
|
|
||||||
MONINT: {{ SNDATA.monint }}
|
|
||||||
MANINT: {{ SNDATA.manint }}
|
|
||||||
CPUS: {{ SNDATA.totalcpus }}
|
|
||||||
UID: {{ SNDATA.guid }}
|
|
||||||
ROOTFS: {{ SNDATA.rootfs }}
|
|
||||||
NSMFS: {{ SNDATA.nsmfs }}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if salt['pillar.get']('nodestab', False) %}
|
|
||||||
{% for SN, SNDATA in salt['pillar.get']('nodestab', {}).items() %}
|
|
||||||
{% set NODETYPE = SN.split('_')|last %}
|
|
||||||
{% set SN = SN | regex_replace('_' ~ NODETYPE, '') %}
|
|
||||||
dashboardsearch-{{ SN }}:
|
|
||||||
file.managed:
|
|
||||||
- name: /opt/so/conf/grafana/grafana_dashboards/search_nodes/{{ SN }}-Node.json
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- template: jinja
|
|
||||||
- source: salt://common/grafana/grafana_dashboards/search_nodes/searchnode.json
|
|
||||||
- defaults:
|
|
||||||
SERVERNAME: {{ SN }}
|
|
||||||
MANINT: {{ SNDATA.manint }}
|
|
||||||
MONINT: {{ SNDATA.manint }}
|
|
||||||
CPUS: {{ SNDATA.totalcpus }}
|
|
||||||
UID: {{ SNDATA.guid }}
|
|
||||||
ROOTFS: {{ SNDATA.rootfs }}
|
|
||||||
NSMFS: {{ SNDATA.nsmfs }}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if salt['pillar.get']('evaltab', False) %}
|
|
||||||
{% for SN, SNDATA in salt['pillar.get']('evaltab', {}).items() %}
|
|
||||||
{% set NODETYPE = SN.split('_')|last %}
|
|
||||||
{% set SN = SN | regex_replace('_' ~ NODETYPE, '') %}
|
|
||||||
dashboard-{{ SN }}:
|
|
||||||
file.managed:
|
|
||||||
- name: /opt/so/conf/grafana/grafana_dashboards/eval/{{ SN }}-Node.json
|
|
||||||
- user: 939
|
|
||||||
- group: 939
|
|
||||||
- template: jinja
|
|
||||||
- source: salt://common/grafana/grafana_dashboards/eval/eval.json
|
|
||||||
- defaults:
|
|
||||||
SERVERNAME: {{ SN }}
|
|
||||||
MANINT: {{ SNDATA.manint }}
|
|
||||||
MONINT: {{ SNDATA.monint }}
|
|
||||||
CPUS: {{ SNDATA.totalcpus }}
|
|
||||||
UID: {{ SNDATA.guid }}
|
|
||||||
ROOTFS: {{ SNDATA.rootfs }}
|
|
||||||
NSMFS: {{ SNDATA.nsmfs }}
|
|
||||||
|
|
||||||
{% endfor %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
so-grafana:
|
|
||||||
docker_container.running:
|
|
||||||
- image: {{ MASTER }}:5000/soshybridhunter/so-grafana:{{ VERSION }}
|
|
||||||
- hostname: grafana
|
|
||||||
- user: socore
|
|
||||||
- binds:
|
|
||||||
- /nsm/grafana:/var/lib/grafana:rw
|
|
||||||
- /opt/so/conf/grafana/etc/grafana.ini:/etc/grafana/grafana.ini:ro
|
|
||||||
- /opt/so/conf/grafana/etc/datasources:/etc/grafana/provisioning/datasources:rw
|
|
||||||
- /opt/so/conf/grafana/etc/dashboards:/etc/grafana/provisioning/dashboards:rw
|
|
||||||
- /opt/so/conf/grafana/grafana_dashboards:/etc/grafana/grafana_dashboards:rw
|
|
||||||
- environment:
|
|
||||||
- GF_SECURITY_ADMIN_PASSWORD=augusta
|
|
||||||
- port_bindings:
|
|
||||||
- 0.0.0.0:3000:3000
|
|
||||||
- watch:
|
|
||||||
- file: /opt/so/conf/grafana/*
|
|
||||||
|
|
||||||
{% endif %}
|
|
||||||
|
|||||||
5
salt/common/maps/broversion.map.jinja
Normal file
5
salt/common/maps/broversion.map.jinja
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-zeek'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
5
salt/common/maps/domainstats.map.jinja
Normal file
5
salt/common/maps/domainstats.map.jinja
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-domainstats'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
19
salt/common/maps/eval.map.jinja
Normal file
19
salt/common/maps/eval.map.jinja
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-filebeat',
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf',
|
||||||
|
'so-dockerregistry',
|
||||||
|
'so-soc',
|
||||||
|
'so-kratos',
|
||||||
|
'so-idstools',
|
||||||
|
'so-elasticsearch',
|
||||||
|
'so-kibana',
|
||||||
|
'so-steno',
|
||||||
|
'so-suricata',
|
||||||
|
'so-zeek',
|
||||||
|
'so-curator',
|
||||||
|
'so-elastalert',
|
||||||
|
'so-soctopus'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
10
salt/common/maps/fleet.map.jinja
Normal file
10
salt/common/maps/fleet.map.jinja
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-mysql',
|
||||||
|
'so-fleet',
|
||||||
|
'so-redis',
|
||||||
|
'so-filebeat',
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
7
salt/common/maps/fleet_master.map.jinja
Normal file
7
salt/common/maps/fleet_master.map.jinja
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-mysql',
|
||||||
|
'so-fleet',
|
||||||
|
'so-redis'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
5
salt/common/maps/freq.map.jinja
Normal file
5
salt/common/maps/freq.map.jinja
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-freqserver'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
6
salt/common/maps/grafana.map.jinja
Normal file
6
salt/common/maps/grafana.map.jinja
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-influxdb',
|
||||||
|
'so-grafana'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
14
salt/common/maps/heavynode.map.jinja
Normal file
14
salt/common/maps/heavynode.map.jinja
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf',
|
||||||
|
'so-redis',
|
||||||
|
'so-logstash',
|
||||||
|
'so-elasticsearch',
|
||||||
|
'so-curator',
|
||||||
|
'so-steno',
|
||||||
|
'so-suricata',
|
||||||
|
'so-wazuh',
|
||||||
|
'so-filebeat
|
||||||
|
]
|
||||||
|
} %}
|
||||||
12
salt/common/maps/helixsensor.map.jinja
Normal file
12
salt/common/maps/helixsensor.map.jinja
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf',
|
||||||
|
'so-idstools',
|
||||||
|
'so-steno',
|
||||||
|
'so-zeek',
|
||||||
|
'so-redis',
|
||||||
|
'so-logstash',
|
||||||
|
'so-filebeat
|
||||||
|
]
|
||||||
|
} %}
|
||||||
9
salt/common/maps/hotnode.map.jinja
Normal file
9
salt/common/maps/hotnode.map.jinja
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf',
|
||||||
|
'so-logstash',
|
||||||
|
'so-elasticsearch',
|
||||||
|
'so-curator',
|
||||||
|
]
|
||||||
|
} %}
|
||||||
18
salt/common/maps/master.map.jinja
Normal file
18
salt/common/maps/master.map.jinja
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-dockerregistry',
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf',
|
||||||
|
'so-soc',
|
||||||
|
'so-kratos',
|
||||||
|
'so-aptcacherng',
|
||||||
|
'so-idstools',
|
||||||
|
'so-redis',
|
||||||
|
'so-elasticsearch',
|
||||||
|
'so-logstash',
|
||||||
|
'so-kibana',
|
||||||
|
'so-elastalert',
|
||||||
|
'so-filebeat',
|
||||||
|
'so-soctopus'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
18
salt/common/maps/mastersearch.map.jinja
Normal file
18
salt/common/maps/mastersearch.map.jinja
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf',
|
||||||
|
'so-soc',
|
||||||
|
'so-kratos',
|
||||||
|
'so-aptcacherng',
|
||||||
|
'so-idstools',
|
||||||
|
'so-redis',
|
||||||
|
'so-logstash',
|
||||||
|
'so-elasticsearch',
|
||||||
|
'so-curator',
|
||||||
|
'so-kibana',
|
||||||
|
'so-elastalert',
|
||||||
|
'so-filebeat',
|
||||||
|
'so-soctopus'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
6
salt/common/maps/playbook.map.jinja
Normal file
6
salt/common/maps/playbook.map.jinja
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-playbook',
|
||||||
|
'so-navigator'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
10
salt/common/maps/searchnode.map.jinja
Normal file
10
salt/common/maps/searchnode.map.jinja
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf',
|
||||||
|
'so-logstash',
|
||||||
|
'so-elasticsearch',
|
||||||
|
'so-curator',
|
||||||
|
'so-filebeat'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
8
salt/common/maps/sensor.map.jinja
Normal file
8
salt/common/maps/sensor.map.jinja
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-telegraf',
|
||||||
|
'so-steno',
|
||||||
|
'so-suricata',
|
||||||
|
'so-filebeat'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
45
salt/common/maps/so-status.map.jinja
Normal file
45
salt/common/maps/so-status.map.jinja
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{% set role = grains.id.split('_') | last %}
|
||||||
|
{% from 'common/maps/'~ role ~'.map.jinja' import docker with context %}
|
||||||
|
|
||||||
|
# Check if the service is enabled and append it's required containers
|
||||||
|
# to the list predefined by the role / minion id affix
|
||||||
|
{% macro append_containers(pillar_name, k, compare )%}
|
||||||
|
{% if salt['pillar.get'](pillar_name~':'~k, {}) != compare %}
|
||||||
|
{% from 'common/maps/'~k~'.map.jinja' import docker as d with context %}
|
||||||
|
{% for li in d['containers'] %}
|
||||||
|
{{ docker['containers'].append(li) }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
|
{% set docker = salt['grains.filter_by']({
|
||||||
|
'*_'~role: {
|
||||||
|
'containers': docker['containers']
|
||||||
|
}
|
||||||
|
},grain='id', merge=salt['pillar.get']('docker')) %}
|
||||||
|
|
||||||
|
{% if role in ['eval', 'mastersearch', 'master', 'standalone'] %}
|
||||||
|
{{ append_containers('master', 'grafana', 0) }}
|
||||||
|
{{ append_containers('static', 'fleet_master', 0) }}
|
||||||
|
{{ append_containers('master', 'wazuh', 0) }}
|
||||||
|
{{ append_containers('master', 'thehive', 0) }}
|
||||||
|
{{ append_containers('master', 'playbook', 0) }}
|
||||||
|
{{ append_containers('master', 'freq', 0) }}
|
||||||
|
{{ append_containers('master', 'domainstats', 0) }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if role in ['eval', 'heavynode', 'sensor', 'standalone'] %}
|
||||||
|
{{ append_containers('static', 'strelka', 0) }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if role in ['heavynode', 'standalone'] %}
|
||||||
|
{{ append_containers('static', 'broversion', 'SURICATA') }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if role == 'searchnode' %}
|
||||||
|
{{ append_containers('master', 'wazuh', 0) }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if role == 'sensor' %}
|
||||||
|
{{ append_containers('static', 'broversion', 'SURICATA') }}
|
||||||
|
{% endif %}
|
||||||
21
salt/common/maps/standalone.map.jinja
Normal file
21
salt/common/maps/standalone.map.jinja
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf',
|
||||||
|
'so-soc',
|
||||||
|
'so-kratos',
|
||||||
|
'so-aptcacherng',
|
||||||
|
'so-idstools',
|
||||||
|
'so-redis',
|
||||||
|
'so-logstash',
|
||||||
|
'so-elasticsearch',
|
||||||
|
'so-curator',
|
||||||
|
'so-kibana',
|
||||||
|
'so-elastalert',
|
||||||
|
'so-filebeat',
|
||||||
|
'so-suricata',
|
||||||
|
'so-steno',
|
||||||
|
'so-dockerregistry',
|
||||||
|
'so-soctopus'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
9
salt/common/maps/strelka.map.jinja
Normal file
9
salt/common/maps/strelka.map.jinja
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-strelka-coordinator',
|
||||||
|
'so-strelka-gatekeeper',
|
||||||
|
'so-strelka-manager',
|
||||||
|
'so-strelka-frontend',
|
||||||
|
'so-strelka-filestream'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
7
salt/common/maps/thehive.map.jinja
Normal file
7
salt/common/maps/thehive.map.jinja
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-thehive',
|
||||||
|
'so-thehive-es',
|
||||||
|
'so-cortex'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
7
salt/common/maps/warmnode.map.jinja
Normal file
7
salt/common/maps/warmnode.map.jinja
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-nginx',
|
||||||
|
'so-telegraf',
|
||||||
|
'so-elasticsearch'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
5
salt/common/maps/wazuh.map.jinja
Normal file
5
salt/common/maps/wazuh.map.jinja
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{% set docker = {
|
||||||
|
'containers': [
|
||||||
|
'so-wazuh'
|
||||||
|
]
|
||||||
|
} %}
|
||||||
@@ -17,6 +17,9 @@
|
|||||||
|
|
||||||
. /usr/sbin/so-common
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
default_salt_dir=/opt/so/saltstack/default
|
||||||
|
local_salt_dir=/opt/so/saltstack/local
|
||||||
|
|
||||||
SKIP=0
|
SKIP=0
|
||||||
|
|
||||||
while getopts "abowi:" OPTION
|
while getopts "abowi:" OPTION
|
||||||
@@ -42,9 +45,22 @@ do
|
|||||||
SKIP=1
|
SKIP=1
|
||||||
;;
|
;;
|
||||||
w)
|
w)
|
||||||
FULLROLE="wazuh_endpoint"
|
FULLROLE="wazuh_agent"
|
||||||
SKIP=1
|
SKIP=1
|
||||||
;;
|
;;
|
||||||
|
s)
|
||||||
|
FULLROLE="syslog"
|
||||||
|
SKIP=1
|
||||||
|
;;
|
||||||
|
p)
|
||||||
|
FULLROLE="wazuh_api"
|
||||||
|
SKIP=1
|
||||||
|
;;
|
||||||
|
r)
|
||||||
|
FULLROLE="wazuh_authd"
|
||||||
|
SKIP=1
|
||||||
|
;;
|
||||||
|
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -57,8 +73,10 @@ if [ "$SKIP" -eq 0 ]; then
|
|||||||
echo "[a] - Analyst - ports 80/tcp and 443/tcp"
|
echo "[a] - Analyst - ports 80/tcp and 443/tcp"
|
||||||
echo "[b] - Logstash Beat - port 5044/tcp"
|
echo "[b] - Logstash Beat - port 5044/tcp"
|
||||||
echo "[o] - Osquery endpoint - port 8090/tcp"
|
echo "[o] - Osquery endpoint - port 8090/tcp"
|
||||||
echo "[w] - Wazuh endpoint - port 1514"
|
echo "[s] - Syslog device - 514/tcp/udp"
|
||||||
echo ""
|
echo "[w] - Wazuh agent - port 1514/tcp/udp"
|
||||||
|
echo "[p] - Wazuh API - port 55000/tcp"
|
||||||
|
echo "[r] - Wazuh registration service - 1515/tcp"
|
||||||
echo "Please enter your selection (a - analyst, b - beats, o - osquery, w - wazuh):"
|
echo "Please enter your selection (a - analyst, b - beats, o - osquery, w - wazuh):"
|
||||||
read ROLE
|
read ROLE
|
||||||
echo "Enter a single ip address or range to allow (example: 10.10.10.10 or 10.10.0.0/16):"
|
echo "Enter a single ip address or range to allow (example: 10.10.10.10 or 10.10.0.0/16):"
|
||||||
@@ -71,7 +89,13 @@ if [ "$SKIP" -eq 0 ]; then
|
|||||||
elif [ "$ROLE" == "o" ]; then
|
elif [ "$ROLE" == "o" ]; then
|
||||||
FULLROLE=osquery_endpoint
|
FULLROLE=osquery_endpoint
|
||||||
elif [ "$ROLE" == "w" ]; then
|
elif [ "$ROLE" == "w" ]; then
|
||||||
FULLROLE=wazuh_endpoint
|
FULLROLE=wazuh_agent
|
||||||
|
elif [ "$ROLE" == "s" ]; then
|
||||||
|
FULLROLE=syslog
|
||||||
|
elif [ "$ROLE" == "p" ]; then
|
||||||
|
FULLROLE=wazuh_api
|
||||||
|
elif [ "$ROLE" == "r" ]; then
|
||||||
|
FULLROLE=wazuh_authd
|
||||||
else
|
else
|
||||||
echo "I don't recognize that role"
|
echo "I don't recognize that role"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -80,10 +104,11 @@ if [ "$SKIP" -eq 0 ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Adding $IP to the $FULLROLE role. This can take a few seconds"
|
echo "Adding $IP to the $FULLROLE role. This can take a few seconds"
|
||||||
/opt/so/saltstack/pillar/firewall/addfirewall.sh $FULLROLE $IP
|
/usr/sbin/so-firewall includehost $FULLROLE $IP
|
||||||
|
salt-call state.apply firewall queue=True
|
||||||
|
|
||||||
# Check if Wazuh enabled
|
# Check if Wazuh enabled
|
||||||
if grep -q -R "wazuh: 1" /opt/so/saltstack/pillar/*; then
|
if grep -q -R "wazuh: 1" $local_salt_dir/pillar/*; then
|
||||||
# If analyst, add to Wazuh AR whitelist
|
# If analyst, add to Wazuh AR whitelist
|
||||||
if [ "$FULLROLE" == "analyst" ]; then
|
if [ "$FULLROLE" == "analyst" ]; then
|
||||||
WAZUH_MGR_CFG="/opt/so/wazuh/etc/ossec.conf"
|
WAZUH_MGR_CFG="/opt/so/wazuh/etc/ossec.conf"
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
local_salt_dir=/opt/so/saltstack/local
|
||||||
|
|
||||||
bro_logs_enabled() {
|
bro_logs_enabled() {
|
||||||
|
|
||||||
echo "brologs:" > /opt/so/saltstack/pillar/brologs.sls
|
echo "brologs:" > $local_salt_dir/pillar/brologs.sls
|
||||||
echo " enabled:" >> /opt/so/saltstack/pillar/brologs.sls
|
echo " enabled:" >> $local_salt_dir/pillar/brologs.sls
|
||||||
for BLOG in ${BLOGS[@]}; do
|
for BLOG in ${BLOGS[@]}; do
|
||||||
echo " - $BLOG" | tr -d '"' >> /opt/so/saltstack/pillar/brologs.sls
|
echo " - $BLOG" | tr -d '"' >> $local_salt_dir/pillar/brologs.sls
|
||||||
done
|
done
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
#
|
||||||
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
@@ -17,4 +17,5 @@
|
|||||||
|
|
||||||
. /usr/sbin/so-common
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
/usr/sbin/so-restart cortex $1
|
/usr/sbin/so-stop cortex $1
|
||||||
|
/usr/sbin/so-start thehive $1
|
||||||
|
|||||||
@@ -17,4 +17,4 @@
|
|||||||
|
|
||||||
. /usr/sbin/so-common
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
/usr/sbin/so-start cortex $1
|
/usr/sbin/so-start thehive $1
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
#
|
||||||
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
112
salt/common/tools/sbin/so-docker-refresh
Normal file
112
salt/common/tools/sbin/so-docker-refresh
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
got_root(){
|
||||||
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
echo "This script must be run using sudo!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
master_check() {
|
||||||
|
# Check to see if this is a master
|
||||||
|
MASTERCHECK=$(cat /etc/salt/grains | grep role | awk '{print $2}')
|
||||||
|
if [ $MASTERCHECK == 'so-eval' ] || [ $MASTERCHECK == 'so-master' ] || [ $MASTERCHECK == 'so-mastersearch' ] || [ $MASTERCHECK == 'so-standalone' ] || [ $MASTERCHECK == 'so-helix' ]; then
|
||||||
|
echo "This is a master. We can proceed"
|
||||||
|
else
|
||||||
|
echo "Please run soup on the master. The master controls all updates."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
update_docker_containers() {
|
||||||
|
|
||||||
|
# Download the containers from the interwebs
|
||||||
|
for i in "${TRUSTED_CONTAINERS[@]}"
|
||||||
|
do
|
||||||
|
# Pull down the trusted docker image
|
||||||
|
echo "Downloading $i"
|
||||||
|
docker pull --disable-content-trust=false docker.io/soshybridhunter/$i
|
||||||
|
# Tag it with the new registry destination
|
||||||
|
docker tag soshybridhunter/$i $HOSTNAME:5000/soshybridhunter/$i
|
||||||
|
docker push $HOSTNAME:5000/soshybridhunter/$i
|
||||||
|
done
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
version_check() {
|
||||||
|
if [ -f /etc/soversion ]; then
|
||||||
|
VERSION=$(cat /etc/soversion)
|
||||||
|
else
|
||||||
|
echo "Unable to detect version. I will now terminate."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
got_root
|
||||||
|
master_check
|
||||||
|
version_check
|
||||||
|
|
||||||
|
# Use the hostname
|
||||||
|
HOSTNAME=$(hostname)
|
||||||
|
BUILD=HH
|
||||||
|
# List all the containers
|
||||||
|
if [ $MASTERCHECK != 'so-helix' ]; then
|
||||||
|
TRUSTED_CONTAINERS=( \
|
||||||
|
"so-acng:$BUILD$VERSION" \
|
||||||
|
"so-thehive-cortex:$BUILD$VERSION" \
|
||||||
|
"so-curator:$BUILD$VERSION" \
|
||||||
|
"so-domainstats:$BUILD$VERSION" \
|
||||||
|
"so-elastalert:$BUILD$VERSION" \
|
||||||
|
"so-elasticsearch:$BUILD$VERSION" \
|
||||||
|
"so-filebeat:$BUILD$VERSION" \
|
||||||
|
"so-fleet:$BUILD$VERSION" \
|
||||||
|
"so-fleet-launcher:$BUILD$VERSION" \
|
||||||
|
"so-freqserver:$BUILD$VERSION" \
|
||||||
|
"so-grafana:$BUILD$VERSION" \
|
||||||
|
"so-idstools:$BUILD$VERSION" \
|
||||||
|
"so-influxdb:$BUILD$VERSION" \
|
||||||
|
"so-kibana:$BUILD$VERSION" \
|
||||||
|
"so-kratos:$BUILD$VERSION" \
|
||||||
|
"so-logstash:$BUILD$VERSION" \
|
||||||
|
"so-mysql:$BUILD$VERSION" \
|
||||||
|
"so-navigator:$BUILD$VERSION" \
|
||||||
|
"so-nginx:$BUILD$VERSION" \
|
||||||
|
"so-playbook:$BUILD$VERSION" \
|
||||||
|
"so-redis:$BUILD$VERSION" \
|
||||||
|
"so-soc:$BUILD$VERSION" \
|
||||||
|
"so-soctopus:$BUILD$VERSION" \
|
||||||
|
"so-steno:$BUILD$VERSION" \
|
||||||
|
"so-strelka:$BUILD$VERSION" \
|
||||||
|
"so-suricata:$BUILD$VERSION" \
|
||||||
|
"so-telegraf:$BUILD$VERSION" \
|
||||||
|
"so-thehive:$BUILD$VERSION" \
|
||||||
|
"so-thehive-es:$BUILD$VERSION" \
|
||||||
|
"so-wazuh:$BUILD$VERSION" \
|
||||||
|
"so-zeek:$BUILD$VERSION" )
|
||||||
|
else
|
||||||
|
TRUSTED_CONTAINERS=( \
|
||||||
|
"so-filebeat:$BUILD$VERSION" \
|
||||||
|
"so-idstools:$BUILD$VERSION" \
|
||||||
|
"so-logstash:$BUILD$VERSION" \
|
||||||
|
"so-nginx:$BUILD$VERSION" \
|
||||||
|
"so-redis:$BUILD$VERSION" \
|
||||||
|
"so-steno:$BUILD$VERSION" \
|
||||||
|
"so-suricata:$BUILD$VERSION" \
|
||||||
|
"so-telegraf:$BUILD$VERSION" \
|
||||||
|
"so-zeek:$BUILD$VERSION" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
update_docker_containers
|
||||||
@@ -166,8 +166,7 @@ cat << EOF
|
|||||||
What elasticsearch index do you want to use?
|
What elasticsearch index do you want to use?
|
||||||
Below are the default Index Patterns used in Security Onion:
|
Below are the default Index Patterns used in Security Onion:
|
||||||
|
|
||||||
*:logstash-*
|
*:so-ids-*
|
||||||
*:logstash-beats-*
|
|
||||||
*:elastalert_status*
|
*:elastalert_status*
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
MASTER=MASTER
|
MASTER=MASTER
|
||||||
VERSION="HH1.1.4"
|
VERSION="HH1.1.4"
|
||||||
TRUSTED_CONTAINERS=( \
|
TRUSTED_CONTAINERS=( \
|
||||||
"so-core:$VERSION" \
|
"so-nginx:$VERSION" \
|
||||||
"so-thehive-cortex:$VERSION" \
|
"so-thehive-cortex:$VERSION" \
|
||||||
"so-curator:$VERSION" \
|
"so-curator:$VERSION" \
|
||||||
"so-domainstats:$VERSION" \
|
"so-domainstats:$VERSION" \
|
||||||
|
|||||||
@@ -15,12 +15,13 @@
|
|||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
default_salt_dir=/opt/so/saltstack/default
|
||||||
ELASTICSEARCH_HOST="{{ MASTERIP}}"
|
ELASTICSEARCH_HOST="{{ MASTERIP}}"
|
||||||
ELASTICSEARCH_PORT=9200
|
ELASTICSEARCH_PORT=9200
|
||||||
#ELASTICSEARCH_AUTH=""
|
#ELASTICSEARCH_AUTH=""
|
||||||
|
|
||||||
# Define a default directory to load pipelines from
|
# Define a default directory to load pipelines from
|
||||||
ELASTICSEARCH_TEMPLATES="/opt/so/saltstack/salt/logstash/pipelines/templates/so/"
|
ELASTICSEARCH_TEMPLATES="$default_salt_dir/salt/logstash/pipelines/templates/so/"
|
||||||
|
|
||||||
# Wait for ElasticSearch to initialize
|
# Wait for ElasticSearch to initialize
|
||||||
echo -n "Waiting for ElasticSearch..."
|
echo -n "Waiting for ElasticSearch..."
|
||||||
|
|||||||
@@ -15,10 +15,11 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
. /usr/sbin/so-common
|
. /usr/sbin/so-common
|
||||||
|
local_salt_dir=/opt/so/saltstack/local
|
||||||
|
|
||||||
VERSION=$(grep soversion /opt/so/saltstack/pillar/static.sls | cut -d':' -f2|sed 's/ //g')
|
VERSION=$(grep soversion $local_salt_dir/pillar/static.sls | cut -d':' -f2|sed 's/ //g')
|
||||||
# Modify static.sls to enable Features
|
# Modify static.sls to enable Features
|
||||||
sed -i 's/features: False/features: True/' /opt/so/saltstack/pillar/static.sls
|
sed -i 's/features: False/features: True/' $local_salt_dir/pillar/static.sls
|
||||||
SUFFIX="-features"
|
SUFFIX="-features"
|
||||||
TRUSTED_CONTAINERS=( \
|
TRUSTED_CONTAINERS=( \
|
||||||
"so-elasticsearch:$VERSION$SUFFIX" \
|
"so-elasticsearch:$VERSION$SUFFIX" \
|
||||||
|
|||||||
305
salt/common/tools/sbin/so-firewall
Executable file
305
salt/common/tools/sbin/so-firewall
Executable file
@@ -0,0 +1,305 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
hostgroupsFilename = "/opt/so/saltstack/local/salt/firewall/hostgroups.local.yaml"
|
||||||
|
portgroupsFilename = "/opt/so/saltstack/local/salt/firewall/portgroups.local.yaml"
|
||||||
|
supportedProtocols = ['tcp', 'udp']
|
||||||
|
|
||||||
|
def showUsage(args):
|
||||||
|
print('Usage: {} [OPTIONS] <COMMAND> [ARGS...]'.format(sys.argv[0]))
|
||||||
|
print(' Options:')
|
||||||
|
print(' --apply - After updating the firewall configuration files, apply the new firewall state')
|
||||||
|
print('')
|
||||||
|
print(' Available commands:')
|
||||||
|
print(' help - Prints this usage information.')
|
||||||
|
print(' includedhosts - Lists the IPs included in the given group. Args: <GROUP_NAME>')
|
||||||
|
print(' excludedhosts - Lists the IPs excluded from the given group. Args: <GROUP_NAME>')
|
||||||
|
print(' includehost - Includes the given IP in the given group. Args: <GROUP_NAME> <IP>')
|
||||||
|
print(' excludehost - Excludes the given IP from the given group. Args: <GROUP_NAME> <IP>')
|
||||||
|
print(' removehost - Removes an excluded IP from the given group. Args: <GROUP_NAME> <IP>')
|
||||||
|
print(' addhostgroup - Adds a new, custom host group. Args: <GROUP_NAME>')
|
||||||
|
print(' listports - Lists ports in the given group and protocol. Args: <GROUP_NAME> <PORT_PROTOCOL>')
|
||||||
|
print(' addport - Adds a PORT to the given group. Args: <GROUP_NAME> <PORT_PROTOCOL> <PORT>')
|
||||||
|
print(' removeport - Removes a PORT from the given group. Args: <GROUP_NAME> <PORT_PROTOCOL> <PORT>')
|
||||||
|
print(' addportgroup - Adds a new, custom port group. Args: <GROUP_NAME>')
|
||||||
|
print('')
|
||||||
|
print(' Where:')
|
||||||
|
print(' GROUP_NAME - The name of an alias group (Ex: analyst)')
|
||||||
|
print(' IP - Either a single IP address (Ex: 8.8.8.8) or a CIDR block (Ex: 10.23.0.0/16).')
|
||||||
|
print(' PORT_PROTOCOL - Must be one of the following: ' + str(supportedProtocols))
|
||||||
|
print(' PORT - Either a single numeric port (Ex: 443), or a port range (Ex: 8000:8002).')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def loadYaml(filename):
|
||||||
|
file = open(filename, "r")
|
||||||
|
return yaml.load(file.read())
|
||||||
|
|
||||||
|
def writeYaml(filename, content):
|
||||||
|
file = open(filename, "w")
|
||||||
|
return yaml.dump(content, file)
|
||||||
|
|
||||||
|
def listIps(name, mode):
|
||||||
|
content = loadYaml(hostgroupsFilename)
|
||||||
|
if name not in content['firewall']['hostgroups']:
|
||||||
|
print('Host group does not exist', file=sys.stderr)
|
||||||
|
return 4
|
||||||
|
hostgroup = content['firewall']['hostgroups'][name]
|
||||||
|
ips = hostgroup['ips'][mode]
|
||||||
|
if ips is not None:
|
||||||
|
for ip in ips:
|
||||||
|
print(ip)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def addIp(name, ip, mode):
|
||||||
|
content = loadYaml(hostgroupsFilename)
|
||||||
|
if name not in content['firewall']['hostgroups']:
|
||||||
|
print('Host group does not exist', file=sys.stderr)
|
||||||
|
return 4
|
||||||
|
hostgroup = content['firewall']['hostgroups'][name]
|
||||||
|
ips = hostgroup['ips'][mode]
|
||||||
|
if ips is None:
|
||||||
|
ips = []
|
||||||
|
hostgroup['ips'][mode] = ips
|
||||||
|
if ip not in ips:
|
||||||
|
ips.append(ip)
|
||||||
|
else:
|
||||||
|
print('Already exists', file=sys.stderr)
|
||||||
|
return 3
|
||||||
|
writeYaml(hostgroupsFilename, content)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def removeIp(name, ip, mode, silence = False):
|
||||||
|
content = loadYaml(hostgroupsFilename)
|
||||||
|
if name not in content['firewall']['hostgroups']:
|
||||||
|
print('Host group does not exist', file=sys.stderr)
|
||||||
|
return 4
|
||||||
|
hostgroup = content['firewall']['hostgroups'][name]
|
||||||
|
ips = hostgroup['ips'][mode]
|
||||||
|
if ips is None:
|
||||||
|
ips = []
|
||||||
|
hostgroup['ips'][mode] = ips
|
||||||
|
if ip in ips:
|
||||||
|
ips.remove(ip)
|
||||||
|
else:
|
||||||
|
if not silence:
|
||||||
|
print('IP does not exist', file=sys.stderr)
|
||||||
|
return 3
|
||||||
|
writeYaml(hostgroupsFilename, content)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def createProtocolMap():
|
||||||
|
map = {}
|
||||||
|
for protocol in supportedProtocols:
|
||||||
|
map[protocol] = []
|
||||||
|
return map
|
||||||
|
|
||||||
|
def addhostgroup(args):
|
||||||
|
if len(args) != 1:
|
||||||
|
print('Missing host group name argument', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
|
||||||
|
name = args[1]
|
||||||
|
content = loadYaml(hostgroupsFilename)
|
||||||
|
if name in content['firewall']['hostgroups']:
|
||||||
|
print('Already exists', file=sys.stderr)
|
||||||
|
return 3
|
||||||
|
content['firewall']['hostgroups'][name] = { 'ips': { 'insert': [], 'delete': [] }}
|
||||||
|
writeYaml(hostgroupsFilename, content)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def addportgroup(args):
|
||||||
|
if len(args) != 1:
|
||||||
|
print('Missing port group name argument', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
|
||||||
|
name = args[0]
|
||||||
|
content = loadYaml(portgroupsFilename)
|
||||||
|
ports = content['firewall']['aliases']['ports']
|
||||||
|
if ports is None:
|
||||||
|
ports = {}
|
||||||
|
content['firewall']['aliases']['ports'] = ports
|
||||||
|
if name in ports:
|
||||||
|
print('Already exists', file=sys.stderr)
|
||||||
|
return 3
|
||||||
|
ports[name] = createProtocolMap()
|
||||||
|
writeYaml(portgroupsFilename, content)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def listports(args):
|
||||||
|
if len(args) != 2:
|
||||||
|
print('Missing port group name or port protocol', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
|
||||||
|
name = args[0]
|
||||||
|
protocol = args[1]
|
||||||
|
if protocol not in supportedProtocols:
|
||||||
|
print('Port protocol is not supported', file=sys.stderr)
|
||||||
|
return 5
|
||||||
|
|
||||||
|
content = loadYaml(portgroupsFilename)
|
||||||
|
ports = content['firewall']['aliases']['ports']
|
||||||
|
if ports is None:
|
||||||
|
ports = {}
|
||||||
|
content['firewall']['aliases']['ports'] = ports
|
||||||
|
if name not in ports:
|
||||||
|
print('Port group does not exist', file=sys.stderr)
|
||||||
|
return 3
|
||||||
|
ports = ports[name][protocol]
|
||||||
|
if ports is not None:
|
||||||
|
for port in ports:
|
||||||
|
print(port)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def addport(args):
|
||||||
|
if len(args) != 3:
|
||||||
|
print('Missing port group name or port protocol, or port argument', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
|
||||||
|
name = args[0]
|
||||||
|
protocol = args[1]
|
||||||
|
port = args[2]
|
||||||
|
if protocol not in supportedProtocols:
|
||||||
|
print('Port protocol is not supported', file=sys.stderr)
|
||||||
|
return 5
|
||||||
|
|
||||||
|
content = loadYaml(portgroupsFilename)
|
||||||
|
ports = content['firewall']['aliases']['ports']
|
||||||
|
if ports is None:
|
||||||
|
ports = {}
|
||||||
|
content['firewall']['aliases']['ports'] = ports
|
||||||
|
if name not in ports:
|
||||||
|
print('Port group does not exist', file=sys.stderr)
|
||||||
|
return 3
|
||||||
|
ports = ports[name][protocol]
|
||||||
|
if ports is None:
|
||||||
|
ports = []
|
||||||
|
content['firewall']['aliases']['ports'][name][protocol] = ports
|
||||||
|
if port in ports:
|
||||||
|
print('Already exists', file=sys.stderr)
|
||||||
|
return 3
|
||||||
|
ports.append(port)
|
||||||
|
writeYaml(portgroupsFilename, content)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def removeport(args):
|
||||||
|
if len(args) != 3:
|
||||||
|
print('Missing port group name or port protocol, or port argument', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
|
||||||
|
name = args[0]
|
||||||
|
protocol = args[1]
|
||||||
|
port = args[2]
|
||||||
|
if protocol not in supportedProtocols:
|
||||||
|
print('Port protocol is not supported', file=sys.stderr)
|
||||||
|
return 5
|
||||||
|
|
||||||
|
content = loadYaml(portgroupsFilename)
|
||||||
|
ports = content['firewall']['aliases']['ports']
|
||||||
|
if ports is None:
|
||||||
|
ports = {}
|
||||||
|
content['firewall']['aliases']['ports'] = ports
|
||||||
|
if name not in ports:
|
||||||
|
print('Port group does not exist', file=sys.stderr)
|
||||||
|
return 3
|
||||||
|
ports = ports[name][protocol]
|
||||||
|
if ports is None or port not in ports:
|
||||||
|
print('Port does not exist', file=sys.stderr)
|
||||||
|
return 3
|
||||||
|
ports.remove(port)
|
||||||
|
writeYaml(portgroupsFilename, content)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def includedhosts(args):
|
||||||
|
if len(args) != 1:
|
||||||
|
print('Missing host group name argument', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
return listIps(args[0], 'insert')
|
||||||
|
|
||||||
|
def excludedhosts(args):
|
||||||
|
if len(args) != 1:
|
||||||
|
print('Missing host group name argument', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
return listIps(args[0], 'delete')
|
||||||
|
|
||||||
|
def includehost(args):
|
||||||
|
if len(args) != 2:
|
||||||
|
print('Missing host group name or ip argument', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
result = addIp(args[0], args[1], 'insert')
|
||||||
|
if result == 0:
|
||||||
|
removeIp(args[0], args[1], 'delete', True)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def excludehost(args):
|
||||||
|
if len(args) != 2:
|
||||||
|
print('Missing host group name or ip argument', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
result = addIp(args[0], args[1], 'delete')
|
||||||
|
if result == 0:
|
||||||
|
removeIp(args[0], args[1], 'insert', True)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def removehost(args):
|
||||||
|
if len(args) != 2:
|
||||||
|
print('Missing host group name or ip argument', file=sys.stderr)
|
||||||
|
showUsage(args)
|
||||||
|
return removeIp(args[0], args[1], 'delete')
|
||||||
|
|
||||||
|
def apply():
|
||||||
|
proc = subprocess.run(['salt-call', 'state.apply', 'firewall', 'queue=True'])
|
||||||
|
return proc.returncode
|
||||||
|
|
||||||
|
def main():
|
||||||
|
options = []
|
||||||
|
args = sys.argv[1:]
|
||||||
|
for option in args:
|
||||||
|
if option.startswith("--"):
|
||||||
|
options.append(option)
|
||||||
|
args.remove(option)
|
||||||
|
|
||||||
|
if len(args) == 0:
|
||||||
|
showUsage(None)
|
||||||
|
|
||||||
|
commands = {
|
||||||
|
"help": showUsage,
|
||||||
|
"includedhosts": includedhosts,
|
||||||
|
"excludedhosts": excludedhosts,
|
||||||
|
"includehost": includehost,
|
||||||
|
"excludehost": excludehost,
|
||||||
|
"removehost": removehost,
|
||||||
|
"listports": listports,
|
||||||
|
"addport": addport,
|
||||||
|
"removeport": removeport,
|
||||||
|
"addhostgroup": addhostgroup,
|
||||||
|
"addportgroup": addportgroup
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd = commands.get(args[0], showUsage)
|
||||||
|
code = cmd(args[1:])
|
||||||
|
|
||||||
|
|
||||||
|
if code == 0 and "--apply" in options:
|
||||||
|
code = apply()
|
||||||
|
|
||||||
|
sys.exit(code)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
44
salt/common/tools/sbin/so-fleet-setup
Normal file
44
salt/common/tools/sbin/so-fleet-setup
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#so-fleet-setup $FleetEmail $FleetPassword
|
||||||
|
|
||||||
|
if [[ $# -ne 2 ]] ; then
|
||||||
|
echo "Username or Password was not set - exiting now."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Checking to see if required containers are started...
|
||||||
|
if [ ! "$(docker ps -q -f name=so-fleet)" ]; then
|
||||||
|
echo "Starting Docker Containers..."
|
||||||
|
salt-call state.apply mysql queue=True >> /root/fleet-setup.log
|
||||||
|
salt-call state.apply fleet queue=True >> /root/fleet-setup.log
|
||||||
|
salt-call state.apply redis queue=True >> /root/fleet-setup.log
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker exec so-fleet fleetctl config set --address https://localhost:8080 --tls-skip-verify --url-prefix /fleet
|
||||||
|
docker exec so-fleet fleetctl setup --email $1 --password $2
|
||||||
|
|
||||||
|
docker exec so-fleet fleetctl apply -f /packs/palantir/Fleet/Endpoints/MacOS/osquery.yaml
|
||||||
|
docker exec so-fleet fleetctl apply -f /packs/palantir/Fleet/Endpoints/Windows/osquery.yaml
|
||||||
|
docker exec so-fleet fleetctl apply -f /packs/so/so-default.yml
|
||||||
|
docker exec so-fleet /bin/sh -c 'for pack in /packs/palantir/Fleet/Endpoints/packs/*.yaml; do fleetctl apply -f "$pack"; done'
|
||||||
|
docker exec so-fleet fleetctl apply -f /packs/osquery-config.conf
|
||||||
|
|
||||||
|
|
||||||
|
# Enable Fleet
|
||||||
|
echo "Enabling Fleet..."
|
||||||
|
salt-call state.apply fleet.event_enable-fleet queue=True >> /root/fleet-setup.log
|
||||||
|
salt-call state.apply nginx queue=True >> /root/fleet-setup.log
|
||||||
|
|
||||||
|
# Generate osquery install packages
|
||||||
|
echo "Generating osquery install packages - this will take some time..."
|
||||||
|
salt-call state.apply fleet.event_gen-packages queue=True >> /root/fleet-setup.log
|
||||||
|
sleep 120
|
||||||
|
|
||||||
|
echo "Installing launcher via salt..."
|
||||||
|
salt-call state.apply fleet.install_package queue=True >> /root/fleet-setup.log
|
||||||
|
salt-call state.apply filebeat queue=True >> /root/fleet-setup.log
|
||||||
|
docker stop so-nginx
|
||||||
|
salt-call state.apply nginx queue=True >> /root/fleet-setup.log
|
||||||
|
|
||||||
|
echo "Fleet Setup Complete - Login with the username and password you ran the script with."
|
||||||
@@ -1,4 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
local_salt_dir=/opt/so/saltstack/local
|
||||||
|
|
||||||
got_root() {
|
got_root() {
|
||||||
|
|
||||||
# Make sure you are root
|
# Make sure you are root
|
||||||
@@ -10,13 +13,13 @@ got_root() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
got_root
|
got_root
|
||||||
if [ ! -f /opt/so/saltstack/pillar/fireeye/init.sls ]; then
|
if [ ! -f $local_salt_dir/pillar/fireeye/init.sls ]; then
|
||||||
echo "This is nto configured for Helix Mode. Please re-install."
|
echo "This is nto configured for Helix Mode. Please re-install."
|
||||||
exit
|
exit
|
||||||
else
|
else
|
||||||
echo "Enter your Helix API Key: "
|
echo "Enter your Helix API Key: "
|
||||||
read APIKEY
|
read APIKEY
|
||||||
sed -i "s/^ api_key.*/ api_key: $APIKEY/g" /opt/so/saltstack/pillar/fireeye/init.sls
|
sed -i "s/^ api_key.*/ api_key: $APIKEY/g" $local_salt_dir/pillar/fireeye/init.sls
|
||||||
docker stop so-logstash
|
docker stop so-logstash
|
||||||
docker rm so-logstash
|
docker rm so-logstash
|
||||||
echo "Restarting Logstash for updated key"
|
echo "Restarting Logstash for updated key"
|
||||||
|
|||||||
37
salt/common/tools/sbin/so-kibana-config-export
Normal file → Executable file
37
salt/common/tools/sbin/so-kibana-config-export
Normal file → Executable file
@@ -1,6 +1,35 @@
|
|||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
KIBANA_HOST=10.66.166.141
|
#
|
||||||
|
# {%- set FLEET_MASTER = salt['pillar.get']('static:fleet_master', False) -%}
|
||||||
|
# {%- set FLEET_NODE = salt['pillar.get']('static:fleet_node', False) -%}
|
||||||
|
# {%- set FLEET_IP = salt['pillar.get']('static:fleet_ip', '') %}
|
||||||
|
# {%- set MASTER = salt['pillar.get']('master:url_base', '') %}
|
||||||
|
#
|
||||||
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
KIBANA_HOST={{ MASTER }}
|
||||||
KSO_PORT=5601
|
KSO_PORT=5601
|
||||||
OUTFILE="saved_objects.json"
|
OUTFILE="saved_objects.ndjson"
|
||||||
curl -s -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -XPOST $KIBANA_HOST:$KSO_PORT/api/saved_objects/_export -d '{ "type": "index-pattern", "type": "config", "type": "dashboard", "type": "query", "type": "search", "type": "url", "type": "visualization" }' -o $OUTFILE
|
curl -s -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -XPOST $KIBANA_HOST:$KSO_PORT/api/saved_objects/_export -d '{ "type": [ "index-pattern", "config", "visualization", "dashboard", "search" ], "excludeExportDetails": false }' > $OUTFILE
|
||||||
|
|
||||||
|
# Clean up using PLACEHOLDER
|
||||||
|
sed -i "s/$KIBANA_HOST/PLACEHOLDER/g" $OUTFILE
|
||||||
|
|
||||||
|
# Clean up for Fleet, if applicable
|
||||||
|
# {% if FLEET_NODE or FLEET_MASTER %}
|
||||||
|
# Fleet IP
|
||||||
|
sed -i "s/{{ MASTER }}/FLEETPLACEHOLDER/g" $OUTFILE
|
||||||
|
# {% endif %}
|
||||||
|
|||||||
57
salt/common/tools/sbin/so-saltstack-update
Normal file
57
salt/common/tools/sbin/so-saltstack-update
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
default_salt_dir=/opt/so/saltstack/default
|
||||||
|
clone_to_tmp() {
|
||||||
|
|
||||||
|
# TODO Need to add a air gap option
|
||||||
|
# Make a temp location for the files
|
||||||
|
mkdir /tmp/sogh
|
||||||
|
cd /tmp/sogh
|
||||||
|
#git clone -b dev https://github.com/Security-Onion-Solutions/securityonion-saltstack.git
|
||||||
|
git clone https://github.com/Security-Onion-Solutions/securityonion-saltstack.git
|
||||||
|
cd /tmp
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_new_files() {
|
||||||
|
|
||||||
|
# Copy new files over to the salt dir
|
||||||
|
cd /tmp/sogh/securityonion-saltstack
|
||||||
|
git checkout $BRANCH
|
||||||
|
rsync -a --exclude-from 'exclude-list.txt' salt $default_salt_dir/
|
||||||
|
rsync -a --exclude-from 'exclude-list.txt' pillar $default_salt_dir/
|
||||||
|
chown -R socore:socore $default_salt_dir/salt
|
||||||
|
chown -R socore:socore $default_salt_dir/pillar
|
||||||
|
chmod 755 $default_salt_dir/pillar/firewall/addfirewall.sh
|
||||||
|
rm -rf /tmp/sogh
|
||||||
|
}
|
||||||
|
|
||||||
|
got_root(){
|
||||||
|
if [ "$(id -u)" -ne 0 ]; then
|
||||||
|
echo "This script must be run using sudo!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
got_root
|
||||||
|
if [ $# -ne 1 ] ; then
|
||||||
|
BRANCH=master
|
||||||
|
else
|
||||||
|
BRANCH=$1
|
||||||
|
fi
|
||||||
|
clone_to_tmp
|
||||||
|
copy_new_files
|
||||||
@@ -32,5 +32,5 @@ fi
|
|||||||
case $1 in
|
case $1 in
|
||||||
"all") salt-call state.highstate queue=True;;
|
"all") salt-call state.highstate queue=True;;
|
||||||
"steno") if docker ps | grep -q so-$1; then printf "\n$1 is already running!\n\n"; else docker rm so-$1 >/dev/null 2>&1 ; salt-call state.apply pcap queue=True; fi ;;
|
"steno") if docker ps | grep -q so-$1; then printf "\n$1 is already running!\n\n"; else docker rm so-$1 >/dev/null 2>&1 ; salt-call state.apply pcap queue=True; fi ;;
|
||||||
*) if docker ps | grep -q so-$1; then printf "\n$1 is already running\n\n"; else docker rm so-$1 >/dev/null 2>&1 ; salt-call state.apply $1 queue=True; fi ;;
|
*) if docker ps | grep -E -q '^so-$1$'; then printf "\n$1 is already running\n\n"; else docker rm so-$1 >/dev/null 2>&1 ; salt-call state.apply $1 queue=True; fi ;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
@@ -14,35 +14,8 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
{%- from 'common/maps/so-status.map.jinja' import docker with context %}
|
||||||
{%- set pillar_suffix = ':containers' -%}
|
{%- set container_list = docker['containers'] | sort %}
|
||||||
{%- if (salt['grains.get']('role') == 'so-mastersearch') -%}
|
|
||||||
{%- set pillar_val = 'master_search' -%}
|
|
||||||
{%- elif (salt['grains.get']('role') == 'so-master') -%}
|
|
||||||
{%- set pillar_val = 'master' -%}
|
|
||||||
{%- elif (salt['grains.get']('role') == 'so-heavynode') -%}
|
|
||||||
{%- set pillar_val = 'heavy_node' -%}
|
|
||||||
{%- elif (salt['grains.get']('role') == 'so-sensor') -%}
|
|
||||||
{%- set pillar_val = 'sensor' -%}
|
|
||||||
{%- elif (salt['grains.get']('role') == 'so-eval') -%}
|
|
||||||
{%- set pillar_val = 'eval' -%}
|
|
||||||
{%- elif (salt['grains.get']('role') == 'so-fleet') -%}
|
|
||||||
{%- set pillar_val = 'fleet' -%}
|
|
||||||
{%- elif (salt['grains.get']('role') == 'so-helix') -%}
|
|
||||||
{%- set pillar_val = 'helix' -%}
|
|
||||||
{%- elif (salt['grains.get']('role') == 'so-node') -%}
|
|
||||||
{%- if (salt['pillar.get']('node:node_type') == 'parser') -%}
|
|
||||||
{%- set pillar_val = 'parser_node' -%}
|
|
||||||
{%- elif (salt['pillar.get']('node:node_type') == 'hot') -%}
|
|
||||||
{%- set pillar_val = 'hot_node' -%}
|
|
||||||
{%- elif (salt['pillar.get']('node:node_type') == 'warm') -%}
|
|
||||||
{%- set pillar_val = 'warm_node' -%}
|
|
||||||
{%- elif (salt['pillar.get']('node:node_type') == 'search') -%}
|
|
||||||
{%- set pillar_val = 'search_node' -%}
|
|
||||||
{%- endif -%}
|
|
||||||
{%- endif -%}
|
|
||||||
{%- set pillar_name = pillar_val ~ pillar_suffix -%}
|
|
||||||
{%- set container_list = salt['pillar.get'](pillar_name) %}
|
|
||||||
|
|
||||||
if ! [ "$(id -u)" = 0 ]; then
|
if ! [ "$(id -u)" = 0 ]; then
|
||||||
echo "This command must be run as root"
|
echo "This command must be run as root"
|
||||||
|
|||||||
21
salt/common/tools/sbin/so-thehive-es-restart
Executable file
21
salt/common/tools/sbin/so-thehive-es-restart
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
/usr/sbin/so-stop thehive-es $1
|
||||||
|
/usr/sbin/so-start thehive $1
|
||||||
20
salt/common/tools/sbin/so-thehive-es-start
Executable file
20
salt/common/tools/sbin/so-thehive-es-start
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
/usr/sbin/so-start thehive $1
|
||||||
20
salt/common/tools/sbin/so-thehive-es-stop
Executable file
20
salt/common/tools/sbin/so-thehive-es-stop
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
/usr/sbin/so-stop thehive-es $1
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
#
|
||||||
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
#
|
||||||
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
|||||||
39
salt/common/tools/sbin/so-zeek-stats
Normal file
39
salt/common/tools/sbin/so-zeek-stats
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2014,2015,2016,2017,2018,2019,2020 Security Onion Solutions, LLC
|
||||||
|
#
|
||||||
|
# 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/>.
|
||||||
|
|
||||||
|
# Show Zeek stats (capstats, netstats)
|
||||||
|
|
||||||
|
show_stats() {
|
||||||
|
echo '##############'
|
||||||
|
echo '# Zeek Stats #'
|
||||||
|
echo '##############'
|
||||||
|
echo
|
||||||
|
echo "Average throughput:"
|
||||||
|
echo
|
||||||
|
docker exec -it so-zeek /opt/zeek/bin/zeekctl capstats
|
||||||
|
echo
|
||||||
|
echo "Average packet loss:"
|
||||||
|
echo
|
||||||
|
docker exec -it so-zeek /opt/zeek/bin/zeekctl netstats
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
if docker ps | grep -q zeek; then
|
||||||
|
show_stats
|
||||||
|
else
|
||||||
|
echo "Zeek is not running! Try starting it with 'so-zeek-start'." && exit 1;
|
||||||
|
fi
|
||||||
@@ -1,12 +1,8 @@
|
|||||||
{% if grains['role'] == 'so-node' %}
|
{%- if grains['role'] in ['so-node', 'so-searchnode', 'so-heavynode'] %}
|
||||||
|
{%- set cur_close_days = salt['pillar.get']('node:cur_close_days', '') -%}
|
||||||
{%- set cur_close_days = salt['pillar.get']('node:cur_close_days', '') -%}
|
{%- elif grains['role'] in ['so-eval', 'so-mastersearch', 'so-standalone'] %}
|
||||||
|
{%- set cur_close_days = salt['pillar.get']('master:cur_close_days', '') -%}
|
||||||
{% elif grains['role'] == 'so-eval' %}
|
{%- endif -%}
|
||||||
|
|
||||||
{%- set cur_close_days = salt['pillar.get']('master:cur_close_days', '') -%}
|
|
||||||
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
---
|
---
|
||||||
# Remember, leave a key empty if there is no value. None will be a string,
|
# Remember, leave a key empty if there is no value. None will be a string,
|
||||||
@@ -28,9 +24,8 @@ actions:
|
|||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
kind: prefix
|
kind: regex
|
||||||
value: logstash-
|
value: '^(logstash-.*|so-.*)$'
|
||||||
exclude:
|
|
||||||
- filtertype: age
|
- filtertype: age
|
||||||
source: name
|
source: name
|
||||||
direction: older
|
direction: older
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
{% if grains['role'] == 'so-node' %}
|
{%- if grains['role'] in ['so-node', 'so-searchnode', 'so-heavynode'] %}
|
||||||
|
{%- set log_size_limit = salt['pillar.get']('node:log_size_limit', '') -%}
|
||||||
{%- set log_size_limit = salt['pillar.get']('node:log_size_limit', '') -%}
|
{%- elif grains['role'] in ['so-eval', 'so-mastersearch', 'so-standalone'] %}
|
||||||
|
{%- set log_size_limit = salt['pillar.get']('master:log_size_limit', '') -%}
|
||||||
{% elif grains['role'] == 'so-eval' %}
|
|
||||||
|
|
||||||
{%- set log_size_limit = salt['pillar.get']('master:log_size_limit', '') -%}
|
|
||||||
|
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
---
|
---
|
||||||
# Remember, leave a key empty if there is no value. None will be a string,
|
# Remember, leave a key empty if there is no value. None will be a string,
|
||||||
@@ -24,8 +20,8 @@ actions:
|
|||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
kind: prefix
|
kind: regex
|
||||||
value: logstash-
|
value: '^(logstash-.*|so-.*)$'
|
||||||
- filtertype: space
|
- filtertype: space
|
||||||
source: creation_date
|
source: creation_date
|
||||||
use_age: True
|
use_age: True
|
||||||
|
|||||||
@@ -1,17 +1,13 @@
|
|||||||
|
|
||||||
{% if grains['role'] == 'so-node' %}
|
{%- if grains['role'] in ['so-node', 'so-searchnode', 'so-heavynode'] %}
|
||||||
|
{%- set ELASTICSEARCH_HOST = salt['pillar.get']('node:mainip', '') -%}
|
||||||
{%- set ELASTICSEARCH_HOST = salt['pillar.get']('node:mainip', '') -%}
|
{%- set ELASTICSEARCH_PORT = salt['pillar.get']('node:es_port', '') -%}
|
||||||
{%- set ELASTICSEARCH_PORT = salt['pillar.get']('node:es_port', '') -%}
|
{%- set LOG_SIZE_LIMIT = salt['pillar.get']('node:log_size_limit', '') -%}
|
||||||
{%- set LOG_SIZE_LIMIT = salt['pillar.get']('node:log_size_limit', '') -%}
|
{%- elif grains['role'] in ['so-eval', 'so-mastersearch', 'so-standalone'] %}
|
||||||
|
{%- set ELASTICSEARCH_HOST = salt['pillar.get']('master:mainip', '') -%}
|
||||||
{% elif grains['role'] == 'so-eval' %}
|
{%- set ELASTICSEARCH_PORT = salt['pillar.get']('master:es_port', '') -%}
|
||||||
|
{%- set LOG_SIZE_LIMIT = salt['pillar.get']('master:log_size_limit', '') -%}
|
||||||
{%- set ELASTICSEARCH_HOST = salt['pillar.get']('master:mainip', '') -%}
|
{%- endif -%}
|
||||||
{%- set ELASTICSEARCH_PORT = salt['pillar.get']('master:es_port', '') -%}
|
|
||||||
{%- set LOG_SIZE_LIMIT = salt['pillar.get']('master:log_size_limit', '') -%}
|
|
||||||
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
@@ -37,17 +33,17 @@ LOG="/opt/so/log/curator/so-curator-closed-delete.log"
|
|||||||
|
|
||||||
# Check for 2 conditions:
|
# Check for 2 conditions:
|
||||||
# 1. Are Elasticsearch indices using more disk space than LOG_SIZE_LIMIT?
|
# 1. Are Elasticsearch indices using more disk space than LOG_SIZE_LIMIT?
|
||||||
# 2. Are there any closed logstash- indices that we can delete?
|
# 2. Are there any closed logstash-, or so- indices that we can delete?
|
||||||
# If both conditions are true, keep on looping until one of the conditions is false.
|
# If both conditions are true, keep on looping until one of the conditions is false.
|
||||||
while [[ $(du -hs --block-size=1GB /nsm/elasticsearch/nodes | awk '{print $1}' ) -gt "{{LOG_SIZE_LIMIT}}" ]] &&
|
while [[ $(du -hs --block-size=1GB /nsm/elasticsearch/nodes | awk '{print $1}' ) -gt "{{LOG_SIZE_LIMIT}}" ]] &&
|
||||||
curl -s {{ELASTICSEARCH_HOST}}:{{ELASTICSEARCH_PORT}}/_cat/indices | grep "^ close logstash-" > /dev/null; do
|
curl -s {{ELASTICSEARCH_HOST}}:{{ELASTICSEARCH_PORT}}/_cat/indices | grep -E "^ close (logstash-|so-)" > /dev/null; do
|
||||||
|
|
||||||
# We need to determine OLDEST_INDEX.
|
# We need to determine OLDEST_INDEX.
|
||||||
# First, get the list of closed indices that are prefixed with "logstash-".
|
# First, get the list of closed indices that are prefixed with "logstash-" or "so-".
|
||||||
# For example: logstash-ids-YYYY.MM.DD
|
# For example: logstash-ids-YYYY.MM.DD
|
||||||
# Then, sort by date by telling sort to use hyphen as delimiter and then sort on the third field.
|
# Then, sort by date by telling sort to use hyphen as delimiter and then sort on the third field.
|
||||||
# Finally, select the first entry in that sorted list.
|
# Finally, select the first entry in that sorted list.
|
||||||
OLDEST_INDEX=$(curl -s {{ELASTICSEARCH_HOST}}:{{ELASTICSEARCH_PORT}}/_cat/indices | grep "^ close logstash-" | awk '{print $2}' | sort -t- -k3 | head -1)
|
OLDEST_INDEX=$(curl -s {{ELASTICSEARCH_HOST}}:{{ELASTICSEARCH_PORT}}/_cat/indices | grep -E "^ close (logstash-|so-)" | awk '{print $2}' | sort -t- -k3 | head -1)
|
||||||
|
|
||||||
# Now that we've determined OLDEST_INDEX, ask Elasticsearch to delete it.
|
# Now that we've determined OLDEST_INDEX, ask Elasticsearch to delete it.
|
||||||
curl -XDELETE {{ELASTICSEARCH_HOST}}:{{ELASTICSEARCH_PORT}}/${OLDEST_INDEX}
|
curl -XDELETE {{ELASTICSEARCH_HOST}}:{{ELASTICSEARCH_PORT}}/${OLDEST_INDEX}
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
{% if grains['role'] == 'so-node' %}
|
{% if grains['role'] in ['so-node', 'so-heavynode'] %}
|
||||||
|
{%- set elasticsearch = salt['pillar.get']('node:mainip', '') -%}
|
||||||
{%- set elasticsearch = salt['pillar.get']('node:mainip', '') -%}
|
{% elif grains['role'] in ['so-eval', 'so-mastersearch', 'so-standalone'] %}
|
||||||
|
{%- set elasticsearch = salt['pillar.get']('master:mainip', '') -%}
|
||||||
{% elif grains['role'] == 'so-eval' %}
|
|
||||||
|
|
||||||
{%- set elasticsearch = salt['pillar.get']('master:mainip', '') -%}
|
|
||||||
|
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{% set VERSION = salt['pillar.get']('static:soversion', 'HH1.2.1') %}
|
{% set VERSION = salt['pillar.get']('static:soversion', 'HH1.2.2') %}
|
||||||
{% set MASTER = salt['grains.get']('master') %}
|
{% set MASTER = salt['grains.get']('master') %}
|
||||||
{% if grains['role'] == 'so-node' or grains['role'] == 'so-eval' %}
|
{% if grains['role'] in ['so-eval', 'so-node', 'so-mastersearch', 'so-heavynode', 'so-standalone'] %}
|
||||||
# Curator
|
# Curator
|
||||||
# Create the group
|
# Create the group
|
||||||
curatorgroup:
|
curatorgroup:
|
||||||
@@ -89,7 +89,7 @@ curdel:
|
|||||||
|
|
||||||
so-curatorcloseddeletecron:
|
so-curatorcloseddeletecron:
|
||||||
cron.present:
|
cron.present:
|
||||||
- name: /usr/sbin/so-curator-closed-delete
|
- name: /usr/sbin/so-curator-closed-delete > /opt/so/log/curator/cron-closed-delete.log 2>&1
|
||||||
- user: root
|
- user: root
|
||||||
- minute: '*'
|
- minute: '*'
|
||||||
- hour: '*'
|
- hour: '*'
|
||||||
@@ -99,7 +99,7 @@ so-curatorcloseddeletecron:
|
|||||||
|
|
||||||
so-curatorclosecron:
|
so-curatorclosecron:
|
||||||
cron.present:
|
cron.present:
|
||||||
- name: /usr/sbin/so-curator-close
|
- name: /usr/sbin/so-curator-close > /opt/so/log/curator/cron-close.log 2>&1
|
||||||
- user: root
|
- user: root
|
||||||
- minute: '*'
|
- minute: '*'
|
||||||
- hour: '*'
|
- hour: '*'
|
||||||
@@ -109,7 +109,7 @@ so-curatorclosecron:
|
|||||||
|
|
||||||
so-curatordeletecron:
|
so-curatordeletecron:
|
||||||
cron.present:
|
cron.present:
|
||||||
- name: /usr/sbin/so-curator-delete
|
- name: /usr/sbin/so-curator-delete > /opt/so/log/curator/cron-delete.log 2>&1
|
||||||
- user: root
|
- user: root
|
||||||
- minute: '*'
|
- minute: '*'
|
||||||
- hour: '*'
|
- hour: '*'
|
||||||
|
|||||||
8
salt/docker/init.sls
Normal file
8
salt/docker/init.sls
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
installdocker:
|
||||||
|
pkg.installed:
|
||||||
|
- name: docker-ce
|
||||||
|
|
||||||
|
# Make sure Docker is running!
|
||||||
|
docker:
|
||||||
|
service.running:
|
||||||
|
- enable: True
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
{% set esport = salt['pillar.get']('master:es_port', '') %}
|
{% set esport = salt['pillar.get']('master:es_port', '') %}
|
||||||
# This is the folder that contains the rule yaml files
|
# This is the folder that contains the rule yaml files
|
||||||
# Any .yaml file will be loaded as a rule
|
# Any .yaml file will be loaded as a rule
|
||||||
rules_folder: /etc/elastalert/rules/
|
rules_folder: /opt/elastalert/rules/
|
||||||
|
|
||||||
# Sets whether or not ElastAlert should recursively descend
|
# Sets whether or not ElastAlert should recursively descend
|
||||||
# the rules directory - true or false
|
# the rules directory - true or false
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# HiveAlerter modified from original at: https://raw.githubusercontent.com/Nclose-ZA/elastalert_hive_alerter/master/elastalert_hive_alerter/hive_alerter.py
|
|
||||||
|
|
||||||
import uuid
|
|
||||||
|
|
||||||
from elastalert.alerts import Alerter
|
|
||||||
from thehive4py.api import TheHiveApi
|
|
||||||
from thehive4py.models import Alert, AlertArtifact, CustomFieldHelper
|
|
||||||
|
|
||||||
|
|
||||||
class TheHiveAlerter(Alerter):
|
|
||||||
"""
|
|
||||||
Use matched data to create alerts containing observables in an instance of TheHive
|
|
||||||
"""
|
|
||||||
|
|
||||||
required_options = set(['hive_connection', 'hive_alert_config'])
|
|
||||||
|
|
||||||
def get_aggregation_summary_text(self, matches):
|
|
||||||
text = super(TheHiveAlerter, self).get_aggregation_summary_text(matches)
|
|
||||||
if text:
|
|
||||||
text = '```\n{0}```\n'.format(text)
|
|
||||||
return text
|
|
||||||
|
|
||||||
def create_artifacts(self, match):
|
|
||||||
artifacts = []
|
|
||||||
context = {'rule': self.rule, 'match': match}
|
|
||||||
for mapping in self.rule.get('hive_observable_data_mapping', []):
|
|
||||||
for observable_type, match_data_key in mapping.items():
|
|
||||||
try:
|
|
||||||
artifacts.append(AlertArtifact(dataType=observable_type, data=match_data_key.format(**context)))
|
|
||||||
except KeyError as e:
|
|
||||||
print(('format string {} fail cause no key {} in {}'.format(e, match_data_key, context)))
|
|
||||||
return artifacts
|
|
||||||
|
|
||||||
def create_alert_config(self, match):
|
|
||||||
context = {'rule': self.rule, 'match': match}
|
|
||||||
alert_config = {
|
|
||||||
'artifacts': self.create_artifacts(match),
|
|
||||||
'sourceRef': str(uuid.uuid4())[0:6],
|
|
||||||
'title': '{rule[name]}'.format(**context)
|
|
||||||
}
|
|
||||||
|
|
||||||
alert_config.update(self.rule.get('hive_alert_config', {}))
|
|
||||||
|
|
||||||
for alert_config_field, alert_config_value in alert_config.items():
|
|
||||||
if alert_config_field == 'customFields':
|
|
||||||
custom_fields = CustomFieldHelper()
|
|
||||||
for cf_key, cf_value in alert_config_value.items():
|
|
||||||
try:
|
|
||||||
func = getattr(custom_fields, 'add_{}'.format(cf_value['type']))
|
|
||||||
except AttributeError:
|
|
||||||
raise Exception('unsupported custom field type {}'.format(cf_value['type']))
|
|
||||||
value = cf_value['value'].format(**context)
|
|
||||||
func(cf_key, value)
|
|
||||||
alert_config[alert_config_field] = custom_fields.build()
|
|
||||||
elif isinstance(alert_config_value, str):
|
|
||||||
alert_config[alert_config_field] = alert_config_value.format(**context)
|
|
||||||
elif isinstance(alert_config_value, (list, tuple)):
|
|
||||||
formatted_list = []
|
|
||||||
for element in alert_config_value:
|
|
||||||
try:
|
|
||||||
formatted_list.append(element.format(**context))
|
|
||||||
except (AttributeError, KeyError, IndexError):
|
|
||||||
formatted_list.append(element)
|
|
||||||
alert_config[alert_config_field] = formatted_list
|
|
||||||
|
|
||||||
return alert_config
|
|
||||||
|
|
||||||
def send_to_thehive(self, alert_config):
|
|
||||||
connection_details = self.rule['hive_connection']
|
|
||||||
api = TheHiveApi(
|
|
||||||
connection_details.get('hive_host', ''),
|
|
||||||
connection_details.get('hive_apikey', ''),
|
|
||||||
proxies=connection_details.get('hive_proxies', {'http': '', 'https': ''}),
|
|
||||||
cert=connection_details.get('hive_verify', False))
|
|
||||||
|
|
||||||
alert = Alert(**alert_config)
|
|
||||||
response = api.create_alert(alert)
|
|
||||||
|
|
||||||
if response.status_code != 201:
|
|
||||||
raise Exception('alert not successfully created in TheHive\n{}'.format(response.text))
|
|
||||||
|
|
||||||
def alert(self, matches):
|
|
||||||
if self.rule.get('hive_alert_config_type', 'custom') != 'classic':
|
|
||||||
for match in matches:
|
|
||||||
alert_config = self.create_alert_config(match)
|
|
||||||
self.send_to_thehive(alert_config)
|
|
||||||
else:
|
|
||||||
alert_config = self.create_alert_config(matches[0])
|
|
||||||
artifacts = []
|
|
||||||
for match in matches:
|
|
||||||
artifacts += self.create_artifacts(match)
|
|
||||||
if 'related_events' in match:
|
|
||||||
for related_event in match['related_events']:
|
|
||||||
artifacts += self.create_artifacts(related_event)
|
|
||||||
|
|
||||||
alert_config['artifacts'] = artifacts
|
|
||||||
alert_config['title'] = self.create_title(matches)
|
|
||||||
alert_config['description'] = self.create_alert_body(matches)
|
|
||||||
self.send_to_thehive(alert_config)
|
|
||||||
|
|
||||||
def get_info(self):
|
|
||||||
|
|
||||||
return {
|
|
||||||
'type': 'hivealerter',
|
|
||||||
'hive_host': self.rule.get('hive_connection', {}).get('hive_host', '')
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
{% set es = salt['pillar.get']('static:masterip', '') %}
|
{% set es = salt['pillar.get']('static:masterip', '') %}
|
||||||
{% set hivehost = salt['pillar.get']('static:masterip', '') %}
|
{% set hivehost = salt['pillar.get']('static:masterip', '') %}
|
||||||
{% set hivekey = salt['pillar.get']('static:hivekey', '') %}
|
{% set hivekey = salt['pillar.get']('static:hivekey', '') %}
|
||||||
|
{% set MASTER = salt['pillar.get']('master:url_base', '') %}
|
||||||
|
|
||||||
# hive.yaml
|
# hive.yaml
|
||||||
# Elastalert rule to forward IDS alerts from Security Onion to a specified TheHive instance.
|
# Elastalert rule to forward IDS alerts from Security Onion to a specified TheHive instance.
|
||||||
#
|
#
|
||||||
@@ -15,7 +17,7 @@ timeframe:
|
|||||||
buffer_time:
|
buffer_time:
|
||||||
minutes: 10
|
minutes: 10
|
||||||
allow_buffer_time_overlap: true
|
allow_buffer_time_overlap: true
|
||||||
query_key: ["rule.signature_id"]
|
query_key: ["rule.uuid"]
|
||||||
realert:
|
realert:
|
||||||
days: 1
|
days: 1
|
||||||
filter:
|
filter:
|
||||||
@@ -23,12 +25,13 @@ filter:
|
|||||||
query_string:
|
query_string:
|
||||||
query: "event.module: suricata"
|
query: "event.module: suricata"
|
||||||
|
|
||||||
alert: modules.so.thehive.TheHiveAlerter
|
alert: hivealerter
|
||||||
|
|
||||||
hive_connection:
|
hive_connection:
|
||||||
hive_host: https://{{hivehost}}/thehive/
|
hive_host: http://{{hivehost}}
|
||||||
|
hive_port: 9000/thehive
|
||||||
hive_apikey: {{hivekey}}
|
hive_apikey: {{hivekey}}
|
||||||
|
|
||||||
hive_proxies:
|
hive_proxies:
|
||||||
http: ''
|
http: ''
|
||||||
https: ''
|
https: ''
|
||||||
@@ -37,9 +40,9 @@ hive_alert_config:
|
|||||||
title: '{match[rule][name]}'
|
title: '{match[rule][name]}'
|
||||||
type: 'NIDS'
|
type: 'NIDS'
|
||||||
source: 'SecurityOnion'
|
source: 'SecurityOnion'
|
||||||
description: "`NIDS Dashboard:` \n\n <https://{{es}}/kibana/app/kibana#/dashboard/ed6f7e20-e060-11e9-8f0c-2ddbf5ed9290?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-24h,mode:quick,to:now))&_a=(columns:!(_source),index:'*:logstash-*',interval:auto,query:(query_string:(analyze_wildcard:!t,query:'sid:')),sort:!('@timestamp',desc))> \n\n `IPs: `{match[source][ip]}:{match[source][port]} --> {match[destination][ip]}:{match[destination][port]} \n\n `Signature:`{match[rule][rule]}"
|
description: "`Hunting Pivot:` \n\n <https://{{MASTER}}/#/hunt?q=event.module%3A%20suricata%20AND%20rule.uuid%3A{match[rule][uuid]}%20%7C%20groupby%20source.ip%20destination.ip%20rule.name> \n\n `Kibana Dashboard - Signature Drilldown:` \n\n <https://{{MASTER}}/kibana/app/kibana#/dashboard/ed6f7e20-e060-11e9-8f0c-2ddbf5ed9290?_g=(refreshInterval:(display:Off,pause:!f,value:0),time:(from:now-24h,mode:quick,to:now))&_a=(columns:!(_source),index:'*:logstash-*',interval:auto,query:(query_string:(analyze_wildcard:!t,query:'sid:')),sort:!('@timestamp',desc))> \n\n `Kibana Dashboard - Community_ID:` \n\n <https://{{MASTER}}/kibana/app/kibana#/dashboard/30d0ac90-729f-11ea-8dd2-9d8795a1200b?_g=(filters:!(('$state':(store:globalState),meta:(alias:!n,disabled:!f,index:'*:so-*',key:network.community_id,negate:!f,params:(query:'{match[network][community_id]}'),type:phrase),query:(match_phrase:(network.community_id:'{match[network][community_id]}')))),refreshInterval:(pause:!t,value:0),time:(from:now-7d,to:now))> \n\n `IPs: `{match[source][ip]}:{match[source][port]} --> {match[destination][ip]}:{match[destination][port]} \n\n `Signature:`{match[rule][rule]}"
|
||||||
severity: 2
|
severity: 2
|
||||||
tags: ['{match[rule][signature_id]}','{match[source][ip]}','{match[destination][ip]}']
|
tags: ['{match[rule][uuid]}','{match[source][ip]}','{match[destination][ip]}']
|
||||||
tlp: 3
|
tlp: 3
|
||||||
status: 'New'
|
status: 'New'
|
||||||
follow: True
|
follow: True
|
||||||
|
|||||||
@@ -12,26 +12,15 @@
|
|||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
{% set VERSION = salt['pillar.get']('static:soversion', 'HH1.2.1') %}
|
{% set VERSION = salt['pillar.get']('static:soversion', 'HH1.2.2') %}
|
||||||
{% set MASTER = salt['grains.get']('master') %}
|
{% set MASTER = salt['grains.get']('master') %}
|
||||||
{% if grains['role'] == 'so-master' %}
|
|
||||||
|
|
||||||
{% set esalert = salt['pillar.get']('master:elastalert', '1') %}
|
|
||||||
{% set esip = salt['pillar.get']('master:mainip', '') %}
|
|
||||||
{% set esport = salt['pillar.get']('master:es_port', '') %}
|
|
||||||
|
|
||||||
|
|
||||||
{% elif grains['role'] in ['so-eval','so-mastersearch'] %}
|
|
||||||
|
|
||||||
{% set esalert = salt['pillar.get']('master:elastalert', '1') %}
|
|
||||||
{% set esip = salt['pillar.get']('master:mainip', '') %}
|
|
||||||
{% set esport = salt['pillar.get']('master:es_port', '') %}
|
|
||||||
|
|
||||||
|
|
||||||
|
{% if grains['role'] in ['so-eval','so-mastersearch', 'so-master', 'so-standalone'] %}
|
||||||
|
{% set esalert = salt['pillar.get']('master:elastalert', '1') %}
|
||||||
|
{% set esip = salt['pillar.get']('master:mainip', '') %}
|
||||||
|
{% set esport = salt['pillar.get']('master:es_port', '') %}
|
||||||
{% elif grains['role'] == 'so-node' %}
|
{% elif grains['role'] == 'so-node' %}
|
||||||
|
{% set esalert = salt['pillar.get']('node:elastalert', '0') %}
|
||||||
{% set esalert = salt['pillar.get']('node:elastalert', '0') %}
|
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# Elastalert
|
# Elastalert
|
||||||
@@ -55,35 +44,35 @@ elastalogdir:
|
|||||||
file.directory:
|
file.directory:
|
||||||
- name: /opt/so/log/elastalert
|
- name: /opt/so/log/elastalert
|
||||||
- user: 933
|
- user: 933
|
||||||
- group: 939
|
- group: 933
|
||||||
- makedirs: True
|
- makedirs: True
|
||||||
|
|
||||||
elastarules:
|
elastarules:
|
||||||
file.directory:
|
file.directory:
|
||||||
- name: /opt/so/rules/elastalert
|
- name: /opt/so/rules/elastalert
|
||||||
- user: 933
|
- user: 933
|
||||||
- group: 939
|
- group: 933
|
||||||
- makedirs: True
|
- makedirs: True
|
||||||
|
|
||||||
elastaconfdir:
|
elastaconfdir:
|
||||||
file.directory:
|
file.directory:
|
||||||
- name: /opt/so/conf/elastalert
|
- name: /opt/so/conf/elastalert
|
||||||
- user: 933
|
- user: 933
|
||||||
- group: 939
|
- group: 933
|
||||||
- makedirs: True
|
- makedirs: True
|
||||||
|
|
||||||
elastasomodulesdir:
|
elastasomodulesdir:
|
||||||
file.directory:
|
file.directory:
|
||||||
- name: /opt/so/conf/elastalert/modules/so
|
- name: /opt/so/conf/elastalert/modules/so
|
||||||
- user: 933
|
- user: 933
|
||||||
- group: 939
|
- group: 933
|
||||||
- makedirs: True
|
- makedirs: True
|
||||||
|
|
||||||
elastacustmodulesdir:
|
elastacustmodulesdir:
|
||||||
file.directory:
|
file.directory:
|
||||||
- name: /opt/so/conf/elastalert/modules/custom
|
- name: /opt/so/conf/elastalert/modules/custom
|
||||||
- user: 933
|
- user: 933
|
||||||
- group: 939
|
- group: 933
|
||||||
- makedirs: True
|
- makedirs: True
|
||||||
|
|
||||||
elastasomodulesync:
|
elastasomodulesync:
|
||||||
@@ -91,7 +80,7 @@ elastasomodulesync:
|
|||||||
- name: /opt/so/conf/elastalert/modules/so
|
- name: /opt/so/conf/elastalert/modules/so
|
||||||
- source: salt://elastalert/files/modules/so
|
- source: salt://elastalert/files/modules/so
|
||||||
- user: 933
|
- user: 933
|
||||||
- group: 939
|
- group: 933
|
||||||
- makedirs: True
|
- makedirs: True
|
||||||
|
|
||||||
elastarulesync:
|
elastarulesync:
|
||||||
@@ -99,7 +88,7 @@ elastarulesync:
|
|||||||
- name: /opt/so/rules/elastalert
|
- name: /opt/so/rules/elastalert
|
||||||
- source: salt://elastalert/files/rules/so
|
- source: salt://elastalert/files/rules/so
|
||||||
- user: 933
|
- user: 933
|
||||||
- group: 939
|
- group: 933
|
||||||
- template: jinja
|
- template: jinja
|
||||||
|
|
||||||
elastaconf:
|
elastaconf:
|
||||||
@@ -107,7 +96,7 @@ elastaconf:
|
|||||||
- name: /opt/so/conf/elastalert/elastalert_config.yaml
|
- name: /opt/so/conf/elastalert/elastalert_config.yaml
|
||||||
- source: salt://elastalert/files/elastalert_config.yaml
|
- source: salt://elastalert/files/elastalert_config.yaml
|
||||||
- user: 933
|
- user: 933
|
||||||
- group: 939
|
- group: 933
|
||||||
- template: jinja
|
- template: jinja
|
||||||
|
|
||||||
so-elastalert:
|
so-elastalert:
|
||||||
@@ -118,16 +107,9 @@ so-elastalert:
|
|||||||
- user: elastalert
|
- user: elastalert
|
||||||
- detach: True
|
- detach: True
|
||||||
- binds:
|
- binds:
|
||||||
- /opt/so/rules/elastalert:/etc/elastalert/rules/:ro
|
- /opt/so/rules/elastalert:/opt/elastalert/rules/:ro
|
||||||
- /opt/so/log/elastalert:/var/log/elastalert:rw
|
- /opt/so/log/elastalert:/var/log/elastalert:rw
|
||||||
- /opt/so/conf/elastalert/modules/:/opt/elastalert/modules/:ro
|
- /opt/so/conf/elastalert/modules/:/opt/elastalert/modules/:ro
|
||||||
- /opt/so/conf/elastalert/elastalert_config.yaml:/etc/elastalert/conf/elastalert_config.yaml:ro
|
- /opt/so/conf/elastalert/elastalert_config.yaml:/opt/config/elastalert_config.yaml:ro
|
||||||
- environment:
|
|
||||||
- ELASTICSEARCH_HOST: {{ esip }}
|
|
||||||
- ELASTICSEARCH_PORT: {{ esport }}
|
|
||||||
- ELASTALERT_CONFIG: /etc/elastalert/conf/elastalert_config.yaml
|
|
||||||
- ELASTALERT_SUPERVISOR_CONF: /etc/elastalert/conf/elastalert_supervisord.conf
|
|
||||||
- RULES_DIRECTORY: /etc/elastalert/rules/
|
|
||||||
- LOG_DIR: /var/log/elastalert
|
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -22,3 +22,7 @@ transport.bind_host: 0.0.0.0
|
|||||||
transport.publish_host: {{ nodeip }}
|
transport.publish_host: {{ nodeip }}
|
||||||
transport.publish_port: 9300
|
transport.publish_port: 9300
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
cluster.routing.allocation.disk.threshold_enabled: true
|
||||||
|
cluster.routing.allocation.disk.watermark.low: 95%
|
||||||
|
cluster.routing.allocation.disk.watermark.high: 98%
|
||||||
|
cluster.routing.allocation.disk.watermark.flood_stage: 98%
|
||||||
|
|||||||
35
salt/elasticsearch/files/ingest/beats.common
Normal file
35
salt/elasticsearch/files/ingest/beats.common
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"description" : "beats.common",
|
||||||
|
"processors" : [
|
||||||
|
{"community_id": {"if": "ctx.winlog.event_data?.Protocol != null", "field":["winlog.event_data.SourceIp","winlog.event_data.SourcePort","winlog.event_data.DestinationIp","winlog.event_data.DestinationPort","winlog.event_data.Protocol"],"target_field":"network.community_id"}},
|
||||||
|
{ "set": { "if": "ctx.winlog?.channel != null", "field": "dataset", "value": "wel-{{winlog.channel}}", "override": true } },
|
||||||
|
{ "set": { "if": "ctx.agent?.type != null", "field": "module", "value": "{{agent.type}}", "override": true } },
|
||||||
|
{ "set": { "if": "ctx.winlog?.channel == 'Microsoft-Windows-Sysmon/Operational' && ctx.event?.code == 3", "field": "event.category", "value": "host,process,network", "override": true } },
|
||||||
|
{ "set": { "if": "ctx.winlog?.channel == 'Microsoft-Windows-Sysmon/Operational' && ctx.event?.code == 1", "field": "event.category", "value": "host,process", "override": true } },
|
||||||
|
{ "rename": { "field": "agent.hostname", "target_field": "agent.name", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.SubjectUserName", "target_field": "user.name", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.DestinationHostname", "target_field": "destination.hostname", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.DestinationIp", "target_field": "destination.ip", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.DestinationPort", "target_field": "destination.port", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.Image", "target_field": "process.executable", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.ProcessID", "target_field": "process.pid", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.ProcessGuid", "target_field": "process.entity_id", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.CommandLine", "target_field": "process.command_line", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.CurrentDirectory", "target_field": "process.working_directory", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.Description", "target_field": "process.pe.description", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.Product", "target_field": "process.pe.product", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.OriginalFileName", "target_field": "process.pe.original_file_name", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.FileVersion", "target_field": "process.pe.file_version", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.ParentCommandLine", "target_field": "process.parent.command_line", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.ParentImage", "target_field": "process.parent.executable", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.ParentProcessGuid", "target_field": "process.parent.entity_id", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.ParentProcessId", "target_field": "process.ppid", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.Protocol", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.User", "target_field": "user.name", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.SourceHostname", "target_field": "source.hostname", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.SourceIp", "target_field": "source.ip", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.SourcePort", "target_field": "source.port", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "winlog.event_data.targetFilename", "target_field": "file.target", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
{
|
{
|
||||||
"geoip": {
|
"geoip": {
|
||||||
"field": "destination.ip",
|
"field": "destination.ip",
|
||||||
"target_field": "geo",
|
"target_field": "destination.geo",
|
||||||
"database_file": "GeoLite2-City.mmdb",
|
"database_file": "GeoLite2-City.mmdb",
|
||||||
"ignore_missing": true,
|
"ignore_missing": true,
|
||||||
"properties": ["ip", "country_iso_code", "country_name", "continent_name", "region_iso_code", "region_name", "city_name", "timezone", "location"]
|
"properties": ["ip", "country_iso_code", "country_name", "continent_name", "region_iso_code", "region_name", "city_name", "timezone", "location"]
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
{
|
{
|
||||||
"geoip": {
|
"geoip": {
|
||||||
"field": "source.ip",
|
"field": "source.ip",
|
||||||
"target_field": "geo",
|
"target_field": "source.geo",
|
||||||
"database_file": "GeoLite2-City.mmdb",
|
"database_file": "GeoLite2-City.mmdb",
|
||||||
"ignore_missing": true,
|
"ignore_missing": true,
|
||||||
"properties": ["ip", "country_iso_code", "country_name", "continent_name", "region_iso_code", "region_name", "city_name", "timezone", "location"]
|
"properties": ["ip", "country_iso_code", "country_name", "continent_name", "region_iso_code", "region_name", "city_name", "timezone", "location"]
|
||||||
@@ -38,12 +38,15 @@
|
|||||||
{ "rename": { "field": "module", "target_field": "event.module", "ignore_missing": true } },
|
{ "rename": { "field": "module", "target_field": "event.module", "ignore_missing": true } },
|
||||||
{ "rename": { "field": "dataset", "target_field": "event.dataset", "ignore_missing": true } },
|
{ "rename": { "field": "dataset", "target_field": "event.dataset", "ignore_missing": true } },
|
||||||
{ "rename": { "field": "category", "target_field": "event.category", "ignore_missing": true } },
|
{ "rename": { "field": "category", "target_field": "event.category", "ignore_missing": true } },
|
||||||
{ "rename": { "field": "message2.community_id", "target_field": "network.community_id", "ignore_missing": true } },
|
{ "rename": { "field": "message2.community_id", "target_field": "network.community_id", "ignore_failure": true, "ignore_missing": true } },
|
||||||
|
{ "convert": { "field": "destination.port", "type": "integer", "ignore_failure": true, "ignore_missing": true } },
|
||||||
|
{ "convert": { "field": "source.port", "type": "integer", "ignore_failure": true, "ignore_missing": true } },
|
||||||
|
{ "convert": { "field": "log.id.uid", "type": "string", "ignore_failure": true, "ignore_missing": true } },
|
||||||
{
|
{
|
||||||
"remove": {
|
"remove": {
|
||||||
"field": [ "index_name_prefix", "message2"],
|
"field": [ "index_name_prefix", "message2", "type" ],
|
||||||
"ignore_failure": false
|
"ignore_failure": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,8 +24,14 @@
|
|||||||
{ "rename": { "field": "message3.columns.pid", "target_field": "process.pid", "ignore_missing": true } },
|
{ "rename": { "field": "message3.columns.pid", "target_field": "process.pid", "ignore_missing": true } },
|
||||||
{ "rename": { "field": "message3.columns.parent", "target_field": "process.ppid", "ignore_missing": true } },
|
{ "rename": { "field": "message3.columns.parent", "target_field": "process.ppid", "ignore_missing": true } },
|
||||||
{ "rename": { "field": "message3.columns.cwd", "target_field": "process.working_directory", "ignore_missing": true } },
|
{ "rename": { "field": "message3.columns.cwd", "target_field": "process.working_directory", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message3.columns.community_id", "target_field": "network.community_id", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message3.columns.local_address", "target_field": "local.ip", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message3.columns.local_port", "target_field": "local.port", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message3.columns.remote_address", "target_field": "remote.ip", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message3.columns.remote_port", "target_field": "remote.port", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message3.columns.process_name", "target_field": "process.name", "ignore_missing": true } },
|
||||||
{ "rename": { "field": "message3.columns.eventid", "target_field": "event.code", "ignore_missing": true } },
|
{ "rename": { "field": "message3.columns.eventid", "target_field": "event.code", "ignore_missing": true } },
|
||||||
{ "set": { "if": "ctx.message3.columns.data != null", "field": "dataset", "value": "wel-{{message3.columns.source}}", "override": true } },
|
{ "set": { "if": "ctx.message3.columns?.data != null", "field": "dataset", "value": "wel-{{message3.columns.source}}", "override": true } },
|
||||||
{ "rename": { "field": "message3.columns.winlog.EventData.SubjectUserName", "target_field": "user.name", "ignore_missing": true } },
|
{ "rename": { "field": "message3.columns.winlog.EventData.SubjectUserName", "target_field": "user.name", "ignore_missing": true } },
|
||||||
{ "rename": { "field": "message3.columns.winlog.EventData.destinationHostname", "target_field": "destination.hostname", "ignore_missing": true } },
|
{ "rename": { "field": "message3.columns.winlog.EventData.destinationHostname", "target_field": "destination.hostname", "ignore_missing": true } },
|
||||||
{ "rename": { "field": "message3.columns.winlog.EventData.destinationIp", "target_field": "destination.ip", "ignore_missing": true } },
|
{ "rename": { "field": "message3.columns.winlog.EventData.destinationIp", "target_field": "destination.ip", "ignore_missing": true } },
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
{
|
{
|
||||||
"description" : "suricata.alert",
|
"description" : "suricata.alert",
|
||||||
"processors" : [
|
"processors" : [
|
||||||
{ "json": { "field": "message", "target_field": "message2", "ignore_failure": true } },
|
|
||||||
{ "rename":{ "field": "message2.comunity_id", "target_field": "network.comunity_id", "ignore_failure": true } },
|
|
||||||
{ "rename":{ "field": "message2.alert", "target_field": "rule", "ignore_failure": true } },
|
{ "rename":{ "field": "message2.alert", "target_field": "rule", "ignore_failure": true } },
|
||||||
{ "rename":{ "field": "rule.signature", "target_field": "rule.name", "ignore_failure": true } },
|
{ "rename":{ "field": "rule.signature", "target_field": "rule.name", "ignore_failure": true } },
|
||||||
{ "rename":{ "field": "rule.ref", "target_field": "rule.version", "ignore_failure": true } },
|
{ "rename":{ "field": "rule.ref", "target_field": "rule.version", "ignore_failure": true } },
|
||||||
{ "pipeline": { "name": "suricata.common" } }
|
{ "rename":{ "field": "rule.signature_id", "target_field": "rule.uuid", "ignore_failure": true } },
|
||||||
|
{ "rename":{ "field": "rule.signature_id", "target_field": "rule.signature", "ignore_failure": true } },
|
||||||
|
{ "rename":{ "field": "message2.payload_printable", "target_field": "network.data.decoded", "ignore_failure": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
{
|
{
|
||||||
"description" : "suricata.common",
|
"description" : "suricata.common",
|
||||||
"processors" : [
|
"processors" : [
|
||||||
|
{ "json": { "field": "message", "target_field": "message2", "ignore_failure": true } },
|
||||||
{ "rename":{ "field": "message2.proto", "target_field": "network.transport", "ignore_failure": true } },
|
{ "rename":{ "field": "message2.proto", "target_field": "network.transport", "ignore_failure": true } },
|
||||||
{ "rename":{ "field": "message2.flow_id", "target_field": "event.id", "ignore_failure": true } },
|
{ "rename":{ "field": "message2.flow_id", "target_field": "log.id.uid", "ignore_failure": true } },
|
||||||
{ "rename":{ "field": "message2.src_ip", "target_field": "source.ip", "ignore_failure": true } },
|
{ "rename":{ "field": "message2.src_ip", "target_field": "source.ip", "ignore_failure": true } },
|
||||||
{ "rename":{ "field": "message2.src_port", "target_field": "source.port", "ignore_failure": true } },
|
{ "rename":{ "field": "message2.src_port", "target_field": "source.port", "ignore_failure": true } },
|
||||||
{ "rename":{ "field": "message2.dest_ip", "target_field": "destination.ip", "ignore_failure": true } },
|
{ "rename":{ "field": "message2.dest_ip", "target_field": "destination.ip", "ignore_failure": true } },
|
||||||
{ "rename":{ "field": "message2.dest_port", "target_field": "destination.port", "ignore_failure": true } },
|
{ "rename":{ "field": "message2.dest_port", "target_field": "destination.port", "ignore_failure": true } },
|
||||||
{ "rename": { "field": "message2.community_id", "target_field": "network.community_id", "ignore_missing": true } },
|
{ "rename": { "field": "message2.community_id", "target_field": "network.community_id", "ignore_missing": true } },
|
||||||
|
{ "remove":{ "field": "dataset", "ignore_failure": true } },
|
||||||
|
{ "rename":{ "field": "message2.event_type", "target_field": "dataset", "ignore_failure": true } },
|
||||||
{ "set": { "field": "observer.name", "value": "{{agent.name}}" } },
|
{ "set": { "field": "observer.name", "value": "{{agent.name}}" } },
|
||||||
{ "remove": { "field": ["agent"], "ignore_failure": true } },
|
{ "remove":{ "field": "agent", "ignore_failure": true } },
|
||||||
{ "pipeline": { "name": "common" } }
|
{ "pipeline": { "name": "suricata.{{dataset}}" } }
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
14
salt/elasticsearch/files/ingest/suricata.dhcp
Normal file
14
salt/elasticsearch/files/ingest/suricata.dhcp
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.dhcp",
|
||||||
|
"processors" : [
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dhcp.assigned_ip", "target_field": "dhcp.assigned_ip", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dhcp.client_mac", "target_field": "host.mac", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dhcp.dhcp_type", "target_field": "dhcp.message_types", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dhcp.assigned_ip", "target_field": "dhcp.assigned_ip", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dhcp.type", "target_field": "dhcp.type", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dhcp.id", "target_field": "dhcp.id", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
8
salt/elasticsearch/files/ingest/suricata.dnp3
Normal file
8
salt/elasticsearch/files/ingest/suricata.dnp3
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.dnp3",
|
||||||
|
"processors" : [
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
14
salt/elasticsearch/files/ingest/suricata.dns
Normal file
14
salt/elasticsearch/files/ingest/suricata.dns
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.dns",
|
||||||
|
"processors" : [
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dns.type", "target_field": "dns.type", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dns.tx_id", "target_field": "dns.id", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dns.version", "target_field": "dns.version", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.dns.rrname", "target_field": "dns.query.name", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.grouped.A", "target_field": "dns.answers", "ignore_missing": true } },
|
||||||
|
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
8
salt/elasticsearch/files/ingest/suricata.fileinfo
Normal file
8
salt/elasticsearch/files/ingest/suricata.fileinfo
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.fileinfo",
|
||||||
|
"processors" : [
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
14
salt/elasticsearch/files/ingest/suricata.flow
Normal file
14
salt/elasticsearch/files/ingest/suricata.flow
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.flow",
|
||||||
|
"processors" : [
|
||||||
|
{ "set": { "field": "dataset", "value": "conn" } },
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.flow.state", "target_field": "connection.state", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.flow.bytes_toclient", "target_field": "server.ip_bytes", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.flow.bytes_toserver", "target_field": "client.ip_bytes", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.flow.start", "target_field": "connection.start", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.flow.end", "target_field": "connection.end", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
14
salt/elasticsearch/files/ingest/suricata.ftp
Normal file
14
salt/elasticsearch/files/ingest/suricata.ftp
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.ftp",
|
||||||
|
"processors" : [
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.ftp.reply", "target_field": "server.reply_message", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.ftp.completion_code", "target_field": "server.reply_code", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.ftp.reply_received", "target_field": "server.reply_received", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.ftp.command", "target_field": "ftp.command", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.ftp.command_data", "target_field": "ftp.command_data", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.ftp.dynamic_port", "target_field": "ftp.data_channel_destination.port", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
17
salt/elasticsearch/files/ingest/suricata.http
Normal file
17
salt/elasticsearch/files/ingest/suricata.http
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.http",
|
||||||
|
"processors" : [
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.http.hostname", "target_field": "http.virtual_host", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.http.http_user_agent", "target_field": "http.useragent", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.http.url", "target_field": "http.uri", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.http.http_content_type", "target_field": "file.resp_mime_types", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.http.http_refer", "target_field": "http.referrer", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.http.http_method", "target_field": "http.method", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.http.protocol", "target_field": "http.version", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.http.status", "target_field": "http.status_code", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.http.length", "target_field": "http.request.body.length", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
8
salt/elasticsearch/files/ingest/suricata.ikev2
Normal file
8
salt/elasticsearch/files/ingest/suricata.ikev2
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.ikev2",
|
||||||
|
"processors" : [
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
8
salt/elasticsearch/files/ingest/suricata.krb5
Normal file
8
salt/elasticsearch/files/ingest/suricata.krb5
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.krb5",
|
||||||
|
"processors" : [
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
8
salt/elasticsearch/files/ingest/suricata.nfs
Normal file
8
salt/elasticsearch/files/ingest/suricata.nfs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"description" : "suricata.nfs",
|
||||||
|
"processors" : [
|
||||||
|
{ "rename": { "field": "message2.proto", "target_field": "network.transport", "ignore_missing": true } },
|
||||||
|
{ "rename": { "field": "message2.app_proto", "target_field": "network.protocol", "ignore_missing": true } },
|
||||||
|
{ "pipeline": { "name": "common" } }
|
||||||
|
]
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user