mirror of https://github.com/kubernetes/kops.git
Merge pull request #14151 from olemarkus/plug-iam-role-leak
Plug the IAM role leak
This commit is contained in:
commit
e1fcbd6af2
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
"github.com/aws/aws-sdk-go/service/autoscaling"
|
"github.com/aws/aws-sdk-go/service/autoscaling"
|
||||||
"github.com/aws/aws-sdk-go/service/cloudformation"
|
"github.com/aws/aws-sdk-go/service/cloudformation"
|
||||||
"github.com/aws/aws-sdk-go/service/ec2"
|
"github.com/aws/aws-sdk-go/service/ec2"
|
||||||
|
|
@ -1998,16 +1999,19 @@ func ListIAMRoles(cloud fi.Cloud, clusterName string) ([]*resources.Resource, er
|
||||||
err := c.IAM().ListRolesPages(request, func(p *iam.ListRolesOutput, lastPage bool) bool {
|
err := c.IAM().ListRolesPages(request, func(p *iam.ListRolesOutput, lastPage bool) bool {
|
||||||
for _, r := range p.Roles {
|
for _, r := range p.Roles {
|
||||||
name := aws.StringValue(r.RoleName)
|
name := aws.StringValue(r.RoleName)
|
||||||
if !strings.HasSuffix(name, "."+clusterName) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
getRequest := &iam.GetRoleInput{RoleName: r.RoleName}
|
getRequest := &iam.GetRoleInput{RoleName: r.RoleName}
|
||||||
roleOutput, err := c.IAM().GetRole(getRequest)
|
roleOutput, err := c.IAM().GetRole(getRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if awserror, ok := err.(awserr.RequestFailure); ok && awserror.StatusCode() == 403 {
|
||||||
|
klog.Warningf("failed to determine ownership of %q: %v", *r.RoleName, awserror)
|
||||||
|
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
getRoleErr = fmt.Errorf("calling IAM GetRole on %s: %w", name, err)
|
getRoleErr = fmt.Errorf("calling IAM GetRole on %s: %w", name, err)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
for _, tag := range roleOutput.Role.Tags {
|
for _, tag := range roleOutput.Role.Tags {
|
||||||
if fi.StringValue(tag.Key) == ownershipTag && fi.StringValue(tag.Value) == "owned" {
|
if fi.StringValue(tag.Key) == ownershipTag && fi.StringValue(tag.Value) == "owned" {
|
||||||
resourceTracker := &resources.Resource{
|
resourceTracker := &resources.Resource{
|
||||||
|
|
@ -2080,9 +2084,6 @@ func ListIAMInstanceProfiles(cloud fi.Cloud, clusterName string) ([]*resources.R
|
||||||
err := c.IAM().ListInstanceProfilesPages(request, func(p *iam.ListInstanceProfilesOutput, lastPage bool) bool {
|
err := c.IAM().ListInstanceProfilesPages(request, func(p *iam.ListInstanceProfilesOutput, lastPage bool) bool {
|
||||||
for _, p := range p.InstanceProfiles {
|
for _, p := range p.InstanceProfiles {
|
||||||
name := aws.StringValue(p.InstanceProfileName)
|
name := aws.StringValue(p.InstanceProfileName)
|
||||||
if !strings.HasSuffix(name, "."+clusterName) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
getRequest := &iam.GetInstanceProfileInput{InstanceProfileName: p.InstanceProfileName}
|
getRequest := &iam.GetInstanceProfileInput{InstanceProfileName: p.InstanceProfileName}
|
||||||
profileOutput, err := c.IAM().GetInstanceProfile(getRequest)
|
profileOutput, err := c.IAM().GetInstanceProfile(getRequest)
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,9 @@ import (
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/service/ec2"
|
"github.com/aws/aws-sdk-go/service/ec2"
|
||||||
"github.com/aws/aws-sdk-go/service/elb"
|
"github.com/aws/aws-sdk-go/service/elb"
|
||||||
|
"github.com/aws/aws-sdk-go/service/iam"
|
||||||
"k8s.io/kops/cloudmock/aws/mockec2"
|
"k8s.io/kops/cloudmock/aws/mockec2"
|
||||||
|
"k8s.io/kops/cloudmock/aws/mockiam"
|
||||||
"k8s.io/kops/pkg/resources"
|
"k8s.io/kops/pkg/resources"
|
||||||
"k8s.io/kops/upup/pkg/fi"
|
"k8s.io/kops/upup/pkg/fi"
|
||||||
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
|
"k8s.io/kops/upup/pkg/fi/cloudup/awsup"
|
||||||
|
|
@ -92,6 +94,72 @@ func TestAddUntaggedRouteTables(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestListIAMRoles(t *testing.T) {
|
||||||
|
cloud := awsup.BuildMockAWSCloud("us-east-1", "abc")
|
||||||
|
// resources := make(map[string]*Resource)
|
||||||
|
clusterName := "me.example.com"
|
||||||
|
ownershipTagKey := "kubernetes.io/cluster/" + clusterName
|
||||||
|
|
||||||
|
c := &mockiam.MockIAM{
|
||||||
|
Roles: make(map[string]*iam.Role),
|
||||||
|
}
|
||||||
|
cloud.MockIAM = c
|
||||||
|
|
||||||
|
tags := []*iam.Tag{
|
||||||
|
{
|
||||||
|
Key: &ownershipTagKey,
|
||||||
|
Value: fi.String("owned"),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
name := "prefixed." + clusterName
|
||||||
|
|
||||||
|
c.Roles[name] = &iam.Role{
|
||||||
|
RoleName: &name,
|
||||||
|
Tags: tags,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
|
||||||
|
name := clusterName + ".not-prefixed"
|
||||||
|
|
||||||
|
c.Roles[name] = &iam.Role{
|
||||||
|
RoleName: &name,
|
||||||
|
Tags: tags,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name := "prefixed2." + clusterName
|
||||||
|
owner := "kubernetes.io/cluster/foo." + clusterName
|
||||||
|
c.Roles[name] = &iam.Role{
|
||||||
|
RoleName: &name,
|
||||||
|
Tags: []*iam.Tag{
|
||||||
|
{
|
||||||
|
Key: &owner,
|
||||||
|
Value: fi.String("owned"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
name := "prefixed3." + clusterName
|
||||||
|
c.Roles[name] = &iam.Role{
|
||||||
|
RoleName: &name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resourceTrackers, err := ListIAMRoles(cloud, clusterName)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("error listing IAM roles: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(resourceTrackers) != 2 {
|
||||||
|
t.Errorf("Unexpected number of resources to delete. Expected 2, got %d", len(resourceTrackers))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestListRouteTables(t *testing.T) {
|
func TestListRouteTables(t *testing.T) {
|
||||||
cloud := awsup.BuildMockAWSCloud("us-east-1", "abc")
|
cloud := awsup.BuildMockAWSCloud("us-east-1", "abc")
|
||||||
// resources := make(map[string]*Resource)
|
// resources := make(map[string]*Resource)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue