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 +4 -4
- data/.rspec +2 -1
- data/.travis.yml +1 -1
- data/README.md +3 -0
- data/lib/miam/client.rb +7 -5
- data/lib/miam/driver.rb +29 -12
- data/lib/miam/exporter.rb +3 -3
- data/lib/miam/password_manager.rb +23 -4
- data/lib/miam/version.rb +1 -1
- data/miam.gemspec +1 -2
- metadata +19 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: db416d15e77789e9842a5961c0fd9a0ddf37520c
|
|
4
|
+
data.tar.gz: 8518f5af7bfd066ffb3c50099efeac19ec93871a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c308c609a2498a1f7e3c9d4ff231d9a419864c791d2c4aae0d7d98f5273e7c43c23522de2ec5b2bf70e66b905c4ed6ab60af0b15a13ec24632b630c47f14ae06
|
|
7
|
+
data.tar.gz: 09e1f6e04a5edb027e443dde184e4c77f8ad16772afc867bbf74ca143cd02c479e43f99c1a0fc9d8fe43f9a6e83ee63cbd813d38e63b6c2086829577427904b8
|
data/.rspec
CHANGED
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
|
-
|
|
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
|
|
459
|
-
|
|
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::#{
|
|
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
|
-
|
|
267
|
-
|
|
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(
|
|
26
|
-
|
|
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
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.
|
|
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-
|
|
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:
|
|
243
|
+
version: 1.3.1
|
|
230
244
|
requirements: []
|
|
231
245
|
rubyforge_project:
|
|
232
|
-
rubygems_version: 2.
|
|
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.
|