Linux の権限設定と WordPress との関係【Webサーバー】

Linux

Linux の権限設定について、主なコマンドや確認手順をまとめておきます。
加えて、一例として、WordPress での権限設定がどのようになっているのか、確認しておきます。

以下の環境を想定しています。
環境:
・ VPS(ConoHa VPS、Web サーバー)
・ LAMP(Linux/CentOS 系、Apache、MySQL、PHP)
・ WordPress 5 以降(個人サイトを運用)
・ ログイン手段: SSH 接続(一般ユーザーとしてログイン、TeraTerm)

背景 ~ WordPress の権限設定はどうなっているのか?

Linux でサーバーをしばらく運用していると、ユーザーやグループ、パーミッションに関するコマンドや設定を忘れてしまうことがあります。
また、Web サーバー上で、WordPress などのサイトを運用して数年が経つと、インストール時にどのように権限を設定したのか、現在どう動いているのか、曖昧になりがちです。

一方で、サイトを数年運用していると、理解がだいぶ深まった、今なら理解できる、といった側面もあります。

ということで、Linux の権限設定に関するコマンドや動作についてまとめておきます。
加えて、WordPress を例に、どのように権限が設定されているのか、どう動くのかという観点でポイントをまとめ、公開しておくことにします。
以下のコマンドを順次実行してみると、権限設定という観点から、Webサーバー(Apache/Nginx や WordPress)がどのように動いているのか理解ができるかと思います。

まずは、ログイン直後の Linux の状態

サーバーへのログイン、および、ログイン直後の状態の確認

まず、Web サーバーに TeraTerm などで SSH 接続し、ログインします。
以下、SSH 接続を前提とし、ログインユーザーは一般ユーザー、ログイン時のユーザー名を [user1]、ログイン時のグループ名を [group1] と書くことにします。

まず、”ls -al” を実行し、ログイン時のディレクトリ内で、ファイルを確認しておきます。
多くの場合、以下のような表示になっていると思います。★1
なお、以下の表示で、コンソール画面でのコマンドの部分を $ … と書くことにします。加えて、わかりやすさのため、コマンド実行後の応答の概要を、コマンドの行に続けて記載することにします。

$ ls -al 

drwx------  4 [user1] [group1]  4096 ...  .
drwxr-xr-x. 4 root      root         4096 ...  ..
-rwx-rw-r--  4 [user1] [group1] 4096 ...  abc1.txt

※ ワーキングディレクトリ(working directory、カレントディレクトリ)内にあるディレクトリとファイルについて、パーミッションの設定ファイルの所有者(owner)グループ(group)、…、ディレクトリ名またはファイル名、…、が表示されます。
※ abc1.txt は、ファイルの表示例です。
※ owner と group は、ファイル/ディレクトリの所有者(または作成者)は誰か、ファイル/ディレクトリへのアクセスが許されているのはどのグループか、と解釈すればよいと思います。
※ 多くの場合(設定を意図的に変えていない場合)、所有者 [owner] とグループ [group] は、同じになっていると思います。
(root root のように並んでいるか、[user1] [user1] のような見かけになっている。)

ログインユーザーの確認

つぎに、以下を入力し、ログインしているユーザー(自分自身を含む)を確認します。★2

$ who
[user1]  pts/0  2022-10-23 14:00 (xxx.xxx.xxx.xxx) 

$ w
USER  TTY   FROM                 LOGIN@ IDLE ... 
[user1] pts/0  xxx.xxx.xxx.xxx   14:00     ... 

※ 自分のユーザー名 [user1] がリストにあることがわかります。
※ 類似のコマンドとして “w” があるので、参考として実行しておきます。

ログイン直後のディレクトリの確認

つぎに、以下を入力し、ログイン直後のディレクトリがどうなっているのか、確認します。★3

$ pwd 

/home/[user1] 

※ pwd = print working directory の略、とのことです。(私は、pwd が password に読めてしまって仕方がないですが。。)
※ 一般ユーザーとしてログインすると、/home/ 以下のディレクトリがログイン直後のワーキングディレクトリ(カレントディレクトリ)となることがわかります。

以下で、/home 以下を確認しておきます。

$  ls -al /home 

... 
drwx------ 4 [user1] [user1] 4096 Oct 20 13:05 [user1] 
... 

※ /home 以下で設定されている、すべての一般ユーザーのディレクトリを確認できます。
※ 一般ユーザー [user1] のディレクトリが /home ディレクトリ内に作成されており、この中にユーザーのデータが入っていることがわかります。
※ また、ディレクトリ [user1] のパーミッションが、”d  rwx  – – –  – – – … [user1] [user1] ” の形になっています。
したがって、上記のディレクトリ内にある [user1] は、d (directory)であって、所有者は [user1] 、グループは [user1] に設定されています。
この所有者 [user1]だけに rwx (read, write, execute 読み書き実行) の権限が与えられている、グループgroup と他のユーザー other には何らの権限も与えられていない、ということがわかります。
※ なお、Raspberry Pi (Raspbian、Debian 系の Linux)でユーザーを意図的に変更していない場合、ターミナル起動直後のディレクトリは、/home/pi などとなると思います。CentOS 系と Debian 系の違いはあるものの、/home 以下にユーザーに対応したフォルダが作られてワーキングディレクトリとなるという点で、同等の動きになっていることが理解できます。

Linux に設定されているすべてのユーザー、グループを確認する

すべてのユーザーの確認

上記のコマンドで、ユーザーやグループが出てきました。そこで、Linux 内で定義されているすべてのユーザーとグループを確認してみます。
まず、以下のコマンドを入力し、すべてのユーザーを表示させてみます。★2

$ cat /etc/passwd

※ ユーザーの一覧が出てくると思います。
※ 各ユーザーのパスワード部分は “x” で非表示になっています。
※ 自分のユーザー名[user1]、root (スーパーユーザー)など、よく出てくるユーザーを確認しておきます。

※ 加えて、ユーザーには、apache や nginx が入っていることがわかります。
WordPress や Web サービスなどで、Web サーバーを常時稼働させているのであれば、apache か nginx あたりを動かしていると思います。これらがユーザーとして定義されています。
※ ユーザーについては、このリストで尽きていることになります。
いいかえると、第三者がウェブサイトにアクセスする場合、その第三者のユーザー名が登録されているわけではないことになります。
Web サーバーのアプリが apache であれば、アクセスしてきた第三者は、apache のユーザー名で、ファイル等を読み取り/書き込み/実行する、ということになります。
したがって、仮にパーミッションを 777 (誰でも改変・実行可)としたファイルがサーバー内にあったとし、もし Web サーバーなどのプログラムに脆弱性があると、第三者が apache のユーザー権限で入り込み、改ざんや実行をしうる、ということになります。(したがって、パーミッションの設定では 777 を避ける。)
※ また、root、自分 [user1]、apache など、よく出てくるユーザーについて、数値(ID)をざっと確認しておきます。password “x” の右隣に出ていると思います。Linux の内部では ID として扱われているという理解でよいかと思います。

すべてのグループの確認

続いて、登録されているすべてのグループについても、表示させてみます。★3

$ cat /etc/group 

※ すべてのグループ一覧が表示されると思います。
※ root、自分のグループ名 [user1]、apache、など、よく出てくるグループ名を確認しておきます。
※ 特に設定を変えていない場合は、ユーザー名(owner)と同じ名称で、グループ名が登録されていると思います。
※ root が 0 番、apache が 46 番など、数値(ID)についても、ざっと確認しておきます。

各ユーザーのグループの確認

上記で、すべてのユーザーとすべてのグループを表示し、確認しました。
つぎに、各ユーザーがどのグループに属しているか、紐づけを個別に確認してみます。以下の各コマンドを入力してみます。★4

$ groups root 
root : root 
 
$ groups [user1] 
[user1] : [user1] 
 
$ groups apache 
apache : apache 

※ 各ユーザーが属しているグループを確認できます。
“:” の後に、属しているグループが表示されると思います。なお、”groups” のみを入力すると、ログインしているユーザー [user1] のグループ名が表示されます。

ID の確認

つぎに、ID についても確認しておきます。以下の各コマンドを順次入力してみます。★5

$ id root 
uid=0(root) gid=0(root) groups=0(root) 
 
$ id [user1] 
uid=1000([user1]) gid=1000([user1]) groups=1000([user1]) 
 
$ id apache 
uid=48(apache) gid=48(apache) groups=48(apache) 

※ 各ユーザーの ID を確認できます。
※ スーパーユーザー(root)の場合、”uid=0(root) gid=0(root) groups=0(root)” などとなっていると思います。
※ 各ユーザーの ID (uid, user id) が、★2で表示された ID と対応していることがわかります。
※ 加えて、各ユーザーが属しているグループの ID (gid, group id) についても、★3で表示された ID と対応していることがわかります。

以上で、すべてのユーザーとグループについて確認しました。

WordPress の設定の確認

つぎに、一例として、WordPress の場合、どのようにユーザーやグループ、パーミッションが設定されているのか、確認してみます。

以下、WordPress が /var/www/html 以下にインストール・設定されていると仮定して説明します。
Apache の設定時や、WordPress のインストール時にディレクトリを変えた場合は、そのディレクトリ(WordPress が入っているディレクトリ)に読み替えてください。

WordPress のファイル構成とパーミッション設定の確認

まず、以下を順次、実行してみます。

$ ls -al /var/www
$ ls -al /var/www/html 
$ ls -al /var/www/html/wp-content 
$ ls -al /var/www/html/wp-content/uploads/
$ ls -al /var/www/html/wp-content/uploads/2022/08 

※ 最後の1,2行は、前の行で、存在が確認できているディレクトリに対して実行してみてください。
※ とくに、以下の WordPress の主要なファイルについて、ファイルがどこにあるのか、所有者(owner)、グループ(group)がどうなっているのか、確認してみてください。
・ index.php (WordPress のメインとなるプログラム)
・ wp-config.php (WordPress の設定用のプログラム)
・ .htaccess (各フォルダでのアクセス設定)

※ また、上記の3つのファイルについて、パーミッションがどうなっているか、についても確認をしてみてください。
※ WordPress のフォルダ内のファイルの多くは、所有者 owner とグループ group が、”apache apache” となっていると思います。また、まれに、”root root” となっているファイルもあるかと思います。
Web サーバーとして apache を動かしているのであれば、参照、書き換え、実行を行うのは、apache になるはずです。したがって、大半の各ファイルについて、所有者、グループは、”apache apache” となっていると思います。
また、WordPress のインストール時、root 権限でログインして設定していることが通常だと思います。すると、インストール時に作成したファイルや、バックアップを取ったファイルは、”root root” になっていると思います。
※ ここで、もし、WordPress がユーザー名 apache で動作しようとする際、参照すべきファイルの所有者やグループが “apache apache” ではなく、”root root” や、一般ユーザーになっていたとします。すると、WordPress は参照や書き換えに失敗し、WordPress が正常に動作しなくなる可能性がある、と理解できます。
※ また、WordPress に記事を追加する際は、通常、ログインページから編集を行ないます。すると、所有者は、apache として記事の追加を行うことになります。
したがって、一例として、上記の “/wp-content/uploads/” 以下のディレクトリの内容を確認すると、ファイルの作成者 (owner) とグループ(group) の設定が、”apache apache” になっていると思います。
※ WordPress で記事を追加する際、画像データや HTML ファイルなどをアップロードすることも可能です。これらのファイルは、”apache apache” の所有者、グループとして、”uploads” ディレクトリ内に、そのままアップロードされていることが確認できます。
※ 上記のアップロードしたファイルのパーミッションを確認すると、”- r w –  r – –  r – – 1 apache apache …. xxx.png/gif/html” などとなっています。
すると、ログインをしている一般ユーザー [user1] などに対しては、読み取りのみの権限(r)しか与えられておらず、書き換えなどはできないことになります。
※ したがって、もし、WordPress に貼りつけた HTML ファイルなど(upload したファイル)を、一般ユーザーが書き換えられるようにしたい場合は、いったん root 権限でログインし、WordPress にアップロードしたこれらのファイルに対し、編集権限(r w -)を other(一般ユーザー [user1] を含む)に与えればよいことになります。
あるいは、すべてのユーザーに編集権限を設定すると改ざんされるリスクが生じます。これを避けたいのであれば、ファイルの所有者を apache から user1 に変更し、所有者のみ編集できるようにし、read 権限だけ(r – -)を other (apache を含む)に与えればよい、ことになります。
応用例としては、たとえば、一般ユーザー権限で、crontab で Python のスクリプトを実行するようにし、記事に張りつけた HTML (たとえばカレンダーなど)を定期的に自動更新するなどが考えられます。(動作確認はしていませんが。。)

パーミッション設定が機能していることの確認

つぎに、パーミッション設定が機能していることを確認してみます。
一例として、一般ユーザー [user1] としてログインしている場合、WordPress のプログラム “index.php” などを参照できるかどうか、確認してみます。

$ ls -al /var/www/html 
... 
-rw-r--r-- 1 apache apache ... index.php 
... 

$ cat /var/www/html/index.php 
... 

※ cat コマンド(ファイルの内容を参照)を実行したところで、index.php のファイルの内容が表示されると思います。
※ index.php のパーミッションは、”- r w –  r – –  r – – ” となっており、一般ユーザーに対しては、末尾の “r – – ” (読み取り)の権限が与えられています。
したがって、一般ユーザー [user1] でログインした場合、cat コマンドを使って index.php の内容を読み取って、表示することが可能(編集はできない)ということになります。

※ 一方、上記で確認した wp-config.php などのファイルは、セキュリティを高くするため、パーミッション設定の末尾が “- – – ” になっていることが通常だと思います。
このファイルに対し、同様に “cat … /wp-config.php” を実行してみます。すると、”Permission denied” と表示されると思います。もしも、一般ユーザー権限で誰もが参照できてしまう場合は、パーミッション設定を厳しくしたほうがよいのではないか、検討したほうがよい、ということになります。

以上の確認を、他のファイル等に対しても行っていくことで、所有者、グループの設定は適切か、パーミッション設定が機能しているか、などを確認していくことが可能です。

まとめ

Linux で、所有者やグループがどのようになっているかを確認するコマンドや動作についてまとめました。
加えて、Web サーバーで WordPress を稼働させているとき、所有者やグループ、パーミッションの設定がどのようになっているのか、どう動くのかについてまとめました。

サイトを動かし始めて数年になりますが、WordPress をインストールして以来、権限設定の部分について記憶が曖昧になっていました。ベーシックな部分かなと思いますが、Web サーバーも含め、こうした部分について、確認手順や解説を明確に記載したサイトが見つからないようです。そこで、あらためて確認を行ってみました。

他にも Web サーバーを運用する際のコマンドなどについて、以下の関連リンクなどでまとめています。もし関心があるようでしたら、参照してみてください。

関連リンク
・ アパッチ Apache とは何か
・ パーミッション関連でよく使うコマンド 【Linux】
・ サーバー管理のルーチン作業のまとめ 【ConoHa VPS】
・ エラーコードのまとめ 【Webサーバー】
・ .htaccess の動きがおかしいとき 【WordPress】
・ アップグレード後に 500 エラーが出たとき 【Linux】
・ 「投稿名」でパーマリンク設定をする際の httpd.conf のチェックポイント 【WordPress】

外部リンク
・ [PR] GMOインターネットグループ ConoHa VPS
・ WordPress のホームページ: ファイルパーミッションの変更

タイトルとURLをコピーしました