WEB認証を通ったクライアントに対して、ファイアウォールで通過許可を動的におこなう

ALL
スポンサーリンク
スポンサーリンク

本記事の設定でできること

CentOS+iptables+apacheの環境で、次を実現します。

  • サーバーの特定ポートへアクセスするには、サーバーのWEBページでの認証が必要
  • WEBページで認証すると、そのクライアントのIPアドレスからの特定ポートへの通信を許可する
  • 一定時間通信しない場合は、許可を取り消す(再度WEB認証が必要)

WEB認証を通ったクライアントに対して、ファイアウォールで通過許可を動的におこなうことで、実現します。

準備

apacheの設定

ディレクトリ /var/www/html/wauth を作成します。

mkdir /var/www/html/wauth

/etc/httpd/conf.d/wauth.conf を作成します。

/etc/httpd/conf.d/wauth.conf
Alias /wauth /var/www/html/wauth/auth.sh
<Location /wauth>
  AddHandler cgi-script .sh
  AuthType Digest
  AuthName wauth
  AuthUserFile /var/www/html/wauth/.wauthdigest
  Require valid-user
</Location>

/var/www/html/wauth/auth.sh を作成します。

/var/www/html/wauth/auth.sh
#!/bin/sh
echo +$REMOTE_ADDR > /proc/net/xt_recent/wauth
echo -e "Content-type: text/html \n\n"
echo '<html lang="jp"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head>'
echo '<body>'
echo "$REMOTE_ADDR からの接続を許可します"

/var/www/html/wauth/auth.sh に実行権限を付けます。

chmod +x /var/www/html/wauth/auth.sh

WEB認証用に、digest認証のユーザ名とパスワードを設定します。 digest認証 の設定について、詳しくは次の記事を参照してください。

Apacheのbasic認証とdigest認証 | パソコン鳥のブログ

次のコマンドを実行します。認証用ユーザをユーザ名 test で作成します。
パスワード入力を求められるので、設定するパスワードを入力してください。

htdigest -c /var/www/html/wauth/.wauthdigest wauth test

apacheに設定を反映します。

service httpd reload

iptablesの設定

/etc/modprobe.d/iptables-recent.conf を作成します。

/etc/modprobe.d/iptables-recent.conf
options xt_recent ip_list_uid=48 ip_list_gid=48

iptableに次のようにルールを追加します。
XXXX はアクセス許可したいポート番号を指定してください。
–seconds の後の数値は、そのポートへの通信が無くなってから許可を取り消すまでの時間(秒)です。

iptables -A INPUT -p tcp --dport XXXX -m state --state NEW -m recent --name wauth --update --seconds 3600 -j ACCEPT
iptables -A INPUT -p tcp --dport XXXX -m state --state ESTABLISHED,RELATED -m recent --name wauth --update -j ACCEPT

サーバーを再起動、または次のコマンドを実行してください。

chown apache:apache /proc/net/xt_recent/wauth

動作確認

クライアントのブラウザで、http://yyyyy/wauth にアクセスします。
yyyyy は、サーバのIPアドレス/ホスト名を指定します。

ユーザー名・パスワードを聞かれるので、先の「 apacheの設定 」で設定した ユーザー名・パスワードを入力します。

認証に通れば、ブラウザに「xx.xx.xx.xx からの接続を許可します 」と表示されます。
xx.xx.xx.xx はクライアントのIPアドレスです。
このクライアントからのみ、「 iptablesの設定 」で設定したポート番号にアクセスできるようになります。

また、クライアントでのアクセスをやめてから、 先の「 apacheの設定 」で設定 した一定時間( iptables の –seconds で指定した時間)経過した場合に、アクセスできなくなることを確認してください。
再度WEB認証すると、またアクセス可能になることも確認してください。

参考

アクセスポイントなんかでWeb認証させてからインターネット接続させてみたり – それ
どぶお/Linuxで遊ぼう!/iptablesで動的にアドレスリストを扱う – BioKids Wiki

コメント