Introduction
GitHub Enterprise Cloud audit logs support log streaming to various cloud providers.
Streaming audit logs to Amazon S3 can be done via OpenID Connect. This requires the creation of an OIDC Provider and IAM role on the AWS side and an S3 bucket for log storage.
Please refer to the above document for detailed instructions.
It is not something that is created many times, but I have created a CloudFormation template and hope it will be helpful for those who want to create a new one quickly and easily.
Resources to be created
Logical ID | Type | Description |
---|---|---|
AuditLogBucket | AWS::S3::Bucket | S3 bucket for audit log |
AuditLogbucketPolicy | AWS::S3::BucketPolicy | S3 bucket policy for audit log |
AccessLogBucket | AWS::S3::Bucket | S3 bucket for server access log |
AccessLogBucketPolicy | AWS::S3::BucketPolicy | S3 bucket policy for server access log |
AuditLogEncryptionKey | AWS::KMS::Key | Customer Managed Key for audit log encryption |
AuditLogEncryptionKeyAlias | AWS::KMS::Alias | Customer Managed Key alias |
AuditLogStremingPolicy | AWS::IAM::ManagedPolicy | IAM policy for audit log streaming |
AuditLogStreamingRole | AWS::IAM::Role | IAM Role for audit log streaming |
GithubAuditLogOIDCProvider | AWS::IAM::OIDCProvider | GitHub OIDC provider |
CloudFormation template
Github repository is here
CFn-github-audit-log-streaming
This CloudFormation template creates the AWS resources required for GitHub Enterprise Cloud audit log streaming.
AWSTemplateFormatVersion: "2010-09-09"
Description: Create AWS resources required for GitHub Enterprise Cloud audit log streaming
Parameters:
RetainDays:
Description: Number of days to keep audit log.
Type: String
Default: 365
EnterpriseName:
Description: Your GitHub Enterprise Name.
Type: String
Default: EXAPMLECORP
AccessLogPrefix:
Description: Server access log-prefix of audit log bucket.
Type: String
Default: logs/
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: GitHub Configuration
Parameters:
- EnterpriseName
- Label:
default: Audit Log Configuration
Parameters:
- RetainDays
- AccessLogPrefix
Resources:
# Customer Managed Key for audit log encryption
AuditLogEncryptionKey:
Type: AWS::KMS::Key
Properties:
Description: Customer Managed Key for audit log encryption
Enabled: true
EnableKeyRotation: True
KeyPolicy:
Version: '2012-10-17'
Id: key-default-1
Statement:
- Sid: Allow administration of the key
Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
Action:
- kms:Create*
- kms:Describe*
- kms:Enable*
- kms:List*
- kms:Put*
- kms:Update*
- kms:Revoke*
- kms:Disable*
- kms:Get*
- kms:Delete*
- kms:ScheduleKeyDeletion
- kms:CancelKeyDeletion
Resource: '*'
- Sid: Allow local use of the key
Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
Action:
- kms:Encrypt
- kms:Decrypt
- kms:ReEncrypt*
- kms:GenerateDataKey*
- kms:DescribeKey
Resource: '*'
# Customer Managed Key ALias
AuditLogEncryptionKeyAlias:
Type: AWS::KMS::Alias
Properties:
AliasName: !Sub alias/${AWS::StackName}-key
TargetKeyId: !Ref AuditLogEncryptionKey
# S3 bucket for audit log
AuditLogBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
UpdateReplacePolicy: Retain
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: aws:kms
KMSMasterKeyID: !GetAtt AuditLogEncryptionKey.Arn
BucketKeyEnabled: true
LifecycleConfiguration:
Rules:
- Id: Retain
Status: Enabled
ExpirationInDays: !Ref RetainDays
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
LoggingConfiguration:
DestinationBucketName: !Ref AccessLogBucket
LogFilePrefix: !Ref AccessLogPrefix
VersioningConfiguration:
Status: Enabled
OwnershipControls:
Rules:
- ObjectOwnership: BucketOwnerEnforced
# S3 bucket policy for audit log
AudtiLogBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref AuditLogBucket
PolicyDocument:
Statement:
- Effect: Deny
Principal: '*'
Action: 's3:*'
Resource:
- !Sub ${AuditLogBucket.Arn}/*
- !GetAtt AuditLogBucket.Arn
Condition:
Bool:
aws:SecureTransport: false
# S3 bucket for server access log
AccessLogBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
UpdateReplacePolicy: Retain
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
LifecycleConfiguration:
Rules:
- Id: Retain
Status: Enabled
ExpirationInDays: !Ref RetainDays
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
VersioningConfiguration:
Status: Enabled
OwnershipControls:
Rules:
- ObjectOwnership: BucketOwnerEnforced
# S3 bucket policy for server access log
AccessLogBucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref AccessLogBucket
PolicyDocument:
Statement:
- Effect: Deny
Principal: '*'
Action: 's3:*'
Resource:
- !Sub ${AccessLogBucket.Arn}/*
- !GetAtt AccessLogBucket.Arn
Condition:
Bool:
aws:SecureTransport: false
- Effect: Allow
Principal:
Service: logging.s3.amazonaws.com
Action: s3:PutObject
Resource:
- !Sub ${AccessLogBucket.Arn}/${AccessLogPrefix}*
Condition:
ArnLike:
aws:SourceArn: !GetAtt AuditLogBucket.Arn
StringEquals:
aws:SourceAccount: !Ref AWS::AccountId
# IAM policy for audit log streaming role
AuditLogStremingPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
Description: Policy for GitHub Audit Log Streaming
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- s3:PutObject
Resource:
- !Sub ${AuditLogBucket.Arn}/*
# IAM Role for audit log streaming role
AuditLogStreamingRole:
Type: AWS::IAM::Role
Properties:
ManagedPolicyArns:
- !Ref AuditLogStremingPolicy
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Action: sts:AssumeRoleWithWebIdentity
Principal:
Federated: !Ref GithubAuditLogOIDCProvider
Condition:
StringEquals:
oidc-configuration.audit-log.githubusercontent.com:sub: !Sub https://github.com/${EnterpriseName}
oidc-configuration.audit-log.githubusercontent.com:aud: sts.amazonaws.com
GithubAuditLogOIDCProvider:
Type: AWS::IAM::OIDCProvider
Properties:
Url: https://oidc-configuration.audit-log.githubusercontent.com
ClientIdList:
- sts.amazonaws.com
ThumbprintList:
- 7e6db7b7584d8cf2003e0931e6cfc41a3a62d3df
Outputs:
IAMRole:
Description: IAM role for audit log streaming role
Value: !GetAtt AuditLogStreamingRole.Arn
AuditLogBucket:
Description: S3 bucket for audit log
Value: !Ref AuditLogBucket
Deploy
3 parameters are required.
GitHub Enterprise Name (
EnterpriseName
)Number of days to keep audit log (
RetainDays
)Server access log-prefix of audit log bucket (
AccessLogPrefix
)
After deploying the stack, set the output S3 bucket name and IAM Role ARN to GitHub Enterprise Cloud.
If the endpoint connection check is successful, save the configuration.
You can see the audit log in the AuditLogBucket!
I hope this will be of help to someone else.
Top comments (0)