web-dev-qa-db-ja.com

linode上の特定のドメインへのvirtualminアクセスをロックする

最近、linode(debian 7)に仮想サーバーをセットアップしましたが、指定されたドメイン以外のドメインを介したvirtualminインストールへのアクセスをブロックしたいと思います。

現在、linodeメンバーのURL(example1234.members.linode.com:10000など)を介してvirtualminにアクセスできますが、サーバーでホストされているドメインを介してアクセスすることもできます。

これらのドメインをブロックするにはどうすればよいですか?

4
PottyBert

免責事項:

  • 私は本番環境でwebminを使用することはありません。以前は、このソフトウェアを開発サーバーにインストールしたばかりですが、探索することに興味はありませんでした。
  • このソリューションは、このWebminおよびVirtualminバージョンでテストされています

    # dpkg -l
    ii  webmin               1.710       all      web-based administration interface for Unix systems
    ii  virtualmin-base      1.0-35      all      Meta-package that runs a postinstall script to configure all of the services managed by Virtualmin.
    

いくつかの背景

Virtualminはモジュールです Webminと呼ばれるWebベースの管理の。言い換えれば、 VirtualminはWebminの上で実行されています 。 Webmin自体 webserverとしてminiserv.plを使用 。したがって、ホストヘッダーに基づいて制限する方法を知りたい場合は、miniserv.plに掘り下げる必要があります。

Webサーバーminiserv.pl

ですから、悪いニュースと良いニュースがあります。悪いニュースは、このWebサーバーには、nginxやApacheなどの他の複雑なWebサーバーと比較して基本的な機能しかないことです。幸いなことに、Perl(スクリプト言語)で書かれており、1つのファイル/usr/share/webmin/miniserv.plに含まれています。このWebサーバーの構成ファイルは/etc/webmin/miniserv.confにあります。残念ながら、miniserv.confのパラメーターに関するドキュメントはかなり限られていました(または、検索に間違ったキーワードを使用している可能性があります:))。

そこで、miniserv.plのソースコードを調べることにしました。関心のある行は、このスニペットからのものです。

if (defined($header{'Host'})) {
    if ($header{'Host'} =~ /^\[(.+)\]:([0-9]+)$/) {
        ($Host, $port) = ($1, $2);
        }
    elsif ($header{'Host'} =~ /^([^:]+):([0-9]+)$/) {
        ($Host, $port) = ($1, $2);
        }
    else {
        $Host = $header{'Host'};
        }
    if ($config{'musthost'} && $Host ne $config{'musthost'}) {
        # Disallowed hostname used
        &http_error(400, "Invalid HTTP hostname");
        }
    }

OK、これらの行は私たちに教えてくれます:

リクエストがこれらの条件がすべて満たされた状態でminiserv.plに届いたとします

  • HTTPリクエストにHostヘッダーがあります
  • パラメータmusthostminiserv.confで定義されました
  • ホストヘッダー値がパラメーターmusthostと等しくありません

その場合、リクエストはエラー400無効なHTTPホスト名で拒否されます。 はい、それらの機能はまさにあなたが望んでいたものでした。

したがって、ドメインをvirtualminインターフェースへのアクセスに制限する場合は、許可されたドメインを使用してminiserv.confにパラメーターmusthostを設定する必要があります。

注:

いくつかの問題:

  • リクエストヘッダーにHost:がない場合、ユーザーは制限をバイパスできます。
  • Sslを有効にしているが、ユーザーがhttp(httpsではなく)を参照している場合、ユーザーは次の情報を出力します。

このWebサーバーはSSLモードで実行されています。代わりに、URL https://your.allowed.domain:10000 / を試してください。

更新:

2番目の問題は、ファイルminiserv.plにOPからのパッチを適用することで防ぐことができます。パッチは github pull request (credit to OP !!!)で利用可能になります。将来のwebminにもこの機能があります。webminはすでに プルリクエストを受け入れる :)

1
masegaloeh