MongoDB 유저생성 및 데이터베이스 생성

Posted by nopsled
2019.01.08 09:52 데이터베이스

회사에서 맨날 MongoDB를 사용하고 있는데 설정한다고 구글 검색하기가 귀찮아서 따로 만들어봤다.


public으로 설정이 잘못되어 있어서 하마터면 털릴뻔했다 ㅡㅡ..


MongoDB port(27017)을 인바운드와 noauth로 열어주는 경우엔 잘못하면 털린다.


그렇다면 이 설정을 어떻게 피하냐면.. 다음과 같이 하면 된다.


몽고디비를 새로 설치한 후 초기 셋팅이라고 생각하면 된다.





1. 초기에는 authorization이 disabled 되어 있으므로 그냥 mongo 쉘 커맨드로 접속하면 된다.

mongo 



2. admin DB를 생성하여 모든 DB에 접속할 권한을 준다.

use admin
db.createUser( { user: "<username>",
          pwd: "<password>",
          roles: [ "userAdminAnyDatabase",
                   "dbAdminAnyDatabase",
                   "readWriteAnyDatabase"

] } ) 


3. 다음은 사용자가 원하는 DB를 만들때 셋팅이다. (이 경우 해당 디비에만 권한을 받는다.)

use myDB
db.createUser({ user: "<username>",
          pwd: "<password>",
          roles: ["dbAdmin", "readWrite"]

}) 


+ 사용자를 drop 시킬때 쓰는 명령이다. (거의 쓸일 없다)

use admin

db.dropUser("<username>") 





4. 몽고로 쉘 커맨드로 접속하여 나오는 버전명을 보고 케이스를 나눠서 진행한다. (솔직히 2버전대 아니면 별 의미없는것 같다.)

Case1 : MongoDB shell version v4.0.4, MongoDB server version: 4.0.4

sudo vi /etc/mongod.conf 


# mongod.conf


storage:

  dbPath: /data/db

  #dbPath: /var/lib/mongodb

  # if you want to custom MongoDB Path, modify dbPath line.

  journal:

    enabled: true


net:

   bindIp: 127.0.0.1

   port: 27017


security:

   authorization: "enabled"

   #authorization: "disabled" 

   # if you want to disable authorization, uncomment disabled line.


processManagement:

  timeZoneInfo: /usr/share/zoneinfo

   # If you use this timeZoneInfo, will be following your localtime


# where to write logging data.

systemLog:

   destination: file

   logAppend: true

   path: /var/log/mongodb/mongod.log

# If path permission has root:root, executed user(general user) can't access that file.

# Check path's permission. it followed executed permission.


Case2 : MongoDB shell version v3.6.7, MongoDB server version: 3.6.5

 sudo vi /etc/mongod.conf


# mongod.conf


# Where and how to store data.

storage:

  dbPath: /var/lib/mongodb

  journal:

    enabled: true


# where to write logging data.

systemLog:

  destination: file

  logAppend: true

  path: /var/log/mongodb/mongod.log

# If path permission has root:root, executed user(general user) can't access that file.

# Check path's permission. it followed executed permission.


# network interfaces

net:

  port: 27017

  bindIp: 127.0.0.1


# how the process runs

processManagement:

  timeZoneInfo: /usr/share/zoneinfo

   # If you use this timeZoneInfo, will be following your localtime


security:

   authorization: "enabled"

   #authorization: "disabled" 

   # if you want to disable authorization, uncomment disabled line.


이렇게 하고 robo로 접속 테스팅해본다.


참고로..bindIp를 걸어놓으면 로컬로 밖에 접속을 못하니 robo에서는 SSH 터널링을 통해 접속해야한다.


DB가 털리는 상황은 bindIp를 주석처리하고 authorization을 disabled하는 경우다. 올바른 설정을 위해선 bindIp를 걸어주거나 authorization을 enabled해준다. 둘중 하나만 설정되어 있다면 털릴 걱정 안해도 된다.



+ 참고 및 출처 : http://blog.freezner.com/archives/1040

이 댓글을 비밀 댓글로

Install MongoDB + phpMongoDriver in Mac OSX High Sierra

Posted by nopsled
2018.09.13 16:25 데이터베이스

 brew install mongodb 

First, you have to install mongodb.


nopsled@smleeo3o:~/dump (=`ω´=)$ php -v

PHP 7.1.7 (cli) (built: Jul 15 2017 18:08:09) ( NTS )

Copyright (c) 1997-2017 The PHP Group

Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies 



Second, check your php version. this example's php version is 7.1.


 brew tap kyslik/php

 brew install php71-mongodb


Third, we have to install php MongoDriver 7.1



nopsled@smleeo3o:~ (=`ω´=)$ cd /usr/local/Cellar/php71-mongodb/1.4.0

nopsled@smleeo3o:/usr/local/Cellar/php71-mongodb/1.4.0 (=`ω´=)$ ls

INSTALL_RECEIPT.json  mongodb.so*

nopsled@smleeo3o:/usr/local/Cellar/php71-mongodb/1.4.0 (=`ω´=)$ cp /etc/php.ini.default /etc/php.ini 


Check mongodb.so file and copy your /etc/php.ini.default to /etc/php.ini.


 878 ; ... or with a path:

 879 ;

 880 ;   extension=/path/to/extension/msql.so

 881 ;

 882     extension=/usr/local/Cellar/php71-mongodb/1.4.0/mongodb.so

 883 ; If you only provide the name of the extension, PHP will look for it in its

 884 ; default extension directory.

 885 ;

 886 ; Windows Extensions 

And you have to add mognodb.so files location in /etc/php.ini.


 nopsled@smleeo3o:/usr/local/Cellar/php71-mongodb/1.4.0 (=`ω´=)$ sudo apachectl restart

restart your apache.


이 댓글을 비밀 댓글로

[mongodb] how to find dictionary not null

Posted by nopsled
2018.04.30 18:17 데이터베이스

{

    "_id" : ObjectId("5a129bde1c6fcc3ea4d21db0"),

    "email" : "test@gmail.com",

    "name" : "test",

    "authType" : "google",

    "loc" : {

        "country" : "US"

    }

},


{

    "_id" : ObjectId("5a129bde1c6fcc3ea4d21db0"),

    "email" : "test2@gmail.com",

    "name" : "test2",

    "authType" : "google",

    "loc" : {}

},


{

    "_id" : ObjectId("5a129bde1c6fcc3ea4d21db0"),

    "email" : "test3@gmail.com",

    "name" : "test3",

    "authType" : "google",

    "loc" : {}

},


{

    "_id" : ObjectId("5a129bde1c6fcc3ea4d21db0"),

    "email" : "test4@gmail.com",

    "name" : "test4",

    "authType" : "google",

    "loc" : {

        "country" : "US"

    }

}


You have to know object's dictionary key.


If you want find loc(dictionary) not null data, using next query.


db.users.find({"loc.country":{$exists:true}}) 



debug result

{

    "_id" : ObjectId("5a129bde1c6fcc3ea4d21db0"),

    "email" : "test@gmail.com",

    "name" : "test",

    "authType" : "google",

    "loc" : {

        "country" : "US"

    }

},

{

    "_id" : ObjectId("5a129bde1c6fcc3ea4d21db0"),

    "email" : "test4@gmail.com",

    "name" : "test4",

    "authType" : "google",

    "loc" : {

        "country" : "US"

    }

}


이 댓글을 비밀 댓글로

mongodb not authorized? how to create database in mongodb

Posted by nopsled
2018.04.18 11:01 데이터베이스

[root@dataking01 data]# mongo

MongoDB shell version v3.4.9

connecting to: mongodb://127.0.0.1:27017

MongoDB server version: 3.4.9

> use testdb

switched to db testdb

> db.createCollection("test_collection")

{

"ok" : 0,

"errmsg" : "not authorized on testdb to execute command { create: \"test_collection\" }",

"code" : 13,

"codeName" : "Unauthorized"

}

>


위와 같이 authorized가 안되어 있어서 컬렉션도 못만들고 난리가 났다.



[root@dataking01 data]# ps -ef | grep mongo

root     11876     1  0 10:57 ?        00:00:01 /usr/bin/mongod --auth -f /etc/mongod.conf

root     12127  8518  0 11:01 pts/0    00:00:00 grep mongo

[root@dataking01 data]# kill -9 11876

[root@dataking01 data]# 


서비스 확인해주고 11876 죽여준다음에


[root@dataking01 data]# /usr/bin/mongod -f /etc/mongod.conf

about to fork child process, waiting until server is ready for connections.

forked process: 12173

child process started successfully, parent exiting

[root@dataking01 data]# 


--auth flag 빼버리고 mongodb를 시작해준다.


그리고 mongo로 접속해서 use database_name, db.createCollection("collection_name") 해주면 된다.


이거 했다고해서 --auth flag를 다시 넣어주는거 깜빡하지말자.. 골로간다



[root@dataking01 data]# ps -ef | grep mongo

root     12173     1  0 11:02 ?        00:00:00 /usr/bin/mongod -f /etc/mongod.conf

root     12232  8518  0 11:03 pts/0    00:00:00 grep mongo

[root@dataking01 data]# kill -9 12173

[root@dataking01 data]#

[root@dataking01 data]#

[root@dataking01 data]# /usr/bin/mongod --auth -f /etc/mongod.conf

about to fork child process, waiting until server is ready for connections.

forked process: 12278

child process started successfully, parent exiting

[root@dataking01 data]# 


--auth flag를 줘야 혹여나 안털린다


오늘의 삽질 끝.

이 댓글을 비밀 댓글로