Golang SSH隧道连接到远程Postgres DB

罗宾逊(RJ Robinson):

我看过各种资源。我不确定如何完成此任务。我可以在本地连接,没问题,但是我无法轻松连接到遥控器。我需要传递一个RSA .pem密钥,但我不确定如何不强制连接不安全地执行此操作

package main

import (
    "database/sql"
    "fmt"
    "os"

    _ "github.com/lib/pq"
)

var (
    dbUser  = os.Getenv("DB_USER")
    dbPass  = os.Getenv("DB_PASS")
    dbName  = os.Getenv("DB_NAME")
    dbHost  = os.Getenv("DB_HOST")
    dbPort  = os.Getenv("DB_PORT")
    sslMode = os.Getenv("SSLMODE")
)

// ConnectDb is a short cut function that takes parameters through
// CLI that returns a pointer to a sql.DB connection.
// It takes no arguments.
func ConnectDb() (*sql.DB, error) {

    db, err := sql.Open("postgres", getDbInfo())
    CheckErr(err, "Unable to connecto tthe DB")

    if err := db.Ping(); err != nil {
        return nil, err
    }

    return db, nil
}

func getDbInfo() string {
    var dbInfo string

    if dbName != "" {
        dbInfo += fmt.Sprintf("dbname=%s ", dbName)
    } else {
        dbInfo += fmt.Sprintf("dbname=%s ", "development")
    }

    // checks for nil value
    if dbUser != "" {
        dbInfo += fmt.Sprintf("dbuser=%s ", "user")
    }

    // checks for nil value
    if dbPass != "" {
        dbInfo += fmt.Sprintf("dbpass=%s ", dbPass)
    }

    if sslMode != "" {
        dbInfo += fmt.Sprintf("sslmode=%s", sslMode)
    } else {
        dbInfo += fmt.Sprintf("sslmode=disable")
    }

    return dbInfo
}
谢尔盖·G:

据我了解,您需要打开与postgre数据库的连接。我不知道是否存在本机的postgre ssh隧道支持。因此,关于SSH隧道传输到数据库机的答案。

我没有以这种方式测试postgre,但是我已经在某些专有服务器连接中使用了该模型。

过程如下:

  1. 打开到数据库机的ssh连接
  2. 建立从本地端口到远程数据库端口的隧道
  3. 在本地端口上打开数据库连接

您可以使用SSH客户端(例如OpenSSH或putty)来完成#1和#2。您可能应该这样做1。如果外部客户端有效,那么您可以尝试在没有外部SSH客户端的情况下将其全部放入语言代码中。

在使用中,您将使用

“ golang.org/x/crypto/ssh”

包。

那里有教程如何使用GO ssh隧道。以下不是未经错误检查的测试样本:

var buffer []byte
var err error
buffer, err = ioutil.ReadFile(sshKeyFile)
var key ssh.Signer
key, err = ssh.ParsePrivateKey(buffer)
var authMethod ssh.AuthMethod
authMethod = ssh.PublicKeys(key)
sshConfig = &ssh.ClientConfig{
    User: "user_id",
    Auth: []ssh.AuthMethod{authMethod},
}
conn, err := ssh.Dial("tcp", endpoint, sshConfig)
// open connection on postgre:
dbConn, err = conn.Dial("tcp", dbEndpoint)

上面的最后一行并不完全是隧道传输,而是一个向DB服务器开放的TCP连接。您也许可以将该连接传递到数据库库中。如果没有,则必须设置一个隧道。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章