[{"data":1,"prerenderedAt":1957},["ShallowReactive",2],{"/blog/enhance-data-security-with-custom-pii-detection-rulesets":3,"navigation-en-us":1173,"banner-en-us":1601,"footer-en-us":1611,"blog-post-authors-en-us-Fernando Diaz":1855,"blog-related-posts-en-us-enhance-data-security-with-custom-pii-detection-rulesets":1870,"blog-promotions-en-us":1895,"next-steps-en-us":1947},{"id":4,"title":5,"authors":6,"body":8,"category":1151,"date":1152,"description":1153,"extension":1154,"externalUrl":1155,"faq":1155,"featured":135,"heroImage":1156,"meta":1157,"navigation":135,"path":1158,"seo":1159,"slug":1164,"stem":1165,"tags":1166,"template":1171,"updatedDate":1155,"__hash__":1172},"blogPosts/en-us/blog/enhance-data-security-with-custom-pii-detection-rulesets.md","Strengthen data security with custom PII detection rulesets",[7],"Fernando Diaz",{"type":9,"value":10,"toc":1137},"minimark",[11,15,20,29,34,63,67,70,79,84,92,175,180,187,486,491,502,510,515,518,565,568,573,580,688,691,741,750,757,760,766,769,778,782,785,814,818,827,831,857,863,871,877,905,908,941,954,958,1012,1015,1028,1032,1035,1065,1069,1072,1075,1078,1090,1094,1097,1133],[12,13,14],"p",{},"Protecting sensitive information is more critical than ever. GitLab's Secret Detection feature provides a powerful solution to identify and prevent the exposure of sensitive data. This tutorial explores how GitLab Secret Detection works, how to create custom rulesets for finding personally identifiable information, and how GitLab Duo Chat can streamline the creation of regex patterns for PII detection.",[16,17,19],"h2",{"id":18},"understanding-gitlab-secret-detection","Understanding GitLab Secret Detection",[12,21,22,28],{},[23,24,27],"a",{"href":25,"rel":26},"https://docs.gitlab.com/user/application_security/secret_detection/",[],"GitLab Secret Detection"," is a security scanning feature integrated into the GitLab CI/CD pipeline. It automatically scans your codebase to identify hardcoded secrets, credentials, and other sensitive information that shouldn't be stored in your repository.",[30,31,33],"h3",{"id":32},"key-benefits","Key benefits",[35,36,37,45,51,57],"ul",{},[38,39,40,44],"li",{},[41,42,43],"strong",{},"Data breach prevention"," detects secrets before they're committed to your repository.",[38,46,47,50],{},[41,48,49],{},"Automated scanning"," runs as part of your CI/CD pipeline without manual intervention.",[38,52,53,56],{},[41,54,55],{},"Customizable rules"," extend detection capabilities with custom patterns.",[38,58,59,62],{},[41,60,61],{},"Compliance support"," helps meet regulatory requirements like GDPR, HIPAA, and the California Privacy Protection Act.",[16,64,66],{"id":65},"create-custom-rulesets-for-pii-detection","Create custom rulesets for PII detection",[12,68,69],{},"While GitLab's default secret detection covers common secrets like API keys and passwords, you may need custom rules to identify specific types of PII relevant to your organization.",[12,71,72,73,78],{},"To get started, create a new GitLab project and follow the steps below. You can follow along and see usage examples in our ",[23,74,77],{"href":75,"rel":76},"https://gitlab.com/gitlab-da/tutorials/security-and-governance/devsecops/secret-scanning/pii-data-ruleset",[],"PII Demo Application",".",[12,80,81],{},[41,82,83],{},"Step 1: Set up Secret Detection",[12,85,86,87,91],{},"Ensure Secret Detection is enabled in your ",[88,89,90],"code",{},".gitlab-ci.yml"," file:",[93,94,99],"pre",{"className":95,"code":96,"language":97,"meta":98,"style":98},"language-yaml shiki shiki-themes github-light","include:\n  - template: Security/Secret-Detection.gitlab-ci.yml\n\nsecret_detection:\n  variables:\n    SECRET_DETECTION_EXCLUDED_PATHS: \"rules,.gitlab,README.md,LICENSE\"\n    SECRET_DETECTION_HISTORIC_SCAN: \"true\"\n\n","yaml","",[88,100,101,114,130,137,145,153,164],{"__ignoreMap":98},[102,103,106,110],"span",{"class":104,"line":105},"line",1,[102,107,109],{"class":108},"shJU0","include",[102,111,113],{"class":112},"sgsFI",":\n",[102,115,117,120,123,126],{"class":104,"line":116},2,[102,118,119],{"class":112},"  - ",[102,121,122],{"class":108},"template",[102,124,125],{"class":112},": ",[102,127,129],{"class":128},"sYBdl","Security/Secret-Detection.gitlab-ci.yml\n",[102,131,133],{"class":104,"line":132},3,[102,134,136],{"emptyLinePlaceholder":135},true,"\n",[102,138,140,143],{"class":104,"line":139},4,[102,141,142],{"class":108},"secret_detection",[102,144,113],{"class":112},[102,146,148,151],{"class":104,"line":147},5,[102,149,150],{"class":108},"  variables",[102,152,113],{"class":112},[102,154,156,159,161],{"class":104,"line":155},6,[102,157,158],{"class":108},"    SECRET_DETECTION_EXCLUDED_PATHS",[102,160,125],{"class":112},[102,162,163],{"class":128},"\"rules,.gitlab,README.md,LICENSE\"\n",[102,165,167,170,172],{"class":104,"line":166},7,[102,168,169],{"class":108},"    SECRET_DETECTION_HISTORIC_SCAN",[102,171,125],{"class":112},[102,173,174],{"class":128},"\"true\"\n",[12,176,177],{},[41,178,179],{},"Step 2: Create a custom ruleset file",[12,181,182,183,186],{},"Create the directory and file ",[88,184,185],{},"rules/pii-data-extenson.toml",", which contains the regex patterns for PII data along with an allowlist of patterns to ignore. Below are patterns to detect passport numbers (USA), phone numbers (USA), and email addresses:",[93,188,192],{"className":189,"code":190,"language":191,"meta":98,"style":98},"language-toml shiki shiki-themes github-light","[extend]\n# Extends default packaged ruleset, NOTE: do not change the path.\npath = \"/gitleaks.toml\"\n\n# Patterns to ignore (used for tests)\n[allowlist]\ndescription = \"allowlist of patterns and paths to ignore in detection\"\nregexTarget = \"match\"\nregexes = ['''555-555-5555''', '''user@example.com''']\npaths = ['''(.*?)(jpg|gif|doc|pdf|bin|svg|socket)''']\n\n# US Passport Number (USA)\n[[rules]]\nid = \"us_passport_detection\"\ntitle = \"US Passport Number\"\ndescription = \"Detects US passport numbers\"\nregex = '''\\b[A-Z]{1,2}[0-9]{6,9}\\b'''\nkeywords = [\"passport\"]\n\n# Phone Number (USA)\n[[rules]]\nid = \"us_phone_number_detection_basic\"\ntitle = \"US Phone Number\"\ndescription = \"Detects US phone numbers in basic format\"\nregex = '''\\b\\d{3}-\\d{3}-\\d{4}\\b'''\nkeywords = [\"phone\", \"mobile\"]\n\n# Email Address\n[[rules]]\nid = \"email_address\"\ntitle = \"Email Address\"\ndescription = \"Detects email addresses\"\nregex = '''[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'''\nkeywords = [\"email\", \"e-mail\"]\n","toml",[88,193,194,206,212,220,224,229,238,246,255,272,283,288,294,306,315,324,332,341,352,357,363,372,380,388,396,404,419,424,430,439,447,455,463,471],{"__ignoreMap":98},[102,195,196,199,203],{"class":104,"line":105},[102,197,198],{"class":112},"[",[102,200,202],{"class":201},"s7eDp","extend",[102,204,205],{"class":112},"]\n",[102,207,208],{"class":104,"line":116},[102,209,211],{"class":210},"sAwPA","# Extends default packaged ruleset, NOTE: do not change the path.\n",[102,213,214,217],{"class":104,"line":132},[102,215,216],{"class":112},"path = ",[102,218,219],{"class":128},"\"/gitleaks.toml\"\n",[102,221,222],{"class":104,"line":139},[102,223,136],{"emptyLinePlaceholder":135},[102,225,226],{"class":104,"line":147},[102,227,228],{"class":210},"# Patterns to ignore (used for tests)\n",[102,230,231,233,236],{"class":104,"line":155},[102,232,198],{"class":112},[102,234,235],{"class":201},"allowlist",[102,237,205],{"class":112},[102,239,240,243],{"class":104,"line":166},[102,241,242],{"class":112},"description = ",[102,244,245],{"class":128},"\"allowlist of patterns and paths to ignore in detection\"\n",[102,247,249,252],{"class":104,"line":248},8,[102,250,251],{"class":112},"regexTarget = ",[102,253,254],{"class":128},"\"match\"\n",[102,256,258,261,264,267,270],{"class":104,"line":257},9,[102,259,260],{"class":112},"regexes = [",[102,262,263],{"class":128},"'''555-555-5555'''",[102,265,266],{"class":112},", ",[102,268,269],{"class":128},"'''user@example.com'''",[102,271,205],{"class":112},[102,273,275,278,281],{"class":104,"line":274},10,[102,276,277],{"class":112},"paths = [",[102,279,280],{"class":128},"'''(.*?)(jpg|gif|doc|pdf|bin|svg|socket)'''",[102,282,205],{"class":112},[102,284,286],{"class":104,"line":285},11,[102,287,136],{"emptyLinePlaceholder":135},[102,289,291],{"class":104,"line":290},12,[102,292,293],{"class":210},"# US Passport Number (USA)\n",[102,295,297,300,303],{"class":104,"line":296},13,[102,298,299],{"class":112},"[[",[102,301,302],{"class":201},"rules",[102,304,305],{"class":112},"]]\n",[102,307,309,312],{"class":104,"line":308},14,[102,310,311],{"class":112},"id = ",[102,313,314],{"class":128},"\"us_passport_detection\"\n",[102,316,318,321],{"class":104,"line":317},15,[102,319,320],{"class":112},"title = ",[102,322,323],{"class":128},"\"US Passport Number\"\n",[102,325,327,329],{"class":104,"line":326},16,[102,328,242],{"class":112},[102,330,331],{"class":128},"\"Detects US passport numbers\"\n",[102,333,335,338],{"class":104,"line":334},17,[102,336,337],{"class":112},"regex = ",[102,339,340],{"class":128},"'''\\b[A-Z]{1,2}[0-9]{6,9}\\b'''\n",[102,342,344,347,350],{"class":104,"line":343},18,[102,345,346],{"class":112},"keywords = [",[102,348,349],{"class":128},"\"passport\"",[102,351,205],{"class":112},[102,353,355],{"class":104,"line":354},19,[102,356,136],{"emptyLinePlaceholder":135},[102,358,360],{"class":104,"line":359},20,[102,361,362],{"class":210},"# Phone Number (USA)\n",[102,364,366,368,370],{"class":104,"line":365},21,[102,367,299],{"class":112},[102,369,302],{"class":201},[102,371,305],{"class":112},[102,373,375,377],{"class":104,"line":374},22,[102,376,311],{"class":112},[102,378,379],{"class":128},"\"us_phone_number_detection_basic\"\n",[102,381,383,385],{"class":104,"line":382},23,[102,384,320],{"class":112},[102,386,387],{"class":128},"\"US Phone Number\"\n",[102,389,391,393],{"class":104,"line":390},24,[102,392,242],{"class":112},[102,394,395],{"class":128},"\"Detects US phone numbers in basic format\"\n",[102,397,399,401],{"class":104,"line":398},25,[102,400,337],{"class":112},[102,402,403],{"class":128},"'''\\b\\d{3}-\\d{3}-\\d{4}\\b'''\n",[102,405,407,409,412,414,417],{"class":104,"line":406},26,[102,408,346],{"class":112},[102,410,411],{"class":128},"\"phone\"",[102,413,266],{"class":112},[102,415,416],{"class":128},"\"mobile\"",[102,418,205],{"class":112},[102,420,422],{"class":104,"line":421},27,[102,423,136],{"emptyLinePlaceholder":135},[102,425,427],{"class":104,"line":426},28,[102,428,429],{"class":210},"# Email Address\n",[102,431,433,435,437],{"class":104,"line":432},29,[102,434,299],{"class":112},[102,436,302],{"class":201},[102,438,305],{"class":112},[102,440,442,444],{"class":104,"line":441},30,[102,443,311],{"class":112},[102,445,446],{"class":128},"\"email_address\"\n",[102,448,450,452],{"class":104,"line":449},31,[102,451,320],{"class":112},[102,453,454],{"class":128},"\"Email Address\"\n",[102,456,458,460],{"class":104,"line":457},32,[102,459,242],{"class":112},[102,461,462],{"class":128},"\"Detects email addresses\"\n",[102,464,466,468],{"class":104,"line":465},33,[102,467,337],{"class":112},[102,469,470],{"class":128},"'''[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'''\n",[102,472,474,476,479,481,484],{"class":104,"line":473},34,[102,475,346],{"class":112},[102,477,478],{"class":128},"\"email\"",[102,480,266],{"class":112},[102,482,483],{"class":128},"\"e-mail\"",[102,485,205],{"class":112},[12,487,488],{},[41,489,490],{},"Step 3: Extend Secret Detection with the custom ruleset file",[12,492,493,494,497,498,501],{},"Create a directory and file ",[88,495,496],{},".gitlab/secret-detection-ruleset.toml"," in the root of your repository. This file allows you to extend the standard configuration with the PII rules file, and overwrite the severity of the detected vulnerabilities (default severity is ",[88,499,500],{},"Critical",").",[93,503,508],{"className":504,"code":506,"language":507,"meta":98},[505],"language-text","# Define the pii rules to add to default configuration\n[[secrets.passthrough]]\ntype = \"file\"\ntarget = \"gitleaks.toml\"\nvalue = \"rules/pii-data-extension.toml\"\n\n# Overwrite Phone Number (USA) PII Severity\n[[secrets.ruleset]]\n[secrets.ruleset.identifier]\ntype = \"gitleaks_rule_id\"\nvalue = \"us_phone_number_detection_basic\"\n[secrets.ruleset.override]\nseverity = \"Medium\"\n\n# Overwrite Email Address PII Severity\n[[secrets.ruleset]]\n[secrets.ruleset.identifier]\ntype = \"gitleaks_rule_id\"\nvalue = \"email_address\"\n[secrets.ruleset.override]\nseverity = \"Low\"\n","text",[88,509,506],{"__ignoreMap":98},[12,511,512],{},[41,513,514],{},"Step 4: Commit your changes",[12,516,517],{},"Now add the changes in the above steps to your project.",[93,519,523],{"className":520,"code":521,"language":522,"meta":98,"style":98},"language-shell shiki shiki-themes github-light","cd /path/to/your/project\ngit add .\ngit commit -m \"Add PII data ruleset and Secret Scanning\"\ngit push\n","shell",[88,524,525,534,545,558],{"__ignoreMap":98},[102,526,527,531],{"class":104,"line":105},[102,528,530],{"class":529},"sYu0t","cd",[102,532,533],{"class":128}," /path/to/your/project\n",[102,535,536,539,542],{"class":104,"line":116},[102,537,538],{"class":201},"git",[102,540,541],{"class":128}," add",[102,543,544],{"class":128}," .\n",[102,546,547,549,552,555],{"class":104,"line":132},[102,548,538],{"class":201},[102,550,551],{"class":128}," commit",[102,553,554],{"class":529}," -m",[102,556,557],{"class":128}," \"Add PII data ruleset and Secret Scanning\"\n",[102,559,560,562],{"class":104,"line":139},[102,561,538],{"class":201},[102,563,564],{"class":128}," push\n",[12,566,567],{},"Once the code is committed, Secret Detection will run within the default branch.",[12,569,570],{},[41,571,572],{},"Step 5: Test detection of PII data",[12,574,575,576,579],{},"Now that we have configured the Secret Detection scanner, we should perform a test to see if the scanner is detecting the new custom patterns. This can be done by creating a merge request, which adds a new file named ",[88,577,578],{},"customer-data.yaml"," with the following:",[93,581,583],{"className":95,"code":582,"language":97,"meta":98,"style":98},"customers:\n  test_user:\n    phone_number: 555-555-555\n    email: user@example.com\n  justin_case:\n    phone_number: 512-123-4567\n    passport_number: A12345678\n    email: justin_case@example.com\n  chris_p_bacon:\n    phone_number: 305-123-4567\n    passport_number: B09876543\n    email: chris_p_bacon@example.com\n\n",[88,584,585,592,599,609,619,626,635,645,654,661,670,679],{"__ignoreMap":98},[102,586,587,590],{"class":104,"line":105},[102,588,589],{"class":108},"customers",[102,591,113],{"class":112},[102,593,594,597],{"class":104,"line":116},[102,595,596],{"class":108},"  test_user",[102,598,113],{"class":112},[102,600,601,604,606],{"class":104,"line":132},[102,602,603],{"class":108},"    phone_number",[102,605,125],{"class":112},[102,607,608],{"class":128},"555-555-555\n",[102,610,611,614,616],{"class":104,"line":139},[102,612,613],{"class":108},"    email",[102,615,125],{"class":112},[102,617,618],{"class":128},"user@example.com\n",[102,620,621,624],{"class":104,"line":147},[102,622,623],{"class":108},"  justin_case",[102,625,113],{"class":112},[102,627,628,630,632],{"class":104,"line":155},[102,629,603],{"class":108},[102,631,125],{"class":112},[102,633,634],{"class":128},"512-123-4567\n",[102,636,637,640,642],{"class":104,"line":166},[102,638,639],{"class":108},"    passport_number",[102,641,125],{"class":112},[102,643,644],{"class":128},"A12345678\n",[102,646,647,649,651],{"class":104,"line":248},[102,648,613],{"class":108},[102,650,125],{"class":112},[102,652,653],{"class":128},"justin_case@example.com\n",[102,655,656,659],{"class":104,"line":257},[102,657,658],{"class":108},"  chris_p_bacon",[102,660,113],{"class":112},[102,662,663,665,667],{"class":104,"line":274},[102,664,603],{"class":108},[102,666,125],{"class":112},[102,668,669],{"class":128},"305-123-4567\n",[102,671,672,674,676],{"class":104,"line":285},[102,673,639],{"class":108},[102,675,125],{"class":112},[102,677,678],{"class":128},"B09876543\n",[102,680,681,683,685],{"class":104,"line":290},[102,682,613],{"class":108},[102,684,125],{"class":112},[102,686,687],{"class":128},"chris_p_bacon@example.com\n",[12,689,690],{},"The scanner should now perform the following:",[35,692,693,708],{},[38,694,695,696,699,700,703,704,707],{},"Ignore the ",[88,697,698],{},"phone_number"," and ",[88,701,702],{},"email"," of ",[88,705,706],{},"test_user"," due to patterns being in allowlist",[38,709,710,711,699,714,717],{},"Detect six potential vulnerabilities due to the information present for both ",[88,712,713],{},"justin_case",[88,715,716],{},"chris_p_bacon",[35,718,719,725,732,738],{},[38,720,721,722,724],{},"U.S. passport number severity is set to ",[88,723,500],{}," (default)",[38,726,727,728,731],{},"U.S. phone number severity is set to ",[88,729,730],{},"Medium"," (override)",[38,733,734,735,731],{},"Email address severity is set to ",[88,736,737],{},"Low",[38,739,740],{},"Data from rules override is added to each vulnerability",[12,742,743,744,749],{},"Once the ",[23,745,748],{"href":746,"rel":747},"https://gitlab.com/gitlab-da/tutorials/security-and-governance/devsecops/secret-scanning/pii-data-ruleset/-/merge_requests/4",[],"merge request"," is submitted, the Secret Detection scanner runs and provides the following results:",[12,751,752],{},[753,754],"img",{"alt":755,"src":756},"Secret Detection finding custom PII data MR","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097709/Blog/Content%20Images/Blog/Content%20Images/pii_vulns_aHR0cHM6_1750097709683.png",[12,758,759],{},"When clicking on a vulnerability, you are presented with detailed vulnerability data based on what was configured in your newly set up rules:",[12,761,762],{},[753,763],{"alt":764,"src":765},"Expanded custom PII data vulnerability","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097710/Blog/Content%20Images/Blog/Content%20Images/pii_vulns_expanded_aHR0cHM6_1750097709684.png",[12,767,768],{},"This data allows you to determine the validity of the data present and address it accordingly.",[12,770,771,772,777],{},"There are additional ways to configure custom rulesets. For example, rules can be applied remotely to several projects, avoiding the need to duplicate the rules file. See the ",[23,773,776],{"href":774,"rel":775},"https://docs.gitlab.com/user/application_security/secret_detection/pipeline/configure/",[],"Secret Detection Configuration documentation"," for more information.",[16,779,781],{"id":780},"common-pii-types-to-consider","Common PII types to consider",[12,783,784],{},"When building your custom ruleset, consider including patterns for:",[35,786,787,790,793,796,799,802,805,808,811],{},[38,788,789],{},"Social Security Numbers",[38,791,792],{},"Credit card numbers",[38,794,795],{},"Driver's license numbers",[38,797,798],{},"Passport numbers",[38,800,801],{},"Email addresses",[38,803,804],{},"Phone numbers",[38,806,807],{},"IP addresses",[38,809,810],{},"Physical addresses",[38,812,813],{},"Medical record numbers",[16,815,817],{"id":816},"leveraging-gitlab-duo-chat-for-pattern-creation","Leveraging GitLab Duo Chat for pattern creation",[12,819,820,821,826],{},"Creating effective regex patterns can be challenging. This is where ",[23,822,825],{"href":823,"rel":824},"https://docs.gitlab.com/user/gitlab_duo_chat/",[],"GitLab Duo Chat"," comes in handy. GitLab Duo Chat is an AI-powered assistant that accelerates development with contextual, conversational AI. Chat is available to any user with an assigned GitLab Duo seat.",[30,828,830],{"id":829},"using-gitlab-duo-chat-to-generate-pii-regex-patterns","Using GitLab Duo Chat to generate PII regex patterns",[832,833,834,843],"ol",{},[38,835,836,839,840,842],{},[41,837,838],{},"Access GitLab Duo Chat:"," In the upper right corner, select ",[41,841,825],{},". A drawer opens on the right side of your screen.",[38,844,845,848,849,852,853,856],{},[41,846,847],{},"Prompt the chat:"," Enter a prompt in the chat input box and press ",[41,850,851],{},"Enter"," or select ",[41,854,855],{},"Send",":",[93,858,861],{"className":859,"code":860,"language":507,"meta":98},[505],"I need a regex pattern to detect Canadian Zip Codes in our codebase for secret detection\n",[88,862,860],{"__ignoreMap":98},[832,864,865],{"start":132},[38,866,867,870],{},[41,868,869],{},"Review and refine:"," GitLab Duo Chat will suggest a regex pattern that you can review and refine:",[93,872,875],{"className":873,"code":874,"language":507,"meta":98},[505],"Canadian postal codes follow the format \"A1A 1A1\" (where A is a letter and 1 is a digit). Here's a regex pattern that will detect Canadian postal codes in your codebase, accounting for both spaced and non-spaced formats:\n[A-Za-z]\\d[A-Za-z][ -]?\\d[A-Za-z]\\d\nThis pattern matches:\n* A letter, followed by a digit, followed by a letter\n* An optional space or hyphen\n* A digit, followed by a letter, followed by a digit\nIf you need a more strict pattern that only matches uppercase letters (as official Canadian postal codes use), you can use:\n[A-Z]\\d[A-Z][ -]?\\d[A-Z]\\d\nFor implementation in a secret detection tool, you might want to add word boundaries to avoid partial matches:\n\\b[A-Z]\\d[A-Z][ -]?\\d[A-Z]\\d\\b\nWould you like more details about implementing this in a specific secret detection system?\n",[88,876,874],{"__ignoreMap":98},[832,878,879,890],{"start":139},[38,880,881,884,885,889],{},[41,882,883],{},"Test the pattern:"," Test the pattern against sample data to ensure it works correctly. You can use sites like ",[23,886,887],{"href":887,"rel":888},"https://regex101.com/",[]," to validate patterns before you submit them to your ruleset.",[38,891,892,895,896,899,900,904],{},[41,893,894],{},"Add to your ruleset:"," Once satisfied, add the pattern to your ",[88,897,898],{},"rules/pii-data-extension.toml"," file and perform some tests to validate. This sample ",[23,901,748],{"href":902,"rel":903},"https://gitlab.com/gitlab-da/tutorials/security-and-governance/devsecops/secret-scanning/pii-data-ruleset/-/merge_requests/5/diffs",[]," contains a newly added rule for Canadian Zip Codes based on the above.",[12,906,907],{},"Additionally, you can use GitLab Duo Chat in:",[35,909,910,917,925,933],{},[38,911,912],{},[23,913,916],{"href":914,"rel":915},"https://docs.gitlab.com/user/project/web_ide/",[],"The GitLab Web IDE (VS Code in the cloud)",[38,918,919,920],{},"VS Code, with the ",[23,921,924],{"href":922,"rel":923},"https://marketplace.visualstudio.com/items?itemName=GitLab.gitlab-workflow",[],"GitLab Workflow extension for VS Code",[38,926,927,928],{},"JetBrains IDEs, with the ",[23,929,932],{"href":930,"rel":931},"https://plugins.jetbrains.com/plugin/22325-gitlab-duo",[],"GitLab Duo Plugin for JetBrains",[38,934,935,936],{},"Visual Studio for Windows, with the ",[23,937,940],{"href":938,"rel":939},"https://marketplace.visualstudio.com/items?itemName=GitLab.GitLabExtensionForVisualStudio",[],"GitLab Extension for Visual Studio",[12,942,943,944,949,950,78],{},"In the future, you’ll be able to leverage ",[23,945,948],{"href":946,"rel":947},"https://docs.gitlab.com/user/duo_agent_platform/",[],"GitLab Duo Workflow"," (currently in private beta) to automatically generate and add these patterns to your code base directly from your IDE. GitLab Duo Workflow is an AI agent, which transforms AI from reactive assistant to autonomous contributor, optimizing your software development lifecycle. Learn more about ",[23,951,948],{"href":952,"rel":953},"https://about.gitlab.com/blog/meet-gitlab-duo-workflow-the-future-of-ai-driven-development/",[],[16,955,957],{"id":956},"best-practices-for-pii-detection","Best practices for PII detection",[832,959,960,966,972,978,984,990,1001],{},[38,961,962,965],{},[41,963,964],{},"Start small:"," Begin with a few critical PII types and expand gradually.",[38,967,968,971],{},[41,969,970],{},"Test thoroughly:"," Test your patterns against sample data to avoid false positives.",[38,973,974,977],{},[41,975,976],{},"Update regularly:"," Review and update your rulesets as new PII requirements emerge.",[38,979,980,983],{},[41,981,982],{},"Document patterns:"," Maintain documentation for your custom regex patterns.",[38,985,986,989],{},[41,987,988],{},"Balance precision:"," Make patterns specific enough to avoid false positives but flexible enough to catch variations.",[38,991,992,1000],{},[41,993,994,995,856],{},"Implement ",[23,996,999],{"href":997,"rel":998},"https://about.gitlab.com/blog/prevent-secret-leaks-in-source-code-with-gitlab-secret-push-protection/",[],"Secret Push Protection"," Prevent PII data from making it into your repository.",[38,1002,1003,1011],{},[41,1004,1005,1006,856],{},"Set up ",[23,1007,1010],{"href":1008,"rel":1009},"https://docs.gitlab.com/user/application_security/policies/merge_request_approval_policies/",[],"Merge Request Approval Policies"," Require approval before merging any possible PII data to your repository.",[12,1013,1014],{},"Once you have set up a PII data ruleset to meet your organization's needs, remote rulesets can scan for PII data across multiple repositories without the need to duplicate the rules file. Watch this video to learn more:",[1016,1017,1020,1021],"figure",{"className":1018},[1019],"video_container","\n  ",[1022,1023,1027],"iframe",{"src":1024,"frameBorder":1025,"allowFullScreen":1026},"https://www.youtube.com/embed/vjJxQz918WE?si=CRdIEodo3ALxVWXO","0","true"," ",[16,1029,1031],{"id":1030},"handling-secret-detection-findings","Handling Secret Detection findings",[12,1033,1034],{},"When GitLab Secret Detection identifies potential PII in your code:",[832,1036,1037,1043,1049,1059],{},[38,1038,1039,1042],{},[41,1040,1041],{},"Review the finding:"," Assess whether it's a legitimate finding or a false positive.",[38,1044,1045,1048],{},[41,1046,1047],{},"Remediate:"," Remove the sensitive data and replace it with environment variables or secrets management.",[38,1050,1051,1058],{},[41,1052,1053,856],{},[23,1054,1057],{"href":1055,"rel":1056},"https://docs.gitlab.com/user/project/merge_requests/revert_changes/#redact-text-from-repository",[],"Redact text from repository"," Permanently delete sensitive or confidential information that was accidentally committed, ensuring it's no longer accessible in your repository's history.",[38,1060,1061,1064],{},[41,1062,1063],{},"Track progress:"," Use GitLab's security dashboard to monitor ongoing compliance.",[16,1066,1068],{"id":1067},"get-started-today","Get started today",[12,1070,1071],{},"GitLab Secret Detection, combined with custom PII rulesets, provides a powerful defense against inadvertent exposure of sensitive information. By leveraging GitLab Duo Chat to create precise regex patterns, teams can efficiently implement comprehensive PII detection across their codebase, ensuring regulatory compliance and protecting user data.",[12,1073,1074],{},"Remember that secret detection is just one component of a comprehensive security strategy. Combine it with other GitLab security features like static application security testing, dynamic application security testing, and dependency scanning for a more robust security posture.",[12,1076,1077],{},"Start implementing these practices today to better protect your users' personal information and maintain the security integrity of your applications.",[1079,1080,1081],"blockquote",{},[12,1082,1083,1084,1089],{},"Start ",[23,1085,1088],{"href":1086,"rel":1087},"https://about.gitlab.com/free-trial/",[],"a free trial of GitLab Ultimate and GitLab Duo ","today!",[16,1091,1093],{"id":1092},"more-resources","More resources",[12,1095,1096],{},"To learn more about GitLab security and compliance and how we can help enhance your AppSec workflows, follow the links below:",[35,1098,1099,1106,1113,1120,1127],{},[38,1100,1101],{},[23,1102,1105],{"href":1103,"rel":1104},"https://about.gitlab.com/solutions/application-security-testing/",[],"GitLab Security and Compliance Solutions",[38,1107,1108],{},[23,1109,1112],{"href":1110,"rel":1111},"https://about.gitlab.com/platform/",[],"GitLab DevSecOps Platform",[38,1114,1115],{},[23,1116,1119],{"href":1117,"rel":1118},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"GitLab Duo (AI)",[38,1121,1122],{},[23,1123,1126],{"href":1124,"rel":1125},"https://docs.gitlab.com/user/application_security/",[],"GitLab Application Security documentation",[38,1128,1129],{},[23,1130,1132],{"href":25,"rel":1131},[],"Secret Detection documentation",[1134,1135,1136],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":98,"searchDepth":116,"depth":116,"links":1138},[1139,1142,1143,1144,1147,1148,1149,1150],{"id":18,"depth":116,"text":19,"children":1140},[1141],{"id":32,"depth":132,"text":33},{"id":65,"depth":116,"text":66},{"id":780,"depth":116,"text":781},{"id":816,"depth":116,"text":817,"children":1145},[1146],{"id":829,"depth":132,"text":830},{"id":956,"depth":116,"text":957},{"id":1030,"depth":116,"text":1031},{"id":1067,"depth":116,"text":1068},{"id":1092,"depth":116,"text":1093},"security","2025-04-01","This tutorial explains how GitLab's customizable Secret Detection rulesets enhance data security by identifying PII patterns in code repositories. Learn how AI can help.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097701/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%285%29_1iy516k40hwBDChKcUJ2zb_1750097700983.png",{},"/en-us/blog/enhance-data-security-with-custom-pii-detection-rulesets",{"title":5,"description":1153,"ogTitle":5,"ogDescription":1153,"noIndex":1160,"ogImage":1156,"ogUrl":1161,"ogSiteName":1162,"ogType":1163,"canonicalUrls":1161},false,"https://about.gitlab.com/blog/enhance-data-security-with-custom-pii-detection-rulesets","https://about.gitlab.com","article","enhance-data-security-with-custom-pii-detection-rulesets","en-us/blog/enhance-data-security-with-custom-pii-detection-rulesets",[1151,1167,1168,1169,1170],"product","tutorial","DevSecOps platform","AI","BlogPost","8dToFxWJ4cH5HnuCAZHRb6yuz45c94Hf-9k7LtUeNns",{"logo":1174,"freeTrial":1179,"sales":1184,"login":1189,"items":1194,"search":1521,"minimal":1552,"duo":1571,"switchNav":1580,"pricingDeployment":1591},{"config":1175},{"href":1176,"dataGaName":1177,"dataGaLocation":1178},"/","gitlab logo","header",{"text":1180,"config":1181},"Get free trial",{"href":1182,"dataGaName":1183,"dataGaLocation":1178},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1185,"config":1186},"Request a demo",{"href":1187,"dataGaName":1188,"dataGaLocation":1178},"/sales/?contact-topic=request-demo","sales",{"text":1190,"config":1191},"Sign in",{"href":1192,"dataGaName":1193,"dataGaLocation":1178},"https://gitlab.com/users/sign_in/","sign in",[1195,1224,1324,1329,1443,1499],{"text":1196,"config":1197,"menu":1199},"Platform",{"dataNavLevelOne":1198},"platform",{"type":1200,"columns":1201},"cards",[1202,1208,1216],{"title":1196,"description":1203,"link":1204},"The intelligent orchestration platform for DevSecOps",{"text":1205,"config":1206},"Explore our Platform",{"href":1207,"dataGaName":1198,"dataGaLocation":1178},"/platform/",{"title":1209,"description":1210,"link":1211},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1212,"config":1213},"Meet GitLab Duo",{"href":1214,"dataGaName":1215,"dataGaLocation":1178},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1217,"description":1218,"link":1219},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1220,"config":1221},"Learn more",{"href":1222,"dataGaName":1223,"dataGaLocation":1178},"/why-gitlab/","why gitlab",{"text":1225,"left":135,"config":1226,"menu":1228},"Product",{"dataNavLevelOne":1227},"solutions",{"type":1229,"link":1230,"columns":1234,"feature":1303},"lists",{"text":1231,"config":1232},"View all Solutions",{"href":1233,"dataGaName":1227,"dataGaLocation":1178},"/solutions/",[1235,1259,1282],{"title":1236,"description":1237,"link":1238,"items":1243},"Automation","CI/CD and automation to accelerate deployment",{"config":1239},{"icon":1240,"href":1241,"dataGaName":1242,"dataGaLocation":1178},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1244,1248,1251,1255],{"text":1245,"config":1246},"CI/CD",{"href":1247,"dataGaLocation":1178,"dataGaName":1245},"/solutions/continuous-integration/",{"text":1209,"config":1249},{"href":1214,"dataGaLocation":1178,"dataGaName":1250},"gitlab duo agent platform - product menu",{"text":1252,"config":1253},"Source Code Management",{"href":1254,"dataGaLocation":1178,"dataGaName":1252},"/solutions/source-code-management/",{"text":1256,"config":1257},"Automated Software Delivery",{"href":1241,"dataGaLocation":1178,"dataGaName":1258},"Automated software delivery",{"title":1260,"description":1261,"link":1262,"items":1267},"Security","Deliver code faster without compromising security",{"config":1263},{"href":1264,"dataGaName":1265,"dataGaLocation":1178,"icon":1266},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1268,1272,1277],{"text":1269,"config":1270},"Application Security Testing",{"href":1264,"dataGaName":1271,"dataGaLocation":1178},"Application security testing",{"text":1273,"config":1274},"Software Supply Chain Security",{"href":1275,"dataGaLocation":1178,"dataGaName":1276},"/solutions/supply-chain/","Software supply chain security",{"text":1278,"config":1279},"Software Compliance",{"href":1280,"dataGaName":1281,"dataGaLocation":1178},"/solutions/software-compliance/","software compliance",{"title":1283,"link":1284,"items":1289},"Measurement",{"config":1285},{"icon":1286,"href":1287,"dataGaName":1288,"dataGaLocation":1178},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1290,1294,1298],{"text":1291,"config":1292},"Visibility & Measurement",{"href":1287,"dataGaLocation":1178,"dataGaName":1293},"Visibility and Measurement",{"text":1295,"config":1296},"Value Stream Management",{"href":1297,"dataGaLocation":1178,"dataGaName":1295},"/solutions/value-stream-management/",{"text":1299,"config":1300},"Analytics & Insights",{"href":1301,"dataGaLocation":1178,"dataGaName":1302},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1304,"type":1229,"items":1305},"GitLab for",[1306,1312,1318],{"text":1307,"config":1308},"Enterprise",{"icon":1309,"href":1310,"dataGaLocation":1178,"dataGaName":1311},"Building","/enterprise/","enterprise",{"text":1313,"config":1314},"Small Business",{"icon":1315,"href":1316,"dataGaLocation":1178,"dataGaName":1317},"Work","/small-business/","small business",{"text":1319,"config":1320},"Public Sector",{"icon":1321,"href":1322,"dataGaLocation":1178,"dataGaName":1323},"Organization","/solutions/public-sector/","public sector",{"text":1325,"config":1326},"Pricing",{"href":1327,"dataGaName":1328,"dataGaLocation":1178,"dataNavLevelOne":1328},"/pricing/","pricing",{"text":1330,"config":1331,"menu":1333},"Resources",{"dataNavLevelOne":1332},"resources",{"type":1229,"link":1334,"columns":1338,"feature":1432},{"text":1335,"config":1336},"View all resources",{"href":1337,"dataGaName":1332,"dataGaLocation":1178},"/resources/",[1339,1372,1399],{"title":1340,"items":1341},"Getting started",[1342,1347,1352,1357,1362,1367],{"text":1343,"config":1344},"Install",{"href":1345,"dataGaName":1346,"dataGaLocation":1178},"/install/","install",{"text":1348,"config":1349},"Quick start guides",{"href":1350,"dataGaName":1351,"dataGaLocation":1178},"/get-started/","quick setup checklists",{"text":1353,"config":1354},"Learn",{"href":1355,"dataGaLocation":1178,"dataGaName":1356},"https://university.gitlab.com/","learn",{"text":1358,"config":1359},"Product documentation",{"href":1360,"dataGaName":1361,"dataGaLocation":1178},"https://docs.gitlab.com/","product documentation",{"text":1363,"config":1364},"Best practice videos",{"href":1365,"dataGaName":1366,"dataGaLocation":1178},"/getting-started-videos/","best practice videos",{"text":1368,"config":1369},"Integrations",{"href":1370,"dataGaName":1371,"dataGaLocation":1178},"/integrations/","integrations",{"title":1373,"items":1374},"Discover",[1375,1380,1385,1390,1394],{"text":1376,"config":1377},"Customer success stories",{"href":1378,"dataGaName":1379,"dataGaLocation":1178},"/customers/","customer success stories",{"text":1381,"config":1382},"Blog",{"href":1383,"dataGaName":1384,"dataGaLocation":1178},"/blog/","blog",{"text":1386,"config":1387},"Demo Hub",{"href":1388,"dataGaName":1389,"dataGaLocation":1178},"/demo-hub/","demo hub",{"text":1391,"config":1392},"The Source",{"href":1393,"dataGaName":1384,"dataGaLocation":1178},"/the-source/",{"text":1395,"config":1396},"Remote",{"href":1397,"dataGaName":1398,"dataGaLocation":1178},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1400,"items":1401},"Connect",[1402,1407,1412,1417,1422,1427],{"text":1403,"config":1404},"GitLab Services",{"href":1405,"dataGaName":1406,"dataGaLocation":1178},"/services/","services",{"text":1408,"config":1409},"Contribute",{"href":1410,"dataGaName":1411,"dataGaLocation":1178},"https://contributors.gitlab.com","contribute",{"text":1413,"config":1414},"Community",{"href":1415,"dataGaName":1416,"dataGaLocation":1178},"/community/","community",{"text":1418,"config":1419},"Forum",{"href":1420,"dataGaName":1421,"dataGaLocation":1178},"https://forum.gitlab.com/","forum",{"text":1423,"config":1424},"Events",{"href":1425,"dataGaName":1426,"dataGaLocation":1178},"/events/","events",{"text":1428,"config":1429},"Partners",{"href":1430,"dataGaName":1431,"dataGaLocation":1178},"/partners/","partners",{"config":1433,"title":1436,"text":1437,"link":1438},{"background":1434,"textColor":1435},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":1439,"config":1440},"Read the latest",{"href":1441,"dataGaName":1442,"dataGaLocation":1178},"/whats-new/","whats new",{"text":1444,"config":1445,"menu":1447},"Company",{"dataNavLevelOne":1446},"company",{"type":1229,"columns":1448},[1449],{"items":1450},[1451,1456,1462,1464,1469,1474,1479,1484,1489,1494],{"text":1452,"config":1453},"About",{"href":1454,"dataGaName":1455,"dataGaLocation":1178},"/company/","about",{"text":1457,"config":1458,"footerGa":1461},"Jobs",{"href":1459,"dataGaName":1460,"dataGaLocation":1178},"/jobs/","jobs",{"dataGaName":1460},{"text":1423,"config":1463},{"href":1425,"dataGaName":1426,"dataGaLocation":1178},{"text":1465,"config":1466},"Leadership",{"href":1467,"dataGaName":1468,"dataGaLocation":1178},"/company/team/e-group/","leadership",{"text":1470,"config":1471},"Handbook",{"href":1472,"dataGaName":1473,"dataGaLocation":1178},"https://handbook.gitlab.com/","handbook",{"text":1475,"config":1476},"Investor relations",{"href":1477,"dataGaName":1478,"dataGaLocation":1178},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1480,"config":1481},"Trust Center",{"href":1482,"dataGaName":1483,"dataGaLocation":1178},"/security/","trust center",{"text":1485,"config":1486},"AI Transparency Center",{"href":1487,"dataGaName":1488,"dataGaLocation":1178},"/ai-transparency-center/","ai transparency center",{"text":1490,"config":1491},"Newsletter",{"href":1492,"dataGaName":1493,"dataGaLocation":1178},"/company/contact/#contact-forms","newsletter",{"text":1495,"config":1496},"Press",{"href":1497,"dataGaName":1498,"dataGaLocation":1178},"/press/","press",{"text":1500,"config":1501,"menu":1502},"Contact us",{"dataNavLevelOne":1446},{"type":1229,"columns":1503},[1504],{"items":1505},[1506,1511,1516],{"text":1507,"config":1508},"Talk to sales",{"href":1509,"dataGaName":1510,"dataGaLocation":1178},"/sales/","talk to sales",{"text":1512,"config":1513},"Support portal",{"href":1514,"dataGaName":1515,"dataGaLocation":1178},"https://support.gitlab.com/hc/en-us","support portal",{"text":1517,"config":1518},"Customer portal",{"href":1519,"dataGaName":1520,"dataGaLocation":1178},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1522,"login":1523,"suggestions":1530},"Close",{"text":1524,"link":1525},"To search repositories and projects, login to",{"text":1526,"config":1527},"gitlab.com",{"href":1192,"dataGaName":1528,"dataGaLocation":1529},"search login","search",{"text":1531,"default":1532},"Suggestions",[1533,1535,1539,1541,1545,1549],{"text":1209,"config":1534},{"href":1214,"dataGaName":1209,"dataGaLocation":1529},{"text":1536,"config":1537},"Code Suggestions (AI)",{"href":1538,"dataGaName":1536,"dataGaLocation":1529},"/solutions/code-suggestions/",{"text":1245,"config":1540},{"href":1247,"dataGaName":1245,"dataGaLocation":1529},{"text":1542,"config":1543},"GitLab on AWS",{"href":1544,"dataGaName":1542,"dataGaLocation":1529},"/partners/technology-partners/aws/",{"text":1546,"config":1547},"GitLab on Google Cloud",{"href":1548,"dataGaName":1546,"dataGaLocation":1529},"/partners/technology-partners/google-cloud-platform/",{"text":1550,"config":1551},"Why GitLab?",{"href":1222,"dataGaName":1550,"dataGaLocation":1529},{"freeTrial":1553,"mobileIcon":1558,"desktopIcon":1563,"secondaryButton":1566},{"text":1554,"config":1555},"Start free trial",{"href":1556,"dataGaName":1183,"dataGaLocation":1557},"https://gitlab.com/-/trials/new/","nav",{"altText":1559,"config":1560},"Gitlab Icon",{"src":1561,"dataGaName":1562,"dataGaLocation":1557},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1559,"config":1564},{"src":1565,"dataGaName":1562,"dataGaLocation":1557},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1567,"config":1568},"Get Started",{"href":1569,"dataGaName":1570,"dataGaLocation":1557},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1572,"mobileIcon":1576,"desktopIcon":1578},{"text":1573,"config":1574},"Learn more about GitLab Duo",{"href":1214,"dataGaName":1575,"dataGaLocation":1557},"gitlab duo",{"altText":1559,"config":1577},{"src":1561,"dataGaName":1562,"dataGaLocation":1557},{"altText":1559,"config":1579},{"src":1565,"dataGaName":1562,"dataGaLocation":1557},{"button":1581,"mobileIcon":1586,"desktopIcon":1588},{"text":1582,"config":1583},"/switch",{"href":1584,"dataGaName":1585,"dataGaLocation":1557},"#contact","switch",{"altText":1559,"config":1587},{"src":1561,"dataGaName":1562,"dataGaLocation":1557},{"altText":1559,"config":1589},{"src":1590,"dataGaName":1562,"dataGaLocation":1557},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1592,"mobileIcon":1597,"desktopIcon":1599},{"text":1593,"config":1594},"Back to pricing",{"href":1327,"dataGaName":1595,"dataGaLocation":1557,"icon":1596},"back to pricing","GoBack",{"altText":1559,"config":1598},{"src":1561,"dataGaName":1562,"dataGaLocation":1557},{"altText":1559,"config":1600},{"src":1565,"dataGaName":1562,"dataGaLocation":1557},{"title":1602,"titleMobile":1603,"button":1604,"config":1609},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1220,"config":1605},{"href":1606,"dataGaName":1607,"dataGaLocation":1608},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1610,"disabled":1160},"release",{"data":1612},{"text":1613,"source":1614,"edit":1620,"contribute":1625,"config":1630,"items":1635,"minimal":1844},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1615,"config":1616},"View page source",{"href":1617,"dataGaName":1618,"dataGaLocation":1619},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1621,"config":1622},"Edit this page",{"href":1623,"dataGaName":1624,"dataGaLocation":1619},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1626,"config":1627},"Please contribute",{"href":1628,"dataGaName":1629,"dataGaLocation":1619},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1631,"facebook":1632,"youtube":1633,"linkedin":1634},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1636,1683,1736,1780,1812],{"title":1325,"links":1637,"subMenu":1652},[1638,1642,1647],{"text":1639,"config":1640},"View plans",{"href":1327,"dataGaName":1641,"dataGaLocation":1619},"view plans",{"text":1643,"config":1644},"Why Premium?",{"href":1645,"dataGaName":1646,"dataGaLocation":1619},"/pricing/premium/","why premium",{"text":1648,"config":1649},"Why Ultimate?",{"href":1650,"dataGaName":1651,"dataGaLocation":1619},"/pricing/ultimate/","why ultimate",[1653],{"title":1654,"links":1655},"Contact Us",[1656,1659,1661,1663,1668,1673,1678],{"text":1657,"config":1658},"Contact sales",{"href":1509,"dataGaName":1188,"dataGaLocation":1619},{"text":1512,"config":1660},{"href":1514,"dataGaName":1515,"dataGaLocation":1619},{"text":1517,"config":1662},{"href":1519,"dataGaName":1520,"dataGaLocation":1619},{"text":1664,"config":1665},"Status",{"href":1666,"dataGaName":1667,"dataGaLocation":1619},"https://status.gitlab.com/","status",{"text":1669,"config":1670},"Terms of use",{"href":1671,"dataGaName":1672,"dataGaLocation":1619},"/terms/","terms of use",{"text":1674,"config":1675},"Privacy statement",{"href":1676,"dataGaName":1677,"dataGaLocation":1619},"/privacy/","privacy statement",{"text":1679,"config":1680},"Cookie preferences",{"dataGaName":1681,"dataGaLocation":1619,"id":1682,"isOneTrustButton":135},"cookie preferences","ot-sdk-btn",{"title":1225,"links":1684,"subMenu":1692},[1685,1688],{"text":1169,"config":1686},{"href":1207,"dataGaName":1687,"dataGaLocation":1619},"devsecops platform",{"text":1689,"config":1690},"AI-Assisted Development",{"href":1214,"dataGaName":1691,"dataGaLocation":1619},"ai-assisted development",[1693],{"title":1694,"links":1695},"Topics",[1696,1701,1706,1711,1716,1721,1726,1731],{"text":1697,"config":1698},"CICD",{"href":1699,"dataGaName":1700,"dataGaLocation":1619},"/topics/ci-cd/","cicd",{"text":1702,"config":1703},"GitOps",{"href":1704,"dataGaName":1705,"dataGaLocation":1619},"/topics/gitops/","gitops",{"text":1707,"config":1708},"DevOps",{"href":1709,"dataGaName":1710,"dataGaLocation":1619},"/topics/devops/","devops",{"text":1712,"config":1713},"Version Control",{"href":1714,"dataGaName":1715,"dataGaLocation":1619},"/topics/version-control/","version control",{"text":1717,"config":1718},"DevSecOps",{"href":1719,"dataGaName":1720,"dataGaLocation":1619},"/topics/devsecops/","devsecops",{"text":1722,"config":1723},"Cloud Native",{"href":1724,"dataGaName":1725,"dataGaLocation":1619},"/topics/cloud-native/","cloud native",{"text":1727,"config":1728},"AI for Coding",{"href":1729,"dataGaName":1730,"dataGaLocation":1619},"/topics/devops/ai-for-coding/","ai for coding",{"text":1732,"config":1733},"Agentic AI",{"href":1734,"dataGaName":1735,"dataGaLocation":1619},"/topics/agentic-ai/","agentic ai",{"title":1737,"links":1738},"Solutions",[1739,1741,1743,1748,1752,1755,1759,1762,1764,1767,1770,1775],{"text":1269,"config":1740},{"href":1264,"dataGaName":1269,"dataGaLocation":1619},{"text":1258,"config":1742},{"href":1241,"dataGaName":1242,"dataGaLocation":1619},{"text":1744,"config":1745},"Agile development",{"href":1746,"dataGaName":1747,"dataGaLocation":1619},"/solutions/agile-delivery/","agile delivery",{"text":1749,"config":1750},"SCM",{"href":1254,"dataGaName":1751,"dataGaLocation":1619},"source code management",{"text":1697,"config":1753},{"href":1247,"dataGaName":1754,"dataGaLocation":1619},"continuous integration & delivery",{"text":1756,"config":1757},"Value stream management",{"href":1297,"dataGaName":1758,"dataGaLocation":1619},"value stream management",{"text":1702,"config":1760},{"href":1761,"dataGaName":1705,"dataGaLocation":1619},"/solutions/gitops/",{"text":1307,"config":1763},{"href":1310,"dataGaName":1311,"dataGaLocation":1619},{"text":1765,"config":1766},"Small business",{"href":1316,"dataGaName":1317,"dataGaLocation":1619},{"text":1768,"config":1769},"Public sector",{"href":1322,"dataGaName":1323,"dataGaLocation":1619},{"text":1771,"config":1772},"Education",{"href":1773,"dataGaName":1774,"dataGaLocation":1619},"/solutions/education/","education",{"text":1776,"config":1777},"Financial services",{"href":1778,"dataGaName":1779,"dataGaLocation":1619},"/solutions/finance/","financial services",{"title":1330,"links":1781},[1782,1784,1786,1788,1791,1793,1796,1798,1800,1802,1804,1806,1808,1810],{"text":1343,"config":1783},{"href":1345,"dataGaName":1346,"dataGaLocation":1619},{"text":1348,"config":1785},{"href":1350,"dataGaName":1351,"dataGaLocation":1619},{"text":1353,"config":1787},{"href":1355,"dataGaName":1356,"dataGaLocation":1619},{"text":1358,"config":1789},{"href":1360,"dataGaName":1790,"dataGaLocation":1619},"docs",{"text":1381,"config":1792},{"href":1383,"dataGaName":1384,"dataGaLocation":1619},{"text":1794,"config":1795},"What's new",{"href":1441,"dataGaName":1442,"dataGaLocation":1619},{"text":1376,"config":1797},{"href":1378,"dataGaName":1379,"dataGaLocation":1619},{"text":1395,"config":1799},{"href":1397,"dataGaName":1398,"dataGaLocation":1619},{"text":1403,"config":1801},{"href":1405,"dataGaName":1406,"dataGaLocation":1619},{"text":1408,"config":1803},{"href":1410,"dataGaName":1411,"dataGaLocation":1619},{"text":1413,"config":1805},{"href":1415,"dataGaName":1416,"dataGaLocation":1619},{"text":1418,"config":1807},{"href":1420,"dataGaName":1421,"dataGaLocation":1619},{"text":1423,"config":1809},{"href":1425,"dataGaName":1426,"dataGaLocation":1619},{"text":1428,"config":1811},{"href":1430,"dataGaName":1431,"dataGaLocation":1619},{"title":1444,"links":1813},[1814,1816,1818,1820,1822,1824,1828,1833,1835,1837,1839],{"text":1452,"config":1815},{"href":1454,"dataGaName":1446,"dataGaLocation":1619},{"text":1457,"config":1817},{"href":1459,"dataGaName":1460,"dataGaLocation":1619},{"text":1465,"config":1819},{"href":1467,"dataGaName":1468,"dataGaLocation":1619},{"text":1470,"config":1821},{"href":1472,"dataGaName":1473,"dataGaLocation":1619},{"text":1475,"config":1823},{"href":1477,"dataGaName":1478,"dataGaLocation":1619},{"text":1825,"config":1826},"Sustainability",{"href":1827,"dataGaName":1825,"dataGaLocation":1619},"/sustainability/",{"text":1829,"config":1830},"Diversity, inclusion and belonging (DIB)",{"href":1831,"dataGaName":1832,"dataGaLocation":1619},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1480,"config":1834},{"href":1482,"dataGaName":1483,"dataGaLocation":1619},{"text":1490,"config":1836},{"href":1492,"dataGaName":1493,"dataGaLocation":1619},{"text":1495,"config":1838},{"href":1497,"dataGaName":1498,"dataGaLocation":1619},{"text":1840,"config":1841},"Modern Slavery Transparency Statement",{"href":1842,"dataGaName":1843,"dataGaLocation":1619},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1845},[1846,1849,1852],{"text":1847,"config":1848},"Terms",{"href":1671,"dataGaName":1672,"dataGaLocation":1619},{"text":1850,"config":1851},"Cookies",{"dataGaName":1681,"dataGaLocation":1619,"id":1682,"isOneTrustButton":135},{"text":1853,"config":1854},"Privacy",{"href":1676,"dataGaName":1677,"dataGaLocation":1619},[1856],{"id":1857,"title":7,"body":1155,"config":1858,"content":1860,"description":1155,"extension":1864,"meta":1865,"navigation":135,"path":1866,"seo":1867,"stem":1868,"__hash__":1869},"blogAuthors/en-us/blog/authors/fernando-diaz.yml",{"template":1859},"BlogAuthor",{"name":7,"config":1861},{"headshot":1862,"ctfId":1863},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659556/Blog/Author%20Headshots/fern_diaz.png","fjdiaz","yml",{},"/en-us/blog/authors/fernando-diaz",{},"en-us/blog/authors/fernando-diaz","lxRJIOydP4_yzYZvsPcuQevP9AYAKREF7i8QmmdnOWc",[1871,1879,1887],{"title":1872,"description":1873,"heroImage":1874,"category":1151,"date":1875,"authors":1876,"slug":1878,"externalUrl":1155},"How GitLab tracks vulnerabilities through refactors and reformatting","Learn how GitLab's improved Scope+Offset fingerprinting keeps vulnerability tracking stable across comments, blank lines, and reformatting.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1759320418/xjmqcozxzt4frx0hori3.png","2026-08-12",[1877],"Julian Thome","improved-scope-offset-fingerprinting",{"title":1880,"description":1881,"heroImage":1874,"category":1151,"date":1882,"authors":1883,"slug":1886,"externalUrl":1155},"GitLab Secrets Manager adds ESO, Terraform, API support","Simplify credential management across your stack. GitLab Secrets Manager provides secure retrieval in Kubernetes, Terraform, and external workflows.","2026-08-06",[1884,1885],"Erick Bajao","Joe Randazzo","gitlab-secrets-manager-add-eso-terraform-api-support",{"title":1888,"description":1889,"heroImage":1890,"category":1151,"date":1891,"authors":1892,"slug":1894,"externalUrl":1155},"Secure every commit to production with Claude and GitLab","Claude Security catches vulnerabilities inside a coding session. GitLab picks up from there, scanning, enforcing policy, and producing audit evidence for the software lifecycle. ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756122536/akivvcnafog9c4dhhzkp.png","2026-08-03",[1893],"Alisa Ho","claude-security-and-gitlab",{"promotions":1896},[1897,1911,1922,1933],{"id":1898,"categories":1899,"header":1901,"text":1902,"button":1903,"image":1908},"ai-modernization",[1900],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1904,"config":1905},"Get your AI maturity score",{"href":1906,"dataGaName":1907,"dataGaLocation":1384},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1909},{"src":1910},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1912,"categories":1913,"header":1914,"text":1902,"button":1915,"image":1919},"devops-modernization",[1167,1720],"Are you just managing tools or shipping innovation?",{"text":1916,"config":1917},"Get your DevOps maturity score",{"href":1918,"dataGaName":1907,"dataGaLocation":1384},"/assessments/devops-modernization-assessment/",{"config":1920},{"src":1921},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1923,"categories":1924,"header":1925,"text":1902,"button":1926,"image":1930},"security-modernization",[1151],"Are you trading speed for security?",{"text":1927,"config":1928},"Get your security maturity score",{"href":1929,"dataGaName":1907,"dataGaLocation":1384},"/assessments/security-modernization-assessment/",{"config":1931},{"src":1932},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1934,"paths":1935,"header":1938,"text":1939,"button":1940,"image":1945},"github-azure-migration",[1936,1937],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1941,"config":1942},"See how GitLab compares to GitHub",{"href":1943,"dataGaName":1944,"dataGaLocation":1384},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1946},{"src":1921},{"header":1948,"blurb":1949,"button":1950,"secondaryButton":1955},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1951,"config":1952},"Get your free trial",{"href":1953,"dataGaName":1183,"dataGaLocation":1954},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1657,"config":1956},{"href":1509,"dataGaName":1188,"dataGaLocation":1954},1786803766613]