Я ищу безопасное место для размещения сокетов домена Unix, которые будут использоваться для управления REPL.
В Linux я бы использовал /run/user/$UID
, который отвечает всем требованиям, за исключением переносимости. Мне нужна программа, которая обрабатывает их, чтобы они были переносимыми.
Один из вариантов заключается в использовании каталога с именем ~
но это сталкивается с другой проблемой: домашний каталог пользователя может находиться в слишком глубоком каталоге, чтобы иметь возможность связывать сокет домена Unix, из-за ограничения длины пути.
Размещение сокета в каталоге под /tmp
переносимо, но я беспокоюсь о состоянии гонки при удалении каталога. Меня также беспокоит, можно ли полагаться на /tmp
чтобы установить липкий бит на всех платформах (то есть, чтобы пользователи не могли удалять или переименовывать временные файлы другого пользователя). Я предполагаю, что /tmp
IS липкий, однако, поскольку в противном случае многие приложения (каждый скрипт, который использует mkstemp
), небезопасны.
Мой текущий план заключается в том, чтобы сервер создал временный каталог в /tmp
, а для клиентов – проверить принадлежность содержащего каталога перед использованием сокета. Насколько это безопасно?
Стандартное местоположение 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
– прекрасный способ сделать это. /tmp
обычно создаются в подкаталогах. Программы, которые создают подкаталог /tmp
(или $TMPDIR
если установлен) и создают именованный сокет, включают в себя серверы X11, ssh-agent, gpg-agent, KDE, emacs, … (это только те, которые существуют на машине, где я это сообщение). Как вы можете видеть, вы будете в хорошей компании.