我需要在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
端点来设置他们的流。