paint-brush
MongoDB 및 Docker-Compose: 사용자 지정 사용자 및 비밀번호를 자동으로 활성화하는 방법~에 의해@tiago-melo
17,276 판독값
17,276 판독값

MongoDB 및 Docker-Compose: 사용자 지정 사용자 및 비밀번호를 자동으로 활성화하는 방법

~에 의해 Tiago Melo7m2023/05/09
Read on Terminal Reader
Read this story w/o Javascript

너무 오래; 읽다

[MongoDB](http://mongodb.com/)는 널리 사용되는 데이터베이스 관리 시스템입니다. 인증 기능은 기본적으로 활성화되어 있지 않습니다. 이는 사용자가 데이터베이스에 액세스하려면 유효한 자격 증명(사용자 이름 및 비밀번호)을 제공해야 함을 의미합니다. [docker-compose]를 통해 인증을 활성화하고 사용자 지정 사용자/패스를 자동으로 생성하는 방법을 살펴보겠습니다.
featured image - MongoDB 및 Docker-Compose: 사용자 지정 사용자 및 비밀번호를 자동으로 활성화하는 방법
Tiago Melo HackerNoon profile picture

MongoDB는 확장성, 고성능 및 유연성과 같은 여러 기능을 제공하는 널리 사용되는 NoSQL 데이터베이스 관리 시스템입니다.


그러나 MongoDB를 설정할 때 사용자가 명심해야 할 중요한 측면 중 하나는 인증 기능이 기본적으로 활성화되어 있지 않다는 것입니다.


즉, docker-compose를 사용하여 MongoDB 용 새 컨테이너를 생성할 때 인증된 사용자만 데이터베이스에 액세스할 수 있도록 수동으로 인증을 활성화해야 합니다.


그러나 docker-compose 와 같은 도구를 사용하여 외부 종속성을 설정하는 요점은 귀중한 시간을 절약하기 위해 모든 것을 최대한 자동화하는 것입니다.


이 빠른 문서에서는 인증을 활성화하고 docker-compose를 통해 자동으로 사용자 지정 사용자/패스를 생성하는 방법을 살펴보겠습니다.

샘플 프로젝트

Go 로 작성된 샘플 프로젝트를 보여드리겠습니다.



  • Javascript를 사용하여 특정 데이터베이스에 대한 사용자 정의 사용자 및 비밀번호를 생성하십시오.


  • 위의 자격 증명을 사용하여 MongoDB 인스턴스에 연결합니다.

docker-compose.yaml

 version: "3.9" services: mongodb: container_name: mongodb-sample image: mongo:latest restart: always ports: - "27017:27017" volumes: - mongodb-data:/data/db - ./db/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js env_file: - .env command: [--auth] volumes: mongodb-data:


Docker Compose 파일에서 명령 키는 시작 시 컨테이너 내에서 실행되어야 하는 명령을 지정하는 데 사용됩니다. MongoDB 컨테이너의 경우 명령 키의 일반적인 용도 중 하나는 --auth 옵션을 mongod 프로세스에 전달하여 인증을 활성화하는 것입니다.


--auth 옵션이 mongod 프로세스에 전달되면 MongoDB 인스턴스에 대한 인증이 활성화됩니다. 이는 사용자가 데이터베이스에 액세스하려면 유효한 자격 증명(사용자 이름 및 비밀번호)을 제공해야 함을 의미합니다.


인증이 없으면 MongoDB 인스턴스에 액세스할 수 있는 사람은 누구나 민감한 데이터에 액세스, 수정 또는 삭제할 수 있으며, 이로 인해 심각한 보안 위반이 발생할 수 있습니다.


- ./db/mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js를 실행하여 db/mongo-init.js 파일을 컨테이너에 복사하고 있습니다 .

MongoDB JavaScript 사용자/패스 생성 파일

db/mongo-init.js

 db = db.getSiblingDB('sample_db') db.createUser({ user: 'some_user', pwd: 'random_pass', roles: [ { role: 'dbOwner', db: 'sample_db', }, ], });


메이크파일

 SHELL = /bin/bash DOCKER_MONGODB=docker exec -it mongodb-sample mongosh -u $(ADMIN_USER) -p $(ADMIN_PASSWORD) --authenticationDatabase admin DOCKER_MONGODB_WITH_CUSTOM_CREDS=docker exec -it mongodb-sample mongosh -u $(DB_USER) -p $(DB_PASS) --authenticationDatabase $(DB_NAME) .PHONY: help ## help: shows this help message help: @ echo "Usage: make [target]" @ sed -n 's/^##//p' ${MAKEFILE_LIST} | column -t -s ':' | sed -e 's/^/ /' .PHONY: setup-db ## setup-db: sets up MongoDB setup-db: export ADMIN_USER=admin setup-db: export ADMIN_PASSWORD=f3MdBEcz setup-db: @ echo "Setting up MongoDB..." @ docker-compose up -d mongodb @ until $(DOCKER_MONGODB) --eval 'db.getUsers()' >/dev/null 2>&1 && exit 0; do \ >&2 echo "MongoDB not ready, sleeping for 5 secs..."; \ sleep 5 ; \ done @ echo "... MongoDB is up and running!" .PHONY: mongodb-console ## mongodb-console: opens MongoDB console mongodb-console: export DB_USER=some_user mongodb-console: export DB_PASS=random_pass mongodb-console: export DB_NAME=sample_db mongodb-console: @ ${DOCKER_MONGODB_WITH_CUSTOM_CREDS} .PHONY: run ## run: runs the application run: setup-db @ go run cmd/main.go .PHONY: cleanup ## cleanup: removes MongoDB and associated volumes cleanup: @ docker-compose down @ docker volume rm $$(docker volume ls -q) .PHONY: test ## test: runs unit tests test: @ go test -v ./...


실행 대상에 의해 호출되는 setup-db 대상은 MongoDB 에 계속 연결을 시도하므로 기본 Go 프로그램이 안전하게 연결을 시도할 수 있습니다.

몽고DB에 연결


.env

 MONGO_INITDB_ROOT_USERNAME=admin MONGO_INITDB_ROOT_PASSWORD=f3MdBEcz MONGODB_DATABASE=sample_db MONGODB_USER=some_user MONGODB_PASSWORD=random_pass MONGODB_HOST_NAME=localhost MONGODB_PORT=27017


구성/config.go

 // Copyright (c) 2023 Tiago Melo. All rights reserved. // Use of this source code is governed by the MIT License that can be found in // the LICENSE file. package config import ( "github.com/joho/godotenv" "github.com/kelseyhightower/envconfig" "github.com/pkg/errors" ) // Config holds all configuration needed by this app. type Config struct { MongoDbUser string `envconfig:"MONGODB_USER"` MongoDbPassword string `envconfig:"MONGODB_PASSWORD"` MongoDbDatabase string `envconfig:"MONGODB_DATABASE"` MongoDbHostName string `envconfig:"MONGODB_HOST_NAME"` MongoDbPort int `envconfig:"MONGODB_PORT"` } var ( godotenvLoad = godotenv.Load envconfigProcess = envconfig.Process ) func ReadConfig() (*Config, error) { if err := godotenvLoad(); err != nil { return nil, errors.Wrap(err, "loading env vars") } config := new(Config) if err := envconfigProcess("", config); err != nil { return nil, errors.Wrap(err, "processing env vars") } return config, nil }


db/mongodb.go

 // Copyright (c) 2023 Tiago Melo. All rights reserved. // Use of this source code is governed by the MIT License that can be found in // the LICENSE file. package db import ( "context" "fmt" "github.com/pkg/errors" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) type MongoDb struct { database string client *mongo.Client } // For ease of unit testing. var ( connect = func(ctx context.Context, client *mongo.Client) error { return client.Connect(ctx) } ping = func(ctx context.Context, client *mongo.Client) error { return client.Ping(ctx, nil) } ) // ConnectToMongoDb connects to a running MongoDB instance. func ConnectToMongoDb(ctx context.Context, user, pass, host, database string, port int) (*MongoDb, error) { client, err := mongo.NewClient(options.Client().ApplyURI( uri(user, pass, host, database, port), )) if err != nil { return nil, errors.Wrap(err, "failed to create MongoDB client") } err = connect(ctx, client) if err != nil { return nil, errors.Wrap(err, "failed to connect to MongoDB server") } err = ping(ctx, client) if err != nil { return nil, errors.Wrap(err, "failed to ping MongoDB server") } return &MongoDb{ database: database, client: client, }, nil } // uri generates uri string for connecting to MongoDB. func uri(user, pass, host, database string, port int) string { const format = "mongodb://%s:%s@%s:%d/%s" return fmt.Sprintf(format, user, pass, host, port, database) }


cmd/main.go

 // Copyright (c) 2023 Tiago Melo. All rights reserved. // Use of this source code is governed by the MIT License that can be found in // the LICENSE file. package main import ( "context" "fmt" "os" "github.com/pkg/errors" "github.com/tiagomelo/docker-mongodb-custom-user-pass/config" "github.com/tiagomelo/docker-mongodb-custom-user-pass/db" ) func run() error { ctx := context.Background() config, err := config.ReadConfig() if err != nil { return errors.Wrap(err, "reading config") } _, err = db.ConnectToMongoDb(ctx, config.MongoDbUser, config.MongoDbPassword, config.MongoDbHostName, config.MongoDbDatabase, config.MongoDbPort, ) if err != nil { return errors.Wrap(err, "connecting to MongoDB") } fmt.Println("successfully connected to MongoDB.") return nil } func main() { if err := run(); err != nil { fmt.Println(err) os.Exit(1) } }


실행하기

 $ make run Setting up MongoDB.. [+] Running 3/3 ⠿ Network docker-mongodb-custom-user-pass_default Created 0.0s ⠿ Volume "docker-mongodb-custom-user-pass_mongodb-data" Created 0.0s ⠿ Container mongodb-sample Started 0.3s MongoDB not ready, sleeping for 5 secs... ... MongoDB is up and running! successfully connected to MongoDB..


"MongoDB에 성공적으로 연결되었습니다." 메시지에는 연결할 수 있다고 나와 있습니다.

MongoDB 쉘 액세스

 $ make mongodb-console Current Mongosh Log ID: 645955b82bcce4a09d59bda3 Connecting to: mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&authSource=sample_db&appName=mongosh+1.8.2 Using MongoDB: 6.0.5 Using Mongosh: 1.8.2 For mongosh info see: https://docs.mongodb.com/mongodb-shell/ test> use sample_db switched to db sample_db sample_db>


소스 다운로드

여기: https://github.com/tiagomelo/docker-mongodb-custom-user-pass