当我运行一个Node服务器应用程序时,我通常调用一个自定义函数
function runAsWWW()
{
try
{
process.setgid('www-data');
process.setuid('www-data');
} catch (err)
{
console.error('Cowardly refusal to keep the process alive as root.');
process.exit(1);
}
}来自server.listen(8080,'localhost',null,runAsWWW);
因此,服务器实际上是作为www-data用户运行的,以提供更好的安全性。当我通过发出go run index.go启动一个Golang服务器时,我还能做什么类似的事情吗?
发布于 2015-06-20 05:39:31
关于@JimB的回答:
使用进程管理器以特定用户的身份运行应用程序(并处理重新启动/崩溃、日志重定向等)。对于多线程应用程序来说,setuid和setgid是普遍的坏主意。
要么使用操作系统的进程管理器(Upstart、systemd、sysvinit),要么使用独立的流程管理器(Supervisor、runit、monit等)。
下面是主管的一个示例:
[program:yourapp]
command=/home/yourappuser/bin/yourapp # the location of your app
autostart=true
autorestart=true
startretries=10
user=yourappuser # the user your app should run as (i.e. *not* root!)
directory=/srv/www/yourapp.com/ # where your application runs from
environment=APP_SETTINGS="/srv/www/yourapp.com/prod.toml" # environmental variables
redirect_stderr=true
stdout_logfile=/var/log/supervisor/yourapp.log # the name of the log file.
stdout_logfile_maxbytes=50MB
stdout_logfile_backups=10此外:如果您不是反向代理,而且Go应用程序需要绑定到端口< 1024 (例如端口80或443),那么使用套帽 -例如:setcap cap_net_bind_service=+ep /home/yourappuser/bin/yourapp
PS:我写了关于如何使用Supervisor运行Go应用程序的一篇小文章 (从“我没有安装主管”开始)。
发布于 2015-06-19 16:02:21
不是的。在go中不能可靠地设置setuid或setgid,因为这不适用于多线程程序。
您需要以预期用户的身份启动程序,直接通过某种类型的监督者(例如supervisord、runit、monit)或通过init系统启动。
发布于 2015-06-19 16:02:29
您可以使用os/user包检查程序是否在特定用户下运行:
curr, err := user.Current()
// Check err.
www, err := user.Lookup("www-data")
// Check err.
if *curr != *www {
panic("Go away!")
}这并不完全是您想要的,但它确实阻止它在任何其他用户下运行。您可以以www-data的形式运行它,方法是使用su运行它。
su www-data -c "myserver"https://stackoverflow.com/questions/30942322
复制相似问题