Commit d242d3e07ab21115a5c79e883243365ac913a28e

Authored by nollieheel
Committed by Earth Ugat
1 parent ade90ebc

Version v0.1.1. Include cfe-simple-iptables cookbook.

@@ -19,3 +19,4 @@ bin/* @@ -19,3 +19,4 @@ bin/*
19 .kitchen/ 19 .kitchen/
20 .kitchen.local.yml 20 .kitchen.local.yml
21 .chef 21 .chef
  22 +data_bags
@@ -2,10 +2,10 @@ source "https://supermarket.chef.io" @@ -2,10 +2,10 @@ source "https://supermarket.chef.io"
2 2
3 metadata 3 metadata
4 4
5 -cookbook 'cfe-users', git: 'https://gitlab.chromedia.com/ops/cfe-users.git', tag: 'v0.1.0' 5 +cookbook 'cfe-users', git: 'https://gitlab.chromedia.com/ops/cfe-users.git', tag: 'v0.1.1'
6 cookbook 'cfe-mariadb', git: 'https://gitlab.chromedia.com/ops/cfe-mariadb.git', tag: 'v0.5.0' 6 cookbook 'cfe-mariadb', git: 'https://gitlab.chromedia.com/ops/cfe-mariadb.git', tag: 'v0.5.0'
7 cookbook 'backup-file2s3', git: 'https://gitlab.chromedia.com/ops/backup-file2s3.git', tag: 'v0.3.3' 7 cookbook 'backup-file2s3', git: 'https://gitlab.chromedia.com/ops/backup-file2s3.git', tag: 'v0.3.3'
8 -cookbook 'cfe-nginx-php-fpm', git: 'https://gitlab.chromedia.com/ops/cfe-nginx-php-fpm.git', tag: 'v0.5.1' 8 +cookbook 'cfe-nginx-php-fpm', git: 'https://gitlab.chromedia.com/ops/cfe-nginx-php-fpm.git', tag: 'v0.5.2'
9 cookbook 'cfe-simple-iptables', git: 'https://gitlab.chromedia.com/ops/cfe-simple-iptables.git', tag: 'v0.1.0' 9 cookbook 'cfe-simple-iptables', git: 'https://gitlab.chromedia.com/ops/cfe-simple-iptables.git', tag: 'v0.1.0'
10 10
11 cookbook 'cookbook-letsencrypt', git: 'https://github.com/nollieheel/cookbook-letsencrypt.git', tag: 'v0.2.0' 11 cookbook 'cookbook-letsencrypt', git: 'https://github.com/nollieheel/cookbook-letsencrypt.git', tag: 'v0.2.0'
  1 +## 0.1.1 - 2016-12-09
  2 +### Added
  3 +- Include cookbook 'cfe-simple-iptables'. Also automatically add iptables that are listed in a secret data bag (see default attribute file).
  4 +
1 ## 0.1.0 - 2016-12-06 5 ## 0.1.0 - 2016-12-06
2 ### Added 6 ### Added
3 - Initial release of cfe-server cookbook. 7 - Initial release of cfe-server cookbook.
@@ -16,18 +16,119 @@ Tested on Ubuntu 14.04. @@ -16,18 +16,119 @@ Tested on Ubuntu 14.04.
16 <th>Default</th> 16 <th>Default</th>
17 </tr> 17 </tr>
18 <tr> 18 <tr>
19 - <td><tt>['cfe-server']['']</tt></td> 19 + <td><tt>['cfe-server']['db']['mariadb']['install']</tt></td>
20 <td>Boolean</td> 20 <td>Boolean</td>
21 - <td>Description</td> 21 + <td>Whether or not to install MariaDB server.</td>
  22 + <td><tt>false</tt></td>
  23 + </tr>
  24 + <tr>
  25 + <td><tt>['cfe-server']['db']['include_mongodb']</tt></td>
  26 + <td>Boolean</td>
  27 + <td>Whether or not to include the recipe `mongodb3`.</td>
  28 + <td><tt>true</tt></td>
  29 + </tr>
  30 + <tr>
  31 + <td><tt>['cfe-server']['filesystem']['swapfile']</tt></td>
  32 + <td>String/Boolean False</td>
  33 + <td>Path to swap file. Set to false to disable creating swap file.</td>
  34 + <td><tt>false</tt></td>
  35 + </tr>
  36 + <tr>
  37 + <td><tt>['cfe-server']['filesystem']['swapsize']</tt></td>
  38 + <td>String</td>
  39 + <td>Size of swap file if enabled.</td>
  40 + <td><tt>'2G'</tt></td>
  41 + </tr>
  42 + <tr>
  43 + <td><tt>['cfe-server']['filesystem']['perms']</tt></td>
  44 + <td>Array</td>
  45 + <td>Custom permissions and/or ownerships to specific filesystem paths. Please see the default attrbutes file for examples.</td>
  46 + <td><tt>[]</tt></td>
  47 + </tr>
  48 + <tr>
  49 + <td><tt>['cfe-server']['filesystem']['symlinks']</tt></td>
  50 + <td>Hash</td>
  51 + <td>Symbolic links to create. Each property-to-value corresponds to a linkname-to-target pair. (See default attribute file for examples.)</td>
  52 + <td><tt>{}</tt></td>
  53 + </tr>
  54 + <tr>
  55 + <td><tt>['cfe-server']['tls']['include_letsencrypt']</tt></td>
  56 + <td>Boolean</td>
  57 + <td>Whether or not to include the recipe `cookbook-letsencrypt`.</td>
  58 + <td><tt>true</tt></td>
  59 + </tr>
  60 + <tr>
  61 + <td><tt>['cfe-server']['app']['include_postfix']</tt></td>
  62 + <td>Boolean</td>
  63 + <td>Whether or not to include the recipe `cfe-nginx-php-fpm::postfix'.</td>
  64 + <td><tt>true</tt></td>
  65 + </tr>
  66 + <tr>
  67 + <td><tt>['cfe-server']['app']['include_php']</tt></td>
  68 + <td>Boolean</td>
  69 + <td>Whether or not to include the recipe 'cfe-nginx-php-fpm::php-fpm'.</td>
  70 + <td><tt>true</tt></td>
  71 + </tr>
  72 + <tr>
  73 + <td><tt>['cfe-server']['app']['include_pma']</tt></td>
  74 + <td>Boolean</td>
  75 + <td>Whether or not to include the recipe 'cookbook-phpmyadmin'.</td>
  76 + <td><tt>false</tt></td>
  77 + </tr>
  78 + <tr>
  79 + <td><tt>['cfe-server']['app']['composer']['project_paths']</tt></td>
  80 + <td>Array</td>
  81 + <td>If using composer, list here the directories where composer should be initialized.</td>
  82 + <td><tt>[]</tt></td>
  83 + </tr>
  84 + <tr>
  85 + <td><tt>['cfe-server']['misc']['cronjobs']</tt></td>
  86 + <td>Array</td>
  87 + <td>Specifications of cronjobs to be set up. Please see default attributes file for examples.</td>
  88 + <td><tt>[]</tt></td>
  89 + </tr>
  90 + <tr>
  91 + <td><tt>['cfe-server']['misc']['logrotatejobs']</tt></td>
  92 + <td>Array</td>
  93 + <td>Specifications of logrotate jobs to be set up. Please see default attribute file for examples.</td>
  94 + <td><tt>[]</tt></td>
  95 + </tr>
  96 + <tr>
  97 + <td><tt>['cfe-server']['web']['include_nginx']</tt></td>
  98 + <td>Boolean</td>
  99 + <td>Whether or not to include the recipe 'cfe-nginx-php-fpm::nginx'.</td>
22 <td><tt>true</tt></td> 100 <td><tt>true</tt></td>
23 </tr> 101 </tr>
24 </table> 102 </table>
25 103
26 ## Usage 104 ## Usage
27 105
  106 +### Secret Data Bag
  107 +
  108 +A secret data bag named either `prod`, `staging`, or `dev` has to be created. In it should be an item named `cfe-server-secret` that contains two properties: `iptables_ssh_ports` and `iptables_add_rules`.
  109 +
  110 +`iptables_ssh_ports` is an array that contains ports to be used by sshd.
  111 +
  112 +`iptables_add_rules` is an array of hashes that denote additional FILTER iptables rules to be created on the server. The hashes must conform to the format required by the cookbook `cfe-simple-iptables`.
  113 +
  114 +Example:
  115 +```json
  116 +{
  117 + "id": "cfe-server-secret",
  118 + "iptables_ssh_ports": [ 8822 ],
  119 + "iptables_add_rules": [
  120 + {
  121 + "name" : "Custom rule for my app",
  122 + "rule" : "--proto tcp --dport 8080",
  123 + "weight": 25
  124 + }
  125 + ]
  126 +}
  127 +```
  128 +
28 ### cfe-server::default 129 ### cfe-server::default
29 130
30 -Enter proper attributes for the different wrapped cookbooks, including this one. Then include `cfe-server` in your node's `run_list`: 131 +Enter proper attributes for the different wrapped cookbooks, including this one. Create the secret data bag mentioned above. Then include `cfe-server` in your node's `run_list`:
31 132
32 ```json 133 ```json
33 { 134 {
@@ -20,6 +20,21 @@ @@ -20,6 +20,21 @@
20 20
21 cb = 'cfe-server' 21 cb = 'cfe-server'
22 22
  23 +# Secret data bag stuff
  24 +#
  25 +# Necessary secret data bag key/s:
  26 +# iptables_ssh_ports
  27 +# iptables_add_rules
  28 +
  29 +databag =
  30 + case node.chef_environment
  31 + when 'prod', 'staging'
  32 + node.chef_environment
  33 + else
  34 + 'dev'
  35 + end
  36 +secret = Chef::EncryptedDataBagItem.load(databag, "#{cb}-secret")
  37 +
23 default[cb]['db']['mariadb']['install'] = false 38 default[cb]['db']['mariadb']['install'] = false
24 default[cb]['db']['include_mongodb'] = true 39 default[cb]['db']['include_mongodb'] = true
25 40
@@ -52,8 +67,8 @@ default[cb]['misc']['cronjobs'] = [ @@ -52,8 +67,8 @@ default[cb]['misc']['cronjobs'] = [
52 # :name => 'arbitrary_name_of_cronjob', 67 # :name => 'arbitrary_name_of_cronjob',
53 # :command => 'command to perform', 68 # :command => 'command to perform',
54 # :sched => '0 0 * * *', 69 # :sched => '0 0 * * *',
55 -# :mailto => '""',  
56 -# :enable => true 70 +# :mailto => '""', # Optional. Default: ''
  71 +# :enable => true # Optional. Default: true
57 # } 72 # }
58 ] 73 ]
59 default[cb]['misc']['logrotatejobs'] = [ 74 default[cb]['misc']['logrotatejobs'] = [
@@ -61,12 +76,82 @@ default[cb]['misc']['logrotatejobs'] = [ @@ -61,12 +76,82 @@ default[cb]['misc']['logrotatejobs'] = [
61 # :name => 'arbitrary_name_of_job', # a filename, no spaces 76 # :name => 'arbitrary_name_of_job', # a filename, no spaces
62 # :path => '/path/to/rotate/*.log', 77 # :path => '/path/to/rotate/*.log',
63 # :options => %w{ weekly rotate\ 12 missingok compress notifempty }, 78 # :options => %w{ weekly rotate\ 12 missingok compress notifempty },
64 -# :enable => true 79 +# :enable => true # Optional. Default true
65 # } 80 # }
66 ] 81 ]
67 82
68 default[cb]['misc']['logrotate']['conf_dir'] = '/etc/logrotate.d' 83 default[cb]['misc']['logrotate']['conf_dir'] = '/etc/logrotate.d'
69 -default[cb]['misc']['sshd']['ports'] = [ 22, 8765 ] 84 +default[cb]['misc']['sshd']['ports'] = secret['iptables_ssh_ports']
70 default[cb]['misc']['sshd']['conf_path'] = '/etc/ssh/sshd_config' 85 default[cb]['misc']['sshd']['conf_path'] = '/etc/ssh/sshd_config'
71 86
72 default[cb]['web']['include_nginx'] = true 87 default[cb]['web']['include_nginx'] = true
  88 +
  89 +# Wrapped attributes
  90 +
  91 +rules_ssh = secret['iptables_ssh_ports'].inject([]) do |acc, sport|
  92 + acc << "--proto tcp --dport #{sport} -m conntrack --ctstate NEW"
  93 + acc
  94 +end
  95 +
  96 +# Place additional iptables filter rules in a secret data bag
  97 +# according to the format for cfe-simple-iptables attribute:
  98 +# "iptables_add_rules": [
  99 +# {
  100 +# "name": "example",
  101 +# "rule": "example",
  102 +# "weight": 21
  103 +# }
  104 +# ]
  105 +rules_add = secret['iptables_add_rules'].inject([]) do |acc1, rule|
  106 + hrule = rule.inject({}) do |acc2, (k, v)|
  107 + acc2[k.to_sym] = v
  108 + acc2
  109 + end
  110 + acc1 << hrule
  111 + acc1
  112 +end
  113 +
  114 +rules_filter1 = [
  115 + {
  116 + :n => 'established',
  117 + :r => '-m conntrack --ctstate ESTABLISHED,RELATED',
  118 + :w => 1
  119 + },
  120 + {
  121 + :n => 'icmp',
  122 + :r => '--proto icmp',
  123 + :w => 2
  124 + },
  125 + {
  126 + :n => 'loopback',
  127 + :r => '--in-interface lo',
  128 + :w => 3
  129 + },
  130 + {
  131 + :n => 'ssh',
  132 + :r => rules_ssh,
  133 + :w => 4
  134 + },
  135 + {
  136 + :n => 'http',
  137 + :r => ['--proto tcp --dport 80',
  138 + '--proto tcp --dport 443'],
  139 + :w => 20
  140 + }
  141 +]
  142 +rules_filter2 = [
  143 + {
  144 + :n => 'reject',
  145 + :j => 'REJECT --reject-with icmp-host-prohibited',
  146 + :w => 90
  147 + },
  148 + {
  149 + :n => 'reject',
  150 + :c => 'FORWARD',
  151 + :j => 'REJECT --reject-with icmp-host-prohibited',
  152 + :w => 90
  153 + }
  154 +]
  155 +
  156 +default['cfe-simple-iptables']['filter'] =
  157 + rules_filter1 + rules_add + rules_filter2
1 -{  
2 - "comment": "Test User",  
3 - "shell": "/bin/bash",  
4 - "groups": [  
5 - "test",  
6 - "devs",  
7 - "adm",  
8 - "plugdev",  
9 - "netdev"  
10 - ],  
11 - "ssh_keys": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCx7fx78WXwHhrB3BGUVyrw2XONh/qE6waU/8/0aZ6bkBSGu2z2GnkXI6JSfAuAO7spBHlXJZRtwTV5VuJx4n28zmQpTksGjS8xP/a1vphwwVkABomempxY97V4PBJqpWSzCoHG2zmotARcwBKJcwQd4FFE7vngrBk9SxczyWer26rMkY8SyjUFQm2o8dPuZuaY8rHqK9QUw1YJg3rSDd6qfi2dlunAc8fbTdDnZ5hjgmlrfyFLgoP31Ix0OVL9ogFYE//tV9CjHbwV2wKCJEI57rXJ/AMX4ZTTR6L6ljoKDxis9QiJwae/x0J+fi8EADtaLrbdZ0y5nu4/UtSURVXt cfe_stg_20161109",  
12 - "id": "test"  
13 -}  
1 -{  
2 - "comment": "Chromedia SysAdmin",  
3 - "shell": "/bin/bash",  
4 - "groups": [  
5 - "cfe",  
6 - "sysadmins",  
7 - "adm",  
8 - "plugdev",  
9 - "netdev"  
10 - ],  
11 - "ssh_keys": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCx7fx78WXwHhrB3BGUVyrw2XONh/qE6waU/8/0aZ6bkBSGu2z2GnkXI6JSfAuAO7spBHlXJZRtwTV5VuJx4n28zmQpTksGjS8xP/a1vphwwVkABomempxY97V4PBJqpWSzCoHG2zmotARcwBKJcwQd4FFE7vngrBk9SxczyWer26rMkY8SyjUFQm2o8dPuZuaY8rHqK9QUw1YJg3rSDd6qfi2dlunAc8fbTdDnZ5hjgmlrfyFLgoP31Ix0OVL9ogFYE//tV9CjHbwV2wKCJEI57rXJ/AMX4ZTTR6L6ljoKDxis9QiJwae/x0J+fi8EADtaLrbdZ0y5nu4/UtSURVXt cfe_stg_20161109",  
12 - "id": "cfe"  
13 -}  
@@ -4,7 +4,7 @@ maintainer_email 'sysadmin@chromedia.com' @@ -4,7 +4,7 @@ maintainer_email 'sysadmin@chromedia.com'
4 license 'Apache License' 4 license 'Apache License'
5 description 'Simplifies setting up common Linux servers.' 5 description 'Simplifies setting up common Linux servers.'
6 long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) 6 long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
7 -version '0.1.0' 7 +version '0.1.1'
8 8
9 %w{ 9 %w{
10 cfe-users cfe-mariadb 10 cfe-users cfe-mariadb
@@ -69,7 +69,7 @@ node[cookbook_name]['filesystem']['perms'].each do |perm| @@ -69,7 +69,7 @@ node[cookbook_name]['filesystem']['perms'].each do |perm|
69 elsif perm[:owner] 69 elsif perm[:owner]
70 execute "chown -R #{perm[:owner]} #{perm[:path]}" 70 execute "chown -R #{perm[:owner]} #{perm[:path]}"
71 elsif perm[:group] 71 elsif perm[:group]
72 - execute "chown -R #{perm[:group]} #{perm[:path]}" 72 + execute "chgrp -R #{perm[:group]} #{perm[:path]}"
73 end 73 end
74 74
75 if perm[:mode] 75 if perm[:mode]
@@ -28,7 +28,7 @@ node[cookbook_name]['misc']['cronjobs'].each do |cjob| @@ -28,7 +28,7 @@ node[cookbook_name]['misc']['cronjobs'].each do |cjob|
28 day sched[2] 28 day sched[2]
29 month sched[3] 29 month sched[3]
30 weekday sched[4] 30 weekday sched[4]
31 - mailto cjob[:mailto] 31 + mailto cjob[:mailto] || '""'
32 path '/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin' 32 path '/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin'
33 action( is_enable ? :create : :delete ) 33 action( is_enable ? :create : :delete )
34 end 34 end
@@ -56,3 +56,5 @@ template node[cookbook_name]['misc']['sshd']['conf_path'] do @@ -56,3 +56,5 @@ template node[cookbook_name]['misc']['sshd']['conf_path'] do
56 :ports => node[cookbook_name]['misc']['sshd']['ports'] 56 :ports => node[cookbook_name]['misc']['sshd']['ports']
57 ) 57 )
58 end 58 end
  59 +
  60 +include_recipe 'cfe-simple-iptables'