Faidon has submitted this change and it was merged.
Change subject: Add an initial ferm module & base::firewall class
......................................................................
Add an initial ferm module & base::firewall class
Change-Id: I6ea6ed5837cc8912e1f6bde226b637d9a1e6c65c
Warning: hasn't been tested in labs yet.
---
A files/firewall/defs.production
M manifests/base.pp
A modules/ferm/files/ferm.conf
A modules/ferm/files/ferm.default
A modules/ferm/files/functions.conf
A modules/ferm/files/minimal_ruleset.conf
A modules/ferm/manifests/conf.pp
A modules/ferm/manifests/init.pp
A modules/ferm/manifests/rule.pp
A modules/ferm/manifests/service.pp
A modules/ferm/templates/rule.erb
A modules/ferm/templates/service.erb
12 files changed, 210 insertions(+), 0 deletions(-)
Approvals:
Faidon: Looks good to me, approved
jenkins-bot: Verified
diff --git a/files/firewall/defs.production b/files/firewall/defs.production
new file mode 100644
index 0000000..d3ec91e
--- /dev/null
+++ b/files/firewall/defs.production
@@ -0,0 +1,3 @@
+@def $BASTION_V4 = (208.80.152.165 208.80.154.149 91.198.174.113);
+@def $BASTION_V6 = (2620:0:860:2:21e:c9ff:feea:ab95
2620:0:861:2:7a2b:cbff:fe09:11ba 2620:0:862:1:a6ba:dbff:fe30:d770);
+@def $BASTION = ($BASTION_V4 $BASTION_V6);
diff --git a/manifests/base.pp b/manifests/base.pp
index 9a643bd..5e048c6 100644
--- a/manifests/base.pp
+++ b/manifests/base.pp
@@ -733,6 +733,22 @@
}
}
+# Don't include this sub class on all hosts yet
+class base::firewall {
+ class { 'ferm': default_firewall => false } # Do NOT create a default
DROP firewall for now
+
+ ferm::conf { 'defs':
+ ensure => present,
+ prio => '00',
+ source => "puppet:///files/firewall/defs.${::realm}",
+ }
+
+ ferm::rule { 'bastion-ssh':
+ ensure => present,
+ rule => 'proto tcp dport ssh saddr $BASTION ACCEPT',
+ }
+}
+
class base {
include apt
include apt::update
diff --git a/modules/ferm/files/ferm.conf b/modules/ferm/files/ferm.conf
new file mode 100644
index 0000000..6353fd2
--- /dev/null
+++ b/modules/ferm/files/ferm.conf
@@ -0,0 +1,3 @@
+@include 'functions.conf';
+
+@include 'conf.d/';
diff --git a/modules/ferm/files/ferm.default b/modules/ferm/files/ferm.default
new file mode 100644
index 0000000..7864a2e
--- /dev/null
+++ b/modules/ferm/files/ferm.default
@@ -0,0 +1,14 @@
+# configuration for /etc/init.d/ferm
+
+# use iptables-restore for fast firewall initialization?
+FAST=yes
+
+# cache the output of ferm --lines in /var/cache/ferm?
+CACHE=yes
+
+# additional paramaters for ferm (like --def '$foo=bar')
+OPTIONS=
+
+# Enable ferm on bootup?
+ENABLED=yes
+
diff --git a/modules/ferm/files/functions.conf
b/modules/ferm/files/functions.conf
new file mode 100644
index 0000000..d218e3d
--- /dev/null
+++ b/modules/ferm/files/functions.conf
@@ -0,0 +1,12 @@
+# Public, unrestricted services
+@def &SERVICE($proto, $port) = {
+ domain (ip ip6) chain INPUT {
+ proto $proto dport $port ACCEPT;
+ }
+}
+
+@def &R_SERVICE($proto, $port, $srange) = {
+ domain (ip ip6) chain INPUT {
+ proto $proto dport $port saddr $srange ACCEPT;
+ }
+}
diff --git a/modules/ferm/files/minimal_ruleset.conf
b/modules/ferm/files/minimal_ruleset.conf
new file mode 100644
index 0000000..b385676
--- /dev/null
+++ b/modules/ferm/files/minimal_ruleset.conf
@@ -0,0 +1,23 @@
+# basic minimal ruleset
+domain (ip ip6) {
+ chain INPUT {
+ # Default policy
+ policy DROP;
+
+ # Accept established and related connections
+ mod state state (ESTABLISHED RELATED) ACCEPT;
+
+ # Accept all loopback traffic
+ interface lo ACCEPT;
+
+ # Accept all multicast traffic
+ mod pkttype pkt-type multicast ACCEPT;
+
+ # Drop malformed TCP packets
+ proto tcp mod state state NEW !syn DROP;
+
+ # Accept ICMP. Invalid ICMP packets should have been dropped by
now anyway.
+ proto icmp ACCEPT;
+
+ }
+}
diff --git a/modules/ferm/manifests/conf.pp b/modules/ferm/manifests/conf.pp
new file mode 100644
index 0000000..81f7aa1
--- /dev/null
+++ b/modules/ferm/manifests/conf.pp
@@ -0,0 +1,16 @@
+define ferm::conf(
+ $source,
+ $ensure='present',
+ $prio='10',
+) {
+ @file { "/etc/ferm/conf.d/${prio}_${name}":
+ ensure => $ensure,
+ owner => root,
+ group => root,
+ mode => '0400',
+ source => $source,
+ require => File['/etc/ferm/conf.d'],
+ notify => Service['ferm'],
+ tag => 'ferm',
+ }
+}
diff --git a/modules/ferm/manifests/init.pp b/modules/ferm/manifests/init.pp
new file mode 100644
index 0000000..7fa7770
--- /dev/null
+++ b/modules/ferm/manifests/init.pp
@@ -0,0 +1,69 @@
+class ferm(
+$default_firewall=true
+) {
+ package { 'ferm':
+ ensure => present,
+ }
+
+ service { 'ferm':
+ hasstatus => false,
+ status => '/bin/true',
+ require => Package['ferm'],
+ }
+
+ file { '/etc/ferm/ferm.conf':
+ ensure => present,
+ owner => root,
+ group => root,
+ mode => '0400',
+ source => 'puppet:///modules/ferm/ferm.conf',
+ require => Package['ferm'],
+ notify => Service['ferm'],
+ }
+
+ file { '/etc/ferm/functions.conf' :
+ ensure => present,
+ owner => root,
+ group => root,
+ mode => '0400',
+ source => 'puppet:///modules/ferm/functions.conf',
+ require => Package['ferm'],
+ notify => Service['ferm'],
+ }
+
+ file { '/etc/ferm/conf.d' :
+ ensure => directory,
+ owner => root,
+ group => adm,
+ mode => '0500',
+ recurse => true,
+ purge => true,
+ require => Package['ferm'],
+ notify => Service['ferm'],
+ }
+
+ file { '/etc/ferm/conf.d/minimal_ruleset.conf':
+ owner => root,
+ group => root,
+ mode => 0444,
+ notify => Service['ferm'],
+ ensure => $default_firewall ? {
+ true => present,
+ default => absent
+ },
+ }
+
+ file { '/etc/default/ferm' :
+ ensure => present,
+ owner => root,
+ group => root,
+ mode => '0400',
+ source => 'puppet:///modules/ferm/ferm.default',
+ require => Package['ferm'],
+ notify => Service['ferm'],
+ }
+
+ # the rules are virtual resources for cases where they are defined in a
+ # class but the host doesn't have the ferm class included
+ File <| tag == 'ferm' |>
+}
diff --git a/modules/ferm/manifests/rule.pp b/modules/ferm/manifests/rule.pp
new file mode 100644
index 0000000..d5265d0
--- /dev/null
+++ b/modules/ferm/manifests/rule.pp
@@ -0,0 +1,20 @@
+define ferm::rule(
+ $rule,
+ $ensure='present',
+ $domain='(ip ip6)',
+ $table='filter',
+ $chain='INPUT',
+ $desc='',
+ $prio='10',
+) {
+ @file { "/etc/ferm/conf.d/${prio}_${name}":
+ ensure => $ensure,
+ owner => root,
+ group => root,
+ mode => '0400',
+ content => template('ferm/custom.erb'),
+ require => File['/etc/ferm/conf.d'],
+ notify => Service['ferm'],
+ tag => 'ferm',
+ }
+}
diff --git a/modules/ferm/manifests/service.pp
b/modules/ferm/manifests/service.pp
new file mode 100644
index 0000000..1d30084
--- /dev/null
+++ b/modules/ferm/manifests/service.pp
@@ -0,0 +1,18 @@
+define ferm::service(
+ $proto,
+ $port,
+ $ensure='present',
+ $desc='',
+ $prio='10',
+) {
+ @file { "/etc/ferm/conf.d/${prio}_${name}":
+ ensure => $ensure,
+ owner => root,
+ group => root,
+ mode => '0400',
+ content => template('ferm/service.erb'),
+ require => File['/etc/ferm/conf.d'],
+ notify => Service['ferm'],
+ tag => 'ferm',
+ }
+}
diff --git a/modules/ferm/templates/rule.erb b/modules/ferm/templates/rule.erb
new file mode 100644
index 0000000..a5fa7cb
--- /dev/null
+++ b/modules/ferm/templates/rule.erb
@@ -0,0 +1,11 @@
+# Autogenerated by puppet. DO NOT EDIT BY HAND!
+#
+# <%= prio %>_<%= name %>: <%= desc %>
+
+domain <%= domain %> {
+ table <%= table %> {
+ chain <%= chain %> {
+ <%= rule %>;
+ }
+ }
+}
diff --git a/modules/ferm/templates/service.erb
b/modules/ferm/templates/service.erb
new file mode 100644
index 0000000..7635fcb
--- /dev/null
+++ b/modules/ferm/templates/service.erb
@@ -0,0 +1,5 @@
+# Autogenerated by puppet. DO NOT EDIT BY HAND!
+#
+# <%= desc %>
+
+&SERVICE(<%= proto %>, <%= port %>);
--
To view, visit https://gerrit.wikimedia.org/r/61744
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I6ea6ed5837cc8912e1f6bde226b637d9a1e6c65c
Gerrit-PatchSet: 6
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Faidon <[email protected]>
Gerrit-Reviewer: Faidon <[email protected]>
Gerrit-Reviewer: Mark Bergsma <[email protected]>
Gerrit-Reviewer: Ryan Lane <[email protected]>
Gerrit-Reviewer: Tim Starling <[email protected]>
Gerrit-Reviewer: jenkins-bot
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits