diff --git a/.github/workflows/detection-testing.yml b/.github/workflows/detection-testing.yml
index 80062fe601..b70056a0c6 100644
--- a/.github/workflows/detection-testing.yml
+++ b/.github/workflows/detection-testing.yml
@@ -287,8 +287,8 @@ jobs:
name: DetectionFailureManifest
path: |
bin/docker_detection_tester/detection_failure_manifest.json
-
+
#Always clean these up, they make the output messy
- name: Clean up intermediate Files
uses: geekyeggo/delete-artifact@v1
@@ -305,7 +305,39 @@ jobs:
config_tests_7.json.results
config_tests_8.json.results
config_tests_9.json.results
+
+ - name: Log in to S3 for Artifact Uploads
+ if: ${{ github.event_name == 'schedule' }}
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+
+ aws-region: us-west-2
+
+ - name: Upload S3 Badge and Summary Artifacts for Nightly Scheduled Run
+ if: ${{ github.event_name == 'schedule' }}
+ run: |
+ cd bin/docker_detection_tester
+ python generate_detection_coverage_badge.py --input_summary_file summary_test_results.json --output_badge_file detection_coverage.svg --badge_string "Pass Rate"
+
+
+ #Upload artifact (summary test results)
+ aws s3 cp summary_test_results.json s3://security-content/reporting/summary_test_results.json
+
+ #Since these reside in a public bucket, no need to explicitly mark as public
+ # make the file public since it is not by default
+ #aws s3api put-object-acl --bucket security-content --key reporting/summary_test_results.json --acl public-read
+
+
+ #Upload artifact (test results coverage badge)
+ aws s3 cp detection_coverage.svg s3://security-content/reporting/detection_coverage.svg
+
+ #Since these reside in a public bucket, no need to explicitly mark as public
+ # make the file public since it is not by default
+ #aws s3api put-object-acl --bucket security-content --key reporting/detection_coverage.svg --acl public-read
+
diff --git a/README.md b/README.md
index 911a9278f7..58039bb5e8 100644
--- a/README.md
+++ b/README.md
@@ -129,3 +129,4 @@ distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
+
diff --git a/bin/contentctl_project/contentctl_infrastructure/adapter/templates/doc_detection_page.j2 b/bin/contentctl_project/contentctl_infrastructure/adapter/templates/doc_detection_page.j2
index 6089a3c851..358b3ebe7c 100644
--- a/bin/contentctl_project/contentctl_infrastructure/adapter/templates/doc_detection_page.j2
+++ b/bin/contentctl_project/contentctl_infrastructure/adapter/templates/doc_detection_page.j2
@@ -12,8 +12,8 @@ sidebar:
| -------------- | --------------- | --------------- |
{%- for detection in objects -%}
{% if detection.tags.mitre_attack_enrichments %}
-| [{{ detection.name }}](/{{ detection.source }}/{{ detection.name | lower | replace(' ', '_') }}/) | {% for attack in detection.tags.mitre_attack_enrichments -%} [{{ attack.mitre_attack_technique }}](/tags/#{{ attack.mitre_attack_technique | lower | replace(" ", "-") }}){% if not loop.last -%}, {% endif -%}{%- endfor %} | {{ detection.type }} |
+| [{{ detection.name }}](/{{ detection.source }}/{{ detection.name | lower | replace(' ', '_') }}/) | {% for attack in detection.tags.mitre_attack_enrichments -%} [{{ attack.mitre_attack_technique }}](/tags/#{{ attack.mitre_attack_technique | lower | replace(" ", "-") }}){% if not loop.last -%}, {% endif -%}{%- endfor %} | [{{ detection.type }}](https://github.com/splunk/security_content/wiki/Detection-Analytic-Types) |
{%- else %}
-| [{{ detection.name }}]() | None | {{ detection.type }} |
+| [{{ detection.name }}]() | None | [{{ detection.type }}](https://github.com/splunk/security_content/wiki/Detection-Analytic-Types) |
{%- endif -%}
{%- endfor -%}
diff --git a/bin/contentctl_project/contentctl_infrastructure/adapter/templates/doc_detections.j2 b/bin/contentctl_project/contentctl_infrastructure/adapter/templates/doc_detections.j2
index b443d7d8de..a762d8aab4 100644
--- a/bin/contentctl_project/contentctl_infrastructure/adapter/templates/doc_detections.j2
+++ b/bin/contentctl_project/contentctl_infrastructure/adapter/templates/doc_detections.j2
@@ -44,17 +44,23 @@ We have not been able to test, simulate, or build datasets for this object. Use
{{ object.description }}
-- **Type**: [{{ object.type }}](https://github.com/splunk/security_content/wiki/object-Analytic-Types)
+- **Type**: [{{ object.type }}](https://github.com/splunk/security_content/wiki/Detection-Analytic-Types)
- **Product**: {{ object.tags.product|join(', ') }}
{% if object.datamodel -%}- **Datamodel**: {% for datamodel in object.datamodel %}[{{ datamodel }}](https://docs.splunk.com/Documentation/CIM/latest/User/{{ datamodel|replace("_", "")}}){% if not loop.last %}, {% endif %}{%-endfor %}{% endif %}
-{% if object.splunk_app_enrichment -%}- **Datasource**: {% for splunk_app in object.splunk_app_enrichment %}[{{ splunk_app.name }}]({{splunk_app.url}}){% if not loop.last %}, {% endif %}{%-endfor %}{% endif %}
+{%- if object.splunk_app_enrichment %}- **Datasource**: {% for splunk_app in object.splunk_app_enrichment %}[{{ splunk_app.name }}]({{splunk_app.url}}){% if not loop.last %}, {% endif %}{%-endfor %}{% endif %}
- **Last Updated**: {{ object.date }}
- **Author**: {{object.author}}
- **ID**: {{ object.id }}
-{% if object.tags.mitre_attack_id %}
-#### [ATT&CK](https://attack.mitre.org/)
+#### Annotations
+
+ATT&CK
+
+Kill Chain Phase
+
+NIST
+
+CIS20
+
+CVE
+
+ATT&CK
+
+Kill Chain Phase
+
+NIST
+
+CIS20
+
+CVE
+
+ATT&CK
+
+Kill Chain Phase
+
+NIST
+
+CIS20
+
+CVE
+
+ATT&CK
+
+Kill Chain Phase
+
+NIST
+
+CIS20
+
+CVE
+
+ATT&CK
+
+Kill Chain Phase
+
+NIST
+
+CIS20
+
+CVE
+
+