aws_runas 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c0753f807b2e12d78b47b70a2c0ad8a794cdd909
4
- data.tar.gz: fc978832ef89c676bd8369b078b261b201a6a6dd
3
+ metadata.gz: a1725b31ac831ab9d03534988e9503c9531933be
4
+ data.tar.gz: 77d0509bb39c0d274bedb21152c8de1c340ed9d2
5
5
  SHA512:
6
- metadata.gz: ce7f192507b0633bd339a031d8dc630353358882a8eb1fb78dd51185835538ab2e5da2c8ca2740e3015dc0677f0e06858affc5b069997737603d1bceccfc2761
7
- data.tar.gz: 7d16f79ea126d0485afa513404c02b3bdcac7437e8caa6ec97e6faf8c84584789d035800100fef32707d7e293ab7629822e1b1cd935d3d207d0aafa9ec0d054b
6
+ metadata.gz: c2d5095da3b865dc73abf72abf2492f12641d1ddef9b772f82ce6f68427354dcc10da2f1e4f81ec2766ee59133911f3a85a83239aca40f9b937eabc8c6b16122
7
+ data.tar.gz: 660afcfda580390e17abe2cf36e0dc1c91980121953209ffe5baf4bba83ebd08480a3304673e8987fc0120b675a3771ca29618303bccbcd576c5f068eaf62b9c
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,8 +1,18 @@
1
- aws_runas CHANGELOG
2
- ====================
1
+ ## v0.3.0
3
2
 
4
- 0.2.0 (Sat Jan 16 23:44:56 PST 2016)
5
- -------------------------------------
3
+ Add session only features:
4
+
5
+ * Add the `--no-role` command to load a profile and just get a
6
+ session token, instead of assuming a role.
7
+ * Changed default behaviour so that if `AWS_SESSION_TOKEN` exists, no MFA
8
+ is loaded - this allows the assumption of multiple roles from within
9
+ the same session.
10
+ * `--no-role` will fail if a MFA serial is not present (it's pretty much
11
+ useless - you will just be getting a session for the same access
12
+ key/secret key with the same level of privilege that you did before).
13
+
14
+
15
+ ## v0.2.0
6
16
 
7
17
  * `$SHELL` is now supported - if this environment variable exists, the shell
8
18
  in it will be launched.
@@ -11,14 +21,12 @@ aws_runas CHANGELOG
11
21
  * Fixes to support mingw32 such as IO flushing and detection of a lack of
12
22
  `noecho` support.
13
23
 
14
- 0.1.3 (Fri 27 Nov 2015 08:05:45 PST)
15
- -------------------------------------
24
+ ## v0.1.3
16
25
 
17
26
  * Fixed #3 (better handling of invalid profile name).
18
27
  * Added guard for invalid file as well.
19
28
 
20
- 0.1.2 (Wed 25 Nov 2015 09:09:09 PST)
21
- -------------------------------------
29
+ ## v0.1.2
22
30
 
23
31
  * Fixed #1 and #2 (default credentials fallback bug and overzealous version
24
32
  restrictions).
data/README.md CHANGED
@@ -40,6 +40,7 @@ If COMMAND is omitted, the default shell ($SHELL, /bin/sh, or cmd.exe,
40
40
  depending on your system) will launch.
41
41
 
42
42
  [options] are:
43
+ -n, --no-role Get a session token only, do not assume a role
43
44
  -p, --path=<s> Path to the AWS config file
44
45
  -r, --profile=<s> The AWS profile to load (default: default)
45
46
  -h, --help Show this message
data/lib/aws_runas/cli.rb CHANGED
@@ -36,6 +36,7 @@ module AwsRunAs
36
36
  [options] are:
37
37
  EOS
38
38
 
39
+ opt :no_role, 'Get a session token only, do not assume a role', type: TrueClass, default: nil
39
40
  opt :path, 'Path to the AWS config file', type: String
40
41
  opt :profile, 'The AWS profile to load', type: String, default: 'default'
41
42
  stop_on_unknown
@@ -47,7 +48,7 @@ module AwsRunAs
47
48
  def start
48
49
  opts = load_opts
49
50
  mfa_code = read_mfa_if_needed(path: opts[:path], profile: opts[:profile])
50
- @main = AwsRunAs::Main.new(path: opts[:path], profile: opts[:profile], mfa_code: mfa_code)
51
+ @main = AwsRunAs::Main.new(path: opts[:path], profile: opts[:profile], mfa_code: mfa_code, no_role: opts[:no_role])
51
52
  @main.assume_role
52
53
  command = ARGV.shift
53
54
  @main.handoff(command: command, argv: ARGV)
@@ -46,7 +46,7 @@ module AwsRunAs
46
46
 
47
47
  # Checks to see if MFA is required for a specific profile.
48
48
  def mfa_required?
49
- return true if load_config_value(key: 'mfa_serial')
49
+ return true if load_config_value(key: 'mfa_serial') && !ENV.include?('AWS_SESSION_TOKEN')
50
50
  false
51
51
  end
52
52
 
@@ -21,7 +21,7 @@ module AwsRunAs
21
21
  # and hands off environment to called process.
22
22
  class Main
23
23
  # Instantiate the object and set up the path, profile, and populate MFA
24
- def initialize(path: nil, profile: default, mfa_code: nil)
24
+ def initialize(path: nil, profile: default, mfa_code: nil, no_role: nil)
25
25
  cfg_path = if path
26
26
  path
27
27
  else
@@ -29,6 +29,7 @@ module AwsRunAs
29
29
  end
30
30
  @cfg = AwsRunAs::Config.new(path: cfg_path, profile: profile)
31
31
  @mfa_code = mfa_code
32
+ @no_role = no_role
32
33
  end
33
34
 
34
35
  def sts_client
@@ -43,14 +44,23 @@ module AwsRunAs
43
44
  def assume_role
44
45
  session_id = "aws-runas-session_#{Time.now.to_i}"
45
46
  role_arn = @cfg.load_config_value(key: 'role_arn')
46
- mfa_serial = @cfg.load_config_value(key: 'mfa_serial')
47
- @role_credentials = Aws::AssumeRoleCredentials.new(
48
- client: sts_client,
49
- role_arn: role_arn,
50
- serial_number: mfa_serial,
51
- token_code: @mfa_code,
52
- role_session_name: session_id
53
- ).credentials
47
+ mfa_serial = @cfg.load_config_value(key: 'mfa_serial') unless ENV.include?('AWS_SESSION_TOKEN')
48
+ if @no_role
49
+ raise 'No mfa_serial in selected profile, session will be useless' if mfa_serial.nil?
50
+ @role_credentials = sts_client.get_session_token(
51
+ duration_seconds: 3600,
52
+ serial_number: mfa_serial,
53
+ token_code: @mfa_code
54
+ ).credentials
55
+ else
56
+ @role_credentials = Aws::AssumeRoleCredentials.new(
57
+ client: sts_client,
58
+ role_arn: role_arn,
59
+ serial_number: mfa_serial,
60
+ token_code: @mfa_code,
61
+ role_session_name: session_id
62
+ ).credentials
63
+ end
54
64
  end
55
65
 
56
66
  def credentials_env
@@ -13,5 +13,5 @@
13
13
  # limitations under the License.
14
14
 
15
15
  module AwsRunAs
16
- VERSION = '0.2.0'
16
+ VERSION = '0.3.0'
17
17
  end
@@ -73,6 +73,12 @@ describe AwsRunAs::Config do
73
73
  expect(@cfg.instance_variable_get('@profile')).to eq('test-profile')
74
74
  expect(@cfg.mfa_required?).to be true
75
75
  end
76
+
77
+ it 'confirms MFA is not required if AWS_SESSION_TOKEN is set' do
78
+ expect(@cfg.instance_variable_get('@profile')).to eq('test-profile')
79
+ expect(@cfg.mfa_required?).to be true
80
+ ENV.store('AWS_SESSION_TOKEN', 'foo')
81
+ end
76
82
  end
77
83
 
78
84
  describe '#load_source_profile' do
@@ -15,6 +15,8 @@
15
15
  require 'spec_helper'
16
16
  require 'aws_runas/main'
17
17
 
18
+ MFA_ERROR = 'No mfa_serial in selected profile, session will be useless'.freeze
19
+
18
20
  describe AwsRunAs::Main do
19
21
  before(:context) do
20
22
  @main = AwsRunAs::Main.new(
@@ -35,6 +37,37 @@ describe AwsRunAs::Main do
35
37
  expect(Aws::AssumeRoleCredentials).to receive(:new).and_call_original
36
38
  @main.assume_role
37
39
  end
40
+
41
+ it 'calls out to Aws::STS::Client.get_session_token when no_role is set' do
42
+ expect_any_instance_of(Aws::STS::Client).to receive(:get_session_token).and_call_original
43
+ ENV.delete('AWS_SESSION_TOKEN')
44
+ @main = AwsRunAs::Main.new(
45
+ path: MOCK_AWS_CONFIGPATH,
46
+ profile: 'test-profile',
47
+ mfa_code: '123456',
48
+ no_role: true
49
+ )
50
+ @main.assume_role
51
+ end
52
+
53
+ it 'raises exception when no_role is set and there is no mfa_serial' do
54
+ expect do
55
+ ENV.delete('AWS_SESSION_TOKEN')
56
+ @main = AwsRunAs::Main.new(
57
+ path: MOCK_AWS_NO_MFA_PATH,
58
+ profile: 'test-profile',
59
+ mfa_code: '123456',
60
+ no_role: true
61
+ )
62
+ @main.assume_role
63
+ end.to raise_error(MFA_ERROR)
64
+ end
65
+
66
+ it 'calls out to Aws::AssumeRoleCredentials.new with no MFA when AWS_SESSION_TOKEN is set' do
67
+ expect(Aws::AssumeRoleCredentials).to receive(:new).with(hash_including(serial_number: nil)).and_call_original
68
+ ENV.store('AWS_SESSION_TOKEN', 'foo')
69
+ @main.assume_role
70
+ end
38
71
  end
39
72
 
40
73
  describe '#credentials_env' do
@@ -15,3 +15,4 @@
15
15
  require 'spec_helper'
16
16
 
17
17
  MOCK_AWS_CONFIGPATH = File.expand_path('../files/aws_config', __FILE__)
18
+ MOCK_AWS_NO_MFA_PATH = File.expand_path('../files/aws_config_nomfa', __FILE__)
@@ -0,0 +1,7 @@
1
+ [default]
2
+ region = us-east-1
3
+
4
+ [profile test-profile]
5
+ role_arn = arn:aws:iam::123456789012:role/test-admin
6
+ region = us-west-1
7
+ source_profile = test-credentials
data.tar.gz.sig CHANGED
@@ -1,3 +1,2 @@
1
- 1Z����8)2��#�����$�7%�A"�����g
2
- |*0t�ut
3
- Q-\3da�Zs4�g�N�*ö2�.��a��\Fz�
1
+ ;h�&���m��Nޭ��v}����5��}�[a\L/SX���u�,X��k,
2
+ {(�T�f�cTT����fx3��&��8����B�*��+���[��4��a�m(�*�R� .zl�N-� �f8&t�A0W78^m��&/�gҊ�M��)^���DoN
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aws_runas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Marchesi
@@ -31,7 +31,7 @@ cert_chain:
31
31
  reriQxVYXGlD8ZDuaKlDyVqUbF026ZHIlHKIgg90O037qFPxCBACTtxtYTP2hwug
32
32
  Yis=
33
33
  -----END CERTIFICATE-----
34
- date: 2016-01-17 00:00:00.000000000 Z
34
+ date: 2016-06-11 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: aws-sdk
@@ -162,6 +162,7 @@ files:
162
162
  - spec/aws_runas/utils_spec.rb
163
163
  - spec/helpers/config_spec.rb
164
164
  - spec/helpers/files/aws_config
165
+ - spec/helpers/files/aws_config_nomfa
165
166
  - spec/spec_helper.rb
166
167
  homepage: https://github.com/vancluever/aws-runas
167
168
  licenses:
@@ -183,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
183
184
  version: '0'
184
185
  requirements: []
185
186
  rubyforge_project:
186
- rubygems_version: 2.2.2
187
+ rubygems_version: 2.5.1
187
188
  signing_key:
188
189
  specification_version: 4
189
190
  summary: Run a command or shell under an assumed AWS IAM role
@@ -194,4 +195,5 @@ test_files:
194
195
  - spec/aws_runas/utils_spec.rb
195
196
  - spec/helpers/config_spec.rb
196
197
  - spec/helpers/files/aws_config
198
+ - spec/helpers/files/aws_config_nomfa
197
199
  - spec/spec_helper.rb
metadata.gz.sig CHANGED
Binary file