Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

MongoDB를 인증(Authentication) 모드로 사용하기

MongoDB는 기본적으로 보안모델이 없이 실행됩니다. 설치하고 사용하면 어떤 아이디나 암호입력없이 그냥 바로 접근해서 디비를 조작할 수 있게 됩니다. 그냥 로컬에서 만져볼때는 신경안쓰고 있었는데 아무래도 서버에 올라가 있는 디비가 인증이 없다는 것은 문제의 소지가 있을 것으로 생각되어 찾아봤습니다.

MongoDB문서의 Security and Authentication 에 이부분에 대한 것이 나와 있는데 설명의 상단을 보면 보안모델(Security)없이 사용하는 것을 오히려 권장하고 있습니다. 물론 아무나 디비를 조작하는 것은 안되기 때문에 보안에 문제가 되지 않는 환경(Trusted Environment)에서 보안보델 없이 실행하는 것이 기본옵션이면서 권장하고 있습니다. 이 말은 MongoDB에는 보안 모델을 적용하지 않고 서버단에서 신뢰되지 않은 접속을 허용하지 않도록 하는 것을 의미하고 있습니다. 이는 기존 RDBMS에서 환경에서는 약간 의아한 부분일수도 있기는 한데 현재 버전(1.6.3)에서는 Sharding과 replica가 security가 없는 환경에서만 사용가능하기 때문이지 않은가 생각하고 있습니다.(NoSQL에 대한 경험이 부족해서 다른 이유가 있는것인지는 잘 모르겠습니다.)



어쨌든 MongoDB도 보안모델을 가지고 있고 현재는 아이디와 비밀번호로 접근하는 Basic 보안만 지원하고 있습니다. 각 아이디와 비밀번호는 디비별로 따로 할당되면 읽기 쓰기가 모두 가능한 사용자와 읽기만 가능한 사용자를 만들 수 있습니다.

각 데이터베이스에는 system.users 컬랙션이 존재하는데 인증정보는 이 컬렉션에 저장하게 됩니다. mongoDB에 기본적으로 있는 admin 데이터베이스는 다른 디비와는 다르게 추가적인 명령어를 사용할 수 있으면 admin에 대한 권한을 얻으면 모든 데이터베이스에 접근할 수 있게 됩니다. admin에 설정된 사용자가 없으면 인증없이 localhost에서 접근할 수 있습니다.

use admin
db.addUser("adminID", "adminPassword")

위처럼 addUser()를 사용하면  admin 데이터베이스네 계정을 추가할 수 있고 db.system.users.find()를 해서 생성한 사용자를 확인할 수 있습니다. 비밀번호는 당연히 암호화되어서 저장됩니다.

use testDB
db.addUser("userID", "userPassword")
db.addUser("readOnlyUser", "readOnlyPassword", true)

admin과 동일하게 다른 데이터베이스에서도 계정을 생성할 수 있고  addUser에 세번째 파라미터로 true를 넘기면 읽기전용 계정을 추가할 수 있습니다. 비번을 수정할때도 동일하게 addUser를 사용하면 되고 존재하는 계정일 경우에는 자동으로 update를 실행하게 됩니다.
사용자 계정을 삭제할때는 db.system.users.remove( {user: userID } ) 를 실행하면 됩니다.



이제 인증모드로 사용하려면 MongoDB를 인증모드로 사용해야 합니다. 실행할때 mongod --auth 처럼 --auth 플래그를 붙혀주면 인증을 요구하도록 실행됩니다. 이렇게 실행하면 인증받지 않고 디비에 접근해서 조작하려고 하면 인증거부가 떨어지게 됩니다 mongo 콘솔에서 인증을 받으려면 db.auth("userID", "userPassword") 를 사용하면 됩니다.
2010/11/08 01:55 2010/11/08 01:55