1. 程式人生 > >Ubuntu16.04下mongodb的安裝、使用者配置、遠端連線

Ubuntu16.04下mongodb的安裝、使用者配置、遠端連線

一、安裝mongodb

    安裝過程,參考:https://www.cnblogs.com/hupeng1234/p/7000499.html

    版本更新可以及時跟蹤官網:

    https://docs.mongodb.com/master/tutorial/install-mongodb-on-ubuntu/

    1.匯入包管理系統使用的公鑰

 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

    2.為MongoDB建立一個列表檔案

    根據版本建立/etc/apt/sources.list.d/mongodb-org-3.4.list 列表檔案

    Ubuntu 14.04

echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

    Ubuntu 16.04

echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

    3.更新本地包資料庫

sudo apt-get update

    4.安裝最新版本的MongoDB

 sudo apt-get install -y mongodb-org

    5.檢視配置檔案,留意下security這個引數,接下來的使用者身份驗證會用到。

    配置檔案mongod.conf所在路徑: /etc/mongod.conf

# mongod.conf

# for documentation of all options, see:

#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.

storage:

  dbPath: /var/lib/mongodb   #資料庫儲存路徑

  journal:

    enabled: true

#  engine:

#  mmapv1:

#  wiredTiger:

# where to write logging data.

systemLog:

  destination: file

  logAppend: true     #以追加的方式寫入日誌

  path: /var/log/mongodb/mongod.log   #日誌檔案路徑

# network interfaces

net:

  port: 27017

  bindIp: 127.0.0.1   #繫結監聽的ip 127.0.0.1只能監聽本地的連線,可以改為0.0.0.0

#processManagement:

#security:

#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

6.啟動和關閉MongoDB

sudo service mongod start  # 啟動

sudo service mongod stop   # 關閉

ps aux | grep mongod   # 檢視守護程序mongod的執行狀態

 

    二、配置使用者

    安裝完成後的MongoDB預設是沒有開啟使用者驗證的,也就是說任何人登陸進去都有超級管理員許可權,我們需要啟動訪問控制,對使用者身份進行驗證。在啟動訪問控制前,我們先建立一個超級使用者root,以後可以通過超級使用者進行其他使用者的新增和更改等操作root使用者是超級使用者,擁有所有許可權,如果只想有一個可以設定所有使用者角色許可權的使用者,也可以將roles設定為userAdminAnyDatabase,該角色可以在所有資料庫裡建立、刪除和管理使用者。建立使用者的程式碼如下:

> use databasename

switched to db databasename

> db.createUser(

...   {

...     user: "dba",

...     pwd: "dba",

...     roles: [ { role: "root", db: " databasename" } ]

...   }

... )

    成功會提示

Successfully added user: {

    "user" : "dba",

    "roles" : [

        {

            "role" : "root",

            "db" : " databasename "

        }

    ]

}

    上述指令中,user和pwd引數是使用者名稱和密碼,我們著重說一下roles引數,這個引數決定了新增使用者的許可權。MongoDB有一些內建角色如下:

 

    1. 資料庫使用者角色:read、readWrite;

    2. 資料庫管理角色:dbAdmin、dbOwner、userAdmin;

    3. 叢集管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;

    4. 備份恢復角色:backup、restore;

    5. 所有資料庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase

    6. 超級使用者角色:root 

    // 這裡還有幾個角色間接或直接提供了系統超級使用者的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)

    7. 內部角色:__system(不建議使用)

 

    Read:允許使用者讀取指定資料庫

    readWrite:允許使用者讀寫指定資料庫

    dbAdmin:允許使用者在指定資料庫中執行管理函式,如索引建立、刪除,檢視統計或訪問system.profile

    userAdmin:允許使用者向system.users集合寫入,可以找指定資料庫裡建立、刪除和管理使用者

    clusterAdmin:只在admin資料庫中可用,賦予使用者所有分片和複製集相關函式的管理許可權。

    readAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀許可權

    readWriteAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀寫許可權

    userAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的userAdmin許可權

    dbAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的dbAdmin許可權。

    root:只在admin資料庫中可用。超級賬號,超級許可權

    概括來說,就是user有關的,如userAdmin、userAdminAnyDatabase是操作使用者的,可以進行使用者的建立刪除修改,不能操作資料庫物件和資料庫讀寫;db有關的,如dbAdmin、dbAdminAnyDatabase是操作資料庫物件的,不能操作使用者和資料庫讀寫;與read、write有關的,是進行讀寫等操作的,不能操作使用者和資料庫物件。對於單個數據庫,還有一個dbOwner角色,它擁有該資料的所有許可權,包括dbAdmin,readWrite,userAdmin。

    MongoDB使用者許可權分配的操作是針對某個庫來說的,所以可以看到上述建立角色的過程中,roles裡面有一個數據庫db引數。即使是一些對所有資料庫有許可權的角色如userAdminAnyDatabase,也要在新增的時候指定db引數為“admin”

    root使用者建立成功後,修改/etc/mongod.conf檔案,將security的值設定為authorization: enable

    重啟mongod服務:service mongod restart

    我們開啟了使用者驗證後,不做登入限制的情況下,雖然任何人都可以進入mongodb服務,但是沒有進行使用者驗證就不能進行資料庫操作。

    使用者驗證有兩種方式

    1、先連線再驗證,先進入mongod服務,然後到使用者所在的資料庫下,執行db.auth(“username”,”pwd”)進行使用者身份驗證,返回1表示成功

    2、在連線過程中驗證,語法是:

mongo  --port 27017  -u "username" -p "pwd" --authenticationDatabase "dbname"

    之後我們就可以通過root使用者新增其他使用者,命令和之前的一樣。

    新增使用者成功後,我們到使用者所在的資料庫下,進行使用者身份認證,就可以以該使用者的身份進行對應許可權的資料庫操作。

    驗證使用者身份的指令之一db.auth(“username”,”pwd”)

    也可以在mongodb內切換使用者,但是我在具體實踐過程中發現,從root使用者切換到另一個coffee使用者,雖然身份認證成功了,但是許可權並沒有及時更新,建議需要切換資料庫使用者的時候,先退出mongod,再進去用另一個使用者進行驗證操作。

    還有,使用者在哪裡建立就在哪裡驗證比如你在admin資料庫下建立了test1資料庫下的user1和test2資料庫下的user2,需要先在admin資料庫下驗證使用者,再去對應的資料庫進行操作。

    如果需要變更使用者的資訊,用有許可權的使用者賬號登入操作

    修改使用者指令(不支援更改使用者名稱

db.updateUser(
"username",
    { pwd: "newPass",  
      roles: [{ role: “newRole”, db: “dbName”}]  
    }  
)
總結一下,使用者配置的過程
安裝mongodb預設不開啟使用者認證 ——> 建立一個root超級使用者 ——> 修改配置檔案,開啟使用者認證,重啟mongod服務 ——> 用root使用者新增其他使用者 ——> 其他使用者連線驗證進行資料庫操作
 

三、遠端連線

    1、修改配置檔案

    vim /etc/mongod.conf

    把bindIp: 127.0.0.1,改成bindIpAll: true表示對所有ip開放訪問許可權

    2、重啟mongod服務

    service mongod restart

    3、防火牆開放27017埠

    iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 27017 -j ACCEPT

    4、接下來我們就可以進行遠端連線了

    有兩種方式驗證

    (1)用視覺化工具,我用的是Studio 3T(MongoChef),新建連線輸入對應的ip和使用者資訊,驗證連線成功

    (2)用另一臺伺服器登入

    mongo xx.xx.xx.xx(ip地址):27017

    這個登陸到的是mongodb/test資料庫

    用特定使用者登入

     mongo xx.xx.xx.xx:27017/admin –u username -p

 

    關於bindIp的配置,我用的mongo4.0.1,自己試了一下,測試的結果是bindIp:0.0.0.0和bindIpAll: true可以實現遠端連線,直接註釋掉bingdIp不能實現遠端連線,注意,引數值前要有空格,否則無法生效

 

四、遇到的問題

    記錄一些安裝過程中出現的問題,連線問題請務必確保在阿里雲(或你的伺服器平臺)上配置了安全組規則,開放了27017

    1、啟動mongo服務(service mongod start)的時候報錯Failed to start mongod.service: Unit not found

    解決方法:

(1)建立配置檔案

    sudo nano /etc/systemd/system/mongodb.service

2)新增文字

[Unit]

Description=High-performance, schema-free document-oriented database

After=network.target



[Service]

User=mongodb

ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf



[Install]

WantedBy=multi-user.target

    (3)Ctrl + X 退出

    (4)啟動服務

    sudo systemctl start mongodb

    sudo systemctl status mongodb

    2、啟動mongo(mongo  --bind_ip "" --port 27017  -u "username" -p "pwd" --authenticationDatabase "dbname")的時候報錯

    解決方法

(1)檢視儲存資料庫的目錄是否存在

    ls -ld /data/db

    如果提示目錄不存在的話就要在根目錄下建立一個

    sudo mkdir /data/db

(2)啟動MongoDB的同時指定資料庫儲存在什麼地方

    mongod --dbpath /data/db

    指令執行完成後,我們就可以正常啟動mongo了

 

參考資料:https://www.cnblogs.com/alan2kat/p/7771635.html

          http://blog.51cto.com/ovcer/1416906

          https://www.cnblogs.com/jinxiao-pu/p/7121307.html