MongoDB의 접근 제어(사용자 인증)를 활성화하는 방법


MongoDB는 초기 설정이 끝나면 액세스 제어없이 무제한으로 액세스 할 수 있다. 실제 운영으로 이대로 무제한 허가는 있을 수 없기 때문에, 액세스 제어(사용자 인증, 역할 제어)를 유효하게 해야 한다.

여기에서는 가장 단순한 싱글 서버를 전제로 한 액세스 제어 방법에 대해 정리한다.

사용자 관리에 관한 정보

우선은 사용자 관리에 관한 각종 정보와 그 저장소에 대해 알아보겠다.

사용자 정보가 저장된 데이터베이스는 admin으로, admin 데이터베이스의 system.users 컬렉션에 사용자 정보가 존재한다.

사용자 관리가 가능한 역할에는 userAdminuserAdminAnyDatabase 이렇게 두 가지 유형이 있다.

  • userAdmin는 지정된 데이터베이스에 대해서만 사용자 관리를 수행할 수 있는 역할이다.
  • userAdminAnyDatabase: 이 역할이 부여된 사용자는 모든 데이타베이스에 대한 사용자 관리를 할 수 있다.

사용자 인증 사용 절차

대략적인 절차는 다음과 같다. 기본적으로 MongoDB 서버에서 작업한다고 가정하여 명령을 작성한다.

  • 관리 사용자 추가
  • MongoDB 재부팅
  • 일반 사용자 추가
  • 사용자 이름과 암호를 지정하여 데이터베이스에 연결

관리 사용자 추가

  1. 액세스 제어없이 MongoDB 시작
    mongod --dbpath "C:\data\db"
    
  2. MongoDB에 연결
    mongo
    
  3. 사용자 관리자 만들기
    admin 데이터베이스에 연결하여 다음 명령을 실행하여 사용자 관리자를 생성한다. 생성하고 있는 사용자 이름은 admin이다.
    use admin
    db.createUser({
        user: 'admin',
        pwd: 'password',
        roles: [{
            role: 'userAdminAnyDatabase',
            db: 'admin'
        }]
    })
    

MongoDB 재부팅

  1. MongoDB 서버를 액세스 제어로 재부팅
    mongod --auth --dbpath "C:\data\db"
    
    ※ MongoDB 구성 파일을 사용하여 기동하는 방법은 “MongoDB 구성 파일 설정”을 참조하자.

일반 사용자 추가

  1. 사용자 이름과 비밀번호를 지정하여 사용자 관리자로 MongoDB에 연결 액세스 제어를 활성화한 MongoDB에 연결하는 방법은 “MongoDB 연결과 동시에 인증하는 방법"과 “MongoDB 연결 후 사용자 인증하는 방법"이 있다.

    • MongoDB 연결과 동시에 인증하는 방법
      mongo 명령의 -u <username>, -p <password>,-authenticationDatabase <databasename> 옵션을 사용하여 연결한다.

      mongo -u "admin" -p "password" -authenticationDatabase "admin"
      
    • MongoDB 연결 후 사용자 인증하는 방법
      우선은 평소대로 MongoDB에 접속한다.

      mongo
      

      인증이 필요한 데이터베이스로 전환하여 db.auth(<username>, <password>) 메소드로 인증한다.

      use admin
      db.auth("admin", "password")
      
  2. 일반적으로 데이터베이스에 액세스할 수 있는 사용자 만들기

    사용자 관리자를 만들고 액세스 제어를 활성화하면 권한이 없는 데이터베이스에는 액세스할 수 없다. 사용하는 각 데이터베이스마다 사용자를 만들어야 한다.

    아래에서는 test 데이터베이스에 연결하여 user1 사용자를 readWrite 역할로 추가한다. 그 외에 역할은 아래의 내장 역할을 참조한다.

    use test
    db.createUser({
        user: "user1",
        pwd: "password",
        roles: [{
            role: "readWrite", db: "test"
        }]
    })
    

사용자 이름과 암호를 지정하여 데이터베이스에 연결

  1. 일반적으로 데이터베이스에 추가한 사용자로 연결 접속 방법은 관리 사용자의 액세스 방법과 같이 “MongoDB 접속과 동시에 인증하는 방법"과 “MongoDB 접속 후에 사용자 인증하는 방법"이 있다. 내용은 동일하기 때문에 자세한 내용은 생략한다.

    • MongoDB 연결과 동시에 인증하는 방법
      mongo -u "user1" -p "password" -authenticationDatabase "test"
      
    • MongoDB 연결 후 사용자 인증하는 방법
      mongo
      
      use test
      db.auth("user1", "password")
      

MongoDB 구성 파일 설정

일반적으로 동작으로 생각하면 명령을 실행하여 MongoDB 서버를 시작하지 않는다. MongoDB 구성 파일에 기동 옵션을 지정하고, 그 구성 파일을 읽고 시작하는 작업이 될 것이다.

여기에서는 액세스 제어를 활성화하는 MongoDB 구성 예제과 기동하는 명령은 아래와 같다.

mogodb.config

systemLog:
    destination: file
    path: C:\mongodb\server\log\mongod.log
security:
    authorization: enabled
storage:
    dbPath: C:\mongodb\server\data

MongoDB 서버 시작

mongod --config "C:\data\mongod.config"

※ MongoDB 구성 파일 옵션에 대한 자세한 내용은 MongoDB - Configuration File Options를 참조한다.

내장 역할

MongoDB에는 몇 가지 기본 제공 역할이 있다. 여기에서는 그 중에서도 사용할 것 같은 것을 몇개 뽑아서 소개한다.

데이터베이스 사용자 역할

역할 설명
read 모든 비시스템 콜렉션에 대한 읽기 권한과 system.indexes.system.jssystem.namespaces 시스템 콜렉션에 대한 읽기 권한.
readWrite read 역할 외에 모든 비 시스템 콜렉션 변경 및 system.js 시스템 콜렉션 변경 권한.

데이터베이스 관리 역할

역할 설명
dbAdmin 스키마에 대한 태스크, 인덱스, 통계 정보 취득 등의 관리 업무에 관한 권한.
이 권한에는 사용자 관리 또는 역할 관리에 대한 권한이 포함되지 않는다.
dbOwner 데이터베이스 관리자로서의 권한.
이 권한에는 readWrite, dbAdmin, userAdmin 권한이 포함된다.
userAdmin 데이터베이스에 대한 사용자 및 역할을 관리하는 권한.
userAdmin역할은 데이터베이스에 대한 액세스 권한을 자신을 포함하여 모든 사용자에게 부여할 수 있다. 따라서 admin 데이터베이스의 userAdmin 역할의 경우 수퍼 유저와 간접적으로 같은 의미가 된다.

참고 기사