RubyGems: Prácticas de seguridad (9)

La instalación de una gema permite que el código de esa gema se ejecute en el contexto de tu aplicación.

Claramente, eso tiene implicaciones de seguridad: La instalación de una gema maliciosa en un servidor podría resultar en última instancia en que el autor de la gema penetrase completamente en ese servidor.

Debido a esto, la seguridad del código de las gemas es un tema a debate activo dentro de la comunidad de Ruby.

RubyGems ha tenido la capacidad de firmar criptográficamente gemas desde la versión 0.8.11.

Esa firma funciona usando el comando gem cert para crear un par de claves y luego empaquetando los datos de la firma dentro de la propia gema.

Opcionalmente, el comando gem install permite establecer una política de seguridad y puede verificar la clave de firma de una gema antes de instalarla.

Sin embargo, este método de asegurar gemas no se usa mucho puesto que requiere una serie de pasos manuales por parte del desarrollador y no existe una cadena de confianza bien establecida para las claves de firma de gemas.

La discusión sobre nuevos modelos de firma como X509 y OpenPGP se está llevando a cabo en el wiki de rubygems-trust, la lista de RubyGems-Developers y en IRC.

El objetivo es mejorar (o reemplazar) el sistema de firma para que sea fácil para los autores y transparente para los usuarios.

Usando GEMAS de forma segura

Instalar una gema bajo una política de confianza.

  • gem install gemname -P HighSecurity : Todas las gemas dependientes deben estar firmadas y verificadas.
  • gem install gemname -P MediumSecurity : Todas las gemas dependientes firmadas deben verificarse.
  • bundle --trust-policy MediumSecurity : Igual que arriba, excepto que Bundler solo reconoce la bandera larga --trust-policy y no la corta -P .
  • Advertencia: Los certificados de gemas son confiables a nivel mundial, de modo que agregar un cert.pem para una gema automáticamente confía en todas las gemas firmadas por ese certificado.

Verifica la suma de verificación, si es que se encuentra disponible:

gem fetch gemname -v version
ruby -rdigest/sha2 -e "puts Digest::SHA512.new.hexdigest(File.read('gemname-version.gem'))

Conoce los riesgos de ser manipulado, como se describe en la charla Hacking with Gems de Benjamin Smith..

Gemas de construcción

Firmar con: gem cert

  1. Crear certificado de gema autofirmado. Usa la dirección de correo electrónico que especificas en tu gemspecs.
    2.
cd ~/.ssh
gem cert --build [email protected]
chmod 600 gem-p*
  1. Configura gemspec con el certificado. Agrega la clave pública del certificado a tu repositorio.
cd /path/to/your/gem
mkdir certs
cp ~/.ssh/gem-public_cert.pem certs/yourhandle.pem
git add certs/yourhandle.pem

Agrega rutas de certificación a tu gemspec.

s.cert_chain  = ['certs/yourhandle.pem']
s.signing_key = File.expand_path("~/.ssh/gem-private_key.pem") if $0 =~ /gem\z/
  1. Agrega tu propio certificado a la lista aprobada, como cualquier otra persona:
gem cert --add certs/yourhandle.pem
  1. Crea una gema y prueba que puedes instalarla.
gem build gemname.gemspec
gem install gemname-version.gem -P HighSecurity
# or -P MediumSecurity if your gem depends on unsigned gems
  1. Texto de ejemplo para la documentación de instalación

MetricFu está firmado criptográficamente. Para asegurarte de que la gema que instalaste no haya sido manipulada:

Agrega la clave pública (si aún no lo has hecho) como un certificado de confianza.

gem cert --add  gem install metric_fu -P MediumSecurity

El perfil de confianza de MediumSecurity verificará las gemas firmadas, pero permitirá la instalación de dependencias sin firmar.

Esto es necesario porque no todas las dependencias de MetricFu están firmadas, por lo que no podemos usar HighSecurity.


Incluye la suma de verificación de las gemas liberadas en tu repositorio

require 'digest/sha2'
built_gem_path = 'pkg/gemname-version.gem'
checksum = Digest::SHA512.new.hexdigest(File.read(built_gem_path))
checksum_path = 'checksum/gemname-version.gem.sha512'
File.open(checksum_path, 'w' ) {|f| f.write(checksum) }
# add and commit 'checksum_path'

No se recomienda la firma OpenPGP debido a la falta de soporte (archivo) .

Para obtener más información, consulte la discusión con Yorick Peterse.

Más artículos sobre seguridad de GEMAS

Se utilizaron varias fuentes para el contenido de esta guía:


<<

🔥 RELACIONADOS

Deja un comentario