Rede de serviços¶
Com os serviços do Snowpark Container Services, há três tipos de rede a serem considerados:
Rede de entrada: como se conectar de fora ao seu serviço.
Entrada: como seu serviço se conecta a outros serviços na internet ou por meio do seu link privado.
Comunicação entre serviços no Snowpark Container Services.
As seções a seguir explicam como configurar cada tipo de rede.
Configuração do ingresso na rede¶
Para permitir que qualquer coisa interaja com seu serviço pela internet, você declara as portas de rede nas quais seu serviço está escutando como pontos de extremidade no arquivo de especificação de serviço. Esses pontos de extremidade controlam a entrada.
Por padrão, os pontos de extremidade de serviço são privados. Somente funções de serviço e comunicações serviço a serviço podem fazer solicitações aos pontos de extremidade privados. Você pode declarar um ponto de extremidade como público para permitir solicitações a um ponto de extremidade da internet. A criação de um ponto de extremidade público é uma operação privilegiada, e a função de proprietário do serviço deve ter o privilégio BIND SERVICE ENDPOINT na conta.
endpoints:
- name: <endpoint name>
port: <port number>
protocol : < TCP / HTTP >
public: true
corsSettings: # optional CORS configuration
Access-Control-Allow-Origin: # required list of allowed origins
- <origin> # for example, "http://example.com"
- <origin>
...
Access-Control-Allow-Methods: # optional list of HTTP methods
- <method>
- <method>
...
Access-Control-Allow-Headers: # optional list of HTTP headers
- <header-name>
- <header-name>
...
Access-Control-Expose-Headers: # optional list of HTTP headers
- <header-name>
- <header-name>
...
Para obter um exemplo, consulte Tutorial 1.
Tempo limite da conexão de entrada¶
Os pontos de extremidade de entrada têm um tempo limite de 90 segundos. Se não houver atividade em uma conexão com um ponto de extremidade de entrada por 90 segundos, o Snowflake encerrará a conexão. Caso seu aplicativo precise de uma conexão por mais tempo, use a sondagem ou o WebSockets.
Logout de autenticação do navegador Web de entrada¶
Se estiver criando um aplicativo Web executado como um serviço, você tem a opção de permitir que os usuários façam logout do aplicativo, direcionando-os para /sfc-endpoint/logout.
Depois de fazer o logout, o usuário precisará se autenticar novamente no Snowflake para acessar o ponto de extremidade público do serviço.
Entrada e segurança de aplicativos da web¶
Você pode criar um serviço Snowpark Container Services para hospedagem na web usando o suporte do ponto de extremidade público (entrada de rede). Para maior segurança, Snowflake emprega um serviço de proxy para monitorar solicitações recebidas de clientes para o seu serviço e respostas de saída do seu serviço para os clientes. Esta seção explica o que o proxy faz e como ele afeta um serviço implantado no Snowpark Container Services.
Nota
Ao testar um serviço localmente, você não está usando o proxy Snowflake e, portanto, haverá diferenças entre sua experiência ao executar um serviço localmente e quando implantado no Snowpark Container Services. Revise esta seção e atualize sua configuração local para melhores testes.
Por exemplo:
O proxy não encaminha uma solicitação HTTP recebida se a solicitação usar um método HTTP banido.
O proxy envia uma resposta 403 ao cliente se o cabeçalho Content-Type na resposta indicar que a resposta contém um executável.
Além disso, o proxy também pode injetar novos cabeçalhos e alterar os cabeçalhos existentes na solicitação e na resposta, tendo em mente o seu contêiner e a segurança de dados.
Por exemplo, ao receber uma solicitação, seu serviço pode enviar HTML, JavaScript, CSS e outros conteúdos de uma página da Web para o navegador do cliente na resposta. A página da web no navegador faz parte do seu serviço, atuando como interface do usuário. Por motivos de segurança, se o seu serviço tiver restrições (como uma restrição ao estabelecimento de conexões de rede com outros sites), você também poderá querer que a página da Web do seu serviço tenha as mesmas restrições.
Por padrão, os serviços têm permissões limitadas para acessar a Internet. O navegador também deve restringir o acesso do aplicativo cliente à Internet e o possível compartilhamento de dados na maioria dos casos. Se você configurar uma integração de acesso externo (EAI) para permitir que seu serviço acesse example.com (consulte Configuração da saída da rede), a página da Web do seu serviço também deverá poder acessar example.com por meio de seu navegador.
O proxy Snowflake aplica as mesmas restrições de rede ao serviço e à página da web adicionando um cabeçalho Content-Security-Policy (CSP) na resposta. Por padrão, o proxy adiciona uma linha de base CSP na resposta para proteção contra ameaças de segurança comuns. A segurança do navegador é um esforço máximo para equilibrar funcionalidade e segurança. É uma responsabilidade compartilhada para garantir que essa linha de base seja apropriada para seu caso de uso. Além disso, se o seu serviço estiver configurado para usar um EAI, o proxy aplicará as mesmas regras de rede de EAI a CSP para a página da web. Este CSP permite que a página da web no navegador acesse os mesmos sites que o serviço pode acessar.
O Snowflake oferece o suporte CORS que você configura na especificação do serviço.
O proxy do Snowflake retorna as configurações do CORS definidas na especificação do serviço. Observe que o proxy remove todos os cabeçalhos do CORS retornados pelo serviço.
Os seguintes cabeçalhos do CORS são definidos por padrão:
O cabeçalho
Access-Control-Expose-Headerssempre informa os seguintes nomes de cabeçalho, além dos cabeçalhos configurados na especificação de serviço para o ponto de extremidade.X-Frame-OptionsCross-Origin-Opener-PolicyCross-Origin-Resource-PolicyX-Content-Type-OptionsCross-Origin-Embedder-PolicyContent-Security-Policy-Report-OnlyContent-Security-Policy
Access-Control-Max-Ageé definido para duas horas.Access-Control-Allow-Credentialsé definido como verdadeiro.
Além disso, o Snowflake define o cabeçalho Vary com o valor Origin para indicar ao navegador que, com base no valor de Origin, o valor de Access-Control-Allow-Origin pode ser diferente.
O cabeçalho Authorization é necessário para fazer a solicitação CORS. Você pode especificar um token de acesso programático (PAT) neste cabeçalho (Authorization: "Snowflake Token=\"${patToken}\""). Para obter informações sobre como gerar um token de acesso programático, consulte Uso de tokens de acesso programático para autenticação.
As seções a seguir explicam como o proxy Snowflake lida com solicitações de entrada para o seu serviço e modifica as respostas de saída do seu serviço para os clientes.
Solicitações recebidas no serviço¶
Quando chega uma solicitação, o proxy faz o seguinte antes de encaminhar a solicitação ao serviço:
Solicitações recebidas com métodos HTTP banidos: se uma solicitação HTTP recebida usar qualquer um dos métodos HTTP banidos a seguir, o proxy não encaminhará a solicitação para seu serviço:
TRACECONNECT
Limpeza do cabeçalho das solicitações de entrada: o proxy Snowflake remove os seguintes cabeçalhos de solicitação, se presentes:
X-SF-SPCS-AuthorizationAuthorization: removido somente se contiver um token Snowflake; caso contrário, será passado ao seu serviço.
Respostas enviadas aos clientes¶
O proxy Snowflake aplica essas modificações à resposta enviada pelo seu serviço antes de encaminhar a resposta ao cliente.
Limpeza de cabeçalho: o proxy Snowflake remove esses cabeçalhos de resposta, se presentes:
X-XSS-ProtectionServerX-Powered-ByPublic-Key-Pins
Manipulação de cabeçalhos do CORS: consulte Considerações sobre ingresso e CORS.
Cabeçalho de resposta Content-Type: se sua resposta de serviço incluir o cabeçalho Content-Type com qualquer um dos seguintes valores de tipo MIME (que indicam um executável), o proxy Snowflake não encaminhará essa resposta ao cliente. Em vez disso, o proxy enviará uma resposta
403 Forbidden.application/x-msdownload: executável da Microsoft.application/exe: executável genérico.application/x-exe: outro executável genérico.application/dos-exe: DOS executável.application/x-winexe: executável do Windows.application/msdos-windows: MS-DOS executável do Windows.application/x-msdos-program: MS-DOS executável.application/x-sh: script de shell Unix.application/x-bsh: script de shell Bourne.application/x-csh: script de shell C.application/x-tcsh: script de shell Tcsh.application/batch: arquivo em lote do Windows.
Cabeçalho de resposta X-Frame-Options: para evitar ataques de clickjacking, o proxy Snowflake define esse cabeçalho de resposta como
DENY, evitando que outras páginas da Web usem um iframe para a página da Web do seu serviço.Cabeçalho de resposta Cross-Origin-Opener-Policy (COOP): Snowflake define o cabeçalho de resposta COOP como
same-originpara impedir que janelas de origem cruzada de referência acessem sua guia de serviço.Cabeçalho de resposta Cross-Origin-Resource-Policy (CORP): Snowflake define o cabeçalho CORP como
same-originpara evitar que sites externos carreguem recursos expostos pelo ponto de extremidade de entrada (por exemplo, em um iframe).Cabeçalho de resposta X-Content-Type-Options: o proxy Snowflake define esse cabeçalho como
nosniffpara garantir que os clientes não alterem o tipo MIME indicado na resposta pelo seu serviço.Cabeçalho de resposta Cross-Origin-Embedder-Policy (COEP): o proxy Snowflake define o cabeçalho de resposta COEP como
credentialless, o que significa que ao carregar um objeto de origem cruzada, como uma imagem ou um script, se o objeto remoto não suportar o protocolo Cross-Origin Resource Sharing (CORS), o Snowflake não enviará as credenciais ao carregá-lo.Cabeçalho de resposta Content-Security-Policy-Report-Only: o proxy Snowflake substitui esse cabeçalho de resposta por um novo valor direcionando o cliente para enviar os relatórios CSP ao Snowflake.
Cabeçalho de resposta Content-Security-Policy (CSP): por padrão, o proxy Snowflake adiciona a seguinte linha de base CSP para proteção contra ataques comuns da Web.
default-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data:; object-src 'none'; connect-src 'self'; frame-ancestors 'self';
Há duas considerações sobre política de segurança de conteúdo:
Além da política de segurança de conteúdo de linha de base que o proxy adiciona, o próprio serviço pode adicionar explicitamente um CSP na resposta. Um serviço pode optar por aumentar a segurança adicionando um CSP mais rigoroso. Por exemplo, um serviço pode adicionar o seguinte CSP para permitir scripts somente de
self.script-src 'self'
Na resposta resultante enviada ao cliente, haverá dois cabeçalhos CSP. Ao receber a resposta, os navegadores do cliente aplicam a política de segurança de conteúdo mais rigorosa que inclui as restrições adicionais especificadas por cada política.
Se você configurar uma integração de acesso externo (EAI) para permitir que seu serviço acesse um site externo (Configuração da saída da rede), o proxy Snowflake criará um CSP que permite que sua página da web acesse esse site. Por exemplo, suponha que uma regra de rede associada a EAI permita acesso de saída de serviço a
example.com. Em seguida, o proxy Snowflake adiciona este cabeçalho de resposta CSP:default-src 'self' 'unsafe-inline' 'unsafe-eval' http://example.com https://example.com blob: data:; object-src 'none'; connect-src 'self' http://example.com https://example.com wss://example.com; frame-ancestors 'self';
Os navegadores respeitam a política de acesso ao conteúdo recebida na resposta. Neste exemplo, os navegadores permitem que o aplicativo acesse
example.com, mas não outros sites.
Considerações sobre ingresso e CORS¶
Por padrão, os navegadores impedem que os aplicativos Web hospedados em um servidor enviem solicitações a outro servidor com um nome de host diferente. Por exemplo, se você hospedar um aplicativo Web fora do Snowpark Container Services que precise interagir com um serviço de backend implantado no Snowpark Container Services, essa restrição se aplica.
O CORS (Cross-Origin Resource Sharing ou Compartilhamento de recursos entre origens) permite que um serviço do Snowpark Container Services comunique aos navegadores que é permitido fazer solicitações de aplicativos Web hospedados fora do seu ambiente. Você pode configurar cada ponto de extremidade público para especificar como ele responde às solicitações de preflight do CORS e às solicitações padrão.
O proxy do Snowflake sempre substitui os seguintes cabeçalhos de resposta:
Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Expose-HeadersAccess-Control-Max-AgeAccess-Control-Allow-Credentials
O proxy do Snowflake não inclui nenhum desses cabeçalhos do CORS na resposta quando um dos seguintes itens for verdadeiro:
O CORS não está configurado para o ponto de extremidade do serviço. Ou seja, não há
corsSettingsna especificação do serviçoO CORS está configurado para o ponto de extremidade do serviço, mas o cabeçalho
Originna solicitação não corresponde ao campoAccess-Control-Allow-Originespecificado na especificação do serviço
Na especificação do serviço, você pode definir as configurações do CORS para cada ponto de extremidade público. Quando o cabeçalho origin na solicitação corresponde ao campo Access-Control-Allow-Origin especificado para o ponto de extremidade na especificação, o proxy inclui na resposta os cabeçalhos do CORS definidos na especificação, com os seguintes ajustes:
Access-Control-Allow-Origin: retorna o cabeçalhoOriginda solicitação.Access-Control-Expose-Headers: mescla a lista de cabeçalhos permitidos que você configurou com esses cabeçalhos sempre expostos:X-Frame-Options,Cross-Origin-Opener-Policy,Cross-Origin-Resource-Policy,X-Content-Type-Options,Cross-Origin-Embedder-Policy,Content-Security-Policy-Report-Only,Content-Security-Policy.Access-Control-Max-Age: é definido para duas horas.Access-Control-Allow-Credentials: é definido como verdadeiro.
Considerações sobre ingresso e SSO¶
Ao acessar o ponto de extremidade público pela Internet, você pode descobrir que a autenticação por nome de usuário/senha funciona, mas SSO resulta em uma página em branco ou no erro: «A integração do clienteOAuth com o ID do cliente fornecido não foi encontrada.»
Isso acontece quando você está usando o estilo antigo de autenticação federada (SSO) com o Snowflake em vez da versão mais recente de integração de segurança, conforme explicado em Configuração do Snowflake para usar a autenticação federada. Faça o seguinte para verificar:
Execute a seguinte consulta:
SHOW PARAMETERS LIKE 'SAML_IDENTITY_PROVIDER' IN ACCOUNT;
Se esse parâmetro estiver definido, então, em algum momento, você estava usando a autenticação federada antiga.
Se o parâmetro anterior foi definido, execute a seguinte consulta para verificar se você tem uma integração de segurança SAML:
SHOW INTEGRATIONS ->> SELECT * FROM $1 WHERE "type" = 'SAML2';
Se você não tiver nenhuma integração do tipo SAML2, então está usando a versão antiga de autenticação federada.
Nesse caso, a solução é migrar da autenticação federada antiga para a nova autenticação federada da integração. Para obter mais informações, consulte Migração para uma integração de segurança SAML2.
Configuração da saída da rede¶
O código do seu aplicativo pode exigir acesso à internet. Por padrão, os contêineres de aplicativos não têm permissão para acessar a internet. Você precisa ativar o acesso à internet usando integrações de acesso externo (EAIs).
Normalmente, você deseja que um administrador de conta crie EAIs para gerenciar o acesso externo permitido de serviços (incluindo serviços de trabalho). Os administradores da conta podem então conceder o uso de EAI a funções específicas que os desenvolvedores usam para executar serviços.
O exemplo a seguir descreve as etapas para criar uma EAI que permite o tráfego de saída para destinos específicos determinados usando regras de rede. Em seguida, consulte a EAI ao criar um serviço para permitir solicitações para destinos específicos da internet.
Exemplo
Suponha que você queira que o código do seu aplicativo envie solicitações para os seguintes destinos:
Solicitações de HTTPS para translation.googleapis.com
Solicitações de HTTP e HTTPS para google.com
Siga estas etapas para permitir que seu serviço acesse esses domínios na Internet:
Criação de uma integração de acesso externo (EAI). Isso requer permissões apropriadas. Por exemplo, você pode usar a função ACCOUNTADMIN para criar uma EAI. Este é um processo de duas etapas:
Use o comando CREATE NETWORK RULE para criar uma ou mais regras de rede de saída listando destinos externos aos quais você deseja permitir acesso. Você pode realizar este exemplo com uma regra de rede, mas para ilustração, criamos duas regras de rede:
Crie uma regra de rede chamada
translate_network_rule:CREATE OR REPLACE NETWORK RULE translate_network_rule MODE = EGRESS TYPE = HOST_PORT VALUE_LIST = ('translation.googleapis.com');
Esta regra permite conexões TCP com o destino
translation.googleapis.com. O domínio na propriedade VALUE_LIST não especifica o número da porta opcional, portanto a porta padrão 443 (HTTPS) é assumida. Isso permite que seu aplicativo se conecte a qualquer URL que comece comhttps://translation.googleapis.com/.Crie uma regra de rede chamada
google_network_rule:CREATE OR REPLACE NETWORK RULE google_network_rule MODE = EGRESS TYPE = HOST_PORT VALUE_LIST = ('google.com:80', 'google.com:443');
Isso permite que seu aplicativo se conecte a qualquer URL que comece com
http://google.com/ouhttps://google.com/.
Nota
Para o parâmetro
VALUE_LIST, você deve fornecer um nome de host completo. Curingas (por exemplo,*.googleapis.com) não são suportados.O Snowpark Container Services oferece suporte apenas às regras de rede que permitem as portas 22, 80, 443, e 1024+. Se uma regra de rede referenciada permitir acesso a outras portas, a criação do serviço falhará. Entre em contato com seu representante de conta se precisar do uso de portas adicionais.
Nota
Para permitir que seu serviço envie solicitações HTTP ou HTTPS para qualquer destino na internet, especifique «0.0.0.0» como o domínio na propriedade VALUE_LIST. A regra de rede a seguir permite enviar solicitações «HTTP» e «HTTPS» para qualquer lugar na Internet. Somente as portas 80 ou 443 são suportadas com «0.0.0.0».
CREATE NETWORK RULE allow_all_rule TYPE = 'HOST_PORT' MODE= 'EGRESS' VALUE_LIST = ('0.0.0.0:443','0.0.0.0:80');
Crie uma integração de acesso externo (EAI) que especifique que as duas regras de rede de saída anteriores são permitidas:
CREATE EXTERNAL ACCESS INTEGRATION google_apis_access_integration ALLOWED_NETWORK_RULES = (translate_network_rule, google_network_rule) ENABLED = true;
Agora o administrador da conta pode conceder o uso da integração aos desenvolvedores para permitir que executem um serviço que pode acessar destinos específicos na Internet.
GRANT USAGE ON INTEGRATION google_apis_access_integration TO ROLE test_role;
Crie o serviço fornecendo EAI conforme mostrado nos exemplos a seguir. A função do proprietário que está criando o serviço precisa do privilégio USAGE no privilégio EAI e READ bre os segredos referenciados. Observe que você não pode usar a função ACCOUNTADMIN para criar um serviço.
Crie um serviço:
USE ROLE test_role; CREATE SERVICE eai_service IN COMPUTE POOL MYPOOL EXTERNAL_ACCESS_INTEGRATIONS = (GOOGLE_APIS_ACCESS_INTEGRATION) FROM SPECIFICATION $$ spec: containers: - name: main image: /db/data_schema/tutorial_repository/my_echo_service_image:tutorial env: TEST_FILE_STAGE: source_stage/test_file args: - read_secret.py endpoints: - name: read port: 8080 $$;
Este exemplo de solicitação CREATE SERVICE usa uma especificação de serviço sequencial e especifica a propriedade opcional EXTERNAL_ACCESS_INTEGRATIONS para incluir a EAI. A EAI especifica as regras de rede que permitem o tráfego de saída do serviço para destinos específicos.
Execute um serviço de trabalho:
EXECUTE JOB SERVICE IN COMPUTE POOL tt_cp NAME = example_job_service EXTERNAL_ACCESS_INTEGRATIONS = (GOOGLE_APIS_ACCESS_INTEGRATION) FROM SPECIFICATION $$ spec: container: - name: curl image: /tutorial_db/data_schema/tutorial_repo/alpine-curl:latest command: - "curl" - "http://google.com/" $$;
Este exemplo de comando EXECUTE JOB SERVICE especifica a especificação embutida e a propriedade opcional EXTERNAL_ACCESS_INTEGRATIONS para incluir a EAI. Isso permite o tráfego de saída do trabalho para destinos especificados nas regras de rede permitidas por EAI.
Saída da rede usando conectividade privada¶
Em vez de rotear a saída da rede pela Internet pública, você pode optar por direcionar o tráfego de saída do seu serviço por meio de um ponto de extremidade de conectividade privada.
Primeiro, você precisa criar o ponto de extremidade de conectividade privada em sua conta do Snowflake. Em seguida, configure uma regra de rede para permitir que o tráfego de saída use a conectividade privada. O processo de configuração de uma integração de acesso externo (EAI) permanece o mesmo descrito na seção anterior.
Nota
A comunicação privada exige que tanto o Snowflake quanto a conta de nuvem do cliente usem o mesmo provedor de nuvem e a mesma região.
Por exemplo, se você quiser habilitar o acesso de saída da Internet do seu serviço a um bucket S3 Amazon por meio de conectividade privada, faça o seguinte:
Habilite a conectividade do link privado para o serviço de ponto de extremidade autônomo (Amazon S3). Para obter instruções passo a passo, consulte AWS Private Link para Amazon S3.
Chame a função do sistema SYSTEM$PROVISION_PRIVATELINK_ENDPOINT para provisionar um ponto de extremidade de conectividade privada em seu Snowflake VNet. Isso permite que o Snowflake se conecte ao serviço externo (neste exemplo, o Amazon S3) usando conectividade privada.
USE ROLE ACCOUNTADMIN; SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT( 'com.amazonaws.us-west-2.s3', '*.s3.us-west-2.amazonaws.com' );
Na conta do provedor de nuvem, aprove o ponto de extremidade. Neste exemplo, para a Amazon AWS, consulte Como aceitar ou rejeitar solicitações de conexão na documentação do AWS. Além disso, para aprovar o ponto de extremidade no Azure, consulte a documentação do Azure.
Use o comando CREATE NETWORK RULE para criar uma regra de rede de saída que especifique os destinos externos aos quais você deseja permitir o acesso.
CREATE OR REPLACE NETWORK RULE private_link_network_rule MODE = EGRESS TYPE = PRIVATE_HOST_PORT VALUE_LIST = ('<bucket-name>.s3.us-west-2.amazonaws.com');
O valor do parâmetro TYPE é definido como PRIVATE_HOST_PORT. Isso indica que a regra de rede permite que o tráfego de rede de saída use a conectividade privada.
As demais etapas para criar uma EAI e usá-la para criar um serviço são as mesmas explicadas na seção anterior (consulte Configuração da saída da rede).
Para obter mais informações sobre como trabalhar com pontos de extremidade de conectividade privada, consulte o seguinte:
Configuração de comunicações de rede entre contêineres¶
Há duas considerações:
Comunicações entre contêineres de uma instância de serviço: se uma instância de serviço executar vários contêineres, esses contêineres poderão se comunicar entre si por meio do host local (não há necessidade de definir pontos de extremidade na especificação de serviço).
Comunicação entre contêineres em vários serviços ou múltiplas instâncias de serviço: contêineres pertencentes a diferentes serviços (ou diferentes instâncias do mesmo serviço) podem se comunicar usando pontos de extremidade definidos em arquivos de especificação. Para obter mais informações, consulte Comunicações serviço a serviço.