Encrypt PostgreSQL data directory #166
10
data_bags/credentials/encfs.json
Normal file
10
data_bags/credentials/encfs.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"id": "encfs",
|
||||||
|
"password": {
|
||||||
|
"encrypted_data": "+1Q3ojHS0lJgE7lFv3zEv653UHgRiuuuxBQQpfa+XrKaeQms2Kiw\n",
|
||||||
|
"iv": "sMb1a/NmjcAW62Uf\n",
|
||||||
|
"auth_tag": "n6jpD1fGoqidgMHRuL3K+A==\n",
|
||||||
|
"version": 3,
|
||||||
|
"cipher": "aes-256-gcm"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
[Unit]
|
|
||||||
Description=EncFS for PostgreSQL data dir
|
|
||||||
Before=postgresql@12-main.service
|
|
||||||
[Service]
|
|
||||||
Type=oneshot
|
|
||||||
RemainAfterExit=yes
|
|
||||||
ExecStart=/usr/local/bin/mount_pg_encfs
|
|
||||||
ExecStop=/bin/umount /var/lib/postgresql
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
@@ -29,7 +29,6 @@ postgresql_service = "postgresql@#{postgresql_version}-main"
|
|||||||
|
|
||||||
postgresql_custom_server postgresql_version do
|
postgresql_custom_server postgresql_version do
|
||||||
role "replica"
|
role "replica"
|
||||||
encfs true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
service postgresql_service do
|
service postgresql_service do
|
||||||
|
|||||||
@@ -2,16 +2,23 @@ resource_name :postgresql_custom_server
|
|||||||
|
|
||||||
property :postgresql_version, String, required: true, name_property: true
|
property :postgresql_version, String, required: true, name_property: true
|
||||||
property :role, String, required: true # Can be primary or replica
|
property :role, String, required: true # Can be primary or replica
|
||||||
property :encfs, [TrueClass, FalseClass], default: false
|
|
||||||
|
|
||||||
action :create do
|
action :create do
|
||||||
postgresql_version = new_resource.postgresql_version
|
postgresql_version = new_resource.postgresql_version
|
||||||
postgresql_data_dir = data_dir(postgresql_version)
|
postgresql_data_dir = "/mnt/data/postgresql/#{postgresql_version}/main"
|
||||||
postgresql_service = "postgresql@#{postgresql_version}-main"
|
postgresql_service = "postgresql@#{postgresql_version}-main"
|
||||||
|
|
||||||
node.override['build-essential']['compile_time'] = true
|
node.override['build-essential']['compile_time'] = true
|
||||||
include_recipe 'build-essential::default'
|
include_recipe 'build-essential::default'
|
||||||
|
|
||||||
|
directory postgresql_data_dir do
|
||||||
|
owner "postgres"
|
||||||
|
group "postgres"
|
||||||
|
mode "0750"
|
||||||
|
recursive true
|
||||||
|
action :create
|
||||||
|
end
|
||||||
|
|
||||||
package("libpq-dev") { action :nothing }.run_action(:install)
|
package("libpq-dev") { action :nothing }.run_action(:install)
|
||||||
|
|
||||||
chef_gem 'pg' do
|
chef_gem 'pg' do
|
||||||
@@ -38,46 +45,6 @@ action :create do
|
|||||||
action :install
|
action :install
|
||||||
end
|
end
|
||||||
|
|
||||||
postgresql_user "replication" do
|
|
||||||
action :create
|
|
||||||
replication true
|
|
||||||
password postgresql_data_bag_item['replication_password']
|
|
||||||
end
|
|
||||||
|
|
||||||
if new_resource.encfs
|
|
||||||
# FIXME: encfs always runs a configuration assistant when creating a new
|
|
||||||
# volume, so this needs to be done manually:
|
|
||||||
# systemctl stop postgresql@12-main
|
|
||||||
# mv /var/lib/postgresql /var/lib/postgresql.old
|
|
||||||
# encfs /var/lib/postgresql_encrypted /var/lib/postgresql --public
|
|
||||||
# Pick p (paranoia mode) and enter the password from the data bag twice
|
|
||||||
# mv /var/lib/postgresql/* /var/lib/postgresql/
|
|
||||||
# systemctl start postgresql@12-main
|
|
||||||
|
|
||||||
package "encfs"
|
|
||||||
|
|
||||||
template "/usr/local/bin/mount_pg_encfs" do
|
|
||||||
source "mount_pg_encfs.erb"
|
|
||||||
mode "0700"
|
|
||||||
variables password: postgresql_data_bag_item["encfs_password"]
|
|
||||||
end
|
|
||||||
|
|
||||||
execute "systemctl daemon-reload" do
|
|
||||||
command "systemctl daemon-reload"
|
|
||||||
action :nothing
|
|
||||||
end
|
|
||||||
|
|
||||||
# The service will automatically mount the encrypted volume on startup
|
|
||||||
cookbook_file "/lib/systemd/system/encfs_postgresql.service" do
|
|
||||||
source "encfs.service"
|
|
||||||
notifies :run, "execute[systemctl daemon-reload]", :delayed
|
|
||||||
end
|
|
||||||
|
|
||||||
service "encfs_postgresql" do
|
|
||||||
action [:enable]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
shared_buffers = if node['memory']['total'].to_i / 1024 < 1024 # > 1GB RAM
|
shared_buffers = if node['memory']['total'].to_i / 1024 < 1024 # > 1GB RAM
|
||||||
"128MB"
|
"128MB"
|
||||||
|
|
|||||||
else # >= 1GB RAM, use 25% of total RAM
|
else # >= 1GB RAM, use 25% of total RAM
|
||||||
@@ -91,6 +58,7 @@ action :create do
|
|||||||
dynamic_shared_memory_type: "posix",
|
dynamic_shared_memory_type: "posix",
|
||||||
timezone: "UTC", # default is GMT
|
timezone: "UTC", # default is GMT
|
||||||
listen_addresses: "0.0.0.0",
|
listen_addresses: "0.0.0.0",
|
||||||
|
data_directory: postgresql_data_dir
|
||||||
}
|
}
|
||||||
|
|
||||||
if new_resource.role == "replica"
|
if new_resource.role == "replica"
|
||||||
@@ -129,6 +97,13 @@ action :create do
|
|||||||
additional_config additional_config
|
additional_config additional_config
|
||||||
notifies :reload, "service[#{postgresql_service}]"
|
notifies :reload, "service[#{postgresql_service}]"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
postgresql_user "replication" do
|
||||||
|
action :create
|
||||||
|
replication true
|
||||||
|
password postgresql_data_bag_item['replication_password']
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
action_class do
|
action_class do
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
/bin/echo "<%= @password %>" | encfs /var/lib/postgresql_encrypted /var/lib/postgresql --public -S
|
|
||||||
22
site-cookbooks/kosmos_encfs/.gitignore
vendored
Normal file
22
site-cookbooks/kosmos_encfs/.gitignore
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
.vagrant
|
||||||
|
*~
|
||||||
|
*#
|
||||||
|
.#*
|
||||||
|
\#*#
|
||||||
|
.*.sw[a-z]
|
||||||
|
*.un~
|
||||||
|
|
||||||
|
# Bundler
|
||||||
|
Gemfile.lock
|
||||||
|
gems.locked
|
||||||
|
bin/*
|
||||||
|
.bundle/*
|
||||||
|
|
||||||
|
# test kitchen
|
||||||
|
.kitchen/
|
||||||
|
kitchen.local.yml
|
||||||
|
|
||||||
|
# Chef
|
||||||
|
Berksfile.lock
|
||||||
|
.zero-knife.rb
|
||||||
|
Policyfile.lock.json
|
||||||
7
site-cookbooks/kosmos_encfs/CHANGELOG.md
Normal file
7
site-cookbooks/kosmos_encfs/CHANGELOG.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# kosmos_encfs CHANGELOG
|
||||||
|
|
||||||
|
This file is used to list changes made in each version of the kosmos_encfs cookbook.
|
||||||
|
|
||||||
|
# 0.1.0
|
||||||
|
|
||||||
|
Initial release.
|
||||||
20
site-cookbooks/kosmos_encfs/LICENSE
Normal file
20
site-cookbooks/kosmos_encfs/LICENSE
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
Copyright (c) 2020 Kosmos Developers
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining
|
||||||
|
a copy of this software and associated documentation files (the
|
||||||
|
"Software"), to deal in the Software without restriction, including
|
||||||
|
without limitation the rights to use, copy, modify, merge, publish,
|
||||||
|
distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so, subject to
|
||||||
|
the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||||
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
3
site-cookbooks/kosmos_encfs/README.md
Normal file
3
site-cookbooks/kosmos_encfs/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# kosmos_encfs
|
||||||
|
|
||||||
|
Install encfs and set up encryption for a data directory
|
||||||
110
site-cookbooks/kosmos_encfs/chefignore
Normal file
110
site-cookbooks/kosmos_encfs/chefignore
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
# Put files/directories that should be ignored in this file when uploading
|
||||||
|
# to a Chef Infra Server or Supermarket.
|
||||||
|
# Lines that start with '# ' are comments.
|
||||||
|
|
||||||
|
# OS generated files #
|
||||||
|
######################
|
||||||
|
.DS_Store
|
||||||
|
ehthumbs.db
|
||||||
|
Icon?
|
||||||
|
nohup.out
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# SASS #
|
||||||
|
########
|
||||||
|
.sass-cache
|
||||||
|
|
||||||
|
# EDITORS #
|
||||||
|
###########
|
||||||
|
.#*
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
*_flymake
|
||||||
|
*_flymake.*
|
||||||
|
*.bak
|
||||||
|
*.sw[a-z]
|
||||||
|
*.tmproj
|
||||||
|
*~
|
||||||
|
\#*
|
||||||
|
mkmf.log
|
||||||
|
REVISION
|
||||||
|
TAGS*
|
||||||
|
tmtags
|
||||||
|
|
||||||
|
## COMPILED ##
|
||||||
|
##############
|
||||||
|
*.class
|
||||||
|
*.com
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
*.o
|
||||||
|
*.pyc
|
||||||
|
*.so
|
||||||
|
*/rdoc/
|
||||||
|
a.out
|
||||||
|
|
||||||
|
# Testing #
|
||||||
|
###########
|
||||||
|
.circleci/*
|
||||||
|
.codeclimate.yml
|
||||||
|
.foodcritic
|
||||||
|
.kitchen*
|
||||||
|
.rspec
|
||||||
|
.rubocop.yml
|
||||||
|
.travis.yml
|
||||||
|
.watchr
|
||||||
|
azure-pipelines.yml
|
||||||
|
examples/*
|
||||||
|
features/*
|
||||||
|
Guardfile
|
||||||
|
kitchen.yml*
|
||||||
|
Procfile
|
||||||
|
Rakefile
|
||||||
|
spec/*
|
||||||
|
spec/*
|
||||||
|
spec/fixtures/*
|
||||||
|
test/*
|
||||||
|
|
||||||
|
# SCM #
|
||||||
|
#######
|
||||||
|
.git
|
||||||
|
.gitattributes
|
||||||
|
.gitconfig
|
||||||
|
.github/*
|
||||||
|
.gitignore
|
||||||
|
.gitmodules
|
||||||
|
.svn
|
||||||
|
*/.bzr/*
|
||||||
|
*/.git
|
||||||
|
*/.hg/*
|
||||||
|
*/.svn/*
|
||||||
|
|
||||||
|
# Berkshelf #
|
||||||
|
#############
|
||||||
|
Berksfile
|
||||||
|
Berksfile.lock
|
||||||
|
cookbooks/*
|
||||||
|
tmp
|
||||||
|
|
||||||
|
# Bundler #
|
||||||
|
###########
|
||||||
|
vendor/*
|
||||||
|
Gemfile
|
||||||
|
Gemfile.lock
|
||||||
|
|
||||||
|
# Policyfile #
|
||||||
|
##############
|
||||||
|
Policyfile.rb
|
||||||
|
Policyfile.lock.json
|
||||||
|
|
||||||
|
# Cookbooks #
|
||||||
|
#############
|
||||||
|
CHANGELOG*
|
||||||
|
CONTRIBUTING*
|
||||||
|
TESTING*
|
||||||
|
CODE_OF_CONDUCT*
|
||||||
|
|
||||||
|
# Vagrant #
|
||||||
|
###########
|
||||||
|
.vagrant
|
||||||
|
Vagrantfile
|
||||||
11
site-cookbooks/kosmos_encfs/files/encfs.service
Normal file
11
site-cookbooks/kosmos_encfs/files/encfs.service
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=EncFS for data dir
|
||||||
|
Before=postgresql@12-main.service
|
||||||
|
BindsTo=postgresql@12-main.service
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/usr/local/bin/mount_encfs
|
||||||
|
ExecStop=/bin/umount /mnt/data
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
20
site-cookbooks/kosmos_encfs/metadata.rb
Normal file
20
site-cookbooks/kosmos_encfs/metadata.rb
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name 'kosmos_encfs'
|
||||||
|
maintainer 'The Authors'
|
||||||
|
maintainer_email 'you@example.com'
|
||||||
|
license 'All Rights Reserved'
|
||||||
|
description 'Installs/Configures kosmos_encfs'
|
||||||
|
long_description 'Installs/Configures kosmos_encfs'
|
||||||
|
version '0.1.0'
|
||||||
|
chef_version '>= 14.0'
|
||||||
|
|
||||||
|
# The `issues_url` points to the location where issues for this cookbook are
|
||||||
|
# tracked. A `View Issues` link will be displayed on this cookbook's page when
|
||||||
|
# uploaded to a Supermarket.
|
||||||
|
#
|
||||||
|
# issues_url 'https://github.com/<insert_org_here>/kosmos_encfs/issues'
|
||||||
|
|
||||||
|
# The `source_url` points to the development repository for this cookbook. A
|
||||||
|
# `View Source` link will be displayed on this cookbook's page when uploaded to
|
||||||
|
# a Supermarket.
|
||||||
|
#
|
||||||
|
# source_url 'https://github.com/<insert_org_here>/kosmos_encfs'
|
||||||
70
site-cookbooks/kosmos_encfs/recipes/default.rb
Normal file
70
site-cookbooks/kosmos_encfs/recipes/default.rb
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
#
|
||||||
|
# Cookbook:: kosmos_encfs
|
||||||
|
# Recipe:: default
|
||||||
|
#
|
||||||
|
# The MIT License (MIT)
|
||||||
|
#
|
||||||
|
# Copyright:: 2020, Kosmos Developers
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
# in the Software without restriction, including without limitation the rights
|
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
# copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
# THE SOFTWARE.
|
||||||
|
#
|
||||||
|
|
||||||
|
encfs_data_bag_item = data_bag_item("credentials", "encfs")
|
||||||
|
encfs_password = encfs_data_bag_item["password"]
|
||||||
|
|
||||||
|
package "encfs"
|
||||||
|
|
||||||
|
encrypted_directory = "/usr/local/lib/encrypted_data"
|
||||||
|
mount_directory = "/mnt/data"
|
||||||
|
|
||||||
|
template "/usr/local/bin/mount_encfs" do
|
||||||
|
source "mount_encfs.erb"
|
||||||
|
mode "0700"
|
||||||
|
variables encrypted_directory: encrypted_directory,
|
||||||
|
mount_directory: mount_directory
|
||||||
|
end
|
||||||
|
|
||||||
|
execute "systemctl daemon-reload" do
|
||||||
|
command "systemctl daemon-reload"
|
||||||
|
action :nothing
|
||||||
|
end
|
||||||
|
|
||||||
|
directory mount_directory do
|
||||||
|
action :create
|
||||||
|
mode "0775"
|
||||||
|
end
|
||||||
|
|
||||||
|
execute "create encrypted file system" do
|
||||||
|
command <<-EOF
|
||||||
|
echo "y\\\n
|
||||||
|
y\\\n
|
||||||
|
p\\\n
|
||||||
|
#{encfs_password}\\\n
|
||||||
|
#{encfs_password}\\\n
|
||||||
|
" | encfs #{encrypted_directory} #{mount_directory} --public --stdinpass
|
||||||
|
EOF
|
||||||
|
sensitive true
|
||||||
|
not_if { ::File.exist?(encrypted_directory) }
|
||||||
|
end
|
||||||
|
|
||||||
|
# The service will automatically
|
||||||
|
cookbook_file "/lib/systemd/system/encfs.service" do
|
||||||
|
source "encfs.service"
|
||||||
|
notifies :run, "execute[systemctl daemon-reload]", :delayed
|
||||||
|
end
|
||||||
3
site-cookbooks/kosmos_encfs/templates/mount_encfs.erb
Normal file
3
site-cookbooks/kosmos_encfs/templates/mount_encfs.erb
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
systemd-ask-password --echo "encfs password:" | encfs <%= @encrypted_directory %> <%= @mount_directory %> --public -S
|
||||||
Reference in New Issue
Block a user
postgresqlis a dummy service, it only runs/bin/true. The service to disable is the content of thepostgresql_servicevariable (postgresql@12-main), so this can be moved above