代码之家  ›  专栏  ›  技术社区  ›  map7

rbenv全系统安装导致不安全操作

  •  7
  • map7  · 技术社区  · 6 年前

    我们公司使用瘦客户机,我们有许多用户使用同一个盒子。我已经安装了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
    

    通过运行最后一行代码,我们应该可以将gems作为系统的任何用户安装,该系统是“staff”组的一部分。我们有两个开发人员是这个小组的一部分,他们都不能安装gems。

    我们得到了错误;

    ~ % 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安装/卸载gems?

    更新

    下面是 /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 回复  |  直到 6 年前
        1
  •  2
  •   Sebastian Sangervasi    6 年前

    我查看了rubygems的源代码 config_file . 你遇到的错误是由 this file operation 试图阅读 $HOME/.gem/credentials (这是硬编码的 here )

    基于此,您可以尝试授予rbenv读取权限 $home/.gem/凭证 对于一个用户,看看是否允许用户安装gem。

    然而,向所有用户公开任何称为“凭据”的内容似乎是一个危险的提议。

    我的理解是,如果您试图 publish gems ,但在大多数安装中可以为空。由于这是一台共享机器,您已经在期待人们偶尔会践踏对方的宝石,因此让rbenv访问所有的宝石凭据对您来说可能是可以接受的……

    直到没有。你提到你“不想在同一台机器上保留两个拷贝”,但这比看起来更困难。每种编程语言都有一个稍微不同的工具来避免 Dependency Hell 但是许多人坚持一种模式:每个代码项目都得到其所有依赖项的副本。在我的机器上,我至少安装了五个 Bundler ,跨越两个或三个版本。我不担心磁盘空间的问题,我很高兴不用手工整理上千个依赖项。