miam 0.2.3 → 0.2.4.beta8

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bb232253b3506a0387caa0817c099a76b0d5ec5f
4
- data.tar.gz: e10d873066aef538049bb703bf2977064c1ab586
3
+ metadata.gz: db416d15e77789e9842a5961c0fd9a0ddf37520c
4
+ data.tar.gz: 8518f5af7bfd066ffb3c50099efeac19ec93871a
5
5
  SHA512:
6
- metadata.gz: d07415f6abcf2efa6d0572bf61302ee6d5334cc76f2a7739dbde62cf8b3b0cc0ceece4cf9613bbcc66776e0ad3758bfb5cf75196a286cfe47d95de467f02fa33
7
- data.tar.gz: eb2ecd520a5d43173249082dfdb29dd0b31fa36acc254cb356a57b04d9dd2befc4caaae70f4a7376189ffda32395b425195f7f014c0f223501dc1ac96d324f9b
6
+ metadata.gz: c308c609a2498a1f7e3c9d4ff231d9a419864c791d2c4aae0d7d98f5273e7c43c23522de2ec5b2bf70e66b905c4ed6ab60af0b15a13ec24632b630c47f14ae06
7
+ data.tar.gz: 09e1f6e04a5edb027e443dde184e4c77f8ad16772afc867bbf74ca143cd02c479e43f99c1a0fc9d8fe43f9a6e83ee63cbd813d38e63b6c2086829577427904b8
data/.rspec CHANGED
@@ -1,4 +1,5 @@
1
1
  --require rspec/instafail
2
- --format RSpec::Instafail
2
+ --format documentation
3
+ #RSpec::Instafail
3
4
  --colour
4
5
  --require spec_helper
data/.travis.yml CHANGED
@@ -4,7 +4,7 @@ rvm:
4
4
  - 2.0.0
5
5
  script:
6
6
  - bundle install
7
- - bundle exec rake
7
+ - travis_wait bundle exec rake
8
8
  env:
9
9
  global:
10
10
  - secure: "Ec8bwSfp06anSzLJpGhkKjPz9EocMwl7H8t2LKoI3bKV/cz9JU0GhhUdUUmg3mCFH9+8/YGLzcbFKcxZIqnDK7ukdgTGsnGDevnctis0QwM7/nKHdkaK8JWhCx41TUXOqoiCKkNEnm1EbDtrILt4rJwb0BGXGnPjv6nLAyvdE2Y="
data/README.md CHANGED
@@ -22,6 +22,9 @@ It defines the state of IAM using DSL, and updates IAM according to DSL.
22
22
  * Sort policy array
23
23
  * `>= 0.2.3`
24
24
  * Support Custom Managed Policy
25
+ * `>= 0.2.4`
26
+ * Fix for Password Policy ([RP#22](https://github.com/winebarrel/miam/pull/22))
27
+ * Fix `--target` option for Policies ([RP#21](https://github.com/winebarrel/miam/pull/21))
25
28
 
26
29
  ## Installation
27
30
 
data/lib/miam/client.rb CHANGED
@@ -129,7 +129,7 @@ class Miam::Client
129
129
  end
130
130
 
131
131
  if expected_login_profile and not actual_login_profile
132
- expected_login_profile[:password] ||= @password_manager.identify(user_name, :login_profile)
132
+ expected_login_profile[:password] ||= @password_manager.identify(user_name, :login_profile, @driver.password_policy)
133
133
  @driver.create_login_profile(user_name, expected_login_profile)
134
134
  updated = true
135
135
  elsif not expected_login_profile and actual_login_profile
@@ -445,6 +445,7 @@ class Miam::Client
445
445
  updated = false
446
446
 
447
447
  expected.each do |policy_name, expected_attrs|
448
+ next unless target_matched?(policy_name)
448
449
  actual_attrs = actual.delete(policy_name)
449
450
 
450
451
  if actual_attrs
@@ -452,7 +453,7 @@ class Miam::Client
452
453
  log(:warn, "ManagedPolicy `#{policy_name}`: 'path' cannot be updated", :color => :yellow)
453
454
  end
454
455
 
455
- updated = walk_managed_policy(policy_name, expected_attrs[:document], actual_attrs[:document]) || updated
456
+ updated = walk_managed_policy(policy_name, actual_attrs[:path], expected_attrs[:document], actual_attrs[:document]) || updated
456
457
  else
457
458
  @driver.create_managed_policy(policy_name, expected_attrs)
458
459
  updated = true
@@ -462,13 +463,13 @@ class Miam::Client
462
463
  updated
463
464
  end
464
465
 
465
- def walk_managed_policy(policy_name, expected_document, actual_document)
466
+ def walk_managed_policy(policy_name, policy_path, expected_document, actual_document)
466
467
  updated = false
467
468
  expected_document.sort_array!
468
469
  actual_document.sort_array!
469
470
 
470
471
  if expected_document != actual_document
471
- @driver.update_managed_policy(policy_name, expected_document, actual_document)
472
+ @driver.update_managed_policy(policy_name, policy_path, expected_document, actual_document)
472
473
  updated = true
473
474
  end
474
475
 
@@ -479,7 +480,8 @@ class Miam::Client
479
480
  updated = false
480
481
 
481
482
  actual.each do |policy_name, actual_attrs|
482
- @driver.delete_managed_policy(policy_name)
483
+ next unless target_matched?(policy_name)
484
+ @driver.delete_managed_policy(policy_name, actual_attrs[:path])
483
485
  updated = true
484
486
  end
485
487
 
data/lib/miam/driver.rb CHANGED
@@ -67,6 +67,14 @@ class Miam::Driver
67
67
  @iam.delete_signing_certificate(:user_name => user_name, :certificate_id => certificate_id)
68
68
  end
69
69
 
70
+ mfa_devices = @iam.list_mfa_devices(:user_name => user_name).map {|resp|
71
+ resp.mfa_devices
72
+ }.flatten
73
+
74
+ mfa_devices.each do |md|
75
+ @iam.deactivate_mfa_device(:user_name => user_name, :serial_number => md.serial_number)
76
+ end
77
+
70
78
  @iam.delete_user(:user_name => user_name)
71
79
  end
72
80
  end
@@ -377,12 +385,12 @@ class Miam::Driver
377
385
  end
378
386
  end
379
387
 
380
- def delete_managed_policy(policy_name)
388
+ def delete_managed_policy(policy_name, policy_path)
381
389
  log(:info, "Delete ManagedPolicy `#{policy_name}`", :color => :red)
382
390
 
383
391
  unless_dry_run do
384
392
  policy_versions = @iam.list_policy_versions(
385
- :policy_arn => policy_arn(policy_name),
393
+ :policy_arn => policy_arn(policy_name, policy_path),
386
394
  :max_items => MAX_POLICY_VERSIONS
387
395
  )
388
396
 
@@ -390,24 +398,24 @@ class Miam::Driver
390
398
  pv.is_default_version
391
399
  }.each {|pv|
392
400
  @iam.delete_policy_version(
393
- :policy_arn => policy_arn(policy_name),
401
+ :policy_arn => policy_arn(policy_name, policy_path),
394
402
  :version_id => pv.version_id
395
403
  )
396
404
  }
397
405
 
398
406
  @iam.delete_policy(
399
- :policy_arn => policy_arn(policy_name)
407
+ :policy_arn => policy_arn(policy_name, policy_path)
400
408
  )
401
409
  end
402
410
  end
403
411
 
404
- def update_managed_policy(policy_name, policy_document, old_policy_document)
412
+ def update_managed_policy(policy_name, policy_path, policy_document, old_policy_document)
405
413
  log(:info, "Update ManagedPolicy `#{policy_name}`", :color => :green)
406
414
  log(:info, Miam::Utils.diff(old_policy_document, policy_document, :color => @options[:color]), :color => false)
407
415
 
408
416
  unless_dry_run do
409
417
  policy_versions = @iam.list_policy_versions(
410
- :policy_arn => policy_arn(policy_name),
418
+ :policy_arn => policy_arn(policy_name, policy_path),
411
419
  :max_items => MAX_POLICY_VERSIONS
412
420
  )
413
421
 
@@ -417,19 +425,27 @@ class Miam::Driver
417
425
  }.sort_by {|pv| pv.version_id[1..-1].to_i }.first
418
426
 
419
427
  @iam.delete_policy_version(
420
- :policy_arn => policy_arn(policy_name),
428
+ :policy_arn => policy_arn(policy_name, policy_path),
421
429
  :version_id => delete_policy_version.version_id
422
430
  )
423
431
  end
424
432
 
425
433
  @iam.create_policy_version(
426
- :policy_arn => policy_arn(policy_name),
434
+ :policy_arn => policy_arn(policy_name, policy_path),
427
435
  :policy_document => encode_document(policy_document),
428
436
  set_as_default: true
429
437
  )
430
438
  end
431
439
  end
432
440
 
441
+ def password_policy
442
+ return @password_policy if instance_variable_defined?(:@password_policy)
443
+
444
+ @password_policy = @iam.get_account_password_policy.password_policy
445
+ rescue Aws::IAM::Errors::NoSuchEntity
446
+ @password_policy = nil
447
+ end
448
+
433
449
  private
434
450
 
435
451
  def encode_document(policy_document)
@@ -455,11 +471,12 @@ class Miam::Driver
455
471
  yield unless @options[:dry_run]
456
472
  end
457
473
 
458
- def user_id
459
- @user_id ||= @iam.get_user.user.user_id
474
+ def account_id
475
+ # https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
476
+ @account_id ||= @iam.get_user.user.arn.split(':').fetch(4)
460
477
  end
461
478
 
462
- def policy_arn(policy_name)
463
- "arn:aws:iam::#{user_id}:policy/#{policy_name}"
479
+ def policy_arn(policy_name, policy_path)
480
+ File.join("arn:aws:iam::#{account_id}:policy", policy_path, policy_name)
464
481
  end
465
482
  end
data/lib/miam/exporter.rb CHANGED
@@ -262,10 +262,10 @@ class Miam::Exporter
262
262
  @iam.get_account_authorization_details.each do |resp|
263
263
  keys.each do |key|
264
264
  account_authorization_details[key].concat(resp[key])
265
+ end
265
266
 
266
- unless @options[:no_progress]
267
- progressbar.increment
268
- end
267
+ unless @options[:no_progress]
268
+ progressbar.increment
269
269
  end
270
270
  end
271
271
 
@@ -1,13 +1,19 @@
1
1
  class Miam::PasswordManager
2
2
  include Miam::Logger::Helper
3
3
 
4
+ LOWERCASES = ('a'..'z').to_a
5
+ UPPERCASES = ('A'..'Z').to_a
6
+ NUMBERS = ('0'..'9').to_a
7
+ SYMBOLS = "!@\#$%^&*()_+-=[]{}|'".split(//)
8
+
4
9
  def initialize(output, options = {})
5
10
  @output = output
6
11
  @options = options
7
12
  end
8
13
 
9
- def identify(user, type)
10
- password = mkpasswd
14
+ def identify(user, type, policy)
15
+ password = mkpasswd(policy)
16
+ log(:info, "mkpasswd: #{password}")
11
17
  puts_password(user, type, password)
12
18
  password
13
19
  end
@@ -22,8 +28,21 @@ class Miam::PasswordManager
22
28
 
23
29
  private
24
30
 
25
- def mkpasswd(len = 8)
26
- [*1..9, *'A'..'Z', *'a'..'z'].shuffle.slice(0, len).join
31
+ def mkpasswd(policy)
32
+ chars = []
33
+ len = 8
34
+
35
+ if policy
36
+ len = policy.minimum_password_length if policy.minimum_password_length > len
37
+ chars << LOWERCASES.shuffle.first if policy.require_lowercase_characters
38
+ chars << UPPERCASES.shuffle.first if policy.require_uppercase_characters
39
+ chars << NUMBERS.shuffle.first if policy.require_numbers
40
+ chars << SYMBOLS.shuffle.first if policy.require_symbols
41
+
42
+ len -= chars.length
43
+ end
44
+
45
+ (chars + [*1..9, *'A'..'Z', *'a'..'z'].shuffle.slice(0, len)).shuffle.join
27
46
  end
28
47
 
29
48
  def open_output
data/lib/miam/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Miam
2
- VERSION = '0.2.3'
2
+ VERSION = '0.2.4.beta8'
3
3
  end
data/miam.gemspec CHANGED
@@ -8,8 +8,6 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Miam::VERSION
9
9
  spec.authors = ['Genki Sugawara']
10
10
  spec.email = ['sgwr_dts@yahoo.co.jp']
11
- spec.summary = %q{TODO: Write a short summary. Required.}
12
- spec.description = %q{TODO: Write a longer description. Optional.}
13
11
  spec.summary = %q{Miam is a tool to manage IAM.}
14
12
  spec.description = %q{Miam is a tool to manage IAM. It defines the state of IAM using DSL, and updates IAM according to DSL.}
15
13
  spec.homepage = 'http://miam.codenize.tools/'
@@ -31,4 +29,5 @@ Gem::Specification.new do |spec|
31
29
  spec.add_development_dependency 'rspec', '>= 3.0.0'
32
30
  spec.add_development_dependency 'rspec-instafail'
33
31
  spec.add_development_dependency 'coveralls'
32
+ spec.add_development_dependency 'nokogiri'
34
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miam
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4.beta8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-29 00:00:00.000000000 Z
11
+ date: 2016-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-core
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: nokogiri
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
167
181
  description: Miam is a tool to manage IAM. It defines the state of IAM using DSL,
168
182
  and updates IAM according to DSL.
169
183
  email:
@@ -224,12 +238,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
224
238
  version: '0'
225
239
  required_rubygems_version: !ruby/object:Gem::Requirement
226
240
  requirements:
227
- - - ">="
241
+ - - ">"
228
242
  - !ruby/object:Gem::Version
229
- version: '0'
243
+ version: 1.3.1
230
244
  requirements: []
231
245
  rubyforge_project:
232
- rubygems_version: 2.4.5.1
246
+ rubygems_version: 2.5.1
233
247
  signing_key:
234
248
  specification_version: 4
235
249
  summary: Miam is a tool to manage IAM.