需要从github下载所有具有大量历史记录的审核日志



我需要在GitHub中下载我的组织中的所有审计日志。

问题是:我有几十个存储库和2年的提交历史,所以这是大量的数据,手动请求是不可能的。

有人知道一个工具或方法来检索GitHub审核日志中的所有信息吗?或者至少是"每个存储库"?

谢谢。

如果您想下载审核日志数据,可以使用v4 GraphQL API下载,该API提供了访问审核日志项的方法。此信息不可用于v3 REST API。

如果只想检索提交历史记录(这是不同的(,那么最简单的方法就是克隆存储库。通过API读取每个提交都是低效的,而且很可能很快就会达到速率限制。然而,您可以使用API来发现您拥有的存储库并编写它的脚本

您可以使用github提供的GraphQL API。您可以使用python脚本从组织中提取所有审计日志。我最近在做这个。

同样使用GraphQL API,您可以一次提取100个日志。所以我们必须使用光标来导航,直到我们到达日志的末尾。

如果您想了解光标,请参阅此链接。https://graphql.org/learn/pagination/

这是源代码,

import requests
import json
import pandas as pd
from datetime import datetime
import time
headers = {"Authorization": "token YOUR PERSONAL TOKEN"}
enterprise = '"ENTERPRISE"'
organizations = []
after = ''
while True:
getOrgantionsListQuery = """
query {
enterprise(slug: """+ enterprise + """) {
...enterpriseFragment
}
}
fragment enterpriseFragment on Enterprise {
... on Enterprise{
name
organizations(first: 100, """ + after +"""){
edges{
node{
name
... on Organization{
name
}
}
cursor
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
}
}
}
}
"""
result = requests.post('https://api.github.com/graphql',
json={'query': getOrgantionsListQuery},
headers=headers)
enterpriseData = json.loads(result.text)
if 'errors' in enterpriseData:
print(enterprise+ " " + enterpriseData['errors'][0]['type'])
break
enterpriseAudit = enterpriseData['data']['enterprise']['organizations']
for org in enterpriseAudit['edges']:
organizations.append(org['node']['name'])
if not enterpriseAudit['pageInfo']['hasNextPage']:
break
after = 'after: "' + str(enterpriseAudit['edges'][-1]['cursor']) + '"'
time.sleep(1)

response = []
for org in organizations:   
after = ''
org = '"' + org + '"'
while True:
getAuditLogQuery = """
query {
organization(login: """+ org + """) {
auditLog(first: 100, """ + after +""") {
edges {
node {
... on RepositoryAuditEntryData {
repository {
name
}
}
... on OrganizationAuditEntryData {
organizationResourcePath
organizationName
organizationUrl
}
... on TeamAuditEntryData {
teamName
}
... on TopicAuditEntryData {
topicName
}
... on OauthApplicationAuditEntryData {
oauthApplicationName
}

... on EnterpriseAuditEntryData {
enterpriseResourcePath
enterpriseUrl
enterpriseSlug
}
... on AuditEntry {
actorResourcePath
action
actorIp
actorLogin
operationType
createdAt
actorLocation {
countryCode
country
regionCode
region
city
}
#User 'Action' was performed on
userLogin
userResourcePath
userUrl
}
}
cursor
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
}
}
}
}
"""
result = requests.post('https://api.github.com/graphql',
json={'query': getAuditLogQuery},
headers=headers)
organizationData = json.loads(result.text)
if 'errors' in organizationData:
print(org + " " + organizationData['errors'][0]['type'])
break
auditLog = organizationData['data']['organization']['auditLog']
print(org + " " + str(len(auditLog['edges'])))
for log in auditLog['edges']:
response.append(log)
if not auditLog['pageInfo']['hasNextPage']:
break
after = 'after: "' + str(auditLog['edges'][-1]['cursor']) + '"'
time.sleep(1)

df = pd.DataFrame(response)
df.to_json(r'/YOUR/PATH/TO/SAVE' + str(datetime.now()) +'.json')```

检查GitHub审核日志流是否对您的情况有所帮助。

它刚刚推出测试版(2022年1月(:

审核日志流通常可用

GitHub审核日志流现在已经脱离测试版,并且可以正常使用。

您使用审计日志流的体验不会改变,但我们扩展了您可以流式传输审计和Git事件的选项数量

  • 亚马逊S3
  • Azure Blob存储
  • Azure事件中心
  • 谷歌云存储
  • 斯普伦克

企业所有者可以在几分钟内通过导航到Audit log选项卡下的企业帐户设置并配置collection端点来设置他们的流。

最新更新