gpt4 book ai didi

ruby-on-rails - 如何以myuser ssh身份,但在/home/deployuser中以deployuser身份运行所有Capistrano命令

转载 作者:行者123 更新时间:2023-12-04 03:44:58 25 4
gpt4 key购买 nike

背景/问题

由于我绝对不能更改安全性配置,因此我必须将一个联合用户myuser放到所有盒子上。

我需要部署到的设备上的所有东西都由deployuser拥有,我绝对不能更改此设置。
myuser可以假定用户为deployuser并具有所有sudo特权。

最终,我希望Capistrano部署能够像从一开始就以deployuser ssh的方式运行一样,因此每个命令都以deployuser/home/deployuser的身份运行。

我可以使用任何想要的Capistrano版本,但现在我正在尝试使用Capistrano 3。

测试设置

我创建了一个简单的Capistrano任务,以测试是否可以对deployuser拥有的文件执行操作。

desc "Check that we can access everything"
task :check_permissions do
on roles(:all) do |host|
execute("whoami")
execute("cp /tmp/file-owned-by-deploy-user /tmp/test-file")
end
end

编辑:上面的测试实际上并不像预期的那样起作用。我相信这是因为当您手动声明类似 execute('command')的内容时,它会覆盖任何表示“以X用户身份执行此操作”的配置。更好的测试是只运行 cap environment deploy任务,看看失败了。

我尝试过的

sshkit-backends-netssh_global根据他们的文档

我尝试的第一件事是 sshkit-backends-netssh_global,在他们的文档中说他们完全可以处理此用例。

我将其添加到我的Capfile中,然后尝试将其添加到 deploy.rb中,甚至在我的任务定义之上,以防万一:
require 'sshkit/backends/netssh_global'

SSHKit::Backend::NetsshGlobal.configure do |config|
config.owner = 'deployuser'
config.directory = '/home/deployuser'
end

效果为0。没有新的错误消息,只是相同的权限被拒绝,而whoami返回myuser。

在Capistrano 3中设置:sshkit_backend

其次,我尝试从Capistrano设置 :ssh_backend,这在 this issue for sshkit-backends-netssh_global中可以看到:
require 'sshkit/backends/netssh_global'

set :sshkit_backend, -> {
SSHKit::Backend::NetsshGlobal.tap do |backend|
backend.configure do |config|
config.owner = 'deployuser'
config.directory = '/home/deployuser'
end
end
}

这表明 sshkit-backends-netssh_global与Capistrano的最新版本不再兼容。它使用了不推荐使用的方法 checkout。太讨厌了:
NoMethodError: undefined method `checkout' for #<SSHKit::Backend::ConnectionPool:0x007fae8340e3c0>

我尝试降级为Capistrano的较低版本,尽管该版本解决了弃用问题,但并未神奇地使这些配置设置生效。我没有深入。

从SSHKit用作'deployuser'进行测试

我有点觉得我疯了,因为,当我尝试按照 SSHKit documentation将用户的任务包装为“用户”时, whoamideployuser的身份运行,而cp命令仍然返回Permission Denied。

因此,也许我的测试脚本没有按照我认为的去做。仍然可以将此命令复制/粘贴到服务器上,并通过添加 sudo -u deployuser来运行。

在上面的编辑中,我说这是因为我认为执行 execute('command')有点不同,并且不考虑您的配置-它只是执行事情。我认为。因此,这可能仍适用于其他类型的任务(尽管内部Capistrano任务当然不行)。
desc "Check that we can access everything"
task :check_permissions do
on roles(:all) do
as 'deployuser' do
# this returns deployuser
execute("whoami")

# this throws permission denied
execute("cp /tmp/file-owned-by-deploy-user /tmp/test-file")
end
end
end

使用SSHKit.config.command_map

我尝试过的另一种策略,其结果与上面的示例相同:
SSHKit.config.command_map = Hash.new do |hash, command|
hash[command] = "sudo -u deployuser #{command}"
end
whoami返回 deployuser,但是 cp命令仍然返回Permission Denied。同样,这可能是因为 execute实际上不是我在这里需要测试的。

相关但未解决的Stackoverflow问题
  • This one gives a solution for Capistrano 2我尝试降级和使用它,但不适用于所有命令,并且Capistrano 3没有答案
  • This one is generally unanswered in the way I need
  • Same here

  • 一些相关问题
  • I replied to this open issue within SSHKit
  • And this one

  • 有没有人得到这个工作?有任何想法吗?

    编辑:事情是可行的(ish)

    我整天都在努力,这是到目前为止的工作……虽然很累,但是我已经完成了基本的部署工作。

    首先,虽然您大多数情况下想将 sudo -u deployuser附加到命令中,但并非所有命令都正确。我本来在这里还有其他几个人,但我只能将其归类为 chmod,不能将其作为 deployuser运行
    SSHKit.config.command_map = Hash.new do |hash, command|
    skipped_commands = [:chmod]

    if skipped_commands.include?(command)
    hash[command] = command
    else
    hash[command] = "sudo -u deployuser #{command}"
    end
    end

    好的,然后我意识到这不适用于所有Capistrano情况,因为在Capistrano端的几个rake任务中插入了这些 >>

    所以我为这两个任务写了一个猴子补丁:

    namespace :deploy do
      # MONKEY PATCH OH NO
    # =======================

    # you actually have to clear the old rake task
    # for yours to overwrite Capistrano's
    Rake::Task['deploy:set_current_revision'].clear
    desc "IT'S MINE"
    task :set_current_revision do
    on release_roles(:all) do
    within release_path do
    execute :echo, "\"$(sudo -u deployuser git rev-parse HEAD)\" | sudo -u deployuser tee REVISION"
    end
    end
    end

    Rake::Task['deploy:log_revision'].clear
    desc "Log details of the depl
    task :log_revision do
    on release_roles(:all) do
    within releases_path do
    execute :echo, %Q{"#{revision_log_message}" | sudo -u deployuser tee #{revision_log}}
    end
    end
    end
    end

    正在进行调查(我仍然必须实施其余的部署),但是在完成这些更改之后,现在将完成一个简单的 cap test_environment deploy

    另外,这是我的 bundle 包,供以后发现这些商品的人使用:
    Gems included by the bundle:
    * activesupport (4.2.10)
    * airbrussh (1.3.0)
    * aws-partitions (1.56.0)
    * aws-sdk-core (3.14.0)
    * aws-sdk-ec2 (1.25.0)
    * aws-sigv4 (1.0.2)
    * bundler (1.16.0)
    * capistrano (3.10.1)
    * capistrano-bundler (1.3.0)
    * capistrano-rails (1.3.1)
    * coderay (1.1.2)
    * concurrent-ruby (1.0.5)
    * dogapi (1.28.0)
    * faraday (0.14.0)
    * i18n (0.9.3)
    * jmespath (1.3.1)
    * json (1.8.6)
    * method_source (0.9.0)
    * minitest (5.11.1)
    * multi_json (1.13.1)
    * multipart-post (2.0.0)
    * net-scp (1.2.1)
    * net-ssh (4.2.0)
    * pry (0.11.3)
    * rake (12.3.0)
    * slackbot (0.0.2)
    * sshkit (1.15.1)
    * sshkit-backends-netssh_global (0.1.1)
    * thread_safe (0.3.6)
    * tzinfo (1.2.4)

    再次编辑!

    原始插件 posted this patch的作者昨天在Capistrano 3.10中为我工作,没有任何猴子补丁。

    最佳答案

    我不是capistrano用户,但是您可以使用OpenSSH功能来实现此目的。假设:

  • Capistrano正在连接到远程系统上的OpenSSH ssh服务器。
  • 正在使用ssh密钥
  • 对ssh session 进行身份验证
  • 您可以更改远程ssh配置(特别是myuser authorized_keys文件)

  • 如果这些假设是正确的,则每个远程系统上的 myuser都有一个.ssh / authorized_keys文件,其中包含capistrano用于认证的公钥。您可以在该行上添加一条指令,该指令在使用该密钥时强制ssh服务器运行硬编码命令,而不是远程客户端请求的命令。这使您可以为请求的命令插入自己的处理程序。

    该处理程序可以是一个简单的shell脚本。这未经测试,但是您应该了解一下:
    #!/bin/sh
    sudo -u deployuser $SSH_ORIGINAL_COMMAND

    将此文件存储在远程系统上的文件中,使其可执行,然后将其设置为在authorized_keys文件中运行的命令。当ssh服务器代表远程客户端调用此命令时,它将 SSH_ORIGINAL_COMMAND环境变量设置为远程客户端请求的命令字符串。

    authorized_keys文件描述为 here。基本上,文件的每一行都指定一个可用于身份验证的密钥。一行看起来像这样:
    ssh-rsa AAAAB3NzaC1yc2EAA...

    您可以在该行之前添加 command=指令:
    command=/home/myuser/run-as-deployuser ssh-rsa AAAAB3NzaC1yc2EAA...

    使用此密钥进行身份验证时,ssh服务器将调用请求的命令,而不是调用客户端请求的任何命令。如我之前所说,SSH_ORIGINAL_COMMAND环境变量将设置为客户端请求的命令。

    关于ruby-on-rails - 如何以myuser ssh身份,但在/home/deployuser中以deployuser身份运行所有Capistrano命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48411406/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com