Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Distribuir um cluster fragmentado com autenticação de keyfile

Nesta página

  • Visão geral
  • Considerações
  • Distribuir um cluster fragmentado com controle de acesso a arquivos-chave
  • Próximos passos
  • x.509 Autenticação interna

Para aplicar o controle de acesso em um aglomerado compartilhado é necessário configurar:

Para este tutorial, cada membro do cluster fragmentado deve usar o mesmo mecanismo de autenticação interna e configurações. Isto significa aplicar autenticação interna em cada mongos e mongod no cluster.

O tutorial a seguir usa um arquivo-chave para habilitar a autenticação interna.

Forçar a autenticação interna também força o controle de acesso do usuário. Para se conectar ao conjunto de réplicas, clientes como mongosh precisam usar uma conta de usuário. Consulte Controle de acesso.

Se você estiver usando o Cloud Manager ou o Ops Manager para gerenciar seu sistema, consulte o respectivo Manual do Cloud Manager ou o Manual do Ops Manager para impor a autenticação.

Importante

Para evitar atualizações de configuração devido a alterações de endereço IP, use nomes de host DNS em vez de endereços IP. É particularmente importante usar um nome de host DNS em vez de um endereço IP ao configurar membros de conjunto de réplicas ou membros de cluster fragmentado.

Use nomes de host em vez de endereços IP para configurar clusters em um horizonte de rede dividido. A partir do MongoDB 5.0, os nós que são configurados apenas com um endereço IP falham na validação de inicialização e não iniciam.

Binários do MongoDB, mongod e mongos, ligam-se ao localhost por padrão.

Os arquivos-chave são formas mínimas de segurança e são mais adequados para ambientes de teste ou desenvolvimento. Para ambientes de produção, recomendamos usar certificados x.509.

Este tutorial aborda a criação do número mínimo de usuários administrativos somente no banco de dados admin. Para a autenticação do usuário, o tutorial usa o mecanismo de autenticação SCRAM padrão. Os mecanismos de segurança de resposta a desafios são mais adequados para ambientes de teste ou desenvolvimento. Para ambientes de produção, recomendamos o uso de certificados x.509 ou Autenticação de Proxy LDAP (disponível apenas para MongoDB Enterprise) ou Autenticação Kerberos (disponível apenas para o MongoDB Enterprise).

Para obter detalhes sobre a criação de usuários para mecanismos de autenticação específicos, consulte as páginas específicas do mecanismo de autenticação.

Consulte ➤ Configurar o controle de acesso baseado em roles para obter as melhores práticas para criação e gerenciamento de usuários.

Em geral, para criar usuários para um cluster fragmentado, é preciso conectar ao mongos e adicionar os usuários do cluster fragmentado.

No entanto, algumas operações de manutenção exigem conexões diretas com fragmentos específicos em um cluster fragmentado. Para executar essas operações, você deve se conectar diretamente ao fragmento e autenticar como um usuário administrativo local do fragmento.

Os usuários locais do shard existem apenas no shard específico e só devem ser usados para manutenção e configuração específicas do shard. Você não pode se conectar ao mongos com usuários locais do shard.

Este tutorial requer a criação de usuários de cluster fragmentado, mas inclui etapas opcionais para adicionar usuários locais de shards.

Consulte a documentação de segurança Usuários para obter mais informações.

Este tutorial utiliza os programas mongod e mongos. Os usuários do Windows devem usar os programas mongod.exe e mongos.exe .

Os seguintes procedimentos envolvem criar um novo cluster fragmentado que consiste em um mongos, os servidores de configuração e dois shards.

Importante

Para evitar atualizações de configuração devido a alterações de endereço IP, use nomes de host DNS em vez de endereços IP. É particularmente importante usar um nome de host DNS em vez de um endereço IP ao configurar membros de conjunto de réplicas ou membros de cluster fragmentado.

Use nomes de host em vez de endereços IP para configurar clusters em um horizonte de rede dividido. A partir do MongoDB 5.0, os nós que são configurados apenas com um endereço IP falham na validação de inicialização e não iniciam.

Com a autenticação de keyfile, cada instância mongod ou mongos no cluster fragmentado usa o conteúdo do keyfile como a senha compartilhada para autenticar outros nós do sistema. Somente as instâncias mongod ou mongos com o keyfile correto podem entrar no cluster fragmentado.

Observação

A partir do MongoDB 4.2, os arquivos de chave para autenticação de membros interna usam o formato YAML para permitir várias chaves em um arquivo de chave. O formato YAML aceita:

  • Uma única string de chave (igual às versões anteriores)

  • Uma sequência de strings de chave

O formato YAML é compatível com os arquivos-chave de chave única existentes que usam o formato de arquivo de texto.

O comprimento de uma chave deve estar entre 6 e 1.024 caracteres e só pode conter caracteres no conjunto base64. Todos os membros do cluster fragmentado devem compartilhar pelo menos uma chave comum.

Observação

Em sistemas UNIX, o arquivo-chave não deve ter permissões de grupo ou mundiais. Em sistemas Windows, as permissões do arquivo-chave não são verificadas.

Você pode gerar um arquivo-chave usando qualquer método de sua escolha. Por exemplo, a operação a seguir usa openssl para gerar uma cadeia complexa pseudo-aleatória de 1024 caracteres para ser usada como senha compartilhada. Em seguida, ele usa chmod para alterar as permissões do arquivo e fornecer permissões de leitura somente para o proprietário do arquivo:

openssl rand -base64 756 > <path-to-keyfile>
chmod 400 <path-to-keyfile>

Consulte Keyfiles para obter detalhes adicionais e requisitos para usar keyfiles.

Copie o arquivo de chave para cada servidor hospedando os membros do cluster fragmentado. Certifique-se de que o usuário que executa as instâncias mongod ou mongos seja o proprietário do arquivo e possa acessá-lo-chave.

Evite armazenar o arquivo-chave em mídias de armazenamento que possam ser facilmente desconectadas do hardware que hospeda as instâncias mongod ou mongos, como um pen drive ou um dispositivo de armazenamento conectado à rede.

As seguintes etapas distribuem um conjunto de réplicas do servidor de configuração.

Para um sistema de produção, implementa um conjunto de réplicas de servidor de configuração com pelo menos três membros. Para fins de teste, você pode criar um conjunto de réplicas de um único membro.

1

Inicie cada mongod no conjunto de réplicas do servidor de configuração. Inclua a configuração keyFile. A configuração keyFile impõe a Autenticação Interna/Associação e o Controle de Acesso Baseado em Função.

Você pode especificar as configurações mongod por meio de um arquivo de configuração ou da linha de comando.

Arquivo de configuração

Se estiver usando um arquivo de configuração, defina security.keyFile para o caminho do arquivo-chave, sharding.clusterRole para configsvre replication.replSetName para o nome desejado do conjunto de réplicas do servidor de configuração.

security:
keyFile: <path-to-keyfile>
sharding:
clusterRole: configsvr
replication:
replSetName: <setname>

Inclua opções adicionais, conforme necessário, para sua configuração. Por exemplo, se você deseja que clientes remotos se conectem à sua implementação ou se os membros da implementação forem executados em hosts diferentes, especifique a configuração net.bindIp .

Inicie o mongod especificando a opção --config e o caminho para o arquivo de configuração.

mongod --config <path-to-config-file>

Linha de comando

Se utilizar os parâmetros da linha de comando, inicie o mongod com os parâmetros --keyFile, --configsvr e --replSet .

mongod --keyFile <path-to-keyfile> --configsvr --replSet <setname> --dbpath <path>

Inclua opções adicionais, conforme necessário, para sua configuração. Por exemplo, se você deseja que clientes remotos se conectem à sua implementação ou se os membros da implementação forem executados em hosts diferentes, especifique o --bind_ip.

2

Conecte mongosh a uma das instâncias mongod pela interface localhost. Você deve executar mongosh na mesma máquina física que a instância mongod .

A interface localhost só está disponível porque nenhum usuário foi criado para o sistema. A interface localhost fecha após a criação do primeiro usuário.

3

O método rs.initiate() inicia o conjunto de réplicas e pode utilizar um documento de configuração do conjunto de réplica opcional. No documento de configuração do conjunto de réplicas, inclua:

  • O _id. O parâmetro _id deve corresponder ao parâmetro --replSet passado para mongod.

  • O campo members. O campo members é uma array e requer um documento por cada membro do conjunto de réplicas.

  • O campo configsvr. O campo configsvr deve ser configurado para true para o conjunto de réplicas do servidor de configuração.

Consulte Configuração do conjunto de réplicas para mais informações sobre documentos de configuração do conjunto de réplicas.

Inicie o conjunto de réplicas utilizando o método rs.initiate() e um documento de configuração:

rs.initiate(
{
_id: "myReplSet",
configsvr: true,
members: [
{ _id : 0, host : "cfg1.example.net:27019" },
{ _id : 1, host : "cfg2.example.net:27019" },
{ _id : 2, host : "cfg3.example.net:27019" }
]
}
)

Observação

Para usar o conjunto de réplicas do servidor de configuração (CSRS) nesse procedimento, primeiro você deve aguardar até que ele conclua a inicialização. Se o CSRS não tiver inicializado, causará NotYetInitialized erros.

Depois que o conjunto de réplicas do servidor de configuração (CSRS) for iniciado e ativado, prossiga para criar os conjuntos de réplicas de shards.

Para um sistema de produção, use um conjunto de réplicas com pelo menos três membros. Para fins de teste, você pode criar um conjunto de réplicas de um único membro.

Essas etapas incluem procedimentos opcionais para adicionar usuários locais de shard. Executá-los agora garante que haja usuários disponíveis para cada shard para realizar a manutenção no nível do shard.

1

A execução de um mongod com o parâmetro keyFile força a autenticação interna/associação e o controle de acesso baseado em roles.

Inicie cada mongod no conjunto de réplicas usando um arquivo de configuração ou a linha de comando.

Arquivo de configuração

Se estiver usando um arquivo de configuração, defina a opção security.keyFile como o caminho do arquivo de chaves, replication.replSetName como o nome desejado do conjunto de réplicas e a opção sharding.clusterRole como shardsvr.

security:
keyFile: <path-to-keyfile>
sharding:
clusterRole: shardsvr
replication:
replSetName: <replSetName>
storage:
dbPath: <path>

Inclua opções adicionais, conforme necessário, para sua configuração. Por exemplo, se você deseja que clientes remotos se conectem à sua implementação ou se os membros da implementação forem executados em hosts diferentes, especifique a configuração net.bindIp .

Inicie o mongod especificando a opção --config e o caminho para o arquivo de configuração.

mongod --config <path-to-config-file>

Linha de comando

Se usar a linha de comando, ao iniciar o componente especifique os parâmetros --keyFile, replSet e --shardsvr, como no seguinte exemplo:

mongod --keyFile <path-to-keyfile> --shardsvr --replSet <replSetName> --dbpath <path>

Inclua opções adicionais, conforme necessário, para sua configuração. Por exemplo, se você deseja que clientes remotos se conectem à sua implementação ou se os membros da implementação forem executados em hosts diferentes, especifique o --bind_ip.

2

Conecte mongosh a uma das instâncias mongod pela interface localhost. Você deve executar mongosh na mesma máquina física que a instância mongod .

A interface localhost só está disponível porque nenhum usuário foi criado para o sistema. A interface localhost fecha após a criação do primeiro usuário.

3

A partir mongosh, execute o método rs.initiate() .

rs.initiate() pode pegar um documento opcional de configuração do conjunto de réplicas. No documento de configuração do conjunto de réplicas, inclua:

  • O campo _id definido com o nome do conjunto de réplicas especificado na opção replication.replSetName ou --replSet.

  • A array members com um documento por cada membro do conjunto de réplicas.

O exemplo a seguir inicia um conjunto de réplicas de três nós.

rs.initiate(
{
_id : "myReplSet",
members: [
{ _id : 0, host : "s1-mongo1.example.net:27018" },
{ _id : 1, host : "s1-mongo2.example.net:27018" },
{ _id : 2, host : "s1-mongo3.example.net:27018" }
]
}
)

rs.initiate() desencadeia uma eleição e elege um dos nós para ser o primary.

Conecte-se ao primary antes de continuar. Use rs.status() para localizar o nó primary.

4

Importante

Depois de criar o primeiro usuário, a exceção de local não estará mais disponível.

O primeiro usuário deve ter privilégios para criar outros usuários, como um usuário com o userAdminAnyDatabase. Isso garante que você possa criar usuários adicionais após o fechamento da Exceção Localhost.

Se pelo menos um usuário não tiver privilégios para criar usuários, depois que a exceção localhost for fechada, talvez você não consiga criar ou modificar usuários com novos privilégios e, portanto, não consiga acessar as operações necessárias.

Adicione um usuário utilizando o método db.createUser(). O usuário deve ter pelo menos o role userAdminAnyDatabase no banco de dados do admin.

Você deve estar conectado ao primary para criar usuários.

O exemplo a seguir cria o usuário fred com o role userAdminAnyDatabase no banco de dados do admin.

Importante

As senhas devem ser aleatórias, longas e complexas para garantir a segurança do sistema e evitar ou atrasar o acesso malicioso.

Dica

A partir da versão 4.2 do shell mongo, você pode usar o método passwordPrompt() em conjunto com vários métodos/comandos de autenticação/gerenciamento de usuário para solicitar a senha em vez de especificar a senha diretamente na chamada de método/comando. No entanto, você ainda pode especificar a senha diretamente como faria com versões anteriores do shell mongo .

admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "fred",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

Digite a senha quando solicitado. Consulte Roles do usuário de banco de dados para obter uma lista completa das roles integradas e relacionadas às operações de administração do banco de dados.

5

Autenticar no banco de dados do admin.

Em mongosh, use db.auth() para autenticar. Por exemplo, o seguinte se autentica como administrador do usuário fred:

Dica

A partir da versão 4.2 do shell mongo, você pode usar o método passwordPrompt() em conjunto com vários métodos/comandos de autenticação/gerenciamento de usuário para solicitar a senha em vez de especificar a senha diretamente na chamada de método/comando. No entanto, você ainda pode especificar a senha diretamente como faria com versões anteriores do shell mongo .

db.getSiblingDB("admin").auth("fred", passwordPrompt()) // or cleartext password

Como alternativa, conecte uma nova instância do mongosh ao membro do conjunto de réplicas primária utilizando os parâmetros -u <username>, -p <password> e --authenticationDatabase .

mongosh -u "fred" -p --authenticationDatabase "admin"

Se você não especificar a senha para a opção de linha de comando -p , o mongosh solicitará a senha.

6

O usuário administrador de cluster local de shard tem a funçãoclusterAdmin, que fornece privilégios que permitem acesso a operações de replicação.

Para uma lista completa de funções relacionadas com operações de conjunto de réplicas, consulte Funções de Administração de Cluster.

Crie um usuário de administrador do cluster e atribua o role do clusterAdmin no banco de dados do admin :

Dica

A partir da versão 4.2 do shell mongo, você pode usar o método passwordPrompt() em conjunto com vários métodos/comandos de autenticação/gerenciamento de usuário para solicitar a senha em vez de especificar a senha diretamente na chamada de método/comando. No entanto, você ainda pode especificar a senha diretamente como faria com versões anteriores do shell mongo .

db.getSiblingDB("admin").createUser(
{
"user" : "ravi",
"pwd" : passwordPrompt(), // or cleartext password
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)

Digite a senha quando solicitado.

Veja as Roles de Administração de Cluster para obter uma lista completa de roles integrados relacionados às operações de conjunto de réplicas e operações de cluster fragmentado.

1

Inicie um mongos especificando o keyfile por meio de um arquivo de configuração ou de um parâmetro de linha de comando.

Arquivo de configuração

Se estiver usando um arquivo de configuração, defina security.keyFile como o caminho do arquivo de chaves e sharding.configDB como o nome do conjunto de réplicas e pelo menos um nó do conjunto de réplicas no formato <replSetName>/<host:port>.

security:
keyFile: <path-to-keyfile>
sharding:
configDB: <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019,...

Inclua opções adicionais, conforme necessário, para sua configuração. Por exemplo, se você deseja que clientes remotos se conectem à sua implementação ou se os membros da implementação forem executados em hosts diferentes, especifique a configuração net.bindIp .

Inicie o mongos especificando a opção --config e o caminho para o arquivo de configuração.

mongos --config <path-to-config>

Linha de comando

Se utilizar parâmetros da linha de comando, inicie o mongos e especifique os parâmetros --keyFile e --configdb.

mongos --keyFile <path-to-keyfile> --configdb <configReplSetName>/cfg1.example.net:27019,cfg2.example.net:27019,...

Inclua opções adicionais, conforme necessário, para sua configuração. Por exemplo, se você deseja que clientes remotos se conectem à sua implementação ou se os membros da implementação forem executados em hosts diferentes, especifique o --bind_ip.

2

Conecte mongosh a uma das instâncias mongos pela interface localhost. Você deve executar mongosh na mesma máquina física que a instância mongos .

A interface localhost só está disponível porque nenhum usuário foi criado para o sistema. A interface localhost fecha após a criação do primeiro usuário.

3

Importante

Depois de criar o primeiro usuário, a exceção de local não estará mais disponível.

O primeiro usuário deve ter privilégios para criar outros usuários, como um usuário com o userAdminAnyDatabase. Isso garante que você possa criar usuários adicionais após o fechamento da Exceção Localhost.

Se pelo menos um usuário não tiver privilégios para criar usuários, depois que a exceção localhost for fechada, você não poderá criar ou modificar usuários e, portanto, talvez não consiga executar as operações necessárias.

Adicione um usuário utilizando o método db.createUser(). O usuário deve ter pelo menos o role userAdminAnyDatabase no banco de dados do admin.

Importante

As senhas devem ser aleatórias, longas e complexas para garantir a segurança do sistema e evitar ou atrasar o acesso malicioso.

O exemplo seguinte cria o usuário fred no banco de dados do admin:

Dica

A partir da versão 4.2 do shell mongo, você pode usar o método passwordPrompt() em conjunto com vários métodos/comandos de autenticação/gerenciamento de usuário para solicitar a senha em vez de especificar a senha diretamente na chamada de método/comando. No entanto, você ainda pode especificar a senha diretamente como faria com versões anteriores do shell mongo .

admin = db.getSiblingDB("admin")
admin.createUser(
{
user: "fred",
pwd: passwordPrompt(), // or cleartext password
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)

Consulte Roles do utilizador de banco de dados para obter uma lista completa das roles integradas e relacionadas às operações de administração do banco de dados.

4

Utilize o db.auth() para autenticar como o administrador de usuário para criar usuários adicionais:

Dica

A partir da versão 4.2 do shell mongo, você pode usar o método passwordPrompt() em conjunto com vários métodos/comandos de autenticação/gerenciamento de usuário para solicitar a senha em vez de especificar a senha diretamente na chamada de método/comando. No entanto, você ainda pode especificar a senha diretamente como faria com versões anteriores do shell mongo .

db.getSiblingDB("admin").auth("fred", passwordPrompt()) // or cleartext password

Digite a senha quando solicitado.

Como alternativa, conecte uma nova sessão mongosh ao membro do conjunto de réplicas de destino usando os parâmetros -u <username>, -p <password> e --authenticationDatabase "admin" . Você deve usar a Exceção de Localhost para se conectar ao mongos.

mongosh -u "fred" -p --authenticationDatabase "admin"

Se você não especificar a senha para a opção de linha de comando -p , o mongosh solicitará a senha.

5

O usuário de administrador do cluster tem a role clusterAdmin, que concede acesso a operações de replicação e fragmentação.

Crie um usuário do clusterAdmin no banco de dados do admin.

O exemplo seguinte cria o usuário ravi no banco de dados do admin.

Importante

As senhas devem ser aleatórias, longas e complexas para garantir a segurança do sistema e evitar ou atrasar o acesso malicioso.

Dica

A partir da versão 4.2 do shell mongo, você pode usar o método passwordPrompt() em conjunto com vários métodos/comandos de autenticação/gerenciamento de usuário para solicitar a senha em vez de especificar a senha diretamente na chamada de método/comando. No entanto, você ainda pode especificar a senha diretamente como faria com versões anteriores do shell mongo .

db.getSiblingDB("admin").createUser(
{
"user" : "ravi",
"pwd" : passwordPrompt(), // or cleartext password
roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
}
)

Veja as Roles de Administração de Cluster para obter uma lista completa de roles integrados relacionados às operações de conjunto de réplicas e operações de cluster fragmentado.

6

Crie usuários para permitir que os clientes conectem e acessem o cluster fragmentado. Consulte Roles do utilizador do banco de dados para roles internos disponíveis, como read e readWrite. Você também pode querer usuários administrativos adicionais. Para mais informações sobre usuários, consulte Usuários.

Para criar usuários adicionais, você deve autenticar como um usuário com papéis do userAdminAnyDatabase ou userAdmin.

Para prosseguir, você deve estar conectado ao mongos e autenticado como o usuário administrador do cluster para o cluster fragmentado.

Observação

Este é o administrador do cluster para o cluster fragmentado e não o administrador do cluster local do shard.

Para adicionar cada shard ao cluster, utilize o método sh.addShard(). Se o shard for um conjunto de réplicas, especifique o nome do conjunto de réplicas e especifique um membro do conjunto. Em sistemas de produção, todos os shards devem ser conjuntos de réplicas.

A seguinte operação adiciona um conjunto de réplica de shard único ao cluster:

sh.addShard( "<replSetName>/s1-mongo1.example.net:27017")

A seguinte operação é um exemplo de adição de um fragmento mongod independente no cluster:

sh.addShard( "s1-mongo1.example.net:27017")

Repita essas etapas até que o cluster inclua todos os shards. Nesse ponto, o cluster fragmentado força o controle de acesso ao cluster, bem como para comunicações internas entre cada componente do cluster fragmentado.

Para prosseguir, você deve estar conectado ao mongos e autenticado como o usuário administrador do cluster para o cluster fragmentado.

Observação

Este é o administrador do cluster para o cluster fragmentado e não o administrador do cluster local do shard.

Para fragmentar uma coleção, utilize o método sh.shardCollection(). Você deve especificar o namespace completo da coleção e um documento contendo a chave de fragmento.

Sua seleção de chave de shard afeta a eficiência do shard, bem como sua capacidade de aproveitar determinados recursos de fragmentação, como zonas. Consulte as considerações de seleção listadas em Escolher uma chave de shard.

Se a collection já contiver dados, você deverá criar um índice na chave de shard usando o método db.collection.createIndex() antes de usar shardCollection().

Se a collection estiver vazia, o MongoDB criará o índice como parte do sh.shardCollection().

A seguir, um exemplo do método sh.shardCollection() :

sh.shardCollection("<database>.<collection>", { <key> : <direction> } )

Crie usuários para permitir que os clientes se conectem e interajam com o cluster fragmentado.

Consulte Roles de utilizador de banco de dados para roles internas básicas a serem usadas na criação de usuários somente leitura e de leitura e gravação.

Para obter detalhes sobre como usar x.509 para autenticação interna, consulte Usar certificado x.509 para autenticação de assinatura.

Para fazer upgrade da autenticação interna de keyfiles para a autenticação interna x.509, consulte Atualizar da autenticação de keyfile para autenticação x.509.

Dica

Veja também:

← Atualizar conjunto de réplicas para autenticação de arquivo chave (sem tempo de inatividade)