Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2009-09-04

apache, mod_proxy, zope in backend, http header authorization

Сегодня я поделюсь страшным секретом.

Проблема: из фронтенда - Apache в бэкенд - Zope/Plone не проходит
заголовок HTTP. Заголовок - Authorization. Apache делает через
mod_proxy реверсное проксирование запроса к бэкенду - Zope/Plone, при
этом пользователь в Apache уже прошел авторизацию. Но в Zope/Plone
заголовки авторизации уже не попадают. В итоге, узнать был ли
авторизован пользователь и какое его имя в Zope/Plone невозможно.
Полная жопа.

Преамбула.

При разработке сайта, состоящего из фронт-енда и бэк-енда (Apache и
Zope/Plone) столкнулся с неприятной неожиданностью. Схема у меня такая:
Apache принимает все запросы и посредством mod_rewrite и mod_proxy
раздает их по подсистемам, бэкендам. Одна из таких подсистем есть
Zope/Plone. И надо было такому случицца, что в плоне один из разделов
не открытый, а закрытый. Нет проблем, подумал я, урл закрытого раздела
известен, я его закрою Apache-ем. Через директиву Location. Закрыл. И
все бы неплохо, да схема такая больше похожа на затыкание дыры пальцем
- все одно течет. Например, система поиска в Zope/Plone выдает куски
текста из закрытого раздела любому, кто знает, что спросить. Правильное
решение проблемы я отложил на потом, а пока решил очередную дыру
закрыть очередным пальцем.

Я решил, что в скриптах Zope/Plone я буду проверять заголовки HTTP на
предмет наличия признаков прохождения аутентификации. Реально, должен
быть в наличии заголовок Authorization. И/или переменная CGI -
REMOTE_USER. Короче, в скриптах связанных с поиском буду искать эти
заголовки и при их отсутствии отсекать выдачу информации о закрытых
страницах. Изи. И тут я наступил на грабли. О том как эти грабли
прикопать я и песню пою.

Грабли в том, что в Zope/Plone я не могу увидеть заголовки и/или CGI
переменные среды связанные с процессом авторизации протокола HTTP,
созданные Apache-ем. Либо Apache при проксировании режет эти заголовки,
либо Zope/Plone их срубает. На линии браузер-апач заголовки прекрасно
видны, Firebug их замечательно показывает. Подозреваю, что этот, очень
нужный мне заголовок Authorization режут из соображений безопасности.
Трах-их-тибидох.

Решение заключается в том, чтобы передать заголовок нестандартный, с
точки зрения протокола авторизации. Например, скопировать имя
пользователя или вообще весь заголовок Authorization в заголовок с
"левым" именем. В тырнетах я нашел такой пример (у меня не сработал,
возможно потому как у меня в Apache авторизация по методу Digest, а не
Basic), конфига Apache:

nosq.com/blog/2009/07/passing-apache-reverse-proxy-auth-from-windows-to-linux

# (This RewriteRule doesn't actually rewrite anything URL-wise.)
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule .* - [E=RU:%1]
# Put the username into a request header:
RequestHeader set X_REMOTE_USER %{RU}e

Я переработал этот пример в то, что сработало у меня:

SetEnv proxy-chain-auth on
# (This RewriteRule doesn't actually rewrite anything URL-wise.)
# env vars that don't work: AUTH_DIGEST REMOTE_USER REDIRECT_REMOTE_USER
RewriteCond %{HTTP:Authorization} (.+)
RewriteRule .* - [E=XRU:%1]
# Put the username into a request header (zope env var HTTP_X_REMOTE_USER):
RequestHeader set X_REMOTE_USER %{XRU}e

Фишка в том, что RewriteRule ничего не реврайтит а устанавливает
переменную среды и записывает в нее содержимое заголовка Authorization.
А потом RequestHeader-ом я добавляю в request свой левый хидер с
содержимым ранее установленной переменной. И мой левый заголовок
попадает в Zope/Plone!

После чего в Zope/Plone я в любом шаблоне могу получить весь текст
заголовка Authorization и вынуть из него имя пользователя, при
необходимости. Например, таким куском кода:

<span tal:replace="python: request.get_header('HTTP_X_REMOTE_USER', default='oops')">
request header
</span>

Проверено, работает. Теперь и до правильного решения недалеко. Всего-то
надо написать в Zope/Plone User folder, который юзеров берет из этого
моего заголовка.


Сцылки дня:

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)