Является ли подкаталог / tmp подходящим местом для сокетов Unix?

Я ищу безопасное место для размещения сокетов домена Unix, которые будут использоваться для управления REPL.

В Linux я бы использовал /run/user/$UID , который отвечает всем требованиям, за исключением переносимости. Мне нужна программа, которая обрабатывает их, чтобы они были переносимыми.

Один из вариантов заключается в использовании каталога с именем ~ но это сталкивается с другой проблемой: домашний каталог пользователя может находиться в слишком глубоком каталоге, чтобы иметь возможность связывать сокет домена Unix, из-за ограничения длины пути.

Размещение сокета в каталоге под /tmp переносимо, но я беспокоюсь о состоянии гонки при удалении каталога. Меня также беспокоит, можно ли полагаться на /tmp чтобы установить липкий бит на всех платформах (то есть, чтобы пользователи не могли удалять или переименовывать временные файлы другого пользователя). Я предполагаю, что /tmp IS липкий, однако, поскольку в противном случае многие приложения (каждый скрипт, который использует mkstemp ), небезопасны.

Мой текущий план заключается в том, чтобы сервер создал временный каталог в /tmp , а для клиентов – проверить принадлежность содержащего каталога перед использованием сокета. Насколько это безопасно?

One Solution collect form web for “Является ли подкаталог / tmp подходящим местом для сокетов Unix?”

Стандартное местоположение de jure для временных файлов указано в переменной среды TMPDIR .

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

На самом деле многие системы не определяют TMPDIR . Фактически стандартное расположение временных файлов – /tmp . Поэтому проверьте TMPDIR , и если он не установлен, используйте /tmp . В сценарии оболочки вы можете использовать ${TMPDIR:-/tmp} , или если вы считаете его более удобным,

 if [ -z "$TMPDIR" ]; then TMPDIR=/tmp; fi 

или справиться с set -u

 : "${TMPDIR:=/tmp}" 

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

  • Когда вы создаете обычный файл, всегда убедитесь, что вы не переписываете существующий файл, который может и не принадлежать вам. Не используйте для этого перенаправление оболочки. Нельзя проверять право собственности отдельно, поскольку противник может перемещать символические ссылки, пока ваша программа работает, чтобы обмануть проверки. Кроме того, вы не можете полагаться на определенное имя, которое не существует; чтобы предотвратить одновременное создание параллельной программы путем создания файла с тем же именем непосредственно перед вами, используйте случайное имя. Вы можете использовать утилиту mktemp (широко распространенную, присутствующую в GNU, BusyBox, BSD, но не POSIX) или mkstemp библиотеки mkstemp C. Под капотом open или creat следует вызывать с флагом O_EXCL .
  • Вы можете создать каталог с помощью mkdir . Это безопасно воровство владения, поскольку оно не будет повторно использовать существующий файл, но оно подвержено такому же отказу в обслуживании, что и обычные файлы, поэтому вы должны использовать случайное имя. mktemp -d – прекрасный способ сделать это.
  • Вы можете создать сокет (для этого нет стандартной утилиты оболочки). Как и в случае с каталогом, он защищен от обмана владельца, но не против отказа в обслуживании.
    Linux соблюдает разрешения на именованные сокеты, но есть варианты Unix, которые этого не делают. Вот почему сокеты в /tmp обычно создаются в подкаталогах.

Программы, которые создают подкаталог /tmp (или $TMPDIR если установлен) и создают именованный сокет, включают в себя серверы X11, ssh-agent, gpg-agent, KDE, emacs, … (это только те, которые существуют на машине, где я это сообщение). Как вы можете видеть, вы будете в хорошей компании.

  • Как сообщить размер очереди приема для сокетов AF_UNIX
  • SUS v4 не сможет сертифицировать Bell Labs unix v8, потому что unix изменился правильно?
  • Получить временную последовательность в Unix?
  • Что означает Unix-программирование?
  • Философия Unix была оставлена ​​в дизайне веб-приложений?
  • Почему существует AF_NETLINK? Недостаточно AF_UNIX?
  • Почему длина пути сокета ограничена до сотни символов?
  • Объяснение непрофессионала для «Все - файл» - что отличается от Windows?
  • Как программы UNIX взаимодействовали друг с другом, до изобретения трубы?
  • Можно ли использовать сокет, если его файл доступен только для чтения?
  • Сигнал дистанционного управления
  • Linux и Unix - лучшая ОС в мире.