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.
- checksums.yaml +4 -4
- data/Berksfile +2 -3
- data/Berksfile.lock +11 -14
- data/bin/mu-aws-setup +16 -4
- data/bin/mu-configure +2 -1
- data/cloud-mu.gemspec +2 -2
- data/cookbooks/mu-firewall/Berksfile +1 -1
- data/cookbooks/mu-firewall/attributes/default.rb +2 -2
- data/cookbooks/mu-firewall/metadata.rb +3 -3
- data/cookbooks/mu-firewall/recipes/default.rb +11 -2
- data/cookbooks/mu-master/Berksfile +1 -1
- data/cookbooks/mu-master/attributes/default.rb +14 -1
- data/cookbooks/mu-master/files/default/389ds-perl/ASDialogs.pm +173 -0
- data/cookbooks/mu-master/files/default/389ds-perl/AdminMigration.pm +569 -0
- data/cookbooks/mu-master/files/default/389ds-perl/AdminServer.pm +952 -0
- data/cookbooks/mu-master/files/default/389ds-perl/AdminUtil.pm +983 -0
- data/cookbooks/mu-master/files/default/389ds-perl/ConfigDSDialogs.pm +449 -0
- data/cookbooks/mu-master/files/default/389ds-perl/DSCreate.pm +1551 -0
- data/cookbooks/mu-master/files/default/389ds-perl/DSDialogs.pm +233 -0
- data/cookbooks/mu-master/files/default/389ds-perl/DSMigration.pm +1175 -0
- data/cookbooks/mu-master/files/default/389ds-perl/DSUpdate.pm +534 -0
- data/cookbooks/mu-master/files/default/389ds-perl/DSUpdateDialogs.pm +152 -0
- data/cookbooks/mu-master/files/default/389ds-perl/DSUtil.pm +1710 -0
- data/cookbooks/mu-master/files/default/389ds-perl/Dialog.pm +249 -0
- data/cookbooks/mu-master/files/default/389ds-perl/DialogManager.pm +212 -0
- data/cookbooks/mu-master/files/default/389ds-perl/FileConn.pm +461 -0
- data/cookbooks/mu-master/files/default/389ds-perl/Inf.pm +268 -0
- data/cookbooks/mu-master/files/default/389ds-perl/Migration.pm +327 -0
- data/cookbooks/mu-master/files/default/389ds-perl/RegDSDialogs.pm +94 -0
- data/cookbooks/mu-master/files/default/389ds-perl/Resource.pm +137 -0
- data/cookbooks/mu-master/files/default/389ds-perl/Setup.pm +240 -0
- data/cookbooks/mu-master/files/default/389ds-perl/SetupDialogs.pm +243 -0
- data/cookbooks/mu-master/files/default/389ds-perl/SetupLog.pm +82 -0
- data/cookbooks/mu-master/files/default/setCertName.ldif +4 -0
- data/cookbooks/mu-master/libraries/mu.rb +2 -2
- data/cookbooks/mu-master/metadata.rb +1 -1
- data/cookbooks/mu-master/recipes/389ds.rb +71 -32
- data/cookbooks/mu-master/recipes/basepackages.rb +5 -0
- data/cookbooks/mu-master/recipes/default.rb +16 -5
- data/cookbooks/mu-master/recipes/init.rb +36 -3
- data/cookbooks/mu-master/recipes/ssl-certs.rb +6 -0
- data/cookbooks/mu-master/recipes/sssd.rb +85 -62
- data/cookbooks/mu-master/recipes/update_nagios_only.rb +7 -1
- data/cookbooks/mu-master/templates/default/389-directory-setup.inf.erb +11 -26
- data/cookbooks/mu-master/templates/default/sssd.conf.erb +18 -8
- data/cookbooks/mu-tools/files/default/Mu_CA.pem +33 -0
- data/cookbooks/mu-tools/metadata.rb +0 -1
- data/cookbooks/mu-tools/recipes/set_local_fw.rb +7 -1
- data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +5 -1
- data/cookbooks/nagios/CHANGELOG.md +679 -0
- data/cookbooks/nagios/LICENSE +201 -0
- data/cookbooks/nagios/README.md +340 -0
- data/cookbooks/nagios/attributes/config.rb +163 -0
- data/cookbooks/nagios/attributes/default.rb +204 -0
- data/cookbooks/nagios/libraries/base.rb +311 -0
- data/cookbooks/nagios/libraries/command.rb +68 -0
- data/cookbooks/nagios/libraries/contact.rb +229 -0
- data/cookbooks/nagios/libraries/contactgroup.rb +111 -0
- data/cookbooks/{firewall/recipes/disable_firewall.rb → nagios/libraries/custom_option.rb} +20 -7
- data/cookbooks/nagios/libraries/data_bag_helper.rb +23 -0
- data/cookbooks/nagios/libraries/default.rb +90 -0
- data/cookbooks/nagios/libraries/helpers.rb +229 -0
- data/cookbooks/nagios/libraries/host.rb +410 -0
- data/cookbooks/nagios/libraries/hostdependency.rb +178 -0
- data/cookbooks/nagios/libraries/hostescalation.rb +170 -0
- data/cookbooks/nagios/libraries/hostgroup.rb +117 -0
- data/cookbooks/nagios/libraries/nagios.rb +277 -0
- data/cookbooks/nagios/libraries/resource.rb +59 -0
- data/cookbooks/nagios/libraries/service.rb +449 -0
- data/cookbooks/nagios/libraries/servicedependency.rb +213 -0
- data/cookbooks/nagios/libraries/serviceescalation.rb +193 -0
- data/cookbooks/nagios/libraries/servicegroup.rb +142 -0
- data/cookbooks/nagios/libraries/timeperiod.rb +159 -0
- data/cookbooks/nagios/libraries/users_helper.rb +54 -0
- data/cookbooks/nagios/metadata.json +44 -0
- data/cookbooks/nagios/metadata.rb +22 -0
- data/cookbooks/nagios/recipes/_load_databag_config.rb +153 -0
- data/cookbooks/nagios/recipes/_load_default_config.rb +241 -0
- data/cookbooks/nagios/recipes/apache.rb +114 -0
- data/cookbooks/nagios/recipes/default.rb +41 -0
- data/cookbooks/nagios/recipes/nginx.rb +114 -0
- data/cookbooks/nagios/recipes/pagerduty.rb +95 -0
- data/cookbooks/nagios/recipes/server.rb +182 -0
- data/cookbooks/nagios/recipes/server_package.rb +85 -0
- data/cookbooks/nagios/recipes/server_source.rb +137 -0
- data/cookbooks/nagios/resources/command.rb +34 -0
- data/cookbooks/nagios/resources/conf.rb +52 -0
- data/cookbooks/nagios/resources/contact.rb +34 -0
- data/cookbooks/nagios/resources/contactgroup.rb +35 -0
- data/cookbooks/nagios/resources/host.rb +35 -0
- data/cookbooks/nagios/resources/hostdependency.rb +35 -0
- data/cookbooks/nagios/resources/hostescalation.rb +36 -0
- data/cookbooks/nagios/resources/hostgroup.rb +35 -0
- data/cookbooks/nagios/resources/resource.rb +34 -0
- data/cookbooks/nagios/resources/service.rb +35 -0
- data/cookbooks/nagios/resources/servicedependency.rb +35 -0
- data/cookbooks/nagios/resources/serviceescalation.rb +35 -0
- data/cookbooks/nagios/resources/servicegroup.rb +35 -0
- data/cookbooks/nagios/resources/timeperiod.rb +35 -0
- data/cookbooks/nagios/templates/apache2.conf.erb +102 -0
- data/cookbooks/nagios/templates/cgi.cfg.erb +266 -0
- data/cookbooks/nagios/templates/commands.cfg.erb +13 -0
- data/cookbooks/nagios/templates/contacts.cfg.erb +37 -0
- data/cookbooks/nagios/templates/hostgroups.cfg.erb +25 -0
- data/cookbooks/nagios/templates/hosts.cfg.erb +15 -0
- data/cookbooks/nagios/templates/htpasswd.users.erb +6 -0
- data/cookbooks/nagios/templates/nagios.cfg.erb +22 -0
- data/cookbooks/nagios/templates/nginx.conf.erb +80 -0
- data/cookbooks/nagios/templates/pagerduty.cgi.erb +185 -0
- data/cookbooks/nagios/templates/resource.cfg.erb +27 -0
- data/cookbooks/nagios/templates/servicedependencies.cfg.erb +15 -0
- data/cookbooks/nagios/templates/servicegroups.cfg.erb +14 -0
- data/cookbooks/nagios/templates/services.cfg.erb +14 -0
- data/cookbooks/nagios/templates/spawn-fcgi.erb +10 -0
- data/cookbooks/nagios/templates/templates.cfg.erb +31 -0
- data/cookbooks/nagios/templates/timeperiods.cfg.erb +13 -0
- data/extras/platform_berksfile_base +3 -3
- data/extras/python_rpm/build.sh +4 -4
- data/extras/python_rpm/muthon.spec +2 -4
- data/extras/vault_tools/export_vaults.sh +11 -1
- data/install/installer +1 -1
- data/modules/mu/kittens.rb +27523 -0
- data/modules/mu/master/ldap.rb +48 -31
- data/modules/mu/master.rb +69 -0
- data/modules/mu/mu.yaml.rb +351 -0
- data/modules/mu/providers/aws/firewall_rule.rb +3 -1
- data/modules/mu/providers/aws.rb +11 -5
- data/modules/mu.rb +5 -4
- metadata +99 -48
- data/cookbooks/firewall/CHANGELOG.md +0 -488
- data/cookbooks/firewall/LICENSE +0 -202
- data/cookbooks/firewall/README.md +0 -366
- data/cookbooks/firewall/TODO.md +0 -6
- data/cookbooks/firewall/attributes/default.rb +0 -5
- data/cookbooks/firewall/attributes/firewalld.rb +0 -8
- data/cookbooks/firewall/attributes/iptables.rb +0 -17
- data/cookbooks/firewall/attributes/ufw.rb +0 -12
- data/cookbooks/firewall/attributes/windows.rb +0 -8
- data/cookbooks/firewall/libraries/helpers.rb +0 -105
- data/cookbooks/firewall/libraries/helpers_firewalld.rb +0 -116
- data/cookbooks/firewall/libraries/helpers_firewalld_dbus.rb +0 -72
- data/cookbooks/firewall/libraries/helpers_iptables.rb +0 -112
- data/cookbooks/firewall/libraries/helpers_nftables.rb +0 -170
- data/cookbooks/firewall/libraries/helpers_ufw.rb +0 -142
- data/cookbooks/firewall/libraries/helpers_windows.rb +0 -129
- data/cookbooks/firewall/libraries/provider_firewall_firewalld.rb +0 -179
- data/cookbooks/firewall/libraries/provider_firewall_iptables.rb +0 -171
- data/cookbooks/firewall/libraries/provider_firewall_iptables_ubuntu.rb +0 -200
- data/cookbooks/firewall/libraries/provider_firewall_iptables_ubuntu1404.rb +0 -200
- data/cookbooks/firewall/libraries/provider_firewall_rule.rb +0 -34
- data/cookbooks/firewall/libraries/provider_firewall_ufw.rb +0 -138
- data/cookbooks/firewall/libraries/provider_firewall_windows.rb +0 -126
- data/cookbooks/firewall/libraries/resource_firewall.rb +0 -26
- data/cookbooks/firewall/libraries/resource_firewall_rule.rb +0 -52
- data/cookbooks/firewall/metadata.json +0 -40
- data/cookbooks/firewall/metadata.rb +0 -15
- data/cookbooks/firewall/recipes/default.rb +0 -76
- data/cookbooks/firewall/recipes/firewalld.rb +0 -87
- data/cookbooks/firewall/resources/firewalld.rb +0 -28
- data/cookbooks/firewall/resources/firewalld_config.rb +0 -39
- data/cookbooks/firewall/resources/firewalld_helpers.rb +0 -106
- data/cookbooks/firewall/resources/firewalld_icmptype.rb +0 -88
- data/cookbooks/firewall/resources/firewalld_ipset.rb +0 -104
- data/cookbooks/firewall/resources/firewalld_policy.rb +0 -115
- data/cookbooks/firewall/resources/firewalld_service.rb +0 -98
- data/cookbooks/firewall/resources/firewalld_zone.rb +0 -118
- data/cookbooks/firewall/resources/nftables.rb +0 -71
- data/cookbooks/firewall/resources/nftables_rule.rb +0 -113
- data/cookbooks/firewall/templates/default/ufw/default.erb +0 -13
- /data/cookbooks/{firewall → nagios}/chefignore +0 -0
- /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
|