原因はやっぱりSElinux
システムの概要
動画の閲覧機能、アップロード機能のあるWEBサイトの構築をしています。HDDに動画を保存しており、それを特定のディレクトリにマウントして見に行くシステムになっています。環境はCentOS stream8上にapacheで構成しています。
まずは普通にマウントして接続
以下のようにHDDをWEBサーバーにつないでからマウントを行いました。まず、fdiskで外付けHDDを確認してからマウントします。大容量HDDはフォーマットがNTFSなので、事前にパッケージをインストールしておく必要があります。
[root@webserver hoge]# fdisk -l ディスク /dev/sda: 119.2 GiB, 128035676160 バイト, 250069680 セクタ 単位: セクタ (1 * 512 = 512 バイト) ... デバイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ /dev/sdb1 2048 1953521663 1953519616 931.5G 7 HPFS/NTFS/exFAT [root@webserver hoge]# mount -t ntfs-3g /dev/sdb1 /home/www/html/hogemedia
ここでクライアントPCから接続をしてみると、アクセス出来ません。トータル容量を計算するコードを置いていましたが0.00GB表示です。
SElinuxを一時的に停止してみると
[root@webserver hoge]# getenforce Enforcing [root@webserver hoge]# setenforce 0 [root@webserver hoge]# getenforce Permissive
こうすると、無事に接続出来るようになりました。
対処法は
まずはラベル確認
「これはWEBサーバー構築の時に、既に経験済の問題だぜ」と思いラベル(context)を確認してみます。
[root@webserver hoge]# ls -Z /home/www/html/ unconfined_u:object_r:httpd_sys_content_t:s0 hogehoge.php unconfined_u:object_r:httpd_sys_content_t:s0 icon unconfined_u:object_r:httpd_sys_content_t:s0 images unconfined_u:object_r:httpd_sys_content_t:s0 js system_u:object_r:fusefs_t:s0 hogemedia
やっぱりラベルが違うということが分かりました。
ラベル設定を変更してみる
"semanage"の"fcontext"を使用して変更して、再度ラベルを確認してみます。
[root@webserver hoge]# semanage fcontext -a -t httpd_sys_content_t /home/www/html/ [root@webserver hoge]# restorecon -v /home/www/html/ [root@webserver hoge]# ls -Z /home/www/html/ unconfined_u:object_r:httpd_sys_content_t:s0 hogehoge.php unconfined_u:object_r:httpd_sys_content_t:s0 icon unconfined_u:object_r:httpd_sys_content_t:s0 images unconfined_u:object_r:httpd_sys_content_t:s0 js system_u:object_r:fusefs_t:s0 hogemedia
あれっ?変わってない。ここでHDDを一度アンマウントしてみます。
HDDアンマウント後に再度ラベル確認
[root@webserver hoge]# umount /home/www/html/media [root@webserver hoge]# ls -Z /home/www/html/ unconfined_u:object_r:httpd_sys_content_t:s0 hogehoge.php unconfined_u:object_r:httpd_sys_content_t:s0 icon unconfined_u:object_r:httpd_sys_content_t:s0 images unconfined_u:object_r:httpd_sys_content_t:s0 js unconfined_u:object_r:httpd_sys_content_t:s0 hogemedia
アンマウントすると、設定したラベルになるようです。この後、再度マウントし直しましたが、元のアクセス出来ないラベルに変更されてしまう結果となりました。
ネットで情報を探してみる
何て検索したか忘れましたが、RedHatのサイトに対処法がありました。サイトによるとマウント時のオプションでラベル指定することにより対処出来るようです。早速やってみます。
マウント時にオプションを付けてラベル指定
[root@webserver hoge]# umount /home/www/html/media [root@webserver hoge]# mount -t ntfs-3g /dev/sdb1 /home/www/html/media -o context="system_u:object_r:httpd_sys_content_t:s0" [root@webserver hoge]# ls -Z /home/www/html/ unconfined_u:object_r:httpd_sys_content_t:s0 hogehoge.php unconfined_u:object_r:httpd_sys_content_t:s0 icon unconfined_u:object_r:httpd_sys_content_t:s0 images unconfined_u:object_r:httpd_sys_content_t:s0 js system_u:object_r:httpd_sys_content_t:s0 hogemedia
これでラベル変更が出来ました。次に起動時に自動でマウントしてくれるように設定しておきます。
HDDのUUIDを調べる
自動マウント設定はfstabに書きますが、前準備としてUUIDを調べておきます。ラズパイの場合はPARTUUIDを使用したので、Debian系の場合はUUIDではなくPARTUUIDを使用するのかもしれません。
[root@webserver hoge]# blkid ... /dev/sdb1: LABEL="LaCie" BLOCK_SIZE="512" UUID="****************" TYPE="ntfs" PTTYPE="atari" PARTUUID="********-01"
対象のHDDのUUIDを控えておきます。
起動時のマウント設定を追加
fstabを開いて自動マウントの設定を追加します。
[root@webserver hoge]# vim /etc/fstab
追加内容は下記になります。オプションとしてnofailを付けておかないと何等かのエラーでマウントが上手く行かなかった場合にemergency-modeとなりSSH通信が出来なくなります。
UUID=**************** /home/www/html/hogemedia ntfs nofail,context="system_u:object_r:httpd_sys_content_t:s0" 0 0
保存して終了後、再起動を行い、無事にマウントされていれば完了です。