::: IT인터넷 :::

MongoDB 계정 관리 방법

곰탱이푸우 2022. 8. 11. 08:20
MongoDB에서 계정을 생성하고 관리하는 방법에 대해 정리한다.
 
MongoDB의 특징과 주요 개념은 아래 포스팅을 참고한다.
MongoDB를 Docker로 설정하는 방법은 아래 포스팅을 참고한다.
본 포스팅은  MongoDB 공식 문서와 아래 문서를 참고하여 작성했다.
정말 깔끔하게 정리가 잘 되어 있으므로 해당 포스팅을 읽어볼 것을 권한다.
MongoDB의 공식 문서는 아래 사이트를 참고한다.

준비 사항

DB 명령어는 MongoDB Docker 컨테이너 내부에서 mongosh를 실행해서 진행한다.
 
Docker를 이용한 MongoDB 설정과 mongosh 실행 방법은 아래 포스팅을 참고한다.
 

계정 관리

사용자 계정은 MongoDB 내부에 생성 된 Database마다 별도로 관리된다.
Database의 계정 정보는 db.system.users 컬렉션에 저장된다.
 
따라서 계정 정보를 관리하기 위해서는 사용할 Database로 전환해야 한다.
Database를 전환하는 방법은 다음과 같다.
# Database 전환
> use Database이름

# 예제
> use admin
 
MongoDB의 Database와 Collection을 사용하는 방법은 아래 포스팅을 참고한다.

계정 조회

Database에 생성 된 계정을 조회하는 방법은 크게 두 가지로 구분된다.
  • 전체 목록 확인
  • 단일 계정 정보 확인
 

전체 조회

Database 내부에 생성 된 계정의 전체 목록을 확인하는 방법도 두 가지이다.
mongosh 명령어를 사용하거나 getUsers 메소드를 사용하는 것이다.
# mongosh 명령어
> show users

# MongoDB 메소드
> db.getUsers()

 

 

getUsers 메소드는 db.system.users 컬렉션을 쿼리해서 반환한다.
show users 명령어는 getUsers가 반환한 결과를 가공하여 출력한다.
하단에 ok: 1의 유무로 구분할 수 있다.
 
getUsers 메소드에 전달 가능한 옵션은 두가지가 있다.
구분
타입
기본값
설명
showCredentials
Boolean
false
Optional. 비밀번호 해시 출력 여부
filter
Document
null
Optional. $match 필터 조건에 부합하는 사용자 출력
 
비밀번호 해시를 출력하려면 아래와 같이 실행한다.
> db.getUsers({ showCredentials: true })
 
자세한 내용은 아래 기술 문서를 참고한다.

 

단일 조회

Database 내부에 생성 된 특정 계정의 정보를 확인한다.

 

아래와 같이 실행한다.
> db.getUser("<username>", Args )
 
Args는 옵션을 전달하는 부분으로 Document 타입으로 전달해야 한다.
구분
타입
기본값
설명
showCredentials
Boolean
false
Optional. 비밀번호 해시 출력 여부
showPrivileges
Boolean
false
Optional. 계정의 권한 출력 여부
showAuthenticationRestrictions
Boolean
false
Optional. 계정의 인증 제한 표시 여부
filter
Document
null
Optional. $match 필터 조건에 부합하는 사용자 출력
 
특정 계정의 정보와 권한 목록을 출력하려면 아래와 같이 실행한다.
> db.getUser("mongo", {showPrivileges: true})
 
자세한 내용은 아래 기술 문서를 참고한다.
 

계정 생성

해당 Database 내부에서 사용할 계정을 생성한다.
 
계정을 생성하기 위해서는 아래 두 가지 사항이 만족되어야 한다.
  • 관리자 계정 생성
  • 접근 제어 활성화
 

관리자 계정 생성

admin Database에 관리자 권한을 가진 계정을 생성한다.
userAdminAnyDatabase와 readWriteAnyDatabase 권한이 부여되어야 한다.
 
아래와 같이 실행한다.
> use admin
> db.createUser( {
    user: "계정이름",
    pwd: passwordPrompt(), // or cleartext password
    roles: [
        { role: "userAdminAnyDatabase", db: "admin" },
        { role: "readWriteAnyDatabase", db: "admin" }
    ]
  } )
 
자세한 내용은 아래 기술 문서를 참고한다.
 

접근 제어 활성화

사용자에게 로그인 기능을 제공하기 위해서는 액세스 제어 기능을 활성화 해야 한다.
 
Docker로 MongoDB를 설정한 경우에는 환경 변수로 전달한 기본 계정을 사용하면 계정 생성이 가능하다.
아래 포스팅을 참고한다.
따라서 아래 내용은 Docker가 아닌 직접 설치하여 사용하는 경우에만 해당한다.
 
MongoDB 데몬을 실행할 때 옵션으로 전달하거나 설정 파일을 변경한다.
옵션으로 전달하는 방법은 다음과 같이 --auth 인자를 전달한다.
$ mongod --auth --port 27017 --dbpath /var/lib/mongodb
 
설정 파일을 변경하는 방법은 /etc/mongod.conf 파일을 수정하고 MongoDB 데몬을 재실행한다.
$ vi /etc/mongod.conf

... 생략 ...

security:
    authorization: enabled

... 생략 ...

$ mongod --port 27017 --dbpath /var/lib/mongodb

 

이후 mongosh 실행하고 관리자 계정으로 로그인한다.
$ mongosh --port 27017 --authenticationDatabase "admin" -u "계정이름" -p
> 암호 입력
 
자세한 내용은 아래 기술 문서를 참고한다.
액세스 제어 활성화는 아래 문서를 참고한다.
 

Enable Access Control — MongoDB Manual

 

www.mongodb.com

 

 

일반 계정 생성

아래와 같이 실행한다.
> db.createUser(
    user: "사용할계정",
    pwd: "비밀번호",
    roles: [ { role: "계정권한", db: "대상DB" }, ... ]
)
 
MongoDB를 직접 설치해서 사용하는 경우에는 앞서 언급한 관리자 계정 생성과 액세스 제어 활성화가 선행되어야 한다.
 
자세한 내용은 아래 기술 문서를 참고한다.
계정의 권한은 역할 관리 부분을 참고한다.
 
 

계정 수정

계정의 정보가 변경 된 경우 수정해야 한다.
계정 자체의 권한이나 정보를 수정하는 경우와 비밀번호만 변경하는 경우로 구분할 수 있다.
물론 계정 정보를 수정하면서 비밀번호도 변경할 수 있다.
 

계정 정보 수정

아래와 같이 실행한다.
> db.updateUser("수정할계정", update: { 수정할정보 } )
 
update 항목에는 대표적으로 아래 설정을 변경할 수 있다.
구분
타입
설명
roles
array
Optional. 계정에 부여할 권한
"read
pwd
string
Optional. 사용자의 비밀번호
passwordPrompt()는 로그인할 때 암호 입력 요구 (4.2 버전 이상)
authenticationRestrictions
array
Optional. 서버가 사용자에게 적용하는 인증 제한 사항
IP 주소나 CIDR 범위 지정 가능
 
자세한 내용은 아래 기술 문서를 참고한다.
 

비밀번호 변경

비밀번호만 변경하기 원하는 경우에는 더 간단한 방법이 있다.
 
아래와 같이 실행한다.
> db.changeUserPassword("수정할계정", "변경할비밀번호")
 
변경할 비밀번호에 passwordPrompt()로 지정하면 로그인할 때 변경할 암호의 입력을 요구한다.
4.2 버전부터 지원한다.

 

자세한 내용은 아래 기술 문서를 참고한다.
 

계정 삭제

사용하지 않거나 불필요한 계정은 삭제해야 한다.
단일 계정만 삭제할 수 있고, 모든 계정을 한번에 삭제할 수 있다.
 

단일 계정 삭제

특정 데이터베이스에서 지정한 계정을 삭제한다.
삭제 명령을 실행하면 경고나 확인 메시지 없이 삭제하기 때문에 주의해야 한다.

 

아래와 같이 실행한다.
> db.dropUser("삭제할계정")
{ ok: 1 }
 
 
자세한 내용은 아래 기술 문서를 참고한다.

모든 계정 삭제

특정 데이터베이스의 모든 계정을 삭제한다.
삭제 명령을 실행하면 경고나 확인 메시지 없이 삭제하기 때문에 주의해야 한다.
 
아래와 같이 실행한다.
> db.dropAllUsers()
{ "n" : 12, "ok" : 1 }

 

출력되는 "n"은 삭제한 계정의 개수이다
 
자세한 내용은 아래 기술 문서를 참고한다.
 

로그인

생성한 계정을 이용하여 MongoDB에 로그인하는 방법은 두 가지이다.
실행할 때 계정 정보를 전달하거나, mongosh 내부에서 메소드를 사용하는 것이다.
 
자세한 내용은 아래 기술 문서를 참고한다.

로그인하면서 실행

mongosh을 실행하면서 로그인하는 방법은 이미 아래 포스팅에서 다룬 적이 있다.
아래와 같이 실행한다.
$ mongosh --port 27017 --authenticationDatabase
    "데이터베이스이름" -u "계정" -p "비밀번호"
 
--port 옵션은 기본 설정 된 포트를 사용할 경우 입력하지 않아도 된다.
-p  옵션으로 전달하는 비밀번호를 지정하지 않고 실행하면 입력을 요구하는 프롬프트가 출력 된다.
 

사용자 전환

이미 mongosh을 실행했는데 사용자 계정 전환이 필요한 경우에 사용하는 방법이다.
 
아래와 같이 실행한다.
# 기본 형식
> use 사용할Database
> db.auth("계정", "비밀번호")
 
비밀번호에 passwordPrompt()를 지정하면 입력하라는 메시지가 출력된다.
 
자세한 내용은 아래 기술 문서를 참고한다.