# 플러그인에 vault-rails 게姆 추가 시 문제 발생

**URL:** https://meta.discourse.org/t/trouble-adding-vault-rails-gem-to-a-plugin/173291
**Category:** Development
**Created:** [12월 14, 2020, 8:53오후 UTC](https://meta.discourse.org/t/trouble-adding-vault-rails-gem-to-a-plugin/173291 "2020-12-14T20:53:49Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [12월 14, 2020, 8:53오후 UTC](https://meta.discourse.org/t/trouble-adding-vault-rails-gem-to-a-plugin/173291/1 "2020-12-14T20:53:49Z")

</div>

`vault-rails`를 플러그인에 추가하여 내가 추가한 모델의 일부인 키를 암호화하려고 합니다. 이 예제를 따르고 있습니다: [Plugin with custom gems - #4 by Falco](https://meta.discourse.org/t/plugin-with-custom-gems/57190/4?u=pfaffman)

(이미 Discourse에서 이렇게 할 수 있는 방법이 있는데 제가 못 찾은 건가요? encrypt 플러그인만 보이는데…)

이 줄을 `plugin.rb`에 넣으면 `Could not find 'rails' (>= 5.0) among 348 total gem(s)` 오류가 발생합니다. 같은 줄을 Discourse의 `Gemfile`에 추가하면 정상적으로 작동합니다.

```
gem "vault-rails", "0.7.0", { require: false }

```

```plaintext
 (master *) pfaffman@shinytim:~/src/discourse-repos/discourse$ ./bin/rails c
Traceback (most recent call last):
	43: from ./bin/rails:17:in `<main>'
	42: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/dependencies.rb:324:in `require'
	41: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/dependencies.rb:291:in `load_dependency'
	40: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/dependencies.rb:324:in `block in require'
	39: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
	38: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
	37: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
	36: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
	35: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
	34: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/railties-6.0.3.3/lib/rails/commands.rb:18:in `<main>'
	33: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/railties-6.0.3.3/lib/rails/command.rb:46:in `invoke'
	32: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/railties-6.0.3.3/lib/rails/command/base.rb:69:in `perform'
	31: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
	30: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
	29: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
	28: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/railties-6.0.3.3/lib/rails/commands/console/console_command.rb:101:in `perform'
	27: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/railties-6.0.3.3/lib/rails/command/actions.rb:14:in `require_application_and_environment!'
	26: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/railties-6.0.3.3/lib/rails/command/actions.rb:22:in `require_application!'
	25: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/dependencies.rb:324:in `require'
	24: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/dependencies.rb:291:in `load_dependency'
	23: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/dependencies.rb:324:in `block in require'
	22: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
	21: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
	20: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
	19: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
	18: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
	17: from /home/pfaffman/src/discourse-repos/discourse/config/application.rb:70:in `<main>'
	16: from /home/pfaffman/src/discourse-repos/discourse/config/application.rb:71:in `<module:Discourse>'
	15: from /home/pfaffman/src/discourse-repos/discourse/config/application.rb:304:in `<class:Application>'
	14: from /home/pfaffman/src/discourse-repos/discourse/lib/plugin_initialization_guard.rb:5:in `plugin_initialization_guard'
	13: from /home/pfaffman/src/discourse-repos/discourse/config/application.rb:305:in `block in <class:Application>'
	12: from lib/discourse.rb:225:in `activate_plugins!'
	11: from lib/discourse.rb:225:in `each'
	10: from lib/discourse.rb:228:in `block in activate_plugins!'
	 9: from /home/pfaffman/src/discourse-repos/discourse/lib/plugin/instance.rb:611:in `activate!'
	 8: from /home/pfaffman/src/discourse-repos/discourse/lib/plugin/instance.rb:611:in `instance_eval'
	 7: from /home/pfaffman/src/discourse-repos/discourse/plugins/discourse-pfaffmanager/plugin.rb:13:in `activate!'
	 6: from /home/pfaffman/src/discourse-repos/discourse/lib/plugin/instance.rb:705:in `gem'
	 5: from /home/pfaffman/src/discourse-repos/discourse/lib/plugin_gem.rb:22:in `load'
	 4: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0/rubygems/specification.rb:1371:in `activate'
	 3: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0/rubygems/specification.rb:1389:in `activate_dependencies'
	 2: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0/rubygems/specification.rb:1389:in `each'
	 1: from /home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0/rubygems/specification.rb:1400:in `block in activate_dependencies'
/home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/site_ruby/2.7.0/rubygems/dependency.rb:311:in `to_specs': Could not find 'rails' (>= 5.0) among 348 total gem(s) (Gem::MissingSpecError)
Checked in 'GEM_PATH=/home/pfaffman/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0:/home/pfaffman/Dropbox/home/bin/dotfiles/.gem/ruby/2.7.0', execute `gem env` for more information

```

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [12월 14, 2020, 8:59오후 UTC](https://meta.discourse.org/t/trouble-adding-vault-rails-gem-to-a-plugin/173291/2 "2020-12-14T20:59:05Z")

</div>

링크하신 게시글에는 이렇게 적혀 있습니다:

> [@Falco](#):
>
> `plugin.rb` 파일에 모든 의존성 트리를 포함하여 제이엠(gem) 의존성을 추가하세요.

그렇게 해보셨나요?

Discourse는 Rails 제이엠에 대한 의존성이 없으며, 필요한 모듈만 가져옵니다. 원하시는 이 제이엠은 전체 Rails 제이엠에 의존하므로, Discourse에 이미 포함되어 있지 않은 각 의존성을 재귀적으로 추가해야 합니다.

많은 작업이 필요할 것 같지만, 적어도 무엇이 부족한지 정확히 알려줍니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [12월 14, 2020, 9:14오후 UTC](https://meta.discourse.org/t/trouble-adding-vault-rails-gem-to-a-plugin/173291/3 "2020-12-14T21:14:36Z")

</div>

아. `rails`가 로드되지 않았다는 건 전혀 생각도 못 했네요.

**의존성 트리가 전부**! 그렇군요.

정말 많은 것들이네요.

디지털 오션 API 키나 SSH 키 같은 것을 데이터베이스에 저장하려고 합니다. 혹시 간단하면서도 안전하게 이를 처리할 다른 방법을 아시나요? `exec`를 사용해 `vault`나 비슷한 도구를 셸에서 실행하는 것도 괜찮을 것 같네요. 그렇게 자주 실행되는 작업은 아니니까요.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [12월 14, 2020, 9:20오후 UTC](https://meta.discourse.org/t/trouble-adding-vault-rails-gem-to-a-plugin/173291/4 "2020-12-14T21:20:33Z")

</div>

`aws-sigv4`와 `aws-eventstream`에만 의존하는 `vault` gem만 사용하는 것은 어떨까요?

> [@pfaffman](#):
>
> 안전하게

여기서 "안전하게"라는 것은 무엇을 의미합니까? [Threat model - Wikipedia](https://en.wikipedia.org/wiki/Threat_model) 은 무엇입니까? [Data Explorer](https://meta.discourse.org/t/32566?silent=true) 접근 권한이 있는 Admin으로부터 이를 보호하려는 건가요? 그렇다면 단순한 ENV 변수를 사용하는 것이 더 쉬울 것입니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [12월 14, 2020, 9:26오후 UTC](https://meta.discourse.org/t/trouble-adding-vault-rails-gem-to-a-plugin/173291/5 "2020-12-14T21:26:16Z")

</div>

“안전하다”는 Digital Ocean API 키와 Mailgun API 키를 내 작은 플러그인에 제공하여 드롭렛을 생성하고 Discourse를 설치한 뒤, 업그레이드 등을 수행하는 데 사용할 SSH 키까지 안심하고 맡길 수 있을 정도로 충분히 안전하다는 뜻입니다.

제가 추가할 유일한 프로덕션 환경에서의 조치는 데이터베이스가 탈취되더라도 해당 키들을 노출되지 않게 하는 것뿐입니다. 물론 서버 자체가 해킹되면 모든 것은 무의미해지지만요.

아마 이 몇 가지 필드를 더 가볍게 암호화하는 방법을 찾아야 할 것 같습니다.

수정: [Simple Way to Encrypt Data in Rails without Gem](https://pawelurbanek.com/rails-secure-encrypt-decrypt) 이 방법은 충분히 간단해 보이고, 이미 사용 가능한 것으로 보이는 `ActiveSupport::MessageEncryptor`를 활용합니다.
