我正在运行一个web服务器与nginx,其次是gunicorn运行Django应用程序与芹菜。所有的生产流程和工人都由主管管理。我的问题是,在为堆栈中的每个进程设置权限方面,最佳实践是什么?
目前我基本上遵循默认设置,我很确定这里有一些不安全的部分:
- Nginx的主进程是根进程,工作进程是www-data
- 管理程序作为根运行
- Gunicorn以root身份运行(我试图将其设置为另一个用途,但进程无法启动)
- PostgresSQL和RabbitMQ作为自己的用户运行(postgres和RabbitMQ)
- 我还没有设置芹菜,但他们的文档说不运行作为根
哪些权限可以收紧,我必须确保他们能够访问哪些文件才能工作?
Supervisor需要root权限才能启动其他进程(比如Nginx)。这应该没问题,因为Supervisor不应该直接与外部用户交互或接受用户输入。
Gunicorn应该可以在没有特权的情况下运行,你可能需要将它使用的unix域套接字的所有者更改为www-data而不是root。
通常在web服务器场景中,您需要root权限才能访问1024以下端口上的文件和打开套接字。如果您的服务器不能访问文件,您应该更改它们的权限,而不是使用特权运行。你通常需要特权才能打开端口80或443,这就是为什么现代web服务器以root身份启动,绑定到他们的端口,然后将特权释放给他们的运行用户www-data或nobody。
关于你应该考虑的其他事情,这里有一个快速列表:
- 确保您的数据库查询能够抵抗SQL注入
- 确保你的文件根目录定义良好,并且你没有提供比你预期更多的文件。 最小化数据库帐户的权限(例如,它们可能不需要删除和创建表)
- 避免在代码中接受用户输入并执行或求值的任何地方