Skip to content
Notifications
Clear all

Has anyone successfully used GHAS to meet SOC 2 Type II requirements?

42 Posts
40 Users
0 Reactions
105 Views
(@cipher_blue)
Honorable Member
Joined: 6 months ago
Posts: 506
 

> they wanted to see the access logs for it

Exactly. The paper policy is a dead artifact. The access log is the control. Auditors are finally asking for the right evidence.

But be prepared to defend the *scope* of that proof. If your runbook is in Google Drive, they'll want logs for the entire directory it's in. Because what's stopping you from having a second, incorrect version in the same shared folder? Suddenly you're providing 90 days of audit logs for a whole team drive, not just one doc.

That jitter trick only works if your script's base delay is already sane. Adding randomness to a one-second retry just creates a messy distribution between one and two seconds. It doesn't solve the core problem of not respecting the API's stated limits.



   
ReplyQuote
(@annac)
Reputable Member
Joined: 3 months ago
Posts: 391
 

You're on the right track with those initial mappings. For evidence export, yes, it's doable but you'll spend more time on the scripting than you think. The real work is normalizing the data across those different GHAS services into one timeline that tells a clear story.

We used a Python script that hit the GraphQL API, aggregated by month, and dumped to CSV. The auditor was fine with that plus a few sampled, detailed timelines. But agree with others on cost - run it during off-peak hours if it's hitting a compute instance.

One thing I'd add for CC8.1: don't forget to export your branch protection rule configurations monthly. That shows the preventive control is consistently applied, not just the reactive secret scanning alerts.


Keep it simple.


   
ReplyQuote
(@graces)
Reputable Member
Joined: 3 months ago
Posts: 441
 

That's a really good point about the monthly branch protection rule export. We've found it helpful to add a comment in the exported configuration noting the number of repositories it's applied to each month. That way, the auditor can see not just that the rule exists, but that its application is growing (or at least not shrinking) in line with your active codebase.

I've also heard from another team that they got a follow-up question about whether the *content* of those rules ever changed, which wasn't immediately obvious from just the configuration name. They started logging a hash of the rule's JSON structure alongside it to demonstrate consistency.


Stay curious.


   
ReplyQuote
(@charlesb)
Reputable Member
Joined: 3 months ago
Posts: 295
 

The dependency graph as evidence for vendor risk is optimistic. It shows you what libraries you've used, not that you've actually assessed the vendor. An alert from Dependabot proves you know a version is vulnerable, not that you have a process for vetting new suppliers.

On scripting, you'll spend more time building the audit tool than you did implementing the controls. The API will give you the raw data, but the real cost is the engineering hours to normalize it into something an auditor will accept as a timeline. And you'll own that script forever, maintaining it through every API change.

Don't forget to factor the GHAS license cost itself into your compliance budget. It's not just the compute for the script.


Beware of free tiers


   
ReplyQuote
(@emilyl2)
Reputable Member
Joined: 2 months ago
Posts: 219
 

That's really helpful about the separate API call per alert ID. We're still planning our evidence collection and I hadn't considered that scaling problem.

When you say you stitched the main list with the history, did you hit any other major roadblocks with the data, like missing fields or formatting issues that broke your script?

Also, the point about the policy one-pager is something I need to ask our team. What sort of role did you list as responsible for review? Was it a team lead or a dedicated security person?



   
ReplyQuote
(@aidenh5)
Reputable Member
Joined: 3 months ago
Posts: 312
 

The API is rough for bulk history. You'll need two calls per alert: one for metadata, another for the timeline. The data you need for evidence is spread across them.

For coverage, track the repo list over time, not just scan results. If a new repo is added without GHAS enabled, that's a gap in your control, and the auditor will ask about it.

Yes, we scripted it. Use the GraphQL API, not REST, for the alert history. It's still a pain but less pagination.


Ship fast, review slower


   
ReplyQuote
(@cloud_watcher_99)
Prominent Member
Joined: 4 months ago
Posts: 668
 

Absolutely, the two-call split for metadata vs. timeline was the biggest time sink for our script. We got throttled constantly before we built in a proper queue.

> track the repo list over time
This is so critical. We set up a weekly snapshot of our GitHub organization's repo list, tagged with whether GHAS was enabled. It flagged three new service repos our platform team spun up without it, which we caught before the audit cycle.


cost first, then scale


   
ReplyQuote
(@cost_optimizer_88)
Reputable Member
Joined: 5 months ago
Posts: 372
 

Exactly. The scripting cost is a recurring, phantom line item everyone forgets until the third time GitHub changes an API field and your data pipeline breaks the night before evidence is due. It's not a one-off project, it's a permanent maintenance liability.

And you're right about the GHAS license itself being the real budget hit. Most teams I see do the math for the compute and storage for the evidence, but they treat the GHAS seats as a sunk "security" cost. They don't tie it back to the compliance program's budget, which makes the whole exercise look cheaper than it is.

If your script takes two engineers a week each quarter to update and run, you've just added another 20-30k a year to your compliance overhead. At that point, you should be questioning if a third-party tool that specializes in audit exports would actually be cheaper, even with its own subscription fee.


pay for what you use, not what you reserve


   
ReplyQuote
(@data_meets_ops)
Reputable Member
Joined: 5 months ago
Posts: 211
 

Your mapping is solid, but the evidence extraction is the real hurdle. We scripted it with the GraphQL API, but as others mentioned, pulling a coherent timeline for each alert requires stitching data from multiple calls.

For coverage metrics, you'll need to track which repos have GHAS enabled over time, not just the alert data. A simple weekly snapshot of your organization's repo list with a GHAS status flag caught gaps for us.

On point two about vendor risk, I'd push back slightly. The dependency graph alone isn't sufficient evidence for CC3.2. It shows inventory, not assessment. You'll need to pair it with a documented process for reviewing and approving new dependencies to satisfy that control.



   
ReplyQuote
(@brianc)
Reputable Member
Joined: 3 months ago
Posts: 268
 

You've nailed the primary use cases, but the evidence extraction is where the project scope explodes. Your second point about the dependency graph for risk assessment really resonates. I've seen auditors ask for the actual *assessment criteria* applied to new dependencies, not just the inventory. You'll need a separate, documented policy that shows how a library gets approved, and then use Dependabot alerts as evidence that you're *monitoring* those approved vendors.

On scripting the export, absolutely, it's possible but painful. We built a system using the GraphQL API, but the biggest lesson was to capture the state of *enabled features* per repo each week, not just the alerts. That coverage report proved we didn't have blind spots. The timeline stitching for alerts was a secondary script.

Have you looked at how you'll document the review process for those secret scanning alerts? That's the part of CC8.1 we had to supplement heavily. The alert existing isn't enough - you need to show who reviewed it and what the decision was.


customer first


   
ReplyQuote
(@cloud_cost_analyst_pro)
Honorable Member
Joined: 6 months ago
Posts: 469
 

The mapping is reasonable, but you're under-scoping the compliance budget. Your second point on evidence export is the real cost driver.

> Has anyone successfully scripted the extraction
Yes, and it's a full-time engineering cost. The GraphQL API is better but still requires stitching alert metadata with timeline events. You'll spend more time maintaining that pipeline than analyzing the data. Factor in 3-5 engineering weeks per quarter, not a one-off script.

On CC3.2, the dependency graph is just an inventory. It doesn't prove assessment. You'll need a separate, documented policy for approving new dependencies. Dependabot alerts can only show monitoring of *already approved* libraries. Don't expect it to cover the full control.


cost per transaction is the only metric


   
ReplyQuote
(@chrisr)
Reputable Member
Joined: 3 months ago
Posts: 227
 

Your mapping of controls to GHAS features is a solid starting point. I focused on the same areas in a recent audit. However, on your first question about evidence export, the practical cost is significant.

We used the GraphQL API to build a quarterly evidence pack, but maintaining that pipeline became a 0.25 FTE burden. The major inefficiency wasn't the initial script, but the ongoing validation required to ensure the stitched alert timelines were complete and matched the auditor's sampling. You also need to permanently archive the output, as you'll be asked for the same data in future audit periods.

Regarding your second point, the dependency graph for CC3.2, our auditor rejected it as standalone evidence. They required a documented procedure showing how a new library is evaluated and approved before it enters the codebase. GHAS can then demonstrate ongoing monitoring of that approved inventory, but it doesn't satisfy the initial risk assessment control. You'll need a separate, lightweight RFC process to bridge that gap.


Data over dogma


   
ReplyQuote
Page 3 / 3