rbenv系统范围广泛安装会导致操作不安全

时间:2018-05-23 03:36:47

标签: ruby permissions rubygems rbenv

我们在公司使用瘦客户端,我们有很多用户使用同一个盒子。我按照以下网站上的说明安装了rbenv作为系统安装;

https://blakewilliams.me/posts/system-wide-rbenv-install

这归结为这些命令

cd /usr/local
git clone git://github.com/sstephenson/rbenv.git rbenv
chgrp -R staff rbenv
chmod -R g+rwxXs rbenv

通过运行最后一行,我们应该能够像系统的任何用户一样安装宝石,这是“工作人员”的一部分。组。我们有两个开发人员是该组的一部分,他们都不能安装宝石。

我们收到错误;

~ % gem install cheat         
/usr/local/rbenv/versions/2.3.5/lib/ruby/2.3.0/rubygems/config_file.rb:332:in `exist?': Insecure operation - exist? (SecurityError)
    from /usr/local/rbenv/versions/2.3.5/lib/ruby/2.3.0/rubygems/config_file.rb:332:in `load_file'
    from /usr/local/rbenv/versions/2.3.5/lib/ruby/2.3.0/rubygems/config_file.rb:198:in `initialize'
    from /usr/local/rbenv/versions/2.3.5/lib/ruby/2.3.0/rubygems/gem_runner.rb:75:in `new'
    from /usr/local/rbenv/versions/2.3.5/lib/ruby/2.3.0/rubygems/gem_runner.rb:75:in `do_configuration'
    from /usr/local/rbenv/versions/2.3.5/lib/ruby/2.3.0/rubygems/gem_runner.rb:40:in `run'
    from /usr/local/rbenv/versions/2.3.5/bin/gem:21:in `<main>'
~ % gem install cheat

如果我从组中删除粘性位,那么他们可以添加宝石,但如果有人试图删除其他人安装的宝石,则会失败;

~ % chmod -R g-s rbenv

如何允许多个用户从系统范围的rbenv安装中安装/卸载gem?

更新

以下是/usr/local/rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems目录中的安装示例,如您所见

drwxrwxr-x   5 map7  map7  4.0K Jun  4 15:50 unicode-display_width-1.3.3
drwxrwxr-x   5 andre andre 4.0K May 23 13:22 vcr-3.0.3
drwxrwxr-x   3 map7  staff 4.0K Apr 30 11:01 web-console-3.6.2

我发现的解决方案是

  : cd /usr/local/rbenv/versions/2.5.1/lib/ruby/gems/2.5.0
  : sudo chown -R map7:staff gems
  : sudo chmod -R 775 gems
  : sudo chmod g+s gems

1 个答案:

答案 0 :(得分:2)

我看了一下RubyGems config_file的源代码。您遇到的错误是由this file operation尝试阅读$HOME/.gem/credentials(硬编码here)引起的。

基于此,您可以尝试为一个用户提供rbenv权限以读取$HOME/.gem/credentials,并查看是否允许用户安装gem。

然而,暴露任何名为&#34;凭证&#34;对所有用户来说似乎是一个危险的命题。

我的理解是,如果您尝试publish gems,凭据文件只需要包含真实凭据,但对于大多数安装可能是空的。由于这是一台共享计算机,您已经期望人们偶尔会互相践踏对方的宝石,因此您可以接受所有宝石凭证的rbenv访问权限......

直到没有。你提到你并不想在同一台机器上保留两份副本&#34;但这比看起来更难。每种编程语言都有一个稍微不同的工具来避免Dependency Hell,但许多编程语言坚持一种模式:每个代码项目都获得其所有依赖项的副本。在我的机器上,Bundler安装了两个或三个版本的至少五个Rails副本。我并不担心磁盘空间,我很高兴我不必亲手整理一千个依赖项。