Tilførsel av et argument på skinner kjøring

stemmer
4

Jeg leter etter en måte å levere et argument til en Ruby on Rails prosjekt under kjøring. I hovedsak bruker vårt prosjekt offentlig nøkkel kryptografi for å kryptere enkelte sensitive klientdata og vi ønsker muligheten til å levere passordet til den private nøkkelfilen under kjøring.

Publisert på 31/10/2008 klokken 14:35
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Hva er galt med å sette passord i en fil som er chmod'ed å bare kunne leses av webserveren bruker?

Svarte 31/10/2008 kl. 15:49
kilden bruker

stemmer
1

En enkel måte å gjøre dette på ville være å lage en Rails plugin som tar argumenter hjelp 'får' i sin 'init.rb'. Tillat meg å koke opp en rask kodeeksempel:

Lag en katalog: '$ railsRoot / leverandør / plugins / startup_args / lib'

Opprett et objekt til å lagre argument data i '$ railsRoot / leverandør / 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

Laste StartupArgs modulen inn i Rails prosjektets navnerom og fylle den med argumenter i '$ railsRoot / leverandør / 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

Nå, under Rails prosjektets oppstart prosessen, vil den prøve å ta nøkkelverdipar fra konsollen. Disse parene vil bli lagret i global-navnerom objekt StartupArgs for senere bruk (via 'StartupArgs.getArg ()').

Hvis du forventer at Rails prosjekt kan bli utplassert i situasjoner der nissen ikke vil ha tilgang til konsollen under oppstart-tid, kan du lese fra en navngitt-rør i stedet for konsollens standard input.

Går ett skritt videre, kan du fjerne alle deler av 'init.rb' bortsett fra 'krever' uttalelse og legge til en handling som utfører dette oppsettet til en kontroller som ville ta de relevante parametere som en post over nettet. Sørg for å konfigurere Rails for å unngå potensielt sensitive parametere (f.eks passord) fra å bli inngått loggfiler innspillingen tilganger eller feil (spesielt hvis det kan brukes som en HTTP GET, med parametre i URL).

(Du får den samme effekten på denne måten som med systemet beskrevet ovenfor hvis du konfigurere andre Rails tiltak for å ignorere forespørsler til oppsettet handlingen har lagret de riktige parameterne til den globale objekt.)

Et notat for Micah: jeg ikke har rykte for å kommentere direkte på innlegget ditt, så jeg vil inkludere min kommentar her. Det kan være noen grunner til å vurdere et system som aldri krever passord for å være representert i filsystemet. For eksempel kan en utbygger planlegger et Rails prosjekt som kan bli utplassert på forskjellige operativsystemer og i varierende miljøer. Dersom utbygger bestemmer at det kan være situasjoner der en administrativ eller root bruker kan bli kompromittert, kan ikke stoles på, eller kan ikke bli bedt om å signere taushets og sikkerhetsavtaler, kan utvikleren bestemme seg for å legge den ekstra tåkelegging for å plassere passordet i minnet bare (i interesse av å kreve en noe mindre sikkert system eller en litt mer dyktig angrep for å stjele passord). Kanskje det kan anses som en sak av relative kostnader: til lave kostnader, kan passordet være skjult på en måte som krever dyrere kunnskap for å hente.

Svarte 31/10/2008 kl. 19:45
kilden bruker

stemmer
3

Enhver Ruby skriptet har tilgang til lokale miljøvariabler gjennom ENV hasj.

puts ENV['PATH']

Så med noen POSIX system (Linux, Unix, Mac OS) kan du bare sette den når du ringer skriptet, som dette:

MY_ARG=supersecret ruby script.rb

Det samme gjelder også for rails. Hvis du putter puts ENV['MY_ARG']i environment.rb og starte serveren:

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

Et miljø variabelen er langt den enkleste løsningen etter min mening.

Svarte 31/10/2008 kl. 20:31
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more