kryptos 1.0.0 → 2.0.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: 142fc66be80d6e4a602c0478ca358379c56e2b9b
4
+ data.tar.gz: de4806b2f1035b65a1090e6c82b4b41e7fa4dbbe
5
+ SHA512:
6
+ metadata.gz: b9b6cb688dd09e6a06bd24c1e84a4d5d8559406067f8250a743ec49262c7ffde51c39e239e163fab6a072c32ab2ef61cfc7ffc3a223cc0ca3269802e6d34583e
7
+ data.tar.gz: b7504adfff38e829d45407709b0d67c5846c755aeb8de31ee3085a0f918a0f26b322995fb174d3a71fb11d6177d3d85e7d6596a026fa800b530e3a2d17121e7a
data/README.md CHANGED
@@ -1,11 +1,15 @@
1
1
  # Kryptos
2
2
 
3
- Kryptos provides a way to avoid checking in unencrypted application secrets such as API keys. The secrets will be encrypted using a key stored in the database. The assumption is that if an attacker can get to your database, you're in big trouble anyway. But at least we can avoid giving away our API keys to people with access to the repository. We still have to check in database access configuration, so you should use a firewall or equivalent to protect that.
3
+ Kryptos provides a way to avoid checking in unencrypted application secrets such as
4
+ API keys. The secrets will be encrypted using a file based key stored on your
5
+ development machine.
4
6
 
5
- Your typical workflow should be unaffected, as Kryptos handles decryption and encryption automatically. The encrypted file will be version controlled and deployed. There is a one time cost to set up the db secret, but after that, Kryptos should be out of your way.
7
+ Your typical workflow should be unaffected, as Kryptos handles decryption and
8
+ encryption automatically. The encrypted file will be version controlled and deployed.
6
9
 
7
- Kryptos depends on Rails and has one gem dependency - the 'gibberish' library, which has no other dependencies. Kryptos itself is less than 100 lines of code and does not do any weird
8
- monkeypatching. So overhead should be quite light.
10
+ Kryptos depends on Rails and has one gem dependency - the 'gibberish' library, which
11
+ has no other dependencies. Kryptos itself is less than 100 lines of code and does
12
+ not do any weird monkeypatching. So overhead should be quite light.
9
13
 
10
14
 
11
15
  ## Installation
@@ -16,59 +20,33 @@ Add this line to your application's Gemfile:
16
20
 
17
21
  And then execute:
18
22
 
19
- $ bundle
23
+ $ bundle install
20
24
 
21
25
  Or install it yourself as:
22
26
 
23
27
  $ gem install kryptos
24
28
 
29
+ Next, remove config/secrets.yml from git and add the following entries to your .gitignore:
25
30
 
26
- Next, add config/kryptos.rb to your .gitignore. That's the main point of all this. The gem checks that this file is ignored, so do that step now before even creating the file itself.
27
-
28
- Add a migration for the KryptosSecrets table. This table will contain one row with your randomly generated secret. The migration should look like:
29
-
30
- class AddKryptosSecrets < ActiveRecord::Migration
31
- def change
32
- create_table :kryptos_secrets do |t|
33
- t.string :secret
34
- end
35
- end
36
- end
31
+ config/secrets.yml
32
+ config/kryptos.key
37
33
 
38
34
  You can use OpenSSL or an equivalent tool to generate a random password.
39
35
 
40
- $ openssl rand -base64 32
41
- RANDOMSECRET
36
+ $ openssl rand -base64 48 > config/kryptos.key
42
37
 
43
- Then use the console to add your secret to the database. Do not use 'RANDOMSECRET' literally; I hope that is obvious...
44
-
45
- $ rails console
46
- > KryptosSecret.create({ :secret => 'RANDOMSECRET'}, :without_protection => true)
38
+ Now put your secrets into config/secrets.yml (which should not be tracked by git any more).
47
39
 
48
- Now create a file config/kryptos.rb that will contain the actual secrets. This file can be any ruby code, for example:
40
+ development:
41
+ secret_key_base: 3b7cd727aa24e8444053437c36cc66c3
42
+ sample_api_key: DUMMY
49
43
 
50
- module AppSecrets
51
-
52
- AWS = Struct.new(:public_key, :private_key).new.tap do |s|
53
- s.public_key = "foo"
54
- s.private_key = "bar"
55
- end
56
-
57
- end
58
44
 
59
45
  ## Usage
60
46
 
61
47
  Fire up the console again. You should be able to access the config data:
62
48
 
63
49
  $ rails console
64
- > AppSecrets::AWS.public_key
65
- => "foo"
66
-
67
-
68
- ## Contributing
50
+ > Rails.application.secrets.sample_api_key
51
+ => "DUMMY"
69
52
 
70
- 1. Fork it
71
- 2. Create your feature branch (`git checkout -b my-new-feature`)
72
- 3. Commit your changes (`git commit -am 'Add some feature'`)
73
- 4. Push to the branch (`git push origin my-new-feature`)
74
- 5. Create new Pull Request
data/kryptos.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |gem|
8
8
  gem.version = Kryptos::VERSION
9
9
  gem.authors = ["wlipa"]
10
10
  gem.email = ["dojo@masterleep.com"]
11
- gem.description = %q{Supports keeping your application configuration secrets in source control, but encrypted using a key from the database.}
12
- gem.summary = %q{Encrypt app secrets in source control using a db based key}
11
+ gem.description = %q{Supports keeping your secrets.yml in source control, but encrypted using a key from the file system.}
12
+ gem.summary = %q{Encrypt app secrets in source control using a file based key that is not version controlled}
13
13
  gem.homepage = ""
14
14
 
15
15
  gem.files = `git ls-files`.split($/)
@@ -1,18 +1,38 @@
1
- class KryptosSecret < ActiveRecord::Base
2
-
1
+ class KryptosSecret
2
+
3
+ def initialize
4
+ end
5
+
3
6
  def gitignore_path
4
7
  "#{Rails.root}/.gitignore"
5
8
  end
6
-
9
+
10
+ def relative_cleartext_path
11
+ "config/secrets.yml"
12
+ end
13
+
14
+ def relative_key_path
15
+ "config/kryptos.key"
16
+ end
17
+
7
18
  def cleartext_path
8
- "#{Rails.root}/config/kryptos.rb"
19
+ "#{Rails.root}/#{relative_cleartext_path}"
9
20
  end
10
-
21
+
11
22
  def encrypted_path
12
23
  "#{cleartext_path}.enc"
13
24
  end
14
-
25
+
26
+ def key_path
27
+ "#{Rails.root}/#{relative_key_path}"
28
+ end
29
+
30
+ def secret
31
+ @secret ||= IO.read(key_path).strip
32
+ end
33
+
15
34
  def clandestine_operations
35
+ raise "#{relative_key_path} does not exist" unless File.exists? key_path
16
36
  check_gitignore
17
37
  if File.exists? cleartext_path
18
38
  # If the encrypted version is out of date, regenerate it
@@ -21,23 +41,22 @@ class KryptosSecret < ActiveRecord::Base
21
41
  else
22
42
  decrypt_secrets
23
43
  end
24
- require cleartext_path
25
44
  end
26
-
45
+
27
46
  def check_gitignore
28
47
  return unless Rails.env.development?
29
- to_ignore = "config/kryptos.rb"
30
48
  ignores = IO.read(gitignore_path)
31
- raise "gitignore must ignore #{to_ignore}" unless ignores =~ /^#{to_ignore}$/
49
+ raise "gitignore must ignore #{relative_cleartext_path}" unless ignores =~ /^#{relative_cleartext_path}$/
50
+ raise "gitignore must ignore #{relative_key_path}" unless ignores =~ /^#{relative_key_path}$/
32
51
  end
33
-
52
+
34
53
  def encrypt_secrets
35
54
  return unless Rails.env.development?
36
55
  Rails.logger.info "kryptos encrypt_secrets"
37
56
  cipher = Gibberish::AES.new(secret)
38
57
  IO.write(encrypted_path, cipher.encrypt(IO.read(cleartext_path)))
39
58
  end
40
-
59
+
41
60
  def decrypt_secrets
42
61
  Rails.logger.info "kryptos decrypt_secrets"
43
62
  cipher = Gibberish::AES.new(secret)
@@ -1,3 +1,3 @@
1
1
  module Kryptos
2
- VERSION = "1.0.0"
2
+ VERSION = "2.0.0"
3
3
  end
data/lib/kryptos.rb CHANGED
@@ -7,12 +7,7 @@ module Kryptos
7
7
  # Hook Rails init process
8
8
  class Railtie < Rails::Railtie
9
9
  initializer 'kryptos', :before => 'load_environment_config' do |app|
10
- ks = KryptosSecret.last rescue nil
11
- if ks
12
- ks.clandestine_operations
13
- else
14
- Rails.logger.info "no kryptos secret defined -- skipping"
15
- end
10
+ KryptosSecret.new.clandestine_operations
16
11
  end
17
12
  end
18
13
 
metadata CHANGED
@@ -1,41 +1,38 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kryptos
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
5
- prerelease:
4
+ version: 2.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - wlipa
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-15 00:00:00.000000000 Z
11
+ date: 2016-08-22 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: gibberish
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
- description: Supports keeping your application configuration secrets in source control,
31
- but encrypted using a key from the database.
27
+ description: Supports keeping your secrets.yml in source control, but encrypted using
28
+ a key from the file system.
32
29
  email:
33
30
  - dojo@masterleep.com
34
31
  executables: []
35
32
  extensions: []
36
33
  extra_rdoc_files: []
37
34
  files:
38
- - .gitignore
35
+ - ".gitignore"
39
36
  - Gemfile
40
37
  - LICENSE.txt
41
38
  - README.md
@@ -46,26 +43,26 @@ files:
46
43
  - lib/kryptos/version.rb
47
44
  homepage: ''
48
45
  licenses: []
46
+ metadata: {}
49
47
  post_install_message:
50
48
  rdoc_options: []
51
49
  require_paths:
52
50
  - lib
53
51
  required_ruby_version: !ruby/object:Gem::Requirement
54
- none: false
55
52
  requirements:
56
- - - ! '>='
53
+ - - ">="
57
54
  - !ruby/object:Gem::Version
58
55
  version: '0'
59
56
  required_rubygems_version: !ruby/object:Gem::Requirement
60
- none: false
61
57
  requirements:
62
- - - ! '>='
58
+ - - ">="
63
59
  - !ruby/object:Gem::Version
64
60
  version: '0'
65
61
  requirements: []
66
62
  rubyforge_project:
67
- rubygems_version: 1.8.25
63
+ rubygems_version: 2.6.6
68
64
  signing_key:
69
- specification_version: 3
70
- summary: Encrypt app secrets in source control using a db based key
65
+ specification_version: 4
66
+ summary: Encrypt app secrets in source control using a file based key that is not
67
+ version controlled
71
68
  test_files: []