
Serviço de geoprocessamento do ArcGIS Enterprise que publica uma caixa de ferramentas Python para execução de comandos.
Este repositório contém uma definição de serviço de geoprocessamento do ArcGIS que publica uma caixa de ferramentas Python como uma tarefa de execução de comandos. Destina-se a testes de segurança autorizados.
Não publique nem utilize este serviço em sistemas para os quais não possui autorização explícita. Um serviço de geoprocessamento executa código do lado do servidor com a conta de serviço do ArcGIS Server, pelo que este projeto pode criar uma interface semelhante a uma web shell para o host.
O artefacto principal é ArcGIS_Shell, uma tarefa de caixa de ferramentas Python com um parâmetro de entrada:
command
Quando a tarefa é executada, o servidor executa esse comando através do shell do sistema operacional e retorna a saída normal do console por meio do resultado da tarefa do ArcGIS.
O repositório inclui dois arquivos de definição de serviço do ArcGIS pré-construídos:
ArcGIS_Shell_10.9.1_and_earlier.sd
ArcGIS_Shell_11_or_later.sd
Também inclui pastas de definição de serviço extraídas:
ArcGIS_Shell_10.9.1_and_earlier/
ArcGIS_Shell_11_or_later/
Essas pastas contêm os arquivos que o ArcGIS empacota nos arquivos .sd, incluindo os arquivos ArcGIS_Shell.pyt incorporados. Edite as pastas extraídas ao alterar a definição de serviço e, em seguida, reconstrua os arquivos .sd com package_sd.py.
Uma definição de serviço do ArcGIS (.sd) é um artefato de implantação empacotado. Ele contém metadados de serviço, configuração, recursos de toolbox ou mapa e arquivos de suporte necessários para que o ArcGIS Server publique um serviço.
Neste repositório, cada .sd é um arquivo 7-Zip que usa configurações de compressão compatíveis com o ArcGIS:
-ms=off
-m0=LZMA:d=14
As duas pastas de definição de serviço diferem principalmente pela versão de empacotamento do ArcGIS:
10.9.1 and earlier: p20 paths, offlineSDVersion10x, ArcGIS 2.9 schema
11 or later: p30 paths, offlineSDVersion11, ArcGIS 3.1 schema
A lógica da caixa de ferramentas Python incorporada é a mesma em ambos.
Os serviços de geoprocessamento do ArcGIS são normalmente utilizados para expor fluxos de trabalho de análise GIS através de HTTP. Um fluxo de trabalho comum é:
Exemplos legítimos incluem recortar elementos, executar análise de rede, processar rasters, gerar relatórios e realizar transformações GIS em lote.
A propriedade de segurança importante é que as tarefas de geoprocessamento executam Python do lado do servidor. Se uma tarefa publicada aceitar entrada controlada pelo utilizador e a passar para primitivas perigosas como subprocess.run(..., shell=True), a tarefa de geoprocessamento torna-se uma interface de execução de comandos. É isso que este projeto demonstra.
A tarefa Shell aceita um parâmetro de string chamado command. A caixa de ferramentas Python executa esse comando no host do ArcGIS Server e devolve stdout/stderr no resultado da tarefa.
Isto significa que um operador com permissão para publicar ou administrar serviços de geoprocessamento do ArcGIS pode criar um serviço semelhante a uma web-shell através da funcionalidade normal do ArcGIS. O comando é executado no contexto de segurança da conta de processo do ArcGIS Server.
O serviço também ativa a capacidade Uploads do ArcGIS. Isto expõe os endpoints de upload do serviço:
/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads
/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/upload
Os uploads são armazenados pelo ArcGIS Server no diretório de sistema do site, normalmente sob um caminho como:
<arcgisserver>/directories/arcgissystem/arcgisuploads/<itemID>
O caminho exato depende da configuração do diretório do ArcGIS Server. Os administradores podem visualizar os itens enviados por meio de:
https://<server>/arcgis/admin/uploads?f=pjson
Não modifique nem elimine manualmente ficheiros em arcgissystem. Elimine os itens carregados através de REST ou do Administrator Directory.
Utilize o ficheiro .sd que corresponde à versão de destino do ArcGIS:
ArcGIS_Shell_10.9.1_and_earlier.sd
ArcGIS_Shell_11_or_later.sd
Fluxo típico do Server Manager:
Abra o ArcGIS Server Manager:
https://<server>/arcgis/manager
Faça login com uma conta autorizada a publicar serviços. Isso normalmente inclui portaladmin.
Acesse Services.
Clique em Publish Service.
Faça upload do arquivo .sd apropriado para a versão do ArcGIS. Clique em Next.
Na página "Specify properties for your new service", modifique o nome do serviço, se desejar. Clique em Next.
Na página "Share your services with", você não precisa marcar nenhuma caixa. Clique em Publish.
O serviço inicia automaticamente. Clique no nome do serviço, depois em Capabilities e, em seguida, na REST URL.
Para excluir o serviço, clique no "X" ao lado do nome do serviço.
Os arquivos .sd pré-compilados já incluem:
"capabilities": "Uploads"
Eles também incluem configurações amplas de upload para testes:
"maxUploadFileSize": "2048",
"allowedUploadFileTypes": "<broad explicit extension list>"
maxUploadFileSize está em MB. A lista de extensões é intencionalmente ampla para trabalhos de avaliação, mas ainda é uma lista de permissões explícita, não um curinga verdadeiro de "permitir tudo".
Após a publicação, abra o serviço no ArcGIS REST Services Directory:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer
Se o serviço for publicado dentro de uma pasta, inclua o nome da pasta:
https://<server>/arcgis/rest/services/<folder>/ArcGIS_Shell/GPServer
Abrir a tarefa:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/Shell
Clique em Execute Task.
Defina seu comando e envie o formulário. O resultado da tarefa deve conter a saída do comando.
A saída está formatada em JSON, portanto as quebras de linha são escapadas (\r\n). Será necessário pós-processar a saída de múltiplas linhas.
Como a tarefa utiliza o shell do sistema operacional, os comandos internos do shell funcionam:
dir
echo test
whoami /groups
Em alvos Linux, use comandos Linux:
id
uname -a
pwd
Abra o recurso de uploads:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads
Clique em Upload Item, ou vá diretamente para:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/upload
A GUI web REST deve mostrar um seletor de arquivos se os uploads estiverem habilitados.
Use o formulário para escolher um arquivo e enviar o upload. A resposta inclui um itemID.
Inspecione o item enviado com:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/<itemID>
Exclua o item enviado com:
https://<server>/arcgis/rest/services/ArcGIS_Shell/GPServer/uploads/<itemID>/delete
Use o formulário web REST nessa página para submeter a operação de exclusão.
Os ficheiros carregados também estão sujeitos à política de limpeza do diretório de sistema do ArcGIS Server. A idade predefinida de limpeza do diretório de sistema é habitualmente 24 horas, mas os administradores podem alterá-la.