[OpenBSD]

[前に戻る: FTP における問題] [目次] [次に進む: 例 #1: 自宅や小規模事務所用 ファイアウォール]

PF: authpf: 認証ゲートウェイ用 ユーザシェル


目次


はじめに

authpf(8) は、認証ゲートウェイ用のユーザシェルのことです。認証ゲートウェイとは、 (ルータとも呼ばれる) 普通のネットワークゲートウェイの機能を持ち、 そのゲートウェイを通過するために、 最初にユーザが認証を受ける必要があるもののことです。 ユーザのシェルが、 (たとえば、 ksh(1)csh(1) などの代わりに) /usr/sbin/authpf に設定されていて、ユーザが SSH を使用してログインする場合、authpf はユーザのトラフィックがフィルタを通過できるようにしたり、 ネットワークアドレス変換 (NAT) やリダイレクションを使用してアドレスが変換されるよう、アクティブな pf(4) ルールセットに対して必要な変更を行います。 ユーザがログアウトしたり、その接続が切断されたりした場合、 authpf はこのユーザのためにロードされたルールをすべて除去し、ユーザがオープンしていた 状態を持つ接続をすべて切断します。このため、SSH のセッションを 開いている間のみ、そのユーザはゲートウェイを通してトラフィックを やり取りすることができます。

authpf は、 アンカー点に割り当てられた 名前付きルールセットを追加することで pf(4) のルールセットを変更します。ユーザの認証ごとに authpf は新しい名前付きルールセットを生成し、設定済 フィルタnatbinat および rdr の各ルールを、生成したルールセットにロードします。 authpf がロードするルールは、ユーザ単位、もしくはすべてのユーザに対して設定可能です。

authpf の使用例は次のものを含みます。

authpf は、ユーザ認証に成功したそれぞれのユーザのユーザ名と IP アドレス、ログインセッションの 開始時刻と終了時刻を syslogd(8) 経由でログに記録します。この情報を使用して、管理者は 誰がいつログインしたのかを決定することができるようになり、そのネットワークの トラフィック上のユーザのアカウンティングが可能にもなります。

設定

authpf の設定に必要な基本的な手順の概要をこちらに示します。 authpf の設定の完全な説明は、 authpf man ページを参照してください。

authpf の主ルールセットへのリンク

authpf は、以下のように anchor ルールを使用して主ルールセットにリンクされます。
nat-anchor authpf
rdr-anchor authpf
binat-anchor authpf
anchor authpf

anchor ルールをルールセット中のどこに置いても、PF は authpf のルールを評価するため、主ルールセットから分岐します。 4 つの anchor ルールすべてに必要なものではありません。 たとえば、authpf がひとつも nat ルールをロードしていない場合、 nat-anchor ルールは省略することができます。

ロード済ルールの設定

authpf は以下のふたつのファイルのひとつから、そのルールをロードします。

ひとつ目のファイルは、ユーザ $USER (これはユーザのユーザ名と 置換されます) がログインする場合にのみロードされるルールが含まれています。 ユーザごとのルールの設定は、管理者のような特定のユーザがデフォルトの ユーザとは異なるルールを必要とする場合に使用されるものです。 ふたつ目のファイルは、自分自身の authpf.rules ファイルを持たない すべてのユーザ用にロードされるデフォルトのルールが含まれています。もし、 ユーザ固有のファイルが存在する場合、それはデフォルトのファイルに優先します。少なくとも、 いずれかひとつのファイルが存在していなければ、authpf を実行することはできません。

フィルタと変換のルールは、他のすべての PF のルールセットと 同じシンタクスになっています。ただし authpf では、そのシンタクスに加えて、 次の予め定義されたふたつのマクロが使用可能です。

$user_ip マクロは、認証されたユーザのコンピュータからの ゲートウェイを通過するトラフィックを許可するためだけに使用することが 推奨されます。

アクセス制御リスト

/etc/authpf/banned/ ディレクトリに、アクセスを拒否したいユーザのユーザ名を ファイル名とするファイルを生成することで、そのユーザに authpf を使用させないように することができます。authpf は当該ユーザの接続を拒否する際に、そのユーザに対応する ファイルの内容を表示します。これは、そのユーザがどうしてアクセスを許可されないのか、 そして、そのアクセスを回復するためには誰にコンタクトを取れば良いのかなどの 注意を促すための簡便な方法を提供しているのです。

これとは逆に、/etc/authpf/authpf.allow ファイル内にユーザ名を 記述することで、特定のユーザにだけアクセスを許可することもできます。 もし、/etc/authpf/authpf.allow ファイルが存在しないか、その内容が "*" だった場合、明示的にアクセスが禁止されていない限り、authpf は SSH でのログインに成功したすべてのユーザに対してアクセスを許可します。

そのユーザ名が許可されているのか拒否されているのかを authpf が決定できない場合、 短かいメッセージを出力してそのユーザを切断します。また、 /etc/authpf/banned/ にあるエントリは常に /etc/authpf/authpf.allow にあるエントリに優先します。

authpf のユーザシェルとしての割り当て

authpf を動作させるには、それがユーザのログインシェルとして 割り当てられていなければなりません。ユーザの sshd(8) による認証が成功した場合、authpf はそのユーザのシェルとして実行されます。 そして authpf は、そのユーザが authpf の使用を許可されているかどうかをチェックし、 適正なファイルからのルールのロードなどを実行します。

authpf をユーザのシェルとして割り当てるには、以下のようにふたつの方法があります。

  1. それぞれのユーザごとに、手動で chsh(1)vipw(8)useradd(8)usermod(8) などを使用。
  2. ユーザをあるログインクラスに割り当て、そのクラスの /etc/login.conf 中の shell オプションを変更。

誰がログイン中かを見る

ユーザがログインに成功し、authpf が PF のルールを調整すると、 authpf はログインユーザのユーザ名と IP アドレスを表示するよう、 そのプロセスのタイトルを変更します。
    # ps -ax | grep authpf
    23664 p0  Is+     0:00.11 -authpf: charlie@192.168.1.3 (authpf)

ここでは、ユーザ charlie がマシン 192.168.1.3 からログインしています。 この authpf プロセスに SIGTERM シグナルを送信することによって、このユーザを 強制的にログアウトさせることができます。その場合、authpf はそのユーザ用にロードした ルールを除去し、すのユーザがオープンしていた状態を持つ接続をすべて切断します。

    # kill -TERM 23664

より詳しい情報

authpf の運用に関するより詳しい説明は、 authpf man ページを参照してください。

authpf は、より大きなキャンパスネットワークの一部となっている無線ネットワーク上の OpenBSD ゲートウェイ上で、ユーザを認証するために使用されています。 禁止リスト上に登録されていなければ、ユーザの認証が行われ、 SSH で外に出ることや (安全な web サイトを含む) web ブラウズを許可されます。 さらに、キャンパスの DNS サーバへもアクセスすることができるようになります。

/etc/authpf/authpf.rules ファイルには、次のルールが含まれています。

wifi_if = "wi0"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

pass in quick on $wifi_if proto udp from $user_ip to $dns_servers \
   port domain keep state
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \
   https } flags S/SA keep state

管理用ユーザ charlie は、そのキャンパスの SMTP、POP3 サーバへのアクセス、および web ブラウズや SSH でのアクセスができる必要があります。以下のルールは、ゲートウェイの /etc/authpf/users/charlie/authpf.rules に含まれる設定です。

wifi_if = "wi0"
smtp_server = "10.0.1.50"
pop3_server = "10.0.1.51"
dns_servers = "{ 10.0.1.56, 10.0.2.56 }"

pass in quick on $wifi_if proto udp from $user_ip to $dns_servers \
   port domain keep state
pass in quick on $wifi_if proto tcp from $user_ip to $smtp_server \
   port smtp flags S/SA keep state
pass in quick on $wifi_if proto tcp from $user_ip to $pop3_server \
   port pop3 flags S/SA keep state
pass in quick on $wifi_if proto tcp from $user_ip to port { ssh, http, \
   https } flags S/SA keep state

The main ruleset -- located in /etc/pf.conf -- is setup as follows:

# macros
wifi_if = "wi0"
ext_if  = "fxp0"

scrub in all

# filter
block drop all

pass out quick on $ext_if proto tcp from $wifi_if:network flags S/SA \
   modulate state
pass out quick on $ext_if proto { udp, icmp } from $wifi_if:network \
   keep state

pass in quick on $wifi_if proto tcp from $wifi_if:network to $wifi_if \
   port ssh flags S/SA keep state

anchor authpf in on $wifi_if

このルールセットは非常に単純であり、以下のことを実行します。

主ルールセットの基本的な考え方は、すべてのものをブロックし、 可能な限り最小限度の通過トラフィックを許可するというものです。 トラフィックが外部インターフェイスから出て行くのは自由ですが、デフォルトで拒否する ポリシーにより、無線インターフェイスからのトラフィックはブロックされます。 ユーザが認証されると、認証ユーザのトラフィックは無線インターフェイスを通過し、 ゲートウェイを通過してネットワークの他の部分に送出されるのを許可されるようになります。 quick キーワードは、新しい接続がゲートウェイを通過する際に、PF がそれぞれの名前付きルールセットを全体にわたって評価する必要がないようにするために 使用されるものです。

[前に戻る: FTP における問題] [目次] [次に進む: 例 #1: 自宅や小規模事務所用 ファイアウォール]


[back] www@openbsd.org
Originally [OpenBSD: authpf.html,v 1.5 ]
$Translation: authpf.html,v 1.5 2004/01/03 05:12:49 toshi Exp $
$OpenBSD: authpf.html,v 1.6 2004/01/04 22:47:55 horacio Exp $