我用我的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-For
,X-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