Notifiers¶
The last phase in a typical framework check run is the notification
system. Multiple notifiers can be targeted as part of this phase by using
the --notify
option on the compliance --check
command. Valid
notifier options are stdout
, slack
, pagerduty
,
gh_issues
and, locker
. The general idea behind the notification
system is that each test_
can generate a short notification that has the
following components:
NOTE: When configuring notifiers, you should be aware of the possibility that notifications may contain sensitive information that can be sent to less trusted stores like Slack or public git issue trackers. So be mindful of check notification content as well as the nature of the forum you intend to send these notifications to.
title (mandatory): should be a
property
of theComplianceCheck
:@property def title(self): return 'The title'
body (mandatory): the body of the message.
subtitle (optional): if the check has several
test_
methods, then you can use subtitle in order to distinguish them when all notifications are sent.
If you want to create a notification for a given check, use one of the following strategies:
If your
ComplianceCheck
only has onetest_
method, you should just implement aget_notification_message()
method in your check.If there are many
test_
methods, you can either:Implement
get_notification_message(test_id)
and generate the notification structure based on thetest_id
parameter.Implement
msg_<name-of-the-check>()
method. For example, if one of your test methods is namedtest_ssh_users()
then you will need to implement a check notification method namedmsg_ssh_users()
.
All check notification methods must return a dictionary with the following structure:
{
"subtitle": "The subtitle of the check" # if required/desired,
"body": "The body message" # if None, use a standard body
}
When possible, it is recommended to use the standard body message
{"body": None}
which includes the number of failures, the number of
warnings, the number of issues fixed by fixers (if applicable), links to report
evidences generated (if applicable) and a link to the check runbook that
contains remediation instructions (if applicable).
The following sections describe the notifiers supported by the framework.
File descriptor¶
File descriptor notifications are written directly to standard output. Among
other things, this is useful for testing purposes. The file descriptor
notifier is also the default notifier and does not need to be specifically
set using the --notify
command line parameter.
Notifications are grouped by accreditation and check result (passing, warning, failure, error).
Slack¶
This configurable notifier will notify Slack channels (including user personal
channels if desired) per accreditation. If configured, it will also manage
a channel monitoring rotation that will select the appropriate user for the
current week and direct message them for a given accreditation. The following
is an example configuration for this notifier to be added to a configuration
file and used with the -C
option when executing your compliance checks:
"notify": {
"slack": {
"accred.one": {
"channels": ["#alert_channel_alpha", "#alert_channel_beta"],
"rotation": ["@foo", "@bar", "@baz"]
},
"accred.two": {
"channels": ["#alert_channel_gamma"],
"rotation": ["@moe", "@larry", "@curly"],
"mode": "compact"
}
}
}
Note that you can select the mode
of the notification. slack
notificator offers the following modes:
normal
: includes all types of test results (pass, fail, error, and warning) as well as a full description of each test. This is the default mode.compact
: show all types of test results but only show details on errors and warnings.
The below configuration format is also valid but does not provide for channel monitoring rotation management:
{
"notify": {
"slack": {
"accred.one": ["#alert_channel_alpha", "#alert_channel_beta"],
"accred.two": ["@shemp"]
}
}
}
This notifier also needs to know the credentials for sending message to your Slack organization. Include the following in your credentials file:
[slack]
webhook=XXX
You can also use a Slack app token (recommended if you need to post messages to private channels):
[slack]
token=XXX
Note that you can do the same thing using env vars SLACK_WEBHOOK
and SLACK_TOKEN
.
In case you need private channels as part of the list, you have to specify the channel ID:
{
"notify": {
"slack": {
"accred.one": ["#alert_channel_alpha", "11223344"],
}
}
}
Channel ID 11223344
can be obtained quickly from the URL to a
message of the target private channel. Of course, the Slack App needs
to be part of the private channel.
PagerDuty¶
This configurable notifier will send alerts to PagerDuty.
The following is an example configuration for this notifier
to be added to a configuration file and used with the pagerduty
option when executing your compliance checks.
Note that you have two options to configure the PagerDuty notifier:
Provide a list of checks by class path within an accreditation. This allows you to define which checks within the accreditation will trigger PageDuty notifications:
{ "pagerduty": { "my.accred1": { "service_id": "SERVICE_ID", "checks": [ "package.category.checks.test_module_one.CheckClassOne", "package.category.checks.test_module_two.CheckClassTwo" ] } } }
Provide accreditations only and the notifier will send alerts for all checks with those accreditations:
{ "pagerduty": { "my.accred1": "SERVICE_ID" } }
Note that the service_id
field is the service id from PagerDuty, e.g. PABC123
.
The PagerDuty notifier loads the active incidents to determine if
it needs to create a new incident or update an existing one by using the service_id
.
To get your service ID, go to your service in the PagerDuty dashboard and the
service ID will be the last path element (7 characters) of the URL. For example
for https://my-service/PABC123
, the service ID is PABC123
.
This notifier also needs to know the credentials for sending message to PagerDuty. Include the following in your credentials file:
[pagerduty]
events_integration_key=XXX
GitHub Issue¶
Depending on the configuration this notifier will create or update a GitHub issue per check or as a summary issue per accreditation. If an open issue already exists then the notification will be added to the existing issue as an issue comment otherwise a new issue will be created.
This notifier needs to know the credentials for interacting with the provided
GitHub repositories. Your credentials should, at a minimum, have
write
access to all repositories specified for notifications to function
correctly. Provide your GitHub id and personal access token in your
credentials file as shown below:
[github]
username=my-gh-id
token=my-gh-personal-access-token
GH Summary Issue by Accreditation¶
A configuration element for each accreditation is necessary to send summary
issue notifications using this notifier. Summary notifications send all
result statuses for checks within the accreditation. Each accreditation
configuration should consist of a list of repositories to send the notifications
to, optionally a project and column to assign your notification to, along
with a “summary_issue” sub-document dictionary that is used by the notifier to
configure the summary issue. To specify a repository provide the GitHub
“owner” and “repository” in the form of owner/repository
. The “summary_issue”
can be configured with the following fields:
- “title”
Required
Provides the title of the issue
- “frequency”
Optional
- Valid values are
- “day”
Prepends the title with
<YYYY-MM-DD> -
<YYYY-MM-DD>
label is added
- “week”
Prepends the title with
<year>, <iso week>W -
<year>
label is added<iso week>W
is added
- “month”
Prepends the title with
<year>, <month>M -
<year>
label is added<month>M
is added
- “year”
Prepends the title with
<year> -
<year>
label is added
- “labels”
Optional
List of strings
Tags the issue with the provided list of labels
- “message”
Optional
List of strings
Provides an overview of the issue to be included in the issue body upon creation
- “assignees”
Optional
List of strings (GH user IDs)
Assigns the issue to the list of users
- “rotation”
Optional
List of lists of strings (GH user IDs)
The “frequency” is required when setting a rotation
When present with “frequency”, overrides the “assignees” setting
Assigns the issue to the list of users based on the frequency and order in the rotation list of lists
The following is an example configuration for this notifier to be added to a
configuration file and used with the -C
option when executing your
compliance checks:
{
"notify": {
"gh_issues": {
"accr1": {
"repo": ["my-org/accr1-repo"],
"project": {"Super cool project": "Triage"},
"summary_issue": {
"title": "Super cool summary issue for accr1",
"frequency": "week",
"message": [
"This is line one.",
"This is line two."
],
"rotation": [["moe", "larry", "curly"], ["foo", "bar"]],
"assignees": ["the-dude", "walter", "donnie"]
}
},
...
}
}
}
GH Issue Per Check¶
A configuration element for each accreditation is necessary to send
notifications per check using this notifier. Each accreditation configuration
should consist of a list of repositories to send the notifications to, a
list of check execution statuses to send notifications for, and optionally a
list of projects boards and project columns to add the notification issues to.
To specify a repository provide the GitHub “owner” and “repository”
in the form of owner/repository
. Valid status values include “pass”,
“warn”, “fail”, and “error”. If no status configuration is provided then the
“fail” status is used as the default. You can also optionally limit your
notifications to a set of checks within an accreditation by providing a list
of check paths with a “checks” list. Finally to specify project boards to
assign issues to, set “project” to a dictionary where the keys are project
names and the values are the column names. The following is an example
configuration for this notifier to be added to a configuration file and
used with the -C
option when executing your compliance checks:
{
"notify": {
"gh_issues": {
"accr1": {
"repo": ["my-org/accr1-repo"],
"project": {"Super cool project": "Triage"},
"status": ["fail", "error"]
},
"accr2": {
"repo": ["my-org/accr2-repo"],
"project": {"Some other super cool project": "Backlog"},
"status": ["error"],
"checks": [
"chk_pkg.chk_cat_foo.checks.chk_module_foo.FooCheckClass",
"chk_pkg.chk_cat_foo.checks.chk_module_bar.BarCheckClass"
]
}
}
}
}
Evidence Locker¶
This notifier will take your check execution for all accreditations and put
a summary markdown file notifications/alerts_summary.md
into your evidence
locker. The summary markdown file will only be pushed to the remote
evidence locker if the full-remote
argument is applied to the evidence
option when executing your checks otherwise the file will remain in the local
evidence locker. No additional configuration is required for this notifier.