MongoDB 컨테이너를 더 안전하게 만드는 방법은 무엇입니까?
도커로 시작
시스템에서 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:27117
mongodb://reader:YourSimplePassword@IP_ADDR:27117
블로그 게시물만 로드하고 표시하는 앱 또는 API 끝점에서는
reader
에 대한 연결 문자열만 사용하면 됩니다. 그렇지 않으면 블로그 게시물을 더 추가해야 할 때 writer
로 데이터베이스에 연결합니다.그게 다야. docker와 MongoDB로 즐겁게 놀아보세요 :)
Reference
이 문제에 관하여(MongoDB 컨테이너를 더 안전하게 만드는 방법은 무엇입니까?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ndaidong/how-to-make-your-mongodb-container-more-secure-1646텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)