Это удивительно очень сложная проблема.
Я хочу разрешить моим пользователям Linux входить в Apache2 и иметь доступ только к их собственным каталогам. Мне удалось заставить пользователей Linux аутентифицироваться в Apache2 с помощью PAM, и это отлично работает.
Однако разрешение доступа к их собственным каталогам оказалось настоящей проблемой.
То, как Apache2 работает как обычный пользователь, предотвращает использование индивидуальных прав доступа к файлу, поскольку вошедший в систему пользователь работает как обычный пользователь Apache2.
Я бы предпочел не запускать Apache2 от имени пользователя root и писать модуль, который выполняет setuid (зарегистрированный пользователь) из соображений безопасности.
Есть ли способ разрешить пользователю, вошедшему в систему apache2, динамически обращаться к определенному каталогу?
Спасибо, Цезарь.
Похоже, вы ищете Apache suexec
функция. Как там говорится:
Функция suEXEC предоставляет пользователям Apache возможность запускать программы CGI и SSI под идентификаторами пользователя, отличными от идентификатора пользователя вызывающего веб-сервера. Обычно, когда выполняется программа CGI или SSI, она запускается от имени того же пользователя, который запускает веб-сервер.
При правильном использовании эта функция может значительно снизить риски безопасности, связанные с предоставлением пользователям возможности разрабатывать и запускать частные программы CGI или SSI. Однако, если suEXEC настроен неправильно, это может вызвать любое количество проблем и, возможно, создать новые дыры в безопасности вашего компьютера. Если вы не знакомы с управлением
setuid
root-программы и проблемы безопасности, которые они представляют, мы настоятельно не рекомендуем использовать suEXEC.
Вы можете добавить строку вроде
SuexecUserGroup script_user script_user
к вашим конфигам apache - желательно по отдельностиVirtualHost
основание. Затем укажите каталоги, в которых можно запускать что-то в конфигурации suexec, например /etc/apache2/suexec/www-data
. Затем перезапустите apache и попробуйте.
В Digital Ocean есть руководство что может помочь, если вы делаете это в Ubuntu.
Чтобы положить конец этому. Я нашел модуль mpm_itk, который выполняет setuid. Однако mpm_itk использует предварительно настроенный идентификатор пользователя или выражение регулярного выражения. Невозможно указать использование аутентифицированного пользователя.
Я собирал код mpm_itk для написания собственного модуля.
На самом деле это невозможно только с Apache; даже у mod_dav нет такой возможности, и он был бы там исключительно полезен.
suEXEC не устанавливает uid для uid, для которого apache аутентифицирует (например, HTTP auth), целевой euid фиксируется в конфигурации сервера или виртуального хоста.
Как вы упомянули, вам нужен безопасный setuid CGI, который понижает привилегии до аутентифицированного uid и читает ваши файлы и каталоги для веб-приложения. CGI должен был запускаться как root, а затем setgid и setuid как аутентифицированный пользователь, который, как я полагаю, передается в apache CGI как переменная среды REMOTE_USER. Есть много ошибок, связанных с правильным изменением UID.
Я бы порекомендовал использовать другой протокол, который уже поддерживает такое поведение, например SFTP.