{"id":359,"date":"2025-02-05T15:43:19","date_gmt":"2025-02-05T15:43:19","guid":{"rendered":"https:\/\/www.octamis.com\/octamis-blog\/?p=359"},"modified":"2025-03-03T10:53:00","modified_gmt":"2025-03-03T10:53:00","slug":"splunk-es-8-0-2-versioning-feature-review","status":"publish","type":"post","link":"https:\/\/www.octamis.com\/octamis-blog\/splunk-es-8-0-2-versioning-feature-review\/","title":{"rendered":"Splunk ES 8.0.2 &#8211;  Versioning feature review"},"content":{"rendered":"\n<p>Table of contents<\/p>\n\n\n\n<ol>\n<li><strong>Limitations<\/strong>\n<ul>\n<li>Content versioning<\/li>\n\n\n\n<li>Versioning deactivation<\/li>\n\n\n\n<li>Index creation<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>The Process<\/strong><\/li>\n\n\n\n<li><strong>Usage<\/strong>\n<ul>\n<li>Additional information<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Conclusion<\/strong><\/li>\n<\/ol>\n\n\n\n<p><a href=\"https:\/\/splunkbase.splunk.com\/app\/263\" target=\"_blank\" rel=\"noreferrer noopener\">Splunk Enterprise Security v8.0.2<\/a> is out since January, 22<sup>nd<\/sup>.<\/p>\n\n\n\n<p>I will present to you a new feature introduced in this version: detection versioning. <\/p>\n\n\n\n<p>Long awaited, this functionality is interesting in several ways. First of all, in theory, you can avoid using Git or GitLab to keep versions of your detections, as it is directly integrated into ES.<\/p>\n\n\n\n<p>Secondly, it makes troubleshooting detections easier: all you have to do is switch from one version to another directly from the UI.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Limitations<\/h3>\n\n\n\n<p>Before starting,&nbsp; there are limitations to the versioning feature provided with ES 8.0.2.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0\">Content versioning<\/h4>\n\n\n\n<p>Only detections provided in <a href=\"https:\/\/splunkbase.splunk.com\/app\/3449\" target=\"_blank\" rel=\"noreferrer noopener\">Enterprise Security Content Update (ESCU)<\/a> and <a href=\"https:\/\/splunkbase.splunk.com\/app\/263\" target=\"_blank\" rel=\"noreferrer noopener\">ES<\/a> are imported. User-created content is neither imported nor authorized to be managed by Versioning. However, you can still move your own detection rules to the Enterprise Security app before enabling versioning, and it will work.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"53\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image.png\" alt=\"\" class=\"wp-image-362\" style=\"width:767px;height:auto\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image.png 945w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-300x17.png 300w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-768x43.png 768w\" sizes=\"(max-width: 945px) 100vw, 945px\" \/><\/figure>\n\n\n\n<p>Source: <a href=\"https:\/\/docs.splunk.com\/Documentation\/ES\/8.0.2\/Admin\/ViewEnabledDetectionVersions\" target=\"_blank\" rel=\"noreferrer noopener\">Create multiple versions of a detection in Splunk Enterprise Security &#8211; Splunk Documentation<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0\">Versioning deactivation<\/h4>\n\n\n\n<p>If you enable versioning, you cannot disable it from the GUI. The documentation advises <a href=\"https:\/\/www.splunk.com\/en_us\/about-splunk\/contact-us.html#customer-support\" target=\"_blank\" rel=\"noreferrer noopener\">contacting Splunk support<\/a> if you want to disable it.<br>You have been warned !<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" style=\"margin-top:0;margin-bottom:0;padding-top:0;padding-bottom:0\">Index creation<\/h4>\n\n\n\n<p>Enabling the versioning feature creates an index named<code>cms_main<\/code>. Be aware of this before enabling it, or plan beforehand where the index should be created.<br>Let&#8217;s go for the process to activate and use this feature.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" style=\"margin-top:var(--wp--preset--spacing--40);margin-bottom:var(--wp--preset--spacing--40);padding-top:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30)\">The Process<\/h3>\n\n\n\n<p>By default, versioning is not enabled. You need to enable it manually by going to ES &gt; Configure &gt; General Settings and selecting &#8220;Turn on&#8221; in the Detection Versioning tile.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"470\" height=\"208\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-17.png\" alt=\"\" class=\"wp-image-386\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-17.png 470w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-17-300x133.png 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-1 wp-block-columns-is-layout-flex\" style=\"margin-top:0;margin-bottom:0;padding-top:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40)\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image alignfull size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"134\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-3.png\" alt=\"\" class=\"wp-image-365\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-3.png 697w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-3-300x58.png 300w\" sizes=\"(max-width: 697px) 100vw, 697px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>It might take up to 10 minutes to turn on, as indicated in the documentation : <a href=\"https:\/\/docs.splunk.com\/Documentation\/ES\/8.0.2\/Admin\/UseDetectionVersioning\" target=\"_blank\" rel=\"noreferrer noopener\">Use detection versioning in Splunk Enterprise Security &#8211; Splunk Documentation<\/a><\/p>\n<\/div>\n<\/div>\n\n\n\n<p>This process enables the <code>SA-ContentVersioning<\/code> app located in Splunk directory and uses the <code>cms_main<\/code> index (by default in <code>$SPLUNK_DB<\/code> directory) to store changes.<\/p>\n\n\n\n<p>It also adds a lookup collection called \u2018<code>cms_metadata<\/code>\u2019 which contains metadata for each detection such as: <\/p>\n\n\n\n<ul>\n<li>ID <\/li>\n\n\n\n<li>hash <\/li>\n\n\n\n<li>version information <\/li>\n\n\n\n<li>publishing time <\/li>\n\n\n\n<li>user modifying the detection <\/li>\n\n\n\n<li>app it belongs to <\/li>\n\n\n\n<li>parent version (only the number, not the content)<\/li>\n<\/ul>\n\n\n\n<p>All detections included in Splunk ES and ESCU (if installed) are automatically imported and managed by versioning.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"714\" height=\"323\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-4.png\" alt=\"\" class=\"wp-image-366\" style=\"width:441px;height:auto\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-4.png 714w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-4-300x136.png 300w\" sizes=\"(max-width: 714px) 100vw, 714px\" \/><\/figure>\n\n\n\n<p>And then you get a notification on the upper right corner :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"771\" height=\"131\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-5.png\" alt=\"\" class=\"wp-image-367\" style=\"width:449px;height:auto\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-5.png 771w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-5-300x51.png 300w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-5-768x130.png 768w\" sizes=\"(max-width: 771px) 100vw, 771px\" \/><\/figure>\n\n\n\n<p>Additional information : <a href=\"https:\/\/docs.splunk.com\/Documentation\/ES\/8.0.2\/Admin\/ViewEnabledDetectionVersions\" target=\"_blank\" rel=\"noreferrer noopener\">Create multiple versions of a detection in Splunk Enterprise Security &#8211; Splunk Documentation<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usage<\/h3>\n\n\n\n<p>After versioning is turned on, you can find additional information in the \u201cVersion\u201d column in the&nbsp; Content Management.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"467\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-7.png\" alt=\"\" class=\"wp-image-370\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-7.png 605w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-7-300x232.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<p>Now if you edit a versioned detection, you will find additional options in the Edit page:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"604\" height=\"290\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-10.png\" alt=\"\" class=\"wp-image-373\" style=\"width:760px;height:auto\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-10.png 604w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-10-300x144.png 300w\" sizes=\"(max-width: 604px) 100vw, 604px\" \/><\/figure>\n\n\n\n<p>On the right in the Details panel,&nbsp; you get an ID for your detection (called <code>detection_id<\/code>) and versions panel on the bottom. The version in green is the activated one.<br>You now have the button called \u201cSave as new version\u201d instead of a simple \u201cSave\u201d button.<br>If you modify something on the rule, a new version appears after the saving :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"296\" height=\"277\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-6.png\" alt=\"\" class=\"wp-image-369\" style=\"width:234px;height:auto\" \/><\/figure>\n\n\n\n<p>By default, the new version has \u201cOff\u201d as Status.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"93\" height=\"220\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-11.png\" alt=\"\" class=\"wp-image-374\" \/><\/figure>\n\n\n\n<p>If you want to activate that version, you must click on that new version (the version appears at the end of the URL):<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"294\" height=\"44\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-9.png\" alt=\"\" class=\"wp-image-372\" \/><\/figure>\n\n\n\n<p>Then you must select \u201cOn\u201d at the bottom. It\u2019s activated immediately (no need to save).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"604\" height=\"73\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-8.png\" alt=\"\" class=\"wp-image-371\" style=\"width:748px;height:auto\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-8.png 604w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-8-300x36.png 300w\" sizes=\"(max-width: 604px) 100vw, 604px\" \/><\/figure>\n\n\n\n<p>Then the version is activated :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"210\" height=\"215\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-12.png\" alt=\"\" class=\"wp-image-375\" \/><\/figure>\n\n\n\n<p>At the upper right corner you get a notification indicating the new version is activated:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"488\" height=\"55\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-13.png\" alt=\"\" class=\"wp-image-376\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-13.png 488w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-13-300x34.png 300w\" sizes=\"(max-width: 488px) 100vw, 488px\" \/><\/figure>\n\n\n\n<p>Back to Content Management, you can find, at the end of each detection rule that has a version, the Action menu that can show you the Version history in a new modal window :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"105\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-14.png\" alt=\"\" class=\"wp-image-377\" style=\"width:760px;height:auto\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-14.png 605w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-14-300x52.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<p>The modal window :<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"111\" src=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-15.png\" alt=\"\" class=\"wp-image-378\" style=\"width:759px;height:auto\" srcset=\"https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-15.png 605w, https:\/\/www.octamis.com\/octamis-blog\/wp-content\/uploads\/2025\/02\/image-15-300x55.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<p>Unfortunately, there is now way to view the differences between these versions : if you click &#8220;View&#8221;, you get to the Edit page of that detection version.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Additional information<\/h4>\n\n\n\n<p>Versioning information is stored in multiple locations:<\/p>\n\n\n\n<ul>\n<li>cms_metadata lookup <\/li>\n\n\n\n<li>cms_main index <\/li>\n\n\n\n<li>savedsearches.conf (see below) <\/li>\n\n\n\n<li>content_versioning.conf <\/li>\n\n\n\n<li>feature_flags.conf <\/li>\n\n\n\n<li>content-version.conf<\/li>\n<\/ul>\n\n\n\n<p>These files are not currently documented on <a href=\"https:\/\/docs.splunk.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/docs.splunk.com\/<\/a>, but you can find their spec files in the <code>SA-ContentVersioning\/README<\/code> app directory. Lets see what information these artifacts contain.<\/p>\n\n\n\n<ul>\n<li><code>content_versioning.conf<\/code> : contains the <code>[content_versioning]<\/code> stanza, referencing all allowed apps that are included in content versioning. Only ES and ESCU detection rules are referenced here. This parameter must be in JSON format.<\/li>\n\n\n\n<li><code>feature_flags.conf<\/code>: contains 2 parameters, <code>versioning_activated<\/code> and <code>versioning_init<\/code> but are not documented. The first one is related whether versioning is activated or not.<\/li>\n<\/ul>\n\n\n\n<p>Additionally, the savedsearches.conf file contains, for every detection, a specific parameter named &#8220;<code>action.correlationsearch.metadata<\/code>&#8220;, stored in JSON format and containing version information:<\/p>\n\n\n\n<p><code>action.correlationsearch.metadata = {\"detection_id\": \"f235c3dd-26c5-405f-ac7b-671dff1f6640\", \"detection_version\": \"1\", \"minor_version\": 1, \"version\": \"1.1\", \"parent_detection_version\": \"\", \"app_version\": \"8.0.2\", \"source_id\": \"\", \"source_detection_name\": \"\", \"version_hash\": \"0b22f572fb8c44f7f21c1b385fed632308452031aa5cd81b6d478edf0c9a5307\", \"create_time\": 1738681838.650662, \"publish_time\": \"\", \"user\": \"\", \"notes\": \"[]\", \"deprecated\": 0, \"app_name\": \"SplunkEnterpriseSecuritySuite\", \"_key\": \"0b22f572fb8c44f7f21c1b385fed632308452031aa5cd81b6d478edf0c9a5307\"}<\/code><\/p>\n\n\n\n<p>The only way to get your own detection rules versioned with this version of ES is to put your rules in one of following allowed-apps : <code>DA-ESS-AccessProtection,DA-ESS-EndpointProtection,DA-ESS-IdentityManagement,DA-ESS-NetworkProtection,DA-ESS-ThreatIntelligence,SA-AccessProtection,SA-AuditAndDataProtection,SA-EndpointProtection,SA-IdentityManagement,SA-NetworkProtection,SA-ThreatIntelligence,SA-UEBA,SA-Utils<\/code> or <code>SplunkEnterpriseSecuritySuite<\/code>.<br>The <code>detection_id<\/code> in these metadata is created by the detection versioning feature. And version 1.1 of every rule is the original version of the detection when the feature is turned on.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>I\u2019m pretty skeptical on this detection versioning feature on Splunk ES. I thought all detection rules would be eligible to be versioned, but it is restricted to specific apps. That\u2019s the first point.<br>And when you have a versioning tool, you guess that you can do\/view a simple diff between two versions of your detection rules.<br>So the fact that this feature exists now is a good thing. I\u2019m simply hoping that it will improve and simplify over time. The usage of lookup, index, specific and non-documented files &nbsp;and current restrictions (limited to ES\/ESCU apps, no deactivation from GUI, no diff, no built-in dashboard) lets the preference go to git<em>hub\/lab\/ops<\/em> or <a href=\"https:\/\/www.logcraft.io\/\">Logcraft<\/a> to manage your detection rules.<\/p>\n\n\n\n<ul>\n<li><\/li>\n\n\n\n<li><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Table of contents Splunk Enterprise Security v8.0.2 is out since January, 22nd. I will present to you a new feature introduced in this version: detection versioning. Long awaited, this functionality is interesting in several ways. First of all, in theory, you can avoid using Git or GitLab to keep versions of your detections, as it [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":394,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[30,10,31],"_links":{"self":[{"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/posts\/359"}],"collection":[{"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/comments?post=359"}],"version-history":[{"count":37,"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/posts\/359\/revisions"}],"predecessor-version":[{"id":427,"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/posts\/359\/revisions\/427"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/media\/394"}],"wp:attachment":[{"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/media?parent=359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/categories?post=359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.octamis.com\/octamis-blog\/wp-json\/wp\/v2\/tags?post=359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}