Права файлов, umask и SSH-ключи
В прошлом уроке определили роли оператора и службы. Теперь свяжем их с файлами. Приложению нужно читать исходники и конфигурацию, иногда писать вложения и временные данные. Оператору нужно собирать наблюдения и управлять выпуском. Если всем разрешить изменять всё, приложение может случайно повредить собственные файлы, а диагностический документ перестанет иметь понятного владельца.
Начнём с обычных объектов внутри ops-lab. Они принадлежат вам, поэтому можно изучить биты доступа без изменения системной службы. Для реального размещения позже понадобится отдельный договор владельцев. Не переносите числовые разрешения из урока на всё дерево сервера: назначение файла и назначение каталога различаются, а учётная запись процесса имеет значение.
Три класса доступа
Длинный вывод ls показывает разрешения владельца, группы и остальных. Для обычного файла r означает чтение, w — изменение содержимого, x — возможность исполнения. Числовая форма складывает биты 4, 2 и 1 для каждого класса. Поэтому 640 означает чтение и запись владельцу, чтение группе и отсутствие доступа остальным.
ls -l config/accounts.md
chmod 640 config/accounts.md
ls -l config/accounts.md
Эта операция изменяет учебный документ, а не владельца. Если файл принадлежит другому пользователю, разрешение на изменение режима может отсутствовать. Команда chmod и назначение владельца решают разные задачи. В справке chmod описаны числовой и символьный способы; используйте тот, который яснее выражает требуемое изменение.
Символьная запись u+x добавляет исполнение владельцу, сохраняя другие биты. Полное числовое значение задаёт выбранный набор режима. Для сценария удобно осознанно добавить необходимый бит, но при подготовке известной конфигурации иногда требуется точное состояние. Не выбирайте форму по краткости: коллега должен понимать, какие существующие разрешения сохраняются, а какие заменяются.
Каталог нужно пройти
У каталога чтение позволяет получить список имён, исполнение — искать объекты по имени и проходить путь, запись — изменять набор записей при соблюдении других условий. Поэтому читаемый файл внутри непроходимого каталога может оставаться недоступным. Ошибка чтения не всегда исправляется изменением самого последнего файла; нужно рассмотреть каждый компонент пути.
В архиве есть fixtures/private-note.txt. Сделайте отдельную копию в evidence/private-demo/note.txt, как описано в состоянии 07, и назначьте папке 700, а файлу 600. Такой набор оставляет доступ владельцу. Это небольшой пример роли, а не универсальная политика для веб-сервера. Служба с другим UID не сможет прочитать документ только потому, что знает его полный путь.
Обратная ситуация тоже важна: возможность изменять каталог может позволить удалить или заменить файл, который нельзя редактировать напрямую. Права записи самого файла и управление его именем находятся на разных объектах. Поэтому конфигурацию выпуска нельзя защищать только битами последнего файла, оставляя родительскую папку доступной для произвольной записи процесса приложения.
Маска влияет на создание
umask исключает разрешения из режима, запрошенного при создании объекта. Она не меняет существующие файлы и не добавляет возможности сверх запроса программы. Посмотрите текущую маску, затем попробуйте отдельный пример в дочерней оболочке. После её завершения основная оболочка сохранит прежнюю настройку.
umask
( umask 077; printf 'demo\n' > evidence/private-mask.txt )
ls -l evidence/private-mask.txt
Для нового обычного текстового файла ожидается доступ только владельцу. Если файл уже существовал, перенаправление не обязано пересоздать его режим, поэтому опыт с прежним именем может не показать действие маски. Используйте новое имя или сначала установите известное исходное состояние. В диагностике важно различать создание объекта и изменение его содержимого.
Маска не заменяет договор ролей. Например, 077 подходит для личного файла наблюдения, но может мешать общему чтению согласованной группой операторов. Для группового каталога потребуется осмысленный режим и назначение группы. Сначала определите аудиторию данных, затем выбирайте маску; автоматическое применение одной цифры ко всем задачам часто создаёт новые отказы доступа.
SSH использует пару ключей
Закрытый SSH-ключ остаётся у владельца и подтверждает его право входа. Открытый ключ передаётся на сервер и может находиться в authorized_keys соответствующего аккаунта. Суффикс .pub обычно обозначает открытый файл. Перед передачей проверяйте назначение объекта, а не только похожее имя: перепутанная сторона пары меняет смысл всей операции.
В этой серии не создаём и не копируем настоящие ключи. В config/ssh-policy.md записываем выбранный аккаунт оператора, способ подтверждения имени сервера и правило хранения закрытой части. Для повторения используйте отдельную пару лаборатории, подготовленную по руководству Ubuntu OpenSSH. Служебной записи deskqueue интерактивный вход не нужен.
Первое подключение требует проверки ключа сервера через доверенный источник. Просто принять неизвестный отпечаток означает согласиться с тем, что предложенный сервер является нужным. Пароль или клиентский ключ не выполняют эту проверку вместо вас. В учебном стенде отпечаток можно получить через консоль созданной машины, затем сопоставить его с показанным при подключении.
Почему доступ может быть отвергнут
Если ключ не принимается, разделите причины: выбран другой аккаунт, открытый ключ не размещён в его файле, пути и владельцы не соответствуют политике, либо сервер применяет другое правило аутентификации. Попытка поставить широкие разрешения на .ssh может ухудшить ситуацию, потому что сервер ожидает контролируемое владение важными файлами. Нужен точный диагноз, а не максимальные биты доступа.
Тот же подход используем при запуске приложения. Запишите пользователя процесса, файл, действие и полный путь. Затем сравните договор: должен ли этот пользователь вообще иметь выбранное право? Иногда исправлением является другой каталог для записи, а не разрешение изменять исходники. Такие решения делают устройство сервиса понятнее и упрощают последующий выпуск новой версии.
Результат главы — несколько учебных режимов доступа и документированная политика SSH без настоящих ключей в архиве. Мы понимаем различие файла и каталога, существующего объекта и маски создания, оператора и службы. На следующем шаге рассмотрим процессы: как узнать, что запущено, остановлено или завершено и почему имя программы не всегда достаточно для выбора действия.