1
一部のサーバーは特権ポート(サブ1024ポート、ルート特権が必要)で起動し、ポートでリッスンを開始して特権を削除します(ルート以外のユーザーに変更)。 CrystalのHTTP::Server
も同様のことができますか?クリスタルのHTTP:サーバーは権限を削除できますか?
一部のサーバーは特権ポート(サブ1024ポート、ルート特権が必要)で起動し、ポートでリッスンを開始して特権を削除します(ルート以外のユーザーに変更)。 CrystalのHTTP::Server
も同様のことができますか?クリスタルのHTTP:サーバーは権限を削除できますか?
あなたは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
メソッドをサルパッチすることも可能ですが、お勧めしません。
私はあなたがサルのパッチをする必要はないと思います。 'server.bind'と' server.listen'を別々に呼び出して、 'LibC setuid'を間に置くことができます。 –
@JohannesMüllerありがとう。私はあなたの答えで答えを更新しました。レビューする時間があれば自由に編集してください。コミュニティウィキとして設定されています。 –