我如何密码保护我/ sidekiq路径(即针对Sidekiq需要身份验证::网络工具)?(How c

2019-07-31 08:26发布

我用我的Rails应用程序sidekiq。 默认情况下,Sidekiq可以由任何人通过在URL后追加“/ sidekiq”访问。 我想用密码保护/验证只有sidekiq一部分。 我怎样才能做到这一点?

Answer 1:

把下面的内容sidekiq初始化

require 'sidekiq'
require 'sidekiq/web'

Sidekiq::Web.use(Rack::Auth::Basic) do |user, password|
  [user, password] == ["sidekiqadmin", "yourpassword"]
end

而在routes文件:

authenticate :user do
  mount Sidekiq::Web => '/sidekiq'
end


Answer 2:

请参阅“安全”下https://github.com/mperham/sidekiq/wiki/Monitoring

Sidekiq :: Web应用架::保护 ,以保护您对典型的Web攻击(如应用CSRF , XSS等)。 机架::保护将失效会话,提高Forbidden如果发现您的申请不符合安全要求的错误。 一种可能的情况是有你的应用程序背后的反向代理的工作,而不是传递中的重要标题给它( X-Forwarded-ForX-Forwarded-Proto )。 这样的情况,可以找到解决办法在这篇文章和问题#2560 ...



Answer 3:

对不起,迟到了,但Sidekiq的维基建议制定如下:

要允许任何身份验证的User

# config/routes.rb
authenticate :user do
  mount Sidekiq::Web => '/sidekiq'
end

为了限制访问User.admin?

# config/routes.rb
authenticate :user, lambda { |u| u.admin? } do
  mount Sidekiq::Web => '/sidekiq'
end

这个wiki职位也有很多其他的安全方案。

这是使用的Rails 5.1.3,制定4.3和5.0 Sidekiq测试



Answer 4:

如果您使用设计(或其它基于监狱长的身份验证),你可以做到这一点,假设你有你的应用的管理用户的模型。

# config/routes.rb
# This defines the authentication constraint
constraint = lambda do |request|
               request.env['warden'].authenticate!({ scope: :admin_user })
             end

# This mounts the route using the constraint.
# You could use any other path to make it less obvious
constraints constraint do
  mount Sidekiq::Web => '/sidekiq'
end


Answer 5:

如果你正在自己的自定义身份验证,那么你可以使用它在文档中引用下面的例子在这里 。

# lib/admin_constraint.rb
class AdminConstraint
  def matches?(request)
    return false unless request.session[:user_id]
    user = User.find request.session[:user_id]
    user && user.admin?
  end
end

# config/routes.rb
require 'sidekiq/web'
require 'admin_constraint'
mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new


Answer 6:

另一种选择是将添加类似康康舞和基于角色的特殊访问权限。



Answer 7:

如果你使用法术进行身份验证,这里是如何使用Rails的路线的限制 ,以保护某些航线。


这里复制从巫术维基冗余:

本教程介绍了如何使用Rails的路线约束与法术宝石。 由于@anthonator写吧!

首先,定义UserConstraint将被用于所有的约束模块:

module RouteConstraints::UserConstraint
  def current_user(request)
    User.find_by_id(request.session[:user_id])
  end
end

然后,将具有定义的模块,您可以指定特定的约束类。 在这些例子中,第一条路线只会工作,如果没有用户登录,第二个将只对谁是管理员登录的用户:

class RouteConstraints::NoUserRequiredConstraint
  include RouteConstraints::UserConstraint

  def matches?(request)
    !current_user(request).present?
  end
end

class RouteConstraints::AdminRequiredConstraint
  include RouteConstraints::UserConstraint

  def matches?(request)
    user = current_user(request)
    user.present? && user.is_admin?
  end
end

最后,您可以添加约束到config/routes.rb

MyApp::Application.routes.draw do

  # other routes …

  root :to => 'admin#dashboard', :constraints => RouteConstraints::AdminRequiredConstraint.new
  root :to => 'home#welcome', :constraints => RouteConstraints::NoUserRequiredConstraint.new

end


Answer 8:

该接受的答案是好的,但我认为它可以更安全地实现,如Sidekiq文档中提到 。

为了保护您对计时攻击的应用程序,使用ActiveSupport::SecurityUtils.secure_compare

  • 见https://codahale.com/a-lesson-in-timing-attacks/
  • 见https://thisdata.com/blog/timing-attacks-against-string-comparison/

此外,使用& (不使用&& ,使其不能做短路)。

最后,使用消化停止长度信息泄露(默认secure_compare在Active支持5)。

积极支持5:由于Rails的PR#24510 ,传递给参数secure_compare正在经历Digest::SHA256.hexdigest默认。

require 'active_support/security_utils'
require 'sidekiq'
require 'sidekiq/web'

Sidekiq::Web.use(Rack::Auth::Basic) do |user, password|
  # Protect against timing attacks:
  # - See https://codahale.com/a-lesson-in-timing-attacks/
  # - See https://thisdata.com/blog/timing-attacks-against-string-comparison/
  # - Use & (do not use &&) so that it doesn't short circuit.
  # - Use digests to stop length information leaking
  ActiveSupport::SecurityUtils.secure_compare(user, ENV["SIDEKIQ_ADMIN_USER"]) &
    ActiveSupport::SecurityUtils.secure_compare(password, ENV["SIDEKIQ_ADMIN_PASSWORD"])
end

积极支持4:

require 'active_support/security_utils'
require 'sidekiq'
require 'sidekiq/web'

Sidekiq::Web.use(Rack::Auth::Basic) do |user, password|
  # Protect against timing attacks:
  # - See https://codahale.com/a-lesson-in-timing-attacks/
  # - See https://thisdata.com/blog/timing-attacks-against-string-comparison/
  # - Use & (do not use &&) so that it doesn't short circuit.
  # - Use digests to stop length information leaking
  ActiveSupport::SecurityUtils.secure_compare(
    ::Digest::SHA256.hexdigest(user),
    ::Digest::SHA256.hexdigest(ENV["SIDEKIQ_ADMIN_USER"])
  ) &
    ActiveSupport::SecurityUtils.secure_compare(
      ::Digest::SHA256.hexdigest(password),
      ::Digest::SHA256.hexdigest(ENV["SIDEKIQ_ADMIN_PASSWORD"])
    )
end


文章来源: How can I password-protect my /sidekiq route (i.e. require authentication for the Sidekiq::Web tool)?