Сценарий Apache Perl CGI и проблемы окружения - PullRequest
0 голосов
/ 13 ноября 2018

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

Я пытаюсь интегрировать и приложение, написанное на Perl (OTRS), работающее с Apache, чтобы SSO всех моих агентов.Между клиентом и сервером OTRS находится Tivoli Access Manager, и на нем сконфигурировано соединение.Когда клиент открывает ресурс с поддержкой WAM OTRS, TAM-сервер уже выполняет SSO, беря идентификатор пользователя из билета Kerberos и проверяя, может ли данный пользователь получить доступ к соединению, если он / она, то TAM устанавливает переменную с именем iv-user.в HTTPheader запроса и передает его в приложение OTRS.

Когда я открываю URL http://myserver/otrs/index.pl, я вижу, что Apache получает переменную iv-user в заголовке HTTP (я настроил mod_log_forensic в Apache):

iv-user variable in the HTTP request

Когда я сейчас вхожу в систему со своим идентификатором пользователя и паролем и обращаюсь к разделу информации системы, я вижу, что переменная была в основном «перезаписана?» В HTTP_IV_USER

iv_user to HTTP_IV_USER

В конце, когда я вызываю URL-адрес, вызывается CGI-скрипт, и, насколько я понимаю, «перезапись» - это обычная CGI-вещь, так сказать https://tools.ietf.org/html/rfc3875

“The server SHOULD set meta-variables specific to the protocol and
   scheme for the request.  Interpretation of protocol-specific
   variables depends on the protocol version in SERVER_PROTOCOL.  The
   server MAY set a meta-variable with the name of the scheme to a
   non-NULL value if the scheme is not the same as the protocol.  The
   presence of such a variable indicates to a script which scheme is
   used by the request.

   Meta-variables with names beginning with "HTTP_" contain values read
   from the client request header fields, if the protocol used is HTTP.
   The HTTP header field name is converted to upper case, has all
   occurrences of "-" replaced with "_" and has "HTTP_" prepended to
   give the meta-variable name.  The header data can be presented as
   sent by the client, or can be rewritten in ways which do not change
   its semantics.  If multiple header fields with the same field-name
   are received then the server MUST rewrite them as a single value
   having the same semantics.  Similarly, a header field that spans
   multiple lines MUST be merged onto a single line.  The server MUST,
   if necessary, change the representation of the data (for example, the
   character set) to be appropriate for a CGI meta-variable.”

Теперь я включаюЕдиный вход в OTRS (это в основном одна строка), поскольку OTRS полагается, что пользователь уже прошел предварительную проверку подлинности, и ищет переменную REMOTE_USER для единого входа в OTRS:

 HTTPBasicAuth for Agents
If you want to implement a "single sign on" solution for all your agents, you can use HTTP basic authentication (for all your systems) and the HTTPBasicAuth module for OTRS (see Example below). 
Example 4.14. Authenticate Agents using HTTPBasic
# This is an example configuration for an apache ($ENV{REMOTE_USER})
# auth. backend. Use it if you want to have a singe login through
# apache http-basic-auth
$Self->{'AuthModule'} = 'Kernel::System::Auth::HTTPBasicAuth';

# Note:
#
# If you use this module, you should use as fallback
# the following configuration settings if the user is not authorized
# apache ($ENV{REMOTE_USER})
$Self->{LoginURL} = 'http://host.example.com/not-authorised-for-otrs.html';
$Self->{LogoutURL} = 'http://host.example.com/thanks-for-using-otrs.html';

Поскольку я не хотел связыватьсяв производственной среде я настроил свою собственную тестовую среду и для имитации сервера TAM я использовал Modify Headers for Google Chrome для установки заголовков.
Когда я устанавливаю переменную в Modify Headers в заголовке непосредственно на HTTP_IV_USERне iv_user и взять значение из HTTP_IV_USER и установить его на REMOTE_USER в Apache SetEnvIf HTTP_IV_USER "(.*)$" REMOTE_USER=$1 Я могу успешно выполнить единый вход.

Но проблема в том, что Apache получает переменную как iv_user.Если я установлю это таким образом в Modify Headers для Google Chrome, SSO завершится неудачно с сообщением об ошибке ser: No $ENV{REMOTE_USER} or $ENV{HTTP_REMOTE_USER} !(REMOTE_ADDR: x.x.x.x).так что похоже, что мой SetEnvIf не срабатывает.

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

change in HTTPBasicAuth.pm

Короче говоря, вот мои вопросы:

  1. Создает ли Apache переменную HTTP_IV_USER из переменной, найденной в заголовке HTTP (iv_user)
  2. Если да, может быть, для этого используется директива SetEnv?
  3. Если да, и это мое единственное предположение, моя директива SetEnvIf не работает из-за The SetEnv directive runs late during request processing meaning that directives such as SetEnvIf and RewriteCond will not see the variables set with it.http://httpd.apache.org/docs/2.4/env.html#using

Я надеюсь, что моя проблема ясна и понятна, и я знаю, что есть страстные люди, которые хотят поделиться своими знаниями и опытом :)

Большое спасибозаранее и с наилучшими пожеланиями!

...