database_anonymizer 0.0.1
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +77 -0
- data/Rakefile +7 -0
- data/lib/database_anonymizer/engine.rb +5 -0
- data/lib/database_anonymizer/metamorphosis.rb +113 -0
- data/lib/database_anonymizer/version.rb +3 -0
- data/lib/database_anonymizer.rb +5 -0
- data/lib/generators/database_anonymizer/install/USAGE +8 -0
- data/lib/generators/database_anonymizer/install/install_generator.rb +9 -0
- data/lib/generators/database_anonymizer/install/templates/whitelist.yml.erb +7 -0
- data/lib/tasks/database_anonymizer_tasks.rake +13 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 70d1aa4ae504021382a9c6745510718ef87bf21e
|
4
|
+
data.tar.gz: 331fb255934633a0ecab771d463302f59bb85ed0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7f1a06f5ac4f602eac5603f014c6ec3c6eda063a7ac1296a08f567eeb18b8614763050c5290238449a12e36a4b068ac4258bfb31f11e43c30b7a08e32a767c61
|
7
|
+
data.tar.gz: 3fb405c32fe52613f485bcf1f949e7a6857b879284a12a3c452013254c8f8b1443cf40e5f4db3ba2ce5310f5d1cad83ccc030bf54419f2f6e8fe6894eb5a051b
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2015 Shingo Kawamura
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# DatabaseAnonymizer
|
2
|
+
A database anonymizer for Rails 4+
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
|
6
|
+
Put this line in your Gemfile:
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
gem 'database_anonymizer'
|
10
|
+
```
|
11
|
+
|
12
|
+
Then bundle:
|
13
|
+
|
14
|
+
```sh
|
15
|
+
$ bundle
|
16
|
+
```
|
17
|
+
|
18
|
+
Create `config/database_anonymizer/whitelist.yml` by:
|
19
|
+
|
20
|
+
```sh
|
21
|
+
$ bin/rails generate database_anonymizer:install
|
22
|
+
```
|
23
|
+
|
24
|
+
Then, only string or text type column table structures are created.
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
See below sample `config/database_anonymizer/whitelist.yml` file.
|
29
|
+
|
30
|
+
```yml
|
31
|
+
'User':
|
32
|
+
# name:
|
33
|
+
email:
|
34
|
+
anonymized_by: User.anonymize_email
|
35
|
+
# address:
|
36
|
+
# tel:
|
37
|
+
remarks:
|
38
|
+
anonymized_by: nil
|
39
|
+
# comment:
|
40
|
+
```
|
41
|
+
|
42
|
+
### Asteriskize
|
43
|
+
if a column is commented out,
|
44
|
+
the column will be replaced by asterisks.
|
45
|
+
|
46
|
+
Default asterisks size is 8.
|
47
|
+
|
48
|
+
If `validate_length_of` is present, the number of asterisks size may not be 8.
|
49
|
+
For details, see the method `asterisk_length` at `lib/database_anonymizer/metamorphosis.rb`.
|
50
|
+
|
51
|
+
### Anonymize
|
52
|
+
If a column needs a specific anonymizer,
|
53
|
+
remove `#`, and add `anonymized_by: Model.anonymize_method`.
|
54
|
+
You have to define your own anonymize method.
|
55
|
+
|
56
|
+
### Do Nothing
|
57
|
+
If a column don't need to be asteriskized or anonymized,
|
58
|
+
remove `#`, and add `anonymized_by: nil`.
|
59
|
+
|
60
|
+
### Run rake task
|
61
|
+
|
62
|
+
Finally, run below rake task:
|
63
|
+
|
64
|
+
```sh
|
65
|
+
$ RAILS_ENV=TARGET_ENV bin/rake database_anonymizer:execute
|
66
|
+
```
|
67
|
+
|
68
|
+
## Specification
|
69
|
+
If `RAILS_ENV` is production,`bin/rake database_anonymizer:execute` fails.
|
70
|
+
|
71
|
+
## Contributing
|
72
|
+
|
73
|
+
1. Fork it ( https://github.com/blp1526/database_anonymizer/fork )
|
74
|
+
1. Create your feature branch (`git checkout -b my-new-feature`)
|
75
|
+
1. Commit your changes (`git commit -am 'Add some feature'`)
|
76
|
+
1. Push to the branch (`git push origin my-new-feature`)
|
77
|
+
1. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
module DatabaseAnonymizer
|
2
|
+
class Metamorphosis
|
3
|
+
DEFAULT_ASTERISK_LENGTH = 8
|
4
|
+
|
5
|
+
attr_reader :model
|
6
|
+
|
7
|
+
def self.prepare_for_rake
|
8
|
+
Rails.application.eager_load!
|
9
|
+
ActiveRecord::Base.clear_cache!
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.whitelist_path
|
13
|
+
File.join(Rails.root, 'config', 'database_anonymizer', 'whitelist.yml')
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.whitelist
|
17
|
+
YAML.load_file(whitelist_path).respond_to?(:deep_symbolize_keys) ? YAML.load_file(whitelist_path).deep_symbolize_keys : {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.table_existing_active_record_inheritors
|
21
|
+
ActiveRecord::Base.descendants.reject do |d|
|
22
|
+
!d.superclass.eql?(ActiveRecord::Base) || d.eql?(ActiveRecord::SchemaMigration) || !d.table_exists?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.targets
|
27
|
+
table_existing_active_record_inheritors.map { |model| new(model) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.execute
|
31
|
+
asteriskize
|
32
|
+
anonymize
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.asteriskize
|
36
|
+
case ActiveRecord::Base.configurations[Rails.env]['adapter']
|
37
|
+
when 'mysql2'
|
38
|
+
targets.each(&:mysql_asteriskize)
|
39
|
+
else
|
40
|
+
targets.each(&:general_asteriskize)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.anonymize
|
45
|
+
fail DangerousRailsEnvError if Rails.env == 'production'
|
46
|
+
whitelist.keys.each do |model_name|
|
47
|
+
whitelist[model_name].each do |column, details|
|
48
|
+
anonymize_log(model_name, column) { eval(details[:anonymized_by]) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.anonymize_log(model_name, column)
|
54
|
+
ActiveRecord::Migration.say_with_time "anonymize for #{model_name}##{column} start..." do
|
55
|
+
yield
|
56
|
+
puts "-- anonymize for #{model_name}##{column} completed!"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize(model)
|
61
|
+
@model = model
|
62
|
+
end
|
63
|
+
|
64
|
+
def string_or_text_column_names
|
65
|
+
model.columns.select { |column| [:string, :text].include?(column.type) }.map { |c| c.name.to_sym }
|
66
|
+
end
|
67
|
+
|
68
|
+
def unwhitelist_column_names
|
69
|
+
string_or_text_column_names.select { |column_name| self.class.whitelist[model.to_s.to_sym].try!(:[], column_name).nil? }
|
70
|
+
end
|
71
|
+
|
72
|
+
def length_validator(column_name)
|
73
|
+
model.validators_on(column_name).find { |validator| validator.class.eql?(ActiveModel::Validations::LengthValidator) }
|
74
|
+
end
|
75
|
+
|
76
|
+
def asterisk_length(column_length_validator)
|
77
|
+
length = DEFAULT_ASTERISK_LENGTH
|
78
|
+
return length unless column_length_validator
|
79
|
+
length = column_length_validator.options[:minimum] if column_length_validator.options[:minimum]
|
80
|
+
if column_length_validator.options[:maximum] && length > column_length_validator.options[:maximum]
|
81
|
+
length = column_length_validator.options[:maximum]
|
82
|
+
end
|
83
|
+
length
|
84
|
+
end
|
85
|
+
|
86
|
+
def mysql_update_query(column_name)
|
87
|
+
# NOTE: If a column name is same as MySQL reserved words, backquote is needed.
|
88
|
+
"UPDATE #{model.table_name} SET `#{column_name}`='#{'*' * asterisk_length(length_validator(column_name))}' WHERE `#{column_name}` LIKE '%_%'"
|
89
|
+
end
|
90
|
+
|
91
|
+
def mysql_asteriskize
|
92
|
+
fail DangerousRailsEnvError if Rails.env == 'production'
|
93
|
+
unwhitelist_column_names.each do |column_name|
|
94
|
+
ActiveRecord::Base.connection.execute(mysql_update_query(column_name))
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def general_asteriskize
|
99
|
+
fail DangerousRailsEnvError if Rails.env == 'production'
|
100
|
+
model.unscoped.find_each { |instance| instance.update!(asteriskize_params(instance)) }
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def asteriskize_params(instance)
|
106
|
+
unwhitelist_column_names.each_with_object({}) do |column_name, obj|
|
107
|
+
obj[column_name] = ('*' * asterisk_length(length_validator(column_name))) if instance.__send__(column_name)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class DangerousRailsEnvError < StandardError; end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'database_anonymizer/metamorphosis'
|
2
|
+
|
3
|
+
class DatabaseAnonymizer::InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
|
6
|
+
def copy_initializer_file
|
7
|
+
template 'whitelist.yml.erb', File.join('config', 'database_anonymizer', 'whitelist.yml')
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<% DatabaseAnonymizer::Metamorphosis.prepare_for_rake -%>
|
2
|
+
<% DatabaseAnonymizer::Metamorphosis.targets.each do |target| -%>
|
3
|
+
<%= "# '#{target.model.name}':" %>
|
4
|
+
<% target.string_or_text_column_names.each do |column_name| -%>
|
5
|
+
<%= "# #{column_name}:" %>
|
6
|
+
<%- end %>
|
7
|
+
<% end -%>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'database_anonymizer/metamorphosis'
|
2
|
+
|
3
|
+
namespace :database_anonymizer do
|
4
|
+
desc 'anonymize records'
|
5
|
+
task execute: :environment do
|
6
|
+
ActiveRecord::Migration.say_with_time 'database_anonymizer:execute start...' do
|
7
|
+
DatabaseAnonymizer::Metamorphosis.prepare_for_rake
|
8
|
+
DatabaseAnonymizer::Metamorphosis.execute
|
9
|
+
puts 'database_anonymizer:execute finished!'
|
10
|
+
puts 'total time'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: database_anonymizer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Shingo Kawamura
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.0.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mysql2
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "<"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.4'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "<"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.4'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry-rails
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: factory_girl_rails
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: A database anonymizer for Rails 4+
|
84
|
+
email:
|
85
|
+
- blp1526@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- MIT-LICENSE
|
91
|
+
- README.md
|
92
|
+
- Rakefile
|
93
|
+
- lib/database_anonymizer.rb
|
94
|
+
- lib/database_anonymizer/engine.rb
|
95
|
+
- lib/database_anonymizer/metamorphosis.rb
|
96
|
+
- lib/database_anonymizer/version.rb
|
97
|
+
- lib/generators/database_anonymizer/install/USAGE
|
98
|
+
- lib/generators/database_anonymizer/install/install_generator.rb
|
99
|
+
- lib/generators/database_anonymizer/install/templates/whitelist.yml.erb
|
100
|
+
- lib/tasks/database_anonymizer_tasks.rake
|
101
|
+
homepage: https://github.com/blp1526/database_anonymizer
|
102
|
+
licenses:
|
103
|
+
- MIT
|
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.2.2
|
122
|
+
signing_key:
|
123
|
+
specification_version: 4
|
124
|
+
summary: A database anonymizer for Rails 4+
|
125
|
+
test_files: []
|