sudo
仕事をするたびに使うのをやめたい/var/www
。どうやってやるの?すべてのサイトをこのディレクトリに配置し、あまり苦労せずに作業したいだけです。
sudo -u www-data
が、sudoers
ファイル内でのみsudo www-data
(sudo rootではなく)できるように制限することです。参照してくださいserverfault.com/questions/295429/...
sudo
仕事をするたびに使うのをやめたい/var/www
。どうやってやるの?すべてのサイトをこのディレクトリに配置し、あまり苦労せずに作業したいだけです。
sudo -u www-data
が、sudoers
ファイル内でのみsudo www-data
(sudo rootではなく)できるように制限することです。参照してくださいserverfault.com/questions/295429/...
回答:
ここでの回答のほとんどは、セキュリティを考慮して書かれたものではありません。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
書き込み権限が必要な唯一のケースは、アップロードが保存されるディレクトリと、書き込みが必要なその他の場所です。
自分自身を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
します)
各プロジェクトのホームディレクトリへのシンボリックリンクを作成します。あなたのプロジェクトがにあり、~/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-data
onに設定し~/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
。
sudo su www-data
か?別のユーザーのシェルであることをより明確にするための異なる色のプロンプトと組み合わせて、対応するxtermを常に適用するポリシー-たとえば-仮想デスクトップ4混乱を避ける?
gedit
。現在のセッションで他のユーザーの下でGUIプログラムを実行することが安全かどうかを調査したことはありません。興味深い質問になります。
setfacl -d u::rwX,g::rX /var/www
は、umaskがゼロであっても、デフォルトモードが0750(または0640)になるという面白い効果があります。誰でも書き込み可能なファイルを避けたい場合は良いアイデアかもしれませんが、/var/www
すでに世界中からアクセスできない場合は必要ありません。
/var/www/app01
所有権app01:app01
があり、www-data
ユーザーがapp01
グループに追加されますか?それとも何かを壊しますか?
/ 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
。
ファイルのアクセス許可を777(world-writable)に設定しないでください
これは、特にPHPなどのサーバー側スクリプトを有効にしている場合、重大なセキュリティ上の欠陥です。特権のないプロセスは、Webサイトに影響を与えるファイルに書き込むことはできません。また、サーバー側のスクリプトを使用している場合は、任意のコードを実行する必要があります。
自分をwww-dataグループのメンバーとして追加して、書き込み許可を与えないでください。
このグループの目的は、サーバープロセスが実行される非特権グループであることです。上記と同じ理由で、可能であればWebサイトファイルへの読み取りアクセス権のみが必要です。
Apacheプロセスの権限を変更しないでください
Apacheの子プロセスはwww-data
デフォルトでユーザーおよびグループとして実行されるため、これを変更しないでください。これは、ファイルシステムへの書き込み許可を与えない方法です。
特定の状況では、サーバー側のスクリプトがファイルに書き込みできるようにする必要があります。その場合、それらのファイルのみを書き込み可能にしwww-data
、セキュリティを確保するために注意する必要があります。
自分が所有するファイルを設定する
Webサイト上の特定のファイルを変更するのが自分だけであるか、通常のユーザーである場合は、それらのファイルの所有権を取得するだけで十分です。所有者をに設定し<your username>
ます。
ファイルが所有されている場合でもサーバーは読み取り専用アクセスを取得し続けるため、サーバーのアクセス許可を変更する必要はありません。
ファイルを格納する適切な場所を選択します(DocumentRootを使用)
/var/www
意味がわからない場合は、他の場所に配置しても構いません。独自の開発またはテストに固有の場合は、ホームディレクトリに配置できます。または、でいくつかのディレクトリを設定できます/srv
。
グループに書き込みアクセスを許可する場合は、目的のために新しいグループを作成します
システムグループを再利用しないでください。これらは通常、セキュリティ上の理由から、現在持っているアクセス権を持つように設計されています。
これは簡単です。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ん。)
/var/www
それ自体ではなく、サブディレクトリの所有権を変更します。
ターミナルで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のマンページのコピーです。