Database/NoSQL

[mongoDB] 몽고DB 사용자(어드민) 계정 추가(삭제) 등 사용자 및 인증을 관리하는 방법

코딩for 2022. 10. 21. 15:59
반응형

MongoDB 계정 생성(삭제)

 

1. admin 계정 추가

  use admin
  db.createUser({
    user:'admin',
    pwd:'admin_pwd',
    roles: [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        },
        {
            "role" : "dbAdminAnyDatabase",
            "db" : "admin"
        },
        {
            "role" : "readWriteAnyDatabase",
            "db" : "admin"
        }
    ]
})

 

2. 일반 사용자 계정 추가

use dbname
db.createUser({ 
  user: "user",
  pwd: "password",
  roles: [
    "dbAdmin",
    "readWrite"
  ]
})

 

* roles 에 대한 정의는 아래에서 자세히 확인 가능

https://www.mongodb.com/docs/manual/reference/built-in-roles/

 

Built-In Roles — MongoDB Manual

Docs Home → MongoDB Manual MongoDB grants access to data and commands through role-based authorization and provides built-in roles that provide the different levels of access commonly needed in a database system. You can additionally create user-defined

www.mongodb.com

 

3. 계정 삭제

use dbName
db.dropUser("user_name")

 


MongoDB에서 사용자 및 인증을 관리하는 방법 (번역)

 

 

MongoDB Users and Authentication - Create, List, and Delete

Find out how to configure user accounts and set up authentication credentials on your MongoDB server, including how to create, delete, and show list of users.

www.prisma.io

우리가 사용할 명령과 방법

MongoDB 내에서 사용자를 생성, 수정 및 삭제하고 인증을 구성하려면 다음과 같은 핵심 방법이 필요합니다.

  • db.createUser: 새로운 MongoDB 사용자 계정 생성
  • db.updateUser: 사용자 계정의 세부 정보 업데이트
  • db.changeUserPassword: 사용자 계정에서 사용하는 비밀번호 변경
  • db.dropUser: MongoDB 사용자 계정 삭제

또한 다음 데이터베이스 명령은 시스템의 사용자에 대한 정보를 찾는 데 유용합니다.

  • db.runCommand('usersInfo'): 하나 이상의 MongoDB 사용자 계정에 대한 정보 표시

필요한 권한

위의 명령을 실행하려면 다양한 권한 작업 이 있는 계정으로 MongoDB에 로그인해야 합니다 . 필요한 특정 권한은 사용해야 하는 명령에 따라 다릅니다.

다른 사용자에 대한 정보를 얻으려면 현재 사용자가 다음 권한 작업을 활성화해야 합니다.

새 사용자를 만들려면 현재 사용자가 다음 권한 작업을 활성화해야 합니다.

사용자의 암호 또는 계정 세부 정보를 변경하려면 다음 권한이 필요할 수 있습니다.

이 가이드에서는 역할 관리를 다루지 않으므로 grantRole및 revokeRole권한 작업이 필요하지 않습니다.

사용자 계정을 삭제하려면 현재 사용자가 다음 권한 작업을 활성화해야 합니다.

MongoDB가 사용자 및 인증을 구현하는 방법 이해

계정 생성 및 관리를 시작하기 전에 MongoDB가 이 정보를 정의하고 저장하는 방법에 익숙해지는 것이 좋습니다.

MongoDB에서 사용자 계정은 계정 사용자 이름과 특정 인증 데이터베이스의 조합입니다. 인증 데이터베이스는 단순히 사용자가 정의된 데이터베이스이며 범위나 권한에 대한 제한을 의미하지 않습니다. 인증 데이터베이스는 다른 데이터를 관리하는 데 사용되는 일반 데이터베이스이며 특별한 전용 데이터베이스가 아닙니다.

사용자 계정 이름은 인증 데이터베이스에서 고유해야 합니다. 그러나 동일한 사용자 이름을 다른 인증 데이터베이스에서 재사용하여 고유한 새 사용자 계정을 만들 수 있습니다.

이 디자인의 결과로 계정은 사용자 이름과 인증 데이터베이스를 포함해야만 정확하게 식별할 수 있습니다. 계정을 인증하려면 계정과 연결된 자격 증명도 제공할 수 있어야 합니다. 이것은 일반적으로 암호이지만 인증서일 수도 있습니다.

사용자는 어떻게 만드나요?

이제 MongoDB가 사용자 계정을 개념화하는 방법을 살펴보았으므로 새 사용자를 만드는 방법에 대해 논의할 수 있습니다. 따라갈 수 있는 적절한 권한이 있는 사용자로 MongoDB 서버에 로그인하는 것을 잊지 마십시오.

새 사용자를 생성하려면 먼저 새 사용자의 인증 데이터베이스로 사용할 데이터베이스로 전환해야 합니다.

먼저 다음을 입력하여 시스템에 이미 구성된 데이터베이스 목록을 얻을 수 있습니다.

show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

use다음 명령 을 사용하여 사용자가 연결할 데이터베이스로 전환합니다 .

use admin

switched to db admin

새 사용자를 만들려면 방법을 사용하거나 데이터베이스 명령 db.createUser()을 사용할 수 있습니다 . createUser어느 쪽이든 사용자 이름( user필드), 암호( pwd필드) 및 개체 내에서 사용자가 추가되어야 하는 역할 배열( roles키)을 전달해야 user합니다.

이 메서드를 사용하여 빈 역할 배열로 tom설정된 암호로 호출되는 새 사용자를 만들려면 다음을 입력합니다.hellotheredb.createUser()

db.createUser({
user: "tom",
pwd: "hellothere",
roles: []
})
Successfully added user: { "user" : "tom", "roles" : [ ] }

데이터베이스 명령을 사용하는 동일한 작업 createUser은 다음과 같습니다.

db.runCommand({
createUser: "tom",
pwd: "hellothere",
roles: []
})
Successfully added user: { "user" : "tom", "roles" : [ ] }

 

두 가지 다른 옵션은 매우 유사하므로 앞으로 적용 가능한 데이터베이스 메서드만 표시합니다. 그러나 데이터베이스 명령 구문을 선호하는 경우 MongoDB 명령 참조 문서 에서 연결된 각 명령을 찾을 수 있습니다 .

위의 명령에서 우리는 user객체 내에서 인라인으로 암호를 명시적으로 정의했습니다. 암호가 기록되고 검색되는 것을 방지하기 위해 문서 passwordPrompt()내에서 방법을 사용 user하여 명령이 실행될 때 MongoDB가 대화식으로 암호를 묻는 메시지를 표시하도록 할 수 있습니다. 암호가 표시되지 않으므로 명령 기록이 깨끗해집니다.

db.createUser({
user: "tom",
pwd: passwordPrompt(),
roles: []
})
Enter password:
Successfully added user: { "user" : "tom", "roles" : [ ] }

TLS/SSL을 활성화하지 않은 경우 비밀번호가 여전히 일반 텍스트로 서버에 전송된다는 점을 염두에 두십시오.

기존 사용자를 어떻게 표시합니까?

다음으로 기존 사용자에 대한 정보를 찾는 방법을 살펴보겠습니다.

여러 사용자를 반환하려면 db.getUsers()on 메서드를 사용하여 현재 데이터베이스 내의 모든 사용자를 표시할 수 있습니다. 먼저 쿼리하려는 데이터베이스로 전환합니다.

use admin

다음으로 db.getUsers()메서드를 사용하여 현재 데이터베이스와 연결된 모든 사용자를 반환합니다.

db.getUsers()
[
    {
            "_id" : "admin.root",
            "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),
            "user" : "root",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "root",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    },
    {
            "_id" : "admin.tom",
            "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),
            "user" : "tom",
            "db" : "admin",
            "roles" : [ ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
]

각 사용자의 자격 증명 정보를 추가로 표시하려면 다음 showCredentials키를 사용하여 메서드에 개체를 전달합니다 true.

 
use admin
db.getUsers({
    showCredentials: true
})
[
        {
                "_id" : "admin.root",
                . . .
                "credentials" : {
                        "SCRAM-SHA-1" : {
                                "iterationCount" : 10000,
                                "salt" : "WpB0H4f7dG8XlCDyaVzarA==",
                                "storedKey" : "b11nA1+mGo3+Tr8P//u3NEdJLHk=",
                                "serverKey" : "3xE8o663hjqySrMCQcXjSxmjmhk="
                        },
                        "SCRAM-SHA-256" : {
                                "iterationCount" : 15000,
                                "salt" : "UtsfNRedf2ek5tbWFoGs2g52U0H7Na44wV4rYA==",
                                "storedKey" : "mz9/qHnI79pNAIQm0MZTKZ0U3qFk0xhUDd2grvKtMdI=",
                                "serverKey" : "c/sA4j+I/29Ea1y07zxoMcBgHFoYTUAa6luX3Z9sToQ="
                        }
                },
                . . .
        },
        {
                "_id" : "admin.tom",
                . . .
                "credentials" : {
                        "SCRAM-SHA-1" : {
                                "iterationCount" : 10000,
                                "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",
                                "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",
                                "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="
                        },
                        "SCRAM-SHA-256" : {
                                "iterationCount" : 15000,
                                "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",
                                "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",
                                "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="
                        }
                },
                . . .
        }
]

filter특정 기준과 일치하는 사용자를 쿼리하기 위해 일치 조건을 정의하는 키를 정의하는 개체를 전달할 수 있습니다 .

예를 들어 현재 데이터베이스에서 root역할이 있는 모든 사용자에 대한 정보를 얻으려면 다음을 입력할 수 있습니다.

use admin
db.getUsers({
    filter: {
        "roles.role": "root"
    }
})
[
        {
                "_id" : "admin.root",
                "userId" : UUID("f5ded238-19c9-4886-b649-711ec36993cb"),
                "user" : "root",
                "db" : "admin",
                "roles" : [
                        {
                                "role" : "root",
                                "db" : "admin"
                        }
                ],
                "mechanisms" : [
                        "SCRAM-SHA-1",
                        "SCRAM-SHA-256"
                ]
        }
]

db.getUser()특정 사용자를 얻으려면 대신 메서드를 사용할 수 있습니다 . 이것은 db.getUsers()메서드처럼 작동하지만 단일 사용자를 반환합니다. 메소드에 객체를 전달하는 대신 검색하려는 사용자 이름이 포함된 문자열을 전달합니다.

use admin
db.getUser("tom")
{
        "_id" : "admin.tom",
        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),
        "user" : "tom",
        "db" : "admin",
        "roles" : [ ],
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}

args다음 키를 로 설정하여 원하는 추가 정보를 지정할 수 있는 추가 개체를 선택적으로 포함할 수 있습니다 true.

  • showCredentials: 일반 출력 외에 자격 증명 정보를 표시합니다.
  • showPrivileges: 일반 출력 외에 권한 정보를 보여줍니다.
  • showAuthenticationRestrictions: 일반 출력 외에 계정에 대한 인증 제한을 보여줍니다.

예를 들어 다음을 입력하여 위의 모든 정보를 제공하도록 MongoDB에 지시할 수 있습니다.

use admin
db.getUser("tom",
{
    showCredentials: true,
    showPrivileges: true,
    showAuthenticationRestrictions: true
})
{
        "_id" : "admin.tom",
        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),
        "user" : "tom",
        "db" : "admin",
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ],
        "credentials" : {
                "SCRAM-SHA-1" : {
                        "iterationCount" : 10000,
                        "salt" : "qCbxWQSGt3QoN3S1aM5AEg==",
                        "storedKey" : "hypim5+m2wqbS1gc47o2itc7jew=",
                        "serverKey" : "h9myNoSvY2015yqvw3UldmJzZCg="
                },
                "SCRAM-SHA-256" : {
                        "iterationCount" : 15000,
                        "salt" : "lNtIVL79J8FF+uPaFfRMwPK079gfLEUrsQe3Qg==",
                        "storedKey" : "u8pgn3OJiZxIwEL7ryZkoAF5bnMefQEEsZDTXNDCTRY=",
                        "serverKey" : "BmmfVeikSA0DN1aZmyZP9NXi5owxGr1ZRmVX2XH8qVg="
                }
        },
        "roles" : [ ],
        "inheritedRoles" : [ ],
        "inheritedPrivileges" : [ ],
        "inheritedAuthenticationRestrictions" : [ ],
        "authenticationRestrictions" : [ ]
}
 
 

MongoDB 사용자의 비밀번호는 어떻게 변경합니까?

사용자의 비밀번호를 변경하려면 이 방법을 사용할 수 있습니다 db.changeUserPassword(). 다시 말하지만, 명령을 실행하기 전에 사용자의 인증 데이터베이스로 전환해야 합니다.

 db.changeUserPassword()메서드는 변경하려는 계정의 사용자 이름과 계정의 새 암호라는 두 가지 인수를 사용합니다.

예를 들어, 데이터베이스로 tom인증 된 사용자의 비밀번호를 로 변경하려면 다음 을 입력할 수 있습니다.adminsecretpassword

use admin
db.changeUserPassword("tom", "secretpassword")

메서드 와 마찬가지로 암호를 인라인으로 제공하는 대신 두 번째 인수에 메서드를 db.createUser()사용할 수 있습니다 . passwordPrompt()MongoDB는 명령이 실행될 때 암호를 입력하라는 메시지를 표시합니다.

use admin
db.changeUserPassword("tom", passwordPrompt())
Enter password:

다른 사용자 계정 세부 정보는 어떻게 변경합니까?

사용자 계정과 관련된 기타 정보를 변경하려면 이 db.updateUser()방법을 사용할 수 있습니다. 세부 정보를 업데이트하기 전에 사용자의 인증 데이터베이스로 전환해야 합니다.

 db.updateUser()방법을 사용하려면 사용자 이름을 지정한 다음 업데이트하려는 데이터가 포함된 개체를 제공해야 합니다. 업데이트하도록 선택한 모든 필드는 새 정보로 완전히 대체되므로 새 정보만 추가하려는 경우 개체에 새 데이터는 물론 원본 데이터도 포함해야 합니다.

변경 정보와 함께 명령에 포함하는 개체에는 다양한 필드가 포함될 수 있습니다. 그것들을 살펴봅시다:

  • customData: 사용자 계정과 연결할 임의의 데이터입니다.
  • roles: 사용자에게 부여된 역할입니다. db.grantRolesToUser()역할을 개별적으로 추가 및 제거할 수 있으므로 이 키로 업데이트하는 것보다 및 db.revokeRolesFromUser()메서드를 사용하여 역할 구성원을 제어 하는 ​​것이 더 나은 경우가 많습니다 .
  • pwd: 사용자의 비밀번호입니다. db.ChangeUserPassword()업데이트해야 하는 유일한 필드인 경우 일반적으로 메서드를 사용하는 것이 더 쉽습니다.
  • authenticationRestrictions: 사용자가 연결할 수 있는 IP 주소를 제한할 수 있는 계정에 대한 제한을 지정합니다. 이 키의 값은 유효한 IP 주소 또는 범위를 지정하는 배열을 포함하는 clientSource및 또는 를 정의하는 개체 또는 배열입니다. 인증 제한serverAddress 에 대한 MongoDB 문서에서 자세히 알아보세요 .
  • mechanisms: 자격 증명에 사용할 특정 인증 메커니즘입니다. SCRAM-SHA-1또는 중 하나 또는 둘 모두로 설정할 수 SCRAM-SHA-256있지만 현재 새 암호가 제공되지 않는 경우 현재 메커니즘의 하위 집합으로만 변경할 수 있습니다.
  • passwordDigestor: 사용자의 암호를 처리하는 구성 요소를 지정합니다. server(기본값) 또는 client.

예를 들어, 필드 를 변경하여 서버 자체를 호스팅하는 동일한 컴퓨터에서만 로그인할 수 있도록 데이터베이스에 tom대해 인증 하는 계정을 업데이트할 수 있습니다.adminauthenticationRestrictions

use admin
db.updateUser("tom", {
    authenticationRestrictions: [ {
        clientSource: ["127.0.0.1", "::1"],
        serverAddress: ["127.0.0.1", "::1"]
    } ]
})

이제 사용자에 대한 관련 정보를 표시하도록 MongoDB에 요청하면 계정에 대한 추가 제한이 표시됩니다.

 
use admin
db.getUser("tom", {
    showAuthenticationRestrictions: true
})
 
{
        "_id" : "admin.tom",
        "userId" : UUID("e7a0abde-a9f9-412a-bfd5-eb11fda41fd3"),
        "user" : "tom",
        "db" : "admin",
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ],
        "roles" : [ ],
        "authenticationRestrictions" : [
                {
                        "clientSource" : [
                                "127.0.0.1",
                                "::1"
                        ],
                        "serverAddress" : [
                                "127.0.0.1",
                                "::1"
                        ]
                }
        ],
        "inheritedRoles" : [ ],
        "inheritedPrivileges" : [ ],
        "inheritedAuthenticationRestrictions" : [ ]
}

이러한 제한을 취소하려면 빈 배열로 명령을 다시 실행할 수 있습니다.

use admin
db.changeUser("tom", {
    authenticationRestrictions: []
})

MongoDB 사용자를 어떻게 삭제합니까?

MongoDB 사용자 계정을 제거하려면 이 방법을 사용할 수 있습니다 db.dropUser(). 제거하기 전에 사용자의 인증 데이터베이스에 연결해야 합니다.

메소드 를 실행하려면 db.dropUser()제거하려는 사용자의 이름을 제공해야 합니다.

db.dropUser("tom")

성공적으로 삭제되면 MongoDB는 다음을 반환합니다 true.

true

현재 데이터베이스에 계정이 없으면 대신 을 반환 false합니다.

반응형