🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SELinux

SELinuxmとは、セキュリティに関するLinuxカーネルの制御機能。Linuxディストリビューションではありません。強制アクセス制御機能を付け加えるモジュールの名称で、米国家安全保障局 (NSA)が中心となり開発しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

1681閲覧

SELinuxが動作していると、Owncloudで denied のエラーが発生する

taro373

総合スコア189

SELinux

SELinuxmとは、セキュリティに関するLinuxカーネルの制御機能。Linuxディストリビューションではありません。強制アクセス制御機能を付け加えるモジュールの名称で、米国家安全保障局 (NSA)が中心となり開発しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2019/04/16 06:25

編集2019/04/16 07:21

owncloud のデータディレクトリを容量の大きなパーティションに変更して
インストールしました。

/var/www/html/owncloud/config/config.php 'datadirectory' => '/data/owncloud',

データベースも/dataに保存場所を変更しましたので、コンテキストを
変更してmysqlコマンドは動作するようになりました。

$ sudo semanage fcontext -a -t mysqld_db_t /data/mysql_data $ sudo restorecon /data/mysql_data $ mysql -p -u root Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g.

owncloudのディレクトリに関してもコンテキストを変更したと考えているのですが、

$ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/data' $ sudo restorecon '/var/www/html/owncloud/data' $ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/config' $ sudo restorecon '/var/www/html/owncloud/config' $ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/apps' $ sudo restorecon '/var/www/html/owncloud/apps' $ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/config/config.php' $ sudo restorecon -v '/var/www/html/owncloud/config/config.php' $ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/.user.ini' $ restorecon -v '/var/www/html/owncloud/.user.ini' $ sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/owncloud/.htaccess' $ restorecon -v '/var/www/html/owncloud/.htaccess'

SELinuxが有効になっていると、ブラウザには下記のメッセージが表示されます。

Exception occurred while logging exception: Failed to connect to the database: An exception occured in driver: SQLSTATE[HY000] [2002] Permission denied #0 /var/www/html/owncloud/lib/composer/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(429): OC\DB\Connection->connect() #1 /var/www/html/owncloud/lib/composer/doctrine/dbal/lib/Doctrine/DBAL/Connection.php(389): Doctrine\DBAL\Connection->getDatabasePlatformVersion() (以下省略)

エラーログには下記のメッセージが出ています。

denied { name_connect } for pid=11965 comm="httpd" dest=3306 \ scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:mysqld_port_t:s0 \ tclass=tcp_socket permissive=0

これまで、ls -Z で既定の場所のコンテキスト確認して、それをsemanageで追加することしか
行ったことがなく、ポートのコンテキストタイプがあることを初めて知りました。
TCP:3306番ポートのコンテキストタイプに、scontextに書かれている"httpd_t"を追加すれば
解決できるのでしょうか。
semanage port -a -t httpd_port_t -p tcp 3306

追加するコンテキストはhttpd_tとするのか、httpd_port_tとするのか(それともまったく違うのか)、
と、その理由をご教示いただけないでしょうか。

使用できるポートを調べてみました。

$ sudo semanage port -l | grep mysql mysqld_port_t tcp 1186, 3306, 63132-63164 mysqlmanagerd_port_t tcp 2273 $ sudo semanage port -l | grep httpd $

"httpd_port_t"ではなく、"http_port_t"("d"は含まない)ですね。

$ sudo semanage port -l | grep -w http_port_t http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000

それならエラーログ中に「"http_port_t"ポートのコンテキストがおかしいよ」
と書いてくれれば、わかりやすいかと思うのですが、このエラーの解決方法は
semanage port -a -t http_port_t -p tcp 3306 になりますか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

httpd_t → mysqld_port_t への接続は、デフォルトで用意されている httpd_can_network_connect_db (ブール値)で許可できると思います。

(CentOS 7 の場合) # sesearch -A -C -s httpd_t -t mysqld_port_t Found 8 semantic av rules: allow httpd_t port_type : tcp_socket { recv_msg send_msg } ; allow httpd_t port_type : udp_socket { recv_msg send_msg } ; DT allow nsswitch_domain port_type : tcp_socket { recv_msg send_msg } ; [ nis_enabled ] DT allow httpd_t port_type : tcp_socket name_connect ; [ httpd_can_network_connect ] DT allow nsswitch_domain port_type : udp_socket recv_msg ; [ nis_enabled ] DT allow nsswitch_domain port_type : udp_socket send_msg ; [ nis_enabled ] DT allow httpd_t mysqld_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ] DT allow httpd_t mysqld_port_t : tcp_socket { recv_msg send_msg } ; [ httpd_can_network_connect_db ] ※[ ] 内がブール値。 # setsebool httpd_can_network_connect_db on (有効に) # sesearch -A -C -s httpd_t -t mysqld_port_t (略) ET allow httpd_t mysqld_port_t : tcp_socket name_connect ; [ httpd_can_network_connect_db ] ET allow httpd_t mysqld_port_t : tcp_socket { recv_msg send_msg } ; [ httpd_can_network_connect_db ] # setsebool -P httpd_can_network_connect_db on (再起動後も有効に)

投稿2019/04/16 07:57

TaichiYanagiya

総合スコア12173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro373

2019/04/17 01:10

SELinux、奥が深いですね....(いっそ止めてしまいたくなるくらいですが、頑張ります) 「ポートのコンテキスト?なにそれ」と思っていたら、まだ方法があったのですね。お聞きしてよかったです。 エラーメッセージに表示されたname_connectがDT(無効)になっているので ET(有効)に設定するのですね。 再起動すれば元に戻る設定変更で試せますし、コマンドがonに設定するという シンプルな方法で、パーマネントの指定(-Pオプション)もあります。 勉強中の身には本当にありがたい方法です。試してみます。
taro373

2019/04/17 03:57

いきなり壁がありましたが.... $ sesearch -A -C -s httpd_t -t mysqld_port_t bash: sesearch: コマンドが見つかりませんでした... $ sudo yum install setools-console と実行し $ sudo setsebool httpd_can_network_connect_db on $ sesearch -A -C -s httpd_t -t mysqld_port_t でETと表示され、SELinuxが動いた状態でもowncloudの画面が表示されました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問