“ '생산'환경에 대한`secret_key_base` 누락”오류를 해결하는 방법 (Rails 4.1)


169

Rails 4.1을 사용하여 Rails 애플리케이션을 처음부터 새로 만들었고 해결할 수없는 이상한 문제에 직면하고 있습니다.

Heroku에 응용 프로그램을 배포하려고 할 때마다 오류 500이 발생합니다.

Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`

secret.yml파일은 다음과 같은 구성이 포함되어 있습니다

secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

Heroku에서는 " SECRET_KEY_BASE"환경 변수를 rake secret명령 결과로 구성했습니다 . 를 시작 heroku config하면 올바른 이름과 값으로 변수를 볼 수 있습니다.

왜이 오류가 계속 발생합니까?


1
나는 똑같은 문제를 겪고 있으며 왜 이런 일이 일어나고 있는지 알고 싶습니다. 이유를 알아 내면 솔루션으로 다시 게시하겠습니다.
danielricecodes

구성 파일이 secret.yml또는 secrets.yml입니까?
James

2
레일에서 생성 된 파일로 .gitignore 파일을 다시 구성했으며 이제 모든 것이
Paolo Laurenti

Rails 4로 업그레이드 할 때도이 문제가 발생했습니다.이 경우 사용자 지정 환경 이름이 있었기 때문에 secrets.yml에 반영되지 않았습니다. 비표준 이름을 가진 파일에 행을 추가하고 커밋하고 다시 배포해야했습니다.
whognu

미래 독자들을위한 :이 답변은 아마도 가장 쉽고 정확한 답변 일 것입니다 : stackoverflow.com/a/26541742/4880924
BKSpurgeon

답변:


208

프로덕션 서버에 로그인 할 때마다로드 될 환경 변수를 작성하여 동일한 문제가 발생하여이를 해결하기 위한 단계를 안내 했습니다.

Unicorn v4.8.2에서 Rails 4.1을 사용하고 있었고 애플리케이션을 배포하려고 할 때 제대로 시작되지 않았고 unicorn.log파일에서이 오류 메시지를 발견했습니다.

app error: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` (RuntimeError)

몇 가지 연구를 한 결과 Rails 4.1이을 관리하는 방법을 변경했음을 알았 secret_key습니다. 따라서 secrets.yml파일 을 읽으면 exampleRailsProject/config/secrets.yml다음과 같은 것을 찾을 수 있습니다

# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

즉, Rails는 secret_key_base프로덕션 서버에서 환경 변수를 사용할 것을 권장 합니다. 이 오류를 해결하려면 다음 단계에 따라 프로덕션 서버에서 Linux 환경 변수 (필자의 경우 Ubuntu)를 작성해야합니다.

  1. 프로덕션 서버의 터미널에서 다음을 실행하십시오.

    $ RAILS_ENV=production rake secret

    문자와 숫자가 포함 된 큰 문자열을 반환합니다. 이를 복사하면 해당 코드를이라고 GENERATED_CODE합니다.

  2. 서버에 로그인

    • 루트 사용자로 로그인 한 경우이 파일을 찾아서 편집하십시오.

      $ vi /etc/profile

      vi에서 Shift+ G(대문자 "G")를 사용하여 파일의 맨 아래로 이동하십시오 .

      vi에 삽입 하려면 GENERATED_CODE을 눌러 환경 변수를 작성하십시오 i. 파일 끝에서 새 줄에 있어야합니다.

      $ export SECRET_KEY_BASE=GENERATED_CODE

      변경 사항을 저장하고을 사용하여 파일을 닫은 Esc다음 " :x"를 사용하여 Entervi에서 저장하고 종료하십시오.

    • 그러나 일반 사용자로 로그인 한 example_user경우이 요점을 " " 라고 부르면 다음 파일 중 하나를 찾아야합니다.

      $ vi ~/.bash_profile
      $ vi ~/.bash_login
      $ vi ~/.profile

      이 파일들은 순서가 중요하므로 첫 번째 파일이 있으면 다른 파일을 편집 할 필요가 없습니다. 당신이 당신의 디렉토리에이 두 파일을 발견하는 경우 ~/.bash_profile그리고 ~/.profile당신은 단지 첫 번째로 작성해야합니다 ~/.bash_profile리눅스는이 하나를 읽을 것이며, 다른 하나는 무시되기 때문.

      그럼 우리가 사용하는 파일의 맨 아래로 이동 Shift+ G다시 우리와 함께 환경 변수를 작성 GENERATED_CODE하여 i다시 있는지 파일의 끝에 새 줄을 추가한다 :

      $ export SECRET_KEY_BASE=GENERATED_CODE

      코드를 작성한 후 변경 사항 을 저장하고 Esc다시 " :x"를 사용하여 파일을 닫고 Enter저장하고 종료하십시오.

  3. 다음 명령을 사용하여 환경 변수가 Linux에서 올바르게 설정되었는지 확인할 수 있습니다.

    $ printenv | grep SECRET_KEY_BASE

    또는 함께 :

    $ echo $SECRET_KEY_BASE

    이 명령을 실행할 때 모든 것이 정상이면 GENERATED_CODE이전부터 표시됩니다 . 마지막으로 모든 구성이 완료되면 Unicorn 또는 다른 도구를 사용하여 Rails 응용 프로그램을 문제없이 배포 할 수 있습니다.

쉘을 닫고 프로덕션 서버에 다시 로그인하면이 환경 변수가 설정되어 사용할 준비가됩니다.

그리고 그게 다야! 이 미니 가이드 가이 오류를 해결하는 데 도움 이되기를 바랍니다 .

면책 조항 : 저는 Linux 또는 Rails 전문가가 아니므로 잘못된 점이나 오류가 있으면 문제를 해결하게되어 기쁩니다.


11
Rails는 환경 변수 SECRET_KEY_BASE를 보지 못하는 것 같습니다. printenv는 ENV를 검사하면 레일 c 생산에도 표시됩니다. 그러나 Unicorn을 다시 시작할 때 효과가 없습니다. 지금 작동하는 유일한 방법은, secrets.yml에 직접 붙여 넣기한다
AntonAL

1
이것은 나를 위해 일했습니다. 자세한 설명을 주셔서 감사합니다. 방금 앱의 환경 변수를 관리하기 위해 존재하는 보석이 있다는 것을 알게되었습니다. 'Dotenv'는 heroku의 하나이자 '전임자'입니다. 이런 식으로 오류를 수동으로 수정하는 것이 교육 이었지만 보석 중 하나를 사용하면 프로세스가 간소화됩니까?
Nick Res

보석 옵션 @ ninja08 덕분에 제 답변이 도움이 되서 다행입니다. 주로 capistrano 또는 기타 증분 도구를 사용하여 서버를 관리하는 사람들을 위해 프로세스를 더 쉽게 만들 수 있습니다. :)
Demi Magus

Demi Magus의 훌륭한 지침에 따라 다음과 같이했습니다. cd / var / www / rails; rvm은 ext-rbx-2.5.2@rails를 사용합니다. SKB_FILE = / var / www / .secret_key_base; echo "export SECRET_KEY_BASE = $ (RAILS_ENV = 생산 레이크 비밀)"> $ SKB_FILE; . $ SKB_FILE; 에코 ". $ SKB_FILE"| 티 -a ~ / .bashrc ~ / .bash_profile; chmod o-rwx $ SKB_FILE;
David Winiecki

좋은 대답 !! 왜 이것이 해결되지 않는지 모르겠습니다. 질문 stackoverflow.com/questions/33117318/…
Adriano Resende

84

secrets.yml소스 컨트롤에 체크인 하지 않았다고 가정합니다 (예 : .gitignore파일에 있음). 이것이 귀하의 상황이 아니더라도,이 질문을 보는 많은 사람들이 코드를 Github에 노출시키고 비밀 키가 떠 다니기를 원하지 않기 때문에 수행 한 것입니다.

소스 컨트롤이 아닌 경우 Heroku는 이에 대해 알지 못합니다. Rails가 찾고 있는데 존재하지 않는 파일을 Rails.application.secrets.secret_key_base확인하여 Rails가 설정했기 때문에 설정 secrets.yml되지 않았습니다. 간단한 해결 방법은 config/environments/production.rb파일 로 이동 하여 다음 줄을 추가하는 것입니다.

Rails.application.configure do
    ...
    config.secret_key_base = ENV["SECRET_KEY_BASE"]
    ...
end

그러면 응용 프로그램에서 환경 변수를 찾는 대신 환경 변수를 사용하여 비밀 키를 설정하도록 지시합니다 secrets.yml. 이것을 미리 알기 위해 많은 시간을 절약했을 것입니다.


15
이것이 가장 좋은 대답입니다. Figaroheroku_secrets레일 그 알지 못하는 경우 아무것도하지 SECRET_KEY_BASE의 삶을 ENV. 나는 설정 var가 Heroku에 존재한다면 Rails는 기존 구성 요소 덕분에 그것을 선택할 것이라고 생각했지만, Rails가 볼 곳을 알아야한다는 것은 맹목적으로 분명해 보입니다. 비밀 키 기반에 대해 걱정할 필요없이 Github에서 코드를 작성하는 방법이 궁금합니다. 이제는 알아
flanger001

1
동의합니다. secrets.yml은 Figaro와 같은 훌륭한 보석으로 불필요합니다.

2
프로젝트에 github와 heroku를 사용하면 가장 좋은 옵션처럼 보입니다.
flexus

1
secrets.yml을 커밋하는 데 문제가 있습니다 production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>. 실제 비밀 키가 노출되지 않았다는 의미도 아닙니다. 커밋 된 secrets.yml에 개발 및 테스트 키가 모두 시드 및 테스트 데이터 인 경우 노출 될 위험이 있습니까?
Jay Killeen

이것은 secrets.yml이 더 이상없는 Rails 6.0.2에서도 작동합니다.
Ken Tsoi

54

config/secrets.yml버전 관리에 추가 하고 다시 배포하십시오. .gitignore파일을 커밋 할 수 있도록 줄을 제거해야 할 수도 있습니다 .

나는이 똑같은 문제가 있었고 .gitignoreGithub이 Rails 애플리케이션을 위해 만든 상용구가 포함되어 있음을 알게 되었습니다.config/secrets.yml .


140
config / secrets.yml은 do.yml.sample을 수행 할 수있는 저장소에 절대로 있어야하고 가짜 데이터로 채우지 않아야하지만 보안을 위해 repos에 .yml을 사용하지 마십시오.
user3379926

9
@ user3379926에서 Heroku의 Rails 앱 컨텍스트 내에서 버전 제어에 포함 된 파일과 포함되지 않은 파일을 선택하고 선택할 수 없습니다. Rails 4.1은 비밀 구성이 존재할 것으로 예상합니다. 그렇지 않으면 응용 프로그램이 실행되지 않습니다. Git에서 secrets.yml 파일을 커밋하지 않고 위의 질문에서 제기 된 문제를 해결할 수있는 방법이 있다면 조언을 제공하여이 스레드를 개선하는 데 도움을주십시오.
danielricecodes

9
@danielricecodes 이니셜 라이저에서 수동으로 값을 설정할 수 있습니다. 소스에 Rails.application.config.secret_key_base = ENV["SECRET_KEY_BASE"]추가하지 않고 작동하고 오류를 제거하는 것과 같은 것이 있습니다 secrets.yml.
joshhepworth

11
@ user3379926 : rails new(이 경우 railsgem의 버전이 Gemfile 인) 새 Rails 응용 프로그램을 생성 4.2.4하면 파일 config/secrets.yml이 생성됩니다. 여기에는 개발 및 테스트 환경을 위해 사전 생성 된 비밀 키가 포함되며 다음과 같은 환경 변수에서 프로덕션 환경의 비밀 키를 읽습니다 secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>. secrets.yml비밀 키를 실제로 정의하지 않는 한이 파일을 버전 제어 상태로 유지하는 것이 완벽하고 안전하고 실제로 유용하다고 생각합니다.
Teemu Leisti

2
@jasonleonhard 왜? 어쨌든 env vars에서 비밀 키를 읽는다면 큰 문제는 무엇입니까? 비밀이 노출되지 않습니다.
horseyguy

13

이것은 나를 위해 일했습니다.

프로덕션 서버 및 cd현재 디렉토리에 SSH를 실행 bundle exec rake secret하거나 실행 rake secret하면 긴 문자열을 출력으로 가져와 해당 문자열을 복사합니다.

이제 실행하십시오 sudo nano /etc/environment.

파일 맨 아래에 붙여 넣기

export SECRET_KEY_BASE=rake secret
ruby -e 'p ENV["SECRET_KEY_BASE"]'

어디 rake secret방금 복사 한 문자열입니다, 대신에 그 복사 한 문자열을 붙여 넣습니다 rake secret.

서버를 다시 시작하고를 실행하여 테스트하십시오 echo $SECRET_KEY_BASE.


3

다른 답변과 마찬가지로 이니셜 라이저를 사용할 수 있지만 기존 Rails 4.1 이상은을 사용하는 것 config/secrets.yml입니다. Rails 팀이이를 도입 한 이유는이 답변의 범위를 벗어 났지만 TL; DR은 secret_token.rb토큰이 소스 제어 히스토리와 체크인해야하는 유일한 시스템에 체크인되기 때문에 구성 및 코드 를 병합하고 보안 위험이 있기 때문입니다. 생산 비밀 토큰이 생산 인프라라는 것을 알고 있습니다.

소스 컨트롤에 .gitignore추가하지 않는 것처럼 이 파일을 추가해야 config/database.yml합니다.

설정을위한 Heroku가 자신의 코드를 참조하기 config/database.yml에서 DATABASE_URL자신의 루비 Buildpack , 나는 결국 자신의 repo를 분기 만들고 그것을 수정 config/secrets.yml에서 SECRETS_KEY_BASE환경 변수.

이 기능은 Rails 4.1에서 소개되었으므로이 기능을 편집 ./lib/language_pack/rails41.rb하고 추가 하는 것이 적절하다고 생각했습니다 .

다음은 회사에서 만든 수정 된 빌드 팩 의 스 니펫 입니다.

class LanguagePack::Rails41 < LanguagePack::Rails4

  # ...

  def compile
    instrument "rails41.compile" do
      super
      allow_git do
        create_secrets_yml
      end
    end
  end

  # ...

  # writes ERB based secrets.yml for Rails 4.1+
  def create_secrets_yml
    instrument 'ruby.create_secrets_yml' do
      log("create_secrets_yml") do
        return unless File.directory?("config")
        topic("Writing config/secrets.yml to read from SECRET_KEY_BASE")
        File.open("config/secrets.yml", "w") do |file|
          file.puts <<-SECRETS_YML
<%
raise "No RACK_ENV or RAILS_ENV found" unless ENV["RAILS_ENV"] || ENV["RACK_ENV"]
%>

<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
          SECRETS_YML
        end
      end
    end
  end

  # ...

end

물론이 변수를 확장하여 환경 변수에서 읽을 다른 비밀 (예 : 타사 API 키 등)을 추가 할 수 있습니다.

...
<%= ENV["RAILS_ENV"] || ENV["RACK_ENV"] %>:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  third_party_api_key: <%= ENV["THIRD_PARTY_API"] %>

이런 식으로, 당신은 매우 표준적인 방법으로이 비밀에 접근 할 수 있습니다 :

Rails.application.secrets.third_party_api_key

앱을 다시 배포하기 전에 먼저 환경 변수를 설정하십시오. Heroku 대시 보드에서 SECRET_KEY_BASE 설정

그런 다음 수정 된 빌드 팩 (또는 링크에 오신 것을 환영합니다)을 Heroku 앱에 추가하십시오 (Heroku의 설명서 참조) ) 앱을 다시 배포하십시오.

config/secrets.yml빌드 git push팩은 Heroku에 갈 때마다 dyno 빌드 프로세스의 일부로 환경 변수에서 자동으로 생성합니다 .

편집 : Heroku 자체 문서config/secrets.yml 에는 환경 변수에서 읽도록 작성 하는 것이 좋지만 이것은이 파일을 소스 제어로 체크인해야 함을 의미합니다. 필자의 경우 체크인하지 않을 개발 및 테스트 환경에 대한 비밀을 하드 코딩했기 때문에 이것은 잘 작동하지 않습니다.


훌륭한 솔루션이지만 .dotenv 및 .foreman gem은이 문제를 해결합니다. "개발 및 테스트 환경에 대한 비밀을 하드 코드했습니다."-이 gem을 사용하면 개발자의 비밀 파일에서 ENV_VAR을 사용할 수 있으므로 빌드 팩이 필요하지 않습니다. 또한 테스트
rmcsharry

환경 변수는 대부분의 인프라에 의해 기록되므로 암호화되지 않은 환경 변수는 로그에 일반 텍스트로 표시됩니다. 저는 Rails 앱에 Heroku를 사용하지 않으므로 권장 사항이 없지만 AWS에서는 빌드 컨테이너 내부에서 빌드하는 동안 Parameter Store에서 암호화 된 값을 가져 와서 이러한 종류의 보안 자산을 ​​채우기 위해 암호화를 해제합니다.
Daniel Nalbach

1

당신은에 환경 변수로 비밀 키를 내보낼 수 있습니다 ~/.bashrc또는 ~/.bash_profile서버의 :

export SECRET_KEY_BASE = "YOUR_SECRET_KEY"

그리고, 당신은 .bashrc또는 .bash_profile:

source ~/.bashrc 
source ~/.bash_profile

비밀을 저 지르지 마십시오.


1

필자의 경우 문제는 config/master.key버전 관리가 아니었고 다른 컴퓨터에서 프로젝트를 만들었습니다.

Rails가 생성하는 기본 .gitignore는이 파일을 제외합니다. 이 파일이 없어도 배포 할 수 없으므로 모든 팀 구성원의 컴퓨터에서 배포 할 수 있으려면 버전을 제어해야합니다.

솔루션 :에서 config/master.key행을 제거하고 .gitignore프로젝트가 작성된 컴퓨터에서 파일을 커미트하십시오. 이제 git pull다른 컴퓨터에서 파일을 배치 할 수 있습니다.

사람들은 대체 솔루션을 제공하지 않고 이러한 파일 중 일부를 버전 제어에 커밋하지 말라고 말합니다. 오픈 소스 프로젝트에서 작업하지 않는 한 자격 증명을 포함하여 프로젝트를 실행하는 데 필요한 모든 것을 커밋하지 않을 이유가 없습니다.


마스터 키 파일을 git에 커밋하지 마십시오. 이것은 앱에 대한 거대한 보안 취약점입니다. 오픈 소스의 경우 힘들지만 선호하는 암호 관리자로 암호 저장소를 만드는 것이 더 좋습니다.
wsizoo

리포지토리가 비공개 인 경우 왜 보안 취약점이됩니까? 권한이없는 사람이 개인 저장소에 액세스 할 수있는 경우 API 키 유출보다 더 큰 문제가 있습니다. 모든 프로젝트가 오픈 소스 인 것은 아닙니다.
Andrew Koster

오픈 소스 프로젝트를위한 튜토리얼에서 모든 사람들이이 과정을 반복해서 본 것 같습니다.
Andrew Koster

이전 secrets.yml파일 에 대한 오래된 문서가 너무 많기 때문에 과거의 여러 Rails 버전에서는 더 이상 사용되지 않기 때문에이 모든 것이 더욱 혼란스러워 집니다. 이 스택 오버플로 질문 자체에는 많은 답변이 있으며 거의 ​​모두이 고대 API를 사용합니다.
Andrew Koster

1

rails6의 경우 다음 파일이 누락되어 동일한 문제가 발생했습니다. 파일을 추가하면 문제가 해결되었습니다.

1. config/master.key
2. config/credentials.yml.enc

이 파일이 있는지 확인하십시오. !!!


0

내가 한 일 : 프로덕션 서버에서 Thin 용 구성 파일 (confthin.yml)을 만들고 (사용하고 있습니다) 다음 정보를 추가하십시오.

environment: production
user: www-data
group: www-data
SECRET_KEY_BASE: mysecretkeyproduction

그런 다음 앱을 시작합니다.

thin start -C /whereeveristhefieonprod/configthin.yml

매력처럼 작동하고 버전 관리에 비밀 키가 없어도됩니다.

그것이 도움이되기를 바랍니다. 그러나 Unicorn과 다른 사람들도 같은 일을 할 수 있다고 확신합니다.


1
왜 / 어떻게 작동하는지 설명 할 수 있습니까? 문제는 헤 로쿠에 대한 것이었다. 얇은 대안입니까, 아니면 heroku와 호환됩니까?
ahnbizcad

-1

secret_key_base를 비워 두어 레거시 키 생성기 (따라서 Rails 3과의 하위 세션 호환성)를 계속 사용할 수 있도록 Rails 4.1 앱에서 사용한 패치가 있습니다.

Rails::Application.class_eval do
  # the key_generator will then use ActiveSupport::LegacyKeyGenerator.new(config.secret_token)
  fail "I'm sorry, Dave, there's no :validate_secret_key_config!" unless instance_method(:validate_secret_key_config!)
  def validate_secret_key_config! #:nodoc:
    config.secret_token = secrets.secret_token
    if config.secret_token.blank?
      raise "Missing `secret_token` for '#{Rails.env}' environment, set this value in `config/secrets.yml`"
    end 
  end 
end

패치를 다시 포맷 한 후 패치 를 Rails에 풀 요청으로 제출했습니다.






-3

https://github.com/github/gitignore/blob/master/Rails.gitignore 에서 .gitignore 파일을 사용한 후 동일한 문제가 발생했습니다.

.gitignore 파일에서 다음 줄을 주석 처리 한 후 모든 것이 잘 작동했습니다.

config/initializers/secret_token.rb
config/secrets.yml

1
모든 곳에서 반복되는 것처럼 secrets.yml 또는 secret_token.rb를 git에 커밋하는 것은 권장되지 않습니다.
cofiem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.