cloud-mu 3.6.10 → 3.6.11

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.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/Berksfile +2 -3
  3. data/Berksfile.lock +11 -14
  4. data/bin/mu-aws-setup +16 -4
  5. data/bin/mu-configure +2 -1
  6. data/cloud-mu.gemspec +2 -2
  7. data/cookbooks/mu-firewall/Berksfile +1 -1
  8. data/cookbooks/mu-firewall/attributes/default.rb +2 -2
  9. data/cookbooks/mu-firewall/metadata.rb +3 -3
  10. data/cookbooks/mu-firewall/recipes/default.rb +11 -2
  11. data/cookbooks/mu-master/Berksfile +1 -1
  12. data/cookbooks/mu-master/attributes/default.rb +14 -1
  13. data/cookbooks/mu-master/files/default/389ds-perl/ASDialogs.pm +173 -0
  14. data/cookbooks/mu-master/files/default/389ds-perl/AdminMigration.pm +569 -0
  15. data/cookbooks/mu-master/files/default/389ds-perl/AdminServer.pm +952 -0
  16. data/cookbooks/mu-master/files/default/389ds-perl/AdminUtil.pm +983 -0
  17. data/cookbooks/mu-master/files/default/389ds-perl/ConfigDSDialogs.pm +449 -0
  18. data/cookbooks/mu-master/files/default/389ds-perl/DSCreate.pm +1551 -0
  19. data/cookbooks/mu-master/files/default/389ds-perl/DSDialogs.pm +233 -0
  20. data/cookbooks/mu-master/files/default/389ds-perl/DSMigration.pm +1175 -0
  21. data/cookbooks/mu-master/files/default/389ds-perl/DSUpdate.pm +534 -0
  22. data/cookbooks/mu-master/files/default/389ds-perl/DSUpdateDialogs.pm +152 -0
  23. data/cookbooks/mu-master/files/default/389ds-perl/DSUtil.pm +1710 -0
  24. data/cookbooks/mu-master/files/default/389ds-perl/Dialog.pm +249 -0
  25. data/cookbooks/mu-master/files/default/389ds-perl/DialogManager.pm +212 -0
  26. data/cookbooks/mu-master/files/default/389ds-perl/FileConn.pm +461 -0
  27. data/cookbooks/mu-master/files/default/389ds-perl/Inf.pm +268 -0
  28. data/cookbooks/mu-master/files/default/389ds-perl/Migration.pm +327 -0
  29. data/cookbooks/mu-master/files/default/389ds-perl/RegDSDialogs.pm +94 -0
  30. data/cookbooks/mu-master/files/default/389ds-perl/Resource.pm +137 -0
  31. data/cookbooks/mu-master/files/default/389ds-perl/Setup.pm +240 -0
  32. data/cookbooks/mu-master/files/default/389ds-perl/SetupDialogs.pm +243 -0
  33. data/cookbooks/mu-master/files/default/389ds-perl/SetupLog.pm +82 -0
  34. data/cookbooks/mu-master/files/default/setCertName.ldif +4 -0
  35. data/cookbooks/mu-master/libraries/mu.rb +2 -2
  36. data/cookbooks/mu-master/metadata.rb +1 -1
  37. data/cookbooks/mu-master/recipes/389ds.rb +71 -32
  38. data/cookbooks/mu-master/recipes/basepackages.rb +5 -0
  39. data/cookbooks/mu-master/recipes/default.rb +16 -5
  40. data/cookbooks/mu-master/recipes/init.rb +36 -3
  41. data/cookbooks/mu-master/recipes/ssl-certs.rb +6 -0
  42. data/cookbooks/mu-master/recipes/sssd.rb +85 -62
  43. data/cookbooks/mu-master/recipes/update_nagios_only.rb +7 -1
  44. data/cookbooks/mu-master/templates/default/389-directory-setup.inf.erb +11 -26
  45. data/cookbooks/mu-master/templates/default/sssd.conf.erb +18 -8
  46. data/cookbooks/mu-tools/files/default/Mu_CA.pem +33 -0
  47. data/cookbooks/mu-tools/metadata.rb +0 -1
  48. data/cookbooks/mu-tools/recipes/set_local_fw.rb +7 -1
  49. data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +5 -1
  50. data/cookbooks/nagios/CHANGELOG.md +679 -0
  51. data/cookbooks/nagios/LICENSE +201 -0
  52. data/cookbooks/nagios/README.md +340 -0
  53. data/cookbooks/nagios/attributes/config.rb +163 -0
  54. data/cookbooks/nagios/attributes/default.rb +204 -0
  55. data/cookbooks/nagios/libraries/base.rb +311 -0
  56. data/cookbooks/nagios/libraries/command.rb +68 -0
  57. data/cookbooks/nagios/libraries/contact.rb +229 -0
  58. data/cookbooks/nagios/libraries/contactgroup.rb +111 -0
  59. data/cookbooks/{firewall/recipes/disable_firewall.rb → nagios/libraries/custom_option.rb} +20 -7
  60. data/cookbooks/nagios/libraries/data_bag_helper.rb +23 -0
  61. data/cookbooks/nagios/libraries/default.rb +90 -0
  62. data/cookbooks/nagios/libraries/helpers.rb +229 -0
  63. data/cookbooks/nagios/libraries/host.rb +410 -0
  64. data/cookbooks/nagios/libraries/hostdependency.rb +178 -0
  65. data/cookbooks/nagios/libraries/hostescalation.rb +170 -0
  66. data/cookbooks/nagios/libraries/hostgroup.rb +117 -0
  67. data/cookbooks/nagios/libraries/nagios.rb +277 -0
  68. data/cookbooks/nagios/libraries/resource.rb +59 -0
  69. data/cookbooks/nagios/libraries/service.rb +449 -0
  70. data/cookbooks/nagios/libraries/servicedependency.rb +213 -0
  71. data/cookbooks/nagios/libraries/serviceescalation.rb +193 -0
  72. data/cookbooks/nagios/libraries/servicegroup.rb +142 -0
  73. data/cookbooks/nagios/libraries/timeperiod.rb +159 -0
  74. data/cookbooks/nagios/libraries/users_helper.rb +54 -0
  75. data/cookbooks/nagios/metadata.json +44 -0
  76. data/cookbooks/nagios/metadata.rb +22 -0
  77. data/cookbooks/nagios/recipes/_load_databag_config.rb +153 -0
  78. data/cookbooks/nagios/recipes/_load_default_config.rb +241 -0
  79. data/cookbooks/nagios/recipes/apache.rb +114 -0
  80. data/cookbooks/nagios/recipes/default.rb +41 -0
  81. data/cookbooks/nagios/recipes/nginx.rb +114 -0
  82. data/cookbooks/nagios/recipes/pagerduty.rb +95 -0
  83. data/cookbooks/nagios/recipes/server.rb +182 -0
  84. data/cookbooks/nagios/recipes/server_package.rb +85 -0
  85. data/cookbooks/nagios/recipes/server_source.rb +137 -0
  86. data/cookbooks/nagios/resources/command.rb +34 -0
  87. data/cookbooks/nagios/resources/conf.rb +52 -0
  88. data/cookbooks/nagios/resources/contact.rb +34 -0
  89. data/cookbooks/nagios/resources/contactgroup.rb +35 -0
  90. data/cookbooks/nagios/resources/host.rb +35 -0
  91. data/cookbooks/nagios/resources/hostdependency.rb +35 -0
  92. data/cookbooks/nagios/resources/hostescalation.rb +36 -0
  93. data/cookbooks/nagios/resources/hostgroup.rb +35 -0
  94. data/cookbooks/nagios/resources/resource.rb +34 -0
  95. data/cookbooks/nagios/resources/service.rb +35 -0
  96. data/cookbooks/nagios/resources/servicedependency.rb +35 -0
  97. data/cookbooks/nagios/resources/serviceescalation.rb +35 -0
  98. data/cookbooks/nagios/resources/servicegroup.rb +35 -0
  99. data/cookbooks/nagios/resources/timeperiod.rb +35 -0
  100. data/cookbooks/nagios/templates/apache2.conf.erb +102 -0
  101. data/cookbooks/nagios/templates/cgi.cfg.erb +266 -0
  102. data/cookbooks/nagios/templates/commands.cfg.erb +13 -0
  103. data/cookbooks/nagios/templates/contacts.cfg.erb +37 -0
  104. data/cookbooks/nagios/templates/hostgroups.cfg.erb +25 -0
  105. data/cookbooks/nagios/templates/hosts.cfg.erb +15 -0
  106. data/cookbooks/nagios/templates/htpasswd.users.erb +6 -0
  107. data/cookbooks/nagios/templates/nagios.cfg.erb +22 -0
  108. data/cookbooks/nagios/templates/nginx.conf.erb +80 -0
  109. data/cookbooks/nagios/templates/pagerduty.cgi.erb +185 -0
  110. data/cookbooks/nagios/templates/resource.cfg.erb +27 -0
  111. data/cookbooks/nagios/templates/servicedependencies.cfg.erb +15 -0
  112. data/cookbooks/nagios/templates/servicegroups.cfg.erb +14 -0
  113. data/cookbooks/nagios/templates/services.cfg.erb +14 -0
  114. data/cookbooks/nagios/templates/spawn-fcgi.erb +10 -0
  115. data/cookbooks/nagios/templates/templates.cfg.erb +31 -0
  116. data/cookbooks/nagios/templates/timeperiods.cfg.erb +13 -0
  117. data/extras/platform_berksfile_base +3 -3
  118. data/extras/python_rpm/build.sh +4 -4
  119. data/extras/python_rpm/muthon.spec +2 -4
  120. data/extras/vault_tools/export_vaults.sh +11 -1
  121. data/install/installer +1 -1
  122. data/modules/mu/kittens.rb +27523 -0
  123. data/modules/mu/master/ldap.rb +48 -31
  124. data/modules/mu/master.rb +69 -0
  125. data/modules/mu/mu.yaml.rb +351 -0
  126. data/modules/mu/providers/aws/firewall_rule.rb +3 -1
  127. data/modules/mu/providers/aws.rb +11 -5
  128. data/modules/mu.rb +5 -4
  129. metadata +99 -48
  130. data/cookbooks/firewall/CHANGELOG.md +0 -488
  131. data/cookbooks/firewall/LICENSE +0 -202
  132. data/cookbooks/firewall/README.md +0 -366
  133. data/cookbooks/firewall/TODO.md +0 -6
  134. data/cookbooks/firewall/attributes/default.rb +0 -5
  135. data/cookbooks/firewall/attributes/firewalld.rb +0 -8
  136. data/cookbooks/firewall/attributes/iptables.rb +0 -17
  137. data/cookbooks/firewall/attributes/ufw.rb +0 -12
  138. data/cookbooks/firewall/attributes/windows.rb +0 -8
  139. data/cookbooks/firewall/libraries/helpers.rb +0 -105
  140. data/cookbooks/firewall/libraries/helpers_firewalld.rb +0 -116
  141. data/cookbooks/firewall/libraries/helpers_firewalld_dbus.rb +0 -72
  142. data/cookbooks/firewall/libraries/helpers_iptables.rb +0 -112
  143. data/cookbooks/firewall/libraries/helpers_nftables.rb +0 -170
  144. data/cookbooks/firewall/libraries/helpers_ufw.rb +0 -142
  145. data/cookbooks/firewall/libraries/helpers_windows.rb +0 -129
  146. data/cookbooks/firewall/libraries/provider_firewall_firewalld.rb +0 -179
  147. data/cookbooks/firewall/libraries/provider_firewall_iptables.rb +0 -171
  148. data/cookbooks/firewall/libraries/provider_firewall_iptables_ubuntu.rb +0 -200
  149. data/cookbooks/firewall/libraries/provider_firewall_iptables_ubuntu1404.rb +0 -200
  150. data/cookbooks/firewall/libraries/provider_firewall_rule.rb +0 -34
  151. data/cookbooks/firewall/libraries/provider_firewall_ufw.rb +0 -138
  152. data/cookbooks/firewall/libraries/provider_firewall_windows.rb +0 -126
  153. data/cookbooks/firewall/libraries/resource_firewall.rb +0 -26
  154. data/cookbooks/firewall/libraries/resource_firewall_rule.rb +0 -52
  155. data/cookbooks/firewall/metadata.json +0 -40
  156. data/cookbooks/firewall/metadata.rb +0 -15
  157. data/cookbooks/firewall/recipes/default.rb +0 -76
  158. data/cookbooks/firewall/recipes/firewalld.rb +0 -87
  159. data/cookbooks/firewall/resources/firewalld.rb +0 -28
  160. data/cookbooks/firewall/resources/firewalld_config.rb +0 -39
  161. data/cookbooks/firewall/resources/firewalld_helpers.rb +0 -106
  162. data/cookbooks/firewall/resources/firewalld_icmptype.rb +0 -88
  163. data/cookbooks/firewall/resources/firewalld_ipset.rb +0 -104
  164. data/cookbooks/firewall/resources/firewalld_policy.rb +0 -115
  165. data/cookbooks/firewall/resources/firewalld_service.rb +0 -98
  166. data/cookbooks/firewall/resources/firewalld_zone.rb +0 -118
  167. data/cookbooks/firewall/resources/nftables.rb +0 -71
  168. data/cookbooks/firewall/resources/nftables_rule.rb +0 -113
  169. data/cookbooks/firewall/templates/default/ufw/default.erb +0 -13
  170. /data/cookbooks/{firewall → nagios}/chefignore +0 -0
  171. /data/cookbooks/{firewall → nagios}/renovate.json +0 -0
@@ -1,72 +0,0 @@
1
- module FirewallCookbook
2
- module Helpers
3
- module FirewalldDBus
4
- def firewalld(system_bus)
5
- system_bus['org.fedoraproject.FirewallD1']
6
- end
7
-
8
- def firewalld_object(system_bus)
9
- firewalld(system_bus)['/org/fedoraproject/FirewallD1']
10
- end
11
-
12
- def firewalld_interface(system_bus)
13
- firewalld_object(system_bus)['org.fedoraproject.FirewallD1']
14
- end
15
-
16
- def config_object(system_bus)
17
- firewalld(system_bus)['/org/fedoraproject/FirewallD1/config']
18
- end
19
-
20
- def config_interface(system_bus)
21
- config_object(system_bus)['org.fedoraproject.FirewallD1.config']
22
- end
23
-
24
- def icmptype_interface(dbus, icmptype_path)
25
- icmptype_object = firewalld(dbus)[icmptype_path]
26
- icmptype_object['org.fedoraproject.FirewallD1.config.icmptype']
27
- end
28
-
29
- def ipset_interface(dbus, ipset_path)
30
- ipset_object = firewalld(dbus)[ipset_path]
31
- ipset_object['org.fedoraproject.FirewallD1.config.ipset']
32
- end
33
-
34
- def helper_interface(dbus, helper_path)
35
- helper_object = firewalld(dbus)[helper_path]
36
- helper_object['org.fedoraproject.FirewallD1.config.helper']
37
- end
38
-
39
- def service_interface(dbus, service_path)
40
- service_object = firewalld(dbus)[service_path]
41
- service_object['org.fedoraproject.FirewallD1.config.service']
42
- end
43
-
44
- def policy_interface(dbus, policy_path)
45
- policy_object = firewalld(dbus)[policy_path]
46
- policy_object['org.fedoraproject.FirewallD1.config.policy']
47
- end
48
-
49
- def zone_interface(dbus, zone_path)
50
- zone_object = firewalld(dbus)[zone_path]
51
- zone_object['org.fedoraproject.FirewallD1.config.zone']
52
- end
53
-
54
- # port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
55
- def parse_forward_ports(forward_ports)
56
- port_regex = %r{port=([\w-]+):proto=([\w]+)(:toport=([\w-]+)|)(:toaddr=([\d\./]+)|)}
57
- captures = forward_ports.match(port_regex).captures
58
- captures.delete_at(4)
59
- captures.delete_at(2)
60
- captures.map { |e| e || '' }
61
- end
62
-
63
- def forward_ports_to_dbus(new_resource)
64
- fwp = new_resource.forward_ports.map do |e|
65
- parse_forward_ports(e)
66
- end
67
- new_resource.forward_ports = fwp
68
- DBus.variant('a(ssss)', new_resource.forward_ports)
69
- end
70
- end
71
- end
72
- end
@@ -1,112 +0,0 @@
1
- module FirewallCookbook
2
- module Helpers
3
- module Iptables
4
- include FirewallCookbook::Helpers
5
- include Chef::Mixin::ShellOut
6
-
7
- CHAIN = { in: 'INPUT', out: 'OUTPUT', pre: 'PREROUTING', post: 'POSTROUTING' }.freeze unless defined? CHAIN # , nil => "FORWARD"}
8
- TARGET = { allow: 'ACCEPT', reject: 'REJECT', deny: 'DROP', masquerade: 'MASQUERADE', redirect: 'REDIRECT', log: 'LOG --log-prefix "iptables: " --log-level 7' }.freeze unless defined? TARGET
9
-
10
- def build_firewall_rule(current_node, rule_resource, ipv6 = false)
11
- el5 = current_node['platform_family'] == 'rhel' && Gem::Dependency.new('', '~> 5.0').match?('', current_node['platform_version'])
12
-
13
- return rule_resource.raw.strip if rule_resource.raw
14
- firewall_rule = if rule_resource.direction
15
- "-A #{CHAIN[rule_resource.direction.to_sym]} "
16
- else
17
- '-A FORWARD '
18
- end
19
-
20
- if [:pre, :post].include?(rule_resource.direction)
21
- firewall_rule << '-t nat '
22
- end
23
-
24
- # Iptables order of prameters is important here see example output below:
25
- # -A INPUT -s 1.2.3.4/32 -d 5.6.7.8/32 -i lo -p tcp -m tcp -m state --state NEW -m comment --comment "hello" -j DROP
26
- firewall_rule << "-s #{ip_with_mask(rule_resource, rule_resource.source)} " if rule_resource.source && rule_resource.source != '0.0.0.0/0'
27
- firewall_rule << "-d #{rule_resource.destination} " if rule_resource.destination
28
-
29
- firewall_rule << "-i #{rule_resource.interface} " if rule_resource.interface
30
- firewall_rule << "-o #{rule_resource.dest_interface} " if rule_resource.dest_interface
31
-
32
- firewall_rule << "-p #{rule_resource.protocol} " if rule_resource.protocol && rule_resource.protocol.to_s.to_sym != :none
33
- firewall_rule << '-m tcp ' if rule_resource.protocol && rule_resource.protocol.to_s.to_sym == :tcp
34
-
35
- # using multiport here allows us to simplify our greps and rule building
36
- firewall_rule << "-m multiport --sports #{port_to_s(rule_resource.source_port)} " if rule_resource.source_port
37
- firewall_rule << "-m multiport --dports #{port_to_s(dport_calc(rule_resource))} " if dport_calc(rule_resource)
38
-
39
- firewall_rule << "-m state --state #{rule_resource.stateful.is_a?(Array) ? rule_resource.stateful.join(',').upcase : rule_resource.stateful.upcase} " if rule_resource.stateful
40
- # the comments extension is not available for ip6tables on rhel/centos 5
41
- unless el5 && ipv6
42
- firewall_rule << "-m comment --comment \"#{rule_resource.description}\" " if rule_resource.include_comment
43
- end
44
-
45
- firewall_rule << "-j #{TARGET[rule_resource.command.to_sym]} "
46
- firewall_rule << "--to-ports #{rule_resource.redirect_port} " if rule_resource.command == :redirect
47
- firewall_rule.strip!
48
- firewall_rule
49
- end
50
-
51
- def iptables_packages(new_resource)
52
- packages = if ipv6_enabled?(new_resource) && !amazon_linux? && node['platform_version'].to_i < 8
53
- %w(iptables iptables-ipv6)
54
- else
55
- %w(iptables)
56
- end
57
-
58
- # centos 7 requires extra service
59
- if (!debian?(node) && node['platform_version'].to_i >= 7) || amazon_linux?
60
- packages << %w(iptables-services)
61
- end
62
-
63
- packages.flatten
64
- end
65
-
66
- def iptables_commands(new_resource)
67
- if ipv6_enabled?(new_resource)
68
- %w(iptables ip6tables)
69
- else
70
- %w(iptables)
71
- end
72
- end
73
-
74
- def log_iptables(new_resource)
75
- iptables_commands(new_resource).each do |cmd|
76
- shell_out!("#{cmd} -L -n")
77
- end
78
- rescue
79
- Chef::Log.info('log_iptables failed!')
80
- end
81
-
82
- def iptables_flush!(new_resource)
83
- iptables_commands(new_resource).each do |cmd|
84
- shell_out!("#{cmd} -F")
85
- end
86
- end
87
-
88
- def iptables_default_allow!(new_resource)
89
- iptables_commands(new_resource).each do |cmd|
90
- shell_out!("#{cmd} -P INPUT ACCEPT")
91
- shell_out!("#{cmd} -P OUTPUT ACCEPT")
92
- shell_out!("#{cmd} -P FORWARD ACCEPT")
93
- end
94
- end
95
-
96
- def default_ruleset(current_node)
97
- current_node['firewall']['iptables']['defaults'][:ruleset].to_h
98
- end
99
-
100
- def ensure_default_rules_exist(current_node, new_resource)
101
- input = new_resource.rules
102
-
103
- # don't use iptables_commands here since we do populate the
104
- # hash regardless of ipv6 status
105
- %w(iptables ip6tables).each do |name|
106
- input[name] = {} unless input[name]
107
- input[name].merge!(default_ruleset(current_node).to_h)
108
- end
109
- end
110
- end
111
- end
112
- end
@@ -1,170 +0,0 @@
1
- module FirewallCookbook
2
- module Helpers
3
- module Nftables
4
- include FirewallCookbook::Helpers
5
-
6
- CHAIN ||= {
7
- in: 'INPUT',
8
- out: 'OUTPUT',
9
- pre: 'PREROUTING',
10
- post: 'POSTROUTING',
11
- forward: 'FORWARD',
12
- }.freeze
13
-
14
- TARGET ||= {
15
- accept: 'accept',
16
- allow: 'accept',
17
- counter: 'counter',
18
- deny: 'drop',
19
- drop: 'drop',
20
- log: 'log',
21
- masquerade: 'masquerade',
22
- redirect: 'redirect',
23
- reject: 'reject',
24
- }.freeze
25
-
26
- def port_to_s(ports)
27
- case ports
28
- when String
29
- ports
30
- when Integer
31
- ports.to_s
32
- when Array
33
- p_strings = ports.map { |o| port_to_s(o) }
34
- "{#{p_strings.sort.join(',')}}"
35
- when Range
36
- "#{ports.first}-#{ports.last}"
37
- else
38
- raise "unknown class of port definition: #{ports.class}"
39
- end
40
- end
41
-
42
- def nftables_command_log(rule_resource)
43
- log_prefix = 'prefix '
44
- log_prefix << if rule_resource.log_prefix.nil?
45
- "\"#{CHAIN[rule_resource.direction]}:\""
46
- else
47
- "\"#{rule_resource.log_prefix}\""
48
- end
49
- log_group = if rule_resource.log_group.nil?
50
- nil
51
- else
52
- "group #{rule_resource.log_group} "
53
- end
54
- "log #{log_prefix} #{log_group}"
55
- end
56
-
57
- def nftables_command_redirect(rule_resource)
58
- if rule_resource.redirect_port.nil?
59
- raise 'Specify redirect_port when using :redirect as commmand'
60
- end
61
-
62
- "redirect to #{rule_resource.redirect_port} "
63
- end
64
-
65
- def nftables_commands(rule_resource)
66
- firewall_rule = ''
67
- Array(rule_resource.command).each do |command|
68
- begin
69
- target = TARGET.fetch(command)
70
- rescue KeyError
71
- raise "Invalid command: #{command.inspect}. Use one of #{TARGET.keys}"
72
- end
73
- firewall_rule << case target
74
- when 'log'
75
- nftables_command_log(rule_resource)
76
- when 'redirect'
77
- nftables_command_redirect(rule_resource)
78
- else
79
- "#{TARGET[command.to_sym]} "
80
- end
81
- end
82
- firewall_rule
83
- end
84
-
85
- def build_firewall_rule(rule_resource)
86
- return rule_resource.raw.strip if rule_resource.raw
87
-
88
- ip = ipv6_rule?(rule_resource) ? 'ip6' : 'ip'
89
- table = if [:pre, :post].include?(rule_resource.direction)
90
- 'nat'
91
- else
92
- 'filter'
93
- end
94
- firewall_rule = if table == 'nat'
95
- "add rule #{ip} #{table} "
96
- else
97
- "add rule inet #{table} "
98
- end
99
- firewall_rule << "#{CHAIN.fetch(rule_resource.direction.to_sym, 'FORWARD')} "
100
-
101
- firewall_rule << "iif #{rule_resource.interface} " if rule_resource.interface
102
- firewall_rule << "oif #{rule_resource.outerface} " if rule_resource.outerface
103
-
104
- if rule_resource.source
105
- source_with_mask = ip_with_mask(rule_resource, rule_resource.source)
106
- if source_with_mask != '0.0.0.0/0' && source_with_mask != '::/128'
107
- firewall_rule << "#{ip} saddr #{source_with_mask} "
108
- end
109
- end
110
- firewall_rule << "#{ip} daddr #{rule_resource.destination} " if rule_resource.destination
111
-
112
- case rule_resource.protocol
113
- when :icmp
114
- firewall_rule << 'icmp type echo-request '
115
- when :'ipv6-icmp', :icmpv6
116
- firewall_rule << 'icmpv6 type { echo-request, nd-router-solicit, nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } '
117
- when :tcp, :udp
118
- firewall_rule << "#{rule_resource.protocol} sport #{port_to_s(rule_resource.sport)} " if rule_resource.sport
119
- firewall_rule << "#{rule_resource.protocol} dport #{port_to_s(rule_resource.dport)} " if rule_resource.dport
120
- when :esp, :ah
121
- firewall_rule << "#{ip} #{ip == 'ip6' ? 'nexthdr' : 'protocol'} #{rule_resource.protocol} "
122
- when :ipv6, :none
123
- # nothing to do
124
- end
125
-
126
- firewall_rule << "ct state #{Array(rule_resource.stateful).join(',').downcase} " if rule_resource.stateful
127
- firewall_rule << nftables_commands(rule_resource)
128
- firewall_rule << "comment \"#{rule_resource.description}\" " if rule_resource.include_comment
129
- firewall_rule.strip!
130
- firewall_rule
131
- end
132
-
133
- def default_ruleset(new_resource)
134
- rules = {
135
- 'add table inet filter' => 1,
136
- "add chain inet filter INPUT { type filter hook input priority 0 ; policy #{new_resource.input_policy}; }" => 2,
137
- "add chain inet filter OUTPUT { type filter hook output priority 0 ; policy #{new_resource.output_policy}; }" => 2,
138
- "add chain inet filter FORWARD { type filter hook forward priority 0 ; policy #{new_resource.forward_policy}; }" => 2,
139
- }
140
- if new_resource.table_ip_nat
141
- rules['add table ip nat'] = 1
142
- rules['add chain ip nat POSTROUTING { type nat hook postrouting priority 100 ;}'] = 2
143
- rules['add chain ip nat PREROUTING { type nat hook prerouting priority -100 ;}'] = 2
144
- end
145
- if new_resource.table_ip6_nat
146
- rules['add table ip6 nat'] = 1
147
- rules['add chain ip6 nat POSTROUTING { type nat hook postrouting priority 100 ;}'] = 2
148
- rules['add chain ip6 nat PREROUTING { type nat hook prerouting priority -100 ;}'] = 2
149
- end
150
- rules
151
- end
152
-
153
- def ensure_default_rules_exist(new_resource)
154
- input = new_resource.rules || {}
155
- input.merge!(default_ruleset(new_resource))
156
- end
157
-
158
- def default_nftables_conf_path
159
- case node['platform_family']
160
- when 'rhel'
161
- '/etc/sysconfig/nftables.conf'
162
- when 'debian'
163
- '/etc/nftables.conf'
164
- else
165
- raise "default_nftables_conf_path: Unsupported platform_family #{node['platform_family']}."
166
- end
167
- end
168
- end
169
- end
170
- end
@@ -1,142 +0,0 @@
1
- module FirewallCookbook
2
- module Helpers
3
- module Ufw
4
- include FirewallCookbook::Helpers
5
- include Chef::Mixin::ShellOut
6
-
7
- def ufw_rules_filename
8
- '/etc/default/ufw-chef.rules'
9
- end
10
-
11
- def ufw_active?
12
- cmd = shell_out!('ufw', 'status')
13
- cmd.stdout =~ /^Status:\sactive/
14
- end
15
-
16
- def ufw_disable!
17
- shell_out!('ufw', 'disable', input: 'yes')
18
- end
19
-
20
- def ufw_enable!
21
- shell_out!('ufw', 'enable', input: 'yes')
22
- end
23
-
24
- def ufw_reset!
25
- shell_out!('ufw', 'reset', input: 'yes')
26
- end
27
-
28
- def ufw_logging!(param)
29
- shell_out!('ufw', 'logging', param.to_s)
30
- end
31
-
32
- def ufw_rule!(cmd)
33
- shell_out!(cmd, input: 'yes')
34
- end
35
-
36
- def build_rule(new_resource)
37
- Chef::Log.info("#{new_resource.name} apply_rule #{new_resource.command}")
38
-
39
- # if we don't do this, we may see some bugs where traffic is opened on all ports to all hosts when only RELATED,ESTABLISHED was intended
40
- if new_resource.stateful
41
- msg = ''
42
- msg << "firewall_rule[#{new_resource.name}] was asked to "
43
- msg << "#{new_resource.command} a stateful rule using #{new_resource.stateful} "
44
- msg << 'but ufw does not support this kind of rule. Consider guarding by platform_family.'
45
- raise msg
46
- end
47
-
48
- # if we don't do this, ufw will fail as it does not support protocol numbers, so we'll only allow it to run if specifying icmp/tcp/udp protocol types
49
- if new_resource.protocol && !new_resource.protocol.to_s.downcase.match('^(tcp|udp|esp|ah|ipv6|none)$')
50
- msg = ''
51
- msg << "firewall_rule[#{new_resource.name}] was asked to "
52
- msg << "#{new_resource.command} a rule using protocol #{new_resource.protocol} "
53
- msg << 'but ufw does not support this kind of rule. Consider guarding by platform_family.'
54
- raise msg
55
- end
56
-
57
- # some examples:
58
- # ufw allow from 192.168.0.4 to any port 22
59
- # ufw deny proto tcp from 10.0.0.0/8 to 192.168.0.1 port 25
60
- # ufw insert 1 allow proto tcp from 0.0.0.0/0 to 192.168.0.1 port 25
61
-
62
- if new_resource.raw
63
- "ufw #{new_resource.raw.strip}"
64
- else
65
- "ufw #{rule(new_resource)}"
66
- end
67
- end
68
-
69
- def rule(new_resource)
70
- rule = ''
71
- rule << "#{new_resource.command} "
72
- rule << rule_interface(new_resource)
73
- rule << rule_logging(new_resource)
74
- rule << rule_proto(new_resource)
75
- rule << rule_dest_port(new_resource)
76
- rule << rule_source_port(new_resource)
77
- rule << rule_description(new_resource)
78
- rule = rule.strip
79
-
80
- if rule == 'ufw allow in proto tcp to any from any'
81
- Chef::Log.warn("firewall_rule[#{new_resource.name}] produced a rule that opens all traffic. This may be a logic error in your cookbook.")
82
- end
83
-
84
- rule
85
- end
86
-
87
- def rule_interface(new_resource)
88
- rule = ''
89
- rule << "#{new_resource.direction} " if new_resource.direction
90
- rule << "on #{new_resource.interface} " if new_resource.interface && new_resource.direction
91
- rule << "in on #{new_resource.interface} " if new_resource.interface && !new_resource.direction
92
- rule
93
- end
94
-
95
- def rule_proto(new_resource)
96
- rule = ''
97
- rule << "proto #{new_resource.protocol} " if new_resource.protocol && new_resource.protocol.to_s.to_sym != :none
98
- rule
99
- end
100
-
101
- def rule_description(new_resource)
102
- rule = ''
103
- rule << "comment \"#{new_resource.description}\" " if new_resource.description && new_resource.include_comment
104
- rule
105
- end
106
-
107
- def rule_dest_port(new_resource)
108
- rule = if new_resource.destination
109
- "to #{new_resource.destination} "
110
- else
111
- 'to any '
112
- end
113
- rule << "port #{port_to_s(dport_calc(new_resource))} " if dport_calc(new_resource)
114
- rule
115
- end
116
-
117
- def rule_source_port(new_resource)
118
- rule = if new_resource.source
119
- "from #{new_resource.source} "
120
- else
121
- 'from any '
122
- end
123
-
124
- if new_resource.source_port
125
- rule << "port #{port_to_s(new_resource.source_port)} "
126
- end
127
- rule
128
- end
129
-
130
- def rule_logging(new_resource)
131
- case new_resource.logging && new_resource.logging.to_sym
132
- when :connections
133
- 'log '
134
- when :packets
135
- 'log-all '
136
- else
137
- ''
138
- end
139
- end
140
- end
141
- end
142
- end
@@ -1,129 +0,0 @@
1
- module FirewallCookbook
2
- module Helpers
3
- module Windows
4
- include FirewallCookbook::Helpers
5
- include Chef::Mixin::ShellOut
6
-
7
- def fixup_cidr(str)
8
- newstr = str.clone
9
- newstr.gsub!('0.0.0.0/0', 'any') if newstr.include?('0.0.0.0/0')
10
- newstr.gsub!('/0', '') if newstr.include?('/0')
11
- newstr
12
- end
13
-
14
- def windows_rules_filename
15
- "#{ENV['HOME']}/windows-chef.rules"
16
- end
17
-
18
- def active?
19
- @active ||= begin
20
- cmd = shell_out!('netsh advfirewall show currentprofile')
21
- cmd.stdout =~ /^State\sON/
22
- end
23
- end
24
-
25
- def enable!
26
- shell_out!('netsh advfirewall set currentprofile state on')
27
- end
28
-
29
- def disable!
30
- shell_out!('netsh advfirewall set currentprofile state off')
31
- end
32
-
33
- def reset!
34
- shell_out!('netsh advfirewall reset')
35
- end
36
-
37
- def add_rule!(params)
38
- shell_out!("netsh advfirewall #{params}")
39
- end
40
-
41
- def delete_all_rules!
42
- shell_out!('netsh advfirewall firewall delete rule name=all')
43
- end
44
-
45
- def to_type(new_resource)
46
- cmd = new_resource.command
47
- if cmd == :reject || cmd == :deny
48
- :block
49
- else
50
- :allow
51
- end
52
- end
53
-
54
- def build_rule(new_resource)
55
- type = to_type(new_resource)
56
- parameters = {}
57
-
58
- parameters['description'] = "\"#{new_resource.description}\""
59
- parameters['dir'] = new_resource.direction
60
-
61
- new_resource.program && parameters['program'] = new_resource.program
62
- new_resource.service && parameters['service'] = new_resource.service
63
- parameters['protocol'] = new_resource.protocol
64
-
65
- if new_resource.direction.to_sym == :out
66
- parameters['localip'] = new_resource.source ? fixup_cidr(new_resource.source) : 'any'
67
- parameters['localport'] = new_resource.source_port ? port_to_s(new_resource.source_port) : 'any'
68
- parameters['interfacetype'] = new_resource.interface || 'any'
69
- parameters['remoteip'] = new_resource.destination ? fixup_cidr(new_resource.destination) : 'any'
70
- parameters['remoteport'] = new_resource.dest_port ? port_to_s(new_resource.dest_port) : 'any'
71
- else
72
- parameters['localip'] = new_resource.destination || 'any'
73
- parameters['localport'] = dport_calc(new_resource) ? port_to_s(dport_calc(new_resource)) : 'any'
74
- parameters['interfacetype'] = new_resource.dest_interface || 'any'
75
- parameters['remoteip'] = new_resource.source ? fixup_cidr(new_resource.source) : 'any'
76
- parameters['remoteport'] = new_resource.source_port ? port_to_s(new_resource.source_port) : 'any'
77
- end
78
-
79
- parameters['action'] = type.to_s
80
-
81
- partial_command = parameters.map { |k, v| "#{k}=#{v}" }.join(' ')
82
- "firewall add rule name=\"#{new_resource.name}\" #{partial_command}"
83
- end
84
-
85
- def rule_exists?(name)
86
- @exists ||= begin
87
- cmd = shell_out!("netsh advfirewall firewall show rule name=\"#{name}\"", returns: [0, 1])
88
- cmd.stdout !~ /^No rules match the specified criteria/
89
- end
90
- end
91
-
92
- def show_all_rules!
93
- cmd = shell_out!('netsh advfirewall firewall show rule name=all')
94
- cmd.stdout.each_line do |line|
95
- Chef::Log.warn(line)
96
- end
97
- end
98
-
99
- def rule_up_to_date?(name, type)
100
- @up_to_date ||= begin
101
- desired_parameters = rule_parameters(type)
102
- current_parameters = {}
103
-
104
- cmd = shell_out!("netsh advfirewall firewall show rule name=\"#{name}\" verbose")
105
- cmd.stdout.each_line do |line|
106
- current_parameters['description'] = "\"#{Regexp.last_match(1).chomp}\"" if line =~ /^Description:\s+(.*)$/
107
- current_parameters['dir'] = Regexp.last_match(1).chomp if line =~ /^Direction:\s+(.*)$/
108
- current_parameters['program'] = Regexp.last_match(1).chomp if line =~ /^Program:\s+(.*)$/
109
- current_parameters['service'] = Regexp.last_match(1).chomp if line =~ /^Service:\s+(.*)$/
110
- current_parameters['protocol'] = Regexp.last_match(1).chomp if line =~ /^Protocol:\s+(.*)$/
111
- current_parameters['localip'] = Regexp.last_match(1).chomp if line =~ /^LocalIP:\s+(.*)$/
112
- current_parameters['localport'] = Regexp.last_match(1).chomp if line =~ /^LocalPort:\s+(.*)$/
113
- current_parameters['interfacetype'] = Regexp.last_match(1).chomp if line =~ /^InterfaceTypes:\s+(.*)$/
114
- current_parameters['remoteip'] = Regexp.last_match(1).chomp if line =~ /^RemoteIP:\s+(.*)$/
115
- current_parameters['remoteport'] = Regexp.last_match(1).chomp if line =~ /^RemotePort:\s+(.*)$/
116
- current_parameters['action'] = Regexp.last_match(1).chomp if line =~ /^Action:\s+(.*)$/
117
- end
118
-
119
- up_to_date = true
120
- desired_parameters.each do |k, v|
121
- up_to_date = false if current_parameters[k] !~ /^["]?#{v}["]?$/i
122
- end
123
-
124
- up_to_date
125
- end
126
- end
127
- end
128
- end
129
- end