MongoDB 컨테이너를 더 안전하게 만드는 방법은 무엇입니까?

7565 단어 mongodbdockersecurity

도커로 시작



시스템에서 MongoDB 인스턴스를 가져오는 가장 간단한 방법은 아래와 같이 docker를 사용하여 docker 허브에서 실행mongodb image하는 것입니다.

docker run --name mongodb -p 27017:27017 mongo

-p 27017:27017 를 지정하면 설치된 MongoDB 서버와 동일하게 mongodb://localhost:27017 또는 mongodb://0.0.0.0:27017 와 같은 연결 문자열로 접근할 수 있습니다.

이 데이터베이스 인스턴스는 로컬에서만 사용할 수 있습니다. 다른 컴퓨터에서 액세스하려는 경우 기본 구성 파일을 사용자 지정 MongoDB 구성 파일로 덮어써야 합니다.

외부에서 연결 허용



명령은 아래와 같습니다.

docker run --name mongodb -p 27017:27017 -v /path/to/custom/mongod.conf:/etc/mongod.conf mongo


여기서 mongod.conf 파일은 외부에서 연결할 수 있도록 사용자 정의되었습니다.

# mongod.conf

# other settings

# network interfaces
net:
  port: 27017
  # bindIp: 127.0.0.1  # this is default setting
  bindIp: 0.0.0.0  # this is what changed

# other settings


그러나 이제 귀하의 데이터베이스는 공개되어 더 이상 안전하지 않습니다.

제 경험상 이런 상황에서 가장 먼저 해야 할 일은 기본 포트를 변경하는 것입니다.

기본 포트 변경



다른 사용 가능한 포트에 매핑해 보겠습니다.

docker run --name mongodb -p 27117:27017 -v /path/to/custom/mongod.conf:/etc/mongod.conf mongo


따라서 연결 문자열은 기본 포트가 아닌 mongodb://IP_ADDRESS:27117가 됩니다.

아시다시피 인터넷에는 공용 데이터베이스를 자동으로 스캔하는 봇이 많이 있습니다. 그들은 3306(mysql), 5432(posgres), 6379(redis), 27017(mongo) 등과 같이 널리 사용되는 기본 포트를 확인하려고 시도합니다. 이상한 포트로 변경하면 대부분의 경우 도움이 될 수 있습니다.

그러나 그것만으로는 충분하지 않습니다.

인증 활성화



기본적으로 MongoDB는 인증이 비활성화된 상태로 시작됩니다. 진입점을 약간 변경하여 활성화해야 합니다. 관리를 더 쉽게 하기 위해 아래와 같이 docker-compose.yaml 파일을 만듭니다.

version: "3"

services:
  mongodb:
    image: mongo
    container_name: mongodb
    ports:
      - 27117:27017
    volumes:
      - ./mongod.conf:/etc/mongod.conf
    entrypoint: ["mongod", "--auth", "--config", "/etc/mongod.conf"]


위의 .yaml 파일에서 --auth 플래그와 함께 mongodb를 실행하기 위한 사용자 지정 진입점을 추가했습니다. 이제 docker-compose로 실행하면 이전의 mongodb 명령과 유사한 docker run라는 이름의 컨테이너 내에서 MongoDB를 가져와야 합니다.



그리고 다음은 이 글에서 가장 중요한 부분입니다...

특정 권한을 가진 사용자 생성



지금까지 MongoDB 인스턴스에는 아직 사용자가 없습니다. 우리는 그 컨테이너에 들어가서 몇 가지 컨테이너를 만들 것입니다.

먼저 다음을 실행하여 대화형 mongo 셸을 가져옵니다.

docker exec -it mongodb mongo


mongo shell을 열면 이제 명령을 실행하여 admin 데이터베이스로 전환하고 모든 데이터베이스에 대한 관리자 권한이 있는 boss라는 사용자를 생성할 수 있습니다.

use admin
db.createUser({
  user: 'boss',
  pwd: 'YourVeryComplexPassword',
  roles:['userAdminAnyDatabase']
})


완료하고 Ctrl + C를 눌러 셸을 종료하고 해당 세션을 종료합니다.



이때 인증 모드가 활성화된 MongoDB 인스턴스와 관리 사용자가 이미 실행되었습니다. boss 사용자에 대한 연결 문자열은 이제 다음과 같습니다.
mongodb://boss:YourVeryComplexPassword@IP_ADDR:27117
그러나 그것은 고급 사용자이므로 일반 응용 프로그램에는 사용하지 마십시오. 대신 다른 목적을 위해 더 많은 사용자를 만들어야 합니다.

더 많은 사용자나 데이터베이스를 생성하려면 boss 사용자로 mongo shell로 돌아와야 합니다.

docker exec -it mongodb mongo -u boss


요청 시 암호를 입력하면 다음과 같이 표시됩니다.



훌륭한 블로그 게시물을 저장하기 위해 데이터베이스blogs를 사용할 계획이 있다고 가정합니다. 이 데이터베이스에 쓸 수 있는 writer라는 사용자와 읽기만 가능한 reader라는 사용자를 추가해야 합니다.

아래와 같이 하십시오.

# go to database `admin`
use admin

# add writer
db.createUser({
  user: 'writer',
  pwd: 'YourComplexPassword',
  roles:[
    { 
      role: 'readWrite',
      db: 'blogs'
    }
  ]
})

# add reader
db.createUser({
  user: 'reader',
  pwd: 'YourSimplePassword',
  roles:[
    { 
      role: 'read',
      db: 'blogs'
    }
  ]
})


완료하고 Ctrl + C를 눌러 셸을 종료하고 해당 세션을 다시 종료합니다.



이제 2명의 새 사용자가 있습니다. 하나는 읽기/쓰기용이고 다른 하나는 읽기 전용 작업용입니다. 해당 연결 문자열은 다음과 같습니다.
mongodb://writer:YourComplexPassword@IP_ADDR:27117mongodb://reader:YourSimplePassword@IP_ADDR:27117
블로그 게시물만 로드하고 표시하는 앱 또는 API 끝점에서는 reader 에 대한 연결 문자열만 사용하면 됩니다. 그렇지 않으면 블로그 게시물을 더 추가해야 할 때 writer 로 데이터베이스에 연결합니다.

그게 다야. docker와 MongoDB로 즐겁게 놀아보세요 :)

좋은 웹페이지 즐겨찾기