为使用 git 部署到服务器的生产 Web 服务器设置用户和权限的最佳方法是什么?
背景
运行Ubuntu 12.04,我有apache下提供文件服务/var/www的www-data。我还在根用户目录下有一个裸 git 存储库,可以/var/www/example.com在 post-receive 挂钩中结帐。
这工作得很好,但考虑到它是一个生产服务器,我想提高一些安全性并从 root 用户中删除 repo。所以我创建了一个 git 用户并在/home/git. 但是现在我遇到了一个用户拥有存储库而另一个用户拥有 Web 根的事实的权限问题。
我在网上阅读了很多论坛和教程。大多数似乎只使用 root 用户,其他人似乎有更严重的安全问题(例如www-data授予对 repo 的读取权限)。我正在从现实世界的经验中寻找见解,因为有很多方法可以做到这一点。
请注意,post-receive hook 不仅仅是结帐。它还执行一些构建过程,例如运行 Composer 和其他一些可能需要几分钟的 php 脚本。
我尝试了几种解决方案:
我尝试将 git 用户添加到www-data group,然后将 web 根目录重新添加到www-data钩子的末尾。这有两个问题。首先,我必须修改 sudoers 文件,我从中得到的结果是命中注定的。其次,在钩子运行的那几分钟内,检出的文件归 git 而不是www-data,因此站点上的用户可能会收到读取错误。
我尝试将 post-receive 的内容放在另一个文件中,并使用 sudo 执行它。同样,这需要编辑 sudoers 文件,以便 git 用户无需密码即可 sudo。
或者可能是将 repo 留在 root 用户下是较小的邪恶,而我做这一切都是徒劳的。
有没有我没有尝试过的更好的解决方案?
我先试着解释一下我的情况。我目前在 ESXi 主机上运行 6 个虚拟化 Debian 服务器。安装了 Debian Linux 6 (Lenny) 的虚拟服务器。
最近我将服务器更新为 debian Wheezy
root@ares> lsb_release -a /home/vincent
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 7.1 (wheezy)
Release: 7.1
Codename: wheezy
Run Code Online (Sandbox Code Playgroud)
我注意到,自从这次升级以来,“sudo”命令显示出奇怪的行为。实际上,它似乎根本没有影响。我检查了 /etc/visudo 文件,一切正常。Sudo 还询问我的密码,但似乎没有以 root 身份运行。一个例子是“ifconfig”命令:
user@ares> ifconfig
zsh: command not found: ifconfig
[127] user@ares> sudo ifconfig
sudo: ifconfig: command not found
[1] user@ares> sudo su
root@ares>ifconfig
output shows
Run Code Online (Sandbox Code Playgroud)
谁能帮助我?
我想运行这个脚本(它是 git 存储库的 post-receive 钩子):
#!/bin/sh
echo "Executing post-receive hook as user `id` using `which sudo`"
sudo -l
sudo -n bash /var/project/autotest/autotest.sh
Run Code Online (Sandbox Code Playgroud)
它应该在不要求密码的情况下运行,但我得到了以下输出:
Executing post-receive hook as user uid=1005(martinjonas) gid=1001(martinjonas)
groups=1001(martinjonas),1009(lifeweb),1017(project) using /usr/bin/sudo
Matching Defaults entries for martinjonas on this host:
env_reset
User martinjonas may run the following commands on this host:
(root) NOPASSWD: /var/project/autotest/autotest.sh
sudo: sorry, a password is required to run sudo
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,根据 sudo -l 的输出,我应该可以在没有密码的情况下运行 /var/project/autotest/autotest.sh,但是 sudo 仍然要求输入密码。
这是我的 sudoers 文件(它是整个文件,没有其他条目):
# /etc/sudoers
#
# This file …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 /etc/sudoers 文件(redhat)中为“sudotest.sh”(或任何需要 sudo 的脚本/二进制文件)添加一个 NOPASSWD 条目,但为了使其工作,我必须指定完整路径。以下条目工作正常:
%jenkins ALL=(ALL)NOPASSWD:/home/vts_share/test/sudotest.sh
Run Code Online (Sandbox Code Playgroud)
问题是脚本可能会移动到不同的目录。我尝试提供 /home/*/sudotest.sh 但当我尝试执行 sudo ./sudotest.sh 时对我不起作用,它给了我你没有 root 权限
注意:我也没有 /bin/sh 目录的权限。
我有一些名为 foo 的程序,它在执行时需要 root 权限。foo 需要能够被任何用户运行并且可以位于任何路径。这个程序可以在任何路径上的原因是因为我们公司正在开发程序 foo 并且每个用户在他们工作时可能在某个个人目录中拥有该程序的个人版本。
我的问题是,处理这个问题最安全的方法是什么?我一直在研究 sudoers 文件,基本上有 2 个想法。
1.) 列出程序可以在 sudoers 文件中的所有路径。这是有问题的,因为它需要经常编辑 sudoers 列表,并且仍然存在安全风险,因为非 root 用户将拥有他们自己的 foo 副本,并且可以通过 foo 复制一些系统程序,然后以 root 身份使用它。
2.) 编写一个名为 start_foo 的脚本,它对传递的程序执行一些输入验证,例如大小和名称,然后启动传入的 foo。start_foo 可以存在于 /usr/bin 中并由 root 拥有,但任何人都可以运行。这个选项仍然包括能够用另一个需要 root 的程序覆盖用户 foo 程序的安全漏洞,但希望大小检查能捕获一些恶意案例。
有没有一种“规范”的方法来解决这个我没有发现或想到的问题?如果不是,以上哪一个或可能的其他解决方案是处理问题的最佳方法?
谢谢!
我正在尝试编写Meteor(JS 框架)的非交互式安装脚本和部分脚本提示 sudo 。我似乎无法通过我的脚本技能来克服它。
安装是: curl https://install.meteor.com | /bin/sh
在脚本的稍后点,它会提示输入 Sudo 密码。 我希望这一步失败。然后我可以围绕分辨率编写脚本。
注意:我无法将用户添加到 sudoers 文件,它在不允许我的用户提升访问权限的共享环境中运行。
有没有办法允许非 sudo 用户访问 CentOS 7 中的 KVM QEMU 虚拟机?我想允许非 root 用户在没有 sudo 访问权限的情况下管理 KVM 来宾虚拟机。主要是,我希望用户能够运行 virsh 命令,例如:
virsh list --all
virsh start UUID
Run Code Online (Sandbox Code Playgroud)
我尝试将用户添加到 libvirt 组,但这没有用。我检查了 /etc/polkit-1/rules.d 中的策略套件规则,并且我也遵循了以下说明:
https://goldmann.pl/blog/2012/12/03/con ... t-manager/ https://major.io/2015/04/11/run-virsh-a ... ular-user/
这些都没有奏效。有没有办法做到这一点,如果有,怎么做?
(这里的开发人员 - 系统管理员世界中的相对新手)。
有谁知道可以限制 sudo 用户的文件(无读取、写入或执行访问权限)的方法吗?
关于这种情况的一点背景:我们目前正在寻找一种方法来为某些用户提供 sudo 访问,同时仍然限制对一组文件的访问。除非实现这一点,否则 sudo 访问将不是一个选项,我们将根据用户请求将文件/命令列入白名单(或将它们包装在脚本中)。
正如您所料,白名单选项需要更多的维护和延迟,因为用户要等待系统管理员团队响应请求。
我已经向组中添加了一个新用户wheel。我可以使用此用户和密码 ssh 进入机器并确认它属于该组:
[newuser@xxx.xxx ~]$ groups
newuser wheel
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用 root 权限运行任何东西:
[newuser@xxx.xxx ~]$ sudo ls -lt /root
[sudo] password for newuser:
newuser is not in the sudoers file. This incident will be reported.
Run Code Online (Sandbox Code Playgroud)
并visudo确认组中的用户wheel应具有以下权限:
## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)
所有教程都说将用户添加到该组就足够了。我还需要做什么?
PS:这是一个amazon-linux机器
我最近在我的企业的 vps 上花了很多钱,并且已经开始为我的每个站点设置 ssh 和 cpanel 帐户。
我开始在一个帐户上安装 composer 但需要 root 权限。我的问题是,如果您使用 sudo 作为特权用户,如果您犯了一个严重的错误或所做的更改仅影响该特定用户帐户而不影响 root,您是否可以关闭整个服务器?
在此基础上建立的帐户与 root 完全隔离,或者您是否可以使整个服务器处于潜在风险中(如果您真的很努力的话)?sudo 是否与 root 访问完全相同,但仅在帐户内,您是否只是切换到 root?有什么方法可以限制我可能对用户帐户造成的损害,sudo 是在我的帐户上安装软件包的最佳方式吗?