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

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 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