varnishの管理インターフェースの認証について

Varnish には varnishadm という CLI があって、コマンドラインからパラメーターの変更やキャッシュのパージなどが行える。

このインターフェースで利用している事前共有鍵(pre-shared key/PSK)を使ったチャレンジ・レスポンス認証をメモ。

認証の流れ

フロー

チャレンジ・レスポンスの認証の流れが varnish-cli(7) に書かれている。

  • secret キーを指定して varnishd を起動
  • client が varnishd の管理ポートに接続
  • server が client にチャレンジキーを返す
  • client がチャレンジキーと secret キーからレスポンスを返す
  • server はレスポンスが正しい secret キーとチャレンジキーで生成されたものがチェック

telnet で認証を確認

telnet で管理ポートに接続
ステータスコード 107 とともにチャレンジキー “ixslvvxrgkjptxmcgnnsdxsvdmvfympg” が返ってくる

$ telnet localhost 6082
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
107 59
bsagmojxlyihhpvvjayyudoyietybpxf

Authentication required.

後述のアルゴリズムに従って、チャレンジキーとシークレットキーからレスポンスを生成し、 auth に続けてレスポンスを渡す
認証が成功すれば、ステータスコード 200 番とともに CLI に遷移する。
認証に失敗すると、新しいチャレンジキーが生成される。

auth xxx    # user input
107 59      #  authentication failed
ixslvvxrgkjptxmcgnnsdxsvdmvfympg

Authentication required.

auth 455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a # user input
200 238     #  authentication succeeded
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.2.0-23-generic,x86_64,-sfile,-smalloc,-hcritbit
varnish-4.0.0-tp1 revision b9226c1

Type 'help' for command list.
Type 'quit' to close CLI session.

あとは コマンドを送信する

status
200 22
Child in state running

ping
200 19
PONG 1388333606 1.0

レスポンスの生成アルゴリズム

  • チャレンジが “ixslvvxrgkjptxmcgnnsdxsvdmvfympg”
  • シークレットが “foo\n”

の時、「チャレンジ+”\n”+シークレット+チャレンジ+”\n”+」と文字列連結したものを sha 256 でヘックスダンプしたものになる。

シークレットはファイルで指定するので、改行コードで終わっている場合、その改行コード(上の例だと “\n”)も含める。

コマンドラインでレスポンスを生成

$ cat > _
ixslvvxrgkjptxmcgnnsdxsvdmvfympg
foo
ixslvvxrgkjptxmcgnnsdxsvdmvfympg
^D
$ hexdump -C _
00000000  69 78 73 6c 76 76 78 72  67 6b 6a 70 74 78 6d 63  |ixslvvxrgkjptxmc|
00000010  67 6e 6e 73 64 78 73 76  64 6d 76 66 79 6d 70 67  |gnnsdxsvdmvfympg|
00000020  0a 66 6f 6f 0a 69 78 73  6c 76 76 78 72 67 6b 6a  |.foo.ixslvvxrgkj|
00000030  70 74 78 6d 63 67 6e 6e  73 64 78 73 76 64 6d 76  |ptxmcgnnsdxsvdmv|
00000040  66 79 6d 70 67 0a                                 |fympg.|
00000046
$ openssl dgst -sha256 < _
(stdin)= 455ce847f0073c7ab3b1465f74507b75d3dc064c1e7de3b71e00de9092fdc89a

Pythonでレスポンスを生成

シークレットファイルが /etc/varnish/secret にあるとして Python でレスポンスを計算すると以下の通り。

import hashlib
challenge = "ixslvvxrgkjptxmcgnnsdxsvdmvfympg"
secret = open("/etc/varnish/secret", "rb").read()
print hashlib.sha256(challenge + "\n" + secret + challenge + "\n").hexdigest()

varnishadm の認証

Varnish を CLI 操作するときは varnishadm 経由でアクセスすれば、上でやっているような認証周りは裏でやってくれる。
Varnish へのアクセスは2通りで指定できる。

#1 : 名前ベースでアクセス

varnishd は -n オプションでプロセスごとに名前をつけることができ、デフォルトではホスト名が設定される。
この名前を元に、共有メモリ(VSM)からポートやシークレットファイルのパスを取得して、管理ポートにアクセスする

$ sudo varnishadm -n `uname -n`

$ sudo varnishadm とやった時は $ sudo varnishadm -n `uname -n` と同等の処理を行っている。

#2 : ポートとシークレットファイルを指定してアクセス

$ sudo varnishadm -T localhost:6082 -S /etc/varnish/secret

管理ポートを変更

varnishd 起動時に -T オプションで指定する。例) -T localhost:6082

リモートからもアクセスするときは localhost にバインドするとまずいので -T 0.0.0.0:6082 とする

認証を取っ払いたい

リモートサーバから管理インターフェースを利用するケースを考えると、サーバ間でシークレットファイルを共有するのが面倒。
認証なしに IP とポートを指定するだけ管理できると楽。

Varnish 3向け

varnishd の起動オプションから、シークレットファイルを指定する -S オプションを取り除くと良い。

Varnish 4向け

Varnish 4 ではシークレットファイルの扱いが変わっている

$ git show 909a1efbea8be8276e89dd8a1ceba28d87125c90

commit 909a1efbea8be8276e89dd8a1ceba28d87125c90
Author: Poul-Henning Kamp <phk@FreeBSD.org>
Date:   Thu Nov 7 16:08:43 2013 +0000

    Change -S semantics a bit.

    If you specify no -S file, one will be made for you.

    If you truly want no authentication of CLI connections, give an
    empty -S argument  (-S "") and live with the warning that causes.

    Use arc4random() for challenges and secrets, we want crypto strength.

diff --git a/bin/varnishd/mgt/mgt_cli.c b/bin/varnishd/mgt/mgt_cli.c
index 3e43709..6233c79 100644
--- a/bin/varnishd/mgt/mgt_cli.c
+++ b/bin/varnishd/mgt/mgt_cli.c
...
snip

V3 のように -S オプションを指定しなかった場合、シークレットファイル $PREFIX/var/varnish/hostname/_.secret を自動的に作成して認証に利用する。
認証を無効にしたい場合は -S "" とする。

$ sudo varnishd -P /var/run/varnishd.pid -a :8080 -T localhost:6082 -f /usr/local/etc/varnish/default.vcl -p -s malloc,512m -S ""
Warning: Empty -S argument, no CLI authentication.

認証が不要なことを実際に確認してみる

$ telnet localhost 6082
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
200 240
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.2.0-23-generic,x86_64,-smalloc,-smalloc,-hcritbit
varnish-4.0.0-tp1 revision b9226c1

Type 'help' for command list.
Type 'quit' to close CLI session.

Rerefences

Advertisements
Tagged with: , ,
Posted in middleware

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
%d bloggers like this: