Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
x4v13r64 committed May 29, 2020
2 parents 2b88a39 + 0129ddb commit eac628c
Show file tree
Hide file tree
Showing 16 changed files with 226 additions and 6 deletions.
@@ -0,0 +1,26 @@

<!-- Stackdriver Logging metrics partial -->
<script id="services.stackdriverlogging.projects.id.metrics.partial" type="text/x-handlebars-template">
<div id="resource-name" class="list-group-item active">
<h4 class="list-group-item-heading">{{name}}</h4>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading">Information</h4>
<div class="list-group-item-text item-margin">Name: <span id="stackdriverlogging.projects.{{@../key}}.metrics.{{@key}}.name">{{name}}</span></div>
<div class="list-group-item-text item-margin">Project ID: <span id="stackdriverlogging.projects.{{project}}.keyrings.{{@key}}.project_id"><samp>{{project}}</samp></span></div>
<div class="list-group-item-text item-margin">Description: <span id="stackdriverlogging.projects.{{@../key}}.metrics.{{@key}}.description"><samp>{{value_or_none description}}</samp></span></div>
<div class="list-group-item-text item-margin">Filter: <span id="stackdriverlogging.projects.{{@../key}}.metrics.{{@key}}.filter"><code>{{filter}}</code></span></div>
</div>
</script>

<script>
Handlebars.registerPartial("services.stackdriverlogging.projects.id.metrics", $("#services\\.stackdriverlogging\\.projects\\.id\\.metrics\\.partial").html());
</script>

<!-- Single stackdriverlogging metric template -->
<script id="single_stackdriverlogging_metric-template" type="text/x-handlebars-template">
{{> modal-template template='services.stackdriverlogging.projects.id.metrics'}}
</script>
<script>
var single_stackdriverlogging_metric_template = Handlebars.compile($("#single_stackdriverlogging_metric-template").html());
</script>
@@ -0,0 +1,26 @@
<!-- stackdrivermonitoring uptime_checks -->
<script id="services.stackdrivermonitoring.projects.id.uptime_checks.partial" type="text/x-handlebars-template">
<div id="resource-name" class="list-group-item active">
<h4 class="list-group-item-heading">{{name}}</h4>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading">Information</h4>
<div class="list-group-item-text item-margin">Name: <span id="stackdrivermonitoring.projects.{{project}}.uptime_checks.{{@key}}.name"><samp>{{value_or_none display_name}}</samp></span></div>
<div class="list-group-item-text item-margin">Monitored Resource: <span id="stackdrivermonitoring.projects.{{project}}.uptime_checks.{{@key}}.monitored_resource"><code>{{value_or_none monitored_resource}}</code></span></div>
<div class="list-group-item-text item-margin">HTTP Check: <span id="stackdrivermonitoring.projects.{{project}}.uptime_checks.{{@key}}.http_check"><code>{{value_or_none http_check}}</code></span></div>
<div class="list-group-item-text item-margin">Period: <span id="stackdrivermonitoring.projects.{{project}}.uptime_checks.{{@key}}.period"><samp>{{value_or_none period}}</samp></span></div>
<div class="list-group-item-text item-margin">Timeout: <span id="stackdrivermonitoring.projects.{{project}}.uptime_checks.{{@key}}.timeout"><samp>{{value_or_none timeout}}</samp></span></div>
</div>
</script>

<script>
Handlebars.registerPartial("services.stackdrivermonitoring.projects.id.uptime_checks", $("#services\\.stackdrivermonitoring\\.projects\\.id\\.uptime_checks\\.partial").html());
</script>

<!-- Single stackdrivermonitoring uptime_check template -->
<script id="single_stackdrivermonitoring_uptime_check-template" type="text/x-handlebars-template">
{{> modal-template template='services.stackdrivermonitoring.projects.id.uptime_checks'}}
</script>
<script>
var single_stackdrivermonitoring_uptime_check_template = Handlebars.compile($("#single_stackdrivermonitoring_uptime_check-template").html());
</script>
@@ -0,0 +1,27 @@
<!-- stackdrivermonitoring alert_policies -->
<script id="services.stackdrivermonitoring.projects.id.alert_policies.partial" type="text/x-handlebars-template">
<div id="resource-name" class="list-group-item active">
<h4 class="list-group-item-heading">{{name}}</h4>
</div>
<div class="list-group-item">
<h4 class="list-group-item-heading">Information</h4>
<div class="list-group-item-text item-margin">Name: <span id="stackdrivermonitoring.projects.{{project}}.alert_policies.{{@key}}.name"><samp>{{value_or_none name}}</samp></span></div>
<div class="list-group-item-text item-margin">Creation Record: <span id="stackdrivermonitoring.projects.{{project}}.alert_policies.{{@key}}.creation_record"><code>{{value_or_none creation_record}}</code></span></div>
<div class="list-group-item-text item-margin">Mutation Record: <span id="stackdrivermonitoring.projects.{{project}}.alert_policies.{{@key}}.mutation_record"><code>{{value_or_none mutation_record}}</code></span></div>
<div class="list-group-item-text item-margin">Conditions: <span id="stackdrivermonitoring.projects.{{project}}.alert_policies.{{@key}}.conditions"><code>{{value_or_none conditions}}</code></span></div>
<div class="list-group-item-text item-margin">Combiner: <span id="stackdrivermonitoring.projects.{{project}}.alert_policies.{{@key}}.combiner"><samp>{{value_or_none combiner}}</samp></span></div>
<div class="list-group-item-text item-margin">Enabled: <span id="stackdrivermonitoring.projects.{{project}}.alert_policies.{{@key}}.enabled"><samp>{{value_or_none enabled}}</samp></span></div>
</div>
</script>

<script>
Handlebars.registerPartial("services.stackdrivermonitoring.projects.id.alert_policies", $("#services\\.stackdrivermonitoring\\.projects\\.id\\.alert_policies\\.partial").html());
</script>

<!-- Single stackdrivermonitoring alert_policie template -->
<script id="single_stackdrivermonitoring_alert_policie-template" type="text/x-handlebars-template">
{{> modal-template template='services.stackdrivermonitoring.projects.id.alert_policies'}}
</script>
<script>
var single_stackdrivermonitoring_alert_policie_template = Handlebars.compile($("#single_stackdrivermonitoring_alert_policie-template").html());
</script>
4 changes: 2 additions & 2 deletions ScoutSuite/providers/gcp/facade/base.py
Expand Up @@ -7,8 +7,7 @@
from ScoutSuite.providers.gcp.facade.iam import IAMFacade
from ScoutSuite.providers.gcp.facade.kms import KMSFacade
from ScoutSuite.providers.gcp.facade.stackdriverlogging import StackdriverLoggingFacade
from ScoutSuite.providers.gcp.facade.utils import GCPFacadeUtils
from ScoutSuite.providers.utils import run_concurrently
from ScoutSuite.providers.gcp.facade.stackdrivermonitoring import StackdriverMonitoringFacade
from ScoutSuite.providers.gcp.facade.utils import GCPFacadeUtils
from ScoutSuite.utils import format_service_name

Expand Down Expand Up @@ -37,6 +36,7 @@ def __init__(self,
self.iam = IAMFacade()
self.kms = KMSFacade()
self.stackdriverlogging = StackdriverLoggingFacade()
self.stackdrivermonitoring = StackdriverMonitoringFacade()

# Instantiate facades for proprietary services
try:
Expand Down
9 changes: 9 additions & 0 deletions ScoutSuite/providers/gcp/facade/stackdriverlogging.py
Expand Up @@ -5,10 +5,19 @@


class StackdriverLoggingFacade:

async def get_sinks(self, project_id: str):
try:
client = stackdriverlogging.Client(project=project_id)
return await run_concurrently(lambda: [sink for sink in client.list_sinks()])
except Exception as e:
print_exception('Failed to retrieve sinks: {}'.format(e))
return []

async def get_metrics(self, project_id: str):
try:
client = stackdriverlogging.Client(project=project_id)
return await run_concurrently(lambda: [metric for metric in client.list_metrics()])
except Exception as e:
print_exception('Failed to retrieve metrics: {}'.format(e))
return []
25 changes: 25 additions & 0 deletions ScoutSuite/providers/gcp/facade/stackdrivermonitoring.py
@@ -0,0 +1,25 @@
from google.cloud import monitoring as stackdrivermonitoring

from ScoutSuite.core.console import print_exception
from ScoutSuite.providers.utils import run_concurrently


class StackdriverMonitoringFacade:

async def get_uptime_checks(self, project_id: str):
try:
client = stackdrivermonitoring.UptimeCheckServiceClient()
name = client.project_path(project_id)
return await run_concurrently(lambda: [r for r in client.list_uptime_check_configs(name)])
except Exception as e:
print_exception('Failed to retrieve uptime checks: {}'.format(e))
return []

async def get_alert_policies(self, project_id: str):
try:
client = stackdrivermonitoring.AlertPolicyServiceClient()
name = client.project_path(project_id)
return await run_concurrently(lambda: [r for r in client.list_alert_policies(name)])
except Exception as e:
print_exception('Failed to retrieve alert policies: {}'.format(e))
return []
16 changes: 16 additions & 0 deletions ScoutSuite/providers/gcp/metadata.json
Expand Up @@ -89,6 +89,22 @@
"sinks": {
"cols": 2,
"path": "services.stackdriverlogging.projects.id.sinks"
},
"metrics": {
"cols": 2,
"path": "services.stackdriverlogging.projects.id.metrics"
}
}
},
"stackdrivermonitoring": {
"resources": {
"uptime_checks": {
"cols": 2,
"path": "services.stackdrivermonitoring.projects.id.uptime_checks"
},
"alert_policies": {
"cols": 2,
"path": "services.stackdrivermonitoring.projects.id.alert_policies"
}
}
}
Expand Down
@@ -1,8 +1,10 @@
from ScoutSuite.providers.gcp.resources.projects import Projects
from ScoutSuite.providers.gcp.resources.stackdriverlogging.sinks import Sinks
from ScoutSuite.providers.gcp.resources.stackdriverlogging.metrics import Metrics


class StackdriverLogging(Projects):
_children = [
(Sinks, 'sinks')
(Sinks, 'sinks'),
(Metrics, 'metrics')
]
21 changes: 21 additions & 0 deletions ScoutSuite/providers/gcp/resources/stackdriverlogging/metrics.py
@@ -0,0 +1,21 @@
from ScoutSuite.providers.base.resources.base import Resources
from ScoutSuite.providers.gcp.facade.base import GCPFacade


class Metrics(Resources):
def __init__(self, facade: GCPFacade, project_id: str):
super(Metrics, self).__init__(facade)
self.project_id = project_id

async def fetch_all(self):
raw_metrics = await self.facade.stackdriverlogging.get_metrics(self.project_id)
for raw_metric in raw_metrics:
metric_name, metric = self._parse_metric(raw_metric)
self[metric_name] = metric

def _parse_metric(self, raw_metric):
metric_dict = {}
metric_dict['name'] = raw_metric.name
metric_dict['description'] = raw_metric.description
metric_dict['filter'] = raw_metric.filter_
return metric_dict['name'], metric_dict
Empty file.
@@ -0,0 +1,28 @@
from ScoutSuite.providers.base.resources.base import Resources
from ScoutSuite.providers.gcp.facade.base import GCPFacade
from ScoutSuite.providers.utils import get_non_provider_id


class AlertPolicies(Resources):
def __init__(self, facade: GCPFacade, project_id: str):
super(AlertPolicies, self).__init__(facade)
self.project_id = project_id

async def fetch_all(self):
raw_alert_policies = await self.facade.stackdrivermonitoring.get_alert_policies(self.project_id)
for raw_alert_policy in raw_alert_policies:
alert_policy_name, alert_policy = self._parse_alert_policy(raw_alert_policy)
self[alert_policy_name] = alert_policy

def _parse_alert_policy(self, raw_alert_policy):
alert_policy_dict = {}
alert_policy_dict['id'] = get_non_provider_id(raw_alert_policy.name)
alert_policy_dict['name'] = raw_alert_policy.display_name
alert_policy_dict['combiner'] = raw_alert_policy.combiner
alert_policy_dict['creation_record'] = raw_alert_policy.creation_record
alert_policy_dict['mutation_record'] = raw_alert_policy.mutation_record
alert_policy_dict['conditions'] = raw_alert_policy.conditions
alert_policy_dict['enabled'] = raw_alert_policy.enabled
return alert_policy_dict['id'], alert_policy_dict


10 changes: 10 additions & 0 deletions ScoutSuite/providers/gcp/resources/stackdrivermonitoring/base.py
@@ -0,0 +1,10 @@
from ScoutSuite.providers.gcp.resources.projects import Projects
from ScoutSuite.providers.gcp.resources.stackdrivermonitoring.uptime_checks import UptimeChecks
from ScoutSuite.providers.gcp.resources.stackdrivermonitoring.alert_policies import AlertPolicies


class StackdriverMonitoring(Projects):
_children = [
(UptimeChecks, 'uptime_checks'),
(AlertPolicies, 'alert_policies')
]
@@ -0,0 +1,25 @@
from ScoutSuite.providers.base.resources.base import Resources
from ScoutSuite.providers.gcp.facade.base import GCPFacade
from ScoutSuite.providers.utils import get_non_provider_id


class UptimeChecks(Resources):
def __init__(self, facade: GCPFacade, project_id: str):
super(UptimeChecks, self).__init__(facade)
self.project_id = project_id

async def fetch_all(self):
raw_uptime_checks = await self.facade.stackdrivermonitoring.get_uptime_checks(self.project_id)
for raw_uptime_check in raw_uptime_checks:
uptime_check_name, uptime_check = self._parse_uptime_check(raw_uptime_check)
self[uptime_check_name] = uptime_check

def _parse_uptime_check(self, raw_uptime_check):
uptime_check_dict = {}
uptime_check_dict['id'] = get_non_provider_id(raw_uptime_check.name)
uptime_check_dict['name'] = raw_uptime_check.display_name
uptime_check_dict['monitored_resource'] = raw_uptime_check.monitored_resource
uptime_check_dict['http_check'] = raw_uptime_check.http_check
uptime_check_dict['period'] = raw_uptime_check.period
uptime_check_dict['timeout'] = raw_uptime_check.timeout
return uptime_check_dict['id'], uptime_check_dict
2 changes: 2 additions & 0 deletions ScoutSuite/providers/gcp/services.py
Expand Up @@ -6,6 +6,7 @@
from ScoutSuite.providers.gcp.resources.iam.base import IAM
from ScoutSuite.providers.gcp.resources.kms.base import KMS
from ScoutSuite.providers.gcp.resources.stackdriverlogging.base import StackdriverLogging
from ScoutSuite.providers.gcp.resources.stackdrivermonitoring.base import StackdriverMonitoring

# Try to import proprietary services
try:
Expand All @@ -30,6 +31,7 @@ def __init__(self, credentials=None, default_project_id=None,
self.iam = IAM(facade)
self.kms = KMS(facade)
self.stackdriverlogging = StackdriverLogging(facade)
self.stackdrivermonitoring = StackdriverMonitoring(facade)

# Instantiate proprietary services
try:
Expand Down
4 changes: 2 additions & 2 deletions requirements.txt
Expand Up @@ -18,8 +18,8 @@ grpcio>=1.18.0
google-cloud-container>=0.2.1
google-cloud-core>=0.29.1
google-cloud-iam>=0.1.0
google-cloud-logging>=1.10.0
google-cloud-monitoring>=0.31.1
google-cloud-logging>=1.15.0
google-cloud-monitoring>=0.36.0
google-cloud-resource-manager>=0.28.3
google-cloud-storage>=1.13.2
google-cloud-kms>=1.0.0
Expand Down
5 changes: 4 additions & 1 deletion tools/process_raw_response.py
Expand Up @@ -52,7 +52,7 @@ def camel_to_snake(name, upper=False):
parser.add_argument('-v', '--value', required=True, help="The raw response")
args = parser.parse_args()

if args.provider not in ['aws', 'azure', 'aliyun', 'oci']:
if args.provider not in ['aws', 'azure', 'aliyun', 'gcp', 'oci']:
# TODO support more providers
print('Provider not implemented')
exit()
Expand All @@ -73,6 +73,9 @@ def camel_to_snake(name, upper=False):
elif args.provider == 'aliyun':
object_format = 'raw_{}.get(\'{}\')'
object_value_dict = literal_eval(args.value)
elif args.provider == 'gcp':
object_format = 'raw_{}.{}'
object_value_dict = json.loads(args.value)
elif args.provider == 'oci':
object_format = 'raw_{}.{}'
object_value_dict = json.loads(args.value)
Expand Down

0 comments on commit eac628c

Please sign in to comment.