main.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. package main
  2. import (
  3. "os"
  4. "slices"
  5. "text/template"
  6. "github.com/zricethezav/gitleaks/v8/cmd/generate/config/base"
  7. "github.com/zricethezav/gitleaks/v8/cmd/generate/config/rules"
  8. "github.com/zricethezav/gitleaks/v8/config"
  9. "github.com/zricethezav/gitleaks/v8/logging"
  10. )
  11. const (
  12. templatePath = "rules/config.tmpl"
  13. )
  14. //go:generate go run $GOFILE ../../../config/gitleaks.toml
  15. func main() {
  16. if len(os.Args) < 2 {
  17. _, _ = os.Stderr.WriteString("Specify path to the gitleaks.toml config\n")
  18. os.Exit(2)
  19. }
  20. gitleaksConfigPath := os.Args[1]
  21. configRules := []*config.Rule{
  22. rules.OnePasswordSecretKey(),
  23. rules.OnePasswordServiceAccountToken(),
  24. rules.AdafruitAPIKey(),
  25. rules.AdobeClientID(),
  26. rules.AdobeClientSecret(),
  27. rules.AgeSecretKey(),
  28. rules.AirtableApiKey(),
  29. rules.AirtablePersonalAccessToken(),
  30. rules.AlgoliaApiKey(),
  31. rules.AlibabaAccessKey(),
  32. rules.AlibabaSecretKey(),
  33. rules.AmazonBedrockAPIKeyLongLived(),
  34. rules.AmazonBedrockAPIKeyShortLived(),
  35. rules.AnthropicAdminApiKey(),
  36. rules.AnthropicApiKey(),
  37. rules.ArtifactoryApiKey(),
  38. rules.ArtifactoryReferenceToken(),
  39. rules.AsanaClientID(),
  40. rules.AsanaClientSecret(),
  41. rules.Atlassian(),
  42. rules.Authress(),
  43. rules.AWS(),
  44. rules.AzureActiveDirectoryClientSecret(),
  45. rules.BitBucketClientID(),
  46. rules.BitBucketClientSecret(),
  47. rules.BittrexAccessKey(),
  48. rules.BittrexSecretKey(),
  49. rules.Beamer(),
  50. rules.CodecovAccessToken(),
  51. rules.CoinbaseAccessToken(),
  52. rules.ClickHouseCloud(),
  53. rules.Clojars(),
  54. rules.CloudflareAPIKey(),
  55. rules.CloudflareGlobalAPIKey(),
  56. rules.CloudflareOriginCAKey(),
  57. rules.CohereAPIToken(),
  58. rules.ConfluentAccessToken(),
  59. rules.ConfluentSecretKey(),
  60. rules.Contentful(),
  61. rules.CurlHeaderAuth(),
  62. rules.CurlBasicAuth(),
  63. rules.Databricks(),
  64. rules.DatadogtokenAccessToken(),
  65. rules.DefinedNetworkingAPIToken(),
  66. rules.DigitalOceanPAT(),
  67. rules.DigitalOceanOAuthToken(),
  68. rules.DigitalOceanRefreshToken(),
  69. rules.DiscordAPIToken(),
  70. rules.DiscordClientID(),
  71. rules.DiscordClientSecret(),
  72. rules.Doppler(),
  73. rules.DropBoxAPISecret(),
  74. rules.DropBoxLongLivedAPIToken(),
  75. rules.DropBoxShortLivedAPIToken(),
  76. rules.DroneciAccessToken(),
  77. rules.Duffel(),
  78. rules.Dynatrace(),
  79. rules.EasyPost(),
  80. rules.EasyPostTestAPI(),
  81. rules.EtsyAccessToken(),
  82. rules.FacebookSecret(),
  83. rules.FacebookAccessToken(),
  84. rules.FacebookPageAccessToken(),
  85. rules.FastlyAPIToken(),
  86. rules.FinicityClientSecret(),
  87. rules.FinicityAPIToken(),
  88. rules.FlickrAccessToken(),
  89. rules.FinnhubAccessToken(),
  90. rules.FlutterwavePublicKey(),
  91. rules.FlutterwaveSecretKey(),
  92. rules.FlutterwaveEncKey(),
  93. rules.FlyIOAccessToken(),
  94. rules.FrameIO(),
  95. rules.Freemius(),
  96. rules.FreshbooksAccessToken(),
  97. rules.GoCardless(),
  98. // TODO figure out what makes sense for GCP
  99. // rules.GCPServiceAccount(),
  100. rules.GCPAPIKey(),
  101. rules.GitHubPat(),
  102. rules.GitHubFineGrainedPat(),
  103. rules.GitHubOauth(),
  104. rules.GitHubApp(),
  105. rules.GitHubRefresh(),
  106. rules.GitlabCiCdJobToken(),
  107. rules.GitlabDeployToken(),
  108. rules.GitlabFeatureFlagClientToken(),
  109. rules.GitlabFeedToken(),
  110. rules.GitlabIncomingMailToken(),
  111. rules.GitlabKubernetesAgentToken(),
  112. rules.GitlabOauthAppSecret(),
  113. rules.GitlabPat(),
  114. rules.GitlabPatRoutable(),
  115. rules.GitlabPipelineTriggerToken(),
  116. rules.GitlabRunnerRegistrationToken(),
  117. rules.GitlabRunnerAuthenticationToken(),
  118. rules.GitlabRunnerAuthenticationTokenRoutable(),
  119. rules.GitlabScimToken(),
  120. rules.GitlabSessionCookie(),
  121. rules.GitterAccessToken(),
  122. rules.GrafanaApiKey(),
  123. rules.GrafanaCloudApiToken(),
  124. rules.GrafanaServiceAccountToken(),
  125. rules.HarnessApiKey(),
  126. rules.HashiCorpTerraform(),
  127. rules.HashicorpField(),
  128. rules.Heroku(),
  129. rules.HerokuV2(),
  130. rules.HubSpot(),
  131. rules.HuggingFaceAccessToken(),
  132. rules.HuggingFaceOrganizationApiToken(),
  133. rules.Intercom(),
  134. rules.Intra42ClientSecret(),
  135. rules.JFrogAPIKey(),
  136. rules.JFrogIdentityToken(),
  137. rules.JWT(),
  138. rules.JWTBase64(),
  139. rules.KrakenAccessToken(),
  140. rules.KubernetesSecret(),
  141. rules.KucoinAccessToken(),
  142. rules.KucoinSecretKey(),
  143. rules.LaunchDarklyAccessToken(),
  144. rules.LinearAPIToken(),
  145. rules.LinearClientSecret(),
  146. rules.LinkedinClientID(),
  147. rules.LinkedinClientSecret(),
  148. rules.LobAPIToken(),
  149. rules.LobPubAPIToken(),
  150. rules.LookerClientID(),
  151. rules.LookerClientSecret(),
  152. rules.MailChimp(),
  153. rules.MailGunPubAPIToken(),
  154. rules.MailGunPrivateAPIToken(),
  155. rules.MailGunSigningKey(),
  156. rules.MapBox(),
  157. rules.MattermostAccessToken(),
  158. rules.MaxMindLicenseKey(),
  159. rules.Meraki(),
  160. rules.MessageBirdAPIToken(),
  161. rules.MessageBirdClientID(),
  162. rules.NetlifyAccessToken(),
  163. rules.NewRelicUserID(),
  164. rules.NewRelicUserKey(),
  165. rules.NewRelicBrowserAPIKey(),
  166. rules.NewRelicInsertKey(),
  167. rules.Notion(),
  168. rules.NPM(),
  169. rules.NugetConfigPassword(),
  170. rules.NytimesAccessToken(),
  171. rules.OctopusDeployApiKey(),
  172. rules.OktaAccessToken(),
  173. rules.OpenAI(),
  174. rules.OpenshiftUserToken(),
  175. rules.PerplexityAPIKey(),
  176. rules.PlaidAccessID(),
  177. rules.PlaidSecretKey(),
  178. rules.PlaidAccessToken(),
  179. rules.PlanetScalePassword(),
  180. rules.PlanetScaleAPIToken(),
  181. rules.PlanetScaleOAuthToken(),
  182. rules.PostManAPI(),
  183. rules.Prefect(),
  184. rules.PrivateAIToken(),
  185. rules.PrivateKey(),
  186. rules.PrivateKeyPKCS12File(),
  187. rules.PulumiAPIToken(),
  188. rules.PyPiUploadToken(),
  189. rules.RapidAPIAccessToken(),
  190. rules.ReadMe(),
  191. rules.RubyGemsAPIToken(),
  192. rules.ScalingoAPIToken(),
  193. rules.SendbirdAccessID(),
  194. rules.SendbirdAccessToken(),
  195. rules.SendGridAPIToken(),
  196. rules.SendInBlueAPIToken(),
  197. rules.SentryAccessToken(),
  198. rules.SentryOrgToken(),
  199. rules.SentryUserToken(),
  200. rules.SettlemintApplicationAccessToken(),
  201. rules.SettlemintPersonalAccessToken(),
  202. rules.SettlemintServiceAccessToken(),
  203. rules.ShippoAPIToken(),
  204. rules.ShopifyAccessToken(),
  205. rules.ShopifyCustomAccessToken(),
  206. rules.ShopifyPrivateAppAccessToken(),
  207. rules.ShopifySharedSecret(),
  208. rules.SidekiqSecret(),
  209. rules.SidekiqSensitiveUrl(),
  210. rules.SlackBotToken(),
  211. rules.SlackUserToken(),
  212. rules.SlackAppLevelToken(),
  213. rules.SlackConfigurationToken(),
  214. rules.SlackConfigurationRefreshToken(),
  215. rules.SlackLegacyBotToken(),
  216. rules.SlackLegacyWorkspaceToken(),
  217. rules.SlackLegacyToken(),
  218. rules.SlackWebHookUrl(),
  219. rules.Snyk(),
  220. rules.Sonar(),
  221. rules.SourceGraph(),
  222. rules.StripeAccessToken(),
  223. rules.SquareAccessToken(),
  224. rules.SquareSpaceAccessToken(),
  225. rules.SumoLogicAccessID(),
  226. rules.SumoLogicAccessToken(),
  227. rules.TeamsWebhook(),
  228. rules.TelegramBotToken(),
  229. rules.TravisCIAccessToken(),
  230. rules.Twilio(),
  231. rules.TwitchAPIToken(),
  232. rules.TwitterAPIKey(),
  233. rules.TwitterAPISecret(),
  234. rules.TwitterAccessToken(),
  235. rules.TwitterAccessSecret(),
  236. rules.TwitterBearerToken(),
  237. rules.Typeform(),
  238. rules.VaultBatchToken(),
  239. rules.VaultServiceToken(),
  240. rules.YandexAPIKey(),
  241. rules.YandexAWSAccessToken(),
  242. rules.YandexAccessToken(),
  243. rules.ZendeskSecretKey(),
  244. rules.GenericCredential(),
  245. rules.InfracostAPIToken(),
  246. }
  247. // ensure rules have unique ids
  248. ruleLookUp := make(map[string]config.Rule, len(configRules))
  249. for _, rule := range configRules {
  250. if err := rule.Validate(); err != nil {
  251. logging.Fatal().Err(err).
  252. Str("rule-id", rule.RuleID).
  253. Msg("Failed to validate rule")
  254. }
  255. // check if rule is in ruleLookUp
  256. if _, ok := ruleLookUp[rule.RuleID]; ok {
  257. logging.Fatal().
  258. Str("rule-id", rule.RuleID).
  259. Msg("rule id is not unique")
  260. }
  261. // TODO: eventually change all the signatures to get ride of this
  262. // nasty dereferencing.
  263. ruleLookUp[rule.RuleID] = *rule
  264. // Slices are de-duplicated with a map, every iteration has a different order.
  265. // This is an awkward workaround.
  266. for _, allowlist := range rule.Allowlists {
  267. slices.Sort(allowlist.Commits)
  268. slices.Sort(allowlist.StopWords)
  269. }
  270. }
  271. tmpl, err := template.ParseFiles(templatePath)
  272. if err != nil {
  273. logging.Fatal().Err(err).Msg("Failed to parse template")
  274. }
  275. f, err := os.Create(gitleaksConfigPath)
  276. if err != nil {
  277. logging.Fatal().Err(err).Msg("Failed to create rules.toml")
  278. }
  279. defer f.Close()
  280. cfg := base.CreateGlobalConfig()
  281. cfg.Rules = ruleLookUp
  282. for _, allowlist := range cfg.Allowlists {
  283. slices.Sort(allowlist.Commits)
  284. slices.Sort(allowlist.StopWords)
  285. }
  286. if err = tmpl.Execute(f, cfg); err != nil {
  287. logging.Fatal().Err(err).Msg("could not execute template")
  288. }
  289. }