credstash-init 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 73f92cc0bfebad087d95de2b4fcc012b722abb5d
4
+ data.tar.gz: 6271da4757edddebdde04c78af8d90d14c227f0c
5
+ SHA512:
6
+ metadata.gz: 84d716ed172b29b8333ac8c5b3334224fb51d9af61fead366cb125a08c899ef9d1fdc8ce7b8b77e4eb179659735be3b0dc0a56da27a6f2d8588bf70592a27502
7
+ data.tar.gz: f697f461b2e99177d5943d3cf51defdf07da39ffe019a53d51df696ab270c9a05e77c63028935d7900c5bc8f1f8f5b0019fa8a560f4eb0c91023376001ddbadf
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in credstash-init.gemspec
4
+ gemspec
@@ -0,0 +1,16 @@
1
+ # credstash-init
2
+
3
+ Set up individual credstash keys and DBs for isolated environments
4
+
5
+ ## Usage
6
+
7
+ ```
8
+ gem install credstash-init
9
+ credstash-init <profile> <region> <admin_username> [ ... ]
10
+ ```
11
+
12
+ You must specify (explicitly) all of the above. You may specify multiple key admin users. You must use the IAM username as reflected in AWS.
13
+
14
+ ## License
15
+
16
+ MIT
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "credstash/init"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'credstash/init/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "credstash-init"
8
+ spec.version = Credstash::VERSION
9
+ spec.authors = ["Bryan Conrad"]
10
+ spec.email = ["bkconrad@gmail.com"]
11
+
12
+ spec.summary = %q{Set up individual credstash keys and DBs for isolated environments}
13
+ spec.homepage = "https://github.com/bkconrad/credstash-init"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "aws-sdk-resources", "~> 2"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.8"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ end
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "credstash/init"
5
+
6
+ Credstash::Init.new.init!
@@ -0,0 +1,98 @@
1
+ require "erb"
2
+ require "json"
3
+ require "credstash/init/version"
4
+ require "aws-sdk-resources"
5
+
6
+ module Credstash
7
+ class Init
8
+ # Your code goes here...
9
+ def init!
10
+ usage! unless profile_name && region && users.any?
11
+ %w(production staging development).each do |env|
12
+ ensure_kms_key_exists env
13
+ run_credstash_setup env
14
+ end
15
+ end
16
+
17
+ def usage!
18
+ puts "Usage: #{$0} <profile> <region> <admin_username> [ ... ]"
19
+ puts "You must provide a profile, region, and list of users (in that order)"
20
+ exit 1
21
+ end
22
+
23
+ private
24
+
25
+ def ensure_kms_key_exists env
26
+ create_kms_key! env unless kms_key_exists? env
27
+ end
28
+
29
+ def kms_key_exists? env
30
+ begin
31
+ kms.describe_key(key_id: key_name(env))
32
+ puts "Found existing key alias #{key_name env}"
33
+ return true
34
+ rescue Aws::KMS::Errors::NotFoundException => e
35
+ return false
36
+ end
37
+ end
38
+
39
+ def create_kms_key! env
40
+ puts "Creating KMS Key for #{env}"
41
+ result = kms.create_key description: "Credstash key for #{env} secrets", policy: policy(env)
42
+ puts "Creating KMS Alias #{key_name env}"
43
+ kms.create_alias alias_name: key_name(env), target_key_id: result.key_metadata.key_id
44
+ end
45
+
46
+ def policy env
47
+ template_file = File.join File.dirname(__FILE__), 'template', 'credstash-key-policy.json.erb'
48
+
49
+ # expose some variables to the binding
50
+ @env = env
51
+ @account_id = account_id
52
+ data = JSON.parse ERB.new(File.read(template_file)).result(binding)
53
+ require 'pp'
54
+ data['Statement'].each do |statement|
55
+ next unless statement['Principal']['AWS'].is_a? Array
56
+ statement['Principal']['AWS'] = user_arns
57
+ end
58
+
59
+ JSON.pretty_generate data
60
+ end
61
+
62
+ def user_arns
63
+ users.map { |user| "arn:aws:iam::#{account_id}:user/#{user}" }
64
+ end
65
+
66
+ def account_id
67
+ iam.get_user.user.arn.split(':')[4]
68
+ end
69
+
70
+ def key_name env
71
+ "alias/credstash-#{env}"
72
+ end
73
+
74
+ def run_credstash_setup env
75
+ system "credstash -p #{profile_name} -r #{region} -t credstash-#{env} setup"
76
+ end
77
+
78
+ def kms
79
+ @kms ||= ::Aws::KMS::Client.new profile: profile_name, region: region
80
+ end
81
+
82
+ def iam
83
+ @iam ||= ::Aws::IAM::Client.new profile: profile_name, region: region
84
+ end
85
+
86
+ def profile_name
87
+ ARGV.first
88
+ end
89
+
90
+ def region
91
+ ARGV[1]
92
+ end
93
+
94
+ def users
95
+ ARGV.last ARGV.length - 2
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,3 @@
1
+ module Credstash
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,73 @@
1
+ {
2
+ "Version": "2012-10-17",
3
+ "Id": "credstash-key-policy-<%= @env %>",
4
+ "Statement": [
5
+ {
6
+ "Sid": "Enable IAM User Permissions",
7
+ "Effect": "Allow",
8
+ "Principal": {
9
+ "AWS": "arn:aws:iam::<%= @account_id %>:root"
10
+ },
11
+ "Action": "kms:*",
12
+ "Resource": "*"
13
+ },
14
+ {
15
+ "Sid": "Allow access for Key Administrators",
16
+ "Effect": "Allow",
17
+ "Principal": {
18
+ "AWS": [
19
+ ]
20
+ },
21
+ "Action": [
22
+ "kms:Create*",
23
+ "kms:Describe*",
24
+ "kms:Enable*",
25
+ "kms:List*",
26
+ "kms:Put*",
27
+ "kms:Update*",
28
+ "kms:Revoke*",
29
+ "kms:Disable*",
30
+ "kms:Get*",
31
+ "kms:Delete*",
32
+ "kms:ScheduleKeyDeletion",
33
+ "kms:CancelKeyDeletion"
34
+ ],
35
+ "Resource": "*"
36
+ },
37
+ {
38
+ "Sid": "Allow use of the key",
39
+ "Effect": "Allow",
40
+ "Principal": {
41
+ "AWS": [
42
+ ]
43
+ },
44
+ "Action": [
45
+ "kms:Encrypt",
46
+ "kms:Decrypt",
47
+ "kms:ReEncrypt*",
48
+ "kms:GenerateDataKey*",
49
+ "kms:DescribeKey"
50
+ ],
51
+ "Resource": "*"
52
+ },
53
+ {
54
+ "Sid": "Allow attachment of persistent resources",
55
+ "Effect": "Allow",
56
+ "Principal": {
57
+ "AWS": [
58
+ ]
59
+ },
60
+ "Action": [
61
+ "kms:CreateGrant",
62
+ "kms:ListGrants",
63
+ "kms:RevokeGrant"
64
+ ],
65
+ "Resource": "*",
66
+ "Condition": {
67
+ "Bool": {
68
+ "kms:GrantIsForAWSResource": "true"
69
+ }
70
+ }
71
+ }
72
+ ]
73
+ }
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: credstash-init
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Bryan Conrad
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-02-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-resources
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.8'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.8'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ description:
56
+ email:
57
+ - bkconrad@gmail.com
58
+ executables:
59
+ - credstash-init
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - ".travis.yml"
66
+ - Gemfile
67
+ - README.md
68
+ - Rakefile
69
+ - bin/console
70
+ - bin/setup
71
+ - credstash-init.gemspec
72
+ - exe/credstash-init
73
+ - lib/credstash/init.rb
74
+ - lib/credstash/init/version.rb
75
+ - lib/credstash/template/credstash-key-policy.json.erb
76
+ homepage: https://github.com/bkconrad/credstash-init
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.4.6
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Set up individual credstash keys and DBs for isolated environments
100
+ test_files: []