kubernetes.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package rules
  2. import (
  3. "github.com/zricethezav/gitleaks/v8/cmd/generate/config/utils"
  4. "regexp"
  5. "github.com/zricethezav/gitleaks/v8/config"
  6. )
  7. // The kubernetes rules are split into two functions to make the complex proximity matching of the data-key and the kind-identifier more readable and testable
  8. // KubernetesSecretWithDataBefore validates if we detected a kubernetes secret which contains data, before the resource identifier!
  9. func KubernetesSecretWithDataBefore() *config.Rule {
  10. // define rule
  11. r := config.Rule{
  12. RuleID: "kubernetes-secret-with-data-before",
  13. Description: "Possible Kubernetes Secret detected, posing a risk of leaking credentials/tokens from your deployments",
  14. // We try to match secrets by looking if we have the keyword
  15. Regex: utils.GenerateUniqueTokenRegex(`(?i)(?:\b(?:data:))(\W+(?:\w+\W+){0,200}?)\bkind:.{0,10}Secret\b`, true),
  16. Keywords: []string{
  17. "Secret",
  18. },
  19. // Kubernetes secrets are always yaml files, we limit to common yaml-endings to make this rule more safe!
  20. Path: regexp.MustCompile(`(?i)\.ya?ml$`),
  21. }
  22. // validate
  23. tps := map[string]string{
  24. // Sample Kubernetes Secret from https://kubernetes.io/docs/concepts/configuration/secret/
  25. // These secrets contain the "data"-key before the actual identifier "kind: Secret"
  26. "kubernetes.yaml": "apiVersion: v1'\n' data:'\n' extra: YmFyCg=='\n' kind: secret'\n' metadata:'\n' name: secret-sa-sample'\n' annotations:'\n' kubernetes.io/service-account.name: 'sa-name'", // gitleaks:allow
  27. "kubernetes.yml": "apiVersion: v1'\n' data:'\n' password: UyFCXCpkJHpEc2I9'\n' username: YWRtaW4='\n' kind: Secret'\n' metadata:'\n' creationTimestamp: '2022-06-28T17:44:13Z''\n' name: db-user-pass'\n' namespace: default'\n' type: Opaque", // gitleaks:allow
  28. // Quoted Test Cases
  29. "kubernetes-quoted-1.yaml": "apiVersion: v1'\n' data:'\n' extra: YmFyCg=='\n' kind: 'Secret''\n' metadata:'\n' name: 'secret-sa-sample''\n' annotations:'\n' kubernetes.io/service-account.name: 'sa-name'", // gitleaks:allow
  30. "kubernetes-quoted-2.yaml": "apiVersion: v1'\n' data:'\n' extra: YmFyCg=='\n' kind: 'secret''\n' metadata:'\n' name: 'secret-sa-sample''\n' annotations:'\n' kubernetes.io/service-account.name: 'sa-name'", // gitleaks:allow
  31. }
  32. return utils.ValidateWithPaths(r, tps, nil)
  33. }
  34. // KubernetesSecretWithDataAfter validates if we detected a kubernetes secret which contains data, after the resource identifier!
  35. func KubernetesSecretWithDataAfter() *config.Rule {
  36. // define rule
  37. r := config.Rule{
  38. RuleID: "kubernetes-secret-with-data-after",
  39. Description: "Possible Kubernetes Secret detected, posing a risk of leaking credentials/tokens from your deployments",
  40. // We try to match secrets by looking if we have the keyword
  41. Regex: utils.GenerateUniqueTokenRegex(`(?i)(?:\bkind:.{0,10}Secret\b)(?:.|\s){0,200}?\b(?:data:)\s*(.+)`, true),
  42. Keywords: []string{
  43. "Secret",
  44. },
  45. // Kubernetes secrets are always yaml files, we limit to common yaml-endings to make this rule more safe!
  46. Path: regexp.MustCompile(`(?i)\.ya?ml$`),
  47. }
  48. // validate
  49. tps := map[string]string{
  50. // Sample Kubernetes Secret from https://kubernetes.io/docs/concepts/configuration/secret/
  51. // These secrets contain the data after the actual identifier "kind: Secret"
  52. "kubernetes.yaml": "apiVersion: v1'\n' kind: secret'\n' data:'\n' extra: YmFyCg=='\n' metadata:'\n' name: secret-sa-sample'\n' annotations:'\n' kubernetes.io/service-account.name: 'sa-name'", // gitleaks:allow
  53. "kubernetes.yml": "apiVersion: v1'\n' kind: Secret'\n' data:'\n' password: UyFCXCpkJHpEc2I9'\n' username: YWRtaW4='\n' metadata:'\n' creationTimestamp: '2022-06-28T17:44:13Z''\n' name: db-user-pass'\n' namespace: default'\n' type: Opaque", // gitleaks:allow
  54. // Quoted Test Cases
  55. "kubernetes-quoted-1.yaml": "apiVersion: v1'\n' kind: 'Secret''\n' data:'\n' password: UyFCXCpkJHpEc2I9'\n' username: YWRtaW4='\n' metadata:'\n' name: db-user-pass'\n' namespace: default'\n' type: Opaque", // gitleaks:allow
  56. "kubernetes-quoted-2.yaml": "apiVersion: v1'\n' kind: 'secret''\n' data:'\n' password: UyFCXCpkJHpEc2I9'\n' username: YWRtaW4='\n' metadata:'\n' name: db-user-pass'\n' namespace: default'\n' type: Opaque", // gitleaks:allow
  57. }
  58. return utils.ValidateWithPaths(r, tps, nil)
  59. }