Create rule S6400[Terraform]: Granting highly privileged GCP resource rights is security-sensitive (#685)
* Create rule S6400 * first draft * second draft * relecture * last relecture du matin * another idea, last paragraph may be overkill * add small precision for new resources * Add code highlighted tag to code example Co-authored-by: loris-s-sonarsource <loris-s-sonarsource@users.noreply.github.com> Co-authored-by: Loris Sierra <loris.sierra@sonarsource.com> Co-authored-by: Nils Werner <nils.werner@sonarsource.com>
This commit is contained in:
parent
3069550d46
commit
0aeb50c127
1
rules/S6400/metadata.json
Normal file
1
rules/S6400/metadata.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
40
rules/S6400/terraform/metadata.json
Normal file
40
rules/S6400/terraform/metadata.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"title": "Granting highly privileged GCP resource rights is security-sensitive",
|
||||||
|
"type": "SECURITY_HOTSPOT",
|
||||||
|
"status": "ready",
|
||||||
|
"remediation": {
|
||||||
|
"func": "Constant\/Issue",
|
||||||
|
"constantCost": "5min"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"azure",
|
||||||
|
"cwe-284"
|
||||||
|
],
|
||||||
|
"extra": {
|
||||||
|
"replacementRules": [
|
||||||
|
|
||||||
|
],
|
||||||
|
"legacyKeys": [
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"defaultSeverity": "Major",
|
||||||
|
"ruleSpecification": "RSPEC-6400",
|
||||||
|
"sqKey": "S6400",
|
||||||
|
"scope": "Main",
|
||||||
|
"securityStandards": {
|
||||||
|
"CWE": [
|
||||||
|
284
|
||||||
|
],
|
||||||
|
"OWASP": [
|
||||||
|
"A5"
|
||||||
|
],
|
||||||
|
"OWASP Top 10 2021": [
|
||||||
|
"A1"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"defaultQualityProfiles": [
|
||||||
|
"Sonar way"
|
||||||
|
],
|
||||||
|
"quickfix": "unknown"
|
||||||
|
}
|
147
rules/S6400/terraform/rule.adoc
Normal file
147
rules/S6400/terraform/rule.adoc
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
Granting highly privileged resource rights to users or groups can reduce an
|
||||||
|
organization's ability to protect against account or service theft. It prevents
|
||||||
|
proper segregation of duties and creates potentially critical attack vectors on
|
||||||
|
affected resources.
|
||||||
|
|
||||||
|
If elevated access rights are abused or compromised, both the data that the
|
||||||
|
affected resources work with and their access tracking are at risk.
|
||||||
|
|
||||||
|
== Ask Yourself Whether
|
||||||
|
|
||||||
|
* This GCP resource is essential to the information system infrastructure.
|
||||||
|
* This GCP resource is essential to mission-critical functions.
|
||||||
|
* Compliance policies require that administrative privileges for this resource be limited to a small group of individuals.
|
||||||
|
|
||||||
|
There is a risk if you answered yes to any of these questions.
|
||||||
|
|
||||||
|
== Recommended Secure Coding Practices
|
||||||
|
|
||||||
|
Grant IAM policies or members a less permissive role: In most cases, granting
|
||||||
|
them read-only privileges is sufficient.
|
||||||
|
|
||||||
|
Separate tasks by creating multiple roles that do not use a full access role
|
||||||
|
for day-to-day work.
|
||||||
|
|
||||||
|
If the predefined GCP roles do not include the specific permissions you need,
|
||||||
|
create https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_iam_custom_role[custom IAM roles].
|
||||||
|
|
||||||
|
== Sensitive Code Example
|
||||||
|
|
||||||
|
For an IAM policy setup:
|
||||||
|
[source,terraform]
|
||||||
|
----
|
||||||
|
data "google_iam_policy" "admin" {
|
||||||
|
binding {
|
||||||
|
role = "roles/run.admin" # Sensitive
|
||||||
|
members = [
|
||||||
|
"user:name@example.com",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "google_cloud_run_service_iam_policy" "policy" {
|
||||||
|
location = google_cloud_run_service.default.location
|
||||||
|
project = google_cloud_run_service.default.project
|
||||||
|
service = google_cloud_run_service.default.name
|
||||||
|
policy_data = data.google_iam_policy.admin.policy_data
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
For an IAM policy binding:
|
||||||
|
[source,terraform]
|
||||||
|
----
|
||||||
|
resource "google_cloud_run_service_iam_binding" "example" {
|
||||||
|
location = google_cloud_run_service.default.location
|
||||||
|
project = google_cloud_run_service.default.project
|
||||||
|
service = google_cloud_run_service.default.name
|
||||||
|
role = "roles/run.admin" # Sensitive
|
||||||
|
members = [
|
||||||
|
"user:name@example.com",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
For adding a member to a policy:
|
||||||
|
[source,terraform]
|
||||||
|
----
|
||||||
|
resource "google_cloud_run_service_iam_member" "example" {
|
||||||
|
location = google_cloud_run_service.default.location
|
||||||
|
project = google_cloud_run_service.default.project
|
||||||
|
service = google_cloud_run_service.default.name
|
||||||
|
role = "roles/run.admin" # Sensitive
|
||||||
|
member = "user:name@example.com"
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
== Compliant Solution
|
||||||
|
|
||||||
|
For an IAM policy setup:
|
||||||
|
[source,terraform]
|
||||||
|
----
|
||||||
|
data "google_iam_policy" "admin" {
|
||||||
|
binding {
|
||||||
|
role = "roles/viewer"
|
||||||
|
members = [
|
||||||
|
"user:name@example.com",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "google_cloud_run_service_iam_policy" "example" {
|
||||||
|
location = google_cloud_run_service.default.location
|
||||||
|
project = google_cloud_run_service.default.project
|
||||||
|
service = google_cloud_run_service.default.name
|
||||||
|
policy_data = data.google_iam_policy.admin.policy_data
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
For an IAM policy binding:
|
||||||
|
[source,terraform]
|
||||||
|
----
|
||||||
|
resource "google_cloud_run_service_iam_binding" "example" {
|
||||||
|
location = google_cloud_run_service.default.location
|
||||||
|
project = google_cloud_run_service.default.project
|
||||||
|
service = google_cloud_run_service.default.name
|
||||||
|
role = "roles/viewer"
|
||||||
|
members = [
|
||||||
|
"user:name@example.com",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
For adding a member to a policy:
|
||||||
|
[source,terraform]
|
||||||
|
----
|
||||||
|
resource "google_cloud_run_service_iam_member" "example" {
|
||||||
|
location = google_cloud_run_service.default.location
|
||||||
|
project = google_cloud_run_service.default.project
|
||||||
|
service = google_cloud_run_service.default.name
|
||||||
|
role = "roles/viewer"
|
||||||
|
member = "user:name@example.com"
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
== See
|
||||||
|
|
||||||
|
* https://owasp.org/Top10/A01_2021-Broken_Access_Control/[OWASP Top 10 2021 Category A1] - Broken Access Control
|
||||||
|
* https://owasp.org/www-project-top-ten/2017/A5_2017-Broken_Access_Control[OWASP Top 10 2017 Category A5] - Broken Access Control
|
||||||
|
* https://cwe.mitre.org/data/definitions/284.html[MITRE, CWE-284] - Improper Access Control
|
||||||
|
|
||||||
|
ifdef::env-github,rspecator-view[]
|
||||||
|
|
||||||
|
'''
|
||||||
|
== Implementation Specification
|
||||||
|
(visible only on this page)
|
||||||
|
|
||||||
|
=== Message
|
||||||
|
|
||||||
|
* For a policy: Make sure it is safe to give all future members full access to this resource.
|
||||||
|
* For a binding: Make sure it is safe to give those members full access to the resource.
|
||||||
|
* For a member add: Make sure it is safe to grant that member full access to the resource.
|
||||||
|
* For the rest: Make sure it is safe to grant full access to the resource.
|
||||||
|
|
||||||
|
=== Highlighting
|
||||||
|
|
||||||
|
Highlight the full role assignment. In lists, highlight the non-compliant item.
|
||||||
|
|
||||||
|
endif::env-github,rspecator-view[]
|
Loading…
x
Reference in New Issue
Block a user