Skip to content

Commit f1c19eb

Browse files
authored
Merge pull request #72 from flipgroup/accurate-cfn-filtering
Implement slow but accurate CloudFormation filtering
2 parents 8469cff + 46e9334 commit f1c19eb

10 files changed

Lines changed: 244 additions & 51 deletions

File tree

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ Exec all aws commands? (y/N) y
5555
> aws iam attach-user-policy --user-name billy.blogs --policy-arn arn:aws:iam::aws:policy/ReadOnly
5656
```
5757

58+
## Accurate cloudformation matching
59+
60+
By default, iamy will use a simple heuristic (does it end with an ID, eg -ABCDEF1234) to determine if a given resource is managed by cloudformation.
61+
62+
This behaviour is good enough for some cases, but if you want slower but more accurate matching pass `--accurate-cfn`
63+
to enumerate all cloudformation stacks and resources to determine exactly which resources are managed.
5864

5965
## Inspiration and similar tools
6066
- https://github.com/percolate/iamer

go.mod

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
module github.com/99designs/iamy
22

3+
go 1.14
4+
35
require (
4-
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 // indirect
5-
github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 // indirect
6-
github.com/alecthomas/repr v0.0.0-20181024024818-d37bc2a10ba1 // indirect
76
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc // indirect
87
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf // indirect
98
github.com/aws/aws-sdk-go v1.16.23
109
github.com/davecgh/go-spew v1.1.1 // indirect
1110
github.com/fatih/color v1.7.0
1211
github.com/ghodss/yaml v1.0.0
1312
github.com/kr/pretty v0.1.0 // indirect
14-
github.com/kr/pty v1.1.3 // indirect
1513
github.com/mattn/go-colorable v0.0.9 // indirect
1614
github.com/mattn/go-isatty v0.0.4 // indirect
1715
github.com/pkg/errors v0.8.1
18-
github.com/sergi/go-diff v1.0.0 // indirect
19-
github.com/stretchr/objx v0.1.1 // indirect
2016
github.com/stretchr/testify v1.3.0 // indirect
2117
golang.org/x/net v0.0.0-20190119204137-ed066c81e75e // indirect
2218
golang.org/x/sys v0.0.0-20190122071731-054c452bb702 // indirect

go.sum

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,13 @@
1-
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U=
2-
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI=
3-
github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo=
4-
github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0=
5-
github.com/alecthomas/repr v0.0.0-20181024024818-d37bc2a10ba1 h1:GDQdwm/gAcJcLAKQQZGOJ4knlw+7rfEQQcmwTbt4p5E=
6-
github.com/alecthomas/repr v0.0.0-20181024024818-d37bc2a10ba1/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ=
71
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU=
82
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
93
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf h1:qet1QNfXsQxTZqLG4oE62mJzwPIB8+Tee4RNCL9ulrY=
104
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
11-
github.com/aws/aws-sdk-go v0.0.0-20190104231327-923b7b1b0525 h1:qc2jx43HwaJSlY5UO/2cphRqZJElpLJlvJfJ4DkAqK0=
12-
github.com/aws/aws-sdk-go v0.0.0-20190104231327-923b7b1b0525/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
135
github.com/aws/aws-sdk-go v1.16.23 h1:MwBOBeez0XEFVh6DCc888X+nHVBCjUDLnnWXSGGWUgM=
146
github.com/aws/aws-sdk-go v1.16.23/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
157
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
168
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1710
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
18-
github.com/fatih/color v0.0.0-20170523202404-62e9147c64a1 h1:UisrPJO/eDu/ceQR8WPTVgTAyL8XnaKKWIEy7GTZhS0=
19-
github.com/fatih/color v0.0.0-20170523202404-62e9147c64a1/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
2011
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
2112
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
2213
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
@@ -26,44 +17,29 @@ github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht
2617
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
2718
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
2819
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
29-
github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
3020
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
3121
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
32-
github.com/mattn/go-colorable v0.0.8 h1:KatiXbcoFpoKmM5pL0yhug+tx/POfZO+0aVsuGhUhgo=
33-
github.com/mattn/go-colorable v0.0.8/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
3422
github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
3523
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
36-
github.com/mattn/go-isatty v0.0.2 h1:F+DnWktyadxnOrohKLNUC9/GjFii5RJgY4GFG6ilggw=
37-
github.com/mattn/go-isatty v0.0.2/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
3824
github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs=
3925
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
40-
github.com/pkg/errors v0.0.0-20170505043639-c605e284fe17 h1:chPfVn+gpAM5CTpTyVU9j8J+xgRGwmoDlNDLjKnJiYo=
41-
github.com/pkg/errors v0.0.0-20170505043639-c605e284fe17/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
4226
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
4327
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
4428
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4529
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
46-
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
47-
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
4830
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
49-
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
5031
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
5132
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
5233
golang.org/x/net v0.0.0-20190119204137-ed066c81e75e h1:MDa3fSUp6MdYHouVmCCNz/zaH2a6CRcxY3VhT/K3C5Q=
5334
golang.org/x/net v0.0.0-20190119204137-ed066c81e75e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
54-
golang.org/x/sys v0.0.0-20170615053224-fb4cac33e319 h1:VOzr22cZ/j39L4pIzz1fEBJewkELEkgJuuLZHCdzFRg=
55-
golang.org/x/sys v0.0.0-20170615053224-fb4cac33e319/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
35+
golang.org/x/sys v0.0.0-20190122071731-054c452bb702 h1:Lk4tbZFnlyPgV+sLgTw5yGfzrlOn9kx4vSombi2FFlY=
5636
golang.org/x/sys v0.0.0-20190122071731-054c452bb702/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
5737
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
5838
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
59-
gopkg.in/alecthomas/kingpin.v2 v2.2.4 h1:CC8tJ/xljioKrK6ii3IeWVXU4Tw7VB+LbjZBJaBxN50=
60-
gopkg.in/alecthomas/kingpin.v2 v2.2.4/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
6139
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
6240
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
6341
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6442
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
6543
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
66-
gopkg.in/yaml.v2 v2.0.0-20170407172122-cd8b52f8269e h1:o/mfNjxpTLivuKEfxzzwrJ8PmulH2wEp7t713uMwKAA=
67-
gopkg.in/yaml.v2 v2.0.0-20170407172122-cd8b52f8269e/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
6844
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
6945
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

iamy.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func main() {
3434
pull = kingpin.Command("pull", "Syncs IAM users, groups and policies from the active AWS account to files")
3535
pullDir = pull.Flag("dir", "The directory to dump yaml files to").Default(defaultDir).Short('d').String()
3636
canDelete = pull.Flag("delete", "Delete extraneous files from destination dir").Bool()
37+
lookupCfn = pull.Flag("accurate-cfn", "Fetch all known resource names from cloudformation to get exact filtering").Bool()
3738
push = kingpin.Command("push", "Syncs IAM users, groups and policies from files to the active AWS account")
3839
pushDir = push.Flag("dir", "The directory to load yaml files from").Default(defaultDir).Short('d').ExistingDir()
3940
)
@@ -68,8 +69,9 @@ func main() {
6869

6970
case pull.FullCommand():
7071
PullCommand(ui, PullCommandInput{
71-
Dir: *pullDir,
72-
CanDelete: *canDelete,
72+
Dir: *pullDir,
73+
CanDelete: *canDelete,
74+
HeuristicCfnMatching: !*lookupCfn,
7375
})
7476
}
7577
}

iamy/aws.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package iamy
33
import (
44
"fmt"
55
"log"
6-
"regexp"
76
"strings"
87
"sync"
98

@@ -12,18 +11,18 @@ import (
1211
"github.com/pkg/errors"
1312
)
1413

15-
var cfnResourceRegexp = regexp.MustCompile(`-[A-Z0-9]{10,20}$`)
16-
1714
// AwsFetcher fetches account data from AWS
1815
type AwsFetcher struct {
1916
// As Policy and Role descriptions are immutable, we can skip fetching them
2017
// when pushing to AWS
2118
SkipFetchingPolicyAndRoleDescriptions bool
19+
HeuristicCfnMatching bool
2220

2321
Debug *log.Logger
2422

2523
iam *iamClient
2624
s3 *s3Client
25+
cfn *cfnClient
2726
account *Account
2827
data AccountData
2928

@@ -37,6 +36,8 @@ func (a *AwsFetcher) init() error {
3736
s := awsSession()
3837
a.iam = newIamClient(s)
3938
a.s3 = newS3Client(s)
39+
a.cfn = newCfnClient(s)
40+
4041
if a.account, err = a.getAccount(); err != nil {
4142
return err
4243
}
@@ -53,6 +54,13 @@ func (a *AwsFetcher) Fetch() (*AccountData, error) {
5354
return nil, errors.Wrap(err, "Error in init")
5455
}
5556

57+
if !a.HeuristicCfnMatching {
58+
log.Println("Fetching CFN data")
59+
if err := a.cfn.PopulateMangedResourceData(); err != nil {
60+
return nil, errors.Wrap(err, "Error fetching CFN data")
61+
}
62+
}
63+
5664
var wg sync.WaitGroup
5765
var iamErr, s3Err error
5866

@@ -91,6 +99,10 @@ func (a *AwsFetcher) fetchS3Data() error {
9199
if b.policyJson == "" {
92100
continue
93101
}
102+
if ok, err := a.isSkippableManagedResource(CfnS3Bucket, b.name); ok {
103+
log.Printf(err)
104+
continue
105+
}
94106

95107
policyDoc, err := NewPolicyDocumentFromJson(b.policyJson)
96108
if err != nil {
@@ -107,6 +119,7 @@ func (a *AwsFetcher) fetchS3Data() error {
107119

108120
return nil
109121
}
122+
110123
func (a *AwsFetcher) fetchIamData() error {
111124
var populateIamDataErr error
112125
var populateInstanceProfileErr error
@@ -196,7 +209,7 @@ func (a *AwsFetcher) marshalRoleDescriptionAsync(roleName string, target *string
196209

197210
func (a *AwsFetcher) populateInstanceProfileData(resp *iam.ListInstanceProfilesOutput) error {
198211
for _, profileResp := range resp.InstanceProfiles {
199-
if ok, err := isSkippableManagedResource(*profileResp.InstanceProfileName); ok {
212+
if ok, err := a.isSkippableManagedResource(CfnInstanceProfile, *profileResp.InstanceProfileName); ok {
200213
log.Printf(err)
201214
continue
202215
}
@@ -216,7 +229,7 @@ func (a *AwsFetcher) populateInstanceProfileData(resp *iam.ListInstanceProfilesO
216229

217230
func (a *AwsFetcher) populateIamData(resp *iam.GetAccountAuthorizationDetailsOutput) error {
218231
for _, userResp := range resp.UserDetailList {
219-
if ok, err := isSkippableManagedResource(*userResp.UserName); ok {
232+
if ok, err := a.isSkippableManagedResource(CfnIamUser, *userResp.UserName); ok {
220233
log.Printf(err)
221234
continue
222235
}
@@ -246,7 +259,7 @@ func (a *AwsFetcher) populateIamData(resp *iam.GetAccountAuthorizationDetailsOut
246259
}
247260

248261
for _, groupResp := range resp.GroupDetailList {
249-
if ok, err := isSkippableManagedResource(*groupResp.GroupName); ok {
262+
if ok, err := a.isSkippableManagedResource(CfnIamGroup, *groupResp.GroupName); ok {
250263
log.Printf(err)
251264
continue
252265
}
@@ -267,7 +280,7 @@ func (a *AwsFetcher) populateIamData(resp *iam.GetAccountAuthorizationDetailsOut
267280
}
268281

269282
for _, roleResp := range resp.RoleDetailList {
270-
if ok, err := isSkippableManagedResource(*roleResp.RoleName); ok {
283+
if ok, err := a.isSkippableManagedResource(CfnIamRole, *roleResp.RoleName); ok {
271284
log.Printf(err)
272285
continue
273286
}
@@ -297,7 +310,7 @@ func (a *AwsFetcher) populateIamData(resp *iam.GetAccountAuthorizationDetailsOut
297310
}
298311

299312
for _, policyResp := range resp.Policies {
300-
if ok, err := isSkippableManagedResource(*policyResp.PolicyName); ok {
313+
if ok, err := a.isSkippableManagedResource(CfnIamPolicy, *policyResp.PolicyName); ok {
301314
log.Printf(err)
302315
continue
303316
}
@@ -390,8 +403,8 @@ func (a *AwsFetcher) getAccount() (*Account, error) {
390403
//
391404
// Returns a boolean of whether it can be skipped and a string of the
392405
// reasoning why it was skipped.
393-
func isSkippableManagedResource(resourceIdentifier string) (bool, string) {
394-
if cfnResourceRegexp.MatchString(resourceIdentifier) {
406+
func (a *AwsFetcher) isSkippableManagedResource(cfnType CfnResourceType, resourceIdentifier string) (bool, string) {
407+
if a.cfn.IsManagedResource(cfnType, resourceIdentifier) {
395408
return true, fmt.Sprintf("CloudFormation generated resource %s", resourceIdentifier)
396409
}
397410

iamy/aws_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ func TestIsSkippableManagedResource(t *testing.T) {
1717
"myalias-123/iam/instance-profile/example.yaml",
1818
}
1919

20+
f := AwsFetcher{cfn: &cfnClient{}}
21+
2022
for _, name := range skippables {
2123
t.Run(name, func(t *testing.T) {
2224

23-
skipped, err := isSkippableManagedResource(name)
25+
skipped, err := f.isSkippableManagedResource(CfnIamRole, name)
2426
if skipped == false {
2527
t.Errorf("expected %s to be skipped but got false", name)
2628
}
@@ -34,7 +36,7 @@ func TestIsSkippableManagedResource(t *testing.T) {
3436
for _, name := range nonSkippables {
3537
t.Run(name, func(t *testing.T) {
3638

37-
skipped, err := isSkippableManagedResource(name)
39+
skipped, err := f.isSkippableManagedResource(CfnIamRole, name)
3840
if skipped == true {
3941
t.Errorf("expected %s to not be skipped but got true", name)
4042
}

0 commit comments

Comments
 (0)