о чем мне следует беспокоиться при использовании mktemp –dry-run

Вопрос или проблема

Я пытался создать временный именованный fifo и, ссылаясь на Bash: создать анонимный fifo, увидел, что они используют mktemp -u, чтобы получить имя файла для fifo. В руководстве указано, что это небезопасно.

-u, --dry-run
       не создавать ничего; просто напечатать имя (небезопасно)

Почему это небезопасно и как использовать эту технику ответственно?

Что они имели в виду под “небезопасно” выше, это следующее. Представим такую ситуацию:

  • Вы запускаете mktemp -u
  • Он выводит имя, например, /tmp/tmp.njxOsokU9u
  • Вы сохраняете это имя где-то, предположительно в переменной bash (например, tmp)
  • Ваш скрипт выполняет какую-то работу, не связанную с этим файлом
  • Ваш скрипт затем пытается использовать временный файл (echo hello > $tmp)

Вроде все нормально, да? Вот подобная ситуация:

  • Вы запускаете mktemp -u
  • Он выводит имя, например, /tmp/tmp.njxOsokU9u
  • Вы сохраняете это имя где-то, предположительно в переменной bash (например, tmp)
  • Ваш скрипт выполняет какую-то работу, не связанную с этим файлом
  • Некоторый другой процесс, не связанный с вашим скриптом, создает файл с тем же именем (т.е. /tmp/tmp.njxOsokU9u)
  • Ваш скрипт затем пытается использовать временный файл (echo hello > $tmp)

Теперь ваш скрипт и другой процесс могут писать в один и тот же файл, что, вероятно, закончится плохо. Поэтому это помечено как небезопасно.

В контексте mktemp, “безопасно” означает защищенность от непреднамеренного вмешательства других программ, особенно в результате конфликта имен. mktemp пытается дать вам некоторую уверенность, что, хотя ваш файл находится в файловой системе, общей с множеством других программ, ваш скрипт, вероятно, будет единственным, кто взаимодействует с файлом. mktemp обрабатывает это для вас тремя способами:

  1. Он создает имена со случайными символами, поэтому они вряд ли будут совпадать с именами других программ (или других запущенных экземпляров того же скрипта).
  2. Он задает разрешения на файл так, чтобы он был доступен для чтения и записи только владельцу, что ограничивает количество других программ, которые могут его нарушить.
  3. Он проверяет, что имя уже не используется. Иными словами, он проверяет, что файл еще не существует.

Тестовый запуск mktemp не может обрабатывать для вас разрешения (#2), но это достаточно легко сделать самому с помощью chmod, если нужно.

Проблема, о которой вас предупреждает документация mktemp, это #3. Хотя вызов mktemp в текущем скрипте обеспечит, что имя еще не используется на данный момент, это не передается другим программам. Следовательно, другая программа или параллельный вызов того же скрипта могут снова вызвать mktemp и получить тот же временный путь к файлу.

Единственное время, когда вам следует использовать mktemp --dry-run, это для программ, которые не позволяют своему выходному файлу или директории уже существовать. Многие программы имеют опцию типа -f или --force, чтобы игнорировать и перезаписывать выходной файл, хотя это также может иметь другие нежелательные эффекты.

Если вы используете mktemp --dry-run, вы должны рассмотреть другие действия, чтобы уменьшить вероятность конфликта имен, а именно:

  1. Увеличьте количество случайных символов в имени файла (функция mktemp #1, выше).
  2. Минимизируйте количество времени между вызовом mktemp --dry-run и моментом, когда файл будет создан. Также можно позволить mktemp создать файл и удалить его непосредственно перед тем, как другая команда создаст файл по временному пути.

Ответ или решение

Когда вы используете команду mktemp --dry-run, существует ряд проблем, которые стоит принять во внимание. Первая и основная проблема связана с безопасностью в плане коллизии имен. При использовании mktemp --dry-run или mktemp -u, программа не создает файл, а просто генерирует уникальное имя. Это означает, что существует вероятность, что другой процесс может занять это имя, прежде чем ваш скрипт успеет его использовать. Давайте рассмотрим подробно, почему это небезопасно и как минимизировать риски.

Почему использование mktemp --dry-run небезопасно?

Коллизии Имен: Поскольку mktemp --dry-run просто выдает имя без его создания, другая программа может создать файл с тем же именем. Это может привести к обмену данными и несанкционированному доступу к информации, которая может оказаться критически важной.

Отсутствие управления правами: В отличие от стандартной работы mktemp, которая создает файл с определенными правами доступа (только для владельца), --dry-run этого не делает. Это может привести к тому, что файл будет доступен не только для вашей программы, но и для других, что может вызвать проблемы с безопасностью.

Как безопасно работать с mktemp --dry-run?

  1. Увеличьте Количество Случайных Символов: Вы можете модифицировать шаблон имени, чтобы он содержал больше случайных символов. Это уменьшит вероятность того, что другое приложение создаст файл с таким же именем. Например, можно использовать mktemp --dry-run -u /tmp/myfifo.XXXXXX.

  2. Снизьте Задержку Использования Имени: Убедитесь, что время между генерацией имени и его использованием минимально. Это уменьшит шансы того, что другой процесс успеет создать файл с таким же именем.

  3. Создавайте и Немедленно Удаляйте: Можно создать файл с помощью полного mktemp, затем сразу его удалить перед использованием имени для создания FIFO или другого файла. Это даст вам больше уверенности в безопасности операции и избежит коллизий имен.

  4. Используйте Уровень контроля Для Программно-созданных Файлов: Некоторые программы имеют возможность не перезаписывать существующие файлы (например, без использования опции -f или --force). Убедитесь, что такие опции используются, чтобы предотвратить случайные изменения файлов.

Заключение

Использование mktemp --dry-run может быть полезным в определенных ситуациях, когда важен лишь предварительный просмотр имени файла или директории. Однако необходимо следовать приведенным выше рекомендациям, чтобы минимизировать риски и обеспечить надежное выполнение скриптов. Дополнительное внимание к этим аспектам поможет вам избежать критических ошибок и защитить вашу данные и коды от непредвиденных случаев.

Оптимизация:

  • Тегирование: включите такие ключевые слова, как "безопасность скриптов", "коллизия имен", "управление файлами в Linux", чтобы улучшить поисковую оптимизацию.
  • Читабельность: Использование структурированного подхода и четких перечней (bullet points) может помочь легко воспринимать информацию и удерживать внимание читателя.
Оцените материал
Добавить комментарий

Капча загружается...