在我开始之前,请随意为这个问题建议一个更好的标题。
我已经在 Digitalocean 上注册并安装了 LEMP 堆栈。这是我第一次从头开始配置服务器。尽管我选择了 LEMP 选项,但我也想托管节点应用程序。
我主要担心的是,我不确定应该创建哪些用户,以及哪些用户应该拥有管理员权限。此外,我希望尽可能依赖 SSH 密钥。
对于文件上传/下载,我使用 Filezilla。当我安装 LEMP 堆栈时,系统询问我是否要为 生成密码
root
,或使用 SSH 密钥。我选择了后者。现在,我可以使用我的 SSH 密码。安装了 ProFTPd 和ssh [email protected]
已启用 SFTP./etc/proftpd/authorized_keys/root
包含我用来通过ssh
或 Filezilla 连接到服务器的 SSH 密钥。ssh
和 Filezilla 均不要求root
输入 的密码。由于我是唯一一个通过 SFTP 访问的人,我认为我可以使用这种方法。如果我需要其他人,我会为他创建一个用户,关联他的 SSH 密钥并授予他访问某些文件夹的权限。
这并没有给我带来麻烦,但我想我应该提一下,看看是否有人认为这是一种不好的做法。
我希望能够执行 Node 应用。作为
root
,我安装了 node、npm 和 pm2,以便随时保持我的应用处于活动状态。所有这些都位于/usr/local/bin
所有者 中root:root
。我创建了一个名为 的用户www
,因为我将应用存储在 中/var/www
,所以chown -R www:www /var/www
。我是否真的需要创建www
或者我可以使用(www-data
Nginx 使用的那个)?到目前为止,我实际上不需要添加
www
sudoers,直到我想使用pm2 startup
andnpm install
:- PM2需要(生成脚本以在每次系统启动后运行 PM2)供要执行(启动节点应用程序并监视它)
pm2 startup
的用户使用。这只需执行一次。它会为您提供需要使用 执行的命令。因此并执行所述命令。一切顺利。pm2 start
sudo
usermod -aG www sudo
npm install
也需要sudo
。不过,这个的问题是,我不想被要求输入密码。我正在尝试使用 Git 后接收钩子,因此每当我推送到服务器时,我都希望执行此操作(/var/repo/nodeapp.git/hooks/post-receive
):#!/bin/sh git --work-tree=/var/www/nodeapp --git-dir=/var/repo/nodeapp.git checkout -f && cd /var/www/nodeapp && sudo npm install
如果我
git push
从终端执行此操作,则在尝试时不会出现被要求输入密码的问题sudo npm install
,但有时我使用适用于 Windows/Mac 的 Github,我无法提供该密码。请注意,我将设置 SSH 密钥以www
通过终端或 Github 应用程序进行连接。
首先,我想将
www
用户设置为npm
和 的所有者pm2
,因为我认为这样我就不会被要求使用 执行命令sudo
。我错了(希望你没有笑)。接下来我想,既然www
是 sudoer,我可以让某些命令可供它与 sudo 一起使用。所以我visudo
'd 并且在文件中间有这个:# User privilege specification root ALL=(ALL:ALL) ALL www ALL=(ALL:ALL) NOPASSWD:/usr/local/bin/npm
我想要实现的是“让用户无需输入密码
www
即可使用”。sudo npm install
这样做对吗?有没有办法说“不要让此用户将 sudo 与任何其他命令一起使用,即使他提供了正确的密码”。假设我sudo rm file.txt
按 as执行www
,并且 file.txt 归另一个用户所有:我可以禁用它吗?我只希望www
(或我创建的任何其他用户)能够将 sudo 与 一起使用npm
。到目前为止,对我来说不起作用。另外,有没有办法无需添加
www
sudoers 就能实现所有这些?- PM2需要(生成脚本以在每次系统启动后运行 PM2)供要执行(启动节点应用程序并监视它)
据我所知,我不应该让用户
root
通过 进行连接ssh
。这很重要吗?Digitalocean 没有提供任何 GUI 来配置服务器,因此ssh
ing asroot
是我配置 Nginx 设置等内容的唯一方法。Nginx 被执行,
root
因此它可以监听端口 80,但随后它会以另一个用户的身份为网站提供服务(www-data
我相信)。我应该在这里配置一些东西吗?我对这个用户一无所知:权限、密码、授权密钥……我应该设置user www;
吗/etc/nginx/nginx.conf
?当我使用 PHP 建立网站并且访问者访问该网站时会发生什么?
www-data
默认情况下,哪个用户实际上在执行操作?我是否应该为我的 PHP 网站安排一个用户,并为另一个用户负责执行类似的操作
node index.js
?如果我设置
AllowUsers someusername anotherusername
,/etc/ssh/sshd_config
这是否仅适用于尝试通过命令访问时ssh
,还是也适用于我尝试使用 Windows/Mac 版 Github 推送更改时?如果我
PasswordAuthentication no
设置/etc/ssh/sshd_config
,当带有 sudo 的命令询问时我应该输入什么密码?
答案1
只有您打算登录的交互式帐户才应具有 sudo 或 root 权限。服务可以合理地拥有 sudo 或 root 权限的场景数量极其有限:备份、防病毒、主机入侵防御。
我不建议使用 sudoers 授予服务帐户受限的管理员权限。限制允许的操作集非常困难。Sudoers 与相当明智的同事一起工作,他们不想故意损害您的系统。受感染的 Web 服务器不是此类权限的合格持有者,您希望限制可能造成的损害。
允许 root npm install 的安全风险相当大。npm install 不需要 root 权限。也就是说,除非非常小心谨慎,否则允许您的 Web 应用程序根据用户请求进行自我修改是非常危险的。
如果您希望能够更新 Web 应用程序,请使用单独的 cron 作业或服务来执行此操作,然后重新配置并重新启动 Apache。此服务可能有权运行git和npm 安装这应该仅限于用户级别npm 安装而不是系统级。很可能足够的权限仅限于文件系统,并且可能仅限于您的应用程序文件夹,以便更新程序用户可以更改内容,同时www-数据不能。
强化 nginx 时最重要的事情是禁用不使用的模块,并使 server_tokens 显示较少详细的版本信息。 进一步强化 Nginx 是可能的取决于系统或服务的敏感度。
不允许通过 SSH 以 root 用户身份登录。以非 root 用户身份登录您的实例并使用须藤运行命令或sudo su-l成为 root 并执行此操作。
您是否应该为不同的事物设置不同的用户和权限?理想情况下是的。实际上,通过这种方式划分的组件越多,系统就越安全。它还使添加或删除权限变得更容易,因为每个用户在系统中的角色定义非常严格,访问权限最小。