assumer 0.4.1a

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0040c2a8af4e270a7ece881c71b5697aeab7ac8f
4
+ data.tar.gz: 84b37cdfc3ab9d03ea47f24bb1aca1cc44a73c19
5
+ SHA512:
6
+ metadata.gz: 0de21876310eec88959970b68c998e7e6559e6aa143931241297b49cd5c8e359c778475d33e179d055c8a19de4bf4cb596ff7f0d3409bd04a13c64fbc1a3ba31
7
+ data.tar.gz: 6f138e89278f33f2a0f2c543df35715c2c00b1ddde1dd82b78483b484067861cc7a51d478553bdbdaf7687b97b33f1e2927b8a28fa750b7b3d272780bdee9f95
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in assumer.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,34 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ assumer (0.2.2)
5
+ aws-sdk-core (~> 2.1, >= 2.1.1)
6
+ pry (~> 0)
7
+ trollop (= 2.1.2)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ aws-sdk-core (2.1.26)
13
+ jmespath (~> 1.0)
14
+ coderay (1.1.0)
15
+ jmespath (1.1.3)
16
+ method_source (0.8.2)
17
+ pry (0.10.2)
18
+ coderay (~> 1.1.0)
19
+ method_source (~> 0.8.1)
20
+ slop (~> 3.4)
21
+ rake (10.4.2)
22
+ slop (3.6.0)
23
+ trollop (2.1.2)
24
+
25
+ PLATFORMS
26
+ ruby
27
+
28
+ DEPENDENCIES
29
+ assumer!
30
+ bundler (~> 1.10)
31
+ rake (~> 10.0)
32
+
33
+ BUNDLED WITH
34
+ 1.10.6
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
data/assumer.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'assumer/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'assumer'
8
+ spec.version = Assumer::VERSION
9
+ spec.authors = ['Brandon Sherman']
10
+ spec.email = ['mechcozmo@gmail.com']
11
+
12
+ spec.summary = 'This gem provides the functionality to Assume Role in AWS'
13
+ spec.description = 'Allows for single or double-jumps through AWS accounts in order to assume a role in a target account'
14
+ spec.homepage = 'https://github.com/devsecops/assumer'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = 'exe'
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.executables.reject! { |f| f == '.rubocop.yml' }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.10'
23
+ spec.add_development_dependency 'rake', '~> 10.0'
24
+ # Requires Ruby 2.1 or higher; 2.0 is buggy
25
+ spec.required_ruby_version = '>= 2.1'
26
+ # There is a race condition in the aws-sdk-core gem 2.1.0.
27
+ # This constraint says 2.1.1 and up, but don't go to 2.2
28
+ spec.add_dependency 'aws-sdk-core', '~> 2.1', '>= 2.1.1'
29
+ spec.add_dependency 'pry', '~>0'
30
+ spec.add_dependency 'trollop', '2.1.2'
31
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'assumer'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ require 'pry'
11
+ Pry.start
12
+
13
+ # require "irb"
14
+ # IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/exe/.rubocop.yml ADDED
@@ -0,0 +1,4 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.1
3
+ LineLength:
4
+ Max: 100
data/exe/assumer ADDED
@@ -0,0 +1,175 @@
1
+ #! /usr/bin/env ruby
2
+ require 'pry' # External gem
3
+ require 'trollop' # External gem
4
+
5
+ require 'tempfile' # Ruby core
6
+ require 'net/http' # Ruby core
7
+ require 'rbconfig' # Ruby core
8
+
9
+ require 'assumer' # This gem
10
+
11
+ parsed_options = Trollop::options do
12
+ version "Assumer v#{Assumer::VERSION}"
13
+ banner 'Parameters:'
14
+ opt :target_account, 'Target AWS account to assume into', short: '-a', type: :string
15
+ opt :target_role, 'The role in the target account', short: '-r', type: :string
16
+ opt :control_account, 'Control Plane AWS account', short: '-A', type: :string
17
+ opt :control_role, 'The role in the control account', short: '-R', type: :string
18
+ banner 'These parameters are optional:'
19
+ opt :region, 'AWS region to operate in', default: 'us-east-1', type: :string
20
+ opt :username, 'Your IAM username', short: '-u', default: `whoami`.chomp, type: :string
21
+ opt :profile, 'Profile name from ~/.aws/credentials', short: '-o', type: :string
22
+ opt :gui, 'Open a web browser to the AWS console with these credentials'
23
+ opt :pry, 'Open a pry shell with these credentials', short: '-p'
24
+ opt :enable_aws_bundled_ca_cert, 'Option to enable the certificate store bundled with the AWS SDK'
25
+ opt :debug, 'Output debugging information'
26
+ end
27
+
28
+ DEBUG_FLAG = parsed_options[:debug]
29
+ warn "Options understood to be the following:\n#{parsed_options}" if DEBUG_FLAG
30
+
31
+ Trollop::die :target_account, 'Must be a 12-digit AWS account number' unless parsed_options[:target_account] =~ /\d{12}/
32
+ Trollop::die :control_account, 'Must be a 12-digit AWS account number' unless parsed_options[:control_account] =~ /\d{12}/
33
+
34
+ mfa_serial_number = "arn:aws:iam::#{parsed_options[:control_account]}:mfa/#{parsed_options[:username]}"
35
+ control_plane_role = "arn:aws:iam::#{parsed_options[:control_account]}:role/#{parsed_options[:control_role]}"
36
+ target_account_role = "arn:aws:iam::#{parsed_options[:target_account]}:role/#{parsed_options[:target_role]}"
37
+
38
+ warn "MFA Serial Number: #{mfa_serial_number}" if DEBUG_FLAG
39
+ warn "Control Plane Role: #{control_plane_role}" if DEBUG_FLAG
40
+ warn "Target Account Role: #{target_account_role}" if DEBUG_FLAG
41
+
42
+ puts <<EOF
43
+ #{parsed_options[:username]} is assuming
44
+ #{target_account_role}
45
+ via
46
+ #{control_plane_role}
47
+ EOF
48
+
49
+ # AWS SDK includes a certificate store that is disabled by default
50
+ # This is to allow the system certificates to take precedent
51
+ # If a system's CA store is botched, you can enable the bundled cert. store
52
+ # https://github.com/aws/aws-sdk-core-ruby/issues/166#issuecomment-111603660
53
+ if parsed_options[:enable_aws_bundled_ca_cert]
54
+ warn '>>> AWS bunled CA certificate enabled <<< ' if DEBUG_FLAG
55
+ Aws.use_bundled_cert!
56
+ end
57
+
58
+ def debug_credential_output(credentials:)
59
+ " Access Key Id: #{credentials.access_key_id[0..5]}...#{credentials.access_key_id[-4..-1]}
60
+ Secret Access Key: #{credentials.secret_access_key[0..5]}...#{credentials.secret_access_key[-4..-1]}
61
+ Session Token: #{credentials.session_token[0..5]}...#{credentials.session_token[-4..-1]}"
62
+ end
63
+
64
+ # First jump
65
+ control_creds = Assumer::Assumer.new(
66
+ region: parsed_options[:region],
67
+ account: parsed_options[:control_account],
68
+ role: control_plane_role,
69
+ serial_number: mfa_serial_number,
70
+ profile: parsed_options[:profile]
71
+ )
72
+ if DEBUG_FLAG
73
+ warn 'First Jump Credentials:'
74
+ warn debug_credential_output(credentials: control_creds.assume_role_credentials.credentials)
75
+ end
76
+
77
+ # Second jump
78
+ target_creds = Assumer::Assumer.new(
79
+ region: parsed_options[:region],
80
+ account: parsed_options[:target_account],
81
+ role: target_account_role,
82
+ credentials: control_creds
83
+ )
84
+ if DEBUG_FLAG
85
+ warn 'Second Jump Credentials:'
86
+ warn debug_credential_output(credentials: target_creds.assume_role_credentials.credentials)
87
+ end
88
+
89
+ region = parsed_options[:region]
90
+ aws_access_key_id = target_creds.assume_role_credentials.credentials.access_key_id
91
+ aws_secret_access_key = target_creds.assume_role_credentials.credentials.secret_access_key
92
+ aws_session_token = target_creds.assume_role_credentials.credentials.session_token
93
+
94
+ # Write to a file for the user to pull into their own shell if they'd like
95
+ file = Tempfile.new('assumer')
96
+ warn "Writing temp file #{file.path}" if DEBUG_FLAG
97
+ # Prevents tempfile from being deleted when the Ruby object is garbage collected
98
+ ObjectSpace.undefine_finalizer(file)
99
+
100
+ # Write a different file depending on UNIX or Windows
101
+ if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
102
+ output = <<-EOF.gsub(/^ {2}/, '')
103
+ set AWS_REGION=#{region}
104
+ set AWS_ACCESS_KEY_ID=#{aws_access_key_id}
105
+ set AWS_SECRET_ACCESS_KEY=#{aws_secret_access_key}
106
+ set AWS_SESSION_TOKEN=#{aws_session_token}
107
+ EOF
108
+ puts "To import these values into the shell, execute .\\'#{file.path}'\n"
109
+ elsif RbConfig::CONFIG['host_os'] =~ /linux|bsd|darwin/
110
+ output = <<-EOF.gsub(/^ {2}/, '')
111
+ export AWS_REGION=#{region}
112
+ export AWS_ACCESS_KEY_ID=#{aws_access_key_id}
113
+ export AWS_SECRET_ACCESS_KEY=#{aws_secret_access_key}
114
+ export AWS_SESSION_TOKEN=#{aws_session_token}
115
+ EOF
116
+ puts "To import these values into the shell, source '#{file.path}'\n"
117
+ end
118
+
119
+ file.write(output)
120
+ file.close
121
+ warn "File '#{file.path}' closed" if DEBUG_FLAG
122
+
123
+ # If GUI option was set, open default browser with creds into the account
124
+ if parsed_options[:gui]
125
+ print "Generating signin URL to #{parsed_options[:target_account]}..."
126
+ issuer_url = 'assumer'
127
+ console_url = 'https://console.aws.amazon.com/'
128
+ signin_url = 'https://signin.aws.amazon.com/federation'
129
+ # Compose credential block used to request login token
130
+ session_json = {
131
+ sessionId: aws_access_key_id,
132
+ sessionKey: aws_secret_access_key,
133
+ sessionToken: aws_session_token
134
+ }.to_json
135
+
136
+ # Request signin token from Federation endpoint (valid for 15 minutes)
137
+ signin_token_url = <<-EOF.gsub(/^ {2}/, '')
138
+ #{signin_url}?Action=getSigninToken&SessionType=json&Session=#{CGI.escape(session_json)}
139
+ EOF
140
+ returned_content = Net::HTTP.get(URI.parse(signin_token_url))
141
+
142
+ # Extract the signin token from the information returned by the federation endpoint.
143
+ signin_token = JSON.parse(returned_content).fetch('SigninToken', {})
144
+
145
+ signin_token_param = "&SigninToken=#{CGI.escape(signin_token)}"
146
+
147
+ # Create the URL to give to the user, which includes the
148
+ # signin token and the URL of the console to open.
149
+ # The 'issuer' parameter is optional but recommended.
150
+ issuer_param = "&Issuer=#{CGI.escape(issuer_url)}"
151
+ destination_param = "&Destination=#{CGI.escape(console_url)}"
152
+ # Generate the signin URL, clean up the string
153
+ login_url = <<-EOF.gsub(/^ {2}/, '').chomp
154
+ #{signin_url}?Action=login#{signin_token_param}#{issuer_param}#{destination_param}
155
+ EOF
156
+ puts "Login URL is:\n#{login_url}"
157
+
158
+ # Depending on the system we are running on, use the appropriate
159
+ # system command to launch the default browser
160
+ if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
161
+ # On Windows, it matters what kind of quotes you use...
162
+ warn "System command is: 'start \"\" \"#{login_url}\"'" if DEBUG_FLAG
163
+ system "start \"\" \"#{login_url}\""
164
+ elsif RbConfig::CONFIG['host_os'] =~ /darwin/
165
+ warn 'System command is: ' + "open '#{login_url}'" if DEBUG_FLAG
166
+ system "open '#{login_url}'"
167
+ elsif RbConfig::CONFIG['host_os'] =~ /linux|bsd/
168
+ warn 'System command is: ' + "xdg-open '#{login_url}'" if DEBUG_FLAG
169
+ system "xdg-open '#{login_url}'"
170
+ end
171
+ # If a pry shell was requested, deliver one with credentials available
172
+ elsif parsed_options[:pry]
173
+ puts "Your Assumer object within pry is 'target_creds'"
174
+ binding.pry(quiet: true)
175
+ end
data/lib/assumer.rb ADDED
@@ -0,0 +1,110 @@
1
+ require 'assumer/version'
2
+ require 'aws-sdk-core'
3
+ require 'mfa'
4
+
5
+ module Assumer
6
+ # The regex that AWS uses to verify if a role's ARN is valid
7
+ AWS_ROLE_REGEX = %r{arn:aws:iam::\d{12}:role/?[a-zA-Z_0-9+=,.@\-_/]+}
8
+ class AssumerError < StandardError; end
9
+ # This class provides the main functionallity to the Assumer gem
10
+
11
+ class Assumer
12
+ # This is the only thing clients are allowed to access
13
+ # It will be an STS::AssumeRoleCredentials object created by AWS
14
+ attr_accessor :assume_role_credentials
15
+
16
+ ##
17
+ # Creates the Assumer object
18
+ #
19
+ # @param [String] region The AWS region to establish a connection from (if left nil, Assumer will try and use it's current region)
20
+ # @param [String] account The AWS account number without dashes
21
+ # @param [String] role The ARN for the role to assume
22
+ # @param [String] serial_number The Serial Number of an MFA device
23
+ # @param [Assumer] credentials An assumer object (to support double-jumps)
24
+
25
+ def initialize(region: nil, account: nil, role: nil, serial_number: nil, credentials: nil, profile: nil)
26
+ @region = region ? region : my_region # if region is passed in, use it, otherwise find what region we're in and use that
27
+ @account = account
28
+ @role = verify_role(role: role)
29
+ # If we are being passed credentials, it's an Assumer instance, and we can
30
+ # get the creds from it. Otherwise, establish an STS connection
31
+ @sts_client = establish_sts(
32
+ region: @region,
33
+ passed_credentials: credentials,
34
+ credentials_profile: profile
35
+ )
36
+ @serial_number = serial_number # ARN for the user's MFA serial number
37
+
38
+ opts = {
39
+ client: @sts_client,
40
+ role_arn: @role,
41
+ role_session_name: 'AssumedRole'
42
+ }
43
+ # Don't specify MFA serial number or token code if they aren't needed
44
+ unless @serial_number.nil?
45
+ opts[:serial_number] = @serial_number
46
+ opts[:token_code] = MFA.new.request_one_time_code
47
+ end
48
+ @assume_role_credentials = Aws::AssumeRoleCredentials.new(opts)
49
+
50
+ rescue Aws::STS::Errors::AccessDenied => e
51
+ raise AssumerError, "Access Denied: #{e.message}"
52
+ end
53
+
54
+ ##
55
+ # Verifies the requested role is valid
56
+ # Only checks syntax, does not guarantee the role exists or can be assumed into
57
+ # @param [String] role The ARN of the role to be verified
58
+ # @return [String] The ARN of a valid role
59
+ # @raise [AssumerError] If the ARN is invalid, an exception is raised
60
+ def verify_role(role:)
61
+ raise AssumerError, "Invalid ARN for role #{role}" unless role =~ AWS_ROLE_REGEX
62
+ role
63
+ end
64
+
65
+ private
66
+
67
+ ##
68
+ # Establish an AWS STS connection to retrieve tokens
69
+ # @param [String] region An AWS region to establish a connection in
70
+ # @param [Assumer] passed_credentials An Assumer object that has established a connection to an account. Used for double-jumps.
71
+ # @param [String] credentials_profile The credentials profile to load from the user's .aws/credentials file
72
+ # @return [Aws::STS::Client] The Secure Token Service client
73
+ def establish_sts(region: nil, passed_credentials: nil, credentials_profile: nil)
74
+ throw AssumerError.new('No region provided') if region.nil?
75
+ opts = { region: region }
76
+
77
+ # If credentials were passed in, use those to build the STS client
78
+ opts.merge!(
79
+ access_key_id: passed_credentials.assume_role_credentials.credentials.access_key_id,
80
+ secret_access_key: passed_credentials.assume_role_credentials.credentials.secret_access_key,
81
+ session_token: passed_credentials.assume_role_credentials.credentials.session_token
82
+ ) unless passed_credentials.nil?
83
+
84
+ # If a profile is specified, read those from the ~/.aws/credentials file
85
+ # Or anywhere AWS STS Client knows where to load them from
86
+ opts[:profile] = credentials_profile unless credentials_profile.nil?
87
+ @sts_client = Aws::STS::Client.new(opts)
88
+ end
89
+
90
+ ##
91
+ # Determine the region this code is being called in by contacting the AWS
92
+ # metadata service
93
+ # @return [String] AWS Region Assumer is being called in OR 'us-east-1' if unable to be determined
94
+ # @raise [AssumerError] If the region cannot be determined, an exception is raised
95
+ def my_region
96
+ require 'net/http'
97
+ require 'json'
98
+ metadata_uri = URI('http://169.254.169.254/latest/dynamic/instance-identity/document/')
99
+ request = Net::HTTP::Get.new(metadata_uri.path)
100
+ response = Net::HTTP.start(metadata_uri.host, metadata_uri.port) do |http|
101
+ http.read_timeout = 10
102
+ http.open_timeout = 10
103
+ http.request(request)
104
+ end
105
+ JSON.parse(response).fetch('region', 'us-east-1')
106
+ rescue => e
107
+ raise AssumerError, "Could not determine region (are you running in AWS?): #{e.message}"
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,3 @@
1
+ module Assumer
2
+ VERSION = '0.4.1a'.freeze
3
+ end
data/lib/mfa.rb ADDED
@@ -0,0 +1,19 @@
1
+ module Assumer
2
+ ##
3
+ # A class to manage methods of obtaining OTP codes for MFA
4
+ class MFA
5
+ attr_reader :otp
6
+ ##
7
+ # A method to prompt for the user's OTP MFA code on the CLI
8
+ # @return [String] The MFA code entered by the user
9
+ def request_one_time_code
10
+ until @otp =~ /\d{6}/
11
+ print 'Enter MFA: '
12
+ $stdout.flush
13
+ @otp = $stdin.gets(7).chomp
14
+ $stderr.puts 'MFA code should be 6 digits' if @otp !~ /\d{6}/
15
+ end
16
+ @otp
17
+ end
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,132 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: assumer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.1a
5
+ platform: ruby
6
+ authors:
7
+ - Brandon Sherman
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-06-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: aws-sdk-core
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.1'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 2.1.1
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '2.1'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 2.1.1
61
+ - !ruby/object:Gem::Dependency
62
+ name: pry
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: trollop
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '='
80
+ - !ruby/object:Gem::Version
81
+ version: 2.1.2
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '='
87
+ - !ruby/object:Gem::Version
88
+ version: 2.1.2
89
+ description: Allows for single or double-jumps through AWS accounts in order to assume
90
+ a role in a target account
91
+ email:
92
+ - mechcozmo@gmail.com
93
+ executables:
94
+ - assumer
95
+ extensions: []
96
+ extra_rdoc_files: []
97
+ files:
98
+ - Gemfile
99
+ - Gemfile.lock
100
+ - Rakefile
101
+ - assumer.gemspec
102
+ - bin/console
103
+ - bin/setup
104
+ - exe/.rubocop.yml
105
+ - exe/assumer
106
+ - lib/assumer.rb
107
+ - lib/assumer/version.rb
108
+ - lib/mfa.rb
109
+ homepage: https://github.com/devsecops/assumer
110
+ licenses: []
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '2.1'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">"
124
+ - !ruby/object:Gem::Version
125
+ version: 1.3.1
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.4.5.1
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: This gem provides the functionality to Assume Role in AWS
132
+ test_files: []