Contents
BayServerの入国管理機能
港湾を運営しているといろんな船が不法入国を試みてきます。
国籍を偽る者、許可していない国から来る者、他人に成りすまして入国しようとする者。
こういう者たち(船たち)は水際で追い返さないといけません。
BayServerの入国管理機能を使うと、「どういう船(者)を入国させる(拒否する)か」というルールを定めることができます。
例えば
- どこどこの国から来た船は入国できない
とか
- この町に入れるのは決められた団体に属する者のみ
といった感じです。
この機能を駆使することで、安全にBayServerを運用することができます。
入国制限の種類と行える箇所
BayServerで行える入国制限は以下の2種類です。
- 船の出発地に対する制限
- 乗客の属する団体に対する制限
これはそれぞれ
- クライアントのIP or ホスト名に対するアクセス制限
- Basic認証を使用したアクセス制限
ということになります。
入国制限を行えるドッカーは次の3種類です
- Portドッカー
- Cityドッカー
- Townドッカー
Portドッカーに入国制限を設定すると、特定のTCP/IPポートへの接続に対して制限を加えることができます。
Cityドッカーに入国制限を設定すると、特定の仮想ホストへのアクセスに対して制限をかけられます。
Townドッカーに入国制限をかけると、特定の仮想パスへのアクセスに対して制限をかけられます。
それぞれかけられる制限が微妙に違うので以下の表にまとめます。
制限を設定する場所 | 出発地に関する制限 | 団体に関する制限 |
Portドッカー | 〇 | × |
Cityドッカー | 〇 | 〇 |
Townドッカー | 〇 | 〇 |
出発地に対する制限方法
Portに入国制限を設定する
例えば、HTTPで開いている2020番ポートへのアクセスをローカルホストのみにする場合は
[port 2020]
docker http
[permission]
admit ip 127.0.0.1/255.255.255.255
refuse ip *
のようになります。
このように、港での入国制限を行う場合、Portドッカーの内部にPermissionドッカーを配置します。
Cityに入国制限を設定する
例えば、atsugi.baykit.jp に入国制限をかける場合は以下のように設定します
[city atsugi.baykit.jp]
[permission]
admit ip 127.0.0.1/255.255.255.255
refuse ip *
このように、都市で入国制限をかける場合は、Cityドッカーの内部にPermissionドッカーを配置します。
Townに入国制限を設定する
例えば、都市atsugi.baykit.jpの町izumi(URLでいうと http://atsugi.baykit.jp/izumi/ 以下)に入国制限をかける場合は以下のように設定します
[city atsugi.baykit.jp]
[town /izumi/]
[permission]
admit ip 127.0.0.1/255.255.255.255
refuse ip *
このように、町に対し入国制限をかける場合はTownドッカーの内部にPermissionドッカーを配置します。
permissionドッカーの書式
permissionドッカーには複数のルールを記述できます。各ルールは以下のような形をしています
admit 許可する出発地の情報
refuse 拒否する出発地の情報
許可する場合は admit
の後に出発地の情報、拒否する場合は refuse
の後に出発地の情報を記述します。
(ちなみに、Apacheクラスタな方々のために、admit/refuseはそれぞれallow
/deny
でもOKですw)
出発地をIPアドレスで指定する
出発地をIPアドレスで指定する場合、以下のフォーマットになります
(admit|refuse) ip IPアドレス/サブネットマスク
例えばIPアドレスが 127.0.0.1 に完全一致した場合に許可(拒否)する場合は
(admit|refuse) ip 127.0.0.1/255.255.255.255
のように記述します。
また、192.168.11.XXX を許可(拒否)したい場合は、サブネットマスクを使用して
(admit|refuse) ip 192.168.11.0/255.255.255.0
のようになります。
また、世界中のすべてのIPを許可(拒否)する場合は
(admit|refuse) ip 0.0.0.0/255.255.255.255
になりますが、これは簡単に以下のように書けます
(admit|refuse) ip *
出発地をIPV6で指定する
IPアドレスはIPv6でも指定できます。例えばローカルホストのみに限定するには以下のように記述します。
admit ip ::1/::ffff:ffff
出発地をホスト名で指定する
出発地をホスト名で指定する場合、以下のフォーマットになります
(admit|refuse) host ホスト名
例えばホスト名 localhost.localdomain のみを許可(拒否)する場合は
(admit|refuse) host localhost.localdomain
のように記述します。
サブドメインを含む特定のドメインのみを許可(拒否)する場合は
(admit|refuse) host *.yourdomain.com
のように記述します。
世界中のすべてのホストを許可(拒否)する場合は
(admit|refuse) host *
のように記述します。
ただし、ホスト名で出発地を指定するとDNSの逆引きが発生し、BayServerのパフォーマンスに影響を与えるのでこの方法はなるべく避けましょう。
ルールの評価順
Permissionドッカーに記述されたルールはどのような順番で評価されるのでしょうか。
以下が評価の手順です
- そもそもPerimissionドッカーがなければ全部許可
- permissionドッカーが指定されていたら、内部に記述されたルールを上から順に評価
- IP/ホストがマッチした場合、admitが指定されていれば許可、refuseが指定されていれば拒否とし、以降のルールは見ない
- どのルールにもマッチしなかったら拒否
となります
最初と最後の条件を別の言い方をすると、要はpermissionドッカーが存在しないた場合
[permission]
admit ip *
が指定されたのと同じになります。
また、permissionドッカーが存在する場合は最後に
refuse ip *
が挿入されるのと同じ結果になるということです。
例を見てみましょう。
[permission]
admit ip 192.168.11.0/255.255.255.0
となっている場合、192.168.11. で始まるIPのみが許可されます。
一方で
[permission]
refuse ip 192.168.22.1/255.255.255.255
admit host *
となっている場合、192.168.22.1 からのIPのみが拒否されます。(この場合、最後にadmitのルールを入れないと全拒否になってしまう)
ちなみに、Apacheでは
Order Allow,Deny
のように「許可のルール」を優先するのか、「拒否のルール」を優先するのかをわざわざ指定するのですが、分かりづらくないすかねw
団体に対する制限
ある都市や町に入れる団体(グループ)を設定する場合もPermissionドッカーを使用します。
Cityに入国制限を設定する
例えば、atsugi.baykit.yokohamaに入れるのはmusisianという団体のみであるという制限をするには以下のように設定します。
[city atsugi.baykit.yokohama]
[permission]
group musisian
Townに入国制限を設定する
例えば、atsugi.baykit.yokohamaのizumi町に入れるのはsalesmanという団体のみであるという制限をするには以下のように設定します。
[city atsugi.baykit.yokohama]
[town /izumi]
[permission]
group salesman
出発地に対する入国制限との併用
Permissionドッカーでは、出発地と団体の両方の制限を併用できます。
[city atsugi.baykit.yokohama]
[town /izumi]
[permission]
admit 127.0.0.1/255.255.255.255
group salesman
Groupファイル
では、団体の定義はどこで行われているのでしょうか。
それを行うのがGroupファイルです。
Groupファイルは団体と、それに所属するメンバーに関する情報が記述されており、ファイル名はHarborドッカーで1つだけ指定できます。
[harbor]
groupFile plan/groups.plan
相対パスを指定した場合はBayServerホームからの相対パスになります。
Groupファイルの中身は以下のようにとてもシンプルです
[group]
admin admin
rocker guest evh
#
# You can generate encoded password by bayserver command
# $ bayserver.sh -mkpass={password}
#
[member]
# password "guest"
guest 084e0343a0486ff05530df6c705c8bb4
# password "admin"
admin 21232f297a57a5a743894a0e4a801fc3
# password "evh"
evh 54adf6bbce21e5dcdc3851463712eab4
見てもらえば分かりますが、書式はBayServer設計ファイルと同じですね。
ものもとこのファイルフォーマットはBaykit Configuration Format(BCF)と呼ばれるフォーマットで、BayServer設計ファイルはそのフォーマットの特別な呼び方と言えます。
本来のBCFフォーマットでは[groups]や[member]は「要素」と呼ばれます。また要素の中にあるものは「KeyValue」と呼んでいます。これを設計ファイルでは「ドッカー」や「パラメータ」と特別な呼び方をしているわけです。
団体の設定
団体の定義はgroup要素で行います。以下のようにすると、団体名とそれに所属するメンバーの定義ができます。
[group]
グループ名 メンバー1 メンバー2 ...
最初の例では、「admin」というグループにはメンバー「admin」がいますよ、「rocker」という団体にはメンバー「guest」および「evh」がいますよということを定義しています。
メンバーの設定
メンバーの設定はmember要素で行います。以下のようにすると、メンバー名とパスワードのハッシュ値の定義ができます。
[member]
メンバー名 パスワードのハッシュ値
パスワードのハッシュ値はbin以下にあるbayserverコマンドで行えます。例えば「mypass」というパスワードのハッシュ値を求めるためには
$ bayserver.sh -mkpass=mypass
のようにコマンドを実行すると、標準出力にハッシュ値が出力されるのでこれをGroupファイルに貼り付けます。