Compare commits
1176 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1b5cd4f53a | |||
| acc6715f90 | |||
| b6af59d9b0 | |||
| 8ce70e1f18 | |||
| 98eab906af | |||
| d558f20715 | |||
| 967138cdff | |||
| c76ac717f2 | |||
| a671ac387a | |||
| 1043315e6b | |||
| fc0e3c0124 | |||
| 32c1d6f95c | |||
| c25aed9a2b | |||
| d79e27774c | |||
| 194178a250 | |||
| d78b55873d | |||
| f3ba28062b | |||
| 2434ce14d3 | |||
| 66be04e78a | |||
| 62e9472f1a | |||
| c699c2fe2a | |||
| a35889ebdc | |||
| 8995752c27 | |||
| 57e76232ec | |||
| d7a14d9e00 | |||
| 6b90961e87 | |||
| 6547afe6c0 | |||
| 3a5c6ee43a | |||
| 0f08d5d640 | |||
| f85dd910a3 | |||
| c1ab8952eb | |||
| dfe399291f | |||
| 70a36bafa5 | |||
| 381d95e032 | |||
| cd8a74290b | |||
| d91eaa9ae5 | |||
| 8c7933cd60 | |||
| 88f461042d | |||
| ea085c5ff6 | |||
| 19232124f2 | |||
| e8b67da08b | |||
| b5d19bd561 | |||
| d546d52069 | |||
| 13cc8c4258 | |||
| 9d3f6059ee | |||
| 43855b8ca2 | |||
| ec3cc7a854 | |||
| 63be7ef6ca | |||
| b8aad7f5e6 | |||
| c02e491609 | |||
| 670cd19051 | |||
| 8c44481ee1 | |||
| a8c94a891b | |||
| ff35946050 | |||
| 95d32cb076 | |||
| 018186ccbd | |||
| 5040df7551 | |||
| c3604f6e80 | |||
| 7a21b7903d | |||
| a77a53f20b | |||
| ee45fc31a2 | |||
| ceae22adab | |||
| 202eb7e876 | |||
| 89a9c30cc8 | |||
| 7012ff6609 | |||
| 621da9e7e3 | |||
| 26bb0d064f | |||
| 9ee64f93ca | |||
| 641ff95f41 | |||
| 49115cde55 | |||
| 7d0e1c92a3 | |||
| 419acab48a | |||
| 528572c15b | |||
| d72e4ae97d | |||
| 76c0b881ff | |||
| 836c49b755 | |||
| 24def3a196 | |||
| b6d58b2fb8 | |||
| 770a74c83d | |||
| 039d5ae9aa | |||
| 2fb73cd516 | |||
| 2427344dca | |||
| 62cb661bab | |||
| 1e04199ea6 | |||
| 4666916077 | |||
| f094b1162d | |||
| ae9619f0c3 | |||
| 87cc389088 | |||
| ec046a6943 | |||
| 7eefe7b79c | |||
| c4fea9cb9d | |||
| 3fded86aa1 | |||
| 05e7c32cf9 | |||
| af2ff2b07c | |||
| b47d915cb6 | |||
| 376d525ad7 | |||
| 9c854a13cc | |||
| ff780738fd | |||
| 2c8d413f16 | |||
| 48801da44e | |||
| 641b8ef0b6 | |||
| 036a21ff17 | |||
| 2abf434ebe | |||
| 4dc477cc1d | |||
| 0bba68769b | |||
| e25d1c0ff3 | |||
| f9ace4791f | |||
| 7cb9b5f257 | |||
| c95af6b992 | |||
| 2fc4d2923d | |||
| eeeae08ec8 | |||
| 220f25e206 | |||
| fa3a79a787 | |||
| ca71add51b | |||
| 3fa3f83007 | |||
| 377802410e | |||
| 2e0ea3f374 | |||
| 508260bd46 | |||
| a1e963f834 | |||
| 8a98040008 | |||
| 47e611682a | |||
| 5bac1e4d15 | |||
| ad025b9683 | |||
| 3e97ddc22d | |||
| 151e8bfc4e | |||
| a914a02273 | |||
| bb3632d1b2 | |||
| 66bb1272ae | |||
| bbef96ac25 | |||
| f9cbde10a6 | |||
| fe1bae96ed | |||
| eab6173a31 | |||
| 98499c3963 | |||
| 26da525ebe | |||
| c65c9777bd | |||
| af68af7f18 | |||
| 0c11a9b733 | |||
| 59d077f3ff | |||
| 6383712731 | |||
| e067b7134e | |||
| 183c530c82 | |||
| 33d68478b6 | |||
| 22c0323bda | |||
| 19114c1a26 | |||
| 11b8e13418 | |||
| 6fdd7b3751 | |||
| 30c3255cb2 | |||
| 35ebbc974c | |||
| f1d0db8171 | |||
| 9968d697f3 | |||
| 02c54a264d | |||
| e814a3409f | |||
| 55847c7bdc | |||
| 598515e5b4 | |||
| 692625f8cd | |||
| f8ae3f12e6 | |||
| 3780ed1b4f | |||
| 8d269fee30 | |||
| 35157f2e8b | |||
| 60f1947eb4 | |||
| ffaab4a1b4 | |||
| 70e1309c9f | |||
| 5c0045f9f8 | |||
| b66be9c226 | |||
| 651393988a | |||
| cf19c8f8c2 | |||
| ba3ae92702 | |||
| 8e2bed7f91 | |||
| 028b69c7d4 | |||
| 0cf913a7c1 | |||
| 13fbcd712b | |||
| 0aae107155 | |||
| d2dcf7e7c1 | |||
| 6efdf1b9d0 | |||
| a11259c683 | |||
| 863db14b61 | |||
| 335aaa5594 | |||
| 07ed93de19 | |||
| 8093e5ce7c | |||
| 585fba4bc6 | |||
| b8f69b5008 | |||
| aebfb19ab7 | |||
| 490669d378 | |||
| 3434d0f200 | |||
| 765a22e6f0 | |||
| 546c562ef0 | |||
| b64d4e3658 | |||
| 0fb00d569e | |||
| b64fa51268 | |||
| 1871d48f7f | |||
| b010919099 | |||
| ce2a7135cb | |||
| 0fed757b11 | |||
| 1a3b3b21fb | |||
| d86e21c751 | |||
| e408718230 | |||
| ee848b8a8c | |||
| a60c34d548 | |||
| 8a2fc5d62b | |||
| da56a421e5 | |||
| bfb0d0ddb5 | |||
| c812c3991e | |||
| ca9dad396f | |||
| a615fc8e47 | |||
| ac38f32e32 | |||
| f2d1b9ac95 | |||
| 14a6280531 | |||
| 41300af944 | |||
| 21e91a7537 | |||
| 4127e0fc53 | |||
| d090852895 | |||
| 78915f900b | |||
| 8cc19b0748 | |||
| fe690922de | |||
| 257a471383 | |||
| bee83a320b | |||
| b45e114ef2 | |||
| b14614ae53 | |||
| 8381fa1d42 | |||
| a3eeba4761 | |||
| 97587064f8 | |||
| ae01da780e | |||
| 60b0af5ab7 | |||
| 0e22acc255 | |||
| 655eea2b00 | |||
| ce05f29dc4 | |||
| 7e12167b52 | |||
| 706a6e2d56 | |||
| a4dc482372 | |||
| f4191fb7fa | |||
| d2063c7e11 | |||
| c01a9006a6 | |||
| f118e25e8c | |||
| d40bbf6b09 | |||
| 0455063a39 | |||
| 532b2c222a | |||
| 67ea7d31e1 | |||
| a1b1294247 | |||
| 1c3d3d703c | |||
| 9c3e3f8e06 | |||
| 48e5cf7e67 | |||
| bd61ee22be | |||
| 4f8a0c4173 | |||
| 6b0fbe4634 | |||
| 2616a2bba3 | |||
| c10e686ec6 | |||
| a8ec3717c4 | |||
| 7dc855bbbe | |||
| 1ef4d2cde1 | |||
| 8c5aa4a0e6 | |||
| 5879eeabfa | |||
| 022ee36bca | |||
| aacd689bae | |||
| 388c90f641 | |||
| c22f9687fb | |||
| 0a88c812e8 | |||
| e28ff38d39 | |||
| ab1d97c985 | |||
| 4a489afb89 | |||
| c957c6ce14 | |||
| e57cc03084 | |||
| 3a0590f950 | |||
| 43e4cf632a | |||
| 92c6229e00 | |||
| 8252924203 | |||
| bdb88cc87b | |||
| f4be5641da | |||
| 4484e2d031 | |||
| b8dc9ea560 | |||
| d4bffba736 | |||
| d2d0d53eef | |||
| 31a49268cb | |||
| 2f51349ff8 | |||
| a885baf960 | |||
| 3f2793088a | |||
| 0f24c8e8bb | |||
| 8a751e097d | |||
| 4a582804b0 | |||
| f278056493 | |||
| f2c665e4fa | |||
| ce32a0081e | |||
| 658d132c38 | |||
| 7d2f39a06f | |||
| 84d5d52ec8 | |||
| 563a495725 | |||
| 9e18fe64cf | |||
| 708a681ed9 | |||
| a40937409a | |||
| b8d374b2af | |||
| fa31bd4bf7 | |||
| 847aab2712 | |||
| 710b800bc2 | |||
| c92b359b79 | |||
| e2fd371886 | |||
| 5b453ca972 | |||
| 6784bdcb54 | |||
| 7e4036f2a5 | |||
| 421cfc46ad | |||
| 0d4a49a0ff | |||
| 6453a86c2a | |||
| d657bbdc18 | |||
| 8aeb4706e1 | |||
| e04ec1042a | |||
| e77e5c3cea | |||
| 222352b4b3 | |||
| 4ac95447eb | |||
| 9cba9d9ae0 | |||
| 056072af7d | |||
| fb3fee5d4b | |||
| e7be8991f1 | |||
| 09dd3f529b | |||
| 488c4d5000 | |||
| abad833c5e | |||
| 4363e71e80 | |||
| 7971d9749a | |||
| 5ebe33d45f | |||
| 4887eb4957 | |||
| 0620919241 | |||
| e84d624d23 | |||
| 45bc2ec380 | |||
| 9bf7b9bda5 | |||
| ab19fa9ece | |||
| 53d7d69135 | |||
| b22776dc5a | |||
| dc6d9d4ba2 | |||
| 075ef5e02c | |||
| 16da0b469a | |||
| 5c2c2908b8 | |||
| ad9da07de1 | |||
| d1210e946c | |||
| 5d6fe4d9ae | |||
| 193f9c08fb | |||
| 4808c21cf4 | |||
| 4106d1f69d | |||
| 007720132b | |||
| f3a58cd336 | |||
| faca36e74c | |||
| f38b77892b | |||
| 00297cd864 | |||
| ce63e47fcd | |||
| d53489d674 | |||
| 1fb3a59573 | |||
| a5e60363cf | |||
| 3f054031a0 | |||
| 4a54febf38 | |||
| fdb2ca4167 | |||
| 7112d53d4d | |||
| 1d83b2f2e6 | |||
| a724b95441 | |||
| 0d894b7f52 | |||
| e32d7eb127 | |||
| caced64d11 | |||
| 3ec3f8bcd8 | |||
| 4426437ad3 | |||
| 1f0f74ff04 | |||
| e43900074a | |||
| 732d2605a7 | |||
| 4d497022db | |||
| 2680a50927 | |||
| 874dab7535 | |||
| fe9917ef1c | |||
| e844cf11db | |||
| f9e272dd8f | |||
| dfe916d7c8 | |||
| c3c769922d | |||
| 30e3fbb41c | |||
| 78694807ff | |||
| 8844e305ab | |||
| 1a37c43c98 | |||
| bf78faa0f0 | |||
| 204ef7e68f | |||
| 176608d2f9 | |||
| 28dfdbf06d | |||
| a443c654e5 | |||
| 6413050f2e | |||
| fe7a940082 | |||
| e586d6b967 | |||
| 2d25e352d4 | |||
| 4297d51a2d | |||
| 1440c72559 | |||
| 00efc2f88f | |||
| d55c2f889c | |||
| e1e535b009 | |||
| 789fff561e | |||
| 58fe25623b | |||
| 553b758c61 | |||
| 6da2f117f2 | |||
| 6ad22edf8e | |||
| 2dbe679849 | |||
| 2f74b69cc3 | |||
| 4320dab856 | |||
| 036b81707b | |||
| 8455d3da6f | |||
| 3d4fd08547 | |||
| 21c80e4953 | |||
| 5c704d7e58 | |||
| 230f5868f9 | |||
| 20dedab4b2 | |||
| 9118ac2b56 | |||
| aab89d2483 | |||
| b2e75e77e8 | |||
| bcd1ccd91b | |||
| 673b45af09 | |||
| a06040c035 | |||
| e286b8f2ba | |||
| 69553f9017 | |||
| 609a2bf32e | |||
| dad541423d | |||
| b9d0d03223 | |||
| 8611d1848c | |||
| 5278601e5d | |||
| a13b3f305a | |||
| 38089c6662 | |||
| 2d863f09eb | |||
| 37b98ba188 | |||
| 65d1e57ccd | |||
| 9ae32e2bd6 | |||
| 6e8f31e083 | |||
| 3c5cd941c7 | |||
| 2ea2a4d0a7 | |||
| 90102b1148 | |||
| ec81cbd70d | |||
| 59c0109c91 | |||
| 9af2a731ca | |||
| 9b656ebbc0 | |||
| 9d3744aa25 | |||
| 9fddd56c96 | |||
| 89c4f58296 | |||
| 0ba1e7521a | |||
| 36747cf940 | |||
| 118088c35f | |||
| 63373710b4 | |||
| 209da766ba | |||
| 433cde0f9e | |||
| 9fe9256a0f | |||
| 014aeffb2a | |||
| 3b86b60207 | |||
| 0f52530d07 | |||
| 726ec72350 | |||
| 560ec9106d | |||
| a51acfc314 | |||
| 78950ebfbb | |||
| d3ae2b03f0 | |||
| dd1fa51eb5 | |||
| 682289ef23 | |||
| 593cdbd060 | |||
| 4ed0ba5040 | |||
| 2472d6a727 | |||
| 18e31a4490 | |||
| 2caca92082 | |||
| abf74e0ae4 | |||
| dc7ce5ba8f | |||
| 6b5343f582 | |||
| ca6276b922 | |||
| 3e4136e641 | |||
| 15b8e1a753 | |||
| b7197bbd16 | |||
| 8966617508 | |||
| 9319c3f2e1 | |||
| d4fbf7d6a6 | |||
| e78fcbc6cb | |||
| 27b70cbf68 | |||
| ffb54135d1 | |||
| d40a8927c3 | |||
| 9172e10dba | |||
| 1907ea805c | |||
| 80598d7f8d | |||
| 13c3e7f5ff | |||
| d4389d5057 | |||
| cf2233bbb6 | |||
| 3847863b3d | |||
| 3368789b43 | |||
| 1bc7bbc76e | |||
| e108bb9bcd | |||
| 5414b0756c | |||
| 11c827927c | |||
| 3054b8dcb9 | |||
| 399758cd5f | |||
| 1c8a8c460c | |||
| ab28cee7cf | |||
| 5a3c1f0373 | |||
| 435da77388 | |||
| da2910e36f | |||
| eb512d9aa2 | |||
| 03f5e44be7 | |||
| f153c1125d | |||
| 99b61b5e1d | |||
| 8036df4b20 | |||
| aab55c8cf6 | |||
| f3c5d26a4e | |||
| 64776936cc | |||
| c17b324108 | |||
| 72e1cbbfb6 | |||
| f102351052 | |||
| ac28f90af3 | |||
| f6c6204555 | |||
| 9873121000 | |||
| 5630b353c4 | |||
| 04ed5835ae | |||
| 407cb2a537 | |||
| b520c1abb7 | |||
| 25b11c35fb | |||
| ef0301d364 | |||
| e694019027 | |||
| 22ebb2faf6 | |||
| 0d5ed2e835 | |||
| 8ab1769d70 | |||
| 6692fffb9b | |||
| 23414599ee | |||
| 8b3a38f573 | |||
| 9ec4322bf4 | |||
| 7037fc52f8 | |||
| 0e047cffad | |||
| 44b086a028 | |||
| 4e2eb86b36 | |||
| 1cbf60825d | |||
| 2d13bf1a61 | |||
| 968fee3488 | |||
| da51fd59a0 | |||
| 3fa0a98830 | |||
| e7bef745eb | |||
| 82b335ed04 | |||
| f35f42c83d | |||
| 4adaddf13f | |||
| b6579d7d45 | |||
| 87a5d20ac9 | |||
| 2875a7a2e5 | |||
| f27ebc47c1 | |||
| 63b4bdcebe | |||
| ba3660d0da | |||
| 83265d9d6c | |||
| 527a6ba454 | |||
| f84b0a3219 | |||
| ae6997a6b7 | |||
| 9d59e4250f | |||
| 48d9c14563 | |||
| 29b64eadd4 | |||
| 5dd5f9fc1c | |||
| 44c926ba8d | |||
| 6a55a8e5c0 | |||
| 64bad0a9cf | |||
| b6dd347eb8 | |||
| a89508f1ae | |||
| ed7b674fbb | |||
| 0c2a4cbaba | |||
| 57562ad5e3 | |||
| 95581f505a | |||
| 599de60dc8 | |||
| 77101fec12 | |||
| 069d32be1a | |||
| e78e6b74ed | |||
| 16217912db | |||
| 635ddc9b21 | |||
| 18d8f0d448 | |||
| 1c42d70d30 | |||
| 282f13a774 | |||
| f867be9e04 | |||
| 4939447764 | |||
| 5a59975cb8 | |||
| 20f3cedc01 | |||
| e563d71856 | |||
| 1ca78fd297 | |||
| e76ee718e0 | |||
| 5c90a5f27e | |||
| bee429fe29 | |||
| ecbb353d68 | |||
| ed21b94c28 | |||
| 2a282a29c3 | |||
| bc09b418ca | |||
| 6f6db61a69 | |||
| 9fce80dba3 | |||
| abfec85e28 | |||
| 9aa655365b | |||
| aa56085758 | |||
| 9a3760951a | |||
| 4c8373452d | |||
| 0bb5db2e72 | |||
| 2dbc7d8485 | |||
| 858e884ec2 | |||
| 4672eeb99b | |||
| aa824e7b6c | |||
| bb2a1b9521 | |||
| 3a22ef8e86 | |||
| 54080c42fe | |||
| a1fa87c150 | |||
| 0c553633b1 | |||
| 12486599e0 | |||
| 3c16218c5a | |||
| f9850025ea | |||
| 65b76d72ca | |||
| afca15f444 | |||
| 65b9843f14 | |||
| 653e2d8205 | |||
| bbaf6df914 | |||
| bc182c1c43 | |||
| fe9b934af6 | |||
| 373298430b | |||
| 4a18eb02f3 | |||
| 0aab3e185e | |||
| b1fb05dd28 | |||
| 9437a47946 | |||
| bdf4f6190d | |||
| f24a3a51ce | |||
| ba6043392c | |||
| 60eb1611ea | |||
| 3ef6ea9155 | |||
| 2b38bc778d | |||
| e334d44c95 | |||
| 39662ccf14 | |||
| fd69d1c714 | |||
| 63eebdf6ac | |||
| e19845e41d | |||
| c1190064ad | |||
| 4f94d953c9 | |||
| 71a83c1fe9 | |||
| 5553be02ac | |||
| b20fad2839 | |||
| 16edca7834 | |||
| 2545f9907f | |||
| 4efc951eaf | |||
| d75191d679 | |||
| ee667a48c9 | |||
| 067a83a87c | |||
| d84dbf9535 | |||
| d71254ad29 | |||
| de7b7ff989 | |||
| 510900e640 | |||
| 00483018ca | |||
| 9416a14971 | |||
| c9faa1a340 | |||
| 9bda01bd29 | |||
| eead0c42d4 | |||
| 741e6039c1 | |||
| db09b465bd | |||
| a59f2ded38 | |||
| e2fe04dadc | |||
| 563bf2ff3a | |||
| 07eeb4e2a0 | |||
| 5dc5b99b05 | |||
| ba69c67dc2 | |||
| d1d5f8a2b6 | |||
| 48324911ce | |||
| 4b0126a2e7 | |||
| 8a3c2e7242 | |||
| f55c1a4078 | |||
| c4d81a249a | |||
| 4c9d172721 | |||
| 36a936d3d6 | |||
| d6164446c6 | |||
| bb7a918a16 | |||
| be254b15f2 | |||
| 83e1e3efdc | |||
| 7c48f9d6ec | |||
| f2947de0ca | |||
| d07c46f27e | |||
| 47e418a441 | |||
| 87b1207ac0 | |||
| a86cbaa6fa | |||
| c68cd6cf33 | |||
| 3071a1de41 | |||
| e75d0c8094 | |||
| 14c685ab10 | |||
| 54082858dc | |||
| 4b7e7978ef | |||
| 066de70638 | |||
| 19c6796927 | |||
| 77c9b4fb54 | |||
| 3104137190 | |||
| c8b65ecca0 | |||
| 555c881235 | |||
| 0ac9a1f9cc | |||
| 3c0554a42c | |||
| 0b19179630 | |||
| 30a14f8aaf | |||
| 877fc36013 | |||
| a892adb66f | |||
| a49b05661d | |||
| 266fc4e866 | |||
| b738325880 | |||
| ad7821391d | |||
| 1b0c146b54 | |||
| 1848a835f5 | |||
| 23cc75c68d | |||
| 17fcf12608 | |||
| 6a8737e9a2 | |||
| 9543058a2c | |||
| b66cd82110 | |||
| 41ebb403ca | |||
| c94436fcbd | |||
| a59eda319e | |||
| 8a76975d8c | |||
| 737da45e7f | |||
| df1bf8e67b | |||
| f95757c551 | |||
| 5e46138961 | |||
| dc8aa4d923 | |||
| 1d3e39b6bd | |||
| 9ad7303cf2 | |||
| b1daa22dfc | |||
| 49c4edbcbe | |||
| f4c3103f84 | |||
| a2aea5530b | |||
| 01234f87f9 | |||
| 5d4186ac07 | |||
| 425ca35a22 | |||
| fe5ca3a0c8 | |||
| 7fad710ca1 | |||
| 8d6c2600c9 | |||
| 38c7ea0801 | |||
| abe0a9ec27 | |||
| f0f8513370 | |||
| bffd24e0d5 | |||
| 71cbab8fcc | |||
| 6816d06710 | |||
| d19615f743 | |||
| 894e009b95 | |||
| 1a4515fc8a | |||
| 31696803e1 | |||
| e715dfa354 | |||
| c723a09107 | |||
| 8cf3ceeb71 | |||
| 921fc95668 | |||
| 9e42fb927d | |||
| 87d72e852c | |||
| ba2782c5e7 | |||
| 9169fca9f8 | |||
| 1028fb1346 | |||
| 6846487909 | |||
| 2cc0c4c0ac | |||
| 5a5b643155 | |||
| e97bec2bc1 | |||
| 78db64a419 | |||
| 55d32c5b98 | |||
| 333213d1dd | |||
| 03b16a5582 | |||
| 20c76abac4 | |||
| 4158e18675 | |||
| f0c391e801 | |||
| 922a77ac55 | |||
| a62f96595c | |||
| fb8a79e112 | |||
| 782a3eccfe | |||
| 2c996fe7ad | |||
| 0c177ec923 | |||
| 41f00c0aa1 | |||
| 05b30771c5 | |||
| e3249c8e4c | |||
| a0b6e1076f | |||
| 85bb5a327c | |||
| 68f5c9965a | |||
| 727d0443a2 | |||
| b915cea52f | |||
| d98a1d5ae5 | |||
| 6f5bb136ff | |||
| 695ec149f1 | |||
| 50103aebb3 | |||
| 6f81e234cd | |||
| 7732435b64 | |||
| 2cf36f1e8f | |||
| 43d63a3187 | |||
| 37116a9bdd | |||
| 6297a2632b | |||
| 5cc752f128 | |||
| 68d95cd1cb | |||
| 1a68c3cd24 | |||
| 40294e2762 | |||
| 87eec4ae88 | |||
| 676696b24a | |||
| da27fce95f | |||
| 8acc37a7d1 | |||
| 5f1b467e64 | |||
| fe7fb7f54d | |||
| 577bfac886 | |||
| 468b6e4831 | |||
| c75d209d7f | |||
| b29b264d5c | |||
| c99e7da5a7 | |||
| 60d66b973c | |||
| 304830d2ee | |||
| d7285d69a7 | |||
| 7cdd1f89d7 | |||
| b7cab1d118 | |||
| f03a472ee5 | |||
| c7a0801eed | |||
| 5e0015e9ac | |||
| 5a72c558cb | |||
| a6e907f76c | |||
| a3f79850fe | |||
| 2d3eb22057 | |||
| 8437fcd94c | |||
| 1b25db4573 | |||
| f8ed2e6e8e | |||
| f22c61a0a2 | |||
| 5069d1163c | |||
| 31edf2e8ea | |||
| 6b8893ded5 | |||
| 1f8b7bda89 | |||
| b9204cbe99 | |||
| 59233d6550 | |||
| 1ac72e5b24 | |||
| 7805ca8beb | |||
| 47b2481cdd | |||
| fa933d3f53 | |||
| 6f7914f3c4 | |||
| 0c9e230294 | |||
| f4dc73a206 | |||
| 437c9cab68 | |||
| 6da96a733f | |||
| 82796370ce | |||
| 8c16feb772 | |||
| ce1f363424 | |||
| e8860a7d2c | |||
| beb26596fd | |||
| 6a5ff04804 | |||
| ff3bb11fbb | |||
| 8be5082b60 | |||
| 5faa4f0a30 | |||
| da7770a900 | |||
| 8178338971 | |||
| 79ed17b506 | |||
| fa1d53a309 | |||
| a41b0dbfea | |||
| d28375b304 | |||
| 07c0b539d7 | |||
| d18ebd6e36 | |||
| 5a642b151b | |||
| 0aa4ea3e87 | |||
| efcef90ead | |||
| af56aa4f16 | |||
| d5257468eb | |||
| a3b0db7949 | |||
| 5f509eb2d8 | |||
| a38d561684 | |||
| 4b559ec182 | |||
| 0b209d69e5 | |||
| 2785587840 | |||
| 9f95306458 | |||
| 55bed0771b | |||
| 0b5ee49873 | |||
| 1646459052 | |||
| 8ec003d89f | |||
| 224f0606c2 | |||
| 910125f13a | |||
| 5eca1acbeb | |||
| d551faeb16 | |||
| 6a6afeef75 | |||
| 869f60ccaa | |||
| 12c82d2812 | |||
| a2b50c6d40 | |||
| ab7ae6cddd | |||
| 7a9a12ae3d | |||
| b49a296276 | |||
| 9b9321d23a | |||
| 1922ad95d5 | |||
| 11493cb615 | |||
| 0def41f03c | |||
| 1c191e426f | |||
| de98baaad4 | |||
| df0e19ff80 | |||
| d22d864ba6 | |||
| 898b352af9 | |||
| 76a8e315b7 | |||
| edaf695463 | |||
| 53fcac4a02 | |||
| 44054ba95f | |||
| 10aa77977e | |||
| 8e90658856 | |||
| 965d0543f4 | |||
| e353855855 | |||
| c54217a8cb | |||
| 710b3bac3d | |||
| 8a90579df7 | |||
| 39c8766914 | |||
| 694ea743cc | |||
| 3d9e7d1e97 | |||
| ca71c00f1c | |||
| 2f2394dca2 | |||
| fee4c20912 | |||
| 03342fd477 | |||
| 6dbff3b9df | |||
| 2f375b89a8 | |||
| f67ac80c56 | |||
| b06a35099f | |||
| 087099b9b6 | |||
| 04fe2ca996 | |||
| bdb5748b44 | |||
| 1cbe5580a6 | |||
| b57674a7cc | |||
| 53bd7bcc29 | |||
| 6787b97c6a | |||
| 0d43f9aaf4 | |||
| 40540f47bf | |||
| 24e05c9491 | |||
| 02c9465dfb | |||
| a4d484ea47 | |||
| c9d650f4c8 | |||
| 9de8814412 | |||
| 35e7659904 | |||
| ed1d2d0a8b | |||
| 903de330c2 | |||
| 8621352701 | |||
| 564ab105ba | |||
| b637e27c8d | |||
| d31ea4097d | |||
| c277b7acfa | |||
| 97a9e0989d | |||
| 6bdccec6b1 | |||
| 35945ed224 | |||
| 7319d7ae9b | |||
| 8b38cbe8cf | |||
| 35ea084466 | |||
| c89582ffb6 | |||
| d6db94a4d4 | |||
| e2acf027a9 | |||
| d6d8ba7479 | |||
| 41a4321b03 | |||
| 2ae049071d | |||
| e82df53997 | |||
| 273e78da94 | |||
| 446376395e | |||
| a13001dce0 | |||
| 8819e1d4d6 | |||
| 1baea3bcd5 | |||
| 1c37c05824 | |||
| cd1db36c13 | |||
| 5898c9ef31 | |||
| 951f04c265 | |||
| 4b069d91ab | |||
| 34ab949dfc | |||
| 59191008a0 | |||
| 17a04a75c9 | |||
| 7561ec0512 | |||
| 884d669ae9 | |||
| 8a88b16b9e | |||
| 6545ae588d | |||
| 5ab54fcfc5 | |||
| ae4befe377 | |||
| 0c320e3501 | |||
| 933f4fa6c8 | |||
| d80c88f613 | |||
| 6d2e851a43 | |||
| 209aae50bc | |||
| eef1b40436 | |||
| 34db6fb823 | |||
| eeaf077baf | |||
| 120d21c0da | |||
| 6fc988740d | |||
| 66457ad8f8 | |||
| 69670c481d | |||
| cae011babb | |||
| 02ea939abc | |||
| be028aa23e | |||
| 24b7f7a7ce | |||
| 12cce111db | |||
| add72d7a5c | |||
| c7a1d4758b | |||
| 8436b647dd | |||
| 387ce22385 | |||
| cc3c28135d | |||
| 6b6724afcf | |||
| c37a179a3c | |||
| 77e6ee3c36 | |||
| 3e71663669 | |||
| d519369c6f | |||
| 883d9560a0 | |||
| 984971c63c | |||
| 6adef20a06 | |||
| cb8faf7c5f | |||
| 740723ecd6 | |||
| d70371c540 | |||
| b6986d5c61 | |||
| 02e6e11be7 | |||
| d26484fe1a | |||
| 12d10d7d42 | |||
| 7ea37ac2dd | |||
| 7aae72cfcf | |||
| ec427cde08 | |||
| c2efd7ef64 | |||
| 77c58e665e | |||
| 9530901d1d | |||
| e83afa3e30 | |||
| 70fb28a8b3 | |||
| 8355432356 | |||
| 2247cafe5f | |||
| 85a8da6331 | |||
| ddabab253c | |||
| 2e42eddbc2 | |||
| 07a590dda8 | |||
| ec8eac3430 | |||
| 05b84327b8 | |||
| 0607532e4a | |||
| 3018886f72 | |||
| e02bdffe34 | |||
| 5073d62ee8 | |||
| e2ff48164b | |||
| 43832f9c34 | |||
| 5da5a04025 | |||
| 25b51135fc | |||
| aa91c1fef2 | |||
| 801a5a6824 | |||
| f63c26b7f2 | |||
| 336a40d646 | |||
| bb0cfc5253 | |||
| 106aaa9c3e | |||
| ff7db0be63 | |||
| b96d3473f2 | |||
| fb27e7c479 | |||
| 261acee8a0 | |||
| a9585b2a7f | |||
| 62fa15c63e | |||
| e995576b1d | |||
| d247c9d704 | |||
| b21b545756 | |||
| 5e8748c436 | |||
| e2cca917c1 | |||
| d8700137d2 | |||
| 2c42d4b19e | |||
| a3c7e40c40 | |||
| 94fe456e28 | |||
| 662db41857 | |||
| 7623dd20b9 | |||
| 2b323ab661 | |||
| 8de01625a8 | |||
| d0d7ab57ca | |||
| f4cbe20ddf | |||
| 0d92a1594a | |||
| daaead618e | |||
| 19469205e1 | |||
| cae9e6230f | |||
| 6c4c815683 | |||
| 6769386c86 | |||
| 36272efda7 | |||
| 6b97d07a89 | |||
| da82395dcf | |||
| b5e5bd57ad | |||
| ad4fb52b81 | |||
| 4e849ecc90 | |||
| 7e37cd0f05 | |||
| 3952c1a9b7 | |||
| c13c37f406 | |||
| 9240c3c6f0 | |||
| 2aa01280e7 | |||
| 1675b787bf | |||
| 4866eb2315 | |||
| f785fb2772 | |||
| 8c9f863808 | |||
| 1751e35121 | |||
| 6676afc7de | |||
| 699ea1ac3e | |||
| 90fdb9c465 | |||
| 48291f5271 | |||
| 3a41b090c1 | |||
| 139b36b189 | |||
| 6ddf887342 | |||
| 6ba9e057a9 | |||
| 6600484f8e | |||
| b02c38175c | |||
| 4497f6561f | |||
| 0fc03baf58 | |||
| fb81c6e2e3 | |||
| ad28ea275f | |||
| 41951659ec | |||
| 451a4784a1 | |||
| 1b7095fa81 | |||
| 89d789fe0f | |||
| 49055e260f | |||
| a465039887 | |||
| b60cf29598 | |||
| 0e09d73aa0 | |||
| 520a5671ca | |||
| fc824359ed | |||
| 7caa7cec6b | |||
| 0695140f83 | |||
| ed1e2c8908 | |||
| 594900a8d4 | |||
| 6894fa4e4d | |||
| 2334d82d36 | |||
| c0a2ea3138 | |||
| d4acb1a33a | |||
| 5de9e5baf4 | |||
| 3a34da354f | |||
| 469390696e | |||
| 0a4a48b61e | |||
| 58a63e0765 | |||
| 251bc6f45e | |||
| b84d997f87 | |||
| b5bccc5e05 | |||
| b4e5ac9796 | |||
| 2db95fe1b4 | |||
| 934b0f45a1 | |||
| a88227d13f | |||
| 21a7b76352 | |||
| 03082339ca | |||
| 8f6226b531 | |||
| 2c4eccd7e0 | |||
| fa57494694 | |||
| 3f1741e75a | |||
| 48331ce35b | |||
| c2ac60b82e | |||
| fedfbe9fec | |||
| 9947f9def4 | |||
| c205438771 | |||
| 8cde05807c | |||
| 2ac0aba916 | |||
| af003cc2a1 | |||
| 0d4f6b4fe6 | |||
| 7093254439 | |||
| bd7644a557 | |||
| 90b740a997 | |||
| 5547a1b7ab | |||
| 1b90fd8581 | |||
| bbdf7bb5a7 | |||
| fb8ad71b27 | |||
| e43b7607bb | |||
| a265c06e31 | |||
| 2aa954cb0a | |||
| 73812b11a3 | |||
| 38ab426470 | |||
| d0a6881c2c | |||
| c7c4e65df1 | |||
| 49b150797d | |||
| 57268ba934 | |||
| 1208915896 | |||
| 42f5ad9939 | |||
| 8e0d895afb | |||
| 998c85e3f8 | |||
| 32f3ee0b01 | |||
| a90aed25fb | |||
| ae14e4870d | |||
| 273a1d7e9c | |||
| b3f8ed7dcd | |||
| ad5a424c03 | |||
| e06787445c | |||
| 8a4f5d6dcb | |||
| 81dd951064 | |||
| c12f138899 | |||
| 884a7041af | |||
| 023008c54c | |||
| 6f7de954d9 | |||
| 46371aaaf5 | |||
| 1fde2e2755 | |||
| 1aad9d1b2f | |||
| 9703e70163 | |||
| f6735207d7 | |||
| e5f76a9c6e | |||
| d1c86cb9ff | |||
| 8ccb24dda2 | |||
| 932054e9da | |||
| 8b35002169 | |||
| f68527d366 | |||
| 81e3d26540 | |||
| 96b60fa39a | |||
| f172a74fbc | |||
| c4be56ec7b | |||
| 96195806ab | |||
| 88bbd3440d | |||
| 495a9c0783 | |||
| 905bc564fc | |||
| f6f387428f | |||
| db5abcb3cf | |||
| 27e310c2a1 | |||
| 236eb0cbcc | |||
| 841d0b4b1f | |||
| 272f97e2d7 | |||
| eac9a3fc86 | |||
| 32dc26f2e7 | |||
| 1b14142e4c | |||
| 2fef1d5fa7 | |||
| 3bbfc3865d | |||
| 6947fd6414 | |||
| d3e5be78fd | |||
| 09e005127e | |||
| d3ea596deb | |||
| d6d315e8d5 | |||
| 162a32fd08 | |||
| f765dc23ea |
@@ -1,18 +1,18 @@
|
|||||||
### 2.4.2-20230531 ISO image built on 2023/05/31
|
### 2.4.20-20231012 ISO image released on 2023/10/12
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Download and Verify
|
### Download and Verify
|
||||||
|
|
||||||
2.4.2-20230531 ISO image:
|
2.4.20-20231012 ISO image:
|
||||||
https://download.securityonion.net/file/securityonion/securityonion-2.4.2-20230531.iso
|
https://download.securityonion.net/file/securityonion/securityonion-2.4.20-20231012.iso
|
||||||
|
|
||||||
MD5: EB861EFB7F7DA6FB418075B4C452E4EB
|
MD5: 7D6ACA843068BA9432B3FF63BFD1EF0F
|
||||||
SHA1: 479A72DBB0633CB23608122F7200A24E2C3C3128
|
SHA1: BEF2B906066A1B04921DF0B80E7FDD4BC8ECED5C
|
||||||
SHA256: B69C1AE4C576BBBC37F4B87C2A8379903421E65B2C4F24C90FABB0EAD6F0471B
|
SHA256: 5D511D50F11666C69AE12435A47B9A2D30CB3CC88F8D38DC58A5BC0ECADF1BF5
|
||||||
|
|
||||||
Signature for ISO image:
|
Signature for ISO image:
|
||||||
https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.2-20230531.iso.sig
|
https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.20-20231012.iso.sig
|
||||||
|
|
||||||
Signing key:
|
Signing key:
|
||||||
https://raw.githubusercontent.com/Security-Onion-Solutions/securityonion/2.4/main/KEYS
|
https://raw.githubusercontent.com/Security-Onion-Solutions/securityonion/2.4/main/KEYS
|
||||||
@@ -26,22 +26,22 @@ wget https://raw.githubusercontent.com/Security-Onion-Solutions/securityonion/2.
|
|||||||
|
|
||||||
Download the signature file for the ISO:
|
Download the signature file for the ISO:
|
||||||
```
|
```
|
||||||
wget https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.2-20230531.iso.sig
|
wget https://github.com/Security-Onion-Solutions/securityonion/raw/2.4/main/sigs/securityonion-2.4.20-20231012.iso.sig
|
||||||
```
|
```
|
||||||
|
|
||||||
Download the ISO image:
|
Download the ISO image:
|
||||||
```
|
```
|
||||||
wget https://download.securityonion.net/file/securityonion/securityonion-2.4.2-20230531.iso
|
wget https://download.securityonion.net/file/securityonion/securityonion-2.4.20-20231012.iso
|
||||||
```
|
```
|
||||||
|
|
||||||
Verify the downloaded ISO image using the signature file:
|
Verify the downloaded ISO image using the signature file:
|
||||||
```
|
```
|
||||||
gpg --verify securityonion-2.4.2-20230531.iso.sig securityonion-2.4.2-20230531.iso
|
gpg --verify securityonion-2.4.20-20231012.iso.sig securityonion-2.4.20-20231012.iso
|
||||||
```
|
```
|
||||||
|
|
||||||
The output should show "Good signature" and the Primary key fingerprint should match what's shown below:
|
The output should show "Good signature" and the Primary key fingerprint should match what's shown below:
|
||||||
```
|
```
|
||||||
gpg: Signature made Wed 31 May 2023 05:01:41 PM EDT using RSA key ID FE507013
|
gpg: Signature made Thu 12 Oct 2023 01:28:32 PM EDT using RSA key ID FE507013
|
||||||
gpg: Good signature from "Security Onion Solutions, LLC <info@securityonionsolutions.com>"
|
gpg: Good signature from "Security Onion Solutions, LLC <info@securityonionsolutions.com>"
|
||||||
gpg: WARNING: This key is not certified with a trusted signature!
|
gpg: WARNING: This key is not certified with a trusted signature!
|
||||||
gpg: There is no indication that the signature belongs to the owner.
|
gpg: There is no indication that the signature belongs to the owner.
|
||||||
@@ -49,4 +49,4 @@ Primary key fingerprint: C804 A93D 36BE 0C73 3EA1 9644 7C10 60B7 FE50 7013
|
|||||||
```
|
```
|
||||||
|
|
||||||
Once you've verified the ISO image, you're ready to proceed to our Installation guide:
|
Once you've verified the ISO image, you're ready to proceed to our Installation guide:
|
||||||
https://docs.securityonion.net/en/2.4/installation.html
|
https://docs.securityonion.net/en/2.4/installation.html
|
||||||
@@ -1,20 +1,26 @@
|
|||||||
## Security Onion 2.4 Beta 3
|
## Security Onion 2.4
|
||||||
|
|
||||||
Security Onion 2.4 Beta 3 is here!
|
Security Onion 2.4 is here!
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
Alerts
|
Alerts
|
||||||

|

|
||||||
|
|
||||||
Dashboards
|
Dashboards
|
||||||

|

|
||||||
|
|
||||||
Hunt
|
Hunt
|
||||||

|

|
||||||
|
|
||||||
Cases
|
PCAP
|
||||||

|

|
||||||
|
|
||||||
|
Grid
|
||||||
|

|
||||||
|
|
||||||
|
Config
|
||||||
|

|
||||||
|
|
||||||
### Release Notes
|
### Release Notes
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
logrotate:
|
|
||||||
conf: |
|
|
||||||
daily
|
|
||||||
rotate 14
|
|
||||||
missingok
|
|
||||||
copytruncate
|
|
||||||
compress
|
|
||||||
create
|
|
||||||
extension .log
|
|
||||||
dateext
|
|
||||||
dateyesterday
|
|
||||||
group_conf: |
|
|
||||||
su root socore
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
{% set cached_grains = salt.saltutil.runner('cache.grains', tgt='*') %}
|
{% set cached_grains = salt.saltutil.runner('cache.grains', tgt='*') %}
|
||||||
{% for minionid, ip in salt.saltutil.runner(
|
{% for minionid, ip in salt.saltutil.runner(
|
||||||
'mine.get',
|
'mine.get',
|
||||||
tgt='G@role:so-manager or G@role:so-managersearch or G@role:so-standalone or G@role:so-searchnode or G@role:so-heavynode or G@role:so-receiver or G@role:so-helix ',
|
tgt='G@role:so-manager or G@role:so-managersearch or G@role:so-standalone or G@role:so-searchnode or G@role:so-heavynode or G@role:so-receiver or G@role:so-fleet ',
|
||||||
fun='network.ip_addrs',
|
fun='network.ip_addrs',
|
||||||
tgt_type='compound') | dictsort()
|
tgt_type='compound') | dictsort()
|
||||||
%}
|
%}
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Copyright Jason Ertel (github.com/jertel).
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with
|
||||||
|
# the Elastic License 2.0.
|
||||||
|
|
||||||
|
# Note: Per the Elastic License 2.0, the second limitation states:
|
||||||
|
#
|
||||||
|
# "You may not move, change, disable, or circumvent the license key functionality
|
||||||
|
# in the software, and you may not remove or obscure any functionality in the
|
||||||
|
# software that is protected by the license key."
|
||||||
|
|
||||||
|
# This file is generated by Security Onion and contains a list of license-enabled features.
|
||||||
|
features: []
|
||||||
@@ -4,14 +4,9 @@ base:
|
|||||||
- global.adv_global
|
- global.adv_global
|
||||||
- docker.soc_docker
|
- docker.soc_docker
|
||||||
- docker.adv_docker
|
- docker.adv_docker
|
||||||
- firewall.soc_firewall
|
|
||||||
- firewall.adv_firewall
|
|
||||||
- influxdb.token
|
- influxdb.token
|
||||||
- logrotate.soc_logrotate
|
- logrotate.soc_logrotate
|
||||||
- logrotate.adv_logrotate
|
- logrotate.adv_logrotate
|
||||||
- nginx.soc_nginx
|
|
||||||
- nginx.adv_nginx
|
|
||||||
- node_data.ips
|
|
||||||
- ntp.soc_ntp
|
- ntp.soc_ntp
|
||||||
- ntp.adv_ntp
|
- ntp.adv_ntp
|
||||||
- patch.needs_restarting
|
- patch.needs_restarting
|
||||||
@@ -22,6 +17,13 @@ base:
|
|||||||
- telegraf.soc_telegraf
|
- telegraf.soc_telegraf
|
||||||
- telegraf.adv_telegraf
|
- telegraf.adv_telegraf
|
||||||
|
|
||||||
|
'* and not *_desktop':
|
||||||
|
- firewall.soc_firewall
|
||||||
|
- firewall.adv_firewall
|
||||||
|
- nginx.soc_nginx
|
||||||
|
- nginx.adv_nginx
|
||||||
|
- node_data.ips
|
||||||
|
|
||||||
'*_manager or *_managersearch':
|
'*_manager or *_managersearch':
|
||||||
- match: compound
|
- match: compound
|
||||||
{% if salt['file.file_exists']('/opt/so/saltstack/local/pillar/elasticsearch/auth.sls') %}
|
{% if salt['file.file_exists']('/opt/so/saltstack/local/pillar/elasticsearch/auth.sls') %}
|
||||||
@@ -40,6 +42,7 @@ base:
|
|||||||
- logstash.adv_logstash
|
- logstash.adv_logstash
|
||||||
- soc.soc_soc
|
- soc.soc_soc
|
||||||
- soc.adv_soc
|
- soc.adv_soc
|
||||||
|
- soc.license
|
||||||
- soctopus.soc_soctopus
|
- soctopus.soc_soctopus
|
||||||
- soctopus.adv_soctopus
|
- soctopus.adv_soctopus
|
||||||
- kibana.soc_kibana
|
- kibana.soc_kibana
|
||||||
@@ -103,6 +106,7 @@ base:
|
|||||||
- idstools.adv_idstools
|
- idstools.adv_idstools
|
||||||
- soc.soc_soc
|
- soc.soc_soc
|
||||||
- soc.adv_soc
|
- soc.adv_soc
|
||||||
|
- soc.license
|
||||||
- soctopus.soc_soctopus
|
- soctopus.soc_soctopus
|
||||||
- soctopus.adv_soctopus
|
- soctopus.adv_soctopus
|
||||||
- kibana.soc_kibana
|
- kibana.soc_kibana
|
||||||
@@ -161,6 +165,7 @@ base:
|
|||||||
- manager.adv_manager
|
- manager.adv_manager
|
||||||
- soc.soc_soc
|
- soc.soc_soc
|
||||||
- soc.adv_soc
|
- soc.adv_soc
|
||||||
|
- soc.license
|
||||||
- soctopus.soc_soctopus
|
- soctopus.soc_soctopus
|
||||||
- soctopus.adv_soctopus
|
- soctopus.adv_soctopus
|
||||||
- kibana.soc_kibana
|
- kibana.soc_kibana
|
||||||
@@ -258,6 +263,7 @@ base:
|
|||||||
- manager.adv_manager
|
- manager.adv_manager
|
||||||
- soc.soc_soc
|
- soc.soc_soc
|
||||||
- soc.adv_soc
|
- soc.adv_soc
|
||||||
|
- soc.license
|
||||||
- soctopus.soc_soctopus
|
- soctopus.soc_soctopus
|
||||||
- soctopus.adv_soctopus
|
- soctopus.adv_soctopus
|
||||||
- kibana.soc_kibana
|
- kibana.soc_kibana
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ import subprocess
|
|||||||
|
|
||||||
def check():
|
def check():
|
||||||
|
|
||||||
os = __grains__['os']
|
osfam = __grains__['os_family']
|
||||||
retval = 'False'
|
retval = 'False'
|
||||||
|
|
||||||
if os == 'Ubuntu':
|
if osfam == 'Debian':
|
||||||
if path.exists('/var/run/reboot-required'):
|
if path.exists('/var/run/reboot-required'):
|
||||||
retval = 'True'
|
retval = 'True'
|
||||||
|
|
||||||
elif os == 'Rocky':
|
elif osfam == 'RedHat':
|
||||||
cmd = 'needs-restarting -r > /dev/null 2>&1'
|
cmd = 'needs-restarting -r > /dev/null 2>&1'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -46,23 +46,7 @@
|
|||||||
'pcap',
|
'pcap',
|
||||||
'suricata',
|
'suricata',
|
||||||
'healthcheck',
|
'healthcheck',
|
||||||
'schedule',
|
'elasticagent',
|
||||||
'tcpreplay',
|
|
||||||
'docker_clean'
|
|
||||||
],
|
|
||||||
'so-helixsensor': [
|
|
||||||
'salt.master',
|
|
||||||
'ca',
|
|
||||||
'ssl',
|
|
||||||
'registry',
|
|
||||||
'telegraf',
|
|
||||||
'firewall',
|
|
||||||
'idstools',
|
|
||||||
'suricata.manager',
|
|
||||||
'zeek',
|
|
||||||
'redis',
|
|
||||||
'elasticsearch',
|
|
||||||
'logstash',
|
|
||||||
'schedule',
|
'schedule',
|
||||||
'tcpreplay',
|
'tcpreplay',
|
||||||
'docker_clean'
|
'docker_clean'
|
||||||
@@ -203,7 +187,10 @@
|
|||||||
'schedule',
|
'schedule',
|
||||||
'docker_clean'
|
'docker_clean'
|
||||||
],
|
],
|
||||||
'so-workstation': [
|
'so-desktop': [
|
||||||
|
'ssl',
|
||||||
|
'docker_clean',
|
||||||
|
'telegraf'
|
||||||
],
|
],
|
||||||
}, grain='role') %}
|
}, grain='role') %}
|
||||||
|
|
||||||
@@ -244,7 +231,7 @@
|
|||||||
{% do allowed_states.append('playbook') %}
|
{% do allowed_states.append('playbook') %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if grains.role in ['so-helixsensor', 'so-manager', 'so-standalone', 'so-searchnode', 'so-managersearch', 'so-heavynode', 'so-receiver'] %}
|
{% if grains.role in ['so-manager', 'so-standalone', 'so-searchnode', 'so-managersearch', 'so-heavynode', 'so-receiver'] %}
|
||||||
{% do allowed_states.append('logstash') %}
|
{% do allowed_states.append('logstash') %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ pki_private_key:
|
|||||||
- name: /etc/pki/ca.key
|
- name: /etc/pki/ca.key
|
||||||
- keysize: 4096
|
- keysize: 4096
|
||||||
- passphrase:
|
- passphrase:
|
||||||
- cipher: aes_256_cbc
|
|
||||||
- backup: True
|
- backup: True
|
||||||
{% if salt['file.file_exists']('/etc/pki/ca.key') -%}
|
{% if salt['file.file_exists']('/etc/pki/ca.key') -%}
|
||||||
- prereq:
|
- prereq:
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
/usr/sbin/logrotate -f /opt/so/conf/log-rotate.conf > /dev/null 2>&1
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
/usr/sbin/logrotate -f /opt/so/conf/sensor-rotate.conf > /dev/null 2>&1
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
The following GUI tools are available on the analyst workstation:
|
|
||||||
|
|
||||||
chromium
|
|
||||||
url: https://www.chromium.org/Home
|
|
||||||
To run chromium, click Applications > Internet > Chromium Web Browser
|
|
||||||
|
|
||||||
Wireshark
|
|
||||||
url: https://www.wireshark.org/
|
|
||||||
To run Wireshark, click Applications > Internet > Wireshark Network Analyzer
|
|
||||||
|
|
||||||
NetworkMiner
|
|
||||||
url: https://www.netresec.com
|
|
||||||
To run NetworkMiner, click Applications > Internet > NetworkMiner
|
|
||||||
|
|
||||||
The following CLI tools are available on the analyst workstation:
|
|
||||||
|
|
||||||
bit-twist
|
|
||||||
url: http://bittwist.sourceforge.net
|
|
||||||
To run bit-twist, open a terminal and type: bittwist -h
|
|
||||||
|
|
||||||
chaosreader
|
|
||||||
url: http://chaosreader.sourceforge.net
|
|
||||||
To run chaosreader, open a terminal and type: chaosreader -h
|
|
||||||
|
|
||||||
dnsiff
|
|
||||||
url: https://www.monkey.org/~dugsong/dsniff/
|
|
||||||
To run dsniff, open a terminal and type: dsniff -h
|
|
||||||
|
|
||||||
foremost
|
|
||||||
url: http://foremost.sourceforge.net
|
|
||||||
To run foremost, open a terminal and type: foremost -h
|
|
||||||
|
|
||||||
hping3
|
|
||||||
url: http://www.hping.org/hping3.html
|
|
||||||
To run hping3, open a terminal and type: hping3 -h
|
|
||||||
|
|
||||||
netsed
|
|
||||||
url: http://silicone.homelinux.org/projects/netsed/
|
|
||||||
To run netsed, open a terminal and type: netsed -h
|
|
||||||
|
|
||||||
ngrep
|
|
||||||
url: https://github.com/jpr5/ngrep
|
|
||||||
To run ngrep, open a terminal and type: ngrep -h
|
|
||||||
|
|
||||||
scapy
|
|
||||||
url: http://www.secdev.org/projects/scapy/
|
|
||||||
To run scapy, open a terminal and type: scapy
|
|
||||||
|
|
||||||
ssldump
|
|
||||||
url: http://www.rtfm.com/ssldump/
|
|
||||||
To run ssldump, open a terminal and type: ssldump -h
|
|
||||||
|
|
||||||
sslsplit
|
|
||||||
url: https://github.com/droe/sslsplit
|
|
||||||
To run sslsplit, open a terminal and type: sslsplit -h
|
|
||||||
|
|
||||||
tcpdump
|
|
||||||
url: http://www.tcpdump.org
|
|
||||||
To run tcpdump, open a terminal and type: tcpdump -h
|
|
||||||
|
|
||||||
tcpflow
|
|
||||||
url: https://github.com/simsong/tcpflow
|
|
||||||
To run tcpflow, open a terminal and type: tcpflow -h
|
|
||||||
|
|
||||||
tcpstat
|
|
||||||
url: https://frenchfries.net/paul/tcpstat/
|
|
||||||
To run tcpstat, open a terminal and type: tcpstat -h
|
|
||||||
|
|
||||||
tcptrace
|
|
||||||
url: http://www.tcptrace.org
|
|
||||||
To run tcptrace, open a terminal and type: tcptrace -h
|
|
||||||
|
|
||||||
tcpxtract
|
|
||||||
url: http://tcpxtract.sourceforge.net/
|
|
||||||
To run tcpxtract, open a terminal and type: tcpxtract -h
|
|
||||||
|
|
||||||
whois
|
|
||||||
url: http://www.linux.it/~md/software/
|
|
||||||
To run whois, open a terminal and type: whois -h
|
|
||||||
@@ -1,13 +1,11 @@
|
|||||||
{%- set DOCKERRANGE = salt['pillar.get']('docker:range', '172.17.0.0/24') %}
|
|
||||||
{%- set DOCKERBIND = salt['pillar.get']('docker:bip', '172.17.0.1/24') %}
|
|
||||||
{
|
{
|
||||||
"registry-mirrors": [
|
"registry-mirrors": [
|
||||||
"https://:5000"
|
"https://:5000"
|
||||||
],
|
],
|
||||||
"bip": "{{ DOCKERBIND }}",
|
"bip": "172.17.0.1/24",
|
||||||
"default-address-pools": [
|
"default-address-pools": [
|
||||||
{
|
{
|
||||||
"base": "{{ DOCKERRANGE }}",
|
"base": "172.17.0.0/24",
|
||||||
"size": 24
|
"size": 24
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
{%- set logrotate_conf = salt['pillar.get']('logrotate:conf') %}
|
|
||||||
{%- set group_conf = salt['pillar.get']('logrotate:group_conf') %}
|
|
||||||
|
|
||||||
|
|
||||||
/opt/so/log/aptcacher-ng/*.log
|
|
||||||
/opt/so/log/idstools/*.log
|
|
||||||
/opt/so/log/nginx/*.log
|
|
||||||
/opt/so/log/soc/*.log
|
|
||||||
/opt/so/log/kratos/*.log
|
|
||||||
/opt/so/log/kibana/*.log
|
|
||||||
/opt/so/log/influxdb/*.log
|
|
||||||
/opt/so/log/elastalert/*.log
|
|
||||||
/opt/so/log/soctopus/*.log
|
|
||||||
/opt/so/log/curator/*.log
|
|
||||||
/opt/so/log/fleet/*.log
|
|
||||||
/opt/so/log/suricata/*.log
|
|
||||||
/opt/so/log/mysql/*.log
|
|
||||||
/opt/so/log/telegraf/*.log
|
|
||||||
/opt/so/log/redis/*.log
|
|
||||||
/opt/so/log/sensoroni/*.log
|
|
||||||
/opt/so/log/stenographer/*.log
|
|
||||||
/opt/so/log/salt/so-salt-minion-check
|
|
||||||
/opt/so/log/salt/minion
|
|
||||||
/opt/so/log/salt/master
|
|
||||||
/opt/so/log/logscan/*.log
|
|
||||||
/nsm/idh/*.log
|
|
||||||
{
|
|
||||||
{{ logrotate_conf | indent(width=4) }}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Playbook's log directory needs additional configuration
|
|
||||||
# because Playbook requires a more permissive directory
|
|
||||||
/opt/so/log/playbook/*.log
|
|
||||||
{
|
|
||||||
{{ logrotate_conf | indent(width=4) }}
|
|
||||||
{{ group_conf | indent(width=4) }}
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/opt/so/log/sensor_clean.log
|
|
||||||
{
|
|
||||||
daily
|
|
||||||
rotate 2
|
|
||||||
missingok
|
|
||||||
nocompress
|
|
||||||
create
|
|
||||||
sharedscripts
|
|
||||||
}
|
|
||||||
|
|
||||||
/nsm/strelka/log/strelka.log
|
|
||||||
{
|
|
||||||
daily
|
|
||||||
rotate 14
|
|
||||||
missingok
|
|
||||||
copytruncate
|
|
||||||
compress
|
|
||||||
create
|
|
||||||
extension .log
|
|
||||||
dateext
|
|
||||||
dateyesterday
|
|
||||||
}
|
|
||||||
@@ -10,6 +10,10 @@ include:
|
|||||||
- manager.elasticsearch # needed for elastic_curl_config state
|
- manager.elasticsearch # needed for elastic_curl_config state
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
net.core.wmem_default:
|
||||||
|
sysctl.present:
|
||||||
|
- value: 26214400
|
||||||
|
|
||||||
# Remove variables.txt from /tmp - This is temp
|
# Remove variables.txt from /tmp - This is temp
|
||||||
rmvariablesfile:
|
rmvariablesfile:
|
||||||
file.absent:
|
file.absent:
|
||||||
@@ -147,56 +151,8 @@ so-sensor-clean:
|
|||||||
- daymonth: '*'
|
- daymonth: '*'
|
||||||
- month: '*'
|
- month: '*'
|
||||||
- dayweek: '*'
|
- dayweek: '*'
|
||||||
|
|
||||||
sensorrotatescript:
|
|
||||||
file.managed:
|
|
||||||
- name: /usr/local/bin/sensor-rotate
|
|
||||||
- source: salt://common/cron/sensor-rotate
|
|
||||||
- mode: 755
|
|
||||||
|
|
||||||
sensorrotateconf:
|
|
||||||
file.managed:
|
|
||||||
- name: /opt/so/conf/sensor-rotate.conf
|
|
||||||
- source: salt://common/files/sensor-rotate.conf
|
|
||||||
- mode: 644
|
|
||||||
|
|
||||||
sensor-rotate:
|
|
||||||
cron.present:
|
|
||||||
- name: /usr/local/bin/sensor-rotate
|
|
||||||
- identifier: sensor-rotate
|
|
||||||
- user: root
|
|
||||||
- minute: '1'
|
|
||||||
- hour: '0'
|
|
||||||
- daymonth: '*'
|
|
||||||
- month: '*'
|
|
||||||
- dayweek: '*'
|
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
commonlogrotatescript:
|
|
||||||
file.managed:
|
|
||||||
- name: /usr/local/bin/common-rotate
|
|
||||||
- source: salt://common/cron/common-rotate
|
|
||||||
- mode: 755
|
|
||||||
|
|
||||||
commonlogrotateconf:
|
|
||||||
file.managed:
|
|
||||||
- name: /opt/so/conf/log-rotate.conf
|
|
||||||
- source: salt://common/files/log-rotate.conf
|
|
||||||
- template: jinja
|
|
||||||
- mode: 644
|
|
||||||
|
|
||||||
common-rotate:
|
|
||||||
cron.present:
|
|
||||||
- name: /usr/local/bin/common-rotate
|
|
||||||
- identifier: common-rotate
|
|
||||||
- user: root
|
|
||||||
- minute: '1'
|
|
||||||
- hour: '0'
|
|
||||||
- daymonth: '*'
|
|
||||||
- month: '*'
|
|
||||||
- dayweek: '*'
|
|
||||||
|
|
||||||
# Create the status directory
|
# Create the status directory
|
||||||
sostatusdir:
|
sostatusdir:
|
||||||
file.directory:
|
file.directory:
|
||||||
@@ -239,7 +195,7 @@ soversionfile:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if GLOBALS.so_model and GLOBALS.so_model not in ['SO2AMI01', 'SO2AZI01', 'SO2GCI01'] %}
|
{% if GLOBALS.so_model and GLOBALS.so_model not in ['SO2AMI01', 'SO2AZI01', 'SO2GCI01'] %}
|
||||||
{% if GLOBALS.os == 'Rocky' %}
|
{% if GLOBALS.os == 'OEL' %}
|
||||||
# Install Raid tools
|
# Install Raid tools
|
||||||
raidpkgs:
|
raidpkgs:
|
||||||
pkg.installed:
|
pkg.installed:
|
||||||
@@ -261,8 +217,7 @@ so-raid-status:
|
|||||||
- month: '*'
|
- month: '*'
|
||||||
- dayweek: '*'
|
- dayweek: '*'
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
||||||
{{sls}}_state_not_allowed:
|
{{sls}}_state_not_allowed:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
|
|
||||||
{% if GLOBALS.os == 'Ubuntu' %}
|
{% if GLOBALS.os_family == 'Debian' %}
|
||||||
commonpkgs:
|
commonpkgs:
|
||||||
pkg.installed:
|
pkg.installed:
|
||||||
- skip_suggestions: True
|
- skip_suggestions: True
|
||||||
@@ -14,16 +14,24 @@ commonpkgs:
|
|||||||
- software-properties-common
|
- software-properties-common
|
||||||
- apt-transport-https
|
- apt-transport-https
|
||||||
- openssl
|
- openssl
|
||||||
- netcat
|
- netcat-openbsd
|
||||||
- sqlite3
|
- sqlite3
|
||||||
- libssl-dev
|
- libssl-dev
|
||||||
|
- procps
|
||||||
- python3-dateutil
|
- python3-dateutil
|
||||||
|
- python3-docker
|
||||||
- python3-packaging
|
- python3-packaging
|
||||||
- python3-watchdog
|
|
||||||
- python3-lxml
|
- python3-lxml
|
||||||
- git
|
- git
|
||||||
|
- rsync
|
||||||
- vim
|
- vim
|
||||||
|
- tar
|
||||||
|
- unzip
|
||||||
|
{% if grains.oscodename != 'focal' %}
|
||||||
|
- python3-rich
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if grains.oscodename == 'focal' %}
|
||||||
# since Ubuntu requires and internet connection we can use pip to install modules
|
# since Ubuntu requires and internet connection we can use pip to install modules
|
||||||
python3-pip:
|
python3-pip:
|
||||||
pkg.installed
|
pkg.installed
|
||||||
@@ -34,34 +42,45 @@ python-rich:
|
|||||||
- target: /usr/local/lib/python3.8/dist-packages/
|
- target: /usr/local/lib/python3.8/dist-packages/
|
||||||
- require:
|
- require:
|
||||||
- pkg: python3-pip
|
- pkg: python3-pip
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if GLOBALS.os_family == 'RedHat' %}
|
||||||
|
|
||||||
|
remove_mariadb:
|
||||||
|
pkg.removed:
|
||||||
|
- name: mariadb-devel
|
||||||
|
|
||||||
{% elif GLOBALS.os == 'Rocky' %}
|
|
||||||
commonpkgs:
|
commonpkgs:
|
||||||
pkg.installed:
|
pkg.installed:
|
||||||
- skip_suggestions: True
|
- skip_suggestions: True
|
||||||
- pkgs:
|
- pkgs:
|
||||||
- wget
|
|
||||||
- jq
|
|
||||||
- tcpdump
|
|
||||||
- httpd-tools
|
|
||||||
- net-tools
|
|
||||||
- curl
|
|
||||||
- sqlite
|
|
||||||
- mariadb-devel
|
|
||||||
- python3-dnf-plugin-versionlock
|
- python3-dnf-plugin-versionlock
|
||||||
- nmap-ncat
|
- curl
|
||||||
- yum-utils
|
|
||||||
- device-mapper-persistent-data
|
- device-mapper-persistent-data
|
||||||
- lvm2
|
- fuse
|
||||||
- openssl
|
- fuse-libs
|
||||||
|
- fuse-overlayfs
|
||||||
|
- fuse-common
|
||||||
|
- fuse3
|
||||||
|
- fuse3-libs
|
||||||
- git
|
- git
|
||||||
|
- httpd-tools
|
||||||
|
- jq
|
||||||
|
- lvm2
|
||||||
|
- net-tools
|
||||||
|
- nmap-ncat
|
||||||
|
- procps-ng
|
||||||
- python3-docker
|
- python3-docker
|
||||||
- python3-m2crypto
|
- python3-m2crypto
|
||||||
- rsync
|
|
||||||
- python3-rich
|
|
||||||
- python3-pyyaml
|
|
||||||
- python3-watchdog
|
|
||||||
- python3-packaging
|
- python3-packaging
|
||||||
|
- python3-pyyaml
|
||||||
|
- python3-rich
|
||||||
|
- rsync
|
||||||
|
- sqlite
|
||||||
|
- tcpdump
|
||||||
- unzip
|
- unzip
|
||||||
|
- wget
|
||||||
|
- yum-utils
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -8,6 +8,16 @@ soup_scripts:
|
|||||||
- source: salt://common/tools/sbin
|
- source: salt://common/tools/sbin
|
||||||
- include_pat:
|
- include_pat:
|
||||||
- so-common
|
- so-common
|
||||||
- so-firewall
|
|
||||||
- so-image-common
|
- so-image-common
|
||||||
|
|
||||||
|
soup_manager_scripts:
|
||||||
|
file.recurse:
|
||||||
|
- name: /usr/sbin
|
||||||
|
- user: root
|
||||||
|
- group: root
|
||||||
|
- file_mode: 755
|
||||||
|
- source: salt://manager/tools/sbin
|
||||||
|
- include_pat:
|
||||||
|
- so-firewall
|
||||||
|
- so-repo-sync
|
||||||
- soup
|
- soup
|
||||||
|
|||||||
@@ -5,6 +5,16 @@
|
|||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
# Elastic License 2.0.
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
# Elastic agent is not managed by salt. Because of this we must store this base information in a
|
||||||
|
# script that accompanies the soup system. Since so-common is one of those special soup files,
|
||||||
|
# and since this same logic is required during installation, it's included in this file.
|
||||||
|
ELASTIC_AGENT_TARBALL_VERSION="8.8.2"
|
||||||
|
ELASTIC_AGENT_URL="https://repo.securityonion.net/file/so-repo/prod/2.4/elasticagent/elastic-agent_SO-$ELASTIC_AGENT_TARBALL_VERSION.tar.gz"
|
||||||
|
ELASTIC_AGENT_MD5_URL="https://repo.securityonion.net/file/so-repo/prod/2.4/elasticagent/elastic-agent_SO-$ELASTIC_AGENT_TARBALL_VERSION.md5"
|
||||||
|
ELASTIC_AGENT_FILE="/nsm/elastic-fleet/artifacts/elastic-agent_SO-$ELASTIC_AGENT_TARBALL_VERSION.tar.gz"
|
||||||
|
ELASTIC_AGENT_MD5="/nsm/elastic-fleet/artifacts/elastic-agent_SO-$ELASTIC_AGENT_TARBALL_VERSION.md5"
|
||||||
|
ELASTIC_AGENT_EXPANSION_DIR=/nsm/elastic-fleet/artifacts/beats/elastic-agent
|
||||||
|
|
||||||
DEFAULT_SALT_DIR=/opt/so/saltstack/default
|
DEFAULT_SALT_DIR=/opt/so/saltstack/default
|
||||||
DOC_BASE_URL="https://docs.securityonion.net/en/2.4"
|
DOC_BASE_URL="https://docs.securityonion.net/en/2.4"
|
||||||
|
|
||||||
@@ -144,13 +154,11 @@ check_salt_minion_status() {
|
|||||||
return $status
|
return $status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
copy_new_files() {
|
copy_new_files() {
|
||||||
# Copy new files over to the salt dir
|
# Copy new files over to the salt dir
|
||||||
cd $UPDATE_DIR
|
cd $UPDATE_DIR
|
||||||
rsync -a salt $DEFAULT_SALT_DIR/
|
rsync -a salt $DEFAULT_SALT_DIR/ --delete
|
||||||
rsync -a pillar $DEFAULT_SALT_DIR/
|
rsync -a pillar $DEFAULT_SALT_DIR/ --delete
|
||||||
chown -R socore:socore $DEFAULT_SALT_DIR/
|
chown -R socore:socore $DEFAULT_SALT_DIR/
|
||||||
chmod 755 $DEFAULT_SALT_DIR/pillar/firewall/addfirewall.sh
|
chmod 755 $DEFAULT_SALT_DIR/pillar/firewall/addfirewall.sh
|
||||||
cd /tmp
|
cd /tmp
|
||||||
@@ -160,6 +168,34 @@ disable_fastestmirror() {
|
|||||||
sed -i 's/enabled=1/enabled=0/' /etc/yum/pluginconf.d/fastestmirror.conf
|
sed -i 's/enabled=1/enabled=0/' /etc/yum/pluginconf.d/fastestmirror.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
download_and_verify() {
|
||||||
|
source_url=$1
|
||||||
|
source_md5_url=$2
|
||||||
|
dest_file=$3
|
||||||
|
md5_file=$4
|
||||||
|
expand_dir=$5
|
||||||
|
|
||||||
|
if [[ -n "$expand_dir" ]]; then
|
||||||
|
mkdir -p "$expand_dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! verify_md5_checksum "$dest_file" "$md5_file"; then
|
||||||
|
retry 15 10 "curl --fail --retry 5 --retry-delay 15 -L '$source_url' --output '$dest_file'" "" ""
|
||||||
|
retry 15 10 "curl --fail --retry 5 --retry-delay 15 -L '$source_md5_url' --output '$md5_file'" "" ""
|
||||||
|
|
||||||
|
if verify_md5_checksum "$dest_file" "$md5_file"; then
|
||||||
|
echo "Source file and checksum are good."
|
||||||
|
else
|
||||||
|
echo "Unable to download and verify the source file and checksum."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "$expand_dir" ]]; then
|
||||||
|
tar -xf "$dest_file" -C "$expand_dir"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
elastic_license() {
|
elastic_license() {
|
||||||
|
|
||||||
read -r -d '' message <<- EOM
|
read -r -d '' message <<- EOM
|
||||||
@@ -198,19 +234,20 @@ get_random_value() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gpg_rpm_import() {
|
gpg_rpm_import() {
|
||||||
if [[ "$OS" == "rocky" ]]; then
|
if [[ $is_oracle ]]; then
|
||||||
if [[ "$WHATWOULDYOUSAYYAHDOHERE" == "setup" ]]; then
|
if [[ "$WHATWOULDYOUSAYYAHDOHERE" == "setup" ]]; then
|
||||||
local RPMKEYSLOC="../salt/repo/client/files/rocky/keys"
|
local RPMKEYSLOC="../salt/repo/client/files/$OS/keys"
|
||||||
else
|
else
|
||||||
local RPMKEYSLOC="$UPDATE_DIR/salt/repo/client/files/rocky/keys"
|
local RPMKEYSLOC="$UPDATE_DIR/salt/repo/client/files/$OS/keys"
|
||||||
fi
|
fi
|
||||||
|
RPMKEYS=('RPM-GPG-KEY-oracle' 'RPM-GPG-KEY-EPEL-9' 'SALT-PROJECT-GPG-PUBKEY-2023.pub' 'docker.pub' 'securityonion.pub')
|
||||||
RPMKEYS=('RPM-GPG-KEY-rockyofficial' 'RPM-GPG-KEY-EPEL-9' 'SALT-PROJECT-GPG-PUBKEY-2023.pub' 'docker.pub' 'securityonion.pub')
|
for RPMKEY in "${RPMKEYS[@]}"; do
|
||||||
|
|
||||||
for RPMKEY in "${RPMKEYS[@]}"; do
|
|
||||||
rpm --import $RPMKEYSLOC/$RPMKEY
|
rpm --import $RPMKEYSLOC/$RPMKEY
|
||||||
echo "Imported $RPMKEY"
|
echo "Imported $RPMKEY"
|
||||||
done
|
done
|
||||||
|
elif [[ $is_rpm ]]; then
|
||||||
|
echo "Importing the security onion GPG key"
|
||||||
|
rpm --import ../salt/repo/client/files/oracle/keys/securityonion.pub
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,12 +260,15 @@ init_monitor() {
|
|||||||
|
|
||||||
if [[ $MONITORNIC == "bond0" ]]; then
|
if [[ $MONITORNIC == "bond0" ]]; then
|
||||||
BIFACES=$(lookup_bond_interfaces)
|
BIFACES=$(lookup_bond_interfaces)
|
||||||
|
for i in rx tx sg tso ufo gso gro lro rx-vlan-offload tx-vlan-offload generic-receive-offload generic-segmentation-offload tcp-segmentation-offload; do
|
||||||
|
ethtool -K "$MONITORNIC" "$i" off;
|
||||||
|
done
|
||||||
else
|
else
|
||||||
BIFACES=$MONITORNIC
|
BIFACES=$MONITORNIC
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for DEVICE_IFACE in $BIFACES; do
|
for DEVICE_IFACE in $BIFACES; do
|
||||||
for i in rx tx sg tso ufo gso gro lro; do
|
for i in rx tx sg tso ufo gso gro lro rx-vlan-offload tx-vlan-offload generic-receive-offload generic-segmentation-offload tcp-segmentation-offload; do
|
||||||
ethtool -K "$DEVICE_IFACE" "$i" off;
|
ethtool -K "$DEVICE_IFACE" "$i" off;
|
||||||
done
|
done
|
||||||
ip link set dev "$DEVICE_IFACE" arp off multicast off allmulticast off promisc on
|
ip link set dev "$DEVICE_IFACE" arp off multicast off allmulticast off promisc on
|
||||||
@@ -242,7 +282,7 @@ is_manager_node() {
|
|||||||
is_sensor_node() {
|
is_sensor_node() {
|
||||||
# Check to see if this is a sensor (forward) node
|
# Check to see if this is a sensor (forward) node
|
||||||
is_single_node_grid && return 0
|
is_single_node_grid && return 0
|
||||||
grep "role: so-" /etc/salt/grains | grep -E "sensor|heavynode|helix" &> /dev/null
|
grep "role: so-" /etc/salt/grains | grep -E "sensor|heavynode" &> /dev/null
|
||||||
}
|
}
|
||||||
|
|
||||||
is_single_node_grid() {
|
is_single_node_grid() {
|
||||||
@@ -300,6 +340,17 @@ lookup_role() {
|
|||||||
echo ${pieces[1]}
|
echo ${pieces[1]}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_feature_enabled() {
|
||||||
|
feature=$1
|
||||||
|
enabled=$(lookup_salt_value features)
|
||||||
|
for cur in $enabled; do
|
||||||
|
if [[ "$feature" == "$cur" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
require_manager() {
|
require_manager() {
|
||||||
if is_manager_node; then
|
if is_manager_node; then
|
||||||
echo "This is a manager, so we can proceed."
|
echo "This is a manager, so we can proceed."
|
||||||
@@ -383,19 +434,26 @@ salt_minion_count() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_cron_service_name() {
|
|
||||||
if [[ "$OS" == "rocky" ]]; then
|
|
||||||
cron_service_name="crond"
|
|
||||||
else
|
|
||||||
cron_service_name="cron"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
set_os() {
|
set_os() {
|
||||||
if [ -f /etc/redhat-release ]; then
|
if [ -f /etc/redhat-release ]; then
|
||||||
OS=rocky
|
if grep -q "Rocky Linux release 9" /etc/redhat-release; then
|
||||||
|
OS=rocky
|
||||||
|
OSVER=9
|
||||||
|
is_rocky=true
|
||||||
|
elif grep -q "CentOS Stream release 9" /etc/redhat-release; then
|
||||||
|
OS=centos
|
||||||
|
OSVER=9
|
||||||
|
is_centos=true
|
||||||
|
elif grep -q "Oracle Linux Server release 9" /etc/system-release; then
|
||||||
|
OS=oel
|
||||||
|
OSVER=9
|
||||||
|
is_oracle=true
|
||||||
|
fi
|
||||||
|
cron_service_name="crond"
|
||||||
else
|
else
|
||||||
OS=ubuntu
|
OS=ubuntu
|
||||||
|
is_ubuntu=true
|
||||||
|
cron_service_name="cron"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -404,7 +462,7 @@ set_minionid() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
set_palette() {
|
set_palette() {
|
||||||
if [ "$OS" == ubuntu ]; then
|
if [[ $is_deb ]]; then
|
||||||
update-alternatives --set newt-palette /etc/newt/palette.original
|
update-alternatives --set newt-palette /etc/newt/palette.original
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -451,6 +509,11 @@ has_uppercase() {
|
|||||||
|| return 1
|
|| return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_elastic_agent() {
|
||||||
|
echo "Checking if Elastic Agent update is necessary..."
|
||||||
|
download_and_verify "$ELASTIC_AGENT_URL" "$ELASTIC_AGENT_MD5_URL" "$ELASTIC_AGENT_FILE" "$ELASTIC_AGENT_MD5" "$ELASTIC_AGENT_EXPANSION_DIR"
|
||||||
|
}
|
||||||
|
|
||||||
valid_cidr() {
|
valid_cidr() {
|
||||||
# Verify there is a backslash in the string
|
# Verify there is a backslash in the string
|
||||||
echo "$1" | grep -qP "^[^/]+/[^/]+$" || return 1
|
echo "$1" | grep -qP "^[^/]+/[^/]+$" || return 1
|
||||||
@@ -604,6 +667,23 @@ valid_username() {
|
|||||||
echo "$user" | grep -qP '^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$' && return 0 || return 1
|
echo "$user" | grep -qP '^[a-z_]([a-z0-9_-]{0,31}|[a-z0-9_-]{0,30}\$)$' && return 0 || return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
verify_md5_checksum() {
|
||||||
|
data_file=$1
|
||||||
|
md5_file=${2:-${data_file}.md5}
|
||||||
|
|
||||||
|
if [[ ! -f "$dest_file" || ! -f "$md5_file" ]]; then
|
||||||
|
return 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
SOURCEHASH=$(md5sum "$data_file" | awk '{ print $1 }')
|
||||||
|
HASH=$(cat "$md5_file")
|
||||||
|
|
||||||
|
if [[ "$HASH" == "$SOURCEHASH" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
wait_for_web_response() {
|
wait_for_web_response() {
|
||||||
url=$1
|
url=$1
|
||||||
expected=$2
|
expected=$2
|
||||||
|
|||||||
@@ -0,0 +1,233 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
RECENT_LOG_LINES=200
|
||||||
|
EXCLUDE_STARTUP_ERRORS=N
|
||||||
|
EXCLUDE_FALSE_POSITIVE_ERRORS=N
|
||||||
|
EXCLUDE_KNOWN_ERRORS=N
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--exclude-connection-errors)
|
||||||
|
EXCLUDE_STARTUP_ERRORS=Y
|
||||||
|
;;
|
||||||
|
--exclude-false-positives)
|
||||||
|
EXCLUDE_FALSE_POSITIVE_ERRORS=Y
|
||||||
|
;;
|
||||||
|
--exclude-known-errors)
|
||||||
|
EXCLUDE_KNOWN_ERRORS=Y
|
||||||
|
;;
|
||||||
|
--unknown)
|
||||||
|
EXCLUDE_STARTUP_ERRORS=Y
|
||||||
|
EXCLUDE_FALSE_POSITIVE_ERRORS=Y
|
||||||
|
EXCLUDE_KNOWN_ERRORS=Y
|
||||||
|
;;
|
||||||
|
--recent-log-lines)
|
||||||
|
shift
|
||||||
|
RECENT_LOG_LINES=$1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 [options]"
|
||||||
|
echo ""
|
||||||
|
echo "where options are:"
|
||||||
|
echo " --recent-log-lines N looks at the most recent N log lines per file or container; defaults to 200"
|
||||||
|
echo " --exclude-connection-errors exclude errors caused by a recent server or container restart"
|
||||||
|
echo " --exclude-false-positives exclude logs that are known false positives"
|
||||||
|
echo " --exclude-known-errors exclude errors that are known and non-critical issues"
|
||||||
|
echo " --unknown exclude everything mentioned above; only show unknown errors"
|
||||||
|
echo ""
|
||||||
|
echo "A non-zero return value indicates errors were found"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Security Onion Log Check - $(date)"
|
||||||
|
echo "-------------------------------------------"
|
||||||
|
echo ""
|
||||||
|
echo "- RECENT_LOG_LINES: $RECENT_LOG_LINES"
|
||||||
|
echo "- EXCLUDE_STARTUP_ERRORS: $EXCLUDE_STARTUP_ERRORS"
|
||||||
|
echo "- EXCLUDE_FALSE_POSITIVE_ERRORS: $EXCLUDE_FALSE_POSITIVE_ERRORS"
|
||||||
|
echo "- EXCLUDE_KNOWN_ERRORS: $EXCLUDE_KNOWN_ERRORS"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
function status() {
|
||||||
|
header "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
function exclude_container() {
|
||||||
|
name=$1
|
||||||
|
|
||||||
|
exclude_id=$(docker ps | grep "$name" | awk '{print $1}')
|
||||||
|
if [[ -n "$exclude_id" ]]; then
|
||||||
|
CONTAINER_IDS=$(echo $CONTAINER_IDS | sed -e "s/$exclude_id//g")
|
||||||
|
return $?
|
||||||
|
fi
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
function exclude_log() {
|
||||||
|
name=$1
|
||||||
|
|
||||||
|
cat /tmp/log_check_files | grep -v $name > /tmp/log_check_files.new
|
||||||
|
mv /tmp/log_check_files.new /tmp/log_check_files
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_for_errors() {
|
||||||
|
if cat /tmp/log_check | grep -i error | grep -vEi "$EXCLUDED_ERRORS"; then
|
||||||
|
RESULT=1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
EXCLUDED_ERRORS="__LOG_CHECK_PLACEHOLDER_EXCLUSION__"
|
||||||
|
|
||||||
|
if [[ $EXCLUDE_STARTUP_ERRORS == 'Y' ]]; then
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|database is locked" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|econnreset" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|unreachable" # server not yet ready (logstash waiting on elastic)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|shutdown process" # server not yet ready (logstash waiting on elastic)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|contain valid certificates" # server not yet ready (logstash waiting on elastic)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|failedaction" # server not yet ready (logstash waiting on elastic)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|no route to host" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|not running" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|unavailable" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|request.py" # server not yet ready (python stack output)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|httperror" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|servfail" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|connect" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|missing shards" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|failed to send metrics" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|broken pipe" # server not yet ready
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|status: 502" # server not yet ready (nginx waiting on upstream)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|timeout exceeded" # server not yet ready (telegraf waiting on elasticsearch)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|influxsize kbytes" # server not yet ready (telegraf waiting on influx)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|expected field at" # server not yet ready (telegraf waiting on health data)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|cached the public key" # server not yet ready (salt minion waiting on key acceptance)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|no ingest nodes" # server not yet ready (logstash waiting on elastic)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|failed to poll" # server not yet ready (sensoroni waiting on soc)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|minions returned with non" # server not yet ready (salt waiting on minions)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|so_long_term" # server not yet ready (influxdb not yet setup)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $EXCLUDE_FALSE_POSITIVE_ERRORS == 'Y' ]]; then
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|elastalert_status_error" # false positive
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|elastalert_error" # false positive
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|error: '0'" # false positive
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|errors_index" # false positive
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|noerror" # false positive
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|outofmemoryerror" # false positive (elastic command line)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|adding component template" # false positive (elastic security)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|adding index template" # false positive (elastic security)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|fs_errors" # false positive (suricata stats)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|error-template" # false positive (elastic templates)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|deprecated" # false positive (playbook)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|windows" # false positive (playbook)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|could cause errors" # false positive (playbook)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|_error.yml" # false positive (playbook)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|id.orig_h" # false positive (zeek test data)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|emerging-all.rules" # false positive (error in rulename)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|invalid query input" # false positive (Invalid user input in hunt query)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|example" # false positive (example test data)
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|status 200" # false positive (request successful, contained error string in content)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $EXCLUDE_KNOWN_ERRORS == 'Y' ]]; then
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|eof"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|raise" # redis/python generic stack line, rely on other lines for actual error
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|fail\\(error\\)" # redis/python generic stack line, rely on other lines for actual error
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|urlerror" # idstools connection timeout
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|timeouterror" # idstools connection timeout
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|forbidden" # playbook
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|_ml" # Elastic ML errors
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|context canceled" # elastic agent during shutdown
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|exited with code 128" # soctopus errors during forced restart by highstate
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|geoip databases update" # airgap can't update GeoIP DB
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|filenotfounderror" # bug in 2.4.10 filecheck salt state caused duplicate cronjobs
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|salt-minion-check" # bug in early 2.4 place Jinja script in non-jinja salt dir causing cron output errors
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|generating elastalert config" # playbook expected error
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|activerecord" # playbook expected error
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|monitoring.metrics" # known issue with elastic agent casting the field incorrectly if an integer value shows up before a float
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|repodownload.conf" # known issue with reposync on pre-2.4.20
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|missing versions record" # stenographer corrupt index
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|soc.field." # known ingest type collisions issue with earlier versions of SO
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|iteration"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|communication packets"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|use of closed"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|bookkeeper"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|noindices"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|failed to start transient scope"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|so-user.lock exists"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|systemd-run"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|retcode: 1"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|telemetry-task"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|redisqueue"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|fleet_detail_query"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|num errors=0"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|provisioning/alerting"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|provisioning/notifiers"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|provisoning/plugins"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|active-responses.log"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|scanentropy"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|integration policy"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|blob unknown"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|token required"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|zeekcaptureloss"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|unable to create detection"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|error installing new prebuilt rules"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|parent.error"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|req.LocalMeta.host.ip" # known issue in GH
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|sendmail" # zeek
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|stats.log"
|
||||||
|
EXCLUDED_ERRORS="$EXCLUDED_ERRORS|context deadline exceeded"
|
||||||
|
fi
|
||||||
|
|
||||||
|
RESULT=0
|
||||||
|
|
||||||
|
# Check Security Onion container stdout/stderr logs
|
||||||
|
CONTAINER_IDS=$(docker ps -q)
|
||||||
|
exclude_container so-kibana # kibana error logs are too verbose with large varieties of errors most of which are temporary
|
||||||
|
exclude_container so-idstools # ignore due to known issues and noisy logging
|
||||||
|
exclude_container so-playbook # ignore due to several playbook known issues
|
||||||
|
|
||||||
|
for container_id in $CONTAINER_IDS; do
|
||||||
|
container_name=$(docker ps --format json | jq ". | select(.ID==\"$container_id\")|.Names")
|
||||||
|
status "Checking container $container_name"
|
||||||
|
docker logs -n $RECENT_LOG_LINES $container_id > /tmp/log_check 2>&1
|
||||||
|
check_for_errors
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check Security Onion related log files
|
||||||
|
find /opt/so/log/ /nsm -name \*.log > /tmp/log_check_files
|
||||||
|
if [[ -f /var/log/cron ]]; then
|
||||||
|
echo "/var/log/cron" >> /tmp/log_check_files
|
||||||
|
fi
|
||||||
|
exclude_log "kibana.log" # kibana error logs are too verbose with large varieties of errors most of which are temporary
|
||||||
|
exclude_log "spool" # disregard zeek analyze logs as this is data specific
|
||||||
|
exclude_log "import" # disregard imported test data the contains error strings
|
||||||
|
exclude_log "update.log" # ignore playbook updates due to several known issues
|
||||||
|
exclude_log "playbook.log" # ignore due to several playbook known issues
|
||||||
|
|
||||||
|
for log_file in $(cat /tmp/log_check_files); do
|
||||||
|
status "Checking log file $log_file"
|
||||||
|
tail -n $RECENT_LOG_LINES $log_file > /tmp/log_check
|
||||||
|
check_for_errors
|
||||||
|
done
|
||||||
|
|
||||||
|
# Cleanup temp files
|
||||||
|
rm -f /tmp/log_check_files
|
||||||
|
rm -f /tmp/log_check
|
||||||
|
|
||||||
|
if [[ $RESULT -eq 0 ]]; then
|
||||||
|
echo -e "\nResult: No errors found"
|
||||||
|
else
|
||||||
|
echo -e "\nResult: One or more errors found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $RESULT
|
||||||
@@ -103,7 +103,7 @@ def output(options, console, code, data):
|
|||||||
def check_container_status(options, console):
|
def check_container_status(options, console):
|
||||||
code = 0
|
code = 0
|
||||||
cli = "docker"
|
cli = "docker"
|
||||||
proc = subprocess.run([cli, 'ps', '--format', '{{json .}}'], stdout=subprocess.PIPE, encoding="utf-8")
|
proc = subprocess.run([cli, 'ps', '--format', 'json'], stdout=subprocess.PIPE, encoding="utf-8")
|
||||||
if proc.returncode != 0:
|
if proc.returncode != 0:
|
||||||
fail("Container system error; unable to obtain container process statuses")
|
fail("Container system error; unable to obtain container process statuses")
|
||||||
|
|
||||||
|
|||||||
@@ -5,4 +5,14 @@
|
|||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
# Elastic License 2.0.
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Playback live sample data onto monitor interface
|
||||||
so-tcpreplay /opt/samples/* 2> /dev/null
|
so-tcpreplay /opt/samples/* 2> /dev/null
|
||||||
|
|
||||||
|
# Ingest sample pfsense log entry
|
||||||
|
if is_sensor_node; then
|
||||||
|
echo "<134>$(date '+%b %d %H:%M:%S') filterlog[31624]: 84,,,1567509287,igb0.244,match,pass,in,4,0x0,,64,0,0,DF,6,tcp,64,192.168.1.1,10.10.10.10,56320,443,0,S,3333585167,,65535,,mss;nop;wscale;nop;nop;TS;sackOK;eol" | nc -uv -w1 127.0.0.1 514 > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|||||||
@@ -5,18 +5,18 @@
|
|||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
# Elastic License 2.0.
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
source /usr/sbin/so-common
|
||||||
|
doc_desktop_url="$DOC_BASE_URL/desktop.html"
|
||||||
|
|
||||||
{# we only want the script to install the workstation if it is Rocky -#}
|
{# we only want the script to install the desktop if it is OEL -#}
|
||||||
{% if grains.os == 'Rocky' -%}
|
{% if grains.os == 'OEL' -%}
|
||||||
{# if this is a manager -#}
|
{# if this is a manager -#}
|
||||||
{% if grains.master == grains.id.split('_')|first -%}
|
{% if grains.master == grains.id.split('_')|first -%}
|
||||||
|
|
||||||
source /usr/sbin/so-common
|
pillar_file="/opt/so/saltstack/local/pillar/minions/adv_{{grains.id}}.sls"
|
||||||
doc_workstation_url="$DOC_BASE_URL/analyst-vm.html"
|
|
||||||
pillar_file="/opt/so/saltstack/local/pillar/minions/{{grains.id}}.sls"
|
|
||||||
|
|
||||||
if [ -f "$pillar_file" ]; then
|
if [ -f "$pillar_file" ]; then
|
||||||
if ! grep -q "^workstation:$" "$pillar_file"; then
|
if ! grep -q "^desktop:$" "$pillar_file"; then
|
||||||
|
|
||||||
FIRSTPASS=yes
|
FIRSTPASS=yes
|
||||||
while [[ $INSTALL != "yes" ]] && [[ $INSTALL != "no" ]]; do
|
while [[ $INSTALL != "yes" ]] && [[ $INSTALL != "no" ]]; do
|
||||||
@@ -26,7 +26,7 @@ if [ -f "$pillar_file" ]; then
|
|||||||
echo "## _______________________________ ##"
|
echo "## _______________________________ ##"
|
||||||
echo "## ##"
|
echo "## ##"
|
||||||
echo "## Installing the Security Onion ##"
|
echo "## Installing the Security Onion ##"
|
||||||
echo "## analyst node on this device will ##"
|
echo "## Desktop on this device will ##"
|
||||||
echo "## make permanent changes to ##"
|
echo "## make permanent changes to ##"
|
||||||
echo "## the system. ##"
|
echo "## the system. ##"
|
||||||
echo "## A system reboot will be required ##"
|
echo "## A system reboot will be required ##"
|
||||||
@@ -42,50 +42,55 @@ if [ -f "$pillar_file" ]; then
|
|||||||
done
|
done
|
||||||
|
|
||||||
if [[ $INSTALL == "no" ]]; then
|
if [[ $INSTALL == "no" ]]; then
|
||||||
echo "Exiting analyst node installation."
|
echo "Exiting desktop node installation."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Add workstation pillar to the minion's pillar file
|
# Add desktop pillar to the minion's pillar file
|
||||||
printf '%s\n'\
|
printf '%s\n'\
|
||||||
"workstation:"\
|
"desktop:"\
|
||||||
" gui:"\
|
" gui:"\
|
||||||
" enabled: true"\
|
" enabled: true"\
|
||||||
"" >> "$pillar_file"
|
"" >> "$pillar_file"
|
||||||
echo "Applying the workstation state. This could take some time since there are many packages that need to be installed."
|
echo "Applying the desktop state. This could take some time since there are many packages that need to be installed."
|
||||||
if salt-call state.apply workstation -linfo queue=True; then # make sure the state ran successfully
|
if salt-call state.apply desktop -linfo queue=True; then # make sure the state ran successfully
|
||||||
echo ""
|
echo ""
|
||||||
echo "Analyst workstation has been installed!"
|
echo "Security Onion Desktop has been installed!"
|
||||||
echo "Press ENTER to reboot or Ctrl-C to cancel."
|
echo "Press ENTER to reboot or Ctrl-C to cancel."
|
||||||
read pause
|
read pause
|
||||||
|
|
||||||
reboot;
|
reboot;
|
||||||
else
|
else
|
||||||
echo "There was an issue applying the workstation state. Please review the log above or at /opt/so/log/salt/minion."
|
echo "There was an issue applying the desktop state. Please review the log above or at /opt/so/log/salt/minion."
|
||||||
fi
|
fi
|
||||||
else # workstation is already added
|
else # desktop is already added
|
||||||
echo "The workstation pillar already exists in $pillar_file."
|
echo "The desktop pillar already exists in $pillar_file."
|
||||||
echo "To enable/disable the gui, set 'workstation:gui:enabled' to true or false in $pillar_file."
|
echo "To enable/disable the gui, set 'desktop:gui:enabled' to true or false in $pillar_file. Alternatively, this can be set in the SOC UI under advanced."
|
||||||
echo "Additional documentation can be found at $doc_workstation_url."
|
echo "Additional documentation can be found at $doc_desktop_url."
|
||||||
fi
|
fi
|
||||||
else # if the pillar file doesn't exist
|
else # if the pillar file doesn't exist
|
||||||
echo "Could not find $pillar_file and add the workstation pillar."
|
echo "Could not find $pillar_file and add the desktop pillar."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
{#- if this is not a manager #}
|
{#- if this is not a manager #}
|
||||||
{% else -%}
|
{% else -%}
|
||||||
|
|
||||||
echo "Since this is not a manager, the pillar values to enable analyst workstation must be set manually. Please view the documentation at $doc_workstation_url."
|
echo "Since this is not a manager, the pillar values to enable Security Onion Desktop must be set manually. This can be enabled in the SOC UI under advanced by adding the following:"
|
||||||
|
echo "desktop:"
|
||||||
|
echo " gui:"
|
||||||
|
echo " enabled: true"
|
||||||
|
echo ""
|
||||||
|
echo "Please view the documentation at $doc_desktop_url."
|
||||||
|
|
||||||
{#- endif if this is a manager #}
|
{#- endif if this is a manager #}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
|
|
||||||
{#- if not Rocky #}
|
{#- if not OEL #}
|
||||||
{%- else %}
|
{%- else %}
|
||||||
|
|
||||||
echo "The Analyst Workstation can only be installed on Rocky. Please view the documentation at $doc_workstation_url."
|
echo "The Security Onion Desktop can only be installed on Oracle Linux. Please view the documentation at $doc_desktop_url."
|
||||||
|
|
||||||
{#- endif grains.os == Rocky #}
|
{#- endif grains.os == OEL #}
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
@@ -14,142 +14,232 @@
|
|||||||
{%- set ES_PASS = salt['pillar.get']('elasticsearch:auth:users:so_elastic_user:pass', '') %}
|
{%- set ES_PASS = salt['pillar.get']('elasticsearch:auth:users:so_elastic_user:pass', '') %}
|
||||||
|
|
||||||
INDEX_DATE=$(date +'%Y.%m.%d')
|
INDEX_DATE=$(date +'%Y.%m.%d')
|
||||||
RUNID=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8 | head -n 1)
|
|
||||||
LOG_FILE=/nsm/import/evtx-import.log
|
LOG_FILE=/nsm/import/evtx-import.log
|
||||||
|
|
||||||
. /usr/sbin/so-common
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
function usage {
|
function usage {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: $0 <evtx-file-1> [evtx-file-2] [evtx-file-*]
|
Usage: $0 [options] <evtx-file-1> [evtx-file-2] [evtx-file-*]
|
||||||
|
|
||||||
Imports one or more evtx files into Security Onion. The evtx files will be analyzed and made available for review in the Security Onion toolset.
|
Imports one or more evtx files into Security Onion. The evtx files will be analyzed and made available for review in the Security Onion toolset.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--json Outputs summary in JSON format. Implies --quiet.
|
||||||
|
--quiet Silences progress information to stdout.
|
||||||
|
--shift Adds a time shift. Accepts a single argument that is intended to be the date of the last record, and shifts the dates of the previous records accordingly.
|
||||||
|
Ex. sudo so-import-evtx --shift "2023-08-01 01:01:01" example.evtx
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
quiet=0
|
||||||
|
json=0
|
||||||
|
INPUT_FILES=
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
param=$1
|
||||||
|
shift
|
||||||
|
case "$param" in
|
||||||
|
--json)
|
||||||
|
json=1
|
||||||
|
quiet=1
|
||||||
|
;;
|
||||||
|
--quiet)
|
||||||
|
quiet=1
|
||||||
|
;;
|
||||||
|
--shift)
|
||||||
|
SHIFTDATE=$1
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
echo "Encountered unexpected parameter: $param"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ "$INPUT_FILES" != "" ]]; then
|
||||||
|
INPUT_FILES="$INPUT_FILES $param"
|
||||||
|
else
|
||||||
|
INPUT_FILES="$param"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
function status {
|
||||||
|
msg=$1
|
||||||
|
[[ $quiet -eq 1 ]] && return
|
||||||
|
echo "$msg"
|
||||||
|
}
|
||||||
|
|
||||||
function evtx2es() {
|
function evtx2es() {
|
||||||
EVTX=$1
|
EVTX=$1
|
||||||
HASH=$2
|
HASH=$2
|
||||||
|
SHIFTDATE=$3
|
||||||
|
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
|
-e "SHIFTTS=$SHIFTDATE" \
|
||||||
-v "$EVTX:/tmp/data.evtx" \
|
-v "$EVTX:/tmp/data.evtx" \
|
||||||
-v "/nsm/import/$HASH/evtx/:/tmp/evtx/" \
|
-v "/nsm/import/$HASH/evtx/:/tmp/evtx/" \
|
||||||
-v "/nsm/import/evtx-end_newest:/tmp/newest" \
|
-v "/nsm/import/$HASH/evtx-end_newest:/tmp/newest" \
|
||||||
-v "/nsm/import/evtx-start_oldest:/tmp/oldest" \
|
-v "/nsm/import/$HASH/evtx-start_oldest:/tmp/oldest" \
|
||||||
--entrypoint "/evtx_calc_timestamps.sh" \
|
--entrypoint "/evtx_calc_timestamps.sh" \
|
||||||
{{ MANAGER }}:5000/{{ IMAGEREPO }}/so-pcaptools:{{ VERSION }} >> $LOG_FILE 2>&1
|
{{ MANAGER }}:5000/{{ IMAGEREPO }}/so-pcaptools:{{ VERSION }} >> $LOG_FILE 2>&1
|
||||||
}
|
}
|
||||||
|
|
||||||
# if no parameters supplied, display usage
|
# if no parameters supplied, display usage
|
||||||
if [ $# -eq 0 ]; then
|
if [ "$INPUT_FILES" == "" ]; then
|
||||||
usage
|
usage
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ensure this is a Manager node
|
# ensure this is a Manager node
|
||||||
require_manager
|
require_manager @> /dev/null
|
||||||
|
|
||||||
# verify that all parameters are files
|
# verify that all parameters are files
|
||||||
for i in "$@"; do
|
for i in $INPUT_FILES; do
|
||||||
if ! [ -f "$i" ]; then
|
if ! [ -f "$i" ]; then
|
||||||
usage
|
|
||||||
echo "\"$i\" is not a valid file!"
|
echo "\"$i\" is not a valid file!"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# track if we have any valid or invalid evtx
|
|
||||||
INVALID_EVTXS="no"
|
|
||||||
VALID_EVTXS="no"
|
|
||||||
|
|
||||||
# track oldest start and newest end so that we can generate the Kibana search hyperlink at the end
|
# track oldest start and newest end so that we can generate the Kibana search hyperlink at the end
|
||||||
START_OLDEST="2050-12-31"
|
START_OLDEST="2050-12-31"
|
||||||
END_NEWEST="1971-01-01"
|
END_NEWEST="1971-01-01"
|
||||||
|
|
||||||
touch /nsm/import/evtx-start_oldest
|
INVALID_EVTXS_COUNT=0
|
||||||
touch /nsm/import/evtx-end_newest
|
VALID_EVTXS_COUNT=0
|
||||||
|
SKIPPED_EVTXS_COUNT=0
|
||||||
echo $START_OLDEST > /nsm/import/evtx-start_oldest
|
|
||||||
echo $END_NEWEST > /nsm/import/evtx-end_newest
|
|
||||||
|
|
||||||
# paths must be quoted in case they include spaces
|
# paths must be quoted in case they include spaces
|
||||||
for EVTX in "$@"; do
|
for EVTX in $INPUT_FILES; do
|
||||||
EVTX=$(/usr/bin/realpath "$EVTX")
|
EVTX=$(/usr/bin/realpath "$EVTX")
|
||||||
echo "Processing Import: ${EVTX}"
|
status "Processing Import: ${EVTX}"
|
||||||
|
if ! [ -z "$SHIFTDATE" ]; then
|
||||||
|
status "- timeshifting logs to end date of $SHIFTDATE"
|
||||||
|
fi
|
||||||
# generate a unique hash to assist with dedupe checks
|
# generate a unique hash to assist with dedupe checks
|
||||||
HASH=$(md5sum "${EVTX}" | awk '{ print $1 }')
|
HASH=$(md5sum "${EVTX}" | awk '{ print $1 }')
|
||||||
HASH_DIR=/nsm/import/${HASH}
|
HASH_DIR=/nsm/import/${HASH}
|
||||||
echo "- assigning unique identifier to import: $HASH"
|
status "- assigning unique identifier to import: $HASH"
|
||||||
|
|
||||||
|
if [[ "$HASH_FILTERS" == "" ]]; then
|
||||||
|
HASH_FILTERS="import.id:${HASH}"
|
||||||
|
HASHES="${HASH}"
|
||||||
|
else
|
||||||
|
HASH_FILTERS="$HASH_FILTERS%20OR%20import.id:${HASH}"
|
||||||
|
HASHES="${HASHES} ${HASH}"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -d $HASH_DIR ]; then
|
if [ -d $HASH_DIR ]; then
|
||||||
echo "- this EVTX has already been imported; skipping"
|
status "- this EVTX has already been imported; skipping"
|
||||||
INVALID_EVTXS="yes"
|
SKIPPED_EVTXS_COUNT=$((SKIPPED_EVTXS_COUNT + 1))
|
||||||
else
|
else
|
||||||
VALID_EVTXS="yes"
|
# create EVTX directory
|
||||||
|
|
||||||
EVTX_DIR=$HASH_DIR/evtx
|
EVTX_DIR=$HASH_DIR/evtx
|
||||||
mkdir -p $EVTX_DIR
|
mkdir -p $EVTX_DIR
|
||||||
|
# create import timestamp files
|
||||||
|
for i in evtx-start_oldest evtx-end_newest; do
|
||||||
|
if ! [ -f "$i" ]; then
|
||||||
|
touch /nsm/import/$HASH/$i
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
# import evtx and write them to import ingest pipeline
|
# import evtx and write them to import ingest pipeline
|
||||||
echo "- importing logs to Elasticsearch..."
|
status "- importing logs to Elasticsearch..."
|
||||||
evtx2es "${EVTX}" $HASH
|
evtx2es "${EVTX}" $HASH "$SHIFTDATE"
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
# compare $START to $START_OLDEST
|
INVALID_EVTXS_COUNT=$((INVALID_EVTXS_COUNT + 1))
|
||||||
START=$(cat /nsm/import/evtx-start_oldest)
|
status "- WARNING: This evtx file may not have fully imported successfully"
|
||||||
START_COMPARE=$(date -d $START +%s)
|
else
|
||||||
START_OLDEST_COMPARE=$(date -d $START_OLDEST +%s)
|
VALID_EVTXS_COUNT=$((VALID_EVTXS_COUNT + 1))
|
||||||
if [ $START_COMPARE -lt $START_OLDEST_COMPARE ]; then
|
fi
|
||||||
START_OLDEST=$START
|
|
||||||
fi
|
|
||||||
|
|
||||||
# compare $ENDNEXT to $END_NEWEST
|
|
||||||
END=$(cat /nsm/import/evtx-end_newest)
|
|
||||||
ENDNEXT=`date +%Y-%m-%d --date="$END 1 day"`
|
|
||||||
ENDNEXT_COMPARE=$(date -d $ENDNEXT +%s)
|
|
||||||
END_NEWEST_COMPARE=$(date -d $END_NEWEST +%s)
|
|
||||||
if [ $ENDNEXT_COMPARE -gt $END_NEWEST_COMPARE ]; then
|
|
||||||
END_NEWEST=$ENDNEXT
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp -f "${EVTX}" "${EVTX_DIR}"/data.evtx
|
cp -f "${EVTX}" "${EVTX_DIR}"/data.evtx
|
||||||
chmod 644 "${EVTX_DIR}"/data.evtx
|
chmod 644 "${EVTX_DIR}"/data.evtx
|
||||||
|
|
||||||
fi # end of valid evtx
|
fi # end of valid evtx
|
||||||
|
|
||||||
echo
|
# determine start and end and make sure they aren't reversed
|
||||||
|
START=$(cat /nsm/import/$HASH/evtx-start_oldest)
|
||||||
|
END=$(cat /nsm/import/$HASH/evtx-end_newest)
|
||||||
|
START_EPOCH=`date -d "$START" +"%s"`
|
||||||
|
END_EPOCH=`date -d "$END" +"%s"`
|
||||||
|
if [ "$START_EPOCH" -gt "$END_EPOCH" ]; then
|
||||||
|
TEMP=$START
|
||||||
|
START=$END
|
||||||
|
END=$TEMP
|
||||||
|
fi
|
||||||
|
|
||||||
|
# compare $START to $START_OLDEST
|
||||||
|
START_COMPARE=$(date -d $START +%s)
|
||||||
|
START_OLDEST_COMPARE=$(date -d $START_OLDEST +%s)
|
||||||
|
if [ $START_COMPARE -lt $START_OLDEST_COMPARE ]; then
|
||||||
|
START_OLDEST=$START
|
||||||
|
fi
|
||||||
|
|
||||||
|
# compare $ENDNEXT to $END_NEWEST
|
||||||
|
ENDNEXT=`date +%Y-%m-%d --date="$END 1 day"`
|
||||||
|
ENDNEXT_COMPARE=$(date -d $ENDNEXT +%s)
|
||||||
|
END_NEWEST_COMPARE=$(date -d $END_NEWEST +%s)
|
||||||
|
if [ $ENDNEXT_COMPARE -gt $END_NEWEST_COMPARE ]; then
|
||||||
|
END_NEWEST=$ENDNEXT
|
||||||
|
fi
|
||||||
|
|
||||||
|
status
|
||||||
|
|
||||||
done # end of for-loop processing evtx files
|
done # end of for-loop processing evtx files
|
||||||
|
|
||||||
# remove temp files
|
|
||||||
echo "Cleaning up:"
|
|
||||||
for TEMP_EVTX in ${TEMP_EVTXS[@]}; do
|
|
||||||
echo "- removing temporary evtx $TEMP_EVTX"
|
|
||||||
rm -f $TEMP_EVTX
|
|
||||||
done
|
|
||||||
|
|
||||||
# output final messages
|
# output final messages
|
||||||
if [ "$INVALID_EVTXS" = "yes" ]; then
|
if [[ $INVALID_EVTXS_COUNT -gt 0 ]]; then
|
||||||
echo
|
status
|
||||||
echo "Please note! One or more evtx was invalid! You can scroll up to see which ones were invalid."
|
status "Please note! One or more evtx was invalid! You can scroll up to see which ones were invalid."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
START_OLDEST_FORMATTED=`date +%Y-%m-%d --date="$START_OLDEST"`
|
START_OLDEST_FORMATTED=`date +%Y-%m-%d --date="$START_OLDEST"`
|
||||||
START_OLDEST_SLASH=$(echo $START_OLDEST_FORMATTED | sed -e 's/-/%2F/g')
|
START_OLDEST_SLASH=$(echo $START_OLDEST_FORMATTED | sed -e 's/-/%2F/g')
|
||||||
END_NEWEST_SLASH=$(echo $END_NEWEST | sed -e 's/-/%2F/g')
|
END_NEWEST_SLASH=$(echo $END_NEWEST | sed -e 's/-/%2F/g')
|
||||||
|
|
||||||
if [ "$VALID_EVTXS" = "yes" ]; then
|
if [[ $VALID_EVTXS_COUNT -gt 0 ]] || [[ $SKIPPED_EVTXS_COUNT -gt 0 ]]; then
|
||||||
cat << EOF
|
URL="https://{{ URLBASE }}/#/dashboards?q=$HASH_FILTERS%20%7C%20groupby%20-sankey%20event.dataset%20event.category%2a%20%7C%20groupby%20-pie%20event.category%20%7C%20groupby%20-bar%20event.module%20%7C%20groupby%20event.dataset%20%7C%20groupby%20event.module%20%7C%20groupby%20event.category%20%7C%20groupby%20observer.name%20%7C%20groupby%20source.ip%20%7C%20groupby%20destination.ip%20%7C%20groupby%20destination.port&t=${START_OLDEST_SLASH}%2000%3A00%3A00%20AM%20-%20${END_NEWEST_SLASH}%2000%3A00%3A00%20AM&z=UTC"
|
||||||
|
|
||||||
Import complete!
|
status "Import complete!"
|
||||||
|
status
|
||||||
You can use the following hyperlink to view data in the time range of your import. You can triple-click to quickly highlight the entire hyperlink and you can then copy it into your browser:
|
status "Use the following hyperlink to view the imported data. Triple-click to quickly highlight the entire hyperlink and then copy it into a browser:"
|
||||||
https://{{ URLBASE }}/#/dashboards?q=import.id:${RUNID}%20%7C%20groupby%20-sankey%20event.dataset%20event.category%2a%20%7C%20groupby%20-pie%20event.category%20%7C%20groupby%20-bar%20event.module%20%7C%20groupby%20event.dataset%20%7C%20groupby%20event.module%20%7C%20groupby%20event.category%20%7C%20groupby%20observer.name%20%7C%20groupby%20source.ip%20%7C%20groupby%20destination.ip%20%7C%20groupby%20destination.port&t=${START_OLDEST_SLASH}%2000%3A00%3A00%20AM%20-%20${END_NEWEST_SLASH}%2000%3A00%3A00%20AM&z=UTC
|
status
|
||||||
|
status "$URL"
|
||||||
or you can manually set your Time Range to be (in UTC):
|
status
|
||||||
From: $START_OLDEST_FORMATTED To: $END_NEWEST
|
status "or, manually set the Time Range to be (in UTC):"
|
||||||
|
status
|
||||||
Please note that it may take 30 seconds or more for events to appear in Security Onion Console.
|
status "From: $START_OLDEST_FORMATTED To: $END_NEWEST"
|
||||||
EOF
|
status
|
||||||
|
status "Note: It can take 30 seconds or more for events to appear in Security Onion Console."
|
||||||
|
RESULT=0
|
||||||
|
else
|
||||||
|
START_OLDEST=
|
||||||
|
END_NEWEST=
|
||||||
|
URL=
|
||||||
|
RESULT=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ $json -eq 1 ]]; then
|
||||||
|
jq -n \
|
||||||
|
--arg success_count "$VALID_EVTXS_COUNT" \
|
||||||
|
--arg fail_count "$INVALID_EVTXS_COUNT" \
|
||||||
|
--arg skipped_count "$SKIPPED_EVTXS_COUNT" \
|
||||||
|
--arg begin_date "$START_OLDEST" \
|
||||||
|
--arg end_date "$END_NEWEST" \
|
||||||
|
--arg url "$URL" \
|
||||||
|
--arg hashes "$HASHES" \
|
||||||
|
'''{
|
||||||
|
success_count: $success_count,
|
||||||
|
fail_count: $fail_count,
|
||||||
|
skipped_count: $skipped_count,
|
||||||
|
begin_date: $begin_date,
|
||||||
|
end_date: $end_date,
|
||||||
|
url: $url,
|
||||||
|
hash: ($hashes / " ")
|
||||||
|
}'''
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $RESULT
|
||||||
|
|||||||
@@ -15,12 +15,51 @@
|
|||||||
|
|
||||||
function usage {
|
function usage {
|
||||||
cat << EOF
|
cat << EOF
|
||||||
Usage: $0 <pcap-file-1> [pcap-file-2] [pcap-file-N]
|
Usage: $0 [options] <pcap-file-1> [pcap-file-2] [pcap-file-N]
|
||||||
|
|
||||||
Imports one or more PCAP files onto a sensor node. The PCAP traffic will be analyzed and made available for review in the Security Onion toolset.
|
Imports one or more PCAP files onto a sensor node. The PCAP traffic will be analyzed and made available for review in the Security Onion toolset.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
--json Outputs summary in JSON format. Implies --quiet.
|
||||||
|
--quiet Silences progress information to stdout.
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
|
quiet=0
|
||||||
|
json=0
|
||||||
|
INPUT_FILES=
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
param=$1
|
||||||
|
shift
|
||||||
|
case "$param" in
|
||||||
|
--json)
|
||||||
|
json=1
|
||||||
|
quiet=1
|
||||||
|
;;
|
||||||
|
--quiet)
|
||||||
|
quiet=1
|
||||||
|
;;
|
||||||
|
-*)
|
||||||
|
echo "Encountered unexpected parameter: $param"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ "$INPUT_FILES" != "" ]]; then
|
||||||
|
INPUT_FILES="$INPUT_FILES $param"
|
||||||
|
else
|
||||||
|
INPUT_FILES="$param"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
function status {
|
||||||
|
msg=$1
|
||||||
|
[[ $quiet -eq 1 ]] && return
|
||||||
|
echo "$msg"
|
||||||
|
}
|
||||||
|
|
||||||
function pcapinfo() {
|
function pcapinfo() {
|
||||||
PCAP=$1
|
PCAP=$1
|
||||||
ARGS=$2
|
ARGS=$2
|
||||||
@@ -84,7 +123,7 @@ function zeek() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# if no parameters supplied, display usage
|
# if no parameters supplied, display usage
|
||||||
if [ $# -eq 0 ]; then
|
if [ "$INPUT_FILES" == "" ]; then
|
||||||
usage
|
usage
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -96,31 +135,30 @@ if [ ! -d /opt/so/conf/suricata ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# verify that all parameters are files
|
# verify that all parameters are files
|
||||||
for i in "$@"; do
|
for i in $INPUT_FILES; do
|
||||||
if ! [ -f "$i" ]; then
|
if ! [ -f "$i" ]; then
|
||||||
usage
|
|
||||||
echo "\"$i\" is not a valid file!"
|
echo "\"$i\" is not a valid file!"
|
||||||
exit 2
|
exit 2
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# track if we have any valid or invalid pcaps
|
|
||||||
INVALID_PCAPS="no"
|
|
||||||
VALID_PCAPS="no"
|
|
||||||
|
|
||||||
# track oldest start and newest end so that we can generate the Kibana search hyperlink at the end
|
# track oldest start and newest end so that we can generate the Kibana search hyperlink at the end
|
||||||
START_OLDEST="2050-12-31"
|
START_OLDEST="2050-12-31"
|
||||||
END_NEWEST="1971-01-01"
|
END_NEWEST="1971-01-01"
|
||||||
|
|
||||||
|
INVALID_PCAPS_COUNT=0
|
||||||
|
VALID_PCAPS_COUNT=0
|
||||||
|
SKIPPED_PCAPS_COUNT=0
|
||||||
|
|
||||||
# paths must be quoted in case they include spaces
|
# paths must be quoted in case they include spaces
|
||||||
for PCAP in "$@"; do
|
for PCAP in $INPUT_FILES; do
|
||||||
PCAP=$(/usr/bin/realpath "$PCAP")
|
PCAP=$(/usr/bin/realpath "$PCAP")
|
||||||
echo "Processing Import: ${PCAP}"
|
status "Processing Import: ${PCAP}"
|
||||||
echo "- verifying file"
|
status "- verifying file"
|
||||||
if ! pcapinfo "${PCAP}" > /dev/null 2>&1; then
|
if ! pcapinfo "${PCAP}" > /dev/null 2>&1; then
|
||||||
# try to fix pcap and then process the fixed pcap directly
|
# try to fix pcap and then process the fixed pcap directly
|
||||||
PCAP_FIXED=`mktemp /tmp/so-import-pcap-XXXXXXXXXX.pcap`
|
PCAP_FIXED=`mktemp /tmp/so-import-pcap-XXXXXXXXXX.pcap`
|
||||||
echo "- attempting to recover corrupted PCAP file"
|
status "- attempting to recover corrupted PCAP file"
|
||||||
pcapfix "${PCAP}" "${PCAP_FIXED}"
|
pcapfix "${PCAP}" "${PCAP_FIXED}"
|
||||||
# Make fixed file world readable since the Suricata docker container will runas a non-root user
|
# Make fixed file world readable since the Suricata docker container will runas a non-root user
|
||||||
chmod a+r "${PCAP_FIXED}"
|
chmod a+r "${PCAP_FIXED}"
|
||||||
@@ -131,33 +169,44 @@ for PCAP in "$@"; do
|
|||||||
# generate a unique hash to assist with dedupe checks
|
# generate a unique hash to assist with dedupe checks
|
||||||
HASH=$(md5sum "${PCAP}" | awk '{ print $1 }')
|
HASH=$(md5sum "${PCAP}" | awk '{ print $1 }')
|
||||||
HASH_DIR=/nsm/import/${HASH}
|
HASH_DIR=/nsm/import/${HASH}
|
||||||
echo "- assigning unique identifier to import: $HASH"
|
status "- assigning unique identifier to import: $HASH"
|
||||||
|
|
||||||
if [ -d $HASH_DIR ]; then
|
pcap_data=$(pcapinfo "${PCAP}")
|
||||||
echo "- this PCAP has already been imported; skipping"
|
if ! echo "$pcap_data" | grep -q "First packet time:" || echo "$pcap_data" |egrep -q "Last packet time: 1970-01-01|Last packet time: n/a"; then
|
||||||
INVALID_PCAPS="yes"
|
status "- this PCAP file is invalid; skipping"
|
||||||
elif pcapinfo "${PCAP}" |egrep -q "Last packet time: 1970-01-01|Last packet time: n/a"; then
|
INVALID_PCAPS_COUNT=$((INVALID_PCAPS_COUNT + 1))
|
||||||
echo "- this PCAP file is invalid; skipping"
|
|
||||||
INVALID_PCAPS="yes"
|
|
||||||
else
|
else
|
||||||
VALID_PCAPS="yes"
|
if [ -d $HASH_DIR ]; then
|
||||||
|
status "- this PCAP has already been imported; skipping"
|
||||||
|
SKIPPED_PCAPS_COUNT=$((SKIPPED_PCAPS_COUNT + 1))
|
||||||
|
else
|
||||||
|
VALID_PCAPS_COUNT=$((VALID_PCAPS_COUNT + 1))
|
||||||
|
|
||||||
PCAP_DIR=$HASH_DIR/pcap
|
PCAP_DIR=$HASH_DIR/pcap
|
||||||
mkdir -p $PCAP_DIR
|
mkdir -p $PCAP_DIR
|
||||||
|
|
||||||
# generate IDS alerts and write them to standard pipeline
|
# generate IDS alerts and write them to standard pipeline
|
||||||
echo "- analyzing traffic with Suricata"
|
status "- analyzing traffic with Suricata"
|
||||||
suricata "${PCAP}" $HASH
|
suricata "${PCAP}" $HASH
|
||||||
{% if salt['pillar.get']('global:mdengine') == 'ZEEK' %}
|
{% if salt['pillar.get']('global:mdengine') == 'ZEEK' %}
|
||||||
# generate Zeek logs and write them to a unique subdirectory in /nsm/import/zeek/
|
# generate Zeek logs and write them to a unique subdirectory in /nsm/import/zeek/
|
||||||
# since each run writes to a unique subdirectory, there is no need for a lock file
|
# since each run writes to a unique subdirectory, there is no need for a lock file
|
||||||
echo "- analyzing traffic with Zeek"
|
status "- analyzing traffic with Zeek"
|
||||||
zeek "${PCAP}" $HASH
|
zeek "${PCAP}" $HASH
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$HASH_FILTERS" == "" ]]; then
|
||||||
|
HASH_FILTERS="import.id:${HASH}"
|
||||||
|
HASHES="${HASH}"
|
||||||
|
else
|
||||||
|
HASH_FILTERS="$HASH_FILTERS%20OR%20import.id:${HASH}"
|
||||||
|
HASHES="${HASHES} ${HASH}"
|
||||||
|
fi
|
||||||
|
|
||||||
START=$(pcapinfo "${PCAP}" -a |grep "First packet time:" | awk '{print $4}')
|
START=$(pcapinfo "${PCAP}" -a |grep "First packet time:" | awk '{print $4}')
|
||||||
END=$(pcapinfo "${PCAP}" -e |grep "Last packet time:" | awk '{print $4}')
|
END=$(pcapinfo "${PCAP}" -e |grep "Last packet time:" | awk '{print $4}')
|
||||||
echo "- saving PCAP data spanning dates $START through $END"
|
status "- found PCAP data spanning dates $START through $END"
|
||||||
|
|
||||||
# compare $START to $START_OLDEST
|
# compare $START to $START_OLDEST
|
||||||
START_COMPARE=$(date -d $START +%s)
|
START_COMPARE=$(date -d $START +%s)
|
||||||
@@ -179,37 +228,62 @@ for PCAP in "$@"; do
|
|||||||
|
|
||||||
fi # end of valid pcap
|
fi # end of valid pcap
|
||||||
|
|
||||||
echo
|
status
|
||||||
|
|
||||||
done # end of for-loop processing pcap files
|
done # end of for-loop processing pcap files
|
||||||
|
|
||||||
# remove temp files
|
# remove temp files
|
||||||
echo "Cleaning up:"
|
|
||||||
for TEMP_PCAP in ${TEMP_PCAPS[@]}; do
|
for TEMP_PCAP in ${TEMP_PCAPS[@]}; do
|
||||||
echo "- removing temporary pcap $TEMP_PCAP"
|
status "- removing temporary pcap $TEMP_PCAP"
|
||||||
rm -f $TEMP_PCAP
|
rm -f $TEMP_PCAP
|
||||||
done
|
done
|
||||||
|
|
||||||
# output final messages
|
# output final messages
|
||||||
if [ "$INVALID_PCAPS" = "yes" ]; then
|
if [[ $INVALID_PCAPS_COUNT -gt 0 ]]; then
|
||||||
echo
|
status
|
||||||
echo "Please note! One or more pcaps was invalid! You can scroll up to see which ones were invalid."
|
status "WARNING: One or more pcaps was invalid. Scroll up to see which ones were invalid."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
START_OLDEST_SLASH=$(echo $START_OLDEST | sed -e 's/-/%2F/g')
|
START_OLDEST_SLASH=$(echo $START_OLDEST | sed -e 's/-/%2F/g')
|
||||||
END_NEWEST_SLASH=$(echo $END_NEWEST | sed -e 's/-/%2F/g')
|
END_NEWEST_SLASH=$(echo $END_NEWEST | sed -e 's/-/%2F/g')
|
||||||
|
if [[ $VALID_PCAPS_COUNT -gt 0 ]] || [[ $SKIPPED_PCAPS_COUNT -gt 0 ]]; then
|
||||||
|
URL="https://{{ URLBASE }}/#/dashboards?q=$HASH_FILTERS%20%7C%20groupby%20-sankey%20event.dataset%20event.category%2a%20%7C%20groupby%20-pie%20event.category%20%7C%20groupby%20-bar%20event.module%20%7C%20groupby%20event.dataset%20%7C%20groupby%20event.module%20%7C%20groupby%20event.category%20%7C%20groupby%20observer.name%20%7C%20groupby%20source.ip%20%7C%20groupby%20destination.ip%20%7C%20groupby%20destination.port&t=${START_OLDEST_SLASH}%2000%3A00%3A00%20AM%20-%20${END_NEWEST_SLASH}%2000%3A00%3A00%20AM&z=UTC"
|
||||||
|
|
||||||
if [ "$VALID_PCAPS" = "yes" ]; then
|
status "Import complete!"
|
||||||
cat << EOF
|
status
|
||||||
|
status "Use the following hyperlink to view the imported data. Triple-click to quickly highlight the entire hyperlink and then copy it into a browser:"
|
||||||
Import complete!
|
status "$URL"
|
||||||
|
status
|
||||||
You can use the following hyperlink to view data in the time range of your import. You can triple-click to quickly highlight the entire hyperlink and you can then copy it into your browser:
|
status "or, manually set the Time Range to be (in UTC):"
|
||||||
https://{{ URLBASE }}/#/dashboards?q=import.id:${HASH}%20%7C%20groupby%20-sankey%20event.dataset%20event.category%2a%20%7C%20groupby%20-pie%20event.category%20%7C%20groupby%20-bar%20event.module%20%7C%20groupby%20event.dataset%20%7C%20groupby%20event.module%20%7C%20groupby%20event.category%20%7C%20groupby%20observer.name%20%7C%20groupby%20source.ip%20%7C%20groupby%20destination.ip%20%7C%20groupby%20destination.port&t=${START_OLDEST_SLASH}%2000%3A00%3A00%20AM%20-%20${END_NEWEST_SLASH}%2000%3A00%3A00%20AM&z=UTC
|
status "From: $START_OLDEST To: $END_NEWEST"
|
||||||
|
status
|
||||||
or you can manually set your Time Range to be (in UTC):
|
status "Note: It can take 30 seconds or more for events to appear in Security Onion Console."
|
||||||
From: $START_OLDEST To: $END_NEWEST
|
RESULT=0
|
||||||
|
else
|
||||||
Please note that it may take 30 seconds or more for events to appear in Security Onion Console.
|
START_OLDEST=
|
||||||
EOF
|
END_NEWEST=
|
||||||
|
URL=
|
||||||
|
RESULT=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ $json -eq 1 ]]; then
|
||||||
|
jq -n \
|
||||||
|
--arg success_count "$VALID_PCAPS_COUNT" \
|
||||||
|
--arg fail_count "$INVALID_PCAPS_COUNT" \
|
||||||
|
--arg skipped_count "$SKIPPED_PCAPS_COUNT" \
|
||||||
|
--arg begin_date "$START_OLDEST" \
|
||||||
|
--arg end_date "$END_NEWEST" \
|
||||||
|
--arg url "$URL" \
|
||||||
|
--arg hashes "$HASHES" \
|
||||||
|
'''{
|
||||||
|
success_count: $success_count,
|
||||||
|
fail_count: $fail_count,
|
||||||
|
skipped_count: $skipped_count,
|
||||||
|
begin_date: $begin_date,
|
||||||
|
end_date: $end_date,
|
||||||
|
url: $url,
|
||||||
|
hash: ($hashes / " ")
|
||||||
|
}'''
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $RESULT
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
# https://securityonion.net/license; you may not use this file except in compliance with the
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
# Elastic License 2.0.
|
# Elastic License 2.0.
|
||||||
|
|
||||||
@@ -9,25 +9,26 @@
|
|||||||
|
|
||||||
. /usr/sbin/so-common
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
appliance_check() {
|
{%- if salt['grains.get']('sosmodel', '') %}
|
||||||
{%- if salt['grains.get']('sosmodel', '') %}
|
{%- set model = salt['grains.get']('sosmodel') %}
|
||||||
APPLIANCE=1
|
model={{ model }}
|
||||||
{%- if grains['sosmodel'] in ['SO2AMI01', 'SO2GCI01', 'SO2AZI01'] %}
|
# Don't need cloud images to use this
|
||||||
exit 0
|
if [[ $model =~ ^(SO2AMI01|SO2AZI01|SO2GCI01)$ ]]; then
|
||||||
{%- endif %}
|
exit 0
|
||||||
DUDEYOUGOTADELL=$(dmidecode |grep Dell)
|
fi
|
||||||
if [[ -n $DUDEYOUGOTADELL ]]; then
|
{%- else %}
|
||||||
APPTYPE=dell
|
echo "This is not an appliance"
|
||||||
else
|
exit 0
|
||||||
APPTYPE=sm
|
{%- endif %}
|
||||||
fi
|
if [[ $model =~ ^(SOS10K|SOS500|SOS1000|SOS1000F|SOS4000|SOSSN7200|SOSSNNV|SOSMN)$ ]]; then
|
||||||
mkdir -p /opt/so/log/raid
|
is_bossraid=true
|
||||||
|
fi
|
||||||
{%- else %}
|
if [[ $model =~ ^(SOSSNNV|SOSMN)$ ]]; then
|
||||||
echo "This is not an appliance"
|
is_swraid=true
|
||||||
exit 0
|
fi
|
||||||
{%- endif %}
|
if [[ $model =~ ^(SOS10K|SOS500|SOS1000|SOS1000F|SOS4000|SOSSN7200)$ ]]; then
|
||||||
}
|
is_hwraid=true
|
||||||
|
fi
|
||||||
|
|
||||||
check_nsm_raid() {
|
check_nsm_raid() {
|
||||||
PERCCLI=$(/opt/raidtools/perccli/perccli64 /c0/v0 show|grep RAID|grep Optl)
|
PERCCLI=$(/opt/raidtools/perccli/perccli64 /c0/v0 show|grep RAID|grep Optl)
|
||||||
@@ -49,61 +50,44 @@ check_nsm_raid() {
|
|||||||
check_boss_raid() {
|
check_boss_raid() {
|
||||||
MVCLI=$(/usr/local/bin/mvcli info -o vd |grep status |grep functional)
|
MVCLI=$(/usr/local/bin/mvcli info -o vd |grep status |grep functional)
|
||||||
|
|
||||||
if [[ -n $DUDEYOUGOTADELL ]]; then
|
if [[ -n $MVCLI ]]; then
|
||||||
if [[ -n $MVCLI ]]; then
|
BOSSRAID=0
|
||||||
BOSSRAID=0
|
else
|
||||||
else
|
BOSSRAID=1
|
||||||
BOSSRAID=1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check_software_raid() {
|
check_software_raid() {
|
||||||
if [[ -n $DUDEYOUGOTADELL ]]; then
|
SWRC=$(grep "_" /proc/mdstat)
|
||||||
SWRC=$(grep "_" /proc/mdstat)
|
if [[ -n $SWRC ]]; then
|
||||||
|
# RAID is failed in some way
|
||||||
if [[ -n $SWRC ]]; then
|
SWRAID=1
|
||||||
# RAID is failed in some way
|
else
|
||||||
SWRAID=1
|
SWRAID=0
|
||||||
else
|
|
||||||
SWRAID=0
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# This script checks raid status if you use SO appliances
|
# Set everything to 0
|
||||||
|
SWRAID=0
|
||||||
|
BOSSRAID=0
|
||||||
|
HWRAID=0
|
||||||
|
|
||||||
# See if this is an appliance
|
if [[ $is_hwraid ]]; then
|
||||||
|
check_nsm_raid
|
||||||
appliance_check
|
fi
|
||||||
check_nsm_raid
|
if [[ $is_bossraid ]]; then
|
||||||
check_boss_raid
|
check_boss_raid
|
||||||
{%- if salt['grains.get']('sosmodel', '') %}
|
fi
|
||||||
{%- if grains['sosmodel'] in ['SOSMN', 'SOSSNNV'] %}
|
if [[ $is_swraid ]]; then
|
||||||
check_software_raid
|
check_software_raid
|
||||||
{%- endif %}
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
if [[ -n $SWRAID ]]; then
|
|
||||||
if [[ $SWRAID == '0' && $BOSSRAID == '0' ]]; then
|
|
||||||
RAIDSTATUS=0
|
|
||||||
else
|
|
||||||
RAIDSTATUS=1
|
|
||||||
fi
|
|
||||||
elif [[ -n $DUDEYOUGOTADELL ]]; then
|
|
||||||
if [[ $BOSSRAID == '0' && $HWRAID == '0' ]]; then
|
|
||||||
RAIDSTATUS=0
|
|
||||||
else
|
|
||||||
RAIDSTATUS=1
|
|
||||||
fi
|
|
||||||
elif [[ "$APPTYPE" == 'sm' ]]; then
|
|
||||||
if [[ -n "$HWRAID" ]]; then
|
|
||||||
RAIDSTATUS=0
|
|
||||||
else
|
|
||||||
RAIDSTATUS=1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "nsmraid=$RAIDSTATUS" > /opt/so/log/raid/status.log
|
sum=$(($SWRAID + $BOSSRAID + $HWRAID))
|
||||||
|
|
||||||
|
if [[ $sum == "0" ]]; then
|
||||||
|
RAIDSTATUS=0
|
||||||
|
else
|
||||||
|
RAIDSTATUS=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "nsmraid=$RAIDSTATUS" > /opt/so/log/raid/status.log
|
||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ actions:
|
|||||||
options:
|
options:
|
||||||
delete_aliases: False
|
delete_aliases: False
|
||||||
timeout_override:
|
timeout_override:
|
||||||
continue_if_exception: False
|
ignore_empty_list: True
|
||||||
disable_action: False
|
disable_action: False
|
||||||
filters:
|
filters:
|
||||||
- filtertype: pattern
|
- filtertype: pattern
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# Specify the dconf path
|
||||||
|
[org/gnome/desktop/background]
|
||||||
|
|
||||||
|
# Specify the path to the desktop background image file
|
||||||
|
picture-uri='file:///usr/local/share/backgrounds/so-wallpaper.jpg'
|
||||||
|
|
||||||
|
# Specify one of the rendering options for the background image:
|
||||||
|
picture-options='zoom'
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# This file is managed by Salt in the desktop.xwindows state
|
||||||
|
# It will not be overwritten if it already exists
|
||||||
|
|
||||||
|
[User]
|
||||||
|
Session=gnome-classic
|
||||||
|
Icon=/home/{{USERNAME}}/.face
|
||||||
|
SystemAccount=false
|
||||||
|
Before Width: | Height: | Size: 269 KiB After Width: | Height: | Size: 269 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 319 KiB After Width: | Height: | Size: 319 KiB |
@@ -1,7 +1,7 @@
|
|||||||
include:
|
include:
|
||||||
- workstation.xwindows
|
- desktop.xwindows
|
||||||
{# If the master is 'salt' then the minion hasn't been configured and isn't connected to the grid. #}
|
{# If the master is 'salt' then the minion hasn't been configured and isn't connected to the grid. #}
|
||||||
{# We need this since the trusted-ca state uses mine data. #}
|
{# We need this since the trusted-ca state uses mine data. #}
|
||||||
{% if grains.master != 'salt' %}
|
{% if grains.master != 'salt' %}
|
||||||
- workstation.trusted-ca
|
- desktop.trusted-ca
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -0,0 +1,442 @@
|
|||||||
|
{# we only want this state to run it is CentOS #}
|
||||||
|
{% if grains.os == 'OEL' %}
|
||||||
|
|
||||||
|
desktop_packages:
|
||||||
|
pkg.installed:
|
||||||
|
- pkgs:
|
||||||
|
- ModemManager
|
||||||
|
- ModemManager-glib
|
||||||
|
- NetworkManager
|
||||||
|
- NetworkManager-adsl
|
||||||
|
- NetworkManager-bluetooth
|
||||||
|
- NetworkManager-config-server
|
||||||
|
- NetworkManager-libnm
|
||||||
|
- NetworkManager-team
|
||||||
|
- NetworkManager-tui
|
||||||
|
- NetworkManager-wifi
|
||||||
|
- NetworkManager-wwan
|
||||||
|
- PackageKit
|
||||||
|
- PackageKit-command-not-found
|
||||||
|
- PackageKit-glib
|
||||||
|
- PackageKit-gstreamer-plugin
|
||||||
|
- PackageKit-gtk3-module
|
||||||
|
- audit
|
||||||
|
- audit-libs
|
||||||
|
- authselect
|
||||||
|
- authselect-libs
|
||||||
|
- avahi
|
||||||
|
- avahi-glib
|
||||||
|
- avahi-libs
|
||||||
|
- baobab
|
||||||
|
- basesystem
|
||||||
|
- bc
|
||||||
|
- bcache-tools
|
||||||
|
- bluez
|
||||||
|
- bluez-libs
|
||||||
|
- bluez-obexd
|
||||||
|
- bolt
|
||||||
|
- bzip2
|
||||||
|
- bzip2-libs
|
||||||
|
- c-ares
|
||||||
|
- ca-certificates
|
||||||
|
- cairo
|
||||||
|
- cairo-gobject
|
||||||
|
- cairomm
|
||||||
|
- checkpolicy
|
||||||
|
- chkconfig
|
||||||
|
- chrome-gnome-shell
|
||||||
|
- chromium
|
||||||
|
- clutter
|
||||||
|
- clutter-gst3
|
||||||
|
- clutter-gtk
|
||||||
|
- cogl
|
||||||
|
- color-filesystem
|
||||||
|
- colord
|
||||||
|
- colord-gtk
|
||||||
|
- colord-libs
|
||||||
|
- conmon
|
||||||
|
- cups
|
||||||
|
- cups-client
|
||||||
|
- cups-filesystem
|
||||||
|
- cups-filters
|
||||||
|
- cups-filters-libs
|
||||||
|
- cups-ipptool
|
||||||
|
- cups-libs
|
||||||
|
- cups-pk-helper
|
||||||
|
- dconf
|
||||||
|
- dejavu-sans-fonts
|
||||||
|
- dejavu-sans-mono-fonts
|
||||||
|
- dejavu-serif-fonts
|
||||||
|
- desktop-file-utils
|
||||||
|
- dsniff
|
||||||
|
- ethtool
|
||||||
|
- evolution-data-server
|
||||||
|
- evolution-data-server-langpacks
|
||||||
|
- file
|
||||||
|
- flac-libs
|
||||||
|
- flashrom
|
||||||
|
- flatpak
|
||||||
|
- flatpak-libs
|
||||||
|
- flatpak-selinux
|
||||||
|
- flatpak-session-helper
|
||||||
|
- fontconfig
|
||||||
|
- fonts-filesystem
|
||||||
|
- foomatic
|
||||||
|
- foomatic-db
|
||||||
|
- foomatic-db-filesystem
|
||||||
|
- foomatic-db-ppds
|
||||||
|
- freetype
|
||||||
|
- fuse
|
||||||
|
- fuse-common
|
||||||
|
- fuse-libs
|
||||||
|
- fuse-overlayfs
|
||||||
|
- fuse3
|
||||||
|
- fuse3-libs
|
||||||
|
- fwupd
|
||||||
|
- fwupd-plugin-flashrom
|
||||||
|
- gcr
|
||||||
|
- gcr-base
|
||||||
|
- gd
|
||||||
|
- gdbm-libs
|
||||||
|
- gdisk
|
||||||
|
- gdk-pixbuf2
|
||||||
|
- gdk-pixbuf2-modules
|
||||||
|
- gdm
|
||||||
|
- gedit
|
||||||
|
- geoclue2
|
||||||
|
- geoclue2-libs
|
||||||
|
- geocode-glib
|
||||||
|
- gettext
|
||||||
|
- gettext-libs
|
||||||
|
- ghostscript
|
||||||
|
- ghostscript-tools-fonts
|
||||||
|
- ghostscript-tools-printing
|
||||||
|
- giflib
|
||||||
|
- glx-utils
|
||||||
|
- gmp
|
||||||
|
- gnome-autoar
|
||||||
|
- gnome-bluetooth
|
||||||
|
- gnome-bluetooth-libs
|
||||||
|
- gnome-calculator
|
||||||
|
- gnome-characters
|
||||||
|
- gnome-classic-session
|
||||||
|
- gnome-color-manager
|
||||||
|
- gnome-control-center
|
||||||
|
- gnome-control-center-filesystem
|
||||||
|
- gnome-desktop3
|
||||||
|
- gnome-disk-utility
|
||||||
|
- gnome-font-viewer
|
||||||
|
- gnome-initial-setup
|
||||||
|
- gnome-keyring
|
||||||
|
- gnome-keyring-pam
|
||||||
|
- gnome-logs
|
||||||
|
- gnome-menus
|
||||||
|
- gnome-online-accounts
|
||||||
|
- gnome-remote-desktop
|
||||||
|
- gnome-screenshot
|
||||||
|
- gnome-session
|
||||||
|
- gnome-session-wayland-session
|
||||||
|
- gnome-session-xsession
|
||||||
|
- gnome-settings-daemon
|
||||||
|
- gnome-shell
|
||||||
|
- gnome-shell-extension-apps-menu
|
||||||
|
- gnome-shell-extension-background-logo
|
||||||
|
- gnome-shell-extension-common
|
||||||
|
- gnome-shell-extension-desktop-icons
|
||||||
|
- gnome-shell-extension-launch-new-instance
|
||||||
|
- gnome-shell-extension-places-menu
|
||||||
|
- gnome-shell-extension-window-list
|
||||||
|
- gnome-software
|
||||||
|
- gnome-system-monitor
|
||||||
|
- gnome-terminal
|
||||||
|
- gnome-terminal-nautilus
|
||||||
|
- gnome-tour
|
||||||
|
- gnome-user-docs
|
||||||
|
- gnome-video-effects
|
||||||
|
- gobject-introspection
|
||||||
|
- gom
|
||||||
|
- google-droid-sans-fonts
|
||||||
|
- google-noto-cjk-fonts-common
|
||||||
|
- google-noto-emoji-color-fonts
|
||||||
|
- google-noto-fonts-common
|
||||||
|
- google-noto-sans-cjk-ttc-fonts
|
||||||
|
- google-noto-sans-gurmukhi-fonts
|
||||||
|
- google-noto-sans-sinhala-vf-fonts
|
||||||
|
- google-noto-serif-cjk-ttc-fonts
|
||||||
|
- gpgme
|
||||||
|
- gpm-libs
|
||||||
|
- graphene
|
||||||
|
- graphite2
|
||||||
|
- gsettings-desktop-schemas
|
||||||
|
- gsm
|
||||||
|
- gsound
|
||||||
|
- gspell
|
||||||
|
- gstreamer1
|
||||||
|
- gstreamer1-plugins-bad-free
|
||||||
|
- gstreamer1-plugins-base
|
||||||
|
- gstreamer1-plugins-good
|
||||||
|
- gstreamer1-plugins-good-gtk
|
||||||
|
- gstreamer1-plugins-ugly-free
|
||||||
|
- gtk-update-icon-cache
|
||||||
|
- gtk2
|
||||||
|
- gtk3
|
||||||
|
- gtk4
|
||||||
|
- gtkmm30
|
||||||
|
- gtksourceview4
|
||||||
|
- gutenprint
|
||||||
|
- gutenprint-cups
|
||||||
|
- gutenprint-doc
|
||||||
|
- gutenprint-libs
|
||||||
|
- gvfs
|
||||||
|
- gvfs-client
|
||||||
|
- gvfs-fuse
|
||||||
|
- gvfs-goa
|
||||||
|
- gvfs-gphoto2
|
||||||
|
- gvfs-mtp
|
||||||
|
- gvfs-smb
|
||||||
|
- gzip
|
||||||
|
- harfbuzz
|
||||||
|
- harfbuzz-icu
|
||||||
|
- hdparm
|
||||||
|
- hicolor-icon-theme
|
||||||
|
- highcontrast-icon-theme
|
||||||
|
- hplip-common
|
||||||
|
- hplip-libs
|
||||||
|
- hunspell
|
||||||
|
- hunspell-en
|
||||||
|
- hunspell-en-GB
|
||||||
|
- hunspell-en-US
|
||||||
|
- hunspell-filesystem
|
||||||
|
- hyphen
|
||||||
|
- ibus
|
||||||
|
- ibus-gtk3
|
||||||
|
- ibus-libs
|
||||||
|
- ibus-setup
|
||||||
|
- iio-sensor-proxy
|
||||||
|
- ima-evm-utils
|
||||||
|
- inih
|
||||||
|
- initscripts-rename-device
|
||||||
|
- initscripts-service
|
||||||
|
- iso-codes
|
||||||
|
- jansson
|
||||||
|
- jbig2dec-libs
|
||||||
|
- jbigkit-libs
|
||||||
|
- jomolhari-fonts
|
||||||
|
- jose
|
||||||
|
- jq
|
||||||
|
- json-c
|
||||||
|
- json-glib
|
||||||
|
- julietaula-montserrat-fonts
|
||||||
|
- kbd
|
||||||
|
- kbd-misc
|
||||||
|
- khmer-os-system-fonts
|
||||||
|
- langpacks-core-en
|
||||||
|
- langpacks-core-font-en
|
||||||
|
- langpacks-en
|
||||||
|
- lcms2
|
||||||
|
- libICE
|
||||||
|
- libSM
|
||||||
|
- libX11
|
||||||
|
- libX11-common
|
||||||
|
- libX11-xcb
|
||||||
|
- libXau
|
||||||
|
- libXcomposite
|
||||||
|
- libXcursor
|
||||||
|
- libXdamage
|
||||||
|
- libXdmcp
|
||||||
|
- libXext
|
||||||
|
- libXfixes
|
||||||
|
- libXfont2
|
||||||
|
- libXft
|
||||||
|
- libXi
|
||||||
|
- libXinerama
|
||||||
|
- libXmu
|
||||||
|
- libXpm
|
||||||
|
- libXrandr
|
||||||
|
- libXrender
|
||||||
|
- libXres
|
||||||
|
- libXt
|
||||||
|
- libXtst
|
||||||
|
- libXv
|
||||||
|
- libXxf86dga
|
||||||
|
- libXxf86vm
|
||||||
|
- libappstream-glib
|
||||||
|
- liberation-fonts-common
|
||||||
|
- liberation-mono-fonts
|
||||||
|
- liberation-sans-fonts
|
||||||
|
- liberation-serif-fonts
|
||||||
|
- libertas-sd8787-firmware
|
||||||
|
- libglvnd-gles
|
||||||
|
- libglvnd-glx
|
||||||
|
- libglvnd-opengl
|
||||||
|
- libgnomekbd
|
||||||
|
- libgomp
|
||||||
|
- libgphoto2
|
||||||
|
- lockdev
|
||||||
|
- lohit-assamese-fonts
|
||||||
|
- lohit-bengali-fonts
|
||||||
|
- lohit-devanagari-fonts
|
||||||
|
- lohit-gujarati-fonts
|
||||||
|
- lohit-kannada-fonts
|
||||||
|
- lohit-odia-fonts
|
||||||
|
- lohit-tamil-fonts
|
||||||
|
- lohit-telugu-fonts
|
||||||
|
- lshw
|
||||||
|
- lsof
|
||||||
|
- mesa-dri-drivers
|
||||||
|
- mesa-filesystem
|
||||||
|
- mesa-libEGL
|
||||||
|
- mesa-libGL
|
||||||
|
- mesa-libgbm
|
||||||
|
- mesa-libglapi
|
||||||
|
- mesa-libxatracker
|
||||||
|
- mesa-vulkan-drivers
|
||||||
|
- microcode_ctl
|
||||||
|
- mobile-broadband-provider-info
|
||||||
|
- mono-devel
|
||||||
|
- mpfr
|
||||||
|
- mpg123-libs
|
||||||
|
- mtdev
|
||||||
|
- mtr
|
||||||
|
- nautilus
|
||||||
|
- nautilus-extensions
|
||||||
|
- net-tools
|
||||||
|
- nvme-cli
|
||||||
|
- open-vm-tools-desktop
|
||||||
|
- oracle-backgrounds
|
||||||
|
- oracle-indexhtml
|
||||||
|
- oracle-logos
|
||||||
|
- pcaudiolib
|
||||||
|
- pciutils
|
||||||
|
- pinentry
|
||||||
|
- pinentry-gnome3
|
||||||
|
- pinfo
|
||||||
|
- pipewire
|
||||||
|
- pipewire-alsa
|
||||||
|
- pipewire-gstreamer
|
||||||
|
- pipewire-jack-audio-connection-kit
|
||||||
|
- pipewire-libs
|
||||||
|
- pipewire-pulseaudio
|
||||||
|
- pipewire-utils
|
||||||
|
- pixman
|
||||||
|
- plymouth
|
||||||
|
- plymouth-core-libs
|
||||||
|
- plymouth-graphics-libs
|
||||||
|
- plymouth-plugin-label
|
||||||
|
- plymouth-plugin-two-step
|
||||||
|
- plymouth-scripts
|
||||||
|
- plymouth-system-theme
|
||||||
|
- plymouth-theme-spinner
|
||||||
|
- policycoreutils
|
||||||
|
- policycoreutils-python-utils
|
||||||
|
- pt-sans-fonts
|
||||||
|
- pulseaudio-libs
|
||||||
|
- pulseaudio-libs-glib2
|
||||||
|
- pulseaudio-utils
|
||||||
|
- sane-airscan
|
||||||
|
- sane-backends
|
||||||
|
- sane-backends-drivers-cameras
|
||||||
|
- sane-backends-drivers-scanners
|
||||||
|
- sane-backends-libs
|
||||||
|
- sil-abyssinica-fonts
|
||||||
|
- sil-nuosu-fonts
|
||||||
|
- sil-padauk-fonts
|
||||||
|
- smartmontools
|
||||||
|
- smc-meera-fonts
|
||||||
|
- snappy
|
||||||
|
- sound-theme-freedesktop
|
||||||
|
- soundtouch
|
||||||
|
- securityonion-networkminer
|
||||||
|
- speech-dispatcher
|
||||||
|
- speech-dispatcher-espeak-ng
|
||||||
|
- speex
|
||||||
|
- spice-vdagent
|
||||||
|
- switcheroo-control
|
||||||
|
- symlinks
|
||||||
|
- system-config-printer-libs
|
||||||
|
- system-config-printer-udev
|
||||||
|
- taglib
|
||||||
|
- tcpdump
|
||||||
|
- tcpflow
|
||||||
|
- thai-scalable-fonts-common
|
||||||
|
- thai-scalable-waree-fonts
|
||||||
|
- totem
|
||||||
|
- totem-pl-parser
|
||||||
|
- totem-video-thumbnailer
|
||||||
|
- tpm2-tools
|
||||||
|
- tpm2-tss
|
||||||
|
- tracer-common
|
||||||
|
- tracker
|
||||||
|
- tracker-miners
|
||||||
|
- tree
|
||||||
|
- tuned
|
||||||
|
- twolame-libs
|
||||||
|
- tzdata
|
||||||
|
- udisks2
|
||||||
|
- udisks2-iscsi
|
||||||
|
- udisks2-lvm2
|
||||||
|
- unzip
|
||||||
|
- upower
|
||||||
|
- urw-base35-bookman-fonts
|
||||||
|
- urw-base35-c059-fonts
|
||||||
|
- urw-base35-d050000l-fonts
|
||||||
|
- urw-base35-fonts
|
||||||
|
- urw-base35-fonts-common
|
||||||
|
- urw-base35-gothic-fonts
|
||||||
|
- urw-base35-nimbus-mono-ps-fonts
|
||||||
|
- urw-base35-nimbus-roman-fonts
|
||||||
|
- urw-base35-nimbus-sans-fonts
|
||||||
|
- urw-base35-p052-fonts
|
||||||
|
- urw-base35-standard-symbols-ps-fonts
|
||||||
|
- urw-base35-z003-fonts
|
||||||
|
- usb_modeswitch
|
||||||
|
- usb_modeswitch-data
|
||||||
|
- usbutils
|
||||||
|
- usermode
|
||||||
|
- userspace-rcu
|
||||||
|
- vdo
|
||||||
|
- vulkan-loader
|
||||||
|
- wavpack
|
||||||
|
- webkit2gtk3
|
||||||
|
- webkit2gtk3-jsc
|
||||||
|
- webrtc-audio-processing
|
||||||
|
- whois
|
||||||
|
- wireless-regdb
|
||||||
|
- wireplumber
|
||||||
|
- wireplumber-libs
|
||||||
|
- wireshark
|
||||||
|
- woff2
|
||||||
|
- words
|
||||||
|
- wpa_supplicant
|
||||||
|
- wpebackend-fdo
|
||||||
|
- xdg-dbus-proxy
|
||||||
|
- xdg-desktop-portal
|
||||||
|
- xdg-desktop-portal-gnome
|
||||||
|
- xdg-desktop-portal-gtk
|
||||||
|
- xdg-user-dirs
|
||||||
|
- xdg-user-dirs-gtk
|
||||||
|
- xdg-utils
|
||||||
|
- xkeyboard-config
|
||||||
|
- xorg-x11-drv-evdev
|
||||||
|
- xorg-x11-drv-fbdev
|
||||||
|
- xorg-x11-drv-libinput
|
||||||
|
- xorg-x11-drv-vmware
|
||||||
|
- xorg-x11-drv-wacom
|
||||||
|
- xorg-x11-drv-wacom-serial-support
|
||||||
|
- xorg-x11-server-Xorg
|
||||||
|
- xorg-x11-server-Xwayland
|
||||||
|
- xorg-x11-server-common
|
||||||
|
- xorg-x11-server-utils
|
||||||
|
- xorg-x11-utils
|
||||||
|
- xorg-x11-xauth
|
||||||
|
- xorg-x11-xinit
|
||||||
|
- xorg-x11-xinit-session
|
||||||
|
- zip
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
desktop_packages_os_fail:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- comment: 'SO desktop can only be installed on Oracle Linux'
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
|
||||||
|
|
||||||
{# we only want this state to run it is CentOS #}
|
{# we only want this state to run it is CentOS #}
|
||||||
{% if GLOBALS.os == 'Rocky' %}
|
{% if grains.os == 'OEL' %}
|
||||||
|
|
||||||
remove_graphical_target:
|
remove_graphical_target:
|
||||||
file.symlink:
|
file.symlink:
|
||||||
@@ -10,8 +8,8 @@ remove_graphical_target:
|
|||||||
- force: True
|
- force: True
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
workstation_trusted-ca_os_fail:
|
desktop_trusted-ca_os_fail:
|
||||||
test.fail_without_changes:
|
test.fail_without_changes:
|
||||||
- comment: 'SO Analyst Workstation can only be installed on CentOS'
|
- comment: 'SO Desktop can only be installed on Oracle Linux'
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
|
|
||||||
{# we only want this state to run it is CentOS #}
|
{# we only want this state to run it is CentOS #}
|
||||||
{% if GLOBALS.os == 'Rocky' %}
|
{% if GLOBALS.os == 'OEL' %}
|
||||||
|
|
||||||
{% set global_ca_text = [] %}
|
{% set global_ca_text = [] %}
|
||||||
{% set global_ca_server = [] %}
|
{% set global_ca_server = [] %}
|
||||||
@@ -29,8 +29,8 @@ update_ca_certs:
|
|||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
||||||
workstation_trusted-ca_os_fail:
|
desktop_trusted-ca_os_fail:
|
||||||
test.fail_without_changes:
|
test.fail_without_changes:
|
||||||
- comment: 'SO Analyst Workstation can only be installed on CentOS'
|
- comment: 'SO Desktop can only be installed on Oracle Linux'
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
{# we only want this state to run it is CentOS #}
|
||||||
|
{% if grains.os == 'OEL' %}
|
||||||
|
|
||||||
|
include:
|
||||||
|
- desktop.packages
|
||||||
|
|
||||||
|
graphical_target:
|
||||||
|
file.symlink:
|
||||||
|
- name: /etc/systemd/system/default.target
|
||||||
|
- target: /lib/systemd/system/graphical.target
|
||||||
|
- force: True
|
||||||
|
- require:
|
||||||
|
- desktop_packages
|
||||||
|
|
||||||
|
{# set users to use gnome-classic #}
|
||||||
|
{% for username in salt['file.find'](path='/home/',mindepth=1,maxdepth=1,type='d') %}
|
||||||
|
{% set username = username.split('/')[2] %}
|
||||||
|
{% if username != 'zeek' %}
|
||||||
|
{% if not salt['file.file_exists']('/var/lib/AccountsService/users/' ~ username) %}
|
||||||
|
|
||||||
|
{{username}}_session:
|
||||||
|
file.managed:
|
||||||
|
- name: /var/lib/AccountsService/users/{{username}}
|
||||||
|
- source: salt://desktop/files/session.jinja
|
||||||
|
- template: jinja
|
||||||
|
- defaults:
|
||||||
|
USERNAME: {{username}}
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
desktop_wallpaper:
|
||||||
|
file.managed:
|
||||||
|
- name: /usr/local/share/backgrounds/so-wallpaper.jpg
|
||||||
|
- source: salt://desktop/files/so-wallpaper.jpg
|
||||||
|
- makedirs: True
|
||||||
|
|
||||||
|
set_wallpaper:
|
||||||
|
file.managed:
|
||||||
|
- name: /etc/dconf/db/local.d/00-background
|
||||||
|
- source: salt://desktop/files/00-background
|
||||||
|
|
||||||
|
run_dconf_update:
|
||||||
|
cmd.run:
|
||||||
|
- name: 'dconf update'
|
||||||
|
- onchanges:
|
||||||
|
- file: set_wallpaper
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
desktop_xwindows_os_fail:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- comment: 'SO Desktop can only be installed on Oracle Linux'
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
docker:
|
docker:
|
||||||
bip: '172.17.0.1'
|
range: '172.17.1.0/24'
|
||||||
range: '172.17.0.0/24'
|
gateway: '172.17.1.1'
|
||||||
sorange: '172.17.1.0/24'
|
|
||||||
sobip: '172.17.1.1'
|
|
||||||
containers:
|
containers:
|
||||||
'so-dockerregistry':
|
'so-dockerregistry':
|
||||||
final_octet: 20
|
final_octet: 20
|
||||||
@@ -178,6 +176,14 @@ docker:
|
|||||||
custom_bind_mounts: []
|
custom_bind_mounts: []
|
||||||
extra_hosts: []
|
extra_hosts: []
|
||||||
extra_env: []
|
extra_env: []
|
||||||
|
'so-elastic-agent':
|
||||||
|
final_octet: 46
|
||||||
|
port_bindings:
|
||||||
|
- 0.0.0.0:514:514/tcp
|
||||||
|
- 0.0.0.0:514:514/udp
|
||||||
|
custom_bind_mounts: []
|
||||||
|
extra_hosts: []
|
||||||
|
extra_env: []
|
||||||
'so-telegraf':
|
'so-telegraf':
|
||||||
final_octet: 99
|
final_octet: 99
|
||||||
custom_bind_mounts: []
|
custom_bind_mounts: []
|
||||||
@@ -197,4 +203,4 @@ docker:
|
|||||||
final_octet: 99
|
final_octet: 99
|
||||||
custom_bind_mounts: []
|
custom_bind_mounts: []
|
||||||
extra_hosts: []
|
extra_hosts: []
|
||||||
extra_env: []
|
extra_env: []
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{% import_yaml 'docker/defaults.yaml' as DOCKERDEFAULTS %}
|
{% import_yaml 'docker/defaults.yaml' as DOCKERDEFAULTS %}
|
||||||
{% set DOCKER = salt['pillar.get']('docker', DOCKERDEFAULTS.docker, merge=True) %}
|
{% set DOCKER = salt['pillar.get']('docker', DOCKERDEFAULTS.docker, merge=True) %}
|
||||||
{% set RANGESPLIT = DOCKER.sorange.split('.') %}
|
{% set RANGESPLIT = DOCKER.range.split('.') %}
|
||||||
{% set FIRSTTHREE = RANGESPLIT[0] ~ '.' ~ RANGESPLIT[1] ~ '.' ~ RANGESPLIT[2] ~ '.' %}
|
{% set FIRSTTHREE = RANGESPLIT[0] ~ '.' ~ RANGESPLIT[1] ~ '.' ~ RANGESPLIT[2] ~ '.' %}
|
||||||
|
|
||||||
{% for container, vals in DOCKER.containers.items() %}
|
{% for container, vals in DOCKER.containers.items() %}
|
||||||
|
|||||||
@@ -12,7 +12,28 @@ dockergroup:
|
|||||||
- name: docker
|
- name: docker
|
||||||
- gid: 920
|
- gid: 920
|
||||||
|
|
||||||
{% if GLOBALS.os == 'Ubuntu' %}
|
{% if GLOBALS.os_family == 'Debian' %}
|
||||||
|
{% if grains.oscodename == 'bookworm' %}
|
||||||
|
dockerheldpackages:
|
||||||
|
pkg.installed:
|
||||||
|
- pkgs:
|
||||||
|
- containerd.io: 1.6.21-1
|
||||||
|
- docker-ce: 5:24.0.3-1~debian.12~bookworm
|
||||||
|
- docker-ce-cli: 5:24.0.3-1~debian.12~bookworm
|
||||||
|
- docker-ce-rootless-extras: 5:24.0.3-1~debian.12~bookworm
|
||||||
|
- hold: True
|
||||||
|
- update_holds: True
|
||||||
|
{% elif grains.oscodename == 'jammy' %}
|
||||||
|
dockerheldpackages:
|
||||||
|
pkg.installed:
|
||||||
|
- pkgs:
|
||||||
|
- containerd.io: 1.6.21-1
|
||||||
|
- docker-ce: 5:24.0.2-1~ubuntu.22.04~jammy
|
||||||
|
- docker-ce-cli: 5:24.0.2-1~ubuntu.22.04~jammy
|
||||||
|
- docker-ce-rootless-extras: 5:24.0.2-1~ubuntu.22.04~jammy
|
||||||
|
- hold: True
|
||||||
|
- update_holds: True
|
||||||
|
{% else %}
|
||||||
dockerheldpackages:
|
dockerheldpackages:
|
||||||
pkg.installed:
|
pkg.installed:
|
||||||
- pkgs:
|
- pkgs:
|
||||||
@@ -22,14 +43,15 @@ dockerheldpackages:
|
|||||||
- docker-ce-rootless-extras: 5:20.10.5~3-0~ubuntu-focal
|
- docker-ce-rootless-extras: 5:20.10.5~3-0~ubuntu-focal
|
||||||
- hold: True
|
- hold: True
|
||||||
- update_holds: True
|
- update_holds: True
|
||||||
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
dockerheldpackages:
|
dockerheldpackages:
|
||||||
pkg.installed:
|
pkg.installed:
|
||||||
- pkgs:
|
- pkgs:
|
||||||
- containerd.io: 1.6.20-3.1.el9
|
- containerd.io: 1.6.21-3.1.el9
|
||||||
- docker-ce: 23.0.5-1.el9
|
- docker-ce: 24.0.4-1.el9
|
||||||
- docker-ce-cli: 23.0.5-1.el9
|
- docker-ce-cli: 24.0.4-1.el9
|
||||||
- docker-ce-rootless-extras: 23.0.5-1.el9
|
- docker-ce-rootless-extras: 24.0.4-1.el9
|
||||||
- hold: True
|
- hold: True
|
||||||
- update_holds: True
|
- update_holds: True
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -80,8 +102,8 @@ dockerreserveports:
|
|||||||
sos_docker_net:
|
sos_docker_net:
|
||||||
docker_network.present:
|
docker_network.present:
|
||||||
- name: sobridge
|
- name: sobridge
|
||||||
- subnet: {{ DOCKER.sorange }}
|
- subnet: {{ DOCKER.range }}
|
||||||
- gateway: {{ DOCKER.sobip }}
|
- gateway: {{ DOCKER.gateway }}
|
||||||
- options:
|
- options:
|
||||||
com.docker.network.bridge.name: 'sobridge'
|
com.docker.network.bridge.name: 'sobridge'
|
||||||
com.docker.network.driver.mtu: '1500'
|
com.docker.network.driver.mtu: '1500'
|
||||||
|
|||||||
@@ -1,22 +1,14 @@
|
|||||||
docker:
|
docker:
|
||||||
bip:
|
gateway:
|
||||||
description: Bind IP for the default docker interface.
|
description: Gateway for the default docker interface.
|
||||||
helpLink: docker.html
|
helpLink: docker.html
|
||||||
advanced: True
|
advanced: True
|
||||||
range:
|
range:
|
||||||
description: Default docker IP range for containers.
|
description: Default docker IP range for containers.
|
||||||
helpLink: docker.html
|
helpLink: docker.html
|
||||||
advanced: True
|
advanced: True
|
||||||
sobip:
|
|
||||||
description: Bind IP for the SO docker interface.
|
|
||||||
helpLink: docker.html
|
|
||||||
advanced: True
|
|
||||||
sorange:
|
|
||||||
description: IP range for the SO docker containers.
|
|
||||||
helpLink: docker.html
|
|
||||||
advanced: True
|
|
||||||
containers:
|
containers:
|
||||||
so-curator: &dockerOptions
|
so-dockerregistry: &dockerOptions
|
||||||
final_octet:
|
final_octet:
|
||||||
description: Last octet of the container IP address.
|
description: Last octet of the container IP address.
|
||||||
helpLink: docker.html
|
helpLink: docker.html
|
||||||
@@ -28,6 +20,7 @@ docker:
|
|||||||
helpLink: docker.html
|
helpLink: docker.html
|
||||||
advanced: True
|
advanced: True
|
||||||
multiline: True
|
multiline: True
|
||||||
|
forcedType: "[]string"
|
||||||
custom_bind_mounts:
|
custom_bind_mounts:
|
||||||
description: List of custom local volume bindings.
|
description: List of custom local volume bindings.
|
||||||
advanced: True
|
advanced: True
|
||||||
@@ -46,12 +39,8 @@ docker:
|
|||||||
helpLink: docker.html
|
helpLink: docker.html
|
||||||
multiline: True
|
multiline: True
|
||||||
forcedType: "[]string"
|
forcedType: "[]string"
|
||||||
so-dockerregistry: *dockerOptions
|
|
||||||
so-elastalert: *dockerOptions
|
|
||||||
so-elastic-fleet-package-registry: *dockerOptions
|
|
||||||
so-elastic-fleet: *dockerOptions
|
so-elastic-fleet: *dockerOptions
|
||||||
so-elasticsearch: *dockerOptions
|
so-elasticsearch: *dockerOptions
|
||||||
so-idh: *dockerOptions
|
|
||||||
so-idstools: *dockerOptions
|
so-idstools: *dockerOptions
|
||||||
so-influxdb: *dockerOptions
|
so-influxdb: *dockerOptions
|
||||||
so-kibana: *dockerOptions
|
so-kibana: *dockerOptions
|
||||||
@@ -61,11 +50,21 @@ docker:
|
|||||||
so-nginx: *dockerOptions
|
so-nginx: *dockerOptions
|
||||||
so-playbook: *dockerOptions
|
so-playbook: *dockerOptions
|
||||||
so-redis: *dockerOptions
|
so-redis: *dockerOptions
|
||||||
|
so-sensoroni: *dockerOptions
|
||||||
so-soc: *dockerOptions
|
so-soc: *dockerOptions
|
||||||
so-soctopus: *dockerOptions
|
so-soctopus: *dockerOptions
|
||||||
so-strelka-backend: *dockerOptions
|
so-strelka-backend: *dockerOptions
|
||||||
so-strelka-coordinator: *dockerOptions
|
|
||||||
so-strelka-filestream: *dockerOptions
|
so-strelka-filestream: *dockerOptions
|
||||||
so-strelka-frontend: *dockerOptions
|
so-strelka-frontend: *dockerOptions
|
||||||
|
so-strelka-manager: *dockerOptions
|
||||||
so-strelka-gatekeeper: *dockerOptions
|
so-strelka-gatekeeper: *dockerOptions
|
||||||
so-strelka-manager: *dockerOptions
|
so-strelka-coordinator: *dockerOptions
|
||||||
|
so-elastalert: *dockerOptions
|
||||||
|
so-curator: *dockerOptions
|
||||||
|
so-elastic-fleet-package-registry: *dockerOptions
|
||||||
|
so-idh: *dockerOptions
|
||||||
|
so-elastic-agent: *dockerOptions
|
||||||
|
so-telegraf: *dockerOptions
|
||||||
|
so-steno: *dockerOptions
|
||||||
|
so-suricata: *dockerOptions
|
||||||
|
so-zeek: *dockerOptions
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
prune_images:
|
prune_images:
|
||||||
cmd.run:
|
cmd.run:
|
||||||
- name: so-docker-prune
|
- name: so-docker-prune
|
||||||
|
- order: last
|
||||||
|
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ elastalert:
|
|||||||
es_port: 9200
|
es_port: 9200
|
||||||
es_conn_timeout: 55
|
es_conn_timeout: 55
|
||||||
max_query_size: 5000
|
max_query_size: 5000
|
||||||
eql: true
|
|
||||||
use_ssl: true
|
use_ssl: true
|
||||||
verify_certs: false
|
verify_certs: false
|
||||||
writeback_index: elastalert
|
writeback_index: elastalert
|
||||||
|
|||||||
@@ -30,8 +30,8 @@ class PlaybookESAlerter(Alerter):
|
|||||||
if 'es_username' in self.rule and 'es_password' in self.rule:
|
if 'es_username' in self.rule and 'es_password' in self.rule:
|
||||||
creds = (self.rule['es_username'], self.rule['es_password'])
|
creds = (self.rule['es_username'], self.rule['es_password'])
|
||||||
|
|
||||||
payload = {"rule": { "name": self.rule['play_title'],"case_template": self.rule['play_id'],"uuid": self.rule['play_id'],"category": self.rule['rule.category']},"event":{ "severity": self.rule['event.severity'],"module": self.rule['event.module'],"dataset": self.rule['event.dataset'],"severity_label": self.rule['sigma_level']},"kibana_pivot": self.rule['kibana_pivot'],"soc_pivot": self.rule['soc_pivot'],"play_url": self.rule['play_url'],"sigma_level": self.rule['sigma_level'],"event_data": match, "@timestamp": timestamp}
|
payload = {"tags":"alert","rule": { "name": self.rule['play_title'],"case_template": self.rule['play_id'],"uuid": self.rule['play_id'],"category": self.rule['rule.category']},"event":{ "severity": self.rule['event.severity'],"module": self.rule['event.module'],"dataset": self.rule['event.dataset'],"severity_label": self.rule['sigma_level']},"kibana_pivot": self.rule['kibana_pivot'],"soc_pivot": self.rule['soc_pivot'],"play_url": self.rule['play_url'],"sigma_level": self.rule['sigma_level'],"event_data": match, "@timestamp": timestamp}
|
||||||
url = f"{self.rule['es_hosts']}/so-playbook-alerts-{today}/_doc/"
|
url = f"https://{self.rule['es_host']}:{self.rule['es_port']}/logs-playbook.alerts-so/_doc/"
|
||||||
requests.post(url, data=json.dumps(payload), headers=headers, verify=False, auth=creds)
|
requests.post(url, data=json.dumps(payload), headers=headers, verify=False, auth=creds)
|
||||||
|
|
||||||
def get_info(self):
|
def get_info(self):
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
{% set elastalert_pillar = salt['pillar.get']('elastalert:config', {}) %}
|
{% set elastalert_pillar = salt['pillar.get']('elastalert:config', {}) %}
|
||||||
|
|
||||||
|
|
||||||
{% do ELASTALERTDEFAULTS.elastalert.config.update({'es_hosts': 'https://' + GLOBALS.manager + ':' + ELASTALERTDEFAULTS.elastalert.config.es_port|string}) %}
|
{% do ELASTALERTDEFAULTS.elastalert.config.update({'es_host': GLOBALS.manager}) %}
|
||||||
{% do ELASTALERTDEFAULTS.elastalert.config.update({'es_username': pillar.elasticsearch.auth.users.so_elastic_user.user}) %}
|
{% do ELASTALERTDEFAULTS.elastalert.config.update({'es_username': pillar.elasticsearch.auth.users.so_elastic_user.user}) %}
|
||||||
{% do ELASTALERTDEFAULTS.elastalert.config.update({'es_password': pillar.elasticsearch.auth.users.so_elastic_user.pass}) %}
|
{% do ELASTALERTDEFAULTS.elastalert.config.update({'es_password': pillar.elasticsearch.auth.users.so_elastic_user.pass}) %}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
|
||||||
|
# Add EA Group
|
||||||
|
elasticagentgroup:
|
||||||
|
group.present:
|
||||||
|
- name: elastic-agent
|
||||||
|
- gid: 949
|
||||||
|
|
||||||
|
# Add EA user
|
||||||
|
elastic-agent:
|
||||||
|
user.present:
|
||||||
|
- uid: 949
|
||||||
|
- gid: 949
|
||||||
|
- home: /opt/so/conf/elastic-agent
|
||||||
|
- createhome: False
|
||||||
|
|
||||||
|
elasticagentconfdir:
|
||||||
|
file.directory:
|
||||||
|
- name: /opt/so/conf/elastic-agent
|
||||||
|
- user: 949
|
||||||
|
- group: 939
|
||||||
|
- makedirs: True
|
||||||
|
|
||||||
|
elasticagentlogdir:
|
||||||
|
file.directory:
|
||||||
|
- name: /opt/so/log/elasticagent
|
||||||
|
- user: 949
|
||||||
|
- group: 939
|
||||||
|
- makedirs: True
|
||||||
|
|
||||||
|
elasticagent_sbin_jinja:
|
||||||
|
file.recurse:
|
||||||
|
- name: /usr/sbin
|
||||||
|
- source: salt://elasticagent/tools/sbin_jinja
|
||||||
|
- user: 949
|
||||||
|
- group: 939
|
||||||
|
- file_mode: 755
|
||||||
|
- template: jinja
|
||||||
|
|
||||||
|
# Create config
|
||||||
|
create-elastic-agent-config:
|
||||||
|
file.managed:
|
||||||
|
- name: /opt/so/conf/elastic-agent/elastic-agent.yml
|
||||||
|
- source: salt://elasticagent/files/elastic-agent.yml.jinja
|
||||||
|
- user: 949
|
||||||
|
- group: 939
|
||||||
|
- template: jinja
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{{sls}}_state_not_allowed:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- name: {{sls}}_state_not_allowed
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
elasticagent:
|
||||||
|
enabled: False
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
|
||||||
|
include:
|
||||||
|
- elasticagent.sostatus
|
||||||
|
|
||||||
|
so-elastic-agent:
|
||||||
|
docker_container.absent:
|
||||||
|
- force: True
|
||||||
|
|
||||||
|
so-elastic-agent_so-status.disabled:
|
||||||
|
file.comment:
|
||||||
|
- name: /opt/so/conf/so-status/so-status.conf
|
||||||
|
- regex: ^so-elastic-agent$
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{{sls}}_state_not_allowed:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- name: {{sls}}_state_not_allowed
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
|
{% from 'docker/docker.map.jinja' import DOCKER %}
|
||||||
|
|
||||||
|
|
||||||
|
include:
|
||||||
|
- elasticagent.config
|
||||||
|
- elasticagent.sostatus
|
||||||
|
|
||||||
|
so-elastic-agent:
|
||||||
|
docker_container.running:
|
||||||
|
- image: {{ GLOBALS.registry_host }}:5000/{{ GLOBALS.image_repo }}/so-elastic-agent:{{ GLOBALS.so_version }}
|
||||||
|
- name: so-elastic-agent
|
||||||
|
- hostname: {{ GLOBALS.hostname }}
|
||||||
|
- detach: True
|
||||||
|
- user: 949
|
||||||
|
- networks:
|
||||||
|
- sobridge:
|
||||||
|
- ipv4_address: {{ DOCKER.containers['so-elastic-agent'].ip }}
|
||||||
|
- extra_hosts:
|
||||||
|
- {{ GLOBALS.manager }}:{{ GLOBALS.manager_ip }}
|
||||||
|
- {{ GLOBALS.hostname }}:{{ GLOBALS.node_ip }}
|
||||||
|
{% if DOCKER.containers['so-elastic-agent'].extra_hosts %}
|
||||||
|
{% for XTRAHOST in DOCKER.containers['so-elastic-agent'].extra_hosts %}
|
||||||
|
- {{ XTRAHOST }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
- port_bindings:
|
||||||
|
{% for BINDING in DOCKER.containers['so-elastic-agent'].port_bindings %}
|
||||||
|
- {{ BINDING }}
|
||||||
|
{% endfor %}
|
||||||
|
- binds:
|
||||||
|
- /opt/so/conf/elastic-agent/elastic-agent.yml:/usr/share/elastic-agent/elastic-agent.yml:ro
|
||||||
|
- /opt/so/log/elasticagent:/usr/share/elastic-agent/logs
|
||||||
|
- /etc/pki/tls/certs/intca.crt:/etc/pki/tls/certs/intca.crt:ro
|
||||||
|
- /nsm:/nsm:ro
|
||||||
|
- /opt/so/log:/opt/so/log:ro
|
||||||
|
{% if DOCKER.containers['so-elastic-agent'].custom_bind_mounts %}
|
||||||
|
{% for BIND in DOCKER.containers['so-elastic-agent'].custom_bind_mounts %}
|
||||||
|
- {{ BIND }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
- environment:
|
||||||
|
- FLEET_CA=/etc/pki/tls/certs/intca.crt
|
||||||
|
- LOGS_PATH=logs
|
||||||
|
{% if DOCKER.containers['so-elastic-agent'].extra_env %}
|
||||||
|
{% for XTRAENV in DOCKER.containers['so-elastic-agent'].extra_env %}
|
||||||
|
- {{ XTRAENV }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
- require:
|
||||||
|
- file: create-elastic-agent-config
|
||||||
|
- watch:
|
||||||
|
- file: create-elastic-agent-config
|
||||||
|
|
||||||
|
delete_so-elastic-agent_so-status.disabled:
|
||||||
|
file.uncomment:
|
||||||
|
- name: /opt/so/conf/so-status/so-status.conf
|
||||||
|
- regex: ^so-elastic-agent$
|
||||||
|
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{{sls}}_state_not_allowed:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- name: {{sls}}_state_not_allowed
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,483 @@
|
|||||||
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
|
{%- set ES_USER = salt['pillar.get']('elasticsearch:auth:users:so_elastic_user:user', '') %}
|
||||||
|
{%- set ES_PASS = salt['pillar.get']('elasticsearch:auth:users:so_elastic_user:pass', '') %}
|
||||||
|
|
||||||
|
id: aea1ba80-1065-11ee-a369-97538913b6a9
|
||||||
|
revision: 1
|
||||||
|
outputs:
|
||||||
|
default:
|
||||||
|
type: elasticsearch
|
||||||
|
hosts:
|
||||||
|
- 'https://{{ GLOBALS.hostname }}:9200'
|
||||||
|
username: '{{ ES_USER }}'
|
||||||
|
password: '{{ ES_PASS }}'
|
||||||
|
ssl.verification_mode: full
|
||||||
|
output_permissions: {}
|
||||||
|
agent:
|
||||||
|
download:
|
||||||
|
sourceURI: 'http://{{ GLOBALS.manager }}:8443/artifacts/'
|
||||||
|
monitoring:
|
||||||
|
enabled: false
|
||||||
|
logs: false
|
||||||
|
metrics: false
|
||||||
|
features: {}
|
||||||
|
inputs:
|
||||||
|
- id: logfile-logs-fefef78c-422f-4cfa-8abf-4cd1b9428f62
|
||||||
|
name: import-evtx-logs
|
||||||
|
revision: 2
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: log
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: fefef78c-422f-4cfa-8abf-4cd1b9428f62
|
||||||
|
streams:
|
||||||
|
- id: logfile-log.log-fefef78c-422f-4cfa-8abf-4cd1b9428f62
|
||||||
|
data_stream:
|
||||||
|
dataset: import
|
||||||
|
paths:
|
||||||
|
- /nsm/import/*/evtx/*.json
|
||||||
|
processors:
|
||||||
|
- dissect:
|
||||||
|
field: log.file.path
|
||||||
|
tokenizer: '/nsm/import/%{import.id}/evtx/%{import.file}'
|
||||||
|
target_prefix: ''
|
||||||
|
- decode_json_fields:
|
||||||
|
fields:
|
||||||
|
- message
|
||||||
|
target: ''
|
||||||
|
- drop_fields:
|
||||||
|
ignore_missing: true
|
||||||
|
fields:
|
||||||
|
- host
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: system.security
|
||||||
|
type: logs
|
||||||
|
namespace: default
|
||||||
|
target: data_stream
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: system.security
|
||||||
|
module: system
|
||||||
|
imported: true
|
||||||
|
target: event
|
||||||
|
- then:
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: windows.sysmon_operational
|
||||||
|
target: data_stream
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: windows.sysmon_operational
|
||||||
|
module: windows
|
||||||
|
imported: true
|
||||||
|
target: event
|
||||||
|
if:
|
||||||
|
equals:
|
||||||
|
winlog.channel: Microsoft-Windows-Sysmon/Operational
|
||||||
|
- then:
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: system.application
|
||||||
|
target: data_stream
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: system.application
|
||||||
|
target: event
|
||||||
|
if:
|
||||||
|
equals:
|
||||||
|
winlog.channel: Application
|
||||||
|
- then:
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: system.system
|
||||||
|
target: data_stream
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: system.system
|
||||||
|
target: event
|
||||||
|
if:
|
||||||
|
equals:
|
||||||
|
winlog.channel: System
|
||||||
|
- then:
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: windows.powershell_operational
|
||||||
|
target: data_stream
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
dataset: windows.powershell_operational
|
||||||
|
module: windows
|
||||||
|
target: event
|
||||||
|
if:
|
||||||
|
equals:
|
||||||
|
winlog.channel: Microsoft-Windows-PowerShell/Operational
|
||||||
|
tags:
|
||||||
|
- import
|
||||||
|
- id: logfile-redis-fc98c947-7d17-4861-a318-7ad075f6d1b0
|
||||||
|
name: redis-logs
|
||||||
|
revision: 2
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: redis
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: default
|
||||||
|
package_policy_id: fc98c947-7d17-4861-a318-7ad075f6d1b0
|
||||||
|
streams:
|
||||||
|
- id: logfile-redis.log-fc98c947-7d17-4861-a318-7ad075f6d1b0
|
||||||
|
data_stream:
|
||||||
|
dataset: redis.log
|
||||||
|
type: logs
|
||||||
|
exclude_files:
|
||||||
|
- .gz$
|
||||||
|
paths:
|
||||||
|
- /opt/so/log/redis/redis.log
|
||||||
|
tags:
|
||||||
|
- redis-log
|
||||||
|
exclude_lines:
|
||||||
|
- '^\s+[\-`(''.|_]'
|
||||||
|
- id: logfile-logs-3b56803d-5ade-4c93-b25e-9b37182f66b8
|
||||||
|
name: import-suricata-logs
|
||||||
|
revision: 2
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: log
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: 3b56803d-5ade-4c93-b25e-9b37182f66b8
|
||||||
|
streams:
|
||||||
|
- id: logfile-log.log-3b56803d-5ade-4c93-b25e-9b37182f66b8
|
||||||
|
data_stream:
|
||||||
|
dataset: import
|
||||||
|
pipeline: suricata.common
|
||||||
|
paths:
|
||||||
|
- /nsm/import/*/suricata/eve*.json
|
||||||
|
processors:
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
module: suricata
|
||||||
|
imported: true
|
||||||
|
category: network
|
||||||
|
target: event
|
||||||
|
- dissect:
|
||||||
|
field: log.file.path
|
||||||
|
tokenizer: '/nsm/import/%{import.id}/suricata/%{import.file}'
|
||||||
|
target_prefix: ''
|
||||||
|
- id: logfile-logs-c327e1a3-1ebe-449c-a8eb-f6f35032e69d
|
||||||
|
name: soc-server-logs
|
||||||
|
revision: 2
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: log
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: c327e1a3-1ebe-449c-a8eb-f6f35032e69d
|
||||||
|
streams:
|
||||||
|
- id: logfile-log.log-c327e1a3-1ebe-449c-a8eb-f6f35032e69d
|
||||||
|
data_stream:
|
||||||
|
dataset: soc
|
||||||
|
pipeline: common
|
||||||
|
paths:
|
||||||
|
- /opt/so/log/soc/sensoroni-server.log
|
||||||
|
processors:
|
||||||
|
- decode_json_fields:
|
||||||
|
add_error_key: true
|
||||||
|
process_array: true
|
||||||
|
max_depth: 2
|
||||||
|
fields:
|
||||||
|
- message
|
||||||
|
target: soc
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
module: soc
|
||||||
|
dataset_temp: server
|
||||||
|
category: host
|
||||||
|
target: event
|
||||||
|
- rename:
|
||||||
|
ignore_missing: true
|
||||||
|
fields:
|
||||||
|
- from: soc.fields.sourceIp
|
||||||
|
to: source.ip
|
||||||
|
- from: soc.fields.status
|
||||||
|
to: http.response.status_code
|
||||||
|
- from: soc.fields.method
|
||||||
|
to: http.request.method
|
||||||
|
- from: soc.fields.path
|
||||||
|
to: url.path
|
||||||
|
- from: soc.message
|
||||||
|
to: event.action
|
||||||
|
- from: soc.level
|
||||||
|
to: log.level
|
||||||
|
tags:
|
||||||
|
- so-soc
|
||||||
|
- id: logfile-logs-906e0d4c-9ec3-4c6a-bef6-e347ec9fd073
|
||||||
|
name: soc-sensoroni-logs
|
||||||
|
revision: 2
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: log
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: 906e0d4c-9ec3-4c6a-bef6-e347ec9fd073
|
||||||
|
streams:
|
||||||
|
- id: logfile-log.log-906e0d4c-9ec3-4c6a-bef6-e347ec9fd073
|
||||||
|
data_stream:
|
||||||
|
dataset: soc
|
||||||
|
pipeline: common
|
||||||
|
paths:
|
||||||
|
- /opt/so/log/sensoroni/sensoroni.log
|
||||||
|
processors:
|
||||||
|
- decode_json_fields:
|
||||||
|
add_error_key: true
|
||||||
|
process_array: true
|
||||||
|
max_depth: 2
|
||||||
|
fields:
|
||||||
|
- message
|
||||||
|
target: sensoroni
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
module: soc
|
||||||
|
dataset_temp: sensoroni
|
||||||
|
category: host
|
||||||
|
target: event
|
||||||
|
- rename:
|
||||||
|
ignore_missing: true
|
||||||
|
fields:
|
||||||
|
- from: sensoroni.fields.sourceIp
|
||||||
|
to: source.ip
|
||||||
|
- from: sensoroni.fields.status
|
||||||
|
to: http.response.status_code
|
||||||
|
- from: sensoroni.fields.method
|
||||||
|
to: http.request.method
|
||||||
|
- from: sensoroni.fields.path
|
||||||
|
to: url.path
|
||||||
|
- from: sensoroni.message
|
||||||
|
to: event.action
|
||||||
|
- from: sensoroni.level
|
||||||
|
to: log.level
|
||||||
|
- id: logfile-logs-df0d7f2c-221f-433b-b18b-d1cf83250515
|
||||||
|
name: soc-salt-relay-logs
|
||||||
|
revision: 2
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: log
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: df0d7f2c-221f-433b-b18b-d1cf83250515
|
||||||
|
streams:
|
||||||
|
- id: logfile-log.log-df0d7f2c-221f-433b-b18b-d1cf83250515
|
||||||
|
data_stream:
|
||||||
|
dataset: soc
|
||||||
|
pipeline: common
|
||||||
|
paths:
|
||||||
|
- /opt/so/log/soc/salt-relay.log
|
||||||
|
processors:
|
||||||
|
- dissect:
|
||||||
|
field: message
|
||||||
|
tokenizer: '%{soc.ts} | %{event.action}'
|
||||||
|
target_prefix: ''
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
module: soc
|
||||||
|
dataset_temp: salt_relay
|
||||||
|
category: host
|
||||||
|
target: event
|
||||||
|
tags:
|
||||||
|
- so-soc
|
||||||
|
- id: logfile-logs-74bd2366-fe52-493c-bddc-843a017fc4d0
|
||||||
|
name: soc-auth-sync-logs
|
||||||
|
revision: 2
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: log
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: 74bd2366-fe52-493c-bddc-843a017fc4d0
|
||||||
|
streams:
|
||||||
|
- id: logfile-log.log-74bd2366-fe52-493c-bddc-843a017fc4d0
|
||||||
|
data_stream:
|
||||||
|
dataset: soc
|
||||||
|
pipeline: common
|
||||||
|
paths:
|
||||||
|
- /opt/so/log/soc/sync.log
|
||||||
|
processors:
|
||||||
|
- dissect:
|
||||||
|
field: message
|
||||||
|
tokenizer: '%{event.action}'
|
||||||
|
target_prefix: ''
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
module: soc
|
||||||
|
dataset_temp: auth_sync
|
||||||
|
category: host
|
||||||
|
target: event
|
||||||
|
tags:
|
||||||
|
- so-soc
|
||||||
|
- id: logfile-logs-d151d9bf-ff2a-4529-9520-c99244bc0253
|
||||||
|
name: suricata-logs
|
||||||
|
revision: 2
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: log
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: d151d9bf-ff2a-4529-9520-c99244bc0253
|
||||||
|
streams:
|
||||||
|
- id: logfile-log.log-d151d9bf-ff2a-4529-9520-c99244bc0253
|
||||||
|
data_stream:
|
||||||
|
dataset: suricata
|
||||||
|
pipeline: suricata.common
|
||||||
|
paths:
|
||||||
|
- /nsm/suricata/eve*.json
|
||||||
|
processors:
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
module: suricata
|
||||||
|
category: network
|
||||||
|
target: event
|
||||||
|
- id: logfile-logs-31f94d05-ae75-40ee-b9c5-0e0356eff327
|
||||||
|
name: strelka-logs
|
||||||
|
revision: 2
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: log
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: 31f94d05-ae75-40ee-b9c5-0e0356eff327
|
||||||
|
streams:
|
||||||
|
- id: logfile-log.log-31f94d05-ae75-40ee-b9c5-0e0356eff327
|
||||||
|
data_stream:
|
||||||
|
dataset: strelka
|
||||||
|
pipeline: strelka.file
|
||||||
|
paths:
|
||||||
|
- /nsm/strelka/log/strelka.log
|
||||||
|
processors:
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
module: strelka
|
||||||
|
category: file
|
||||||
|
target: event
|
||||||
|
- id: logfile-logs-6197fe84-9b58-4d9b-8464-3d517f28808d
|
||||||
|
name: zeek-logs
|
||||||
|
revision: 1
|
||||||
|
type: logfile
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: log
|
||||||
|
version:
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: 6197fe84-9b58-4d9b-8464-3d517f28808d
|
||||||
|
streams:
|
||||||
|
- id: logfile-log.log-6197fe84-9b58-4d9b-8464-3d517f28808d
|
||||||
|
data_stream:
|
||||||
|
dataset: zeek
|
||||||
|
paths:
|
||||||
|
- /nsm/zeek/logs/current/*.log
|
||||||
|
processors:
|
||||||
|
- dissect:
|
||||||
|
tokenizer: '/nsm/zeek/logs/current/%{pipeline}.log'
|
||||||
|
field: log.file.path
|
||||||
|
trim_chars: .log
|
||||||
|
target_prefix: ''
|
||||||
|
- script:
|
||||||
|
lang: javascript
|
||||||
|
source: |
|
||||||
|
function process(event) {
|
||||||
|
var pl = event.Get("pipeline");
|
||||||
|
event.Put("@metadata.pipeline", "zeek." + pl);
|
||||||
|
}
|
||||||
|
- add_fields:
|
||||||
|
target: event
|
||||||
|
fields:
|
||||||
|
category: network
|
||||||
|
module: zeek
|
||||||
|
- add_tags:
|
||||||
|
tags: ics
|
||||||
|
when:
|
||||||
|
regexp:
|
||||||
|
pipeline: >-
|
||||||
|
^bacnet*|^bsap*|^cip*|^cotp*|^dnp3*|^ecat*|^enip*|^modbus*|^opcua*|^profinet*|^s7comm*
|
||||||
|
exclude_files:
|
||||||
|
- >-
|
||||||
|
broker|capture_loss|cluster|ecat_arp_info|known_hosts|known_services|loaded_scripts|ntp|ocsp|packet_filter|reporter|stats|stderr|stdout.log$
|
||||||
|
- id: udp-udp-35051de0-46a5-11ee-8d5d-9f98c8182f60
|
||||||
|
name: syslog-udp-514
|
||||||
|
revision: 3
|
||||||
|
type: udp
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: udp
|
||||||
|
version: 1.10.0
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: 35051de0-46a5-11ee-8d5d-9f98c8182f60
|
||||||
|
streams:
|
||||||
|
- id: udp-udp.generic-35051de0-46a5-11ee-8d5d-9f98c8182f60
|
||||||
|
data_stream:
|
||||||
|
dataset: syslog
|
||||||
|
pipeline: syslog
|
||||||
|
host: '0.0.0.0:514'
|
||||||
|
max_message_size: 10KiB
|
||||||
|
processors:
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
module: syslog
|
||||||
|
target: event
|
||||||
|
tags:
|
||||||
|
- syslog
|
||||||
|
- id: tcp-tcp-33d37bb0-46a5-11ee-8d5d-9f98c8182f60
|
||||||
|
name: syslog-tcp-514
|
||||||
|
revision: 3
|
||||||
|
type: tcp
|
||||||
|
use_output: default
|
||||||
|
meta:
|
||||||
|
package:
|
||||||
|
name: tcp
|
||||||
|
version: 1.10.0
|
||||||
|
data_stream:
|
||||||
|
namespace: so
|
||||||
|
package_policy_id: 33d37bb0-46a5-11ee-8d5d-9f98c8182f60
|
||||||
|
streams:
|
||||||
|
- id: tcp-tcp.generic-33d37bb0-46a5-11ee-8d5d-9f98c8182f60
|
||||||
|
data_stream:
|
||||||
|
dataset: syslog
|
||||||
|
pipeline: syslog
|
||||||
|
host: '0.0.0.0:514'
|
||||||
|
processors:
|
||||||
|
- add_fields:
|
||||||
|
fields:
|
||||||
|
module: syslog
|
||||||
|
target: event
|
||||||
|
tags:
|
||||||
|
- syslog
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
{% from 'elasticagent/map.jinja' import ELASTICAGENTMERGED %}
|
||||||
|
|
||||||
|
include:
|
||||||
|
{% if ELASTICAGENTMERGED.enabled %}
|
||||||
|
- elasticagent.enabled
|
||||||
|
{% else %}
|
||||||
|
- elasticagent.disabled
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
Elastic License 2.0. #}
|
||||||
|
|
||||||
|
{% import_yaml 'elasticagent/defaults.yaml' as ELASTICAGENTDEFAULTS %}
|
||||||
|
{% set ELASTICAGENTMERGED = salt['pillar.get']('elasticagent', ELASTICAGENTDEFAULTS.elasticagent, merge=True) %}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
{% from 'allowed_states.map.jinja' import allowed_states %}
|
||||||
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
|
||||||
|
append_so-elastic-agent_so-status.conf:
|
||||||
|
file.append:
|
||||||
|
- name: /opt/so/conf/so-status/so-status.conf
|
||||||
|
- text: so-elastic-agent
|
||||||
|
- unless: grep -q so-elastic-agent$ /opt/so/conf/so-status/so-status.conf
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
{{sls}}_state_not_allowed:
|
||||||
|
test.fail_without_changes:
|
||||||
|
- name: {{sls}}_state_not_allowed
|
||||||
|
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
{% if grains.role == 'so-heavynode' %}
|
||||||
|
docker exec so-elastic-agent /usr/share/elastic-agent/elastic-agent inspect
|
||||||
|
{% else %}
|
||||||
|
/bin/elastic-agent inspect
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
{% if grains.role == 'so-heavynode' %}
|
||||||
|
/usr/sbin/so-stop elastic-agent $1
|
||||||
|
/usr/sbin/so-start elasticagent $1
|
||||||
|
{% else %}
|
||||||
|
service elastic-agent restart
|
||||||
|
{% endif %}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
{% if grains.role == 'so-heavynode' %}
|
||||||
|
/usr/sbin/so-start elasticagent $1
|
||||||
|
{% else %}
|
||||||
|
service elastic-agent start
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
{% if grains.role == 'so-heavynode' %}
|
||||||
|
docker exec so-elastic-agent /usr/share/elastic-agent/elastic-agent status
|
||||||
|
{% else %}
|
||||||
|
/bin/elastic-agent status
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
{% if grains.role == 'so-heavynode' %}
|
||||||
|
/usr/sbin/so-stop elastic-agent $1
|
||||||
|
{% else %}
|
||||||
|
service elastic-agent stop
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright Security Onion Solutions LLC and/or licensed to Security Onion Solutions LLC under one
|
||||||
|
# or more contributor license agreements. Licensed under the Elastic License 2.0 as shown at
|
||||||
|
# https://securityonion.net/license; you may not use this file except in compliance with the
|
||||||
|
# Elastic License 2.0.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
. /usr/sbin/so-common
|
||||||
|
|
||||||
|
{% if grains.role == 'so-heavynode' %}
|
||||||
|
docker exec so-elastic-agent /usr/share/elastic-agent/elastic-agent version
|
||||||
|
{% else %}
|
||||||
|
/bin/elastic-agent version
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
@@ -8,13 +8,13 @@
|
|||||||
{% if sls.split('.')[0] in allowed_states %}
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
|
|
||||||
# Add EA Group
|
# Add EA Group
|
||||||
elasticsagentgroup:
|
elasticfleetgroup:
|
||||||
group.present:
|
group.present:
|
||||||
- name: elastic-agent
|
- name: elastic-fleet
|
||||||
- gid: 947
|
- gid: 947
|
||||||
|
|
||||||
# Add EA user
|
# Add EA user
|
||||||
elastic-agent:
|
elastic-fleet:
|
||||||
user.present:
|
user.present:
|
||||||
- uid: 947
|
- uid: 947
|
||||||
- gid: 947
|
- gid: 947
|
||||||
@@ -37,6 +37,8 @@ elasticfleet_sbin_jinja:
|
|||||||
- group: 939
|
- group: 939
|
||||||
- file_mode: 755
|
- file_mode: 755
|
||||||
- template: jinja
|
- template: jinja
|
||||||
|
- exclude_pat:
|
||||||
|
- so-elastic-fleet-package-upgrade # exclude this because we need to watch it for changes
|
||||||
|
|
||||||
eaconfdir:
|
eaconfdir:
|
||||||
file.directory:
|
file.directory:
|
||||||
@@ -45,6 +47,13 @@ eaconfdir:
|
|||||||
- group: 939
|
- group: 939
|
||||||
- makedirs: True
|
- makedirs: True
|
||||||
|
|
||||||
|
ealogdir:
|
||||||
|
file.directory:
|
||||||
|
- name: /opt/so/log/elasticfleet
|
||||||
|
- user: 947
|
||||||
|
- group: 939
|
||||||
|
- makedirs: True
|
||||||
|
|
||||||
eastatedir:
|
eastatedir:
|
||||||
file.directory:
|
file.directory:
|
||||||
- name: /opt/so/conf/elastic-fleet/state
|
- name: /opt/so/conf/elastic-fleet/state
|
||||||
@@ -52,6 +61,14 @@ eastatedir:
|
|||||||
- group: 939
|
- group: 939
|
||||||
- makedirs: True
|
- makedirs: True
|
||||||
|
|
||||||
|
eapackageupgrade:
|
||||||
|
file.managed:
|
||||||
|
- name: /usr/sbin/so-elastic-fleet-package-upgrade
|
||||||
|
- source: salt://elasticfleet/tools/sbin_jinja/so-elastic-fleet-package-upgrade
|
||||||
|
- user: 947
|
||||||
|
- group: 939
|
||||||
|
- template: jinja
|
||||||
|
|
||||||
{% if GLOBALS.role != "so-fleet" %}
|
{% if GLOBALS.role != "so-fleet" %}
|
||||||
eaintegrationsdir:
|
eaintegrationsdir:
|
||||||
file.directory:
|
file.directory:
|
||||||
@@ -81,6 +98,7 @@ ea-integrations-load:
|
|||||||
- onchanges:
|
- onchanges:
|
||||||
- file: eaintegration
|
- file: eaintegration
|
||||||
- file: eadynamicintegration
|
- file: eadynamicintegration
|
||||||
|
- file: eapackageupgrade
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
||||||
|
|||||||
@@ -2,22 +2,79 @@ elasticfleet:
|
|||||||
enabled: False
|
enabled: False
|
||||||
config:
|
config:
|
||||||
server:
|
server:
|
||||||
|
custom_fqdn: []
|
||||||
|
enable_auto_configuration: True
|
||||||
endpoints_enrollment: ''
|
endpoints_enrollment: ''
|
||||||
es_token: ''
|
es_token: ''
|
||||||
grid_enrollment: ''
|
grid_enrollment: ''
|
||||||
url: ''
|
|
||||||
logging:
|
logging:
|
||||||
zeek:
|
zeek:
|
||||||
excluded:
|
excluded:
|
||||||
- broker
|
- broker
|
||||||
- capture_loss
|
- capture_loss
|
||||||
|
- cluster
|
||||||
|
- conn-summary
|
||||||
|
- console
|
||||||
- ecat_arp_info
|
- ecat_arp_info
|
||||||
|
- known_certs
|
||||||
- known_hosts
|
- known_hosts
|
||||||
- known_services
|
- known_services
|
||||||
- loaded_scripts
|
- loaded_scripts
|
||||||
- ntp
|
- ntp
|
||||||
|
- ocsp
|
||||||
- packet_filter
|
- packet_filter
|
||||||
- reporter
|
- reporter
|
||||||
- stats
|
- stats
|
||||||
- stderr
|
- stderr
|
||||||
- stdout
|
- stdout
|
||||||
|
packages:
|
||||||
|
- apache
|
||||||
|
- auditd
|
||||||
|
- aws
|
||||||
|
- azure
|
||||||
|
- barracuda
|
||||||
|
- cisco_asa
|
||||||
|
- cloudflare
|
||||||
|
- crowdstrike
|
||||||
|
- darktrace
|
||||||
|
- elasticsearch
|
||||||
|
- endpoint
|
||||||
|
- f5_bigip
|
||||||
|
- fleet_server
|
||||||
|
- fim
|
||||||
|
- fortinet
|
||||||
|
- fortinet_fortigate
|
||||||
|
- gcp
|
||||||
|
- github
|
||||||
|
- google_workspace
|
||||||
|
- http_endpoint
|
||||||
|
- httpjson
|
||||||
|
- juniper
|
||||||
|
- juniper_srx
|
||||||
|
- kafka_log
|
||||||
|
- lastpass
|
||||||
|
- log
|
||||||
|
- m365_defender
|
||||||
|
- microsoft_defender_endpoint
|
||||||
|
- microsoft_dhcp
|
||||||
|
- netflow
|
||||||
|
- o365
|
||||||
|
- okta
|
||||||
|
- osquery_manager
|
||||||
|
- panw
|
||||||
|
- pfsense
|
||||||
|
- redis
|
||||||
|
- sentinel_one
|
||||||
|
- sonicwall_firewall
|
||||||
|
- symantec_endpoint
|
||||||
|
- system
|
||||||
|
- tcp
|
||||||
|
- ti_abusech
|
||||||
|
- ti_misp
|
||||||
|
- ti_otx
|
||||||
|
- ti_recordedfuture
|
||||||
|
- udp
|
||||||
|
- windows
|
||||||
|
- zscaler_zia
|
||||||
|
- zscaler_zpa
|
||||||
|
- 1password
|
||||||
|
|||||||
@@ -7,12 +7,39 @@
|
|||||||
{% if sls.split('.')[0] in allowed_states %}
|
{% if sls.split('.')[0] in allowed_states %}
|
||||||
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
{% from 'vars/globals.map.jinja' import GLOBALS %}
|
||||||
{% from 'docker/docker.map.jinja' import DOCKER %}
|
{% from 'docker/docker.map.jinja' import DOCKER %}
|
||||||
|
{% from 'elasticfleet/map.jinja' import ELASTICFLEETMERGED %}
|
||||||
|
|
||||||
{# This value is generated during node install and stored in minion pillar #}
|
{# This value is generated during node install and stored in minion pillar #}
|
||||||
{% set SERVICETOKEN = salt['pillar.get']('elasticfleet:config:server:es_token','') %}
|
{% set SERVICETOKEN = salt['pillar.get']('elasticfleet:config:server:es_token','') %}
|
||||||
|
|
||||||
include:
|
include:
|
||||||
- elasticfleet.config
|
- elasticfleet.config
|
||||||
- elasticfleet.sostatus
|
- elasticfleet.sostatus
|
||||||
|
- ssl
|
||||||
|
|
||||||
|
# If enabled, automatically update Fleet Logstash Outputs
|
||||||
|
{% if ELASTICFLEETMERGED.config.server.enable_auto_configuration and grains.role not in ['so-import', 'so-eval', 'so-fleet'] %}
|
||||||
|
so-elastic-fleet-auto-configure-logstash-outputs:
|
||||||
|
cmd.run:
|
||||||
|
- name: /usr/sbin/so-elastic-fleet-outputs-update
|
||||||
|
- retry: True
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
# If enabled, automatically update Fleet Server URLs & ES Connection
|
||||||
|
{% if ELASTICFLEETMERGED.config.server.enable_auto_configuration and grains.role not in ['so-fleet'] %}
|
||||||
|
so-elastic-fleet-auto-configure-server-urls:
|
||||||
|
cmd.run:
|
||||||
|
- name: /usr/sbin/so-elastic-fleet-urls-update
|
||||||
|
- retry: True
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
# Automatically update Fleet Server Elasticsearch URLs
|
||||||
|
{% if grains.role not in ['so-fleet'] %}
|
||||||
|
so-elastic-fleet-auto-configure-elasticsearch-urls:
|
||||||
|
cmd.run:
|
||||||
|
- name: /usr/sbin/so-elastic-fleet-es-url-update
|
||||||
|
- retry: True
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% if SERVICETOKEN != '' %}
|
{% if SERVICETOKEN != '' %}
|
||||||
so-elastic-fleet:
|
so-elastic-fleet:
|
||||||
@@ -38,8 +65,10 @@ so-elastic-fleet:
|
|||||||
- {{ BINDING }}
|
- {{ BINDING }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
- binds:
|
- binds:
|
||||||
- /etc/pki:/etc/pki:ro
|
- /etc/pki/elasticfleet-server.crt:/etc/pki/elasticfleet-server.crt:ro
|
||||||
#- /opt/so/conf/elastic-fleet/state:/usr/share/elastic-agent/state:rw
|
- /etc/pki/elasticfleet-server.key:/etc/pki/elasticfleet-server.key:ro
|
||||||
|
- /etc/pki/tls/certs/intca.crt:/etc/pki/tls/certs/intca.crt:ro
|
||||||
|
- /opt/so/log/elasticfleet:/usr/share/elastic-agent/logs
|
||||||
{% if DOCKER.containers['so-elastic-fleet'].custom_bind_mounts %}
|
{% if DOCKER.containers['so-elastic-fleet'].custom_bind_mounts %}
|
||||||
{% for BIND in DOCKER.containers['so-elastic-fleet'].custom_bind_mounts %}
|
{% for BIND in DOCKER.containers['so-elastic-fleet'].custom_bind_mounts %}
|
||||||
- {{ BIND }}
|
- {{ BIND }}
|
||||||
@@ -47,25 +76,34 @@ so-elastic-fleet:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
- environment:
|
- environment:
|
||||||
- FLEET_SERVER_ENABLE=true
|
- FLEET_SERVER_ENABLE=true
|
||||||
- FLEET_URL=https://{{ GLOBALS.node_ip }}:8220
|
- FLEET_URL=https://{{ GLOBALS.hostname }}:8220
|
||||||
- FLEET_SERVER_ELASTICSEARCH_HOST=https://{{ GLOBALS.manager }}:9200
|
- FLEET_SERVER_ELASTICSEARCH_HOST=https://{{ GLOBALS.manager }}:9200
|
||||||
- FLEET_SERVER_SERVICE_TOKEN={{ SERVICETOKEN }}
|
- FLEET_SERVER_SERVICE_TOKEN={{ SERVICETOKEN }}
|
||||||
- FLEET_SERVER_POLICY_ID=FleetServer_{{ GLOBALS.hostname }}
|
- FLEET_SERVER_POLICY_ID=FleetServer_{{ GLOBALS.hostname }}
|
||||||
|
- FLEET_SERVER_CERT=/etc/pki/elasticfleet-server.crt
|
||||||
|
- FLEET_SERVER_CERT_KEY=/etc/pki/elasticfleet-server.key
|
||||||
|
- FLEET_CA=/etc/pki/tls/certs/intca.crt
|
||||||
- FLEET_SERVER_ELASTICSEARCH_CA=/etc/pki/tls/certs/intca.crt
|
- FLEET_SERVER_ELASTICSEARCH_CA=/etc/pki/tls/certs/intca.crt
|
||||||
- FLEET_SERVER_CERT=/etc/pki/elasticfleet.crt
|
- LOGS_PATH=logs
|
||||||
- FLEET_SERVER_CERT_KEY=/etc/pki/elasticfleet.key
|
|
||||||
- FLEET_CA=/etc/pki/tls/certs/intca.crt
|
|
||||||
{% if DOCKER.containers['so-elastic-fleet'].extra_env %}
|
{% if DOCKER.containers['so-elastic-fleet'].extra_env %}
|
||||||
{% for XTRAENV in DOCKER.containers['so-elastic-fleet'].extra_env %}
|
{% for XTRAENV in DOCKER.containers['so-elastic-fleet'].extra_env %}
|
||||||
- {{ XTRAENV }}
|
- {{ XTRAENV }}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
- watch:
|
||||||
|
- x509: etc_elasticfleet_key
|
||||||
|
- x509: etc_elasticfleet_crt
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if GLOBALS.role != "so-fleet" %}
|
{% if GLOBALS.role != "so-fleet" %}
|
||||||
so-elastic-fleet-integrations:
|
so-elastic-fleet-integrations:
|
||||||
cmd.run:
|
cmd.run:
|
||||||
- name: /usr/sbin/so-elastic-fleet-integration-policy-load
|
- name: /usr/sbin/so-elastic-fleet-integration-policy-load
|
||||||
|
|
||||||
|
so-elastic-agent-grid-upgrade:
|
||||||
|
cmd.run:
|
||||||
|
- name: /usr/sbin/so-elastic-agent-grid-upgrade
|
||||||
|
- retry: True
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
delete_so-elastic-fleet_so-status.disabled:
|
delete_so-elastic-fleet_so-status.disabled:
|
||||||
|
|||||||
@@ -8,12 +8,12 @@
|
|||||||
"name": "import-zeek-logs",
|
"name": "import-zeek-logs",
|
||||||
"namespace": "so",
|
"namespace": "so",
|
||||||
"description": "Zeek Import logs",
|
"description": "Zeek Import logs",
|
||||||
"policy_id": "so-grid-nodes",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"logs-logfile": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"log.log": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
@@ -9,12 +9,12 @@
|
|||||||
"name": "zeek-logs",
|
"name": "zeek-logs",
|
||||||
"namespace": "so",
|
"namespace": "so",
|
||||||
"description": "Zeek logs",
|
"description": "Zeek logs",
|
||||||
"policy_id": "so-grid-nodes",
|
"policy_id": "so-grid-nodes_general",
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"logs-logfile": {
|
"logs-logfile": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": {
|
"streams": {
|
||||||
"log.log": {
|
"log.logs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"vars": {
|
"vars": {
|
||||||
"paths": [
|
"paths": [
|
||||||
@@ -5,17 +5,16 @@
|
|||||||
"package": {
|
"package": {
|
||||||
"name": "endpoint",
|
"name": "endpoint",
|
||||||
"title": "Elastic Defend",
|
"title": "Elastic Defend",
|
||||||
"version": ""
|
"version": "8.8.0"
|
||||||
},
|
},
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"policy_id": "endpoints-initial",
|
"policy_id": "endpoints-initial",
|
||||||
"vars": {},
|
|
||||||
"inputs": [{
|
"inputs": [{
|
||||||
"type": "endpoint",
|
"type": "ENDPOINT_INTEGRATION_CONFIG",
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"streams": [],
|
"streams": [],
|
||||||
"config": {
|
"config": {
|
||||||
"integration_config": {
|
"_config": {
|
||||||
"value": {
|
"value": {
|
||||||
"type": "endpoint",
|
"type": "endpoint",
|
||||||
"endpointConfig": {
|
"endpointConfig": {
|
||||||
@@ -25,4 +24,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||