覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

PuTTY で SSHトンネル用のポートフォワード設定

PuTTY(パティ)での、SSHトンネリングするためのポートフォワード設定方法です。

今回使用している PuTTYが ごった煮版 ではない ので、スクリーンショットは日本語表示になっていません。

以下は公開鍵認証でのssh接続をする例になっています。


前提

PuTTYで公開鍵認証でのssh接続をするためには .ppk(PuTTY形式)の秘密鍵が必要になります。

PuTTYgen を使って .pemファイル から .ppkファイルを作成しておく必要があります。
.ppkの秘密鍵作成時にパスフレーズを設定することになります。

以下は .ppkファイルは作成済みであるという前提での手順になっています。


踏み台にするサーバへのssh接続設定

踏み台用サーバへのssh接続のための設定です。通常のssh接続の設定と何も変わりません。

f:id:nini_y:20210417002354p:plain

Category : Session で以下を設定します。

  • Host Name (or IP address)
    • ssh接続する踏み台サーバのホスト名( or IPアドレス) を入力します。


f:id:nini_y:20210417002814p:plain

Category : Connection > Data で以下を設定します。

  • Auto-login username
    • ssh接続するユーザ名 を入力します。


f:id:nini_y:20210417002958p:plain

Category : Connection > SSH > Auth で以下を設定します。

  • Private key file for authentication
    • 「Browse」ボタンをクリックして、用意してある.ppkファイル を選択します。


ポートフォワード(ローカルフォワード)の設定

f:id:nini_y:20210417003755p:plain

Category : Connection > SSH > Tunnels で以下を設定します。

  • Source port
    • ローカルで待ち受けするポート を入力します
  • Destination
    • 転送先のサーバのホスト名( or IPアドレス):転送先サーバのポート を入力します

上記入力後に「Add」ボタンをクリックします。


設定内容の保存

f:id:nini_y:20210417002354p:plain

Category : Session の Saved Sessions に適当な名前を入れて「Save」ボタンをクリックします。


接続

「Open」ボタンをクリックします。

以下のような内容が表示されるので、.ppkファイルに設定したパスフレーズを入力して Enter を押します。

Using username "XXXXXX".
Authenticating with public key "imported-openssh-key"
Passphrase for key "imported-openssh-key":

これで、踏み台サーバへの接続とポート設定の待ち受けができた状態になります。

あとは、設定したローカルでの待ち受けポートへの通信を行えば、ポート転送が行われます。



関連エントリ

Windows 10 - コマンドでポートフォワード(SSHトンネル)

ここ最近の Windows 10 であれば sshポートフォワード(SSHトンネリング)するのには、 SSHクライアントソフトを別途インストールしなくても組み込みのコマンドで実行できます。

実行するコマンド (公開鍵認証でのSSHの場合)

ssh {ssh接続用ユーザ}@{踏み台サーバのホスト} -i {秘密鍵のパス} -L {待ち受けするポート}:{転送先のホスト}:{転送先ホストのポート}


具体的な実行例は以下になります。(IPアドレスやホスト名等はある程度伏せた感じにしています)

ssh user001@40.125.XXX.XX -i C:\Users\user1\privatekey.pem -L 11433:dummy-DB-***01.database.windows.net:1433

上記例でいくと以下のようになっています。

  • 踏み台とするSSHサーバ: 40.125.XXX.XX
  • ローカルで待ち受けするポート: 11433
  • SSHサーバ経由で実際に接続したいサーバ
    • ホスト: dummy-DB-***01.database.windows.net
    • ポート: 1433

この例は、Azure上のSQL Server へ SSHトンネリングして接続したい場合の設定イメージになります。


本筋とずれますが、 {秘密鍵のパス} が、ユーザディレクトリの下などではない場合、Permission denied になることがあります。
公開範囲の狭いディレクトリ(ユーザディレクトリの下)に秘密鍵は配置してください。


正常に接続できれば、ローカルでの netstat -na の結果に、待ち受けしたポートでの LISTENING の結果が含まれます。(以下)

PS C:\Users> netstat -na

アクティブな接続

  プロトコル  ローカル アドレス      外部アドレス           状態
...
  TCP         127.0.0.1:11433        0.0.0.0:0              LISTENING
...


この状態で、 locahost:11433 (or 127.0.0.1:11433) へ通信すると、
SSHトンネリングされて dummy-DB-***01.database.windows.net:1433 へ転送されます。


まとめ

Windowsでもコマンド一発でsshポートフォワードできて楽ですね。



関連エントリ

RLogin で SSHトンネル用のポートフォワード設定

インターネット上のサーバの特定ポートに手元のPCから繋ぎたい。
(例えば 、パブリッククラウドのサーバのRDP用 3389 ポートへ接続(リモートデスクトップ接続)したい。)
という状況でも
企業内だと、ファイアウォールで対象ポートでの通信が許可されおらず、そのままでは接続できないというケースは結構あると思います。

そういうケースの一つの対処策として、ファイアウォールの外のSSHサーバを踏み台にしてSSHトンネルで接続するという方法になると思います。

サーバと通信するための各種クライアントツールは、組み込みでSSHポートフォワーディング(SSHトンネリング)の設定をできるケースもありますが、
そうでない場合は、そのツールとは別で 何かしらポートフォワード をしてあげる必要があります。


例えば、ターミナルソフトの RLogin での設定方法は以下のようになります。

踏み台にするSSHサーバへの接続の設定

踏み台用SSHサーバへの接続の設定です。通常のssh接続の設定と何も変わりません。(接続先が踏み台となるサーバというだけです)

f:id:nini_y:20210412182833p:plain

オプション設定 > サーバ で以下設定をする

  • ホスト名
    • 踏み台にする SSHサーバ の IPアドレス or ホスト
  • ログインユーザ名
    • ssh接続する ユーザ名
  • SSH認証鍵
    • (通常こういうケースは、公開鍵認証方式だと思うので)クリックしてプライベートキーファイルを選択する


ポートフォワード(ローカルフォワード)の設定

ローカルでのポート転送設定を行います。

f:id:nini_y:20210412183031p:plain

f:id:nini_y:20210412183135p:plain

f:id:nini_y:20210412183147p:plain

オプション設定 > プロトコル で「ポートフォワード」をクリック > 「新規」をクリック して以下設定をする

  • Listened
    • Local のラジオボタンを選択
    • Host Name
      • localhost (固定値)
    • Port
      • 適当な値 (もともと繋ぎたかったport + 10000 とかが分かりやすかもしれないです)
  • Connect
    • Host Name
      • 実際に接続するサーバの IPアドレス or ホスト
    • Port
      • もともと繋ぎたかったPort (上記の画面例では RDP につなぎたい前提なので 3389)


接続

設定後は、RLoginで設定したEntryでの接続を行います。
こうするとSSHサーバへ接続して、かつ localhost に設定したポートでの待ち受けが開始されます。

実際に接続する際は、ポートフォワードで設定したポートへ接続します。サーバ名は localhost。

上記の設定例なら localhost:13899 に接続します。



関連エントリ

オンライン試験監督付き試験の受験に関するメモ

AZ-900 - Microsoft Azure Fundamentals の資格試験を受けました。

内容自体は極端に難しいものではないので、合格しました。

この資格や試験内容等については特に触れないですが、
この試験が私にとって初めての 自宅でのオンライン受験(オンライン試験監督付き試験)だったので、
今後のために 自宅でのオンライン受験 に関しての作業についてメモしておきます。
(※AZ-900 自体は、テストセンターでも受験できるはずです)

以下の内容は、受験する資格 や 試験のプロバイダーなどによっても異なってくると思います。(私の場合は ピアソンVUE)
また、私は Windows 10 で受験しましたので、macOS での受験の場合も若干異なってくると思います。

必須

受験にあたって以下のような環境が必要になります。

  • 受験用のPC
  • インターネット回線
  • PCに接続されたカメラ(最近のノートPCなら付いてると思います)
  • マイクデバイス(最近のノートPCなら付いてると思います)
  • スマートフォン

  • 受験者を証明するもの(免許証やパスポート)

準備(前日まで)

  • ベンダーからのメール内のリンクやWebサイトから飛んで、受験の申し込みをします。
    • プロファイルが登録されていない場合、自分のプロファイルの登録が必要です。(氏名や住所、電話番号などの登録)
    • 試験を実施する(開始)日時をスケジュールします
      • おおよそ 9:00 - 16:00 ぐらいの範囲でどこでも指定できたと思います。夜中などのスケジュール指定はできませんでした。
    • 案内に従って 試験環境(インターネット回線やデバイス)のチェック(システムテスト)を行います。
      • 特定のプロセスが動いているとNGなようで、私の場合はXBox関係のプロセスをTaskManagerで停止させました。
        • この辺は OnVUE の警告メッセージで表示されました

試験準備(当日)

  • 受験するテーブルに、基本的には受験用のPCとマウス 等以外は無いようにしておきます
    • Dockみたいなものは、あっても特に何も言われませんでした
    • 箱ティッシュを置いておいたら、片付けるようにと試験監督に言われました
    • (電源はOFFにしていましたが、)外部モニターは片付けるようにと試験監督に言われました

試験へのチェックイン

  • 案内されている手順に従って、試験開始の30分前 以降に チェックイン操作をします

    • 基本的には最終的に OnVUE をダウンロードして起動する操作になったと思います
  • 試験環境の以下チェックが行われます

    • インターネット回線
    • カメラデバイス
    • マイクデバイス(画面に表示された言葉を言う必要あり)
  • 案内が行われますが、試験開始するにあたって以下のチェック・作業が必要でした

    • 自身の登録したスマートフォンの電話番号へSMSのメッセージを飛ばす
    • SMSで受け取ったメッセージ内に記載されたWebページへアクセスして以下の情報を撮影してアップロード
      • 受験者の顔写真
      • 受験者を証明するもの(免許証やパスポート)の写真
      • 受験する部屋を支持された4方向から撮った写真
  • 試験監督官と会話するチャットウィンドウが開いて、指示が行われますのでそれに従って進めます

    • カメラデバイスを360°回して受験する位置から部屋の様子を見せるように言われます
    • また、カメラデバイスで受験する手元(テーブル)の様子も見せるように言われます
  • Windowsのタスクバーで、OnVUE だけが起動しているというように見えている必要があります

    • たとえば、Webブラウザのアプリが起動している状態になっていてはいけません
    • 試験は、OnVUE のアプリ上で実施されます
  • 諸々手順を進めるとOnVUE に試験が配布されます

  • 試験開始直前に何か確認の操作があった気がします。ど忘れした。。。

    • それが終わると試験が始まります

試験開始後

  • チャット用のウィンドウはクローズしてしまって問題ないと思います
  • 画面に表示される問題をひたすら解き進めていきます
  • 問題に考え込んで、顔を手で長時間おおったりしないように気を付ける必要があります

  • 試験によると思いますが、試験完了まで進むと即座に合否が出て、それで試験終了です。

    • 特に試験監督とやり取りは発生しません
  • 試験後に一応アンケートがありますが、たぶん任意です

失格になるケース

試験失格になるケースがいくつも定義されていますが、例えば以下のようなケースも失格になります

  • 試験中に席を離れる(カメラに映らなくなる)
  • 試験中に部屋に誰か入ってきてしまった
    • 家族等がいる場合は事前にその旨伝えておいたほうがいいです


受験してみての感想

テストセンターの空き状況を気にしなくてよい。テストセンターまで物理的に行かなくてよい。 というメリットは大きいです。
ただし、自宅でのオンライン試験は、違う準備をしなければならなかったり、気にかけないといけない点もあります。
受験のための片づけ等の準備は怠らないように気を付けないと試験のチェックイン後に慌てることになる気がします。

PowerShell で sshすると UNPROTECTED PRIVATE KEY FILE

パブリッククラウド(等のインターネット空間)にLinuxのサーバ立てて、そこへSSH接続できるようにする場合は、
一般的に 公開鍵認証 の方式にすると思います。

で、試しに Windows の PowerShell から 以下コマンドで、実際にプライベートキーで接続可能かを試すこともあると思います。

ssh -i {キーファイルのパス} {リモートユーザ}@{接続先のIPアドレス or ホスト}


上記コマンドを試した場合に以下のような UNPROTECTED PRIVATE KEY FILE! という表示が出て、接続できないことがあります。

PS C:\Users> ssh -i C:\SSH_KEY\my-generated-key.pem testuser@40.115.XXX.XX

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\SSH_KEY\\my-generated-key.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\SSH_KEY\\my-generated-key.pem": bad permissions
testuser@40.115.XXX.XX: Permission denied (publickey).


エラーが出る原因

対象のプライベートキーファイルは接続操作をしているユーザ以外の読み込みと書き込み操作から保護されている必要があり、
プライベートキーのファイルが対象ユーザー以外からもreadやwriteができてしまう場合に表示されるようです。

解決方法

例えば、macOS や Linux ならば chmod 600 {プライベートキーファイル} で、対象ファイルに自分自身だけの r+w のpermission を付与すれば問題ないようです。

ただし、Windowsだとファイルの権限操作でやる方法は結構単純ではなさそうです。
WSLで chmod 600 とかやっても解決になりません。(これはそもそも WSLとWindowsのファイルシステムの絡みの関係っぽいですが)

じゃあ、Windowsで結局どうすればいいのかというと 対象のキーファイルをユーザフォルダの配下に置けば問題ないです。
こうすれば、一応Windows上の別のログインユーザからはアクセスできない。ってことでOKってことなんでしょう。

例えば以下のようなコマンドだと、問題なくSSH接続できます。

ssh -i C:\Users\yuki\Private_Key\my-generated-key.pem testuser@40.115.XXX.XX


まとめ

Windows では プライベートキーファイル のアクセス権操作でも UNPROTECTED PRIVATE KEY FILE! による接続失敗を防ぐことはできるようですが、 ユーザフォルダ以下のどこかにプライベートキーファイルを移してしまうのが手っ取り早いです。


補足

PowerShell からの ssh コマンド接続だと冒頭に書いたエラーになっても、別のターミナルソフトウェアでのssh接続ならそもそもエラーにならない。
というパターンもあります。