Ошибка аутентификации при подключении к mongodb через разъем debezium mongodb
Развернули Strimzi Kafka, Strimzi Zookeeper и Debezium mongodb и настроили Debezium mongodb,
curl 'http://my-connect-cluster-connect-api:8083/connectors' -X POST -i -H "Content-Type:application/json" -d '{
"name": "mongodb-connector",
"config": {
"connector.class": "io.debezium.connector.mongodb.MongoDbConnector",
"mongodb.hosts": "MainRepSet/mongod-0.mongodb-service.kafka.svc.cluster.local:27017,mongod-1.mongodb-service.kafka.svc.cluster.local:27017,mongod-2.mongodb-service.kafka.svc.cluster.local:27017",
"mongodb.name": "MainRepSet",
"collection.whitelist": "springdatabase[.]*",
"mongodb.user": "springuser",
"mongodb.password": "password"
}
}'
Но получил исключение аутентификации,
2019-01-29 13:13:40,170 ERROR Error while reading the 'shards' collection in the 'config' database: Timed out after 30000 ms while waiting to connect. Client view of cluster state is {type=UNKNOWN, servers=[{address=mongod-2.mongodb-service.kafka.svc.cluster.local:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='springuser', source='admin', password=<hidden>, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server mongod-2.mongodb-service.kafka.svc.cluster.local:27017. The full response is { "operationTime" : { "$timestamp" : { "t" : 1548767616, "i" : 1 } }, "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed", "$clusterTime" : { "clusterTime" : { "$timestamp" : { "t" : 1548767616, "i" : 1 } }, "signature" : { "hash" : { "$binary" : "M7qA9dMzPj1sC8lfT681vT57oPw=", "$type" : "00" }, "keyId" : { "$numberLong" : "6651444731228192769" } } } }}},
И аккаунт mongodb, который я создал с помощью нижеследующего заявления,
db.createUser({user:"springuser",pwd:"password",roles:[{role:"readWrite",db:"springdatabase"}]})
После анализа исключения Debezium mongodb authSource используется по умолчанию "source='admin'", но authSource моей учетной записи mongodb - "springdatabase", я думаю, что это причина, по которой аутентификация не удалась.
Одним из обходных путей является создание учетной записи mongodb с использованием по умолчанию "admin". Но наша производственная учетная запись mongodb уже создана, поэтому мы не можем ее изменить.
Так есть ли свойство конфигурации для установки 'authSource'?
1 ответ
Действительно, Debezium жестко кодирует соединение администратора, возможно, это было связано с удобством, так как требует чтения из оплога.
Я вижу, что вы создали ошибку в самом проекте, но если вы хотите иметь - на данный момент - безопасное количество необходимых разрешений, вы можете:
// Create a role which allows to list the databases
db.runCommand({createRole:"listDatabases",privileges:[{resource:{cluster:true},
actions:["listDatabases"]}],roles:[]})
// Create a user which can, list the databases, read the oplog (local db), and read the source database (for initial syncs)
db.createUser({
"user" : "debezium_read_only",
"roles" : [
{
"role" : "justListDatabases",
"db" : "admin"
},
{
"role" : "read",
"db" : "database_where_collections_are"
},
{
"role" : "read",
"db" : "local"
}
]
})
Я надеюсь, что это поможет защитить ваши настройки до тех пор, пока в Debezium не станут доступны лучшие параметры входа.
Я боюсь, что это кодированный. Не могли бы вы поднять заявку на функцию Jira, чтобы мы могли взглянуть?