Skip to content

Commit 957a8e9

Browse files
authored
feat: add zap, config, reports; remove Makefile (#9)
Signed-off-by: Jef LeCompte <[email protected]>
1 parent 4b8ef13 commit 957a8e9

File tree

10 files changed

+260
-105
lines changed

10 files changed

+260
-105
lines changed

.github/workflows/ci.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
restore-keys: |
1616
${{ runner.os }}-go-
1717
- name: Build
18-
run: make production
18+
run: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w"
1919
lint:
2020
runs-on: ubuntu-latest
2121
steps:

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
.idea/
2-
bin/
2+
audit-org-keys

Dockerfile

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
FROM golang:1.14.4-alpine3.12 AS builder
22

3-
RUN apk update && apk --no-cache add make git
4-
53
WORKDIR /build
64

75
COPY go.mod go.mod
86
COPY go.sum go.sum
7+
8+
RUN go mod download
9+
10+
COPY config.go config.go
11+
COPY logger.go logger.go
912
COPY main.go main.go
10-
COPY Makefile Makefile
1113

12-
RUN make production
14+
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
15+
go build -ldflags="-s -w"
1316

1417
FROM alpine:3.12.0
1518

@@ -18,6 +21,6 @@ ENV GITHUB_PAT=""
1821

1922
WORKDIR /opt
2023

21-
COPY --from=builder /build/bin/audit-org-keys audit-org-keys
24+
COPY --from=builder /build/audit-org-keys audit-org-keys
2225

2326
ENTRYPOINT ["./audit-org-keys"]

Makefile

Lines changed: 0 additions & 46 deletions
This file was deleted.

README.md

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,49 @@ Programs like `ssh2john` from **John the Ripper** can best demonstrate how fast
99
### Requirements
1010

1111
- Go 1.14+ or Docker
12-
- GitHub Personal Access Token
13-
- GitHub Organization that you can read
14-
- Example: [actions](https://github.com/actions)
1512

1613
### Running
1714

18-
#### Golang
1915
```sh
2016
export GITHUB_ORGANIZATION=actions
2117
export GITHUB_PAT=mysecrettoken
2218

2319
# native
24-
make run
20+
go build
21+
./audit-org-keys
22+
23+
# show users with multiple keys
24+
./audit-org-keys -show-users=multiple
2525

2626
# Docker
27-
make run-docker
27+
docker build -t audit-org-keys:local .
28+
29+
docker run --rm -it \
30+
--env "GITHUB_ORGANIZATION=$GITHUB_ORGANIZATION" \
31+
--env "GITHUB_PAT=$GITHUB_PAT" \
32+
audit-org-keys:local
33+
34+
# show users without keys
35+
docker run --rm -it \
36+
--env "GITHUB_ORGANIZATION=$GITHUB_ORGANIZATION" \
37+
--env "GITHUB_PAT=$GITHUB_PAT" \
38+
audit-org-keys:local -show-users=without
2839
```
2940

41+
#### Available arguments
42+
43+
- `-show-users=<filter>`: display users with filter (`all`, `with`, `without`, `multiple`)
44+
45+
#### Available environment variables
46+
47+
- `GITHUB_ORGANIZATION`*: The organization under audit
48+
- `GITHUB_PAT`*: GitHub Personal Access Token
49+
- [Create a PAT](https://github.com/settings/tokens) with `read:org` scope
50+
- Some organizations have SSO; if yours does, then you also need to enable it
51+
- `LOG_LEVEL`: Sets zap log level
52+
53+
> :point_right: Required denoted by `*`
54+
3055
### Acknowledgments
3156

3257
- [Auditing GitHub users’ SSH key quality](https://blog.benjojo.co.uk/post/auditing-github-users-keys)

config.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"os"
6+
)
7+
8+
const (
9+
gitHubURL = "https://github.com"
10+
gitHubOrgAPI = "https://api.github.com/orgs"
11+
)
12+
13+
var (
14+
showUsers = flag.String("show-users", "", "display users with filter (`all`, `with`, `without`, `multiple`)")
15+
gitHubOrg = os.Getenv("GITHUB_ORGANIZATION")
16+
gitHubPAT = os.Getenv("GITHUB_PAT")
17+
)
18+
19+
func init() {
20+
flag.Parse()
21+
initLogger()
22+
}

go.mod

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
module github.com/jef/audit-org-keys
22

33
go 1.14
4+
5+
require (
6+
github.com/olekukonko/tablewriter v0.0.4
7+
go.uber.org/zap v1.15.0
8+
gopkg.in/yaml.v2 v2.2.8 // indirect
9+
)

go.sum

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
2+
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
3+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
7+
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
8+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
9+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
10+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
11+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
12+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
13+
github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54=
14+
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
15+
github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8=
16+
github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
17+
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
18+
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
19+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
20+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
21+
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
22+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
23+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
24+
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
25+
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
26+
go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk=
27+
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
28+
go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A=
29+
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
30+
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4=
31+
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
32+
go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM=
33+
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
34+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
35+
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
36+
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
37+
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
38+
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
39+
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
40+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
41+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
42+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
43+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
44+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
45+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
46+
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
47+
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
48+
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
49+
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs=
50+
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
51+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
52+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
53+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
54+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
55+
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
56+
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
57+
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
58+
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
59+
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
60+
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=

logger.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package main
2+
3+
import (
4+
"go.uber.org/zap"
5+
"go.uber.org/zap/zapcore"
6+
"os"
7+
)
8+
9+
func initLogger() {
10+
var loggerConfig zap.Config
11+
12+
var logLevel zapcore.Level
13+
switch os.Getenv("LOG_LEVEL") {
14+
case "debug":
15+
logLevel = zap.DebugLevel
16+
case "info":
17+
logLevel = zap.InfoLevel
18+
case "warn":
19+
logLevel = zap.WarnLevel
20+
case "error":
21+
logLevel = zap.ErrorLevel
22+
case "panic":
23+
logLevel = zap.PanicLevel
24+
case "fatal":
25+
logLevel = zap.FatalLevel
26+
default:
27+
logLevel = zap.InfoLevel
28+
}
29+
30+
loggerConfig = zap.NewDevelopmentConfig()
31+
loggerConfig.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
32+
loggerConfig.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
33+
loggerConfig.EncoderConfig.TimeKey = "timestamp"
34+
loggerConfig.EncoderConfig.MessageKey = "message"
35+
loggerConfig.Level = zap.NewAtomicLevelAt(logLevel)
36+
37+
if logger, err := loggerConfig.Build(); err == nil {
38+
zap.ReplaceGlobals(logger)
39+
}
40+
}

0 commit comments

Comments
 (0)