# Windows - OpenSSH

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2FwoaCGceH4PrgBxy69LvJ%2Fimage.png?alt=media&#x26;token=1f5a166e-8245-410b-bb60-f69593bca254" alt=""><figcaption></figcaption></figure>

## 定義

**KCMサーバー:** Keeperコネクションマネージャーを実行するインスタンス。

**リモートエンドポイント:** KCMサーバーからはまだ直接アクセスできない、データ着信手段のない保護されたネットワーク内のWindowsインスタンス。

## 要件 - OpenSSHクライアントおよびサーバーのインストール

WindowsにOpenSSHが搭載されるようになりました、デフォルトではインストールされていない場合がありますので、OpenSSHクライアントとOpenSSHサーバーの両方をインストールすることを推奨します。

{% tabs %}
{% tab title="PowerShell" %}

```
# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
```

{% endtab %}

{% tab title="GUI" %}
OpenSSHは、Windows 10以降およびWindows Server 2019以降の「オプション機能に含まれています。**\[設定]** > **\[システム]** > **\[オプション機能]** > **\[機能の追加]** (Windows 10) または **\[機能を表示]** (Windows 11) > **Open SSH クライアント** / **Open SSH サーバー**からインストールできます。
{% endtab %}
{% endtabs %}

マイクロソフトによるOpen SSHのインストール手順については、[こちら](https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse?tabs=gui)をご参照ください。

## リバーストンネルの設定

以下の手順は、クラウドのKCMサーバーからネットワークへの着信手段がないリモートエンドポイントへの接続を確立する方法となります。

1. KCMサーバーのインバウンドSSHを許可

KCMサーバーで、リモートサーバーからKCMインスタンスへのインバウンドSSHポート22接続が解放されていることを確かにします。リバーストンネルを設定するために、リモートサーバーからKCMインスタンスへのアウトバウンド接続を確立します。

2. リモートエンドポイントでSSH鍵を生成

Windowsリモートエンドポイントで、エンドポイントからKCMサーバーへのアウトバウンド接続を確立するために使用するSSH鍵のペアを作成します。管理者特権のコマンドプロンプトに以下のように入力します。

```
ssh-keygen -t ed25519
```

これにより秘密鍵と公開鍵の2つのファイルが作成されます。秘密鍵はそのままにします。

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2FrnD0UeDmQiKFeI9jZjFO%2Fimage.png?alt=media&#x26;token=55004050-e4fb-4deb-ba06-d82b1a275196" alt=""><figcaption></figcaption></figure>

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2FcpKzSznyph05iyBfaUaz%2Fimage.png?alt=media&#x26;token=cbda1992-7df9-4584-aecf-1ccc565f88fe" alt=""><figcaption></figcaption></figure>

次に、**公開鍵ファイル (.pub)** をWindowsエンドポイントからKCMサーバーにコピーします。

{% hint style="success" %}
任意の方法で.pubファイルをコピーします。
{% endhint %}

発信トラフィックが許可されている場合は、管理者としてPowerShellで以下のコマンドを使用できます。

```powershell
PS C:\Users\Administrator\.ssh> scp id_ed25519.pub user@kcm.server.xyz:~/.ssh/authorized_keys
```

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2F8KGzh0oC5rhWK7XYC0o1%2Fimage.png?alt=media&#x26;token=04aeb38d-1407-4eb7-bbcf-be5d4229d5f7" alt=""><figcaption></figcaption></figure>

3. リモートエンドポイントからKCMサーバーへのSSH接続を確認

これで、プロンプトなしでリモートサーバーからKCMサーバーにSSH接続できるようになりました。

```
C:\Users\Administrator> ssh username@demo.kcmdemo.com

Last login:Mon Jul  4 20:28:10 2022 from ip-10-0-1-7.my.remote
```

4. sshトンネルを確立

{% hint style="warning" %}
必要なポート (HTTP/HTTPS/SSH) 以外のすべてのポートでインバウンド接続をブロックするためのファイアウォールを必ず設置してください。また、以下のコマンドの0.0.0.0をKCMサーバーのIPに変更してください。
{% endhint %}

永続セッションを作成するには、sshコマンドを記載したバッチファイルとWindowsタスクスケジューラを使用します。まず、メモ帳を開き、以下のコマンドでコピーします。

{% code overflow="wrap" %}

```
ssh -fN -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -R 0.0.0.0:9000:localhost:3389 -i C:\path\to\.ssh\privkey user@kcm.server.xyz
```

{% endcode %}

パス、目的のポート、URL に対応する値を使用してコマンドを編集し、ファイルを.batファイルとして保存します。

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2Fih402biJT6GleBN4i9VY%2Fimage.png?alt=media&#x26;token=8d570057-62a8-4bc8-a6e2-b54824c27f24" alt=""><figcaption></figcaption></figure>

Windowsタスクスケジューラを開き、トリガーを「at startup」 (起動時) に、アクションを作成した.batファイルを実行にして新しいタスクを作成します。

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2FGhu2kxHI6M9OkEO9pSMz%2Fimage.png?alt=media&#x26;token=b879ed78-726f-440e-ad6c-126450c5a964" alt=""><figcaption></figcaption></figure>

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2F7v0jvdSMjIxvjRryWXEM%2Fimage.png?alt=media&#x26;token=c4c4ed36-dcfe-4e05-a6bb-abb5f0255cc8" alt=""><figcaption></figcaption></figure>

5. KCMサーバーでGatewayPorts設定を更新

{% hint style="info" %}
この手順は1度しか実行する必要はありませんので、別のリバースsshトンネルメソッドの設定中にすでに完了した場合は、手順7へお進みください。
{% endhint %}

KCMサーバーで、SSHプロセス (sshd) を変更して、リモートホスト (guacdのDockerコンテナなど) が転送ポートに接続できるようにする必要があります。デフォルトでは、sshdはリモートポート転送をループバックアドレスにバインドします。GatewayPortsの値を「clientspecified」に設定すると、クライアントは転送されたポートのバインド先のアドレスを選択できます。

* `/etc/ssh/sshd_config`ファイルを編集します
* GatewayPorts行を以下のように更新します

```
GatewayPorts clientspecified
```

* sshdを再起動します

```
sudo service sshd restart
```

これで、リモートサーバーとKCMサーバー間のリバーストンネルが確立されました。

6. docker-composeを更新してホストを参照

{% hint style="info" %}
この手順は、Dockerインストールにのみ適用されます。
{% endhint %}

Dockerインストール環境では、**host.docker.internal**という特殊なホスト名を使用して、Keeperコネクションマネージャーホストインスタンスへの接続を確立できます。

これを設定するには、以下のように、`/etc/kcm-setup/docker-compose.yml`ファイルの**guacd**セクションを更新して、「`extra_hosts`」パラメータを追加します。

```
    guacd:
        image: keeper/guacd:2
        restart: unless-stopped
        environment:
            ACCEPT_EULA:"Y"
        volumes:
            - "common-storage:/var/lib/guacamole:rw"
        extra_hosts:
            - "host.docker.internal:host-gateway"
```

Docker環境を更新して、変更を反映させます。

```
sudo ./kcm-setup.run stop
sudo ./kcm-setup.run upgrade
```

7. 目的のリモートサーバーへの接続を作成

リバースSSHトンネルが設定され、Dockerコンテナがリバーストンネルにアクセスできるようになりましたので、Keeperコネクションマネージャーインターフェイスから接続を作成します。&#x20;

ホスト名は`host.docker.internal`、ポートは9000 (または任意のポート) を使用して、新しいRDP接続を作成します。

<figure><img src="https://4041518992-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZ7s6LQJaKa1G17O787JG%2Fuploads%2FLMSCGHEb6NgLGWUdCJ1G%2Fimage.png?alt=media&#x26;token=e5843bfc-18ab-4930-86e3-dbaec9fd7304" alt=""><figcaption><p>リバースSSHトンネルを使用した接続の作成</p></figcaption></figure>

いつものように、適切な認証パラメータがリモートサーバーの接続に入力されていることを確かにします。この場合、リバースSSHトンネルを確立してリモートサーバーにアクセスしています。

接続を保存し、「My Connections」 (接続) か「Home」 (ホーム) 画面に戻ってから、作成したばかりの接続をクリックして、正常にルーティングされたことを確認します。

### さらに接続を作成

リバースSSHトンネリングを使用してさらに接続を確立したい場合は、別のポート (9001、9002など) で**手順4**を繰り返します。そのうえで、Keeperコネクションマネージャー内で接続を作成する場合は、指定したポート番号で接続を作成します。

### 参考資料

以下は、この設定に関して役に立つ情報が掲載されているオンライン参考資料となります。

{% embed url="<https://www.everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh/>" %}

{% embed url="<https://superuser.com/questions/588591/how-to-make-an-ssh-tunnel-publicly-accessible>" %}

{% embed url="<https://serverfault.com/questions/379344/selecting-interface-for-ssh-port-forwarding>" %}

{% embed url="<https://medium.com/@TimvanBaarsen/how-to-connect-to-the-docker-host-from-inside-a-docker-container-112b4c71bc66>" %}
