문제

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

도움이 되었습니까?

해결책

이를 수행하는 쉬운 방법은 'init.rb'에서 'gets'를 사용하여 인수를 취하는 Rails 플러그인을 생성하는 것입니다.간단한 코드 샘플을 만들어 보겠습니다.

디렉토리를 만드세요:'$railsRoot/vendor/plugins/startup_args/lib'

'$railsRoot/vendor/plugins/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 모듈을 Rails 프로젝트의 네임스페이스에 로드하고 '$railsRoot/vendor/plugins/startup_args/init.rb'의 인수로 채웁니다.

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'의 모든 부분을 제거하고 관련 매개변수를 웹을 통한 게시물로 사용하는 컨트롤러에 이 설정을 수행하는 작업을 추가할 수 있습니다.잠재적으로 민감한 매개변수(예:비밀번호)가 액세스 또는 오류를 기록하는 로그 파일에 입력되는 것을 방지합니다(특히 URL에 매개변수를 사용하여 HTTP GET으로 사용될 수 있는 경우).

(설정 작업이 적절한 매개변수를 전역 개체에 저장할 때까지 요청을 무시하도록 다른 Rails 작업을 구성하는 경우 위에서 설명한 시스템과 동일한 효과를 얻습니다.)

미가를 위한 메모:저는 귀하의 게시물에 직접 댓글을 달 수 있는 권한이 없으므로 여기에 제 댓글을 포함하겠습니다.파일 시스템에 비밀번호를 표시할 필요가 없는 시스템을 고려해야 하는 몇 가지 이유가 있을 수 있습니다.예를 들어, 개발자는 다양한 운영 체제와 다양한 환경에 배포할 수 있는 Rails 프로젝트를 계획할 수 있습니다.관리자 또는 루트 사용자가 손상될 수 있거나 신뢰할 수 없거나 기밀 유지 및 보안 계약에 서명하도록 요청할 수 없는 시나리오가 있을 수 있다고 개발자가 판단하는 경우 개발자는 암호를 메모리에 저장하는 추가 난독화를 추가하기로 결정할 수 있습니다. (암호를 도용하기 위해 약간 덜 안전한 시스템이나 약간 더 영리한 공격이 필요함)아마도 이는 상대적 비용의 문제로 간주될 수 있습니다.저렴한 비용으로 암호를 검색하려면 더 많은 비용이 드는 지식이 필요한 방식으로 숨길 수 있습니다.

다른 팁

모든 루비 스크립트는 ENV 해시를 통해 로컬 환경 변수에 액세스 할 수 있습니다.

puts ENV['PATH']

따라서 모든 POSIX 시스템 (Linux, UNIX, MAC OS)을 사용하면 다음과 같은 스크립트를 호출 할 때 간단히 설정할 수 있습니다.

MY_ARG=supersecret ruby script.rb

레일에도 마찬가지입니다. 당신이 넣으면 puts ENV['MY_ARG'] 환경에서 RB에서 서버를 시작하십시오.

$ 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.

환경 변수는 제 생각에 가장 간단한 솔루션입니다.

웹 서버 사용자 만 읽을 수 있도록 Chmod'ed 파일에 암호를 넣는 데 무엇이 잘못 되었습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top