capistrano-vault 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6a3839176fa42c0219dc863806bb1a6def4e8c58
4
+ data.tar.gz: 0b0c8d83c8ebebb4c2a162e847baec3d6df2ddb8
5
+ SHA512:
6
+ metadata.gz: 5af31f165e17aec8fd20111819cfb6b8dd654cd53b3b9e257121159413c514f3d3ff5568a44d9a986f9be869eda3f65cd682fa4b0af8dba426c687f442883d53
7
+ data.tar.gz: 5fe108abefe4621b47679c02a7f89beeed875d6f7157a80350805afb4fcdb00bc2956fe00d7a48091fb343a47ded0ce142d9071704694d0420263cbf6f44f12e
data/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+
13
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.3
5
+ before_install: gem install bundler -v 1.16.1
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in capistrano-vault.gemspec
6
+ gemspec
data/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # Capistrano Vault
2
+
3
+ Provide capistrano access your Hashicrop Vault server to signature certificate to ssh into server, or read access token saved in Vault.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'capistrano-vault'
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ### SSH without config
16
+
17
+ Enable SSH Plugin in Capfile
18
+
19
+ ```ruby
20
+ # ...
21
+ require "capistrano/vault"
22
+
23
+ # This Hook will override your ssh options to use signed key and publickey mode to ssh.
24
+ install_plugin Capistrano::Vault::SSH
25
+ ```
26
+
27
+ Setup the options to sign
28
+
29
+ ```ruby
30
+ set :vault_address, 'https://vault.example.com' # It not set, it will use EVN['VAULT_ADDR']
31
+ set :vault_ssh_mount_path, 'ssh-client-signer'
32
+ set :vault_ssh_role, 'deploy'
33
+ ```
34
+
35
+ And before running capistrano command, make sure you are already `vault login`
36
+
37
+ > Make sure your are added the trusted ca in your server.
38
+
39
+
40
+ ## Development
41
+
42
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
43
+
44
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
45
+
46
+ ## Contributing
47
+
48
+ Bug reports and pull requests are welcome on GitHub at https://github.com/elct9620/capistrano-vault.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "capistrano/vault"
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(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,29 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "capistrano/vault/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "capistrano-vault"
8
+ spec.version = Capistrano::Vault::VERSION
9
+ spec.authors = ["蒼時弦也"]
10
+ spec.email = ["contact@frost.tw"]
11
+
12
+ spec.summary = %q{Load secret and ssh certificate from Hashicorp Vault}
13
+ spec.description = %q{Load secret and ssh certificate from Hashicorp Vault}
14
+ spec.homepage = "https://github.com/elct9620/capistrano-vault"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = "exe"
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_runtime_dependency "capistrano"
24
+ spec.add_runtime_dependency "vault", "~> 0.1"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.16"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec", "~> 3.0"
29
+ end
@@ -0,0 +1,70 @@
1
+ module Capistrano
2
+ module Vault
3
+ class SSH < Capistrano::Plugin
4
+ KEY_NAME = "capistrano-vault-signed"
5
+
6
+ def set_defaults
7
+ set_if_empty :vault_address, ENV['VAULT_ADDR']
8
+ set_if_empty :vault_ssh_role, 'deploy'
9
+ set_if_empty :vault_ssh_mount_path, 'ssh-client-signer'
10
+ end
11
+
12
+ def register_hooks
13
+ stages.each do |stage|
14
+ after stage, 'configure_vault_ssh_options'
15
+ after stage, 'signature_ssh_public_key'
16
+ end
17
+ end
18
+
19
+ def define_tasks
20
+ task :configure_vault_ssh_options do
21
+ configure_vault_ssh_options
22
+ end
23
+
24
+ task :signature_ssh_public_key do
25
+ signature_ssh_public_key
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def vault_ssh_options
32
+ {
33
+ auth_methods: %w[publickey],
34
+ keys: ["#{Dir.tmpdir}/#{KEY_NAME}"]
35
+ }
36
+ end
37
+
38
+ def configure_vault_ssh_options
39
+ env.backend.configure do |sshkit|
40
+ sshkit.backend.configure do |backend|
41
+ backend.ssh_options =
42
+ (backend.ssh_options || {})
43
+ .merge(vault_ssh_options)
44
+ end
45
+ end
46
+ end
47
+
48
+ def configure_vault
49
+ ::Vault.address = fetch(:vault_address)
50
+ end
51
+
52
+ def generate_rsa_key
53
+ key = OpenSSL::PKey::RSA.new 2048
54
+ File.write("#{Dir.tmpdir}/#{KEY_NAME}", key.to_pem)
55
+
56
+ [key, key.public_key]
57
+ end
58
+
59
+ def signature_ssh_public_key
60
+ configure_vault
61
+ _, pkey = generate_rsa_key
62
+ payload = { public_key: "ssh-rsa " + [pkey.to_blob].pack('m0') }
63
+ mount_path = fetch(:vault_ssh_mount_path)
64
+ role = fetch(:vault_ssh_role)
65
+ res = ::Vault.post("/v1/#{mount_path}/sign/#{role}", JSON.fast_generate(payload))
66
+ File.write("#{Dir.tmpdir}/#{KEY_NAME}.pub", res.dig(:data, :signed_key).strip)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,5 @@
1
+ module Capistrano
2
+ module Vault
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ require 'tmpdir'
2
+ require 'vault'
3
+ require 'openssl'
4
+
5
+ require "capistrano/vault/version"
6
+ require 'capistrano/all'
7
+ require "capistrano/plugin"
8
+ require "capistrano/vault/ssh"
9
+
10
+ module Capistrano
11
+ module Vault
12
+ # Your code goes here...
13
+ end
14
+ end
15
+
16
+ load File.expand_path('../tasks/vault.cap', __FILE__)
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: capistrano-vault
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - 蒼時弦也
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-07-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: capistrano
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: vault
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.16'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.16'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ description: Load secret and ssh certificate from Hashicorp Vault
84
+ email:
85
+ - contact@frost.tw
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - Gemfile
94
+ - README.md
95
+ - Rakefile
96
+ - bin/console
97
+ - bin/setup
98
+ - capistrano-vault.gemspec
99
+ - lib/capistrano/vault.rb
100
+ - lib/capistrano/vault/ssh.rb
101
+ - lib/capistrano/vault/version.rb
102
+ homepage: https://github.com/elct9620/capistrano-vault
103
+ licenses: []
104
+ metadata: {}
105
+ post_install_message:
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubyforge_project:
121
+ rubygems_version: 2.6.14
122
+ signing_key:
123
+ specification_version: 4
124
+ summary: Load secret and ssh certificate from Hashicorp Vault
125
+ test_files: []