/ var / wwwで作業するときにsudoを使用しないようにする方法


173

sudo仕事をするたびに使うのをやめたい/var/www。どうやってやるの?すべてのサイトをこのディレクトリに配置し、あまり苦労せずに作業したいだけです。


3
Apacheを使用していますか?
リンツウィンド

1
ここで読んだ後、これも許可部に助けることができる:askubuntu.com/questions/20105/...
ルイス・アルバラード

2
安全性を確保する別の方法は、引き続き使用しますsudo -u www-dataが、sudoersファイル内でのみsudo www-data(sudo rootではなく)できるように制限することです。参照してくださいserverfault.com/questions/295429/...
サイモン・ウッドサイド

回答:


250

ここでの回答のほとんどは、セキュリティを考慮して書かれたものではありません。sudo毎回走ることはあまり賢くないと感じるのは良いことです。タイプミス(たとえば、間違った場所にある単一の空白:sudo rm -rf / var/www/dir 実行しないでください)を行うと、システムが破壊される可能性があります。

注: Apache 2.4.7 / Ubuntu 14.04以降、この回答のコマンドを適宜調整するように/var/www移動されました/var/www/html

見る:

悪いアイデア:

  • chmod 777(sagarchalise)-これにより、システムにアクセスできるすべてのユーザーがディレクトリとファイルに書き込み、侵入者がwww-dataユーザーの下で任意のコードを実行できるようになります。
  • chgrp -R www-data $HOME(cob)-これによりwww-data、ホームディレクトリ内のファイルの読み取りまたは書き込みが可能になります。これは、最小特権ルールを考慮していない
  • chown -R $USER:$USER /var/www(kv1dr)-の読み取り権限が世界にない限り、/var/www下で実行されているウェブサーバーwww-dataはファイルの読み取り(提供)ができません。ファイルがパブリックにアクセス可能なプレーンHTMLドキュメントである場合、世界中の人がファイルを読むことができれば問題にはなりません。ただし、ファイルがパスワードを含むPHPファイルである場合はそうです。

:以下のソリューションでは、www-data書き込み権限を付与しています。ただし、/usr/share/doc/base-passwd/users-and-groups.txt.gz状態:

www-data

一部のWebサーバーはwww-dataとして実行されます。このユーザーがWebコンテンツを所有しないでください。所有していると、侵害されたWebサーバーがWebサイトを書き換えることができます。Webサーバーによって書き込まれたデータは、www-dataが所有します。

可能な場合は、グループに書き込み権限を付与しないでくださいwww-data。Webサーバーがファイルを提供www-dataできるように、ファイルを読み取ることができる必要があるだけです。www-data書き込み権限が必要な唯一のケースは、アップロードが保存されるディレクトリと、書き込みが必要なその他の場所です。

解決策1

自分自身をwww-dataグループに追加し、/var/wwwディレクトリにsetgidビットを設定して、新しく作成されたすべてのファイルもこのグループを継承するようにします。

sudo gpasswd -a "$USER" www-data

以前に作成したファイルを修正します(あなたがの唯一のユーザーであると仮定します/var/www):

sudo chown -R "$USER":www-data /var/www
find /var/www -type f -exec chmod 0660 {} \;
sudo find /var/www -type d -exec chmod 2770 {} \;

(さらに安全:ウェブサーバーで書き込み可能である必要がある、640または2750手動で使用chmod g+w file-or-dirします)

解決策2

各プロジェクトのホームディレクトリへのシンボリックリンクを作成します。あなたのプロジェクトがにあり、~/projects/fooそれをに配置したい場合/var/www/foo、次を実行します:

sudo ln -sT ~/projects/foo /var/www/foo

other(セキュリティ上の理由から)ホームディレクトリに実行ビット(降順)が設定されていない場合、そのグループをに変更しますwww-data、実行ビットのみを設定します(読み取り/書き込み不可)。この~/projectsフォルダには、www以外のプロジェクトが含まれている可能性があるため、同じことを行います。(sudo以前にユーザーをwww-dataグループに追加したことがある場合は必要ありません。)

sudo chgrp www-data ~ ~/projects
chmod 710 ~ ~/projects

グループをwww-dataonに設定し~/projects/foo、ウェブサーバーがファイルとファイル+ディレクトリの読み取りと書き込みを行い、ディレクトリに降りることを許可します。

sudo chgrp www-data ~/projects/foo
find ~/projects/foo -type f -exec chmod 660 {} \;
find ~/projects/foo -type d -exec chmod 2770 {} \;

さらに安全:デフォルトで640および2750を使用し、ウェブサーバーユーザーが書き込み可能にする必要があるファイルとディレクトリを手動でchmodします。setgidビットは、新しく作成されたすべてのファイルに~/projects/fooグループがアクセスできるようにする場合にのみ追加する必要があります。

これから、でサイトにアクセスし、でhttp://localhost/fooプロジェクトファイルを編集できます~/projects/foo

こちらもご覧ください


ターミナルでのwwwセッションについてどう思いますsudo su www-dataか?別のユーザーのシェルであることをより明確にするための異なる色のプロンプトと組み合わせて、対応するxtermを常に適用するポリシー-たとえば-仮想デスクトップ4混乱を避ける?
ユーザー不明

@user unknown:ユーザーアカウントを明確に分離しているので、ターミナルですべてをうまく行うと。しかし、のようなGUIプログラムを使用する場合は機能しませんgedit。現在のセッションで他のユーザーの下でGUIプログラムを実行することが安全かどうかを調査したことはありません。興味深い質問になります。
-Lekensteyn

1
@imaginaryRobots:質問ごとに異なるソリューションを投稿する場合、Askbuntuは3行の回答でいっぱいになります。分割するように説得できない限り、そのままにしておきます。
レーケンシュタイン

1
@berbtにsetfacl -d u::rwX,g::rX /var/wwwは、umaskがゼロであっても、デフォルトモードが0750(または0640)になるという面白い効果があります。誰でも書き込み可能なファイルを避けたい場合は良いアイデアかもしれませんが、/var/wwwすでに世界中からアクセスできない場合は必要ありません。
Lekensteyn

1
ソリューション1のプロセスを逆にすることに問題はありますか?つまり、/var/www/app01所有権app01:app01があり、www-data ユーザーapp01 グループに追加されますか?それとも何かを壊しますか?
Jack_Hu

9

Webサイトを/ var / wwwに保存するのではなく、ホームフォルダーにあるサイトへのリンクを配置します。自分のサイトにページを自由に編集または追加できます。変更に満足したら、ドメイン名がリンクしているホスティング会社にFTPで転送します。


これは賢明なアイデアです。
トーマスルッター

7

/ var / wwwをグループで書き込み可能にし、グループに自分自身を追加すると、かなり安全でありながらsudoを使用する必要がなくなります。これを試して:

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rw /var/www

そうすれば、/var/www/手間をかけずにファイルを編集できるはずです。

1行www-data目はグループに追加し、2行目は所有権が乱れたファイルを消去し、3行目はwww-dataグループのメンバーであるすべてのユーザーがですべてのファイルを読み書きできるようにします/var/www


4
これはセキュリティにとって非常に悪い考えであり、他の回答で説明されている理由により、このアドバイスに従うべきではありません。www-dataは、書き込みアクセスのない非特権グループであると想定されています。
トーマスラッター

5

いけない

  • ファイルのアクセス許可を777(world-writable)に設定しないでください

    これは、特にPHPなどのサーバー側スクリプトを有効にしている場合、重大なセキュリティ上の欠陥です。特権のないプロセスは、Webサイトに影響を与えるファイルに書き込むことはできません。また、サーバー側のスクリプトを使用している場合は、任意のコードを実行する必要があります。

  • 自分をwww-dataグループのメンバーとして追加して、書き込み許可を与えないでください。

    このグループの目的は、サーバープロセスが実行される非特権グループであることです。上記と同じ理由で、可能であればWebサイトファイルへの読み取りアクセス権のみが必要です。

  • Apacheプロセスの権限を変更しないでください

    Apacheの子プロセスはwww-dataデフォルトでユーザーおよびグループとして実行されるため、これを変更しないでください。これは、ファイルシステムへの書き込み許可を与えない方法です。

    特定の状況では、サーバー側のスクリプトがファイルに書き込みできるようにする必要があります。その場合それらのファイルのみを書き込み可能にしwww-data、セキュリティを確保するために注意する必要があります。

ドス

  • 自分が所有するファイルを設定する

    Webサイト上の特定のファイルを変更するのが自分だけであるか、通常のユーザーである場合は、それらのファイルの所有権を取得するだけで十分です。所有者をに設定し<your username>ます。

    ファイルが所有されている場合でもサーバーは読み取り専用アクセスを取得し続けるため、サーバーのアクセス許可を変更する必要はありません。

  • ファイルを格納する適切な場所を選択します(DocumentRootを使用)

    /var/www意味がわからない場合は、他の場所に配置しても構いません。独自の開発またはテストに固有の場合は、ホームディレクトリに配置できます。または、でいくつかのディレクトリを設定できます/srv

  • グループに書き込みアクセスを許可する場合は、目的のために新しいグループを作成します

    システムグループを再利用しないでください。これらは通常、セキュリティ上の理由から、現在持っているアクセス権を持つように設計されています。


5

これは簡単です。Apache 'UserDir'(非推奨)を有効にする必要も、 'www-data'グループ(Fedoraの場合はApacheグループ)を台無しにする必要もない

内部にプロジェクトディレクトリを作成するだけです /var/www/html

cd /var/www/html
sudo mkdir my_project

次に、プロジェクトディレクトリをユーザーに登録します。

sudo chown your_username my_project

これで、任意のエディター、IDEを使用して、通常のユーザーとしてプロジェクトフォルダーで作業を開始できます。これ以上sudosん。)


1
+1それが私がしていることです。/var/wwwそれ自体ではなく、サブディレクトリの所有権を変更します。
fkraiem

2

wwwの/ varのchmodで所有者のアクセスを許可し、chownで所有者であることを確認します。おそらく愚かなアイデアですが、それは間違いなく動作します。


2
馬鹿げたアイデアではなく、セキュリティに関して賢明なアイデアです。注意:あなたがする必要はありません(とはならない)のパーミッションを変更/varだけで、/var/wwwおよび/またはその内容。
トーマスルーター

1

ターミナルでwww-sessionを開始するには

sudo su www-data

別のユーザーのシェルであることをより明確にするために、異なる色のプロンプト*と組み合わせて、対応するxterm(およびエディターなど)を常に仮想デスクトップ4に置くポリシーがありますので、混乱を避けるために、あなたはそれに慣れます。

*)異なる文字の異なる色のプロンプトの場合、次のようなファイル/ etc / promptを作成します。

# PROMPTING
#       When  executing  interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the sec-
#       ondary prompt PS2 when it needs more input to complete a command.  Bash allows these prompt strings to be  customized
#       by inserting a number of backslash-escaped special characters that are decoded as follows:
#              \a     an ASCII bell character (07)
#              \d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
#              \D{format}
#                     the  format is passed to strftime(3) and the result is inserted into the prompt string; an empty format
#                     results in a locale-specific time representation.  The braces are required
#              \e     an ASCII escape character (033)
#              \h     the hostname up to the first `.'
#              \H     the hostname
#              \j     the number of jobs currently managed by the shell
#              \l     the basename of the shell's terminal device name
#              \n     newline
#              \r     carriage return
#              \s     the name of the shell, the basename of $0 (the portion following the final slash)
#              \t     the current time in 24-hour HH:MM:SS format
#              \T     the current time in 12-hour HH:MM:SS format
#              \@     the current time in 12-hour am/pm format
#              \A     the current time in 24-hour HH:MM format
#              \u     the username of the current user
#              \v     the version of bash (e.g., 2.00)
#              \V     the release of bash, version + patchelvel (e.g., 2.00.0)
#              \w     the current working directory
#              \W     the basename of the current working directory
#              \!     the history number of this command
#              \#     the command number of this command
#              \$     if the effective UID is 0, a #, otherwise a $
#              \nnn   the character corresponding to the octal number nnn
#              \\     a backslash
#              \[     begin a sequence of non-printing characters, which could be used to embed a terminal  control  sequence
#                     into the prompt
#              \]     end a sequence of non-printing characters
#
#       The  command  number and the history number are usually different: the history number of a command is its position in
#       the history list, which may include commands restored from the history file (see HISTORY below),  while  the  command
#       number  is  the  position in the sequence of commands executed during the current shell session.  After the string is
#
# colors:
# \[...\]   wird benötigt, damit die shell weiß, daß hier kein printable output ist, und die Umbrüche richtig plaziert.
#
# ANSI COLORS
CRE="\[
[K\]"
NORMAL="\[[0;39m\]"
# RED: Failure or error message
RED="\[[1;31m\]"
# GREEN: Success message
GREEN="\[[1;32m\]"
# YELLOW: Descriptions
YELLOW="\[[1;33m\]"
# BLUE: System messages
BLUE="\[[1;34m\]"
# MAGENTA: Found devices or drivers
MAGENTA="\[[1;35m\]"
# CYAN: Questions
CYAN="\[[1;36m\]"
# BOLD WHITE: Hint
WHITE="\[[1;37m\]"
#
# default:
# postgres, oracle, www-data
#
# PS1=$BLUE"machine]->"$NORMAL\\w"$BLUE ø $NORMAL"
PS1=$BLUE"machine]:"$NORMAL\\w"$BLUE > $NORMAL"
#
# root, stefan:
#
case "$UID" in
    '0')
        PS1=$RED"machine:"$NORMAL\\w"$RED # $NORMAL"
    ;;
    '1000')
    PS1=$GREEN"machine:"$BLUE\\w$YELLOW" > "$NORMAL
    ;;
#    default)
#    ;;
esac

そして/etc/bash.bashrc、例えばそれをソースします。

区別を支援する追加ツールとして、エイリアス(edit)またはシンボリックリンクを使用してファイルを常に編集できます。これは、アイデンティティ(taylor / www-data)に応じて、geditまたはmousepad、vimまたはpicoを指します。または、少なくともgeditでは、たとえば、白地に黒のテキストまたは黒地に白のテキストを設定できます。

私はrootとして働くためのそのようなポリシーしか持っていないので、www-dataでの作業にどれだけうまく適合するかはわかりません。独自のプロンプトを持つ異なるホストへのsshセッションと組み合わせることで、時々間違っていることを止めることはできませんでした。

注:prompt-scriptの一部は、bashのマンページのコピーです。


これは機能し、(慎重に使用した場合)セキュリティに悪影響を与えませんが、最も簡単なソリューションではない場合があります。ただし、一部の人にとっては有効なソリューションです。
トーマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.