За последние 24 часа нас посетили 18523 программиста и 1606 роботов. Сейчас ищут 917 программистов ...

Удалённый доступ к MySQL: bash может, PHP не может – почему?

Тема в разделе "MySQL", создана пользователем TrogWar, 17 мар 2014.

  1. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Доброго времени суток!

    В наличии два сервера в сети /24: 2 и 88 соответственно.

    Задача: из PHP приложения на 88 забирать данные из MySQL с обоих серверов.

    tl;dr:
    1. bash успешно коннектится и забирает правильные данные
    2. PDO+стандартный dsn и MySQLi валятся с "Permission denied"
    3. PDO+socket коннектится, но к локальной базе

    Ничто лучше не опишет ситуацию как небольшие тесты:
    1. Bash:
    Код (Text):
    1. [trogwar@centos ~]$ mysql --host="42.42.42.2" --user="foobar" --password='blowfish'
    2. # ... credits ...
    3. mysql> use cooldb
    4. Database changed
    5. mysql> select count(*) from rem_tests;
    6. +----------+
    7. | count(*) |
    8. +----------+
    9. |       98 |
    10. +----------+
    11. 1 row in set (0.00 sec)
    12. mysql>
    2. PHP + PDO + default dsn:
    Код (PHP):
    1. try {
    2.     $dbh = new PDO(
    3.         'mysql:host=42.42.42.2;dbname=cooldb',
    4.         'foobar',
    5.         'blowfish'
    6.     );
    7.     $sql    = 'SELECT COUNT(*) FROM rem_tests'; // Таблица существует только на удалённом сервере
    8.     $stmt   = $dbh->prepare($sql);
    9.     $status = $stmt->execute();
    10.     $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    11. } catch (PDOException $exception) {
    12.     echo $exception->getMessage();
    13. }
    14. var_dump($result); // PDOException: SQLSTATE[HY000] [2002] Permission denied
    15. die(); 
    3. PHP + PDO + sockets:
    Код (PHP):
    1. // ... тот же самый код ...
    2.         'mysql:unix_socket=/var/lib/mysql/mysql.sock;dbname=cooldb',
    3. // ... тот же самый код ...
    4. var_dump($result); // PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'coldb.rem_tests' doesn't exist
    5. die(); 
    Вопросы:
    1. В чём разница между PHP и Bash в плане коннекта к mysql? (о.0)
    2. Какие есть идеи получить доступ из php?

    Спасибо!
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Удалённый доступ к MySQL: bash может, PHP не может – поч

    php тоже консольный или таки из-под вебсервера? если второе, на каком он сетевом интерфейсе?
    права на базу расписаны для какого пользователя (user@address или user@*)?
     
  3. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Re: Удалённый доступ к MySQL: bash может, PHP не может – поч

    Спасибо за ответ!

    Не cli, везде работает из-под httpd: MAMP на .2 и LAMP на .88

    Сервер, с которого стучимся (.88):
    Код (Text):
    1.  
    2. [trogwar@centos ~]$ cat /etc/httpd/conf/httpd.conf | grep Listen
    3. Listen 80
    Сервер, на который стучимся (.2):
    Код (Text):
    1.  
    2. Mac-Boo:~ trogwar$ cat "/Library/Application Support/appsolute/MAMP PRO/conf/httpd.conf" | grep Listen
    3. Listen 80
    Права для всех хостов (то есть, с "%") на сервере куда стучимся (.2):
    Код (Text):
    1.  
    2. Mac-Boo:~ trogwar$ /Applications/MAMP/Library/bin/mysql -uroot -p
    3. Enter password:
    4. # ... credits ...
    5. mysql> SELECT `Host`, `User`, `Select_priv` FROM `mysql`.`user` WHERE `User`="foobar";
    6. +------+--------+-------------+
    7. | Host | User   | Select_priv |
    8. +------+--------+-------------+
    9. | %    | foobar | Y           |
    10. +------+--------+-------------+
    11. 1 row in set (0.00 sec)
     
  4. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Re: Удалённый доступ к MySQL: bash может, PHP не может – поч

    По поводу пользователей. Всё нижеуказанное успешно подключается к удалённому мускулу и забирает корректные данные:
    Код (Text):
    1.  
    2. [trogwar@centos ~]$ sudo -u root mysql --host='42.42.42.2' --user='foobar' --password='blowfish'
    3. [trogwar@centos ~]$ sudo -u trogwar mysql --host='42.42.42.2' --user='foobar' --password='blowfish'
    4. [trogwar@centos ~]$ sudo -u apache mysql --host='42.42.42.2' --user='foobar' --password='blowfish'
    5. [trogwar@centos ~]$ sudo -u mysql mysql --host='42.42.42.2' --user='foobar' --password='blowfish'
    Добавлено спустя 31 минуту 14 секунд:
    Re: Удалённый доступ к MySQL: bash может, PHP не может – почему?
    Вчера пробовал
    Код (Text):
    1. [trogwar@centos ~]$ setsebool -P httpd_can_network_connect 1
    , но получал ошибку, что SELinux либо отключён, либо не работает. К вечеру уже от досады сделал .88 серверу init 6. Затем ещё раз setsebool – внезапно сработало. И даже исправило ситуацию.
    Сегодня у пользователя 'foobar' MySQL обновил пароль (апдейт поля записи в `mysql`.`users` + "flush privileges;") – проблема вернулась. Только теперь ни init 6, ни setsebool не помогают – баш может коннектиться, пхп нет. Как видно выше, даже из-под разных пользователей.
     
  5. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Так, похоже, проблему решил (надеюсь). Пишу для тех, кто вдруг тоже столкнётся.

    Сначала проверил сокеты:
    Код (PHP):
    1. $res = fsockopen('42.42.42.2', '3306', $errno, $errstr, 5);
    2. var_dump($res, $errno, $errstr); // resource, 0, ''
    3. die();
    Раз тут всё хорошо, значит проблема в мускуле.
    Залез к нему под рутом в `mysql`.`user`, скопировал хэш пароля, обновил поле, вставив тот же самый хэш обратно. Сделал flush privileges. Вот теперь – заработало.

    Почему ему не помогли три апдейта на другие пароли или апдейт с использованием password('blowfish'), но апдейт копипасты хэша сработал – не знаю, никак кроме магии объяснить не могу. Пока что, даже после init 6, полёт нормальный.
    Версия мускула:"14.14 Distrib 5.5.36".
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Удалённый доступ к MySQL: bash может, PHP не может – поч

    любопытно. что-то перемкнуло в привилегиях значит?
     
  7. TrogWar

    TrogWar Активный пользователь

    С нами с:
    20 окт 2012
    Сообщения:
    40
    Симпатии:
    0
    Адрес:
    Ленинград
    Re: Удалённый доступ к MySQL: bash может, PHP не может – поч

    Увы, на этот вопрос ответа я дать не могу так как не настолько хорошо знаю mysql, а копаться в этом пока времени не было.
    Интересно, что это не единичный случай – за сегодня поднял три несвязанных пары серверов и столкнулся с точно такой же проблемой один-в-один. Я ставлю centos 6.5 minimal + lamp (remi) + mysql_secure_installation. Другие варианты пока не успел опробовать.