「HTTPプロキシサーバ経由のssh接続」の版間の差分
(ページの作成:「SSH over HTTP (HTTP Tunnelling) のやり方について説明します。HTTPのプロキシサーバを経由して、Secure Shellでサーバにログイ...」) |
|||
(同じ利用者による、間の2版が非表示) | |||
行1: | 行1: | ||
− | SSH over HTTP (HTTP Tunnelling) のやり方について説明します。[[HTTP]]の[[プロキシ]]サーバを経由して、[[Secure Shell]] | + | SSH over HTTP (HTTP Tunnelling) のやり方について説明します。[[HTTP]]の[[プロキシ]]サーバを経由して、[[Secure Shell]]でサーバにログインできます。ここで扱うのは、[[HTTP]]トンネリングです。 |
'''読み方''' | '''読み方''' | ||
行6: | 行6: | ||
== 概要 == | == 概要 == | ||
− | HTTPしか出ていけない環境で、[[ssh]]接続したいときに、どのように実現すれば良いのでしょうか?1つの方法は、[[ssh]]を[[HTTP]] | + | HTTPしか出ていけない環境で、[[ssh]]接続したいときに、どのように実現すれば良いのでしょうか?1つの方法は、[[ssh]]を[[HTTP]]で[[トンネリング]]することです。 |
ssh -> httpプロキシ -> サーバ | ssh -> httpプロキシ -> サーバ | ||
行12: | 行12: | ||
ここの例では、22番に接続していますが、[[sshd]]を443でアクセス可能にすることによって、自分が制御できない[[プロキシ]]経由でもアクセスが可能になります。 | ここの例では、22番に接続していますが、[[sshd]]を443でアクセス可能にすることによって、自分が制御できない[[プロキシ]]経由でもアクセスが可能になります。 | ||
+ | |||
+ | ここでは、HTTPトンネリングの例ですが、[[ICMP]]を利用した[[ICMPトンネリング]]で[[トンネリング]]することもできます。[[ssh]]を利用して、[[sshポートフォワーディング]]によるsshトンネリングもよく利用されます。コネクションの中継のために[[ncat]]なんかも利用されます。 | ||
+ | == 何のために使うのか == | ||
+ | トンネリング自体は、正常な状態であれば、必要はありません。 | ||
+ | |||
+ | 通信経路が限定されているため、しかたがなく、socatなどでソケットトンネリングをするようなケースがありますが、おそらく、ネットワーク構成に問題がありそうです。 | ||
+ | |||
+ | そのほかのケースで、[[トンネリング]]が必要なのは、たいていの場合、攻撃者が攻撃を検知されにくくするため、だったり、通信の制限のある環境で通信を確立するために用いられます。 | ||
== 用意するもの == | == 用意するもの == | ||
* プロキシ | * プロキシ | ||
行36: | 行44: | ||
ProxyCommand connect-proxy -H localhost:3128 %h %p | ProxyCommand connect-proxy -H localhost:3128 %h %p | ||
== 使い方 == | == 使い方 == | ||
+ | 設定さえできれば、あとは、[[ssh]]コマンドを実行するだけで、自動的に[[プロキシ]]経由で、[[ssh]]の接続が確立できます。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
ssh example.com | ssh example.com | ||
+ | </syntaxhighlight> | ||
+ | == connect-proxy == | ||
+ | === コマンドラインオプション === | ||
+ | connect-proxyコマンドのコマンドラインオプションは、以下の通りです。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | usage: connect-proxy [-dnhst45] [-p local-port][-R resolve] [-w timeout] | ||
+ | [-H proxy-server[:port]] [-S [user@]socks-server[:port]] | ||
+ | [-T proxy-server[:port]] | ||
+ | [-c telnet-proxy-command] | ||
+ | host port | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== エラー == | == エラー == | ||
行97: | 行116: | ||
acl Safe_ports port 22 # ssh | acl Safe_ports port 22 # ssh | ||
設定編集後に、[[squid]]を再起動して、設定を反映してください。 | 設定編集後に、[[squid]]を再起動して、設定を反映してください。 | ||
+ | == どうやって防ぐか == | ||
+ | [[プロキシ]]を提供している場合に、CONNECT 接続のセッションで、特に長いセッションが疑わしいのではないでしょうか。 | ||
== 関連項目 == | == 関連項目 == | ||
* [[プロキシ]] | * [[プロキシ]] | ||
+ | * [[httptunnel]] | ||
* [[Secure Shell]] | * [[Secure Shell]] | ||
+ | * [[ICMPトンネリング]] | ||
+ | * [[sshポートフォワーディング]] | ||
+ | * [[トンネリング]] | ||
<!-- vim: filetype=mediawiki | <!-- vim: filetype=mediawiki | ||
--> | --> |
2015年6月9日 (火) 00:44時点における最新版
SSH over HTTP (HTTP Tunnelling) のやり方について説明します。HTTPのプロキシサーバを経由して、Secure Shellでサーバにログインできます。ここで扱うのは、HTTPトンネリングです。
読み方
- SSH over HTTP
- すえすえいち おーばー えいてぃてぃぴー
目次
概要
HTTPしか出ていけない環境で、ssh接続したいときに、どのように実現すれば良いのでしょうか?1つの方法は、sshをHTTPでトンネリングすることです。
ssh -> httpプロキシ -> サーバ
ここでの例では、OpenSSHを利用していますが、TeraTerm, PuTTYなどのsshクライアントもプロキシサーバの設定が可能です。
ここの例では、22番に接続していますが、sshdを443でアクセス可能にすることによって、自分が制御できないプロキシ経由でもアクセスが可能になります。
ここでは、HTTPトンネリングの例ですが、ICMPを利用したICMPトンネリングでトンネリングすることもできます。sshを利用して、sshポートフォワーディングによるsshトンネリングもよく利用されます。コネクションの中継のためにncatなんかも利用されます。
何のために使うのか
トンネリング自体は、正常な状態であれば、必要はありません。
通信経路が限定されているため、しかたがなく、socatなどでソケットトンネリングをするようなケースがありますが、おそらく、ネットワーク構成に問題がありそうです。
そのほかのケースで、トンネリングが必要なのは、たいていの場合、攻撃者が攻撃を検知されにくくするため、だったり、通信の制限のある環境で通信を確立するために用いられます。
用意するもの
- プロキシ
- connect-proxy
- ssh クライアント
インストール
Ubuntu
apt install squid3 apt install connect-proxy apt install openssh-client
設定
squidの設定
squidの設定に以下の設定が必要です。 Ubuntuの場合は、/etc/squid3/squid.conf の設定ファイルを編集します。
acl SSL_ports port 22 acl Safe_ports port 22 # ssh
設定編集後に、squidを再起動して、設定を反映してください。
sshの設定
sshのssh_configにも設定が必要です。~/.ssh/config を編集します。
Host example.com Hostname example.com ProxyCommand connect-proxy -H localhost:3128 %h %p
使い方
設定さえできれば、あとは、sshコマンドを実行するだけで、自動的にプロキシ経由で、sshの接続が確立できます。
ssh example.com
connect-proxy
コマンドラインオプション
connect-proxyコマンドのコマンドラインオプションは、以下の通りです。
usage: connect-proxy [-dnhst45] [-p local-port][-R resolve] [-w timeout] [-H proxy-server[:port]] [-S [user@]socks-server[:port]] [-T proxy-server[:port]] [-c telnet-proxy-command] host port
エラー
ssh が以下のようなエラーを起こす場合は、プロキシの設定に問題があります。
root@5ecf56dbad43:/root# ssh -v example.com OpenSSH_6.6, OpenSSL 1.0.1f 6 Jan 2014 debug1: Reading configuration data /root/.ssh/config debug1: /root/.ssh/config line 1: Applying options for example.com debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 19: Applying options for * debug1: Executing proxy command: exec connect-proxy -H localhost:3128 example.com 22 debug1: permanently_set_uid: 0/0 debug1: permanently_drop_suid: 0 debug1: identity file /root/.ssh/id_rsa type -1 debug1: identity file /root/.ssh/id_rsa-cert type -1 debug1: identity file /root/.ssh/id_dsa type -1 debug1: identity file /root/.ssh/id_dsa-cert type -1 debug1: identity file /root/.ssh/id_ecdsa type -1 debug1: identity file /root/.ssh/id_ecdsa-cert type -1 debug1: identity file /root/.ssh/id_ed25519 type -1 debug1: identity file /root/.ssh/id_ed25519-cert type -1 debug1: Enabling compatibility mode for protocol 2.0 debug1: Local version string SSH-2.0-OpenSSH_6.6p1 Ubuntu-2ubuntu1 FATAL: failed to begin relaying via HTTP. ssh_exchange_identification: Connection closed by remote host
ssh が以下のようなエラーを起こす場合は、プロキシの設定に問題があります。
root@5ecf56dbad43:/root# connect -d -H localhost:3128 example.com 22 DEBUG: No direct address are specified. DEBUG: relay_method = HTTP (3) DEBUG: relay_host=localhost DEBUG: relay_port=3128 DEBUG: relay_user=root DEBUG: local_type=stdio DEBUG: dest_host=example.com DEBUG: dest_port=22 DEBUG: checking example.com is for direct? DEBUG: example.com is for not direct. DEBUG: resolving host by name: localhost DEBUG: resolved: localhost (127.0.0.1) DEBUG: connecting to 127.0.0.1:3128 DEBUG: begin_http_relay() DEBUG: >>> "CONNECT example.com:22 HTTP/1.0\r\n" DEBUG: >>> "\r\n" DEBUG: <<< "HTTP/1.1 403 Forbidden\r\n" DEBUG: http proxy is not allowed. FATAL: failed to begin relaying via HTTP.
なお、squidのaccess.logには、 TCP_DENIED と、接続を拒否したことを表すエラーが出ています。
1433677529.178 0 127.0.0.1 TCP_DENIED/403 3407 CONNECT example.com:22 - HIER_NONE/- text/html
SSLの接続先ポートとして 22 番が許されていない、安全なポートとして22 が設定されていない場合に、上記のエラーがでます。squidの設定でいえば、 SSL_ports と Safe_ports の設定です。 「squidの設定」(前述)の設定で示した設定が必要です。
acl SSL_ports port 22 acl Safe_ports port 22 # ssh
設定編集後に、squidを再起動して、設定を反映してください。
どうやって防ぐか
プロキシを提供している場合に、CONNECT 接続のセッションで、特に長いセッションが疑わしいのではないでしょうか。