2010-07-08 1 views
23

나는 GitHub에서 여러 개의 Rails 앱을 호스팅하고 있습니다. 그들은 모두 현재 비공개이며 GitHub 저장소에서 배포합니다. http://opensourcerails.com에서 찾을 수있는 것과 마찬가지로 오픈 소스 중 일부를 만들 수 있기를 바랍니다.앱의 비밀 키와 자격 증명을주지 않고 내 Rails의 앱을 어떻게 열 수 있습니까?

내 질문은 : 어떻게이 비밀 번호를 공개하지 않고 공개 할 수 있습니까?

예를 들어, 나는 /config/initializers/cookie_verification_secret.rb를보고 거의 모든 것에 대한 쿠키 비밀을 볼 수 있습니다. 이것이 받아 들일 수있는 방법을 이해하지 못합니다. 이 사용자들은 모두 배포 환경에서 이러한 값을 어떻게 든 변경하고 있습니까?

일부 사용자는 AWS 암호와 키를 노출하기도합니다. 다른 사람들은 AWS 암호를 다음과 같이 설정합니다.

ENV['aws-secret'] 

그러나 나는 그 값을 어느 시점에서 설정하고 있는지 확실하지 않습니다.

그렇다면 앱의 보안을 손상시키지 않으면 서 Rails 앱을 오픈 소스로 만드는 가장 좋은 방법은 무엇입니까?

답변

15

최근 내 자신의 앱 중 하나를 사용하여이 작업을 진행했습니다. 내 해결책은 git-ignored YAML 설정 파일에 비밀을 저장 한 다음 이니셜 라이저 디렉토리의 간단한 클래스를 사용하여 해당 파일에 액세스하는 것이 었습니다. 설정 파일은 Capistrano 배치의 '공유'폴더에 저장되고 각 배치시 config에 복사됩니다.

구성 가기 : http://github.com/tsigo/jugglf/blob/master/config/initializers/juggernaut.rb

사용 예제 : https://github.com/tsigo/jugglf/blob/6b91baae72fbe4b1f7efa2759bb472541546f7cf/config/initializers/session_store.rb 또한 소스 제어에서 이러한 비밀 값을 사용하는 파일의 모든 역사를 제거 할 수 있습니다

. 다음은 Git에서 제가 사용했던 가이드입니다 : http://help.github.com/removing-sensitive-data/

+1

좋은 조언. 또한 히스토리를 제거하지 않으려는 경우 가능하다면 새로운 배포 후에 값을 변경하고 (.gitignore를 통해 숨겨진 후에) 값을 변경하면 이전 값이 쓸모 없게됩니다. 물론 이것은 임계 값 중 하나를 변경하는 것을 잊어 버리면 쇠약해질 수 있기 때문에 실패하기 쉽습니다. – jefflunt

+1

이 답변은 아직 투표를하고 있기 때문에 오늘 어떻게해야 할지를 업데이트해야한다고 생각합니다. https://github.com/bkeepers/dotenv –

4

비밀 값을 저장하고 있지 않습니다. Git repo의 역사에서 언제든지. 와 (

  • 외부의 repo
  • 에서 올바른 값을 읽을 완전한 최종 설정 파일을 구축 :
    그 값은 수있는 스크립트와 함께 만 템플릿 설정 파일은 버전 떠나 다른 곳에 저장한다 비밀 값)

데이터의 견본 세트 (한쪽에는 소스, 다른쪽에는 비밀 값)를 유지함으로써 비밀을 지니지 않고 소스 repo를 열 수 있습니다.

+0

감사합니다. 이것은 분명하고 스마트 한 대답처럼 보입니다. EngineYard 또는 Heroku (내 레포 외에 영구적으로 저장할 수 없거나 저장하지 않으려는 위치)에 배포하는 경우 로컬 컴퓨터의 저장소에서 비밀 값을 읽는 것이 사소한 것 같지 않습니다. .이 프로세스에 대한 추가 제안이나 링크가 있습니까? – ballgame

+0

@ballgame : "해당 머신이 내 로컬 머신의 repo에서 비밀 값을 읽도록해야합니다."그러나 "로컬 머신"이 아닌 원하는 값을 읽을 수 있습니다. 배포 된 서버에서 외부 데이터 소스에 액세스하기 만하면됩니다. – VonC

+1

@ballgame : foreman을 사용하여 웹 앱을 시작하는 경우 변수를 설정 한 repo 루트에서 .gitignore에 .env 파일을 추가 할 수 있습니다. – Alban

0

[편집 - 다음 방법은 필요한 쿠키를 포함하기 위해 "레일즈 서버"를 실행하기 위해 프로덕션 브랜치로 전환해야하는 번거 로움이 있습니다. 따라서 서버가 어려울 때 편집 작업을 수행하고 난 여전히 좋은 해결책을 찾고 있습니다.

추가 조사가 끝나면 내가 찾던 해결책은 내 비밀 값을 저장 한 것을 제외하는 것이 었습니다. Git repo의 마스터 브랜치 (@VonC가 말한 것처럼). 그러나 별도의 저장소에서 파일을 읽는 대신 새 "생산"지점을 만들고이를 추가합니다.

이렇게하면 마스터에서 제외되어 Github 또는 다른 공개 레포로 전송할 수 있습니다.배포 할 준비가되면 프로덕션 지점을 체크 아웃하고 Master를 병합하고 Production을 배포 할 수 있습니다.

Heroku와 다른 호스트가 서버에 단일 git repo를 푸시해야하기 때문에이 작업을 수행 할 수 있어야합니다. 여기

더 자세한 정보는 :

http://groups.google.com/group/heroku/browse_thread/thread/d7b1aecb42696568/26d5249204c70574

+0

BallGame, 좋은 해결책을 찾았습니까? –

3

는 사실 ENV를 사용하여, 귀하의 질문에서 힌트를했다.

필자는 3 가지 비밀 값을 갖고 싶지 않았습니다. 그것들은 물론 앱의 비밀 토큰이자 트위터의 소비자 키와 비밀이다. 내 비밀 토큰 initializer에 :

KinTwit::Application.config.secret_token = ENV['SECRET_TOKEN'] 

Twitter.consumer_key      = ENV['CONSUMER_KEY'] 
Twitter.consumer_secret     = ENV['CONSUMER_SECRET'] 

나는 Heroku에서 내 프로젝트를 호스팅하고 있습니다. 그래서 나는 이것을 Heroku에 구성 변수로 추가했습니다.

[03:07:48] [[email protected] ~/dev/rwc/kintwit]$ heroku config:add CONSUMER_KEY=ub3rs3cr3tk3y 
Adding config vars and restarting app... done, v7 
    CONSUMER_KEY => ub3rs3cr3tk3y 
[03:08:40] [[email protected] ~/dev/rwc/kintwit]$ heroku config:add CONSUMER_SECRET=ub3rs3cr3tk3y 
Adding config vars and restarting app... done, v8 
    CONSUMER_SECRET => ub3rs3cr3tk3y 
[03:08:57] [[email protected] ~/dev/rwc/kintwit]$ heroku config:add SECRET_TOKEN=ub3rs3cr3tk3y 
Adding config vars and restarting app... done, v9 
    SECRET_TOKEN => ub3rs3cr3tk3y 

이제 다음 번에 값을 입력 할 준비가되었습니다. 그러나, 당신이 Heroku를 사용하지 않는다면 어떨까요? 나는 분명히 모든 단일 레일 전개 (jeesh, 심지어 Heroku 프로조차도)에 대한 전문가는 아니지만,이 예는 db : migrate 테스트를 수행하는 것입니다.

$ RAILS_ENV=test rake db:migrate 

= 키 값 쌍 명령 따라서이 명령 실행 환경 변수를 설정하기 전에, echo ENV['RAILS_ENV']test는 인쇄한다. 그래서 이것은 당신의 환경에서 당신이 그것을 어떻게 할 것인지 설정됩니다. 하지만 환경 변수는 코드에 포함되어 있지 않으므로 트릭입니다.

9

포먼을 사용하는 경우 .env 파일을 앱의 루트에 넣으세요. 당신이 키를 사용 할 때

.env(foreman docs)는 삽입 한 다음

AWS_SECRET=xxx 
AWS_ACCESS=yyy 

이있을 것이다 :

ENV['AWS_SECRET'] 
ENV['AWS_ACCESS'] 

당신이 당신의 버전 컨트롤이 .env를 범하지 않는 것이 중요하지만

. 따라서 git을 사용하는 경우 .gitignore.env을 추가하십시오. 라운드


보너스! - Heroku

Heroku에 배포하는 경우 이러한 환경 변수도 Heroku 환경에서 구성해야합니다.

  1. 수동으로 heroku config:add 명령
  2. 해당 지역의 환경 변수, 두 가지를 동기화 할 heroku-config 보석을 사용하여 키를 추가 : 두 가지 옵션이 있습니다.
관련 문제