找出Apache以什么用户身份运行?


212

我希望按照此处的详细说明保护服务器上文件上传目录的安全,但是在遵循这些说明之前,我遇到了一个问题。我不知道Apache以什么用户身份运行。

我发现您可以在httpd.conf中查找一条建议,并且会有一个“用户”行,但是在我的httpd.conf文件中没有这样的行,因此我想Apache正在以默认用户身份运行。不过,我不知道那是什么。

因此,我的问题是:

  • 我如何找出默认用户是
  • 我需要更改默认用户吗
  • 如果答案是肯定的,并且我通过编辑httpd.conf更改了默认用户,是否有可能搞砸了?

谢谢!


12
为什么这个问题被否决?是的,由于已在其他地方得到答复,因此已进行了更新,但我认为无需投反对票?这是一个很好的问题?也许我们的否决者会在此添加一个建设性的意见?
布赖恩

2
您可能希望将该更新作为答案发布并接受它,因为您当前处于“未答复”队列中。
Fahad Sadah'4

7
+1:在StackOverflow上被告知;一些用户似乎坚持要
逃避

链接的问题不再存在
pal4life 2014年

下一个问题:做什么,因为它的两个用户,比如一rootwww-data。您如何授予“正确的” Apache组访问权限?

Answers:


228

ps aux | egrep '(apache|httpd)' 通常会显示apache的运行方式。

通常,您不需要更改默认用户,“ nobody”或“ apache”通常是好的用户。只要它不是“根”;)

编辑:更准确的命令来捕获apache二进制文件


42
是的,在Ubuntu上将是www-data。
gravyface

10
...和Debian。:)
cubuspl42 2014年

7
该命令向我显示了一个列表,其中大多数来自apache1,root也有1 。
用户

2
我有3个进程(/usr/sbin/apache2 -k start),一个用户是root,其他两个www-data。我应该担心吗?
zundi

3
@zundi,该服务以root用户身份启动,以进行绑定到保留端口(例如80和443)的操作。然后,它将以已定义的用户身份开始配置的进程数,Web服务器工作以及任何其他任务。这样,请求将由非特权进程处理。您会注意到,所有其他进程的父ID(PPID)都相同。这个想法就是以根用户身份运行的那个进程的PID。
凯文(Kevin)

41

您可以尝试以下命令:

ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'

1
我喜欢这个答案,比最喜欢的答案更好(更通用)。谢谢
pgr

14

使用apachectl -S,它将显示一些Apache用户和组,如下所示:

User: name="_www" id=70
Group: name="_www" id=70

谢谢,在我的Mac上,我看到apache正在以“ _www”运行。
水星

这是一个很好的答案,因为它是一个命令,它可以告诉您更多有关正在运行的Web服务器的信息,并以一种全面的方式展示它。
kontur

9

根据ubuntuforums.org,在Ubuntu上apache2的默认用户是www-data

在Ubuntu 13.10 Saucy上似乎是正确的。


来自上述论坛的LarsNoodén

为了确定[用户]的实际设置,请检查实际的配置文件。伞形文件apache2.conf将具有以下内容,

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

这是对中设置的环境变量的引用/etc/apache2/envvarsmod_suexec还允许脚本以其他用户和组身份运行。

要查找可能使用备用用户和/或组的虚拟主机,请检查配置。

$ egrep "^User|^Group|^SuexecUserGroup" /etc/apache2/apache2.conf /etc/apache2/sites-available/*.conf

对于基于Red Hat的发行版,它将是(通常,其运行httpd的用户是apache):

$ egrep "^User|^Group|^SuexecUserGroup" /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

8

我知道这是一篇旧文章,但仍被列为未答复,因此我将提出建议。如果找不到运行Apache的用户或组,请尝试打开httpd.conf文件。那里应该有“用户”和“组”的条目。您不仅可以看到应该以哪个用户身份运行Apache,而且可以根据需要更改它。


7

您可以在PHP脚本中包含以下代码行:

echo exec('whoami');

8
请注意,这里显示的是运行PHP的用户,而不是Apache用户。如果使用mod_php,则它们是相同的,但是(如现在很常见)如果您使用的是其他内容(例如php_fpm),则它们很容易会有所不同。
2014年

5

此代码将或多或少按字母顺序列出运行包含apache(或名称包含apache)的进程的所有非root用户

ps aux | grep -v root | grep apache | cut -d\  -f1 | sort | uniq

该列表可能包括正在运行“ grep apache”之类的进程的用户,例如您自己。
mwfearnley'7

4
  • 要找出用户,您只需ps aux | grep apache在其运行时使用即可。
  • 您不需要,但是如果Apache以root身份运行,则存在安全问题。
  • 第三,更改Apache用户将更改其访问某些目录的权限。您需要确保新用户和组可以访问/ var / www(或您拥有网站的任何地方)。
  • 在我查看过的系统上,总是使用apache:apache(或类似名称)作为用户和组来安装apache,因此应该已经这样设置了。

注意:这是我在Stackoverflow上给出的相同答案。



2

正如Noyo 在这里建议的那样:

APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if ($1) print $1}')

接着:

echo $APACHE_USER

1
获取用户(ubuntu命令行):echo $ APACHE_USER
Jadeye 2014年

1

至少对于基于Debian / Ubuntu的发行版,一种替代方法是使用Apache设置用户和组的相同方法:source/etc/apache2/envvars

$ echo "$(source /etc/apache2/envvars && echo "$APACHE_RUN_GROUP")"
www-data

如果想花哨的话,可以在找不到文件的情况下抑制错误,并提供默认值:

$ apacheuser = $(
     源/ fail / etc / apache2 / envvars 2> / dev / null &&
     回声“ $ APACHE_RUN_GROUP” ||
     没有人回声  
)
$ echo“ $ apacheuser”
没有人

1

我发现这里提供的大多数解决方案都是特定于系统或配置的(特别是,大多数解决方案根本无法在MacOS上使用),还有一些依赖于用户才知道Apache的配置文件在哪里。 。

所以我作弊了一下,让Apache自己告诉我什么。

简单的命令apachectl -S将告诉您有关正在运行的Apache实例的知识,并且可以很容易地解析其结果。这是我的解决方案,在一些bash脚本的顶部使用它来确定在任何给定时间我可能需要的各种东西。

# Store the results so we don't have to keep calling apachetl...
astatus=`apachectl -S`

# Now grab whatever you want from the result... 
HTTPD_ROOT_DIR=$(expr "`echo "$astatus" | grep ServerRoot`" : ".*\"\(.*\)\".*")
HTTPD_DOC_DIR=$(expr "`echo "$astatus" | grep \"Main DocumentRoot\" `" : ".*\"\(.*\)\".*")
HTTPD_USER=$(expr "`echo "$astatus" | grep \"User:.*name=\" `" : ".*\"\(.*\)\".*")
HTTPD_GROUP=$(expr "`echo "$astatus" | grep \"Group:.*name=\" `" : ".*\"\(.*\)\".*")

这些值可以这样使用:

echo $HTTPD_ROOT_DIR // /etc/httpd
echo $HTTPD_DOC_DIR  // /var/www
echo $HTTPD_USER     // www-data
echo $HTTPD_GROUP    // www-data


0

使用lsof并传递apache作为参数进行监听。请参阅“用户”列,以了解用户设备的运行方式。

# lsof -i :80
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd     21058   root    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
httpd     21111 www-data    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
httpd     24915 www-data    4u  IPv6  74730      0t0  TCP *:http (LISTEN)

当您有几个100k打开的文件句柄和/或非常繁忙的服务器时,lsof可能会很慢。
丹尼斯·诺尔特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.