請問各位前輩,為何我透過SSH連到CockroachDB會需要憑證及帳密,但我的Python程式可以直接連不需要指定憑證,只需要帳密就可以直接存取,原理為何?
補充:
DB version: CockroachDB CCL v21.2.14 (x86_64-unknown-linux-gnu)
python version: 3.9.13
python package: sqlalchemy-cockroachdb==1.4.4
Python機器地端自建,CentOS7
CockroachDB機器地端自建,CentOS7
DB connection code:
@classmethod
def get_report_db_cr_report_db_conn(cls):
source_db_host = f"cockroachdb+psycopg2://{cls.SOURCE_DB_CR_REPORT_DB['username']}:{cls.SOURCE_DB_CR_REPORT_DB['passwd']}@{cls.SOURCE_DB_CR_REPORT_DB['host']}/{cls.SOURCE_DB_CR_REPORT_DB['database']}"
engine = create_engine(source_db_host)
conn = engine.connect()
return conn
DBGate Config:
DBGate Error:
error: node is running secure mode, SSL connection required
Error JSON: {
"length": 116,
"name": "error",
"severity": "ERROR",
"code": "08P01",
"file": "server.go",
"line": "1027",
"routine": "maybeUpgradeToSecureConn"
}
你是用 ssh 連上 CockroachDB 資料庫的 Port (23257)?
還是用 ssh 連進安裝了 CockroachDB 資料庫的主機 OS (Port 22)?
順便講一下: 這台 CockroachDB 主機是怎麼架設的? 用甚麼 OS?
感謝raytracy大神的回覆,
CockroachDB主機是地端自建機器,用CentOS7。
我是用SSH連進資料庫實例,具體一點的話其實是用DBGate client (SSH tunnel)連,這時候是會需要憑證與帳密,然後Python又是在另一台也是地端自建的機器CentOS7。
另外再補充一點是,我的Python APP只要IP是在白名單內,我放在任何機器上去對CockroachDB存取,都不需憑證只需要帳密,這讓我有點疑惑
從你因 raytracy 大提醒而補充的資訊:
就我在 這裡 看到的 Connect to multiple databases, directly or through SSH tunnel
這句,我猜是因為你用 SSH tunnel 這功能才需要憑證(or SSH-Key)。
你補充 python package: sqlalchemy-cockroachdb
卻沒提到程式碼,所以後續我用猜的。從:
README.md - sqlalchemy-cockroachdb 的 For example, to connect to an insecure, local CockroachDB cluster using psycopg2
未加密連線範例。
Additional connection parameters - Client Connection Parameters | CockroachDB Docs 指出,連線參數 sslmode
預設值是 disable
。
這兩項資訊,我猜你在 Python 程式碼內沒啟用加密連線。
樓上分析正確; 請把 DBGate 連線設定參數貼上來才知道....
文件上說 directly or through SSH tunnel 兩者皆可, 所以你應該試試看:
在 DBGate 的連線設定裡面, 取消 SSH Tunnel 的選項, 讓她直連...
感謝兩位大神的回覆,很抱歉一開始給的資訊不足,我對這方面的專業知識還非常欠缺,並且我仔細看才發現DBGate要求的是SSL的CA憑證。
回覆Zero大:
也正如您所說的,我的Python沒有針對SSL參數做設定,只有單純的create-engine就連了,但是DBGate如果沒有指定CA憑證的話,出現的Error:node is running secure mode,是否就代表著DB是有規定需要走SSL憑證這條?
回覆raytracy大:
我把DBGate的SSL的設定拿掉後,就會出現Error:node is running secure mode,就沒法直接連了。
經過詢問後得知,當時在建這台CRDB時,是有設定要走安全模式的,因此DB有自動產生出一個CA憑證,也就是我提交後才能正常連線的那個CA憑證,所以我就會認為Python也應該要按照DB的設定走SSL才對,為何他就可以不受DB的規則去連呢?
DBGate 是跑在你自己的電腦上?
Python 是跑在另外架的 CentOS?
如果以上都對的話, 請問那台跑 Python 的 CentOS 是你架的嗎?
對,DBGate是我用notebook開的,Python與CRDB的機器是DevOps架的,並且兩台是不同的機器
抱歉,因為 iT邦幫忙 沒跳通知(一般討論內沒被標記的人不會被通知~),我都忘了這篇的存在;找舊文時關注一下才注意到這裡有進一步的討論。
@Peter:
但是DBGate如果沒有指定CA憑證的話,出現的Error:node is running secure mode,是否就代表著DB是有規定需要走SSL憑證這條?
這要看伺服端與客戶端在協定上是如何運作的。
也就是說,如果有這樣的設計時:伺服端被設定可以不使用 SSL 而連線時,DBGate 能採用伺服端能接受的其他方式。
這樣 DBGate 就不必採用 SSL 連線了。(我沒去翻文件,所以這只是假說~)
另,關於 sqlalchemy-cockroachdb 能以密碼驗證連線 CockroachDB 而無須 SSL,可能原因很多(例如相容性上的設計),我懶得翻源碼、文件(我有翻下源碼,然而看了一下就懶了~),
但我覺得你可以參考 Authenticating to CockroachDB Self-Hosted Clusters (亦可關注一下該文件內的 Password authentication without TLS
部分) 去驗證你的環境。
P.s. 你在 StackOverflow 也有發文的樣子,提醒你有空回去關注一下(雖說沒看到能參考的回應就是了~)。
補,node is running secure mode, SSL connection required
是 CockroachDB 程式碼的字串,所以狀況應該是 CockroachDB 回絕 DBGate 非安全性的連線。