diff --git a/libraries/iam_password_policy.rb b/libraries/iam_password_policy.rb new file mode 100644 index 000000000..2b709bcd0 --- /dev/null +++ b/libraries/iam_password_policy.rb @@ -0,0 +1,52 @@ +# author: Viktor Yakovlyev + +require 'aws_conn' + +class IamPasswordPolicy < Inspec.resource(1) + name 'iam_password_policy' + desc 'Verifies iam password policy' + + example " + describe iam_password_policy('i-123456') do + its('requires_lowercase_letters?') { should be true } + end + + describe iam_password_policy('i-123456') do + its('requires_uppercase_letters?') { should be true } + end + " + + def initialize(conn = AWSConnection.new) + @policy = conn.iam_resource.account_password_policy + rescue Aws::IAM::Errors::NoSuchEntity + @policy = nil + end + + def exists? + !@policy.nil? + end + + def requires_lowercase_characters? + @policy.require_lowercase_characters + end + + def requires_uppercase_characters? + @policy.require_uppercase_characters + end + + def minimum_password_length + @policy.minimum_password_length + end + + def requires_numbers? + @policy.require_numbers + end + + def requires_symbols? + @policy.require_symbols + end + + def allows_users_to_change_password? + @policy.allow_users_to_change_password + end +end diff --git a/test/unit/resources/iam_password_policy_test.rb b/test/unit/resources/iam_password_policy_test.rb new file mode 100644 index 000000000..ed0583458 --- /dev/null +++ b/test/unit/resources/iam_password_policy_test.rb @@ -0,0 +1,26 @@ +require 'helper' +require 'iam_password_policy' +require 'aws-sdk' +require 'json' + +class IamPasswordPolicyTest < Minitest::Test + def setup + @mockConn = Minitest::Mock.new + end + + def test_policy_exists_when_policy_exists + @mockResource = Minitest::Mock.new + @mockResource.expect :account_password_policy, true + @mockConn.expect :iam_resource, @mockResource + assert_equal true, IamPasswordPolicy.new(@mockConn).exists? + end + + def test_policy_does_not_exists_when_no_policy + @mockResource = Minitest::Mock.new + @mockResource.expect :account_password_policy, nil do |args| + raise Aws::IAM::Errors::NoSuchEntity.new nil, nil + end + @mockConn.expect :iam_resource, @mockResource + assert_equal false, IamPasswordPolicy.new(@mockConn).exists? + end +end \ No newline at end of file