Grow up

生活とプログラミング

C#から踏み台サーバを経由してSQL Serverに接続する

はじめに

複数人による開発でSQL Serverに接続できないかと考えました。
単純にEC2のポートを開けると不正にログインを試みるbotに耐えられずSQL Server が停止しまうため、踏み台サーバを経由した接続を行うことにしました。

全体像

A : 踏み台サーバ
B : データベースサーバ
f:id:knkomko:20210325072334p:plain

A : 踏み台サーバ

SSH接続をする22番ポートを開けています。
またSSH接続用アカウントを新規作成しています。
f:id:knkomko:20210326042123p:plain

今回はSSH.NETを使用してポートフォワーディングを行うため、踏み台サーバではポートフォワーディングの設定は行っていません。
f:id:knkomko:20210324014425p:plain

B : データベースサーバ

SQL Serverの規定インスタンスに接続する1433番ポートを開けています。

ソースコード

C#からSSH接続が行えるSSH.NETを使用しました。
github.com

ソースコードはこちらです。
github.com

SSH.NETでは秘密鍵も利用可能です。

// 踏み台サーバのホスト名
string bastionServer = "XXXXXXXXXX";
// 踏み台サーバのアカウント名
string userName = "XXXXXXXXXX";
// 踏み台サーバのパスワード
string password = "XXXXXXXXXX";

ConnectionInfo info = new ConnectionInfo(bastionServer, 22, userName,
    new AuthenticationMethod[] {
         new PasswordAuthenticationMethod(userName, password)
    }
);

ForwardedPortLocal からポートフォワーディングを行っています。

// SQL Server 接続文字列
string connectionString = @"Data Source=127.0.0.1;Integrated Security=False;User ID=XXXXXXXXXX;Password=XXXXXXXXXX";
// データベースサーバのホスト名
string dbServer = "XXXXXXXXXX";

using (var client = new SshClient(info))
{
    client.Connect();
    var forward = new ForwardedPortLocal("127.0.0.1", 1433, dbServer, 1433);
    client.AddForwardedPort(forward);
    forward.Start();
    using (var connection = new SqlConnection(connectionString))
    {
        using (var command = connection.CreateCommand())
        {
            try
            {
                connection.Open();

                connection.Open();

                command.CommandText = @"SELECT count(*) AS count FROM employee";
結果

踏み台サーバを経由してSQL Server に接続する事ができました。
f:id:knkomko:20210326040108p:plain