Apacheが実行されているユーザーを確認しますか?


212

ここで美しく説明されているように、サーバー上のファイルアップロードディレクトリを保護したいのですが、これらの指示に従う前に1つの問題があります。Apacheがどのユーザーとして実行されているのかわかりません。

httpd.confを見ると「User」行があるという提案を見つけましたが、httpd.confファイルにはそのような行がないため、Apacheがデフォルトユーザーとして実行されていると思います。しかし、それが何であるかはわかりません。

だから、私の質問は(ある):

  • デフォルトユーザーが何であるかを知るにはどうすればよいですか
  • デフォルトのユーザーを変更する必要がありますか
  • 答えが「はい」で、httpd.confを編集してデフォルトのユーザーを変更した場合、問題が発生する可能性はありますか?

ありがとう!


12
なぜこの質問はダウン投票されたのですか?はい、どこでも回答されているので更新されていますが、反対票を投じる必要はありませんか?それは完全に良い質問ですか?おそらく、私たちの有権者はこれに関して建設的なコメントを追加したいと思うでしょうか?
ブライアン

2
現在、未回答のキューにいるので、その更新を回答として投稿し、受け入れたい場合があります。
ファハドサダ

7
StackOverflowで告知された場合は+1。一部のユーザーは、新しいユーザーをオフに実行しているのしつこいようだ
wruckie

リンクされた質問は、もはや存在していません
pal4life

次の質問:何が、その1 2人のユーザーで行うため、同様rootwww-data。「正しい」Apacheグループに何かにアクセスする許可を与えるにはどうしますか?

回答:


228

ps aux | egrep '(apache|httpd)' 通常、Apacheの実行内容が表示されます。

通常、デフォルトのユーザーを変更する必要はありません。「nobody」または「apache」は通常、素晴らしいユーザーです。「ルート」でない限り;)

編集:Apacheバイナリをキャッチするためのより正確なコマンド


42
そう、またはUbuntuではwww-dataになります。
-gravyface

10
...そしてDebian。:)
cubuspl42 14年

7
このコマンドは、ほとんどのものからのもののリストを表示しますapacheが、1からのものrootもあります。
ユーザー

2
私には3つのプロセス(/usr/sbin/apache2 -k start)がrootあります。1つはユーザーで、残りの2つはユーザーですwww-data。心配する必要がありますか?
zundi

3
@zundi、予約されたポート(80や443など)へのバインドなどを行うために、サービスはルートとして起動します。次に、構成されたプロセス数に関係なく、定義されたユーザーとしてWebサーバーの作業およびその他のタスクを実行します。そのようにして、リクエストは非特権プロセスによって処理されます。親ID(PPID)は、他のすべてのプロセスで同じであることに気付くでしょう。そのアイデアは、ルートとして実行されているその1つのプロセスのPIDになります。
ケビン

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サーバーについてより多くの情報を提供し、包括的な方法で表示する1つのコマンドであるため、良い答えです。
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/envvarsです。 mod_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
ここで注意してください。これは、Apacheユーザーではなく、PHPが実行されるユーザーを示しています。mod_phpを使用する場合、これらは同じですが、現在非常に一般的であるように、他のもの(php_fpmなど)を使用している場合、それらは簡単に異なる場合があります。
benz001 14

5

このコードは、多かれ少なかれ、以下を含むapache(または名前にが含まれるapache)プロセスを実行しているすべての非rootユーザーをアルファベット順にリストします。

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

このリストには、おそらく「grep apache」などのプロセスを実行しているユーザー(あなたの元気なユーザーなど)が含まれます。
mwfearnley

4
  • ユーザーを見つけるps aux | grep apacheには、実行中に使用するだけです。
  • 必要はありませんが、Apacheがrootとして実行されている場合、セキュリティ上の問題があります。
  • 第三に、Apacheのユーザーを変更すると、いくつかのディレクトリにアクセスする権利が変更されます。新しいユーザーとグループが/ var / www(またはWebサイトがある場所)にアクセスできることを確認する必要があります。
  • 私が見たシステムでは、apacheは常にユーザーおよびグループとしてapache:apache(または同様の)を使用してインストールされていたので、おそらく既にそのように設定されているはずです。

注:これはStackoverflowで私が与えたのと同じ答えです。


2

または、Apache構成ファイルを確認して、所有者とグループを探すことができます。


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

1

少なくともDebian / Ubuntuベースのディストリビューション向けの代替アプローチは、Apacheがユーザーとグループを設定するのと同じ方法/etc/apache2/envvars使用することですsource

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

あなたが空想を得たいなら、ファイルが見つからない場合はエラーを抑制し、デフォルト値を提供することができます:

$ apacheuser = $(
     ソース/ fail / etc / apache2 / envvars 2> / dev / null &&
     echo "$ 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が引数としてリッスンするポートを渡します。appacheが実行されているユーザーのUSER列を参照してください。

# 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)

数十万個のファイルハンドルが開いている場合や、非常にビジーなサーバーの場合、lsofは遅くなる可能性があります。
デニス・ノルティ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.