사용자 이름과 비밀번호로 MongoDB를 보호하는 방법


376

원격 액세스가 사용자 이름 및 비밀번호를 요청하도록 MongoDB 인스턴스에 대한 사용자 이름 및 비밀번호 인증을 설정하려고합니다. MongoDB 사이트에서 튜토리얼을 시도하고 다음을 수행했습니다.

use admin
db.addUser('theadmin', '12345');
db.auth('theadmin','12345');

그 후, 나는 나가서 몽고를 다시 달렸다. 그리고 액세스하기 위해 비밀번호가 필요하지 않습니다. 데이터베이스에 원격으로 연결하더라도 사용자 이름 및 비밀번호를 묻는 메시지가 표시되지 않습니다.


업데이트 여기에 내가 사용한 해결책이 있습니다.

1) At the mongo command line, set the administrator:

    use admin;
    db.addUser('admin','123456');

2) Shutdown the server and exit

    db.shutdownServer();
    exit

3) Restart mongod with --auth

  $ sudo ./mongodb/bin/mongod --auth --dbpath /mnt/db/

4) Run mongo again in 2 ways:

   i) run mongo first then login:

        $ ./mongodb/bin/mongo localhost:27017
        use admin
        db.auth('admin','123456');

  ii) run & login to mongo in command line.

        $ ./mongodb/bin/mongo localhost:27017/admin -u admin -p 123456

사용자 이름 및 암호가 동일한 방식으로 작동 mongodump하고 mongoexport.


4
MongDB 버전 2.2.x의 경우
Tom Imrei

22
Mongo 3.0.4에서 사용자 작성 명령은 db.createUser () 입니다.
chronologos

4
Mongodb 3.0에서 관리자를 만들려면 다음을 따르십시오. docs.mongodb.org/v3.0/tutorial/add-user-administrator
Sul Aga

3
MongoDB를 3.0에 대한 업데이트는 : 어떻게 MongoDB를 3.0 인증을 설정합니다 .
Dan Dascalescu

1
분명히하기 위해, 이것은 와이어를 통과하는 바이트를 암호화하지 않습니다. 액세스 제어 전용입니다.
Daniel F

답변:


117

당신은 시작해야 mongod합니다--auth 사용자를 설정 한 후 옵션을 선택합니다.

MongoDB 사이트에서 :

--auth보안을 활성화 하는 옵션으로 데이터베이스 (mongod 프로세스)를 실행하십시오 . 로 서버를 시작하기 전에 admin db에 사용자를 --auth추가했거나 localhost 인터페이스에서 첫 번째 사용자를 추가해야합니다.

MongoDB 인증


1
나는 그것을 시도하고 예제를 따랐다. --auth를 사용하여 서버를 다시 시작한 후 설정할 수 있습니다. 그러나 로그인 (./mongo -u theadmin -p 12345)하려고하면 실패합니다. 로그인 할 수 없습니다.
murvinlai

그 후에도 연결할 수 없으면 adminDB에서 연결을 시도하고 있기 때문에 다른 DB를 사용하고 다시 시도하십시오. userAdmin (AnyDatabase) 만에 연결할 수 있습니다 admin.
Vadorequest

80

와우 너무 복잡하고 혼란스러운 답변이 여기에 있습니다.

이것은 v3.4부터입니다 입니다.

짧은 답변.

1) 액세스 제어없이 MongoDB를 시작하십시오.

mongod --dbpath /data/db

2) 인스턴스에 연결하십시오.

mongo

3) 사용자를 작성하십시오.

use some_db
db.createUser(
  {
    user: "myNormalUser",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "some_db" },
             { role: "read", db: "some_other_db" } ]
  }
)

4) MongoDB 인스턴스를 중지하고 액세스 제어로 다시 시작하십시오.

mongod --auth --dbpath /data/db

5) 사용자로 연결하고 인증하십시오.

use some_db
db.auth("myNormalUser", "xyz123")
db.foo.insert({x:1})
use some_other_db
db.foo.find({})

긴 대답 : 제대로 이해하려면이 내용을 읽으십시오.

정말 간단합니다. https://docs.mongodb.com/manual/tutorial/enable-authentication/ 아래를 바보로 만들 것입니다.

역할의 실제 기능에 대한 자세한 내용은 https://docs.mongodb.com/manual/reference/built-in-roles/를 참조하십시오.

1) 액세스 제어없이 MongoDB를 시작하십시오.

mongod --dbpath /data/db

2) 인스턴스에 연결하십시오.

mongo

3) 사용자 관리자를 작성하십시오. 다음은 admin인증 데이터베이스 에 사용자 관리자를 작성 합니다. 사용자는 데이터베이스 dbOwner가 아니라 some_db데이터베이스가 아니라 admin기억해야합니다.

use admin
db.createUser(
  {
    user: "myDbOwner",
    pwd: "abc123",
    roles: [ { role: "dbOwner", db: "some_db" } ]
  }
)

또는 모든 데이터베이스에서 관리자 인 관리자를 작성하려면 다음을 수행하십시오.

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

4) MongoDB 인스턴스를 중지하고 액세스 제어로 다시 시작하십시오.

mongod --auth --dbpath /data/db

5) admin인증 데이터베이스가 아닌 인증 데이터베이스에 대한 사용자 관리자로 연결하고 인증하십시오 some_db. 사용자 관리자가 admin인증 데이터베이스 에서 작성되었으며 사용자가 some_db인증 데이터베이스에 없습니다.

use admin
db.auth("myDbOwner", "abc123")

이제 데이터베이스 dbOwner이상으로 인증되었습니다 some_db. 이제 some_db데이터베이스를 향해 직접 데이터 를 읽고 쓰거나 변경하려는 경우 데이터베이스로 변경할 수 있습니다.

use some_db
//...do stuff like db.foo.insert({x:1})
// remember that the user administrator had dbOwner rights so the user may write/read, if you create a user with userAdmin they will not be able to read/write for example.

역할에 대한 추가 정보 : https://docs.mongodb.com/manual/reference/built-in-roles/

사용자 관리자가 아닌 일반 사용자 인 추가 사용자를 만들려면 아래에서 계속 읽으십시오.

6) 일반 사용자를 작성하십시오. 이 사용자는 some_db아래 의 인증 데이터베이스 에서 작성 됩니다.

use some_db
db.createUser(
  {
    user: "myNormalUser",
    pwd: "xyz123",
    roles: [ { role: "readWrite", db: "some_db" },
             { role: "read", db: "some_other_db" } ]
  }
)

7) mongo 셸을 종료하고 다시 연결하고 사용자로 인증하십시오.

use some_db
db.auth("myNormalUser", "xyz123")
db.foo.insert({x:1})
use some_other_db
db.foo.find({})

2
마침내 나는 실제로 무슨 일이 일어나고 있는지 알았습니다.
17 년


3
수락 된 답변을 원하기 때문에 원하는 경우 새로 고칠 수 있습니다. 2017 년 7 월 현재 가장 관련성이 높은 솔루션입니다.
azatar

1
답변을 업데이트하십시오! userAdminAnyDatabase 를 어디에서 얻었 는지 모르겠지만 작동하지 않습니다. 역할은 모든 DB에 대한 관리자 액세스의 루트 입니다.
Aakash Verma 23시 26 분

@AakashVerma docs.mongodb.com/manual/reference/built-in-roles/… ;) 또한 개발 목적으로 타협 할 수없는 경우를 제외하고는 절대 루트를 사용하지 마십시오! (tbh는 절대 루트 롤을 사용하지 않습니다)
K-SO의 독성이 증가하고 있습니다.

63

먼저 #auth=truemongod 구성 파일에서 시작하는 행의 주석을 해제 하십시오 (기본 경로 /etc/mongo.conf). mongodb에 대한 인증이 가능합니다.

그런 다음 mongodb를 다시 시작하십시오. sudo service mongod restart


10
기본 경로는 /etc/mongod.conf없습니다/etc/mongo.conf
미스릴

2
또는 먼저 주석을 해제 한 다음 다시 시작하십시오. :)))
GioMac

2
업데이트 : 지금 다시 시작 서비스 : sudo는 서비스 MongoDB를 다시 시작
sharafjaffri

구성 파일 위치 및 이름은 다음과 같습니다. /etc/mongodb.conf
HGMamaci

46

이 답변은 몽고 3.2.1 참조입니다

터미널 1:

$ mongod --auth

터미널 2:

db.createUser({user:"admin_name", pwd:"1234",roles:["readWrite","dbAdmin"]})

역할없이 추가하려는 경우 (선택 사항) :

db.createUser({user:"admin_name", pwd:"1234", roles:[]})

인증 여부 확인 :

db.auth("admin_name", "1234")

그것은 당신에게 줄 것입니다 :

1

다른 :

Error: Authentication failed.
0

2
2.4와 같은 이전 버전은 db.addUser를 사용합니다
arviman

그렇지 않으면 오류가 발생 use admin하기 전에 입력 해야 createUser했습니다.

28

다음은 사용자를 추가하는 자바 스크립트 코드입니다.

  1. 시작 mongod과 함께--auth = true

  2. mongo shell에서 관리자 데이터베이스에 액세스하고 javascript 파일을 전달하십시오.

    몽고 관리자 "Filename.js"

    "Filename.js"

    // Adding admin user
    db.addUser("admin_username", " admin_password");
    // Authenticate admin user
    db.auth("admin_username ", " admin_password ");
    // use  database code from java script
    db = db.getSiblingDB("newDatabase");
    // Adding newDatabase database user  
    db.addUser("database_username ", " database_ password ");
  3. 이제 사용자 추가가 완료되었습니다. mongo 셸에서 데이터베이스 액세스를 확인할 수 있습니다


1
파일에서 사용자 이름과 비밀번호를 설정해도 안전하지 않습니다.
탐험

자바 스크립트. "자바 스크립트"가 아닙니다.
Camilo Martin

여기에서 자바 스크립트 파일의 목적은 무엇입니까?
라비

@CamiloMartin JavaScript는 "Javascript"가 아닙니다.
Madbreaks


10

먼저 터미널에서 mongoDB를 사용하여

mongod

이제 mongo shell use 다음 명령을 실행하십시오.

    use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

액세스 제어로 MongoDB 인스턴스를 다시 시작하십시오.

mongod --auth

이제 다음을 사용하여 명령 줄에서 자신을 인증하십시오.

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

나는 그것을 읽었다

https://docs.mongodb.com/manual/tutorial/enable-authentication/


1
루트를 사용하여 사용자를 정의한 다음 사용자를 찾을 때까지 점점 더 추가해도 MongoDB Enterprise > db.system.users.find() { "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SC RAM-SHA-1" : { "iterationCount" : 10000, "salt" : "k96PCEflidMY5seVju+gAw==", "s toredKey" : "CabQTnJtny7cv0wT5X8oX9QOn3A=", "serverKey" : "RJyCdnlIhyIfj2+d44L61 bYK+MU=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" }, { "role" : "dbAdmin", "db" : "admin" }, { "role" : "userAdmin", "db" : "admin" }, { "role" : "root", "db" : "admin" } ] }여전히 인증 실패
deadManN

난 db.changeUserPassword ()를 사용, 또는 어떤 일 심지어 그 후 난 ( '관리자', '내 패스') 또는 당신이 그것을 수행하는 방법을, db.auth를 호출 할 때, 그것은 인증 사용자 관리 실패 말한다이었다
deadManN

root역할을 사용 하여 다음 역할의 작업 및 모든 리소스에 대한 액세스를 제공합니다. 역할 루트
Laode Muhammad Al Fatih

8

이것이 우분투 18.04에서 한 일입니다.

$ sudo apt install mongodb
$ mongo
> show dbs
> use admin
> db.createUser({  user: "root",  pwd: "rootpw",  roles: [ "root" ]  })  // root user can do anything
> use lefa
> db.lefa.save( {name:"test"} )
> db.lefa.find()
> show dbs
> db.createUser({  user: "lefa",  pwd: "lefapw",  roles: [ { role: "dbOwner", db: "lefa" } ]  }) // admin of a db
> exit
$ sudo vim /etc/mongodb.conf
auth = true
$ sudo systemctl restart mongodb
$ mongo -u "root" -p "rootpw" --authenticationDatabase  "admin"
> use admin
> exit
$ mongo -u "lefa" -p "lefapw" --authenticationDatabase  "lefa"
> use lefa
> exit

8

당신은 변경할 수 있습니다 /etc/mongod.conf .

전에

#security:

security:
    authorization: "enabled"

그때 sudo service mongod restart


5

아래 단계를 순서대로 수행하십시오.

  • CLI를 사용하여 사용자 작성
use admin
db.createUser(
  {
    user: "admin",
    pwd: "admin123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)
  • 인증을 활성화하십시오. OS에 따라 다릅니다. 창을 사용 mongod --auth하는 경우 Linux의 경우 간단히 /etc/mongod.conf파일을 편집하여 추가 할 수 있습니다security.authorization : enabled .Windows 하여 mongd 서비스 한 다음 다시 시작할
  • cli를 통해 연결 mongo -u "admin" -p "admin123" --authenticationDatabase "admin"합니다. 그게 다야

이 게시물 을 확인 하여 자세한 내용을 확인하고 몽구스를 사용하여 연결하는 방법을 배울 수 있습니다.


4

데이터베이스 액세스를 보호하기 위해 특정 데이터베이스의 비밀번호로 사용자 작성 :

use dbName

db.createUser(
   {
     user: "dbUser",
     pwd: "dbPassword",
     roles: [ "readWrite", "dbAdmin" ]
   }
)


3

이 단계는 저에게 효과적이었습니다.

  1. cmd에 mongod --port 27017을 작성하십시오.
  2. 그런 다음 mongo shell에 연결하십시오 : mongo --port 27017
  3. 사용자 admin 작성 : use admin db.createUser ({사용자 : "myUserAdmin", pwd : "abc123", 역할 : [{role : "userAdminAnyDatabase", db : "admin"}]})
  4. 몽고 껍질 분리
  5. mongodb를 다시 시작하십시오. mongod --auth --port 27017
  6. mongo 쉘 시작 : mongo --port 27017 -u "myUserAdmin"-p "abc123"--authenticationDatabase "admin"
  7. 연결 후 인증하려면 mongo 쉘을 mongod에 연결하십시오. mongo --port 27017
  8. 인증 데이터베이스로 전환하십시오 : admin db.auth ( "myUserAdmin", "abc123"사용)

3

다음과 같이 mongoDB에 연결하는 가장 좋은 방법은 다음과 같습니다.

  1. 초기 설치 후

    use admin

  2. 그런 다음 다음 스크립트를 실행하여 관리자를 작성하십시오.

    db.createUser( { user: "YourUserName", pwd: "YourPassword", roles: [ { role: "userAdminAnyDatabase", db: "admin" }, { role: "readWriteAnyDatabase", db: "admin" }, { role: "dbAdminAnyDatabase", db: "admin" }, { role: "clusterAdmin", db: "admin" } ] })

다음 스크립트는 DB의 관리자를 생성합니다.

  1. 다음을 사용하여 db.admin에 로그인하십시오.

    mongo -u YourUserName -p YourPassword admin

  2. 로그인 후 1-3을 반복하여 동일한 관리 자격 증명으로 다른 N 개의 데이터베이스를 작성할 수 있습니다.

이를 통해 MongoDB에서 생성 한 다른 콜렉션에 대해 다른 사용자 및 비밀번호를 작성할 수 있습니다.


이 후 sudo nano /etc/mongod.conf로 이동 하여이 라인 security.authorization : enabled를 넣으면 참조 링크를 볼 수 있습니다 : stackoverflow.com/a/57384027/3904109
DragonFire

2

새 사용자를 만든 후에 grant read/write/root는 사용자 에게 권한을 부여하는 것을 잊지 마십시오 . 당신은 시도 할 수 있습니다

cmd: db.grantRolesToUser('yourNewUsername',[{ role: "root", db: "admin" }])

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.