2008-10-31 3 views
4

런타임에 레일스 프로젝트에서 루비에 인수를 제공하는 방법을 찾고 있습니다. 본질적으로, 우리 프로젝트는 공개 키 암호화를 사용하여 민감한 클라이언트 데이터를 암호화하고 런타임에 비밀 키 파일에 암호를 제공 할 수있는 기능을 원합니다.Rails 런타임에서 인수 제공

+0

그렇다면 프로세스 모니터가 죽은 프로세스를 어떻게 다시 시작합니까? ;-) 재시동을 자동화하자마자, 그런 종류의 기밀을 포기해야합니다. 결국 서버 (또는 프로세스를 다시 시작하는 시스템)에 대한 액세스를 안전하게 보호해야합니다. – webmat

답변

1

쉬운 방법은 'init.rb'에서 'gets'를 사용하여 인수를 취하는 레일즈 플러그인을 만드는 것입니다.

디렉토리 확인 : 내가 요리 업에 대한 빠른 코드 예제를 허용 '$ railsRoot을/공급 업체/플러그인/startup_args/lib에'

은 $ railsRoot/공급 업체/플러그인 '에 저장 인수 데이터 객체를 생성 /startup_args/lib/startup_args.rb '

module StartupArgs 
@@argHash = {} 

def self.setArg(key, value) 
    @@argHash[key.to_sym] = value 
end 

def self.getArg(key) 
    return @@argHash[key.to_sym] 
end 
end 

로드 레일 프로젝트의 네임 스페이스에 StartupArgs 모듈이의 인수로 채우'

/공급 업체/플러그인/startup_args/init.rb '$ railsRoot
require "startup_args" 

promptString = "Enter arg name (type nothing to continue):" 

puts promptString 
while (newArg = gets.chomp) != "" 
puts "Enter value for '#{newArg}':" 
newVal = gets.chomp 
StartupArgs.setArg(newArg, newVal) 

puts promptString 
end 

이제 Rails 프로젝트가 시작될 때 콘솔에서 키 - 값 쌍을 가져 오려고 시도합니다. 이 쌍은 나중에 액세스 할 수 있도록 전역 이름 공간 개체 StartupArgs에 저장됩니다 ('StartupArgs.getArg()'를 통해).

데몬이 시작 시간 동안 콘솔에 액세스 할 수없는 시나리오에 Rails 프로젝트가 전개 될 것으로 예상되는 경우 콘솔의 표준 입력 대신 명명 된 파이프에서 읽을 수 있습니다.

'require'문을 제외하고 'init.rb'의 모든 부분을 제거하고 관련 매개 변수를 웹을 통해 게시물로 가져 오는 컨트롤러에이 설정을 수행하는 작업을 추가 할 수 있습니다 . 액세스 또는 오류를 기록하는 로그 파일에 잠재적으로 중요한 매개 변수 (예 : 암호)가 입력되지 않도록 Rails를 구성하십시오 (특히 URL에 매개 변수가있는 HTTP GET으로 사용될 경우).

(당신은 설치 작업이 전역 객체에 적절한 매개 변수를 저장 한 때까지 요청을 무시하는 다른 레일 작업을 구성하는 경우 위에 설명 된 시스템과 동일한 효력이 방법을 얻을.)

참고 사항에 대한 미카 : 나는 당신의 포스트에 직접적으로 논평 할 명성이 없기 때문에 여기에 내 코멘트를 포함 할 것이다. 파일 시스템에서 암호를 표현할 필요가없는 시스템을 고려해야 할 몇 가지 이유가있을 수 있습니다. 예를 들어 개발자는 다양한 운영 체제와 다양한 환경에 배포 할 수있는 레일스 프로젝트를 계획하고있을 수 있습니다. 개발자가 관리 또는 루트 사용자가 손상되거나 신뢰할 수 없거나 기밀 유지 및 보안 계약에 서명 할 수없는 시나리오가 있다고 판단한 경우 개발자는 암호를 메모리에 저장하는 추가 난독 화를 추가하기로 결정할 수 있습니다 암호를 훔치는 데 조금 덜 안전한 시스템이나 약간 더 똑똑한 공격을 요구하는 경우에만). 아마도 그것은 상대적 비용의 문제로 간주 될 수 있습니다. 저렴한 비용으로 암호를 검색하기 위해 더 많은 지식을 필요로하는 방식으로 암호를 숨길 수 있습니다.

+0

이것은 정확히 제가 찾던 유형입니다. 감사합니다! – latortuga

+0

내가 도울 수있어서 기쁩니다! – Jsnydr

1

웹 서버 사용자 만 읽을 수 있도록 chmoded 된 파일에 비밀번호를 넣는 것이 잘못된 이유는 무엇입니까?

3

모든 Ruby 스크립트는 ENV 해시를 통해 로컬 환경 변수에 액세스 할 수 있습니다.다음과 같이 스크립트를 호출 할 때

puts ENV['PATH'] 

그래서 모든 POSIX 시스템 (리눅스, 유닉스, 맥 OS)를 사용하면 간단하게 설정할 수 있습니다 :

MY_ARG=supersecret ruby script.rb 

에도 동일한 레일에 유효합니다. 당신이 당신의 environment.rb에에 puts ENV['MY_ARG']을 넣고 서버를 시작하는 경우 :

$ MY_ARG=supersecret mongrel_rails start 
** Starting Mongrel listening at 0.0.0.0:3000 
** Starting Rails with development environment... 
supersecret 
** Rails loaded. 
** Loading any Rails specific GemPlugins 
** Signals ready. TERM => stop. USR2 => restart. INT => stop (no restart). 
** Rails signals registered. HUP => reload (without restart). It might not work well. 
** Mongrel 1.1.5 available at 0.0.0.0:3000 
** Use CTRL-C to stop. 

환경 변수는 내 의견에 훨씬 간단한 방법입니다.

+0

내 솔루션보다 확실히 쉽습니다. 리눅스 환경에서 root는 프로세스의 환경을 열거 할 수 있지만 (예 :/proc/[pid]/environ) 독점적으로 루비의 메모리에서 암호 문자열을 가져 오는 데 더 많은 지식과 노력이 필요하다고 우려 할 수 있습니다. – Jsnydr

+0

Windows에서 'cmd.exe'에서 실행 파일을 호출 할 때 환경 변수를 인라인으로 설정하는 방법이 있는지 궁금합니다. – Jsnydr

+0

흠, 좋은 지적/proc/[pid]/environ. 그러나 실제로는 일반 텍스트 파일에 키를 쓰는 것보다 (그리고 덜 직관적 인) 좀 더 많은 작업이 필요합니다. – webmat

관련 문제