DOC / 1546 systemd.io

Секреты служб Linux через systemd credentials: передача без паролей в unit-файле

Службе часто нужен токен API или пароль, но unit-файл не подходит для хранения значения секрета. Механизм systemd credentials позволяет передать отдельный файл конкретной службе. Зашифрованный вариант дополнительно отделяет хранимый blob от открытого значения, выдаваемого процессу при запуске.

Что проверить до изменения службы

Посмотрите systemd --version, наличие systemd-creds и локальную справку. Возможности зависят от версии пакета дистрибутива. Не переносите настройку в рабочую службу, пока не выполнен тест в отдельном демонстрационном unit.

Приложение должно уметь читать секрет из файла. Если оно принимает пароль только через аргумент командной строки, настройка credentials сама по себе не исправит этот интерфейс.

Источник, имя и каталог исполнения

LoadCredential загружает значение из доступного менеджеру файла. LoadCredentialEncrypted использует зашифрованный blob. Имя credential, указанное при шифровании, должно совпадать с именем в unit. Программа находит файл через CREDENTIALS_DIRECTORY; жёстко заданный путь /run/credentials не стоит использовать как общий интерфейс.

Подготовить демонстрационный секрет

На лабораторной Linux-машине создайте защищённый файл с тестовым значением, не настоящим паролем. Например, подготовьте файл /root/credential-demo.txt редактором и ограничьте права:

sudo chmod 600 /root/credential-demo.txt
sudo install -d -m 700 /etc/credstore.encrypted
sudo systemd-creds encrypt --name=api-token \
    /root/credential-demo.txt \
    /etc/credstore.encrypted/credential-demo-api-token.cred

Не вводите реальный токен литералом в shell-команду: он останется в истории. После проверки шифрования удалите лишние открытые копии по процедуре своей организации. Нельзя обещать надёжное стирание файлов обычным удалением на любой файловой системе и накопителе.

Тестовый потребитель

Сохраните следующий файл как /opt/credential-demo.py. Он подтверждает получение непустого значения, но не печатает его:

import os
from pathlib import Path

directory = Path(os.environ["CREDENTIALS_DIRECTORY"])
token = (directory / "api-token").read_text().strip()
if not token:
    raise RuntimeError("Credential is empty")
print("Credential loaded successfully")

Для тестового /etc/systemd/system/credential-demo.service:

[Unit]
Description=Credential delivery test

[Service]
Type=oneshot
DynamicUser=yes
LoadCredentialEncrypted=api-token:/etc/credstore.encrypted/credential-demo-api-token.cred
ExecStart=/usr/bin/python3 /opt/credential-demo.py
NoNewPrivileges=yes

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

Проверить запуск

sudo systemd-analyze verify /etc/systemd/system/credential-demo.service
sudo systemctl daemon-reload
sudo systemctl start credential-demo.service
sudo systemctl show credential-demo.service -p Result -p ExecMainStatus
sudo journalctl -u credential-demo.service --no-pager -n 20

У oneshot-проверки нормальным результатом является завершение с Result=success и ExecMainStatus=0, а не постоянное состояние running. Убедитесь, что журнал не содержит значения токена.

Ротация и восстановление

Проверьте, к чему привязано шифрование на вашем хосте: локальному ключу, TPM2 или их сочетанию. Копирование blob на другой сервер не гарантирует успешного расшифрования. Продумайте восстановление после замены ОС или оборудования и не храните единственную доступную копию рабочего секрета в непереносимом виде.

Для ротации создайте новый blob, замените его контролируемо и перезапустите потребителя. После успешной проверки отзовите старый токен у целевого сервиса. Credentials защищают способ передачи, но не делают секрет недоступным скомпрометированному процессу, которому он выдан, или администратору хоста.

systemd: секрет выдаётся конкретной службе
Схема SYSADM.VIP: systemd: секрет выдаётся конкретной службе.

Источник материала: Секреты служб Linux через systemd credentials: передача без паролей в unit-файле (англоязычный материал разработчиков). Русскоязычная инструкция подготовлена самостоятельно; технические сведения проверены 11 октября 2026 года.

ORIGINAL / ATTRIBUTION

Источник материала

Материал переработан для SYSADM.VIP. Оригинальный источник указан ниже.

Оригинал статьи на systemd.io ↗

https://systemd.io/CREDENTIALS/

Материал проверен 11.10.2026. При изменении программного обеспечения сверяйтесь с актуальной документацией.
← Вернуться в базу знаний