mongodb啟動錯誤(Failed to set up listener: SocketException: Cannot assign requested address)


MongoDB的安全模式默認是關閉的,無需賬號密碼就可以訪問數據庫,使用和開發時比較便利,這在一個可信任的網絡環境中還可以接受。但如果未啟用安全模式的MongoDB暴露在外網環境下,數據就是在裸奔,風險極大。

MongoDB內置了完善的安全機制,我們可以利用這些功能來提高MongoDB服務的安全性。

1.指定允許訪問的IP

MongoDB可以通過在啟動參數或配置文件中添加--bind_ip來設置允許訪問的ip

  • 啟動時指定ip
mongod --bind_ip 127.0.0.1,192.168.100.123
  • 通過配置文件/etc/mongodb.conf指定ip
# network interfaces
net: port: 27017 bindIp: 127.0.0.1,192.168.100.123 

這是官方文檔中給出的配置多個ip的方式,但是實際測試下來是不可行的,mongod會啟動失敗,查看/var/log/mongodb/mongod.log會發現如下SocketException: Cannot assign requested address的錯誤信息

2018-05-24T12:02:02.817+0800 I CONTROL [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "127.0.0.1,192.168.13.64", port: 27017 }, processManagement: { fork: false, pidFilePath: "/var/run/mongodb/mongod.pid", timeZoneInfo: "/usr/share/zoneinfo" }, storage: { dbPath: "/var/lib/mongo", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } } 2018-05-24T12:02:02.817+0800 E STORAGE [initandlisten] Failed to set up listener: SocketException: Cannot assign requested address 

甚至僅僅配置一個另外的ip

# network interfaces
net: port: 27017 bindIp: 192.168.13.64 

也同樣無法啟動

2018-05-24T12:07:54.917+0800 I CONTROL [initandlisten] options: { config: "/etc/mongod.conf", net: { bindIp: "192.168.13.64", port: 27017 }, processManagement: { fork: false, pidFilePath: "/var/run/mongodb/mongod.pid", timeZoneInfo: "/usr/share/zoneinfo" }, storage: { dbPath: "/var/lib/mongo", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongod.log" } } 2018-05-24T12:07:54.917+0800 E STORAGE [initandlisten] Failed to set up listener: SocketException: Cannot assign requested address 

測試結果:bindIp的值只能為127.0.0.1或0.0.0.0以及當前主機的具體地址。
查找了國內外許多資料都沒有找到解決方案,那么如果想要控制訪問的ip,就需要通過服務器本身的手段了,如firewalld等。

  • 啟動時指定配置文件
mongod --config /etc/mongod.conf

2.設置監聽端口

MongoDB默認監聽的端口為27017,為避免惡意的連接嘗試,可以修改監聽的端口。

  • 啟動時指定端口
mongod --port 27017
  • 配置文件(/etc/mongodb.conf)中指定端口
# network interfaces
net:
  port: 27017

3.用戶認證

MongoDB還提供了用戶認證功能,如果開啟了用戶認證(默認未開啟),需要使用賬號密碼驗證才能訪問。

3.1 啟用用戶認證
  • 通過啟動參數開啟
mongod --auth
  • 通過配置文件(/etc/mongodb.conf)開啟
security:
  authorization: enabled
3.2 添加用戶

首先需要創建管理員賬戶

> use admin
switched to db admin
> db.createUser({user:"admin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {
    "user" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

創建普通賬戶

> use test
switched to db test
> db.createUser({user:"abc",pwd:"123",roles:[{role:"read",db:"test"}]})
Successfully added user: {
    "user" : "abc",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}

3.3 用戶權限控制
  • 查看用戶權限

可以使用show users查詢當前數據庫的全部用戶

> use test
switched to db test
> show users
{
    "_id" : "test.abc",
    "user" : "abc",
    "db" : "test",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}

還可以查詢指定的用戶的權限

> db.getUser("abc")
{
    "_id" : "test.abc",
    "user" : "abc",
    "db" : "test",
    "roles" : [
        {
            "role" : "read",
            "db" : "test"
        }
    ]
}
  • 查看權限能執行操作
> db.getRole("read",{showPrivileges:true}) 
  • 授權(為賬戶分配role)
> db.grantRolesToUser("abc",[{role:"readWrite",db:"test"}]) > show users { "_id" : "test.abc", "user" : "abc", "db" : "test", "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "read", "db" : "test" } ] } 
  • 取消權限
> db.revokeRolesFromUser("abc",[{role:"readWrite",db:"test"}]) > show users { "_id" : "test.abc", "user" : "abc", "db" : "abc", "roles" : [ { "role" : "read", "db" : "test" } ] } 
3.4 用戶登錄

啟動mongo客戶端時登錄,其中 --authenticationDatabase "admin"表示用戶在admin數據庫中。

mongo --host 192.168.100.123 --port 27017 -u "user123" -p "123456" --authenticationDatabase "admin"

進入mongo客戶端后登錄

mongo --host 192.168.100.123 --port 27017
use admin
db.auth("user123","123456") 
3.5 修改密碼(需要admin管理員權限)
db.changeUserPassword("user123","password456")
3.6 刪除用戶(需要admin管理員權限)
db.dropUser("user123")


作者:yuanzicheng
鏈接:https://www.jianshu.com/p/f6322adc6221
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM