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 +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +34 -0
- data/Rakefile +1 -0
- data/assumer.gemspec +31 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/exe/.rubocop.yml +4 -0
- data/exe/assumer +175 -0
- data/lib/assumer.rb +110 -0
- data/lib/assumer/version.rb +3 -0
- data/lib/mfa.rb +19 -0
- metadata +132 -0
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
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
data/exe/.rubocop.yml
ADDED
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
|
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: []
|