Назад | Перейти на главную страницу

Каковы идеальные разрешения unix для обычных каталогов веб-проектов?

Каковы идеальные минимальные разрешения в восьмеричном формате для написанного веб-приложения?

  1. Каталог, в котором будут находиться загруженные пользователем статические файлы (файлы изображений / swf / js).
  2. Каталог, в котором будут находиться статические файлы, загруженные администратором (файлы изображений / swf / js).
  3. Каталог, в котором находятся библиотеки, используемые в приложении.
  4. Каталог, в котором будут находиться исполняемые / просматриваемые скрипты на стороне сервера.
  5. Каталог, в котором уже существующие файлы (txt или xml) будут редактироваться кодом на стороне сервера.

Вот мои предложения и обоснования

  1. 555, каждый может читать и писать, никто не может выполнять
  2. 544, только владелец может писать, все остальные могут только читать, никто не может выполнять
  3. 000, никому не нужно читать, писать или выполнять, будет ли использоваться только веб-сервером?
  4. 661, владелец может читать, писать, все остальные могут только выполнять
  5. 600, владелец может читать, писать (может не понадобиться), больше никто ничего не может сделать

Теперь меня интересуют две вещи:

  1. Есть ли что-то, что обычно используется в веб-приложениях, что я пропустил в первом списке?
  2. Есть ли что-то, с чем вы не согласны во втором списке, какова ваша альтернатива и почему она лучше?

Предполагая, что «веб-приложение» работает на сервере (например, apache, nginx и т. Д.) И написано на каком-то динамическом языке сценариев (например, PHP, Ruby и т. Д.), Вы не понимаете, кто такой «пользователь».

Пользователь - это не человек, который вошел в ваше приложение, и его роль в приложении (администратор и т. Д.) Совершенно не имеет отношения к сценарию. Пользователь - это пользователь системы Linux, в которой выполняется процесс. Код вашего веб-сайта запускается только одним пользователем - это может быть пользователь вашего веб-сервера (что на самом деле не очень хорошо), или это может быть пользователь, специфичный для вашего сайта (что намного лучше).

В Linux пользователи принадлежат группам - мы можем добавить пользователя в другую группу и назначить ей права.

При хорошей настройке ваш сервер будет работать как один пользователь (назовем этого пользователя «веб-сервер»), а ваш динамический язык сценариев будет работать (например, через FastCGI) как собственный пользователь (один пользователь на сайт - назовем нашего первого пользователя «site1») .

Для обслуживания ваших файлов веб-серверу необходим доступ к ним, а языку сценариев - доступ к ним. Это означает: «site1» и «веб-сервер» должны иметь возможность читать ваши файлы. Однако только один из них может «владеть» файлами. Владелец - «пользователь» (пользователь, группа, другие). Нам также нужен наш язык сценариев, чтобы иметь возможность писать в каталог (и читать файлы, которые он написал). Следовательно, пользователю site1 требуются разрешения на чтение и запись. Поскольку мы хотим, чтобы групповые и другие разрешения были максимально ограниченными, нашим «владельцем» будет «site1», а соответствующие разрешения пользователя будут доступны для чтения и записи.

Поскольку мы не можем указать разрешения для нашего веб-сервера в качестве другого «пользователя», мы добавим «веб-сервер» в группу «site1» (вы, конечно, можете создать другую группу, содержащую как «site1», так и «веб-сервер». Все членам этой группы будут предоставлены одинаковые разрешения. Самые слабые разрешения (пользователя, группы или другого набора) будут применяться к любому данному пользователю для определения их разрешений.

Стоит отметить, что хорошая установка не должна требовать, чтобы файлы имели права на выполнение для динамического языка. Файлы не запускаются напрямую, а скорее считываются интерпретатором - для запуска типичного сценария (который ничего не записывает) необходимы только разрешения на чтение.

Разрешение на выполнение для каталогов имеет другое значение - оно разрешает обход без возможности чтения содержимого. Чтобы иметь возможность читать файл в каталоге, пользователь должен иметь права на выполнение для КАЖДОГО каталога над ним.

Для веб-приложения каждый файл должен иметь разрешения на чтение от своего владельца - в противном случае это довольно бессмысленный файл. Независимо от того, загружает ли файлы (через ваше веб-приложение) пользователь или администратор, «владельцу» (т.е. динамическому языку) требуются права на запись. Эффективная установка будет пытаться обслуживать статические файлы напрямую через веб-сервер, поскольку динамические языки, как правило, медленны при чтении больших файлов и отображении содержимого. Поэтому веб-серверу требуется доступ для чтения к вашим статическим файлам.

Следовательно, минимальные права доступа к файлам могут быть:

  • Файл в каталоге, в котором будут находиться загруженные пользователем статические файлы (файлы images / swf / js): 640
  • Файл в каталоге, в котором будут находиться статические файлы, загруженные администратором (файлы images / swf / js): 640
  • Файл в каталоге, в котором находятся библиотеки, используемые в приложении: 400 (или 440)
  • Файл в каталоге, в котором будут находиться исполняемые / просматриваемые скрипты на стороне сервера: 400 (или 440)
  • Файл в каталоге, где уже существующие файлы (txt или xml) будут редактироваться кодом на стороне сервера: 640 или 600
    • (зависит от того, будет ли их отображать веб-сервер, иногда без изменений)

Хотя минимальные права доступа к каталогу могут быть:

  • Каталог, в котором будут находиться загруженные пользователем статические файлы (файлы images / swf / js): 750
  • Каталог, в котором будут находиться статические файлы, загруженные администратором (файлы images / swf / js): 750
  • Каталог, в котором находятся библиотеки, используемые в приложении: 500 (или 550) [должно быть не менее 510]
  • Каталог, в котором будут находиться исполняемые / просматриваемые скрипты на стороне сервера: 500 (или 550) [должно быть не менее 510]
  • Каталог, в котором уже существующие файлы (txt или xml) будут редактироваться кодом на стороне сервера: 750 или 700
    • (зависит от того, будет ли веб-сервер обслуживать файлы отсюда, иногда без изменений)

Еще раз - ваш веб-сервер должен иметь разрешения на выполнение для каждого каталога, выше того, к которому ему нужен доступ - поэтому, даже если веб-сервер не будет обслуживать файлы из данного каталога, мы должны предоставить ему разрешения на выполнение.

Довольно часто веб-серверу предоставляется доступ для чтения к большинству файлов (поэтому измените эти 500 на 550). По умолчанию «несколько безопасные» разрешения обычно составляют 755 для каталогов и 644 для файлов - нет разрешений на выполнение, каждый может читать, и только пользователь может писать - вы заметите, что подавляющее большинство файлов в системе Linux имеют эти разрешения.

Имейте в виду, что «прочие» разрешения относятся к любому пользователю системы, который не является владельцем или членом группы (то есть всем остальным пользователям системы). Сохранять ограничения для ваших «других» разрешений - это хорошо, потому что эти пользователи неизвестны - вы явно не дали им разрешение. Другие разрешения часто проще всего использовать в скомпрометированной системе (например, одна из причин, почему / tmp является общей целью).

В контексте вышеизложенного я не думаю, что ваши последние два вопроса актуальны. Установите права доступа к каталогу на 550 (и права доступа к файлам на 440), а затем предоставьте пользователю права на запись для любых каталогов, в которые ваше приложение будет писать (т.е. каталог: 750; файл: 640).

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

Наличие минимального набора разрешений для выполнения работы - это нормально. Если у вас есть веб-сервер и пользователи используют общую группу, вы можете удалить необходимость предоставления доступа к o. Разрешения также связаны с пользователями. Вы, кажется, неправильно поняли восьмеричные разрешения.

  1. 555 это r-xr-xr-x не rw-rw-rw. Поскольку это каталог, то для создания / удаления файлов вам необходимо иметь x установить так 750 rwxr-x--- было бы хорошим местом для начала. Это позволяет пользователю, которому принадлежит каталог, добавлять / удалять файлы, а всем участникам общей группы - получать к ним доступ.
  2. То же, что 1. выше.
  3. Если они действительно статические файлы, то 050 предоставит доступ веб-серверу, однако для создания файлов в первую очередь 750 будет минимальным.
  4. То же, что и 3 выше.
  5. 070 - это минимум, позволяющий веб-серверу читать и изменять файлы, но файлы должны быть созданы, поэтому 770, вероятно, более реалистичен.

В общем случае для каталогов можно использовать режим 0755, 0775 или 2775 (бит SGID для каталогов, для BSD и для Linux, если файловая система смонтирована с семантикой BSD, приведет к тому, что групповая ассоциация новых файлов будет соответствовать настройкам родительского каталога, а не GID по умолчанию создателя файла). Это позволяет всем пользователям проходить (входить и проходить через chdir) и читать (запускать команду ls или выполнять системные вызовы readdir / read) рассматриваемые каталоги. Альтернативы добавляют параметры группировки / записи и, как уже отмечалось, бит SGID в каталогах может помочь сохранить все файлы и подкаталоги, связанные с подходящей группой.

Для файлов обычно используется 0644 или, возможно, 0664 (доступно для чтения всем и либо для группы, либо для записи). Очевидно, что для сценариев CGI и двоичных файлов необходимо добавить x-бит; а для некоторых особых ситуаций с очень хорошо протестированными двоичными файлами можно добавить биты SUID или SGID. Обычно UNIX и Linux игнорируют бит SUID / SGID в сценариях и учитывают его семантику только для скомпилированных исполняемых двоичных файлов в собственном коде. Однако вы можете запускать свой сайт под чем-то вроде Apache с каким-то модулем вроде "setuidhack", который можно использовать, чтобы заставить веб-сервер учитывать биты SUID / SGID даже в интерпретируемых скриптах. (Это делается с помощью HTTP-демона stat (), который загружает каждый файл и использует свой собственный код fork () / execve (), интерполируя правильную строку интерпретатора в вектор execve (), а не просто передавая имя исполняемого файла непосредственно в execve () системный вызов).

Это всего лишь самые общие рекомендации. Они не «идеальны» для всех ситуаций, и вам обязательно нужно проконсультироваться с документацией для вашего веб-сервера и любого веб-приложения или фреймворков, которые вы устанавливаете и настраиваете ... и вы, вероятно, захотите проконсультироваться со специалистом по безопасности UNIX, прежде чем вы размещать любые ваши файлы, код или серверы в общедоступном Интернете.