Práticas recomendadas de segurança de configuração do Nacos


Prefácio



Como uma parte importante do desenvolvimento de software, o gerenciamento de configuração assume a responsabilidade de conectar o código e o ambiente e pode separar as preocupações dos desenvolvedores e mantenedores.

A função de gerenciamento de configuração do Nacos atende aos requisitos de gerenciamento de configuração de aplicativos nativos da nuvem: pode obter tanto a configuração quanto a separação do código, bem como a modificação dinâmica da configuração.

Em janeiro, o Nacos tinha uma vulnerabilidade de segurança que permitia que usuários externos fingissem ser um servidor Nacos para obter / modificar a configuração (https://github.com/alibaba/nacos/issues/4593). Depois de confirmar o problema, o Nacos corrigiu rapidamente a vulnerabilidade e o Microservice Engine (MSE) do Alibaba Cloud também fez o backport da solução de reparo para a instância do Nacos no MSE no final de janeiro.

Neste artigo, começaremos de uma perspectiva global e discutiremos como garantir a segurança da configuração do Nacos, ou seja, como garantir que as informações de configuração não sejam obtidas ou vazadas por usuários mal-intencionados.

Arquitetura de configuração Nacos


A estrutura geral da seção de configuração do Nacos é a seguinte:

Para cada link na figura acima, você precisa considerar se há duas ações básicas de segurança: autenticação (Identificação) e autenticação (Autenticação).

Como você pode ver na figura acima, as maneiras possíveis de vazar informações de configuração são:

  • Obtenha a configuração através do Nacos-client.

  • Obtenha a configuração por meio do console.

  • A configuração é obtida através do protocolo de comunicação entre os servidores.

  • Acesso direto à camada de persistência (como DB) para configuração.

Os possíveis pontos de vazamento são os seguintes:


Certificação

Autenticação

Cliente Nacos

Os usuários não registrados obtêm / modificam a configuração por meio do cliente

O usuário obteve / modificou a configuração não autorizada através do cliente

Configure o console

Os usuários não registrados obtêm / modificam a configuração por meio do console

O usuário obteve / modificou a configuração não autorizada por meio do console

Dentro do aglomerado de Nacos

O usuário finge ser um cluster Nacos para obter / modificar a configuração

Não é necessário

Camada de persistência

Os usuários verificam diretamente o banco de dados, obtêm / modificam a configuração

Não é necessário

Autenticação e autenticação do cenário do cliente Nacos


Quando o cliente Nacos tenta obter a configuração do servidor, o servidor precisa confirmar a identidade do cliente e confirmar se a identidade tem autoridade para obter a configuração.

Versão de código aberto do Nacos

Na configuração padrão do servidor Nacos, o cliente não será autenticado, ou seja, qualquer usuário que possa acessar o servidor Nacos pode obter diretamente a configuração armazenada no Nacos. Por exemplo, se um hacker invade a intranet da empresa, ele pode obter todas as configurações de negócios, o que certamente apresenta riscos de segurança.

Portanto, a autenticação do servidor Nacos precisa ser ativada primeiro. Modifique o valor nacos.core.auth.enabled em application.properties para true no servidor Nacos:

nacos.core.auth.enabled=true


Após as configurações acima, quando o cliente Nacos obtém a configuração, ele precisa definir o nome de usuário e a senha correspondentes para obter a configuração:

String serverAddr = "{serverAddr}";Properties properties = new Properties();properties.put("serverAddr", serverAddr);properties.put("username","nacos-readonly");properties.put("password","nacos");ConfigService configService = NacosFactory.createConfigService(properties);

O acima falado sobre como autenticar um usuário, ou seja, como determinar qual usuário está acessando atualmente, mas também precisa identificar a autoridade do usuário. Quando o usuário não tem autoridade para obter a configuração correspondente, como quando o inventário serviço tenta obter a configuração do serviço de pagamento, ele irá falhar.

Podemos criar usuários e definir permissões no console de código aberto do Nacos. Proceda da seguinte forma:

Primeiro, vá para localhost: 8848 / nacos e faça login, controle de acesso -> página Lista de usuários , adicione um usuário:

Em controle de acesso -> Gerenciamento de funções , vincule usuários e funções:


Adicione permissões às funções correspondentes. No  controle de permissão -> página de gerenciamento de permissão  , adicione permissões:

Após a configuração acima, readonly-user só pode acessar a configuração no namespace público.


Alibaba Cloud MSE-AK / SK

Para equipes pequenas, é suficiente usar nome de usuário e senha para autenticação. No entanto, para equipes grandes e médias, mudanças regulares de senha e mudanças freqüentes de pessoal causarão mudanças freqüentes em nomes de usuário e senhas.

No momento, o uso de autenticação de nome de usuário e senha de autenticação requer modificações frequentes e liberação de aplicativos. Para resolver esse problema, a Nacos também fornece um esquema de autenticação baseado em AK / SK e um esquema para o ECS associar funções de RAM, o que pode evitar problemas de publicação frequentes causados ​​pela modificação de nome de usuário e senha.

Tome o Alibaba Cloud MSE como exemplo. Os usuários do Alibaba Cloud geralmente usam o Alibaba Cloud Access Control Service (RAM) como sistema de permissão. Se o MSE for igual ao código aberto, se o nome de usuário e a senha forem usados ​​para autenticação e autenticação, então o usuário precisa fazer login na RAM e o MSE Nacos configura as permissões em dois lugares. Isso não é apenas inconveniente para o gerenciamento unificado e a revisão das permissões do usuário, mas também traz uma experiência inconsistente para os usuários.

Portanto, MSE (Micro Service Engine) fornece um método de autenticação baseado em AK / SK. O exemplo de operação é o seguinte:

Primeiro, em um exemplo de aplicativo Nacos MSE (e observe o ID da instância), em seguida, os exemplos Detalhes -> Interface de preferências  , parâmetro ConfigAuthEnabled (configurar autenticação) é definido como verdadeiro, para que usuários anônimos não possam obter a configuração:

Em seguida, você pode configurar as permissões relacionadas no sistema Alibaba Cloud RAM. O sistema de permissão de subcontas de RAM pode ser simplesmente expresso da seguinte forma:

  • Etapa 1: crie a política de permissão de RAM da seguinte maneira:

Na figura, mse: Get *, mse: List *, mse: Query * indicam que a configuração pode ser lida e mse: * indica todas as permissões, incluindo permissões de modificação.

acs: mse: *: *: instance / $ {instanceId} significa autorização para o nível de instância, acs: mse: *: *: instance / $ {instanceId} / $ {namespaceId} significa autorização para o nível de namespace.

  • Etapa 2: crie usuários e conceda permissões:

Preencha o nome do usuário:

Em seguida, obtenha o AK / SK do usuário:

Dê a este usuário as permissões correspondentes:

  • Finalmente, basta adicionar AK / SK ao código:

String serverAddr = "{serverAddr}";Properties properties = new Properties();properties.put("serverAddr", serverAddr);properties.put(PropertyKeyConst.ACCESS_KEY, "${accessKey}");properties.put(PropertyKeyConst.SECRET_KEY, "${secret}");ConfigService configService = NacosFactory.createConfigService(properties);


Após a configuração acima, quando o cliente acessa a instância Nacos adquirida no MSE , o MSE verificará o AK e a assinatura, confirmará se o usuário é um usuário legítimo e verificará a autoridade , caso contrário, ele se recusará a fornecer os serviços.

Alibaba Cloud MSE- autenticação de função Ram baseada em ECS

Claro, no método de uso acima, você ainda precisa configurar o AK / SK na configuração inicial (como o arquivo bootstrap.yml em srping-cloud-alibaba-nacos-config). Quando os hackers invadem a intranet ou vazam o código-fonte, também ocorrem vazamentos de AK / SK, levando ao risco de vazamentos de informações de configuração .

Nesse caso, é recomendável usar a função RAM associada ao ECS para autenticação.

O modelo de autorização correspondente à função RAM associada ao ECS é o seguinte:

As principais etapas mencionadas acima são a representação de papéis. Apenas o servidor de nuvem associado à função RAM pode desempenhar com êxito a função e obter a permissão para operar a instância MSE Nacos.

Se o hacker obtiver apenas o código, ele não poderá desempenhar com êxito o papel de RAM e não poderá operar a instância MSE Nacos. Se a máquina for comprometida, a função associada ao servidor em nuvem também pode ser cancelada no console do Alibaba Cloud para interromper a perda de tempo.

As etapas específicas são as seguintes:

  • A primeira etapa é criar uma instância do MSE Nacos e criar uma política de permissão correspondente (explicada acima, portanto, não a repetirei aqui).

  • A segunda etapa é criar uma função RAM e autorizá-la.

Criar função RAM:

Depois de criar uma função, adicione a política de permissão correspondente para a função:


  • A terceira etapa é associar a função ao ECS:

Na página de detalhes do ECS correspondente , clique em conceder / retirar Função RAM :

Selecione a função correspondente e conceda :

  • A etapa final nas funções de RAM especificadas  pelo código pode:

String serverAddr = "{serverAddr}";
Properties properties = new Properties();
properties.put("serverAddr", serverAddr);
properties.put(PropertyKeyConst.RAM_ROLE_NAME, "StoreServiceRole");
ConfigService configService = NacosFactory.createConfigService(properties);

Após a configuração acima, quando o cliente Nacos obtiver a configuração, o servidor em nuvem desempenhará a função RAM designada e o token de segurança temporário Alibaba Cloud (Serviço de Token de Segurança, STS) acessará a instância MSE Nacos.

Se o invasor obtiver o código, ele não poderá ser executado em outras máquinas porque a máquina do invasor não tem autoridade para desempenhar o papel de RAM.

Se o invasor obtiver as informações de autenticação após a personificação, devido à falha curta do STS (o padrão é 1 hora), o invasor falhará logo após obtê-las, reduzindo efetivamente a superfície de ataque.

Se precisar revogar a autorização, você só precisa fazer isso no console do Alibaba Cloud e não precisa republicar o aplicativo.

Em comparação com a autenticação e autenticação AK / SK, a autenticação e autenticação de funções associadas ao ECS é mais controlável e segura, portanto, esse método de autenticação e autenticação é recomendado.

Configure a autenticação e autenticação em cenários de console



Versão de código aberto do Nacos

Na versão de código aberto do console do Nacos, ao fazer login, ele obterá um accessToken temporário por meio da interface de login do console e, em seguida, as operações subsequentes usarão o accessToken para autenticação.

Por exemplo, o usuário readonly-user mencionado acima, após fazer login, pode ver apenas as informações de configuração no namespace público e não pode modificar ou visualizar as informações de configuração em outros namespaces.

Além disso, se você precisar criar ou excluir um namespace, só poderá fazer login como administrador.

Para a autenticação e autorização da versão de código aberto do Nacos, consulte este documento: https://nacos.io/zh-cn/docs/auth.html.


Alibaba Cloud MSE

Como o Alibaba Cloud MSE fornece serviços para empresas, a divisão de permissões será mais refinada.

Os recursos são divididos em nível de instância (acs: mse: *: *: instance / $ {instanceId}) e nível de namespace (acs: mse: *: *: instance / $ {instanceId} / $ {namespaceId}).

O funcionamento dos recursos também é mais refinado, como:

Açao

Descrição

CreateEngineNamespace

Crie um namespace

DeleteEngineNamespace

Excluir namespace

mse:Get*,mse:List*,mse:Query*

Configuração de leitura (cliente Nacos e console)

mse:*

Todas as permissões, incluindo modificação e exclusão de configuração

mse:QueryNacosConfig

Configuração de leitura do cliente

mse:UpdateNacosConfig

Configuração de modificação do cliente

Por exemplo, apenas a configuração em um namespace pode ser lida e nenhuma modificação é permitida. A política de permissão pode ser escrita:

{  "Action": [    "mse:Get*",    "mse:List*",    "mse:Query*"  ],  "Resource": [    "acs:mse:*:*:instance/${instanceId}/${namespaceId}"  ],  "Effect": "Allow"}




Autenticação entre servidores


Algumas informações precisam ser sincronizadas entre os servidores Nacos. Nesse momento, a identidade da outra parte precisa ser autenticada para confirmar que a outra parte é realmente Nacos-servidor, em vez de disfarçada.

Antes de 1.4.1, a autenticação era feita por meio do cabeçalho User-Agent. Este método de autenticação original pode ser facilmente forjado. Conforme mencionado no início deste artigo, esse é o motivo da vulnerabilidade que o Nacos quebrou em janeiro.

Portanto, nas versões 1.4.1 e posteriores, o cabeçalho certificado e o valor correspondente podem ser configurados por você. Em application.properties, modifique os seguintes valores:

# 不使用User-Agent来认证nacos.core.auth.enable.userAgentAuthWhite=false# 认证header的keynacos.core.auth.server.identity=Authorization# 认证header的valuenacos.core.auth.server.identity.value=secret


Dessa forma, somente após o envio da Authorization: secretsolicitação de cabeçalho é que se pode confirmar que a outra parte é o servidor e que as informações do cluster podem ser sincronizadas, caso contrário, a sincronização é rejeitada.

Como o Nacos-server precisa de todas as permissões para sincronizar os dados de configuração, não há necessidade de autenticação entre os Nacos-server.

Desta forma, a comunicação entre os servidores também pode ser segura e confiável.

A instância Nacos adquirida no Alibaba Cloud MSE também fez o backport da solução acima para a versão 1.2 e não haverá problemas de segurança correspondentes.

Segurança da camada de persistência



As informações de configuração do Nacos são armazenadas na camada de persistência. Por exemplo, a camada de persistência padrão do Nacos é MySQL.

Para evitar que o nome de usuário e a senha do MySQL vazem por meio do git ou outros métodos, precisamos modificar o nome de usuário e a senha do MySQL regularmente.

A prática usual é usar dois usuários de banco de dados, como UsuárioA e UsuárioB. Se você deseja atualizar a senha, proceda da seguinte forma:

  • Troque o usuário do servidor Nacos para acessar o banco de dados de UsuárioA para UsuárioB.

  • Atualize a senha do usuário A.

  • Alterne o usuário do servidor Nacos para acessar o banco de dados de UserB de volta para UserA.

  • Atualize a senha de UserB.

Como um produto Alibaba Cloud, o MSE tem uma política de alterar regularmente o nome de usuário e a senha do banco de dados, portanto, se você adquiriu uma instância do MSE, não precisa se preocupar com esse problema.

Práticas recomendadas de segurança de configuração



Analisando os pontos-chave da segurança da configuração do Nacos, como podemos garantir a segurança da configuração? Você só precisa seguir as seguintes práticas recomendadas:

1. Modifique regularmente a senha e ak / sk

No caso de usar autenticação de nome de usuário e senha Nacos (ou AK / SK) (como usar o método de autenticação Nacos de código aberto), se um usuário malicioso obtiver o nome de usuário e senha Nacos (ou AK / SK), ele poderá obter o Configuração do aplicativo. No entanto, se a senha ou AK / SK for alterada regularmente, o período de tempo para vazamento de configuração pode ser efetivamente limitado e a superfície de ataque pode ser reduzida.

2. Use funções ECS (uso recomendado)

Obviamente, na solução acima, ainda haverá o nome de usuário e senha do Nacos ou AK / SK na configuração, e essa informação também pode vazar, e a modificação após o vazamento precisa ser republicada. Portanto, é recomendável usar a função ECS do Alibaba Cloud. Todo o gerenciamento de permissões é feito no console do Alibaba Cloud .

3. Gire a chave de autenticação interna do Nacos

Conforme mencionado anteriormente, a autenticação entre os servidores Nacos é feita por meio de nacos.core.auth.server.identity, mas se um usuário mal-intencionado invadir, também causará vazamento, o que levará ao vazamento de configuração.

Portanto, para Nacos criados por você mesmo, nacos.core.auth.server.identity.value precisa ser substituído regularmente para garantir que usuários mal-intencionados não possam fingir ser Nacos Server para obter e modificar a configuração.

Claro, se você estiver usando uma instância do Nacos hospedada pelo MSE, o MSE irá girar automaticamente , então você não precisa se preocupar com isso.

4. Nome de usuário e senha da camada de persistência de rotação

Para evitar que a configuração vaze da camada de persistência, é necessário modificar periodicamente as informações de autenticação da camada de persistência. Normalmente, a camada de persistência do Nacos é DB, portanto, o nome de usuário e a senha do banco de dados precisam ser modificados regularmente.

Para os usuários do MSE, não há necessidade de fazer nada. O MSE modificará periodicamente o nome de usuário e a senha do banco de dados.

5. Projetar um plano de segurança e executá-lo regularmente

Com o seguro pesado acima, é teoricamente infalível, mas como sempre há erros em operações humanas, ainda é necessário especificar um plano de segurança:

  • Verifique regularmente a lista de escuta configurada para confirmar se não há máquinas não autorizadas.

  • Quando o AK / SK vazou, como atualizar o AK / SK e como revogar o AK / SK vazado.

  • Para Nacos criados por você mesmo, como modificar o esquema de nacos.core.auth.server.identity.value após o servidor ser comprometido.

Resumindo


Os Nacos de código aberto podem basicamente atender às necessidades de pequenas e médias empresas em termos de gerenciamento de configuração e gerenciamento de autoridade.

Para empresas de médio e grande porte, o produto Alibaba Cloud MSE suporta configuração de permissão e gerenciamento de segurança mais refinados e flexíveis, e também pode ser usado com outros produtos Alibaba Cloud para obter recursos de configuração mais seguros.

Obviamente, se você está criando Nacos sozinho ou usando o Alibaba Cloud MSE, é necessário prestar atenção aos pontos de segurança mencionados acima para evitar vazamento de informações de configuração e causar perdas de negócios. As práticas recomendadas de segurança de configuração mencionadas no final também podem garantir que, após os vazamentos de configuração, eles tenham a capacidade de repará-los a tempo para evitar problemas antes que ocorram.

Recrutamento


Nossa equipe de comercialização de Dubbo / Spring Cloud está contratando pessoas. Além do EDAS, também temos produtos independentes, como ARMS (Real-time Application Monitoring Service), MSE (Micro Service Engine) e SAE (Serverless Application Engine). O que estamos fazendo? Polir esses produtos é nosso trabalho. O objetivo da equipe é exportar as melhores práticas do Alibaba em governança de serviço para clientes corporativos no Alibaba Cloud na forma de produção e ajudar os clientes a perceber que seus negócios estão sempre online.

Método de entrega de currículo: https://job.alibaba.com/zhaopin/position_detail.htm?positionId=98290

Como garantir a consistência distribuída do negócio snap-up por meio de mensagens de transação?

2021-02-27

Aceleração do espelho de cálculo da função: o salto de minutos para segundos

2021-02-27

Combate real | Como realizar a arquitetura de corte de quadros de vídeo baseada na tecnologia sem servidor?

2021-02-25

Clique em um para ver, deixe mais pessoas ver

Acho que você gosta

Origin blog.csdn.net/weixin_39860915/article/details/114697118
Recomendado
Clasificación