最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用SSH隧道連接遠(yuǎn)程MySQL數(shù)據(jù)庫(kù)

 更新時(shí)間:2024年11月07日 09:39:47   作者:搬山境KL攻城獅  
為保護(hù)MySQL數(shù)據(jù)庫(kù)安全,可通過(guò)SSH隧道連接,服務(wù)端僅需開(kāi)放SSH端口,加強(qiáng)密碼策略,客戶端可使用Navicat等工具,或通過(guò)編程(如SpringBoot)實(shí)現(xiàn)端口轉(zhuǎn)發(fā),推薦使用密鑰建立SSH隧道,以免密碼泄露風(fēng)險(xiǎn),詳述了端口轉(zhuǎn)發(fā)的手動(dòng)設(shè)置方法及自動(dòng)化腳本配置

一、前言

MySQL數(shù)據(jù)庫(kù)漏洞頻出,不適合直接將3306端口開(kāi)放到公網(wǎng)。

而實(shí)際情況,可能通過(guò)公網(wǎng)訪問(wèn)數(shù)據(jù)庫(kù)的需求,可考慮利用SSH隧道連接遠(yuǎn)程MySQL數(shù)據(jù)庫(kù)。

二、MySQL服務(wù)端

MySQL服務(wù)端無(wú)須額外配置,只需要開(kāi)放ssh公網(wǎng)端口即可!

為了進(jìn)一步增加安全性,強(qiáng)烈建議,增加密碼重試策略、密碼復(fù)雜度規(guī)則。

另外,確認(rèn)MySQL訪問(wèn)權(quán)限,mysql.user表中是否存在host=’%’;的記錄,刪除并刷新權(quán)限。

delete from mysql.user where host='%';
flush privileges;

示例:

  • 服務(wù)器IP(公網(wǎng)IP): 192.168.1.200
  • SSH端口:10022
  • SSH用戶名:test1
  • SSH密碼:flzx3000c
  • MySQL端口:3306
  • MySQL用戶名:root
  • MySQL密碼:ysyhl9t

三、MySQL客戶端

1.通過(guò)navicat工具利用SSH隧道連接MySQL數(shù)據(jù)庫(kù)

注意:127.0.0.1為192.168.1.200的本地地址,而非客戶端的本地地址,此地址必須在mysql.user表中host里存在。

2.手動(dòng)建立端口轉(zhuǎn)發(fā)規(guī)則(以linux為例)

# 端口轉(zhuǎn)發(fā)
ssh -NCPf test1@192.168.1.200 -p 10022 -L 3388:127.0.0.1:3306
# 查看端口狀態(tài)
netstat -ano |grep 3388
# 測(cè)試MySQL連接
mysql -P 3388 -u root -p
>show databases;

參數(shù)解釋:

  • C 使用壓縮功能,是可選的,加快速度。
  • P 用一個(gè)非特權(quán)端口進(jìn)行出去的連接。
  • f SSH完成認(rèn)證并建立port forwarding后轉(zhuǎn)入后臺(tái)運(yùn)行。
  • N 不執(zhí)行遠(yuǎn)程命令。該參數(shù)在只打開(kāi)轉(zhuǎn)發(fā)端口時(shí)很有用(V2版本SSH支持)

3.使用jsch進(jìn)行端口轉(zhuǎn)發(fā)(springboot 代碼示例)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.55</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3388/mysql
    username: root
    password: ysyhl9t
    driver-class-name: com.mysql.jdbc.Driver
package com.example.demo;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class Runner implements CommandLineRunner {

    /**
     * 測(cè)試代碼變量暫不提取
     * @param args
     */
    @Override
    public void run(String... args) throws Exception {
        JSch jsch = new JSch();
        Session session = null;
        try {
            session = jsch.getSession("test1", "192.168.1.200", 10022);
            session.setPassword("flzx3000c");
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();
            // 設(shè)置SSH本地端口轉(zhuǎn)發(fā),本地轉(zhuǎn)發(fā)到遠(yuǎn)程
            session.setPortForwardingL(3388, "127.0.0.1", 3306);
        } catch (Exception e) {
            if (null != session) {
                //關(guān)閉ssh連接
                session.disconnect();
            }
            e.printStackTrace();
        }
    }

}
package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import javax.annotation.Resource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@SpringBootTest
class DemoApplicationTests {

    @Resource
    private JdbcTemplate jdbcTemplate;

    @Test
    void contextLoads() {
        String sql = "select host from mysql.user";
        final List<String> list = jdbcTemplate.query(sql, (resultSet, i) -> resultSet.getString("host"));
		System.out.println(list);
    }

}

四、SSH隧道的建立方式

方式1.用戶名和密碼

方式2.密鑰(推薦)

免密登錄(客戶端):

ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub test1@192.168.1.200

免密登錄原理

1.在A上生成公鑰私鑰。

2.將公鑰拷貝給server B,要重命名成authorized_keys(從英文名就知道含義了)

3.Server A向Server B發(fā)送一個(gè)連接請(qǐng)求。

4.Server B得到Server A的信息后,在authorized_key中查找,如果有相應(yīng)的用戶名和IP,則隨機(jī)生成一個(gè)字符串,并用Server A的公鑰加密,發(fā)送給Server A。

5.Server A得到Server B發(fā)來(lái)的消息后,使用私鑰進(jìn)行解密,然后將解密后的字符串發(fā)送給Server B。Server B進(jìn)行和生成的對(duì)比,如果一致,則允許免登錄。

6.得到server B發(fā)來(lái)的消息后,會(huì)使用私鑰進(jìn)行解析,然后將機(jī)密后的字符串發(fā)給server B。

7.接收到機(jī)密后的字符串會(huì)跟先前生成的字符串進(jìn)行對(duì)比,如果一致就允許免密登陸。

總之:A要免密碼登錄到B,B首先要擁有A的公鑰,然后B要做一次加密驗(yàn)證。對(duì)于非對(duì)稱加密,公鑰加密的密文不能公鑰解開(kāi),只能私鑰解開(kāi)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySQL插入json問(wèn)題

    MySQL插入json問(wèn)題

    今天小編就為大家分享一篇關(guān)于MySQL插入json問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • 高效利用mysql索引指南

    高效利用mysql索引指南

    這篇文章主要介紹了高效利用mysql索引指南,你知道如何創(chuàng)建恰當(dāng)?shù)乃饕龁??在?shù)據(jù)量小的時(shí)候,不合適的索引對(duì)性能并不會(huì)有太大的影響,但是當(dāng)數(shù)據(jù)逐漸增大時(shí),性能便會(huì)急劇的下降。,需要的朋友可以參考下
    2019-06-06
  • mysql 獲取當(dāng)天發(fā)布的信息的語(yǔ)句

    mysql 獲取當(dāng)天發(fā)布的信息的語(yǔ)句

    mysql 獲取當(dāng)天發(fā)布的信息的實(shí)現(xiàn)語(yǔ)句,需要的朋友可以參考下。
    2010-03-03
  • mysql事務(wù)隔離級(jí)別詳解

    mysql事務(wù)隔離級(jí)別詳解

    MySQL事務(wù)隔離級(jí)別是指在多個(gè)事務(wù)同時(shí)執(zhí)行時(shí),數(shù)據(jù)庫(kù)系統(tǒng)如何處理這些事務(wù)之間的相互影響。MySQL提供了四種隔離級(jí)別:讀未提交、讀已提交、可重復(fù)讀和串行化。每種隔離級(jí)別都有其優(yōu)缺點(diǎn),需要根據(jù)具體情況選擇合適的級(jí)別。
    2023-06-06
  • MySQL下載安裝、配置與使用教程詳細(xì)版(win7x64)

    MySQL下載安裝、配置與使用教程詳細(xì)版(win7x64)

    這篇文章主要為大家詳細(xì)介紹了MySQL下載安裝、配置與使用的具體操作教程,很詳細(xì),感興趣的小伙伴們可以參考一下
    2016-05-05
  • MySQL 視圖(View)原理解析

    MySQL 視圖(View)原理解析

    本篇重點(diǎn)講述視圖是如何實(shí)現(xiàn)的,以及視圖如何和查詢優(yōu)化器交互,從而我們可以根據(jù)這些知識(shí)了解如何通過(guò)視圖提高性能。
    2021-05-05
  • MySQL Like語(yǔ)句的使用方法

    MySQL Like語(yǔ)句的使用方法

    本文介紹一下關(guān)于MySQL查詢字符串中包含字符的記錄一些常用方法,這里包括有REGEXP、FIND_IN_SET、Like
    2013-11-11
  • 完美解決mysql客戶端授權(quán)后連接失敗的問(wèn)題

    完美解決mysql客戶端授權(quán)后連接失敗的問(wèn)題

    下面小編就為大家?guī)?lái)一篇完美解決mysql客戶端授權(quán)后連接失敗的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • windows 64位下mysql 8.0.13 安裝配置方法圖文教程

    windows 64位下mysql 8.0.13 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了windows 64位下mysql 8.0.13 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • mysql的group_concat函數(shù)使用示例

    mysql的group_concat函數(shù)使用示例

    這篇文章主要介紹了mysql的group_concat函數(shù)使用示例,需要的朋友可以參考下
    2014-04-04

最新評(píng)論

花垣县| 金门县| 名山县| 汉川市| 嘉义县| 普格县| 钟祥市| 武清区| 城固县| 孝感市| 平远县| 清新县| 睢宁县| 邹平县| 偏关县| 田林县| 光泽县| 海阳市| 娱乐| 益阳市| 阳原县| 武宁县| 四子王旗| 三河市| 沐川县| 苏州市| 赤峰市| 德钦县| 那坡县| 调兵山市| 浠水县| 营山县| 常宁市| 上饶市| 平凉市| 酉阳| 多伦县| 荔浦县| 广丰县| 余庆县| 微山县|