本記事の設定でできること
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
コメント