aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2015-11-16 20:52:49 +0900
committerKazuki Yamaguchi <k@rhe.jp>2015-11-16 20:53:11 +0900
commitf34553449a173afc7be7d109f5d754e865c702ef (patch)
treec35db5f0a2d06fcfcfe82a25250a371e76a4b035
parenta5aa53a9174f47450582b29cb93cbd162753bf47 (diff)
downloadplum-f34553449a173afc7be7d109f5d754e865c702ef.tar.gz
rack: add option to drop privileges
-rw-r--r--examples/rack-example-config.rb3
-rw-r--r--lib/plum/rack/dsl.rb8
-rw-r--r--lib/plum/rack/server.rb22
3 files changed, 33 insertions, 0 deletions
diff --git a/examples/rack-example-config.rb b/examples/rack-example-config.rb
index d8d3dcb..8f5e1f1 100644
--- a/examples/rack-example-config.rb
+++ b/examples/rack-example-config.rb
@@ -4,6 +4,9 @@ server_push true
threaded false # create a new thread per request
fallback_legacy "127.0.0.1:8080" # forward if client doesn't support HTTP/2
+user "nobody"
+group "nobody"
+
# listeners may be multiple
listener :unix, { path: "/tmp/plum.sock", mode: 600 }
listener :tcp, { hostname: "0.0.0.0", port: 80 }
diff --git a/lib/plum/rack/dsl.rb b/lib/plum/rack/dsl.rb
index b1f8bb0..006d6dc 100644
--- a/lib/plum/rack/dsl.rb
+++ b/lib/plum/rack/dsl.rb
@@ -49,6 +49,14 @@ module Plum
@config[:fallback_legacy_host] = h
@config[:fallback_legacy_port] = p.to_i
end
+
+ def user(username)
+ @config[:user] = username
+ end
+
+ def group(groupname)
+ @config[:group] = groupname
+ end
end
end
end
diff --git a/lib/plum/rack/server.rb b/lib/plum/rack/server.rb
index 1f3d32c..9a0caf4 100644
--- a/lib/plum/rack/server.rb
+++ b/lib/plum/rack/server.rb
@@ -17,6 +17,10 @@ module Plum
@logger.info("Plum #{::Plum::VERSION}")
@logger.info("Config: #{config}")
+
+ if @config[:user]
+ drop_privileges
+ end
end
def start
@@ -100,6 +104,24 @@ module Plum
ensure
upstream.close if upstream
end
+
+ def drop_privileges
+ begin
+ user = @config[:user]
+ group = @config[:group] || user
+ @logger.info "Dropping process privilege to #{user}:#{group}"
+
+ cuid, cgid = Process.euid, Process.egid
+ tuid, tgid = Etc.getpwnam(user).uid, Etc.getgrnam(group).gid
+
+ Process.initgroups(user, tgid)
+ Process::GID.change_privilege(tgid)
+ Process::UID.change_privilege(tuid)
+ rescue Errno::EPERM => e
+ @ogger.fatal "Could not change privilege: #{e}"
+ exit 2
+ end
+ end
end
end
end