Crystal的HTTP:服务器丢弃权限可以吗?

时间:2017-11-30 03:32:13

标签: crystal-lang

某些服务器启动特权端口(低于1024端口,需要root权限),开始侦听端口,然后删除权限(更改为非root用户)。水晶的HTTP::Server可以做类似的事吗?

1 个答案:

答案 0 :(得分:2)

您可以使用the LibC bindings to drop privileges

# Changing the process' uid: 
# https://stackoverflow.com/a/47558121/841803
lib LibC
  fun setuid(uid_t : Int)
  fun getuid : Int
end

require "http/server"

server = HTTP::Server.new(80) do |context|
  context.response.content_type = "text/plain"
  context.response.print "Hello world!"
end

server.bind
LibC.setuid(THE_NEW_UID) 
puts "=== Processing requests as:"
Process.run("whoami", output: true)
server.listen

凯末尔用户:

Kemal.run(YOUR_PRIVILEGED_PORT) do |config|
  config.server.bind
  LibC.setuid(THE_NEW_UID) 
end

如果您使用的分片不允许您直接访问它的HTTP::Server实例,则应该找到备用分片。也可以对HTTP::Server#listen方法进行修补,但不建议这样做。