web-dev-qa-db-ja.com

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

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

168
TaylorOtwell

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

注: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の下で実行されているWebサーバーはファイルを読み取る(提供する)ことができません。ファイルがパブリックにアクセス可能なプレーンHTMLドキュメントである場合、世界中の人がファイルを読み取ることができれば問題にはなりません。ただし、ファイルがパスワードを含むPHPファイルである場合はそうです。

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

www-data

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

可能な場合は、notwww-dataグループに書き込み許可を付与します。 www-dataは、ファイルをreadできる必要があるだけなので、Webサーバーはそれを提供できます。 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を使用し、Webサーバーによる書き込みが必要な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以外のプロジェクトが含まれている可能性があります。 (以前にwww-dataグループにユーザーを追加した場合、Sudoは不要です。)

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

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

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

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

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

こちらもご覧ください

245
Lekensteyn

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

9
fragos

/ 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/ファイルを手間をかけずに編集できるようになります。

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

7
Azendale

これは簡単です。 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:)

5

いけない

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

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

  • www-dataグループのメンバーとして自分を追加して書き込み権限を付与しないでください

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

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

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

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

ドス

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

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

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

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

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

  • group書き込みアクセス権を付与する場合は、new目的のためのグループ

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

5
thomasrutter

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

2
Daniel

ターミナルで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セッションと組み合わせることで、時々間違っていることを止めることはできませんでしたが、もしそれが起こった場合、私は速く、何が間違っているか、そしてめったに起こりません。

注:プロンプトスクリプトの一部は、bashのマンページのコピーです。

1
user unknown