LINUX.ORG.RU

NRPE mysql --login-path

 , ,


0

1

Суть, есть сервер на Centos, на нем стоит nrpe Перехожу на новую фишку от mysql --login-path Что бы отказаться от паролей в командной строке. Есть плагин с офф сайта последней версии /usr/lib64/nagios/plugins/pmp-check-mysql-status

Запускается вот так command[check_pmysql]=/usr/lib64/nagios/plugins/pmp-check-mysql-status -L nagios -x Threads_running -w 20 -c 40

Файл ключей создан для и под пользователем nagios и успешно лежит в его хомяке mysql_config_editor set --login-path=nagios --host=localhost --user=root --password --port=3306 --socket=/var/lib/mysql/mysql.sock

И с консоли успешно работает.

Если же nrpe запускает скрипт сам в ответ на запрос Nagios то получает ответ ERROR 1045 (28000): Access denied for user 'shadowmaster63'@'localhost' (using password: NO)

Почему именно этого пользователя пытается подставить непонятно. Но по отладке видно что mysql дергает его из файла /proc/self/loginuid

Так же после долгих мучений и отладки выяснил что при запуске из консоли или если в nrpe разрешить command_prefix=/usr/bin/sudo

stat("/etc/my.cnf", {st_mode=S_IFREG|0644, st_size=2455, ...}) = 0
open("/etc/my.cnf", O_RDONLY)           = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2455, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3ce0b03000
read(3, "# Example MySQL config file for "..., 4096) = 2455
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f3ce0b03000, 4096)            = 0
stat("/etc/mysql/my.cnf", 0x7fffc5744aa0) = -1 ENOENT (No such file or directory)
stat("/usr/etc/my.cnf", 0x7fffc5744aa0) = -1 ENOENT (No such file or directory)
stat("/var/spool/nagios/.my.cnf", 0x7fffc5744aa0) = -1 ENOENT (No such file or directory)
stat("/var/spool/nagios/.mylogin.cnf", {st_mode=S_IFREG|0600, st_size=208, ...}) = 0
open("/var/spool/nagios/.mylogin.cnf", O_RDONLY) = 3

Видим что файл ключей успешно читается(запуск скрипта в консоли) В случае же если разрешить sudo то так же успешно читается но соответственно из хомяка root

А если без sudo по запросу удаленного Nagios получаем что он даже не ищет его как будто игнорирует опцию --login-path и побует подключиться с текущим пользователем без пароля

stat("/etc/my.cnf", {st_mode=S_IFREG|0644, st_size=2512, ...}) = 0
open("/etc/my.cnf", O_RDONLY)           = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2512, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff47e37b000
read(3, "", 4096) = 2512
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7ff47e37b000, 4096)            = 0
stat("/etc/mysql/my.cnf", 0x7fff3c0e9c00) = -1 ENOENT (No such file or directory)
stat("/usr/etc/my.cnf", 0x7fff3c0e9c00) = -1 ENOENT (No such file or directory)
stat("~/.my.cnf", 0x7fff3c0e9c00)       = -1 ENOENT (No such file or directory)
socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(3)                                = 0
socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
close(3)                                = 0
open("/etc/nsswitch.conf", O_RDONLY)    = 3

Идеи кончились, нужна помощь сообщества

Временный фикс: command_prefix=/usr/bin/sudo -u nagios

Посмотрел исходники nrpe Команды на исполнение запускаются банально fp=popen(command,«r»); Не так близко знаком с Си, но может именно в этом проблема ?

Это странно:

«~/.my.cnf»

ведь ядро не занимается преобразованием ″~″ в домашний каталог. Похоже, что не хватает выставленной переменой $HOME или $USER.

mky ★★★★★ ()
Ответ на: комментарий от mky

1.1.5 Я проверил, проблема точно не в PMP. Создал свой bash скрипт простейшие mysql --login-path=nagios -e «SELECT USER();»

И подключил его к nrpe, вот только ошибка осталась. Так что тут проблема скорее всего в самом nrpe в том как он вызывает этот скрипт, но как я писал выше там обычный сишный popen

shadowmaster63 ()
Ответ на: комментарий от shadowmaster63

Ну сделайте в этом скрипте команду set с перенаправлением в файл в /tmp и посмотрите, какие переменные среды туда будут выведены. Может нужно будет написать скрипт обёртку типа:

#!/bin/bash
export HOME=/var/spool/nagios/
exec /usr/lib64/nagios/plugins/pmp-check-mysql-status $@

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.