Как мне скрыть каталоги в Apache, в частности систему управления версиями?

Я хочу, чтобы мой веб-сайт / сайты находились под контролем версий (в частности, Subversion) и использую svn co для его обновления, когда есть стабильные версии для обновления, но меня беспокоит безопасность этого, поскольку все папки .svn будут общедоступными, и они включают в себя всевозможные личные данные, не в последнюю очередь полный исходный код моего веб-сайта!

Что я могу сделать, чтобы предотвратить это?


person Matthew Scharley    schedule 18.10.2008    source источник


Ответы (7)


Две вещи:

  1. Не используйте IfModule для функций, которые вам необходимы. Это нормально сделать для автоиндекса, потому что он может отсутствовать и не имеет решающего значения для схемы. Но вы рассчитываете на присутствие перезаписи, чтобы защитить свой контент. Таким образом, лучше удалить директиву IfModule и позволить apache сообщать вам, когда перезапись отсутствует, чтобы вы могли ее включить (или, по крайней мере, знать, что вы не будете `` защищены '' и сознательно комментируете строки)

  2. Нет необходимости использовать перезапись, если у вас есть доступ к основным файлам конфигурации, гораздо проще было бы использовать один из

    <DirectoryMatch \.svn>
       Order allow,deny
       Deny from all
    </DirectoryMatch>
    

который будет генерировать 403 Forbidden (что лучше с точки зрения соответствия HTTP), или, если вы хотите использовать безопасность путем скрытия маршрута, используйте AliasMatch

    AliasMatch \.svn /non-existant-page

Если у вас нет доступа к основным файлам конфигурации, вам остается надеяться, что mod_rewrite включен для использования в .htaccess.

person Vinko Vrsalovic    schedule 18.10.2008
comment
Я понимаю смысл 403. Лично (в такой ситуации, когда файлы никогда не должны обслуживаться), я бы предпочел, чтобы они даже не знали о существовании каталогов. Я тоже попробую AliasMatch. Это то, что мне удалось почерпнуть из Google, я всегда рад лучшим решениям. - person Matthew Scharley; 18.10.2008
comment
обратите внимание, что это не работает в файлах .htaccess, если вы пытаетесь сделать это на общем / виртуальном хосте. Используйте ответ Monoxide, если у вас нет доступа к файлу httpd.conf. stackoverflow.com/questions/214886/#214887 - person nickf; 20.10.2008
comment
Истинный. Есть вероятность, что mod_rewrite не будет включен для использования в файлах .htaccess. (Указывается, если ваш сервер несколько снисходителен к тому, что в них разрешено) - person Vinko Vrsalovic; 20.10.2008
comment
Вы также можете использовать это решение с RedirectMatch, которое дает примерно те же результаты и доступно для файлов .htaccess. Это немного более запутанное решение, но оно тоже работает, если у вас нет доступа к mod_rewrite. - person Matthew Scharley; 21.10.2008
comment
вам нужно будет вынуть пустое пространство из разрешить, запретить в последних версиях apache - person ldg; 16.07.2011

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

Теперь я считаю стандартной частью моих .htaccess файлов:

## Completely hide some files and directories.
RedirectMatch 404 "(?:.*)/(?:[.#].*)$"
RedirectMatch 404 "(?:.*)~$"
RedirectMatch 404 "(?:.*)/(?:CVS|RCS|_darcs)(?:/.*)?$"
person Gilles 'SO- stop being evil'    schedule 08.07.2010

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

RewriteEngine On
RewriteRule /\.svn /some-non-existant-404-causing-page

<IfModule autoindex_module>
    IndexIgnore .svn
</IfModule>

Первый раздел требует mod_rewrite. Он заставляет любые запросы с «/.svn» в них (т. Е. Любой запрос каталога или что-либо внутри каталога) быть внутренне перенаправленными на несуществующую страницу вашего веб-сайта. Это полностью прозрачно для конечного пользователя и не поддается обнаружению. Это также вызывает ошибку 404, как если бы ваши .svn папки просто исчезли.

Второй раздел носит чисто косметический характер и скроет .svn папок из модуля автоиндекса, если он активирован. Это тоже хорошая идея, просто для того, чтобы любопытные души не догадывались.

person Matthew Scharley    schedule 18.10.2008
comment
Вставлено непосредственно в файл .htaccess, у меня это не сработало. Что именно имеется в виду, если ваш сервер несколько снисходителен к тому, что в них разрешено? - person Nate; 13.12.2012
comment
У вас должен быть включен mod_rewrite, чтобы это работало. Если это не так, то либо он у вас не включен (что должно вызвать ошибки в журналах серверов), либо вы испортили регулярное выражение (вы скрываете подрывную деятельность?) - person Matthew Scharley; 13.12.2012
comment
Я точно скопировал и вставил, и у меня включен mod_rewrite. Не беспокойтесь об этом, ответ @Gilles сработал. - person Nate; 13.12.2012

Я использую следующее, которое возвращает пользователю простой 404, не показывая, что каталог системы управления версиями действительно существует:

RedirectMatch 404 /\.(svn|git)(/|$)

person Erwan    schedule 03.06.2012

Я использую интересный подход: проверка (и обновление) выполняется в совершенно отдельном каталоге (возможно, на совершенно отдельной машине), а затем код копируется туда, где веб-сервер прочитает его с помощью rsync. Правило --exclude в командной строке rsync используется, чтобы не копировать директории .svn (и CVS), а --delete-excluded гарантирует, что они будут удалены, даже если они были скопированы ранее.

Поскольку и svn update, и rsync выполняют инкрементную передачу, это довольно быстро даже для крупных сайтов. Это также позволяет вам иметь ваш репозиторий за брандмауэром. Единственное предостережение заключается в том, что вы должны переместить все каталоги с файлами, сгенерированными на сервере (например, каталог files / в Drupal), в место за пределами целевого каталога rsync (rsync перезапишет все при таком использовании) и символическую ссылку на него. должен быть создан в исходном каталоге rsync. В исходном каталоге rsync могут быть и другие файлы без контроля версий (например, файлы конфигурации для конкретной машины).

Полный набор параметров rsync, которые я использую,

rsync -vv --rsh='ssh -l username' -rltzpy --exclude .svn/ --exclude CVS/ --exclude Attic/ --delete-after --delete-excluded --chmod=og-w,Fa-x

Даже тогда, для обеспечения избыточности, у меня все еще есть правило конфигурации, предотвращающее доступ к .svn, скопированное из правила по умолчанию Debian, которое предотвращает доступ .ht * (.htaccess, .htpasswd).

person CesarB    schedule 18.10.2008
comment
Я предпочитаю пример AliasMatch встроенным примерам для блокировки доступа к каталогам управления версиями ... Это не просто незначительное нарушение безопасности (просмотр настроек), это серьезное нарушение, если кому-либо когда-либо удавалось проникнуть в них, поэтому 404 кажется подходящим . (это не здесь, иди поищи в другом месте) - person Matthew Scharley; 19.10.2008

Скрытие каталогов, как говорит Винко, должно работать. Но, вероятно, было бы проще использовать экспорт svn вместо svn co. Это не должно создавать каталоги .svn.

person Eric Hogue    schedule 18.10.2008
comment
Возможно, проще, но тогда вы не получите преимущества инкрементных обновлений. Если я изменяю одно изображение и два своих скрипта, действительно ли мне нужно вытаскивать мегабайты (и при этом иметь сайт в режиме обслуживания) вместо нескольких секунд для проверки? - person Matthew Scharley; 18.10.2008
comment
См. Обсуждение на techcrunch.com/2009/09/23/ (там есть комментарий, указывающий на этот пост). С оговоркой, которую вы упомянули (огромный сайт), вы можете получить результат экспорта svn с помощью svn co в другом каталоге и rsync с исключениями, так же, как CesarB предлагает в другом ответе. - person Olaf Kock; 25.09.2009

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

person Jon Topper    schedule 20.10.2008
comment
+1 за хорошую идею, но я использую это и на машинах для разработки, просто чтобы помочь им выглядеть чистыми, когда / если я случайно просматриваю структуры каталогов и тому подобное. - person Matthew Scharley; 21.10.2008
comment
это ужасная идея для веб-приложений - person lucian303; 04.11.2011
comment
Да, я сильно изменил свое мнение по этому поводу за последние пару лет. Я думаю, что это работает нормально, если приложение довольно статично, но в мире непрерывного развертывания развертывание на основе rsync из проверки VCS кажется самым безопасным - код отправляется на серверы, а не извлекается из VCS. - person Jon Topper; 22.11.2011