質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

88.77%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 491

taro373

score 119

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 になりますか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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/17 10:10

    SELinux、奥が深いですね....(いっそ止めてしまいたくなるくらいですが、頑張ります)
    「ポートのコンテキスト?なにそれ」と思っていたら、まだ方法があったのですね。お聞きしてよかったです。

    エラーメッセージに表示されたname_connectがDT(無効)になっているので
    ET(有効)に設定するのですね。

    再起動すれば元に戻る設定変更で試せますし、コマンドがonに設定するという
    シンプルな方法で、パーマネントの指定(-Pオプション)もあります。
    勉強中の身には本当にありがたい方法です。試してみます。

    キャンセル

  • 2019/04/17 12: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の画面が表示されました

    キャンセル

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

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る