Rails 런타임에 인수 제공
-
05-07-2019 - |
문제
저는 런타임에 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 파일에 암호를 넣는 데 무엇이 잘못 되었습니까?