Выдача себя за пользователя из сервлета Java

2

Учитывая Java Servlet (работает на сервере Windows), который создает новый процесс через ProcessBuilder, каковы мои параметры для запуска этого нового процесса как пользователя, который вызвал исходный веб-запрос на сервлет?

Чтобы прояснить, я хочу, чтобы что-то вроде

ProcessBuilder pb = new ProcessBuilder("whoami");
Process p = pb.start();
// p.getOutputStream() should contain the name of the remote user,
// not the user running the app server

И реальная цель - выполнить некоторые проверки безопасности (например, посмотреть, может ли пользователь открывать файл или просматривать такую-то запись во внутренней корпоративной системе).

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

(Если это помогает прояснить, я в основном хочу заменить CGI script, который в настоящее время использует функции олицетворения IIS для запуска в контексте пользователя, делающего запрос)

  • 0
    spnego.sourceforge.net, похоже, делает то, что я хочу, но без упоминания о том, что нужно отменить новый процесс в качестве удаленного пользователя.
  • 0
    CreateProcessWithLogonW и CreateProcessWithTokenW могут создавать процесс, но оба требуют учетные данные. У cygwin.com/cygwin-ug-net/ntsec.html#ntsec-nopasswd1, кажется, есть несколько вариантов, позволяющих избежать необходимости в учетных данных, каждый из которых имеет свои недостатки ...
Теги:
iis
single-sign-on

2 ответа

6
Лучший ответ

Проект Waffle получит вас (почти) там. Он имеет SSO и реализуется олицетворение.

  • 0
    Спасибо - Откуда приходит «почти» :)
  • 0
    Кто-то должен выполнить работу по добавлению вызова олицетворения в фильтр (ы) безопасности, сохраняя маркер олицетворения для последующего повторного использования и олицетворения в каждом новом вызове. Но, по крайней мере, сейчас это возможно.
Показать ещё 2 комментария
1

Единственный вариант - это JNI или некоторая оболочка вокруг JNI, например JNA. Вам нужно будет вызвать API O/S для изменения ваших учетных данных, что также потребует, чтобы сервер приложений выполнялся как администратор, что само по себе является серьезным соображением безопасности.

Я не знаю конкретно о API Windows, но у большинства O/S есть возможность для достаточно мощного профиля (admin/root) принять личность любого профиля пользователя, не требуя пароля. В противном случае, как правило, единственным способом получить токен профиля пользователя является предоставление легитимных учетных данных для этого профиля.

Одна вещь, которую следует соблюдать, - это убедиться, что вы изменили учетные данные для потока, а не всего процесса.

  • 0
    Спасибо. Насколько мне удалось найти, у администратора нет способа стать другим пользователем без учетных данных (кажется, что CreateProcessWithLogonW и CreateProcessWithTokenW - это способ Win32, и оба требуют учетные данные), поэтому я предполагаю, что мой вопрос заключается в том, как организовать их или избежать их необходимости. Использование вызовов JNI для фактического разветвления процесса, безусловно, вариант, если я могу все устроить.
  • 0
    Да, и если бы имя пользователя и пароль были доступны, что-то вроде MiniRunAs, вероятно, помогло бы мне, избегая необходимости в JNI - stackoverflow.com/questions/362198/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню