MongoDB – Como criar um ReplicaSet com autenticação
- Postado por Adriano Bonacin
- Categorias mongodb
- Data 28/01/2022
- Comentários 0 comentário
Criamos nosso primeiro user no último artigo e agora vamos aproveitar o assunto e ver como criar um ReplicaSet com autenticação. Partimos de um ambiente “limpo” com 3 membros. Teremos alguns passos extras, mas vou tentar demonstrar todos eles. Este cenário é o mais comum em ambientes produtivos, pelo menos por onde passei.
Arquivo de configuração
O nosso arquivo de configuração vai precisar de alguns ajustes, em dois pontos. O primeiro é relacionado a security, onde já havíamos alterado no artigo sobre autenticação. Vamos adicionar uma linha apontando o keyfile e na próxima sessão escrevo um pouco sobre ele. Um detalhe é que habilitando o keyfile automaticamente vai ficar habilitado a autenticação para os demais clients.
O outro ponto que precisamos ajustar no arquivo de configuração é voltar o trecho relacionado a replicação. O arquivo de conf agora deve estar assim:
[root@mymongo1 ~]# cat /etc/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# engine:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
security:
authorization: enabled
keyFile: /etc/keyfile.mongo
#operationProfiling:
replication:
replSetName: "rsYadax0"
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
KeyFile
Keyfile é responsável pela autenticação interna dos membros do cluster. Como isso funciona? Todos os membros do ReplicaSet vão precisar ter o keyfile com o mesmo conteúdo, não necessariamente no mesmo caminho. Ao tentarem interagir entre si, vão usar o mecanismo do SCRAM e verificar se os keyfiles dos pares coincide com os seus próprios. Sendo iguais, a autenticação é feita com sucesso.
E qual o conteúdo do keyfile? Deve ter entre 6 a 1024 caractes, do conjunto base64, que são caracteres [A-Z],[a-z],[0-9], “/” e “+”. Vamos criar nosso keyfile e deixá-lo com permissão somente de leitura para nosso user.
[root@mymongo1 ~]# echo "PodeserqualquercoisaSemcaracteresEspeciais" >> /etc/keyfile.mongo
[root@mymongo1 ~]# cat /etc/keyfile.mongo
PodeserqualquercoisaSemcaracteresEspeciais
[root@mymongo1 ~]# chmod 400 /etc/keyfile.mongo
Start Mongod
Resumindo, temos duas formas autenticações distintas. Uma client vs DB (que falamos no artigo anterior) e outra dos membros do cluster conectando em outros membros, onde é usado o keyfile.
Vamos criar então nosso ReplicaSet usando autenticação para vermos como funciona, primeiramente startando o mongod.
[root@mymongo1 ~]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 376
child process started successfully, parent exiting
[root@mymongo1 ~]#
Iniciar o ReplicaSet
Lembrando que é necessário um ajuste no /etc/hosts que fizemos neste artigo. Agora conectamos no mongosh, iniciamos o ReplicaSet.
[root@mymongo1 ~]# mongosh
...
test> use admin
switched to db admin
admin> rs.initiate()
{
info2: 'no configuration specified. Using a default configuration for the set',
me: 'mymongo1:27017',
ok: 1
}
rsYadax0 [direct: other] admin>
rsYadax0 [direct: primary] admin>
Criar usuário admin
Em seguida criamos nosso user adminitrativo.
rsYadax0 [direct: primary] admin> db.createUser(
... {
..... user: "yadaxRoot",
..... pwd: "MinhaSenha12#",
..... roles: [
..... { role: "root", db:"admin"}
..... ]
..... }
... )
{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1643395604, i: 4 }),
signature: {
hash: Binary(Buffer.from("fe98ef8a3c6ddf0e798eb14cc272c39ff932eb86", "hex"), 0),
keyId: Long("7058320868807540741")
}
},
operationTime: Timestamp({ t: 1643395604, i: 4 })
}
rsYadax0 [direct: primary] admin>
Adicionar membros no ReplicaSet
Agora precisamos deixar os outros 2 hosts com o mesmo arquivo de conf e mesmo keyfile. Em seguida, startar o mongod.
[root@mymongo2 /]# vi /etc/mongod.conf
[root@mymongo2 /]# echo "PodeserqualquercoisaSemcaracteresEspeciais" >> /etc/keyfile.mongo
[root@mymongo2 /]# chmod 400 /etc/keyfile.mongo
[root@mymongo2 /]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 41
child process started successfully, parent exiting
[root@mymongo2 /]#
[root@mymongo3 /]# vi /etc/mongod.conf
[root@mymongo3 /]# echo "PodeserqualquercoisaSemcaracteresEspeciais" >> /etc/keyfile.mongo
[root@mymongo3 /]# chmod 400 /etc/keyfile.mongo
[root@mymongo3 /]# mongod -f /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 36
child process started successfully, parent exiting
[root@mymongo3 /]#
Finalmente, vamos adicionar mymongo2 e mymongo3 no ReplicaSet. Conecte-se com o user recém criado (veja este artigo se precisar de ajuda).
rsYadax0 [direct: primary] admin> rs.add('mymongo2:27017')
{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1643397152, i: 1 }),
signature: {
hash: Binary(Buffer.from("731b7f3222db44d15bcbbf7425ec8dd10fbc4399", "hex"), 0),
keyId: Long("7058320868807540741")
}
},
operationTime: Timestamp({ t: 1643397152, i: 1 })
}
rsYadax0 [direct: primary] admin> rs.add('mymongo3:27017')
{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1643397167, i: 1 }),
signature: {
hash: Binary(Buffer.from("ada007449a40e8f176bcd1a09b3aa99e938bb4bc", "hex"), 0),
keyId: Long("7058320868807540741")
}
},
operationTime: Timestamp({ t: 1643397167, i: 1 })
}
rsYadax0 [direct: primary] admin> rs.status().members
[
{
_id: 0,
name: 'mymongo1:27017',
health: 1,
state: 1,
stateStr: 'PRIMARY',
...
},
{
_id: 1,
name: 'mymongo2:27017',
health: 1,
state: 2,
stateStr: 'SECONDARY',
...
},
{
_id: 2,
name: 'mymongo3:27017',
health: 1,
state: 2,
stateStr: 'SECONDARY',
...
}
]
Prontinho, temos um ReplicaSet com autenticação habilitada. Deu um pouquinho de trabalho, mas com o tempo você vê que tudo fica intuitivo, sabe que um passo leva a outro. Espero que gostem.
Tag:mongodb