Перезапуск системы SystemD только в качестве конкретного пользователя?

Файлы журнала exim`a содержат множество данных в каждой строке. Продолжая подход OP к разделению IP-информации, рассмотрим:

unique_ips2=$(grep "$email" tmp_exim | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.' | sort -u)

Первое изменение, приведенное выше, заключается в том, чтобы поместить регулярное выражение в одинарные кавычки, чтобы bash не вмешивался в него. Второе изменение - это выход из точки. Неэкранированная точка означает любой символ, но мы хотим, чтобы она означала только буквальную точку. Третье изменение - добавить (буквальную) точку в конце регулярного выражения. Это предотвращает совпадение регулярного выражения с двумя последними числами IP-адреса.

sed также может сделать это хорошо:

unique_ips2=$(sed -nr "/$email/"' s/.*\[([0-9]{1,3}\.[0-9]{1,3})\..*/\1/p' tmp_exim | sort -u)

Параметр -n указывает sed не печатать ничего, пока мы не попросим его явно, и -r сообщает об этом, для удобства использовать расширенное регулярное выражение. (OSX отличается: замените -r на -E .) Выражение / $ email / указывает sed работать только со строками. с этим адресом электронной почты. (При использовании sed , grep часто бывает лишним.) Суть команды - это подстановка s /.* \ [([0-9] {1,3 } \. [0-9] {1,3}) \ .. * / \ 1 / p . Это ищет любой текст (. * ), за которым следует буквальная открытая квадратная скобка (в моих журналах exim перед IP-адресом всегда стоит открытая квадратная скобка), за которым следует число, точка, другое число, точка и вообще что угодно (. * ). Регулярное выражение номер-период-номер сгруппировано в круглых скобках. Это означает, что мы можем ссылаться на него как на \ 1 (это единственная группировка по скобкам, поэтому она также является первой).Таким образом, команда замены заменяет всю строку только первыми двумя числами IP-адреса. Последний p в команде указывает sed напечатать результат, если произойдет подстановка.

9
27.01.2019, 17:48
2 ответа

Чтобы добиться того, чтобы пользователь techopsмог управлять сервисом publicapi.serviceбез ввода пароля, у вас есть разные возможности. Какой из них подходит именно вам, ответить невозможно, так как вам придется выбирать самостоятельно.


Классический sudoподход, возможно, является наиболее часто используемым, так как он существует уже давно. Вам нужно будет создать, например. файл следующим образом.
Обратите внимание, что папка -в каталоге /etc/sudoers.dактивна только тогда, когда #includedir /etc/sudoers.dустановлено в /etc/sudoers. Но так должно быть, если вы используете современный дистрибутив Ubuntu. Как rootвыполнить:

cat > /etc/sudoers.d/techops << SUDO
techops ALL= NOPASSWD: /bin/systemctl restart publicapi.service
techops ALL= NOPASSWD: /bin/systemctl stop publicapi.service
techops ALL= NOPASSWD: /bin/systemctl start publicapi.service
SUDO

Теперь вы сможете запускать команды systemctlот имени пользователя techopsбез ввода пароля, добавляя перед командами sudo.

sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
sudo systemctl restart publicapi.service

Второй метод заключается в использовании PolKit (, который был переименован из PolicyKit ), чтобы позволить пользователю techopsуправлять systemdслужбами. В зависимости от версии politвы можете предоставить обычным пользователям контроль над модулями systemd.
Чтобы проверить версию polkit , просто запустите pkaction --version.

  • с polkit версии 0.106 и выше вы можете разрешить пользователям управлять определенными модулями systemd.
    Для этого вы можете создать правило какroot:

    cat > /etc/polkit-1/rules.d/10-techops.rules << POLKIT
    polkit.addRule(function(action, subject) {
        if (action.id == "org.freedesktop.systemd1.manage-units" &&
            action.lookup("unit") == "publicapi.service" &&
            subject.user == "techops") {
            return polkit.Result.YES;
        }
    });
    POLKIT
    
  • с polkit версии 0.105 и ниже:вы можете разрешить пользователям управлять модулями systemd. К сожалению, это включает в себя все модули systemd, и вы можете не захотеть этого делать. Не уверен, есть ли способ ограничить доступ к определенным модулям systemd с версией 0.105 или ниже, но, возможно, кто-то еще может пояснить.
    Чтобы включить это, вы можете создать файл какroot:

    cat > /etc/polkit-1/localauthority/50-local.d/org.freedesktop.systemd1.pkla << POLKIT
    [Allow user techops to run systemctl commands]
    Identity=unix-user:techops
    Action=org.freedesktop.systemd1.manage-units
    ResultInactive=no
    ResultActive=no
    ResultAny=yes
    POLKIT
    

В обоих случаях вы можете запустить systemctl [start|stop|restart] publicapi.serviceот имени пользователя techopsбез ввода пароля. В последнем случае (polkit <= 0.105 )пользователь techopsмог управлять любым модулем systemd.


Третий вариант заключается в том, чтобы сделать службу пользовательской службой, которая не нуждается в конфигурациях sudoили polkit.Это ставит все под контроль пользователя и работает только в том случае, если ваша фактическая служба, запущенная с /home/techops/publicapi start, может работать без привилегий root.

Сначала вы должны включить задержку для пользователя techops. Это необходимо для запуска службы пользователя при загрузке. Как rootвыполнить:

loginctl enable-linger techops

Затем вы должны переместить файл модуля systemdв каталог пользователя techops. От имени пользователя techopsвыполните команды следующим образом.

mkdir -p ~/.config/systemd/user

cat > ~/.config/systemd/user/publicapi.service << UNIT
[Unit]
Description=public api startup script

[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop

[Install]
WantedBy=default.target
UNIT

Обратите внимание, что WantedByдолжно быть default.target, поскольку multi-user.targetотсутствует в пользовательском контексте.

Теперь перезагрузите конфигурацию и включите службу. Снова как пользователь techopsвыполните команды.

systemctl --user daemon-reload
systemctl --user enable publicapi.service
systemctl --user start publicapi.service

Как правило, вы должны размещать свои системные модули в /etc/systemd/system/, а не непосредственно в /etc/systemd/system/multi-user.target.wants. Когда вы выполняете systemctl enable publicapi.service, символическая ссылка будет создана в etc/systemd/system/multi-user.target.wantsили любой другой цели, указанной для этого устройства.

Как уже упоминалось, если сам сервис/процесс может быть запущен без привилегий суперпользователя, вам следует подумать о добавлении User=techopsв ваш юнит-файл, чтобы запустить процесс с непривилегированной учетной записью пользователя -.

28
27.01.2020, 20:05

Во-первых, вы не помещаете юнит-файл в каталог /etc/systemd/system/multi-user.target.wants. Этот каталог поддерживается командами systemdи systemctl. Вместо этого поместите файл модуля в /etc/systemd/system, а затем включите его с помощью

sudo systemctl enable publicapi.service

Это создаст символическую ссылку нижеmulti-user.target.wants(или где-либо еще, systemctlзнает лучше )чтить строки

[Install]
WantedBy=multi-user.target

в аппарате.

Затем создайте файл sudoersниже /etc/sudoers.d:

.
sudo visudo -f /etc/sudoers.d/techops

со следующим содержанием:

Cmnd_Alias HANDLE_PUBLICAPI = \
    /bin/systemctl start   publicapi.service, \
    /bin/systemctl stop    publicapi.service, \
    /bin/systemctl restart publicapi.service

techops ALL = (root) NOPASSWD: HANDLE_PUBLICAPI

Не используйте обычный редактор(т.е.sudo vim /etc/sudoers.d/techops)отредактировать этот файл, потому что если вы добавите в него какие-либо синтаксические ошибки, вы не иметь возможность запустить sudoснова. visudoс другой стороны проверяет синтаксис файла перед выходом из редактора.

Теперь пользователь techopsможет запускать

sudo systemctl start publicapi.service

и два других без указания пароля. Обратите внимание, что вы должны ввести команда и параметры точно такие же, как в файле sudoers(, за исключением часть /bin/systemctl, которую можно сократить доsystemctl).

Например,sudo /bin/systemctl start publicapi(без.service)запросит пароль.

9
27.01.2020, 20:05

Теги

Похожие вопросы