MongoDB-관리자 권한이 없습니다


200

MongoDB에 권한을 추가하려고합니다.
MongoDB 2.6.1을 사용하여 Linux 에서이 모든 작업을 수행하고 있습니다.
내 mongod.conf 파일은 이전 호환성 형식입니다
(설치와 함께 제공되는 방식).

1) 여기 (3)에 설명 된대로 관리자를 만들었습니다.

http://docs.mongodb.org/manual/tutorial/add-user-administrator/

2) 그런 다음이 줄의 주석을 해제하여 mongod.conf를 편집했습니다.

auth = true

3) 마지막으로 mongod 서비스를 재부팅하고 로그인을 시도했습니다.

/usr/bin/mongo localhost:27017/admin -u sa -p pwd

4) 연결할 수는 있지만 연결시 이것을 말합니다.

MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:47:16 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }

5) 이제 sa내가 만든 이 사용자에게는 권한이없는 것 같습니다 .

root@test02:~# mc
MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:57:03 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }
[admin] 2014-05-29 17:57:03.011 >>> use admin
switched to db admin
[admin] 2014-05-29 17:57:07.889 >>> show collections
2014-05-29T17:57:10.377-0400 error: {
        "$err" : "not authorized for query on admin.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[admin] 2014-05-29 17:57:10.378 >>> use test
switched to db test
[test] 2014-05-29 17:57:13.466 >>> show collections
2014-05-29T17:57:15.930-0400 error: {
        "$err" : "not authorized for query on test.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[test] 2014-05-29 17:57:15.931 >>>

무엇이 문제입니까? 이 전체 절차를 3 번 ​​반복
했으며 MongoDB 문서에 지정된대로 모두 수행했다고 생각합니다. 그러나 작동하지 않습니다.
sa사용자 는
다른 사용자를 생성하고보다 구체적인 권한을 부여 할 수 있도록 모든 작업을 수행 할 권한이 있어야합니다 .


20
이것은 매우 성가 시거나 잘못 문서화되었습니다. 나는 거기에서 나 자신을 고투하고 있었다. 결국, 나는 글로벌 "루트"역할을 가진 사용자가 여전히 명령을 실행하는 것과 같은 일을 할 수 없습니다 ...
ToBe

답변:


471

또한 같은 문제에 대해 머리를 긁고 있었고 첫 번째 관리자를 추가 할 때 역할을 루트로 설정 한 후에 모든 것이 작동했습니다.

use admin
db.createUser(
  {
    user: 'admin',
    pwd: 'password',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);
exit;

이미 admin사용자를 만든 경우 다음 과 같이 역할을 변경할 수 있습니다.

use admin;
db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])

전체 인증 설정 참조 는 인터넷을 통해 몇 시간 동안 조사한 후 컴파일 한 단계를 참조하십시오 .


154
WTF ?! 이런 바보 같은 것에 대해 한 시간을 잃었습니다. 왜 문서 userAdminAnyDatabase대신 문서 를 작성 root합니까?
akostadinov

15
아이디어는 먼저 다른 사용자를 관리하는 데만 사용되는 사용자 (따라서 "userAdmin"로 시작하는 역할)를 작성한 다음 일반 사용자 만 작성하는 것입니다. 그것은 말이 되겠지만, 나도 그것을 처음으로 이해하지 못했습니다 ... @akostadinov
TomTasche

10
이것은 MongoDB v3.4.7에서 작동하지 않았습니다.db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384

2
이 코드는 @Cerin DID 나를 위해 일을 : db.grantRolesToUser('admin',[{ role: "root", db: "admin" }]), 그리고 그하게 나를 혼란. 명령을 실행할 권한이 없지만 명령을 실행하여 자신을 루트로 만든 다음 해당 명령 실행할 수 있습니다. 아주 이상한 : S

2
있는 사람들을 위해 db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])없는 일을했다, 당신이 다시 전환해야합니다 use admin내가 다시 전환하면 ... 같은 문제가 있었다, 그것이 마치 마법처럼 일했다
esko22

37

약간 혼란 스럽습니다. 데이터베이스를 쿼리하려면 readWrite를 부여해야한다고 생각합니다. dbadmin 또는 useradmin 사용자는 데이터베이스를 관리 할 수 ​​있지만 (추가 권한 부여 포함) 쿼리를 수행하거나 데이터를 쓸 수는 없습니다.

그래서 당신에게 readWrite를 부여하면 괜찮을 것입니다-

http://docs.mongodb.org/manual/reference/built-in-roles/#readWrite


이 답변이 질문과 관련이 있는지 확실하지 않지만 잘못된 정보를 제공하는 방법입니다. 다음 dbOwner 역할은 읽기 쓰기 역할 포함 docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
앤디 트릭스

10
대답은 정확합니다. dbadmin 및 useradmin 역할 (원래 포스터에 대한 요청)에 readWrite가 포함되어 있지 않습니다. dbOwner는 그렇게하지만 원래 포스터가 사용하고 묻지 않은 것은 아닙니다.
John Petrone

3
당신 말이 맞아요 사과. 나는 너무 오랜 시간을 울려서 역할을했다.
Andy Triggs

따라서 관리자가 실제 mongodb 서버에 액세스하도록하고 특정 데이터베이스를위한 다른 사용자를 가질 수 있습니까?
K-SO의 독성이 증가하고 있습니다.

32

현재 사용자를 변경하는 방법에 대한 간단한 예가 누군가에게 도움이 될 것입니다. 이것이 내가 실제로 찾던 것입니다.

@JohnPetrone의 조언에 따라 grantRolesToUser 를 사용하여 관리자에게 readWrite 역할을 추가 했습니다.

> use admin
> db.grantRolesToUser("admin",["readWrite"])
> show collections
system.users
system.version

26

--authenticationDatabase 플래그를 사용하면 도움이됩니다.

mongo --port 27017 -u "admin" -p "password" --authenticationDatabase "admin"

8

이 답변 이이 스레드에서 실제로 늦어지고 있음을 알고 있지만 확인하시기 바랍니다.

이 오류가 발생하는 이유는 지금까지 수집 한 사용자에게 부여한 특정 역할을 기반으로하며, 해당 사용자에게 역할을 부여하면 root문제를 해결할 수 있지만 이러한 역할을 부여하기 전에 먼저 해당 역할이 수행하는 작업을 이해해야합니다. 사용자에게.

학습서에서는 userAdminAnyDatabase기본적으로 모든 데이터베이스의 사용자를 관리 할 수있는 역할을 사용자에게 부여했습니다 . 사용자와 관련하여 수행하려는 작업이 역할 정의를 벗어났습니다.

root역할은 정의뿐만 아니라 같은에 포함이 역할을 가지고 readWriteAnyDatabase, dbAdminAnyDatabase그것을 슈퍼 유저를 만들고 다른 역할을 (기본적으로 당신이 그것으로 아무것도 할 수 있기 때문에).

역할 정의를 확인하여 특정 작업을 완료하기 위해 사용자에게 어떤 역할을 부여해야하는지 확인할 수 있습니다. https://docs.mongodb.com/manual/reference/built-in-roles/ 모든 사용자를 슈퍼 사용자로 만드는 것은 좋지 않습니다. :)


근본이 아니라면 문제를 해결하기 위해 어떤 역할을 제안합니까?
Hendy Irawan

안녕하세요 @HendyIrawan, 각 사용자가 정확히 무엇을 할 수 있는지 결정하고 그들 만 할 수있는 역할을 부여하는 것이 좋습니다. 예를 들어, 사용자가 (질문과 관련이있는 show collections) 읽기만하려는 경우 에는 그 능력을 부여해야합니다 roles: [ { role: "read", db: "admin" } ]. 여기서 역할은 읽히고 데이터베이스에 따라 다르며 그 외에는 아무것도 할 수 없습니다. 다른 역할 docs.mongodb.com/manual/reference/built-in-roles
el Punch

여기에있는 질문에 대한 대답 ( "예"가 아님)이 "읽기"입니까?
Hendy Irawan

예. 사용자는 지정된 DB 만 읽을 수 있습니다.
el Punch

2

간단한 질문입니다.

  1. 대상 db NOT admin을 전환해야합니다 .

yourDB를 사용하십시오

  1. 로 DB 인증을 확인하십시오.

사용자에게 표시

  1. 질문 인 {} 빈 오브젝트를 얻는 경우. 당신은 입력해야합니다

db.createUser ({사용자 : "yourUser", 암호 : "password", 역할 : [ "readWrite", "dbAdmin"]})

또는

db.grantRolesToUser ( 'yourUser', [{역할 : "dbAdmin", db : "yourDB"}])


0

Windows 환경에서 비슷한 문제가 발생했습니다. Bitnami DreamFactory를 설치했으며 시스템 부팅시 시작된 다른 MongoDb도 설치합니다. MongoDbService (오류없이 시작됨)를 실행하고 있었지만 실제로 Bitnami의 MongoDb 서비스에 연결되어 있다는 시간을 많이 잃어버린 것을 알았습니다. 서버에서 다른 mongoDB 인스턴스가 실행되고 있지 않은지 살펴보십시오.

행운을 빕니다!


2
이 답변이 다운 보트 된 이유를 모르겠습니다. 이것은 합법적 인 제안입니다. 예를 들어, 나는 Tomcat을 실행하는 관리 콘솔을 실행했습니다. 모든 유형의 로컬 서버를 시작하면 연결하려고 시도하여 실행 중인지 확인할 수 있습니다. 첫 번째 연결이 성공합니다. 그런 다음 서버의 로그를 확인하고 서버가 원하는 포트에 바인딩 할 수 없음을 확인하기 전에 "숨겨진"서버와 씨름합니다.
Paul

0

또한 mongo 셸 클라이언트가 mongod인스턴스에 올바르게 연결되지 않으면 "Permission Denied"오류가 나타날 수 있습니다.

연결 포트를 확인하여 클라이언트가 연결을 열어야하지만 사용중인 포트가 사용 중이 아닌지 확인하십시오 mongod. --port <port>쉘과 프로세스 모두에서 매개 변수를 사용하여 다른 포트를 설정할 수 있습니다 .


0

MongoDB Compass 의 호스트 이름으로 인해 프로젝트 대신 관리자를 가리키고 있기 때문에이 문제가 발생 했습니다. 호스트 이름 뒤에 / projectname을 추가하여 수정했습니다. :) 다음을 시도하십시오.

  1. MongoDB 아틀라스 웹 사이트 에서 프로젝트를 선택하십시오
  2. MongoDB Compass와 연결 / 연결
  3. 나침반 다운로드 / OS 선택
  4. Compass 1.12 이상을 사용했습니다
  5. Compass 1.12 이상에서 연결 문자열을 복사하십시오.
  6. MongoDB Compass / Connect 열기 (왼쪽 상단) / Connect To
  7. 연결 문자열 감지 / 예 /
  8. 호스트 이름 뒤에 프로젝트 이름을 추가하십시오 : cluster9-foodie.mongodb.net/ projectname
  9. POSTMAN으로 API를 연결하고 테스트했습니다.
  10. 성공했습니다.

코드에서도 동일한 연결 문자열을 사용하십시오.

  1. 전에:
    • mongodb + srv : // 프로젝트 이름 : 암호 @ cluster9-foodie.mongodb.net / admin
  2. 후:
    • mongodb + srv : // 프로젝트 이름 : 암호 @ cluster9-foodie.mongodb.net / 프로젝트 이름

행운을 빕니다.


0

mydb
db.createUser ({사용자 : "test", pwd : "secret", 역할 : [ "readWrite", "dbAdmin"], passwordDigestor : "server"})를 사용하십시오.


0

관리자 db에 인증을 받았으며 DB에서 '로컬 호스트 예외'를 피할 수있는 올바른 권한을 가진 역할이 필요하다는 것에 동의했습니다 (이것은 mongoDB의 호스팅 온-프레미스에 대한 것임). Mongo Atlas를 사용하여 만든 mongoDB에 액세스하는 동안 거의 모든 명령에서 권한이 부여되지 않은 예외가 발생 하는 이유는 다음과 같습니다. 이유는 다음과 같습니다.

/dba/219003/not-authorized-on-admin-to-execute-command-mongodb-atlas-m0-free-tier-cluster?newreg=471a9a26108243d78d4ca74a87e7a115

mongoDB를 호스팅 한 경우에도 확인하십시오. mongo Atlas .

https://docs.atlas.mongodb.com/unsupported-commands/


0
Use Admin :
    use admin

Create a super user : 

    db.createUser(
    {
    user: "master",
    pwd: "test@123",
    roles: [ 
    { 
    role: "readWriteAnyDatabase", 
    db: "admin" 
    }, 
    {
    "role" : "dbAdminAnyDatabase",
    "db" : "admin"
    },
    {
    "role" : "clusterAdmin",
    "db" : "admin"
    },
    "userAdminAnyDatabase" 
    ]
    }
    )

이 코드 스 니펫에 대해 약간의 단기적인 도움을 제공 할 수 있습니다. 적절한 설명 이것이 문제에 대한 좋은 해결책 인지 보여줌으로써 장기적인 가치를 크게 향상시킬 것이며, 다른 비슷한 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
Toby Speight 2018 년

0

MongoDB 4.2의 Centos 7에서이 단계를 수행했습니다. (원격 사용자)

mongod.conf 파일 업데이트

vi /etc/mongod.conf
   net:
     port: 27017
     bindIp: 0.0.0.0 
   security:
     authorization: enabled

MongoDB 서비스 악마 시작

systemctl start mongod

MongoDB 쉘 열기

mongo

쉘에서이 명령을 실행

use admin
db.createUser(
  {
    user: 'admin',
    pwd: 'YouPassforUser',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);

원격 루트 사용자가 작성되었습니다. 이제 개발자 컴퓨터에서 MongoDB GUI 도구를 사용하여이 데이터베이스 연결을 테스트 할 수 있습니다. Robo 3T 처럼


-10

mongodb.conf에서 noAuth = true를 설정하지 않았기 때문일 수 있습니다.

# Turn on/off security.  Off is currently the default
noauth = true
#auth = true

이것을 설정 한 후 다음을 사용하여 서비스를 다시 시작하십시오.

서비스 mongod 재시작


1
사용자는 명시 적으로 권한 부여를 사용하기를 원하므로 auth = true의 주석을 해제했습니다. 인증을 비활성화하는 이유는 무엇입니까?
Alex 75

나중에 문제를 읽지 않은 것 같습니다 ... OP는 사용자 설정에 대한 s-hunter의 응답과 사용자 정의 구성에 연결하기위한 jremi의 조합 인 auth를 원합니다.
ChrisN
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.