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 +8 -8
- data/README.md +8 -0
- data/aws-session-credentials.gemspec +1 -1
- data/lib/aws/session/credentials.rb +2 -0
- data/lib/aws/session/credentials/cli.rb +161 -8
- data/lib/aws/session/credentials/config.rb +11 -0
- data/lib/aws/session/credentials/role.rb +7 -0
- data/lib/aws/session/credentials/role_storage.rb +41 -0
- data/lib/aws/session/credentials/version.rb +1 -1
- metadata +10 -8
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
Mjk2MmNjOTU3YTczYTY3MjIxNWY4NzM3MDA2MDI1OTQ1MjEzMjllMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MzMxZDgyYmY5YzBhMTZlMDU4NzE5MGFjNDc4NDk3NzE3OGQ1NmI1Nw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NzhjNDI4ZjFlZGE4N2QxNjc2MTYxOWI1Mzg4NWI0NWNiMzM1MDI5ZWQ1MTM0
|
10
|
+
NDYyYzQzN2YxNjEwNmI0YTM1NmExN2RkZjU1MjI2ZjBmZDZiOTg3N2ZlNDMy
|
11
|
+
MTExOWE5NWZhNzk5ZGMwOTY2ZWY3NzQ0NjZlYTlkNDgzNmIzNWQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
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 '
|
59
|
+
method_option 'role-alias',
|
60
60
|
type: :string,
|
61
|
-
desc: '
|
62
|
-
|
63
|
-
method_option '
|
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
|
-
|
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:
|
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
|
-
|
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,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
|
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
|
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-
|
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:
|
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:
|
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:
|
206
|
+
version: '0'
|
205
207
|
requirements: []
|
206
208
|
rubyforge_project:
|
207
209
|
rubygems_version: 2.4.5
|