3

Я часто настраиваю свой рабочий компьютер на выполнение некоторых трудоемких вычислений, прежде чем я иду домой вечером. После того, как они закончили, я бы хотел, чтобы он отключился. Однако, поскольку завершение работы требует прав суперпользователя, оно должно выполняться с использованием sudo. Очевидно, что я не смогу ввести свой пароль через 7 часов, поэтому до сих пор мне приходилось выполнять весь список команд (cmd1; cmd2; cmd3; ... shutdown) от имени пользователя root - не идеально.

Есть ли способ, которым я могу «предварительно авторизовать» sudo в конце списка команд? Каким-то образом я могу полностью заполнить свой пароль в начале выполнения, чтобы позже bash не понадобился?

Спасибо!

6 ответов6

4

Для завершения первого ответа:

Настройте способ, которым ваши непривилегированные трудоемкие вычисления могут инициировать завершение, которое ожидает в привилегированной оболочке (запускается с помощью sudo -s или sudo su).  Использование файла в качестве флага - хороший и простой способ сделать это.  Итак, в вашей непривилегированной оболочке

cmd1; cmd2; cmd3; > ok_to_shutdown_now

и в вашей привилегированной оболочке запустите скрипт, который говорит

while [ ! -f ok_to_shutdown_now ]
do
        sleep 60
done
shutdown
2

У вас есть несколько вариантов, чтобы достичь своей цели, в зависимости от того, чем вы готовы рискнуть. Не все из них связаны с кэшированием ваших учетных данных sudo.

Вы можете отключить запрос пароля для вашего пользователя или для пользователя, выполняющего shutdown работы, добавив строку с тегом NOPASSWD в файл sudoers.

Вы можете авторизоваться в sudo, запустив sudo -v . Ваш пароль будет кешироваться в течение 15 минут, поэтому вам нужно будет выполнить sudo -v all, скажем, 12 минут, чтобы обновить свои учетные данные и завершить эту задачу после завершения последнего пакетного процесса.

Если вы знаете, сколько времени занимают ваши пакетные процессы, вы можете просто указать время shutdown по истечении которого оно должно завершить работу системы.

Вы можете увеличить тайм-аут по умолчанию на 15 минут для кэша паролей с помощью опции timestamp_timeout в файле sudoers. Либо произвольно, либо, если вы знаете, сколько времени занимает пакетный процесс, к этому времени. Или вы можете полностью отключить тайм-аут с отрицательным значением и использовать sudo -v для аутентификации и sudo -k для "выхода" из sudo, когда вы закончите. Между этими двумя вызовами вы можете запустить sudo без повторного ввода пароля.

Если вас не устраивает то, что вам не требуется пароль для sudo, но вместо этого вы сохраняете свой пароль в текстовом файле, доступном только для чтения вашему пользователю, вы можете создать небольшой пакетный скрипт, который выведет ваш пароль на стандартный вывод и использовать его как askpass программа для sudo или просто использовать его в конвейере с sudo -S , который читает пароль из stdin . В сочетании с небольшим сценарием вы можете вначале сохранить свой пароль в текстовом файле, из которого он будет считан сценарием, предоставившим ему sudo и в конце снова удалить этот файл.

Эхо-скрипт

#!/bin/bash
echo mypassword

или же

#!/bin/bash
cat /mysecretpwfile

а затем ./echopw | sudo -S или

export ASKPASS=~/echopw
sudo -A shutdown -h now

Или, наконец, вы можете просто поместить команду shutdown в сценарий оболочки и установить для сценария оболочки значение suid, owner root, your group, 750.

1

вы могли бы

sudo sh -c 'cmd1; cmd2; cmd3;... shutdown'

или предоставьте свою привилегию пользователя для отключения sudo без пароля. Вот пример только для этого: выключение без рута

1

Лучший способ ...

Да, есть лучший способ сделать это. Сделайте так, чтобы выключение не требовало привилегий суперпользователя.

Это требует предварительной настройки. Тогда это сводит к минимуму, кто может выполнить привилегированное действие, и только то, что может быть достигнуто человеком, который использует этот метод. (Другими словами, потенциальное злоупотребление властью ограничено некоторыми другими существующими ограничениями.)

Я предполагаю установку некоторого распространенного программного обеспечения, включая sudo (кажется безопасным предположением, учитывая вопрос) и OpenSSH (или, вероятно, более вероятно, "OpenSSH Portable").

Создать учетную запись пользователя

Поскольку у вас, похоже, есть доступ к sudo , я полагаю, что у вас, вероятно, есть возможность создать пользователя.

Вы можете позвонить пользователю _sysstop или _sysoff и т.д. Хотя "shutdown" составляет восемь символов или менее, это также имя команды для запуска, поэтому использование другого имени может быть полезным. Мне также нравится стандарт запуска полностью автоматизированных учетных записей, таких как эта, с подчеркиванием, чтобы визуально эта учетная запись выглядела иначе, чем стандартная учетная запись пользователя.

Позвольте пользователю отключиться без пароля

Измените / etc / sudoers и вставьте это:

_sysstop ALL=(ALL) NOPASSWD:/sbin/shutdown -h*, SETENV: ALL

Естественно, вы можете настроить эту первую часть, которая является именем созданной вами учетной записи.

Похоже, что многие люди выступают против использования NOPASSWD, возможно, потому, что им не нравится идея предоставления полного доступа для выполнения каких-либо действий в системе. Однако это дает довольно ограниченный доступ. Единственное, что этот человек сможет сделать - это запустить команду, начинающуюся с "/sbin/shutdown -h", которая остановит систему. Если неавторизованному человеку удастся воспользоваться этой линией без пароля, он может отключить систему, но это не значит, что такой злоумышленник будет неограниченно способен наносить множество других типов урона (например, настройка дополнительных учетных записей пользователей и т. д.) Таким образом, использование NOPASSWD довольно безопасно, в отличие от того, что большинство людей пытается отговорить.

«/ Sbin / shutdown -h» - это то, что я хотел использовать. В зависимости от вашей операционной системы и того, что вы хотите, вы можете использовать другую команду, такую как "halt" или "reboot", и вам могут потребоваться другие параметры. Поскольку вы уже практикуете отключение системы так, как вам этого хочется, то, вероятно, вы уже знаете, как хотите это делать.

Создать ключ SSH

ssh-keygen -t rsa -vvv -f mykey -N "" -C "mykey" | tee mykey.fng

Некоторым людям не понравится -N "" . Что ж, это совершенно другое обсуждение, которое я предпочитаю не вдаваться в подробности, помимо остальной части этого утверждения: настраивать в соответствии с любой практикой безопасности, которая сделает вас более комфортной.

В приведенном выше примере могут быть другие изменения, которые некоторые люди порекомендуют. Опять же, это может быть отлично, но это отдельная тема от сути этого ответа. Настройте вышеупомянутое однако соответствующим

Обратите внимание, что "mykey" появляется три раза в приведенном выше примере. Вы можете настроить первый пример, а затем другие вхождения должны соответствовать тому, что говорит первое вхождение.

Вам не нужен файл mykey.fng. Я просто приобрел привычку сохранять его, чтобы иметь возможность записать VisualHostKey (он же «random-art»), прежде чем я узнал, что такие ключи можно увидеть позже, например, «ssh-keygen -lvf /etc /». SSH /ssh_host_ecdsa_key»

Ограничить то, что можно сделать с помощью ключа

Измените файл ~$( echo username-just-created )/.ssh/authorized_keys* . (например, ~_sysstop/.ssh/authorized_keys хотя некоторые системы могут использовать ~_sysstop/.ssh/authorized_keys2 , хотя вы, вероятно, хотите использовать authorized_keys )

Реализуйте ключ ssh, вставив в файл строку, которая выглядит примерно так:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA... Optional-comment-after-the-space

Для «Необязательного комментария после пробела» я хотел бы включить имя файла закрытого ключа. Если я когда-нибудь захочу добавить дополнительный ключ (что, возможно, не для этого конкретного типа пользователя, но по привычке некоторые пользователи могут захотеть дополнительные ключи), то в файле author_keys может быть много строк, которые можно определить по тексту ключа. , Если у меня есть несколько ключей, а затем через несколько месяцев я хочу удалить один, мне может быть трудно вспомнить, какой открытый ключ связан с каким файлом ключа, и поэтому я не знаю, какой открытый ключ удалить. Используя дополнительный комментарий, я могу сохранить этот комментарий в будущем.

Примечание: если вы автоматически добавляете ключ (возможно, с помощью ssh-add), возможно, у вас есть комментарий по умолчанию, содержащий имя пользователя. Такие комментарии часто довольно бесполезны. Настройте таким образом, чтобы это было полезно в будущем.

Убедитесь, что ~/.ssh/authorized_keys имеет необходимые разрешения, чтобы сделать OpenSSH счастливым.

Проверьте одиночные шаги

Можете ли вы проверить это (выключив систему)? Если это так, то это может проверить отдельные компоненты по отдельности, что может привести к более узкой проблеме в случае поломки.

  • Проверьте, что ключ настроен правильно.
    • На клиенте используйте ssh -i ~/keys/privkey-file _sysstop@localhost
    • Если вы используете PuTTY, PuTTY также поддерживает -i filename-ssh) или использует графический интерфейс для указания имени файла в Connection\SSH\auth (в левом фрейме параметров), что вы можете сделать только в "Новом сеансе". экран. (В частности, я говорю "только", потому что экран "auth" не появляется при попытке использовать "системное меню" PuTTY и использовании "Change session" в существующем сеансе)
    • На этой стадии процесса это должно дать вам оболочку. Если нет, вам может потребоваться настроить реализацию с использованием ключей SSH.
  • После входа в систему проверьте, что sudo работает (без пароля), чтобы завершить работу системы.

Ограничить ключ

Смотрите файл ~/.ssh/authorized_keys* ? Отлично. Теперь измените его.

Найдите строку, начинающуюся с ssh-rsa

Вставьте текст перед ним, чтобы строка выглядела примерно так:

command="sudo /sbin/shutdown -hp now Shutdown initiated with SSH by \\"$USER\\" CONN rem/lcl=\\"$SSH_CONNECTION\\" CLI rem/lcl=\\"$SSH_CLIENT\\" CMD=\\"$SSH_ORIGINAL_COMMAND\\"",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA... Optional-comment-after-the-space

Результат

Защитите этот файл закрытого ключа SSH. С его помощью любой может отключить систему. Тем не менее, это действительно все, что они могут сделать.

Теперь для завершения работы системы просто необходимо запустить непривилегированную команду "ssh" и получить доступ к этому файлу. Пока вы контролируете доступ к этому файлу, вы сохраняете вещи настолько безопасными, насколько это необходимо. Однако, даже если файл скомпрометирован, количество ущерба, которое может быть нанесено, довольно ограничено.

Теперь вам даже не нужно вводить sudo, когда вы хотите выключить систему. Вы должны убедиться, что никто неавторизованный не получит этот ключ (иначе они могут выключить систему). Предположительно, любой, кто мог бы использовать "sudo" для кражи этого файла, мог бы также просто использовать "sudo" для выключения системы, поэтому во многих случаях хранение файла в частной области компьютера, вероятно, является относительно безопасным и разумным риском.

1

Вы можете запускать команды в корневой среде, так что вы вводите пароль один раз, когда находитесь за компьютером, а затем запускаете команды root без ввода пароля.

Ты можешь использовать

   sudo -s

или же

   sudo su

(Читай здесь разницу)

Это даст вам права суперпользователя и не позволит вам снова ввести пароль. Затем вы можете запускать команды sudo после этого, и они не будут запрашивать у вас пароль.

-1

Возможно, самое простое решение - сохранить пароль в переменной, а затем передать его из этой переменной в sudo -S .

#!/bin/bash
echo "Please enter your password:"
read -s mypasswd

#additional stuff

echo $mypasswd | sudo -S shutdown -h now

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .