aws-session-credentials 1.0.0.pre.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZWJiNTBkOGI2ZDFkNmExM2JkNTFiOWNmMmM3OGI3ZTUzY2JiN2M2OA==
4
+ Mjk2MmNjOTU3YTczYTY3MjIxNWY4NzM3MDA2MDI1OTQ1MjEzMjllMg==
5
5
  data.tar.gz: !binary |-
6
- YzRlMTJjYzA0MzQ4MmFkNGI0YjlhMGEyZTFhNTJmNTE2NDYwNWQ5Mw==
6
+ MzMxZDgyYmY5YzBhMTZlMDU4NzE5MGFjNDc4NDk3NzE3OGQ1NmI1Nw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NWExNTE2ZjQyMzg1M2I0ZDdmNmYyNGQ0NDE4YWE3MTM2YTA4ZGQyMGNiNTRm
10
- YWJkOTFkNmQ3MTI4NDI5MzlhMWM3MWJkODM2ZDYyMDgxMzBiNDY3YzAxODk0
11
- YzEyNzY2YjAxMGRkMDU3NmIwZGRkNjAzN2Y3YWI1NjQ1MTlkY2I=
9
+ NzhjNDI4ZjFlZGE4N2QxNjc2MTYxOWI1Mzg4NWI0NWNiMzM1MDI5ZWQ1MTM0
10
+ NDYyYzQzN2YxNjEwNmI0YTM1NmExN2RkZjU1MjI2ZjBmZDZiOTg3N2ZlNDMy
11
+ MTExOWE5NWZhNzk5ZGMwOTY2ZWY3NzQ0NjZlYTlkNDgzNmIzNWQ=
12
12
  data.tar.gz: !binary |-
13
- NDQyZmQ1ZjcwMTQ1YTdhMzcwYWRkMTZmNjU1NmZhMzkyMmMyMzJjNmI0NDQx
14
- N2E2YjEwODdmYmY4M2UyMzU5YTMwMTc4YzA1YWEwNjBiYjVhOWIzOGZmZjU1
15
- NWZlMTc1ODU5MmM3YzE2MWExMjUzOTllNWVkNTNhNzQ3N2VkMmY=
13
+ MzgyNTcxN2Q4YTU2YTRlMTVlZjZhYjgwOTZhNzc4ODk2YzJiYWY3MjA4OGE1
14
+ MTYyNjk2NTI0YzllYmQ3Y2FlNTM1NWY2MjRlMTJlNzM0ZTMzZThhNzc0MzNm
15
+ MDRlNzRmZjI4NzdhOGE5NDFjODhiNGEwZjA0ZTE1OGUzYWI1MTA=
data/README.md CHANGED
@@ -25,6 +25,14 @@ Or install it yourself as:
25
25
 
26
26
  $ gem install aws-session-credentials
27
27
 
28
+ ### Building native extensions for dependencies
29
+
30
+ On Ubuntu, you may need to run the following before installing this gem:
31
+
32
+ ```
33
+ $ sudo apt-get install libccid libpcsclite-dev pcscd pcsc-tools
34
+ ```
35
+
28
36
  ## Usage
29
37
 
30
38
  ### Generating new session credentials
@@ -29,5 +29,5 @@ Gem::Specification.new do |spec|
29
29
  spec.add_runtime_dependency 'inifile', '~> 3.0'
30
30
  spec.add_runtime_dependency 'smartcard'
31
31
  spec.add_runtime_dependency 'thor', '~> 0.19'
32
- spec.add_runtime_dependency 'yubioath'
32
+ spec.add_runtime_dependency 'yubioath', '~> 1.0.0'
33
33
  end
@@ -14,11 +14,13 @@ require 'aws/session/credentials/mfa_device/generic_mfa_device'
14
14
  require 'aws/session/credentials/mfa_device/yubikey_mfa_device'
15
15
 
16
16
  require 'aws/session/credentials/profile_storage'
17
+ require 'aws/session/credentials/role_storage'
17
18
 
18
19
  require 'aws/session/credentials/cache'
19
20
  require 'aws/session/credentials/config'
20
21
  require 'aws/session/credentials/credential_file'
21
22
  require 'aws/session/credentials/profile'
23
+ require 'aws/session/credentials/role'
22
24
  require 'aws/session/credentials/session_builder'
23
25
  require 'aws/session/credentials/session_manager'
24
26
 
@@ -56,18 +56,30 @@ module Aws
56
56
  SessionManager.new.new_session(cli_opts)
57
57
  end
58
58
 
59
- method_option 'role_arn',
59
+ method_option 'role-alias',
60
60
  type: :string,
61
- desc: 'The ARN of the role to assume',
62
- required: true
63
- method_option 'role_session_name',
61
+ desc: 'Name of stored role settings to use',
62
+ default: nil
63
+ method_option 'role-account',
64
+ type: :string,
65
+ desc: 'Account ID',
66
+ default: nil
67
+ method_option 'role-name',
68
+ type: :string,
69
+ desc: 'Name of role to assume',
70
+ default: nil
71
+ method_option 'role-arn',
72
+ type: :string,
73
+ desc: 'The ARN of the role to assume; alternative to providing role-account and role-name',
74
+ default: nil
75
+ method_option 'role-session-name',
64
76
  type: :string,
65
77
  desc: 'An identifier for the assumed role session',
66
- required: true
78
+ default: nil
67
79
  method_option 'profile',
68
80
  type: :string,
69
81
  desc: 'Profile that session token will be loaded into',
70
- default: 'default'
82
+ default: nil
71
83
  method_option 'duration',
72
84
  type: :numeric,
73
85
  desc: 'Duration, in seconds, that credentials should remain valid',
@@ -91,7 +103,16 @@ module Aws
91
103
  desc 'assume-role', 'Assumes a role'
92
104
  def assume_role
93
105
  cli_opts = options.transform_keys { |key| key.sub(/-/, '_') }
94
- SessionManager.new.assume_role(cli_opts)
106
+
107
+ if cli_opts['role_alias']
108
+ cf = Config.new(path: cli_opts['config_file'])
109
+ rl = cf.role(cli_opts['role_alias'].to_sym)
110
+ cli_opts = rl.to_h.deep_stringify_keys.deep_merge(cli_opts)
111
+ end
112
+
113
+ cli_opts['role_arn'] ||= make_role_arn(cli_opts['role_account'], cli_opts['role_name'])
114
+
115
+ SessionManager.new.assume_role(cli_opts.deep_symbolize_keys)
95
116
  end
96
117
 
97
118
  method_option 'aws-access-key-id',
@@ -138,7 +159,7 @@ module Aws
138
159
  cli_opts['aws_secret_access_key'] ||= ask('AWS Secret Access Key:', echo: false)
139
160
  puts '' # BUG: No LF printed when echo is set to false
140
161
  cli_opts['aws_region'] ||= ask('AWS region:')
141
- cli_opts['duration'] ||= ask('Session duration (in seconds):')
162
+ cli_opts['duration'] ||= ask('Session duration (in seconds):').to_i
142
163
 
143
164
  puts ''
144
165
  if yes?('Configure MFA (y/n)?')
@@ -156,6 +177,138 @@ module Aws
156
177
  cf.set_profile(cli_opts[:source_profile], prof)
157
178
  end
158
179
 
180
+ method_option 'role-account',
181
+ type: :string,
182
+ desc: 'Account ID',
183
+ default: nil
184
+ method_option 'role-name',
185
+ type: :string,
186
+ desc: 'Name of role to assume',
187
+ default: nil
188
+ method_option 'role-arn',
189
+ type: :string,
190
+ desc: 'The ARN of the role to assume; alternative to providing role-account and role-name',
191
+ default: nil
192
+ method_option 'role-session-name',
193
+ type: :string,
194
+ desc: 'An identifier for the assumed role session',
195
+ default: nil
196
+ method_option 'config-file',
197
+ type: :string,
198
+ desc: 'YAML file to load config from',
199
+ default: '~/.aws/aws-session-config.yml'
200
+ method_option 'role-alias',
201
+ type: :string,
202
+ desc: 'Name/alias associated with role',
203
+ default: nil
204
+ method_option 'profile',
205
+ type: :string,
206
+ desc: 'Profile that will used when assuming role',
207
+ default: nil
208
+ method_option 'duration',
209
+ type: :numeric,
210
+ desc: 'Duration, in seconds, that credentials for assumed role should remain valid',
211
+ default: nil
212
+ method_option 'mfa-device',
213
+ type: :string,
214
+ desc: 'ARN of MFA device',
215
+ default: nil
216
+ method_option 'mfa-code',
217
+ type: :string,
218
+ desc: 'Six digit code from MFA device',
219
+ default: nil
220
+ method_option 'yubikey-name',
221
+ type: :string,
222
+ desc: 'Name of yubikey device',
223
+ default: 'Yubikey'
224
+ method_option 'oath-credential',
225
+ type: :string,
226
+ desc: 'Name of OATH credential',
227
+ default: nil
228
+ desc 'configure-role', 'Configures a new role'
229
+ def configure_role
230
+ cli_opts = options.transform_keys { |key| key.sub(/-/, '_') }
231
+ cli_opts['role_alias'] ||= ask('Provide an alias for this role:')
232
+
233
+ if cli_opts['role_account'] && cli_opts['role_name']
234
+ cli_opts['role_arn'] = make_role_arn(cli_opts['role_account'], cli_opts['role_name'])
235
+ elsif !cli_opts['role_arn']
236
+ puts ''
237
+ if yes?('Provide role account and name instead of role ARN (y/n)?')
238
+ account = ask('Role account ID:')
239
+ role_name = ask('Name of role:')
240
+ cli_opts['role_arn'] = make_role_arn(account, role_name)
241
+ else
242
+ cli_opts['role_arn'] = ask('Role ARN:')
243
+ end
244
+ end
245
+
246
+ unless cli_opts['role_session_name']
247
+ if yes?('Customise role session name (y/n)?')
248
+ cli_opts['role_session_name'] = ask('Role session name:')
249
+ else
250
+ account, role_name = split_role_arn(cli_opts['role_arn'])
251
+ cli_opts['role_session_name'] = "#{role_name} @ #{account}"
252
+ end
253
+ end
254
+
255
+ cli_opts['profile'] ||= ask('Profile to use when assuming role (leave blank to use "default"):')
256
+ cli_opts['profile'] = 'default' if cli_opts['profile'].empty?
257
+
258
+ cli_opts['duration'] ||= ask('Duration in seconds of assumed role:')
259
+
260
+ rl = Role.new(cli_opts.except('config_file'))
261
+ cf = Config.new(path: cli_opts['config_file'])
262
+ cf.set_role(cli_opts[:role_alias], rl)
263
+ end
264
+
265
+ desc 'list-profiles', 'Lists profiles/sessions'
266
+ def list_profiles
267
+ store = CredentialFile.new
268
+
269
+ puts "Available profiles in #{store.path}:"
270
+ store.profiles.each { |name, _| puts " * #{name}" }
271
+ end
272
+
273
+ method_option 'config-file',
274
+ type: :string,
275
+ desc: 'YAML file to load config from',
276
+ default: '~/.aws/aws-session-config.yml'
277
+ desc 'list-roles', 'Lists roles that have been saved'
278
+ def list_roles
279
+ store = Config.new(path: options['config-file'])
280
+
281
+ puts "Stored roles in #{store.path}:"
282
+ store.roles.each { |name, _| puts " * #{name}" }
283
+ end
284
+
285
+ method_option 'config-file',
286
+ type: :string,
287
+ desc: 'YAML file to load config from',
288
+ default: '~/.aws/aws-session-config.yml'
289
+ desc 'list-source-profiles', 'Lists source profiles that have been saved'
290
+ def list_source_profiles
291
+ store = Config.new(path: options['config-file'])
292
+
293
+ puts "Available source profiles in #{store.path}:"
294
+ store.profiles.each { |name, _| puts " * #{name}" }
295
+ end
296
+
297
+ desc 'version', 'Prints the current version'
298
+ def version
299
+ puts "aws-session-credentials #{Aws::Session::Credentials::VERSION}"
300
+ end
301
+
302
+ no_tasks do
303
+ def make_role_arn(account, role_name)
304
+ "arn:aws:iam::#{account}:role/#{role_name}"
305
+ end
306
+
307
+ def split_role_arn(role_arn)
308
+ role_arn.scan(%r{arn:aws:iam::(.+):role/(.+)}).first
309
+ end
310
+ end
311
+
159
312
  default_task :new
160
313
  end
161
314
  end
@@ -4,6 +4,7 @@ module Aws
4
4
  # Holds configuration
5
5
  class Config
6
6
  include ProfileStorage
7
+ include RoleStorage
7
8
  include FileProvider::YamlFileProvider
8
9
 
9
10
  attr_reader :path
@@ -25,6 +26,16 @@ module Aws
25
26
  def profiles_hash=(hsh)
26
27
  self[:profiles] = hsh
27
28
  end
29
+
30
+ # @return [Hash<String,Hash>]
31
+ def roles_hash
32
+ self[:roles] || {}
33
+ end
34
+
35
+ # @param [Hash] hsh
36
+ def roles_hash=(hsh)
37
+ self[:roles] = hsh
38
+ end
28
39
  end
29
40
  end
30
41
  end
@@ -0,0 +1,7 @@
1
+ module Aws
2
+ module Session
3
+ module Credentials
4
+ class Role < OpenStruct; end
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,41 @@
1
+ module Aws
2
+ module Session
3
+ module Credentials
4
+ # Mixin to store roles
5
+ module RoleStorage
6
+ # @return [Hash<String,Role>]
7
+ def roles
8
+ rls = {}
9
+ roles_hash.each do |name, options|
10
+ rls[name] = Role.new(options)
11
+ end
12
+ rls
13
+ end
14
+
15
+ # @param [Hash<String,Role>] rls
16
+ def roles=(rls)
17
+ hash = {}
18
+ rls.each do |name, rl|
19
+ hash[name] = rl.to_h
20
+ end
21
+ self.roles_hash = hash
22
+ end
23
+
24
+ # @param [String] name
25
+ # @return [Role]
26
+ def role(name)
27
+ roles[name]
28
+ end
29
+
30
+ # @param [String] name
31
+ # @param [Role] rl
32
+ def set_role(name, rl)
33
+ rls = roles.dup
34
+ rls[name] = rl
35
+ self.roles = rls
36
+ rl
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,7 +1,7 @@
1
1
  module Aws
2
2
  module Session
3
3
  module Credentials
4
- VERSION = '1.0.0.pre.2'
4
+ VERSION = '1.0.0'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws-session-credentials
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Vidulich
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-11-15 00:00:00.000000000 Z
11
+ date: 2015-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -140,16 +140,16 @@ dependencies:
140
140
  name: yubioath
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ! '>='
143
+ - - ~>
144
144
  - !ruby/object:Gem::Version
145
- version: '0'
145
+ version: 1.0.0
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ! '>='
150
+ - - ~>
151
151
  - !ruby/object:Gem::Version
152
- version: '0'
152
+ version: 1.0.0
153
153
  description: Command-line tool to generate AWS session credentials.
154
154
  email:
155
155
  - ben@vidulich.co.nz
@@ -181,6 +181,8 @@ files:
181
181
  - lib/aws/session/credentials/mfa_device/yubikey_mfa_device.rb
182
182
  - lib/aws/session/credentials/profile.rb
183
183
  - lib/aws/session/credentials/profile_storage.rb
184
+ - lib/aws/session/credentials/role.rb
185
+ - lib/aws/session/credentials/role_storage.rb
184
186
  - lib/aws/session/credentials/session_builder.rb
185
187
  - lib/aws/session/credentials/session_manager.rb
186
188
  - lib/aws/session/credentials/version.rb
@@ -199,9 +201,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
199
201
  version: '0'
200
202
  required_rubygems_version: !ruby/object:Gem::Requirement
201
203
  requirements:
202
- - - ! '>'
204
+ - - ! '>='
203
205
  - !ruby/object:Gem::Version
204
- version: 1.3.1
206
+ version: '0'
205
207
  requirements: []
206
208
  rubyforge_project:
207
209
  rubygems_version: 2.4.5