tcp_wrappers(アクセスコントロールのために)

鯖へのアクセスをコントロールする最も簡単な方法。
実はtcp_wrappersをインストールするとできるtcpdは純正玄箱にも入っている・・・
入ってはいるが、機能していない。
hosts.allow/hosts.denyを読みに逝ってない。

ダメじゃんよ〜(;´Д`)

というわけで入れなおす。
えぇ、1から作り直しですよ( ̄ー ̄)ふ・・・
「入ってはいるが、機能していない」
私が思うに「入っていない」よりある意味悪質。
期待させておいて使えないんだから。
tcp_wrappersのほかにもいくつかのソフトで同様の状況が見受けられます。
wu-ftpdとか(うろ覚え)
かなり、ソースを弄ったんだろうなぁ・・・と思いますが。
でも、(tcp_wrappersは)便利なのに使えなくしてどうするんだ?と。

やること一覧
	・Makefileの修正tcp_wrappersソースファイルの修正ふかふかの部屋 - Install Memo - jvim+onewインストールログファイルの処理hosts.allow/hosts.denyの書き方(簡単に)



Makefileの修正

tcp_wrappers_7.6-ipv6.4.tar.gzを探してくる。
Wietse's collection of tools and papers
Wietse's collection of tools and papers(FTP)
で、ユーザーのホームディレクトリにFFFTPで送る。
例のあれ(解凍まで)

	$ tar xvfz tcp_wrappers_7.6-ipv6.4.tar.gz
	$ cd tcp_wrappers_7.6-ipv6.4
そのままではアクセス権(w)が無いので変更
	$ chmod 644 Makefile
Makefileを弄る
	$ vi Makefile
		(変更)
		┃STYLE = -DPROCESS_OPTIONS
		┃FACILITY= LOG_AUTH
		┃DOT= -DAPPEND_DOT
			注:変更点のみ抽出。STYLE/DOTは#をはずす。
			注:検索を駆使して修正する。
			  だから、viよりもWinで書き換えてUPが楽・・・
「Makefileの編集」
結構多いmakefileの修正。
autoconfとか使うソフトがどのくらい楽か判りますね。

「tcp_wrappers_7.6」
昔むかし、トロイの木馬が混じったことがあるらしいです。
今もあるか、わからないけど・・・
まぁ、最新版なら安心・・・かな?

ソースファイルの修正

そのまま、コンパイルするとエラーが出るのでソースを弄る。
アクセス権・・・やっぱり無いので修正

	$ chmod 644 percent_m.c
実際に弄る
	$ vi percent_m.c
		(変更)
		┃/*extern char *sys_errlist[];*/extern __const char *__const _sys_errlist[];
			注:C言語のコメントは/*〜*/で囲むらしい
よくわからないが、stdio.hファイルの記載が違うらしい。
玄箱も(stdio.hが)参考と同じ内容なのでその通りに修正。
他のサイトだと「コメントアウトしろ」と書いてある場合が多い。
「ソースの修正」
このサイトに書かれてあること全て自分で探して修正してると、もう慣れっこになれます(え?
問題はどのように修正すれば良いのかを探すことですね。
えぇ、C言語なんて書けませんし、読めませんから!(つД;)
ネットからの検索技術・・・必要な技能ですよね?

インストール

tcp_wrappersは昔の流れを脈々と受け継ぐソフトだ(ホントか?)
なので、makeに引数がある・・・
まぁ、詳しくはMakefileに英文で書いてあるので地道に読むこと。

コンパイルを実行

	$ make CC=gcc REAL_DAEMON_DIR=/usr/sbin linux
		注:多分、CC=gcc は無くても大丈夫
インストール(という名の手動コピー)
	# cp tcpd tcpdchk tcpdmatch safe_finger try-from /usr/sbin/
	# cp tcpd.h /usr/include/
	# cp libwrap.a /usr/lib/
おまじない
	# cd /usr/sbin
	# strip -p tcpd tcpdchk tcpdmatch safe_finger try-from
「おまじない」
今回は自動でインストールしてくれません。
バイナリなどがソースと一緒に散在した状態になります。
だからといって、そこでおまじない(strip)をすると、一部ファイルが壊れて使えなくなります。
・・・私がはまったんだから、間違いないですorz

ログファイルの処理

ログの受け皿を作る。垂れ流しは良くないから。
今回作ったtcp_wrappersはsyslogdを経由してauthのログを吐き出す。
まぁ、なんにせよ、syslogdの設定を弄らないといけない。

ログファイルの設定

	# vi /etc/syslog.conf
		(追加)
		┃# tcpd and xinetd logs to auth.log
		┃auth.*			/var/log/auth.log
			注:後述のxinetdもログファシリティをauthにしている
			注:inetdの継続使用のときでも互換性がある(と思う)
			注:タブを適当に減らしている(はみ出るから)
ログファイル(空)の作成
	# touch /var/log/auth.log
syslogdの再起動(設定を認識させる)
	# killall -s HUP syslogd
「syslog.conf」
玄箱のsyslogの振り分けは非常にわかりやすいです。
debianの振り分けを見ると何がなんだか・・・理解するまで時間がかかります。
まぁ、その分、玄箱のログは分別が適当になってるかもしれないけど・・・

ログ周りを弄ったらlogrotateも弄る癖をつけましょう。
ふと気付いたらログが肥大化して削除しかない・・・なんてのは恥ずかしいですからね。

hosts.allow/hosts.denyの書き方(簡単に)

注意
書式を間違えると玄箱が操作不能になります。
ターミナルを2つ立ち上げてログインしておいてください。
ひとつは設定用、ひとつは確認用です。

hosts.allow/hosts.denyの処理順序

適合処理は hosts.allow > hosts.deny の順で行われる。
1つでも適合する項目があると、それ以降のチェックはしない。
hosts.allow/hosts.denyの両方に記載の無いものは接続を許可される。
同一ファイル内では、シェルスクリプトのように上から順番に適合確認を行う。

だから、最初にhosts.denyではありとあらゆるものを禁止する。

hosts.denyの書き方
何も考えず、ただ一文・・・

	# vi /etc/hosts.deny
		┃ALL : ALL
と書く。
まぁ、それだとカッコがつかないのでちょっと書き直すと・・・
	# vi /etc/hosts.deny
		┃# hosts.deny    This file describes the names of the hosts which are
		┃#               *not* allowed to use the local INET services, as decided
		┃#               by the '/usr/sbin/tcpd' server.
		┃#
		┃# The portmap line is redundant, but it is left to remind you that
		┃# the new secure portmap uses hosts.deny and hosts.allow.  In particular
		┃# you should know that NFS uses portmap!
		┃ALL : ALL
内容は変わってないけどね・・・(コメントが増えただけ)
とにかく、全ての接続を拒否する。

hosts.allowの書き方
サービスと許可するクライアント(IPでもdomainでもOK)を記載する。
	# vi /etc/hosts.allow
		┃# hosts.allow   This file describes the names of the hosts which are
		┃#               allowed to use the local INET services, as decided
		┃#               by the '/usr/sbin/tcpd' server.
		┃#
		┃ALL : LOCAL
		┃in.telnetd : 192.168.0.0/255.255.255.0
		┃in.ftpd : 192.168.0.0/255.255.255.0
とか。
左側が制御するソフト名(tcp_wrappersを経由するもの)で右が許可するクライアント。
許可範囲内で一部クライアントだけを禁止したいときは以下のようにする。
	# vi /etc/hosts.allow
		┃sshd : .hoge.ad.jp : deny
		┃sshd : .jp
sshdへの接続を.jpドメインならば許可するが、*.hoge.ad.jpであれば拒否。
スクリプトと一緒で上から順番に処理していくから、許可より先に拒否を記載する。

クライアントの指定は以下のものが使用可能。
	ALL :全てのクライアント
	LOCAL :玄箱自身からの接続(一般に127.0.0.1となるもの)
	192.168.0.0/255.255.255.0 :IP/サブネットマスク(192.168.0.1〜192.168.0.254まで)
	192.168.0.1 :IPそのもの(192.168.0.1のみ)
	192.168.0. :IPの頭のほう(192.168.0.1〜192.168.0.254まで)
	www.hoge.com :ドメイン名(www.hoge.comのみ)
	.hoge.com :ドメイン名の後ろのほう(*.hoge.comである全て)
		複数指定可能(半角スペース区切り)
		行を分けてもOK(ただし、サービス名を書く必要あり)
設定の確認
チェックはtcpdchkで。
	# tcpdchk -v
	# tcpdchk -v | grep -v inet
		注:下はgrepで「inet.confに記載されていないぞ」警告を消している(xinetd用)
「hosts.allow/hosts.deny」
これだけでも適切な設定をすれば結構な不正アクセスを拒否できます。
設定の詳細は他のサイト(JM Project とか)にお任せします。
多分、奥が深いから。
まぁ、これをsshdとかxinetdとかに適応するのが目的だから、この程度で勘弁してね♪


戻るなら押せ!