
Сервис геообработки ArcGIS Enterprise, который публикует набор инструментов Python для выполнения команд.
Этот репозиторий содержит определение сервиса геообработки ArcGIS, которое публикует Python-инструментарий как задачу выполнения команд. Он предназначен для авторизованного тестирования безопасности.
Не публикуйте и не используйте этот сервис в системах, на которые у вас нет явного разрешения. Сервис геообработки выполняет серверный код от имени учётной записи службы ArcGIS Server, поэтому этот проект может создать интерфейс, подобный веб-шеллу, для доступа к хосту.
Основной артефакт — ArcGIS_Shell, задача Python-инструментария с одним входным параметром:
command
Когда задача выполняется, сервер исполняет эту команду через оболочку операционной системы и возвращает обычный вывод консоли через результат задачи ArcGIS.
Репозиторий включает два предварительно собранных файла определения сервиса ArcGIS:
ArcGIS_Shell_10.9.1_and_earlier.sd
ArcGIS_Shell_11_or_later.sd
Он также включает извлечённые папки с определениями сервисов:
ArcGIS_Shell_10.9.1_and_earlier/
ArcGIS_Shell_11_or_later/
Эти папки содержат файлы, которые ArcGIS упаковывает в архивы .sd, включая встроенные файлы ArcGIS_Shell.pyt. Редактируйте извлечённые папки при изменении определения сервиса, затем пересоберите файлы .sd с помощью package_sd.py.
Определение сервиса ArcGIS (.sd) — это упакованный артефакт развёртывания. Оно содержит метаданные сервиса, конфигурацию, ресурсы набора инструментов или карты, а также вспомогательные файлы, необходимые ArcGIS Server для публикации сервиса.
В этом репозитории каждый .sd представляет собой архив 7-Zip, использующий совместимые с ArcGIS настройки сжатия:
-ms=off
-m0=LZMA:d=14
Две папки с определениями сервисов различаются в основном версией упаковки ArcGIS:
10.9.1 and earlier: p20 paths, offlineSDVersion10x, ArcGIS 2.9 schema
11 or later: p30 paths, offlineSDVersion11, ArcGIS 3.1 schema
Встроенная логика набора инструментов Python в обоих случаях одинакова.
Сервисы геообработки ArcGIS обычно используются для предоставления рабочих процессов GIS-анализа по HTTP. Типичный рабочий процесс выглядит так:
Легитимные примеры включают обрезку объектов, выполнение сетевого анализа, обработку растров, генерацию отчётов и выполнение пакетных GIS-преобразований.
Важное свойство безопасности заключается в том, что задачи геообработки выполняют Python на стороне сервера. Если опубликованная задача принимает контролируемый пользователем ввод и передаёт его в опасные примитивы, такие как subprocess.run(..., shell=True), задача геообработки становится интерфейсом выполнения команд. Именно это демонстрирует данный проект.
Задача Shell принимает строковый параметр с именем command. Набор инструментов Python выполняет эту команду на хосте ArcGIS Server и возвращает stdout/stderr в результате задачи.
Это означает, что оператор, имеющий право публиковать сервисы геообработки ArcGIS или администрировать их, может создать сервис, подобный веб-шеллу, через штатную функциональность ArcGIS. Команда выполняется в контексте безопасности учётной записи процесса ArcGIS Server.
Сервис также включает возможность ArcGIS Uploads. Это открывает конечные точки загрузки сервиса:
/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads
/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/upload
Загрузки хранятся ArcGIS Server в системном каталоге сайта, обычно по пути, подобному:
<arcgisserver>/directories/arcgissystem/arcgisuploads/<itemID>
Точный путь зависит от конфигурации каталога ArcGIS Server. Администраторы могут просматривать загруженные элементы через:
https://<server>/arcgis/admin/uploads?f=pjson
Не изменяйте и не удаляйте файлы в arcgissystem вручную. Удаляйте элементы загрузки через REST или Administrator Directory.
Используйте файл .sd, соответствующий целевой версии ArcGIS:
ArcGIS_Shell_10.9.1_and_earlier.sd
ArcGIS_Shell_11_or_later.sd
Типичный сценарий работы в Server Manager:
Откройте ArcGIS Server Manager:
https://<server>/arcgis/manager
Войдите с учётной записью, имеющей право публиковать сервисы. Обычно это включает portaladmin.
Перейдите в раздел Services.
Нажмите Publish Service.
Загрузите соответствующий файл .sd для вашей версии ArcGIS. Нажмите Next.
На странице "Specify properties for your new service" при необходимости измените имя сервиса. Нажмите Next.
На странице "Share your services with" отмечать какие-либо флажки не требуется. Нажмите Publish.
Сервис запустится автоматически. Нажмите на имя сервиса, затем Capabilities, затем REST URL.
Чтобы удалить сервис, нажмите "X" рядом с именем сервиса.
Готовые файлы .sd уже включают:
"capabilities": "Uploads"
Они также включают широкие настройки загрузки для тестирования:
"maxUploadFileSize": "2048",
"allowedUploadFileTypes": "<broad explicit extension list>"
maxUploadFileSize задаётся в МБ. Список расширений намеренно сделан широким для задач оценки, но он всё равно остаётся явным списком разрешённых расширений, а не настоящим подстановочным знаком «разрешить всё».
После публикации откройте сервис в ArcGIS REST Services Directory:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer
Если сервис опубликован внутри папки, укажите имя папки:
https://<server>/arcgis/rest/services/<folder>/ArcGIS_Shell/GPServer
Откройте задачу:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/Shell
Нажмите Execute Task.
Задайте команду и отправьте форму. Результат задачи должен содержать вывод команды.
Вывод отформатирован в JSON, поэтому символы новой строки экранированы (\r\n). Вам потребуется постобработка многострочного вывода.
Поскольку задача использует системную оболочку операционной системы, встроенные команды оболочки работают:
dir
echo test
whoami /groups
В Linux-целях используйте команды Linux:
id
uname -a
pwd
Откройте ресурс uploads:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads
Нажмите Upload Item или перейдите напрямую к:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/upload
REST веб-интерфейс должен показывать выбор файла, если загрузка включена.
Используйте форму, чтобы выбрать файл и отправить его на загрузку. Ответ содержит itemID.
Проверьте загруженный элемент с помощью:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/<itemID>
Удалите загруженный элемент с помощью:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/<itemID>/delete
Используйте REST-веб-форму на этой странице, чтобы отправить операцию удаления.
Загруженные файлы также подчиняются политике очистки системного каталога ArcGIS Server. По умолчанию срок очистки системного каталога обычно составляет 24 часа, но администраторы могут его изменить.
ArcGIS хранит загрузки сервисов в системном каталоге сайта ArcGIS Server, а не в папке сервиса и не внутри пакета .sd. Обычное расположение:
<server-directories-root>/arcgissystem/arcgisuploads/<itemID>/
Общая раскладка Windows:
C:\arcgisserver\directories\arcgissystem\arcgisuploads\<itemID>\
Типичная структура каталогов Linux:
/arcgis/server/usr/directories/arcgissystem/arcgisuploads/<itemID>/