assumer 0.4.1a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []