Command failed with error 13 (Unauthorized)

com.mongodb.MongoCommandException: Command failed with error 13 (Unauthorized): ‘not authorized on hie to execute command

MongoDB에서 사용자 정의 function을 사용할때 발생하는 문제로 테스트시 사용된 MongoDB의 버전은 4.0.14이다.

function에서 처리하는 일은 A Collection의 특정 document를 B Collection으로 복사하는 일을 한다.

// function 생성
function copyDocument(documentId) {
  var doc = db['a_collection_name'].findOne(_id:documentId);
  if (doc) {
    db['b_collection_name'].insertOne(doc);
  }
}

db.system.js.save({
  _id: "copyDocument",
  value: copyDocument
});

// function 실행
// 방법1
db.runCommand({ eval: "copyDocument('documentId')" });
// 방법2
db.eval("copyDocument(ObjectId('documentId'))");

실행결과는 아래와 같다.

{
    "ok" : 0.0,
    "errmsg" : "not authorized on hie to execute command ...",
    "code" : 13,
    "codeName" : "Unauthorized"
}

function호출에 대한 사용자 권한이 없어 발생한 문제이다.

사용자에게 추가 권한 부여

현재 사용자에게는 readWrite권한이 부여되어 있는 상태로 모든 query를 실행하는데 문제가 없는 상태이지만 Admin권한이 누락되어 발생하는 오류일수 있으므로 dbAdmin, dbUser 권한을 추가로 부여한다.

db.grantRolesToUser('username', [{ role: "dbAdmin", db: "database" }]);
db.grantRolesToUser('username', [{ role: "dbUser", db: "database" }]);

사용자에게 추가 권한을 부여한 후에도 동일한 오류가 발생!

Mongod.conf 설정 변경

사용자에게 권한을 추가로 부여한 후에도 동일한 문제가 발생하고 있어 찾아본 결과 mongod.conf 설정파일의 설정을 변경해줘야 한다고 한다.

# 보안 설정 (mongod.conf)
security:
  authorization: enabled

하지만 설정파일을 열어보니 설정하는 방식이 좀 달랐고, 이미 설정되어 있는것으로 보인다.

# Turn on/off security.  Off is currently the default
#noauth=true
auth=true
keyFile=/home/ec2-user/mongodb-keyfile

mongDB에서 function사용에 대한 권한문제를 계속 찾아보던중 eval 사용에 대한 보안 이슈가 있으므로 주의를 요한다는 문구가 많이 보인다.

방향을 틀어 그럼 function을 사용하지 않고 function의 역할을 할수 있는 방법을 찾아보니 aggregate를 사용한 방법을 찾을수 있었다.

Aggregate를 사용하여 function 대체하기

// a_collection에서 documentId를 찾아 b_collection으로 복사
db.a_collection.aggregate([
  {
    $match: {
      _id: ObjectId(documentId)
    }
  },
  {
    $out: "b_collection"
  }
]);

위 방법을 통해 function을 사용하지 않고 원하는 처리를 진행할수 있었다.

하지만 function사용시 발생하는 권한문제는 아직 해결되지 않았으며 방법을 찾게 되면 commant예정이다.