Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合

Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合は、SELinuxが有効になっていて制限がかかっていることが考えられます。

[参考記事] SELinuxを無効にする方法
[参考記事] SELinuxのpermissiveとdisableの違い

chconの使用方法
所有権やパーミッションの確認
所有権の変更
パーミッションの変更
Apacheの実行ユーザー・グループの設定
Apacheの設定ファイル一覧
Apacheの設定値一覧

SELinuxが有効になっているかを確認するには、getenforce コマンドです。

$ getenforce
Enforcing

有効になっている場合は Enforcing、無効になっている場合は PermissiveまたはDisabled です。

Enforcingと返されていたら、SELinuxを無効にするとPermissions deniedが解消されます。
[参考記事] SELinuxを無効にする方法

ただこれではセキュリティレベルを下げてしまうことになります。

SELinuxを有効にした状態で、Apacheによる書き込み権限を付与するには chconコマンドでhttpd_sys_rw_content_tを付与します。

# chcon -R -t httpd_sys_rw_content_t /var/www/tmp
または
# chcon -R --type=httpd_sys_rw_content_t /var/www/tmp

これ以外にSELinuxはApacheのネットワーク接続の動作を制限しています。

現在の設定を確認するには

# getsebool httpd_can_network_connect
httpd_can_network_connect --> off

ネットワーク接続を可能(ON)にするには

# setsebool -P httpd_can_network_connect on

chconの使用方法

$ chcon --help
使用法: chcon [OPTION]... CONTEXT FILE...
または:  chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
または:  chcon [OPTION]... --reference=RFILE FILE...
各 FILE の SELinux セキュリティコンテキストを CONTEXT に変更します。
--reference がある場合、各 FILE のセキュリティコンテキストを RFILE のものに
変更します。

Mandatory arguments to long options are mandatory for short options too.
      --dereference      シンボリック自体の代わりに、シンボリックリンクを辿っ
                         た先に適用する (この動作が既定)、
  -h, --no-dereference   参照先のファイルの代わりにシンボリックリンクに適用する
  -u, --user=USER        set user USER in the target security context
  -r, --role=ROLE        set role ROLE in the target security context
  -t, --type=TYPE        set type TYPE in the target security context
  -l, --range=RANGE      set range RANGE in the target security context
      --no-preserve-root  '/' を特別扱いしない (既定)
      --preserve-root     '/' に対する再帰的な操作を失敗させる
      --reference=RFILE  CONTEXT 値を指定するのに代わって RFILE の
                         セキュリティコンテキストを使用する
  -R, --recursive        ファイルとディレクトリを再帰的に操作する
  -v, --verbose          各ファイルを処理した時の診断を出力する

以下のオプションは -R オプションと併せて指定されたときにどのように階層を
横断するかの動作を変更します。2個以上指定されたときは最後のオプションの
み有効になります。

  -H                     コマンドライン引数がディレクトリに対するシンボ
                         リックリンクの場合に、リンクを辿る
  -L                     ディレクトリに対するシンボリックリンクに遭遇し
                         た時には全て辿る
  -P                     シンボリックリンクを辿らない (デフォルト)

      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report chcon translation bugs to <https://translationproject.org/team/>
Full documentation at: <https://www.gnu.org/software/coreutils/chcon>
or available locally via: info '(coreutils) chcon invocation'

所有権やパーミッションの確認

所有権やパーミッション(書き込み権限)を確認するには ls -al

$ ls -al 【確認するパス】

例
$ ls -al /var/www
合計 3
drwxr-xr-x.  5 root root    46 11月 12  2021 .
drwxr-xr-x. 22 root root  4096  7月  7 03:29 ..
drwxr-xr-x.  2 root root     6 11月 12  2021 cgi-bin
drwxr-xr-x.  2 root root    24 11月 12  2021 html

所有権の変更

所有権を変更するには chown

$ chown 【ユーザー名】:【グループ名】 【変更するパス】

例
$ chown apache:apache /var/www/tmp

下層のパスも含めて再帰的に所有権を変更するには chown に -R オプションを付けます

$ chown -R 【ユーザー名】:【グループ名】 【変更するパス】

例
$ chown -R apache:apache /var/www/tmp

パーミッションの変更

パーミッションを変更するには chmod

$ chmod 【パーミッション】 【変更するパス】

例
$ chmod 0777 /var/www/tmp

下層のパスも含めて再帰的にパーミッションを変更するには chmod に -R オプションを付けます

$ chmod -R 【パーミッション】 【変更するパス】

例
$ chmod -R 0777 /var/www/tmp

Apacheの実行ユーザー・グループの設定

Apacheの実行ユーザー・グループの設定はhttpd.confのUser・Groupです。

/etc/httpd/conf/httpd.conf

#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.  
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User apache
Group apache

Apacheの設定ファイル一覧

Apacheの設定ファイルの一覧を確認するには

httpd -t -D DUMP_CONFIG 2>/dev/null | grep '# In' | awk '{print $4}'

$ httpd -t -D DUMP_CONFIG 2>/dev/null | grep '# In' | awk '{print $4}'
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf

Apacheの設定値一覧

Apacheの設定値の一覧を確認するには

httpd -t -D DUMP_CONFIG 2>/dev/null | grep -v '#'

$ httpd -t -D DUMP_CONFIG 2>/dev/null | grep -v '#'
Listen 80
User apache
Group apache
ServerAdmin root@localhost
<Directory />
  AllowOverride none
  Require all denied
</Directory>
DocumentRoot "/var/www/html"

関連記事

スポンサーリンク

layoutの種類と使用方法

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る