Команда sudo не работает, когда strace прилагается с PID bash

Я беру журналы команды, выполняемые пользователем в выходном файле, добавляя PID BASH в strace .

$ strace -q -f -e execve -p $$ -o <outputFile>

  • Получить команды, которые пользователь может запустить из / etc / sudoers?
  • Как активировать обратный привязку на CentOS 5
  • Как сделать статические маршруты IPv6 постоянными в CentOS?
  • Как я могу выполнить процесс, который я запускаю во время сеанса сеанса SSH после окончания сеанса?
  • Почему пароль «sudo» отличается от пароля su?
  • / etc / sudoers - Оскорбления - Как добавить список оскорблений?
  • Он работает нормально, и я получаю весь список команд в выходном файле.

    Но я столкнулся с другой проблемой. Я не могу запустить команду sudo когда strace прилагается с BASH PID.

    Я получаю следующую ошибку:

    sudo: effective uid is not 0, is sudo installed setuid root?

    Я проверил setuid , установленный на sudo binary

    ---s--x--x. 1 root root 123832 Mar 22 11:35 /usr/bin/sudo

    sudo отлично работает, когда я останавливаю strace .

    Это ошибка или есть какая-то техническая причина? Пожалуйста помоги мне с этим.

  • pysvn не удается выполнить из-за того, что -loneon не найден?
  • SELinux Запись доступа для vsftpd и samba
  • Samba 4 имеет высокий уровень использования ЦП при доступе к подключенному диску через Windows
  • Понимание использования Inode NTFS-3g
  • CentOS на HyperV - eth0 не в ifconfig?
  • Использование YUM или установка APT на CentOS
  • 2 Solutions collect form web for “Команда sudo не работает, когда strace прилагается с PID bash”

    Существуют и другие способы регистрации всех команд, выполняемых пользователем. С установленным sysdig можно запустить что-то вроде

     # sysdig "user.name = jdoe and evt.type = execve" 

    регистрировать все вызовы execve(2) jdoe ; опция -p для sysdig может настроить формат вывода и т. д.

    Другой способ – использовать SystemTap который имеет то преимущество, что поддерживается RedHat; здесь мы предполагаем, что jdoe имеет UID 1000 ;

     probe begin { printf("begin trace...\n\n") } probe syscall.execve.return { if (uid() != 1000) next; printf("runs %s[%d]: %s\n", execname(), pid(), cmdline_str()); } 

    это может быть выполнено через что-то вроде

     # stap-prep ... # stap whatyousavedtheaboveas.stp 

    Оба метода, скорее всего, потребуют корректировки, чтобы точно зафиксировать то, что вам нужно, обрабатывать условия ошибки, когда execve не работает, и т. Д. С плюсом стороны sysdig и SystemTap намного эффективнее, чем strace (запустите vmstat 1 и посмотрите, как strace подталкивает контекстные переключатели через крыша при работе).

    В руководстве для strace упоминается, что:

    ОШИБКИ
    Программы, использующие бит setuid, не имеют эффективных прав идентификатора пользователя во время трассировки.

    Хотя я подозреваю, что это больше связано с последствиями безопасности для отладки процесса setuid, чем ошибка. Если я не ошибаюсь, strace использует тот же интерфейс трассировки, что, скажем, gdb , и позволяет, среди прочего, изменять память текущего процесса. Возможность сделать это для процесса, который работает с большей привилегией, чем вы предполагали, будет плохой идеей.

    Linux и Unix - лучшая ОС в мире.