Pergunta

Eu estou procurando uma maneira de fornecer um argumento para um projeto Ruby on Rails em tempo de execução. Essencialmente, o nosso projeto usa criptografia de chave pública para criptografar alguns dados de clientes sensíveis e queremos a capacidade de fornecer a senha para o arquivo de chave privada em tempo de execução.

Foi útil?

Solução

Uma maneira fácil de fazer isso seria criar um Rails plugin que leva argumentos usando 'fica' em sua 'init.rb'. Permitam-me a cozinhar-se um exemplo de código rápida:

Faça um diretório: '$ railsRoot / vendor / plugins / startup_args / lib'

Criar um objeto para armazenar dados de argumento em '$ 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

Carregue o módulo StartupArgs em namespace do projeto Rails e preenchê-lo com argumentos em '$ 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

Agora, durante o processo de start-up do projeto Rails, ele vai tentar tirar pares chave-valor a partir do console. Estes pares serão armazenados nos StartupArgs objeto global-namespace para posterior acesso (via 'StartupArgs.getArg ()').

Se você antecipar que o seu projeto Rails pode ser implantado em cenários onde o daemon não terá acesso ao console durante a inicialização do tempo, você pode ler a partir de um tubo chamado em vez de entrada padrão do console.

Indo um passo adiante, você pode remover todas as partes do 'init.rb' exceto para a declaração 'exigem' e adicione uma ação que executa esta configuração para um controlador que levaria os parâmetros relevantes como um posto através da web. Certifique-se de configurar o Rails para evitar parâmetros potencialmente sensíveis (por exemplo, senhas) sejam inseridos em arquivos de log de gravação acessos ou erros (especialmente se ele pode ser usado como um HTTP GET, com parâmetros na URL).

(Você obter o mesmo efeito desta forma, como com o sistema descrito acima, se você configurar as outras ações Rails para ignorar os pedidos até que a ação de configuração tiver armazenado os parâmetros apropriados para o objeto global.)

Uma nota Para Miquéias: Eu não tenho a reputação de comentário diretamente no seu post, por isso vou incluir o meu comentário aqui. Pode haver algumas razões para considerar um sistema que não requer a senha a ser representada no sistema de arquivos. Por exemplo, um desenvolvedor pode estar planejando um projeto Rails que pode ser implantado em variados sistemas operacionais e em ambientes variados. Se o desenvolvedor determina que poderia haver cenários em que um usuário administrativo ou raiz poderia ser comprometida, não se pode confiar, ou não pode ser convidado a assinar acordos de confidencialidade e segurança, o desenvolvedor pode decidir adicionar o ofuscamento adicional de colocar a senha na memória única (no interesse de se exigir um sistema ligeiramente menos seguro ou um ataque ligeiramente mais inteligente de roubar a senha). Talvez ele poderia ser considerado uma questão de custos relativos:. A baixo custo, a senha pode ser escondido em uma maneira que requer um conhecimento mais caro, a fim de recuperar

Outras dicas

Qualquer Rubi script tem acesso a variáveis ??de ambiente locais através do hash ENV.

puts ENV['PATH']

Assim, com qualquer sistema POSIX (Linux, Unix, Mac OS), você pode simplesmente defini-lo ao chamar o script, como este:

MY_ARG=supersecret ruby script.rb

O mesmo também é válido para os trilhos. Se você colocar puts ENV['MY_ARG'] em seu environment.rb e iniciar o seu servidor:

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

Uma variável de ambiente é de longe a solução mais simples na minha opinião.

O que é errado em colocar a senha em um arquivo que é chmod'ed apenas ser lidos pelo usuário do servidor web?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top