Ubuntu Ubuntu Linux

Ubuntu Linux: после смены пользователя ломаются права на сокет

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

После смены пользователя службы Ubuntu старый UNIX-сокет может остаться во владении прежней учётной записи либо его каталог принадлежит root. При этом процесс запускается, но клиенты получают Permission denied или Connection refused. Безопасность прав сокетов важнее быстрого запуска через chmod 777.

В этой статье
  1. Что означает проблема и кому подходит инструкция
  2. Возможные причины и отличительные признаки
  3. Диагностика и пошаговое устранение
  4. Как убедиться, что неисправность устранена
  5. Если результат не получен

#Что означает проблема и кому подходит инструкция

После смены пользователя службы Ubuntu старый UNIX-сокет может остаться во владении прежней учётной записи либо его каталог принадлежит root. При этом процесс запускается, но клиенты получают Permission denied или Connection refused. Безопасность прав сокетов важнее быстрого запуска через chmod 777.

#Возможные причины и отличительные признаки

Возможная причинаКак узнатьЧто делать
Сокет остался от прошлого процессаФайл сокета или его каталог создан старой учётной записью.stat показывает прежнего владельца.Определить службу-создателя и штатный способ перевыпуска.
Клиент не входит в нужную группуСокет создан с правами 0660, но клиент не состоит в группе.id и stat отличаются.Настроить узкую группу доступа после оценки.
Сокет создаёт systemd.socketПрава и владелец задаются SocketUser, SocketGroup, SocketMode, а не только service User.systemctl list-sockets показывает нужный адрес.Исправить настройку собственного socket-unit.

#Диагностика и пошаговое устранение

  1. 1. Уточните путь сокета и сообщение ошибкиОткройте Терминал Ubuntu. Посмотрите журнал приложения-клиента и службы, найдите абсолютный путь к сокету. Permission denied означает отказ доступа, Connection refused часто означает, что никто не слушает или процесс завершён. Не стирайте файл сокета, пока не проверили, кто его использует.
  2. ss может не показывать владельца процессов без административных прав
    Linux · Терминал (Bash)Команда
    ss может не показывать владельца процессов без административных прав.
    systemctl list-sockets --all
    ss -xlpn
  1. 2. Проверьте владельца файла и каталоговПодставьте реальный путь к сокету вместо /run/app/app.sock. Команды stat и namei -l покажут владельца, группу и доступность всех родителей. Для подключения к сокету нужен доступ к самому сокету и возможность пройти по каталогам.
    Linux · Терминал (Bash)Команда
    Путь демонстрационный, ничего не удаляйте.
    stat /run/app/app.sock
    namei -l /run/app/app.sock
  1. 3. Определите, кто создаёт сокетПроверьте существование ИМЯ.socket и ИМЯ.service через systemctl status/cat. Socket-activated служба получает сокет от systemd, тогда изменение User= у сервиса не обязано менять владельца. Если сокет создаёт само приложение, ищите его umask и конфигурацию пути.
    Linux · Терминал (Bash)Команда
    Если .socket не существует, изучите настройки самого приложения.
    systemctl cat ИМЯ.socket
    systemctl cat ИМЯ.service
    systemctl list-sockets --all
  1. 4. Сверьте пользователей и группыПосмотрите id ИМЯ_КЛИЕНТА и getent group НУЖНАЯ_ГРУППА — это покажет права клиентского процесса. На службе под DynamicUser= постоянные UID не подходят для закрепления на диске. Не добавляйте всех пользователей в privileged-группы docker, adm и root ради одного сокета.
  2. Подставьте действительные имена; имя клиента может означать системную службу
    Linux · Терминал (Bash)Команда
    Подставьте действительные имена; имя клиента может означать системную службу.
    id ИМЯ_КЛИЕНТА
    getent group НУЖНАЯ_ГРУППА
  1. 5. Исправьте права через создателя сокетаДля собственного socket-unit используйте соответствующие SocketUser/SocketGroup/SocketMode в drop-in после резервной копии. Для сокета приложения настраивайте его штатную директорию выполнения, RuntimeDirectory, и umask. После перезапуска сокет обычно создаётся заново с нужными правами, поэтому ручной chmod на одном файле временный.
  2. Дополнительная команда по теме
    Linux · Терминал (Bash)Команда
    Не даётся универсальная команда chmod/chown из-за риска открыть локальный канал всем пользователям.
    systemctl cat ИМЯ.socket
  1. 6. Проверьте клиента после контролируемого перезапускаПосле согласованного изменения конфигурации и перезапуска сервиса/сокета повторите stat и тест подключения из-под клиента. Не перезапускайте системные сокеты на рабочем сервере без планового окна: соединения могут разорваться. Если ошибка сохранилась, проверяйте фактическую группу процесса и SELinux/AppArmor отдельно.
    Linux · Терминал (Bash)Команда
    Ожидаются правильные владелец/группа/режим и успешный запрос клиентского приложения.
    stat /run/app/app.sock
    ss -xlpn

#Как убедиться, что неисправность устранена

Решение подтверждено после нового создания сокета и успешного подключения только тех пользователей, которым оно разрешено. Универсальный режим 0777 здесь неприемлем.

#Если результат не получен

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

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.