mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-11-04 04:28:08 +00:00 
			
		
		
		
	Check if there's a bound iam arn when renewing (#2819)
Previously, the renew method would ALWAYS check to ensure the authenticated IAM principal ARN matched the bound ARN. However, there is a valid use case in which no bound_iam_principal_arn is specified and all bindings are done through inferencing. When a role is configured like this, clients won't be able to renew their token because of the check. This now checks to ensure that the bound_iam_principal_arn is not empty before requriing that it match the originally authenticated client. Fixes #2781
This commit is contained in:
		
				
					committed by
					
						
						Jeff Mitchell
					
				
			
			
				
	
			
			
			
						parent
						
							cf6c3d7729
						
					
				
				
					commit
					ee55e36af6
				
			@@ -922,8 +922,18 @@ func (b *backend) pathLoginRenewIam(
 | 
			
		||||
		return nil, fmt.Errorf("role entry not found")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if entityType, ok := req.Auth.Metadata["inferred_entity_type"]; !ok {
 | 
			
		||||
		if entityType == ec2EntityType {
 | 
			
		||||
	// we don't really care what the inferred entity type was when the role was initially created. We
 | 
			
		||||
	// care about what the role currently requires. However, the metadata's inferred_entity_id is only
 | 
			
		||||
	// set when inferencing is turned on at initial login time. So, if inferencing is turned on, any
 | 
			
		||||
	// existing roles will NOT be able to renew tokens.
 | 
			
		||||
	// This might change later, but authenticating the actual inferred entity ID is NOT done if there
 | 
			
		||||
	// is no inferencing requested in the role. The reason is that authenticating the inferred entity
 | 
			
		||||
	// ID requires additional AWS IAM permissions that might not be present (e.g.,
 | 
			
		||||
	// ec2:DescribeInstances) as well as additional inferencing configuration (the inferred region).
 | 
			
		||||
	// So, for now, if you want to turn on inferencing, all clients must re-authenticate and cannot
 | 
			
		||||
	// renew existing tokens.
 | 
			
		||||
	if roleEntry.InferredEntityType != "" {
 | 
			
		||||
		if roleEntry.InferredEntityType == ec2EntityType {
 | 
			
		||||
			instanceID, ok := req.Auth.Metadata["inferred_entity_id"]
 | 
			
		||||
			if !ok {
 | 
			
		||||
				return nil, fmt.Errorf("no inferred entity ID in auth metadata")
 | 
			
		||||
@@ -937,11 +947,16 @@ func (b *backend) pathLoginRenewIam(
 | 
			
		||||
				return nil, fmt.Errorf("failed to verify instance ID %q: %v", instanceID, err)
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			return nil, fmt.Errorf("unrecognized entity_type in metadata: %q", entityType)
 | 
			
		||||
			return nil, fmt.Errorf("unrecognized entity_type in metadata: %q", roleEntry.InferredEntityType)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if roleEntry.BoundIamPrincipalARN != canonicalArn {
 | 
			
		||||
	// The role may have been specified with only bindings on the inferred entity. The
 | 
			
		||||
	// creation/modification of roles ensures that there is always at least one valid binding, and
 | 
			
		||||
	// those bindings are either with a bound_iam_principal_arn or bindings on the inferred enttity.
 | 
			
		||||
	// If the bound_iam_principal_arn is set to "", then that means all the bindings were set on the
 | 
			
		||||
	// inferred entity type and already checked, so we don't need to check bound_iam_principal_arn.
 | 
			
		||||
	if roleEntry.BoundIamPrincipalARN != "" && roleEntry.BoundIamPrincipalARN != canonicalArn {
 | 
			
		||||
		return nil, fmt.Errorf("role no longer bound to arn %q", canonicalArn)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1413,7 +1413,9 @@ The response will be in JSON. For example:
 | 
			
		||||
        When set, instructs Vault to turn on inferencing. The only current valid
 | 
			
		||||
        value is "ec2_instance" instructing Vault to infer that the role comes
 | 
			
		||||
        from an EC2 instance in an IAM instance profile. This only applies to
 | 
			
		||||
        the iam auth method.
 | 
			
		||||
        the iam auth method. If you set this on an existing role where it had
 | 
			
		||||
        not previously been set, tokens that had been created prior will not be
 | 
			
		||||
        renewable; clients will need to get a new token.
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
    <ul>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user