Cygwinで便利!
今まで試してみたところ、Cygwin のどんなバージョンでもこの方法でうまくいきました。
一応 Cygwin 1.3.22 で確認が出来ています。
(2003/08/03)
Windows / Cygwin 両方の上でのデフォルトの PATH を意識して
記述を追加したり編集したりしましたので確認してください。
また、このページでの作業は Administrators に所属しているユーザで
行うことを想定しています。
inetd を使う
なぜ inetd を使うのか
最近はそうでもないのかも知れませんけど、
Linux / UNIX といえば telnet によるリモート管理でしょう。
ってことは、当然 Cygwin でもそうでしょう。
そういうわけで telnet を含む inetd (+ tcp_wrappers) を使えるようにしましょう。
ちなみに、Cygwin で telnetd や sshd を実装するのは、
Cygwin を載せている Windows マシンをリモート管理するためというのが主です。
特に、Windows 上でのログオンを許可せずに、リモートからパスワードだけ
簡易に変更するための手法を準備するにはかなり良い選択肢だと思います。
Cygwin 上の telnet のばあいはプレーンテキストでパスワードが流れるので、
できれば ssh のほうが良いのですが、普通の人に ssh クライアントの準備などを
求めるのは酷だとおもうので、これで勘弁してあげます・・・。
必要なパッケージのインストール
2003/02/08 以降に私のページのインストール方法を使用した人は
特に確認する必要はありませんが、
それ以外の方法でインストールした人は Cygwin 本体以外に
以下のパッケージをインストールしておく必要があるので確認してください。
- inetutils
- terminfo
- login
- tcp_wrappers
- cygrunsrv
インストールは Cygwin 標準の setup.exe から実施しましょう。
このとき、inetd に必要なコンフィグファイルもいっしょに作成されるはずです。
PATH の設定
次にシステム環境変数の PATH の最後に
C:\cygwin\bin
を追加しましょう。
これは inetd をサービスから実行するにあたって必須です。
必ず実施してください。
そして、システム環境変数の変更は ユーザレベル にはすぐに反映されますが、
OS レベル (サービスとかは OS レベル) への反映は次回の起動時です。
トラブルを避けるためにもここで「再起動」してください。
トラブルを感じたくなければ面倒でも「再起動」です。
Windows 上のサービスにインストール
バイナリのインストールがすんで準備が整ったら、
Windows 上のサービスにインストールしましょう。
$ /usr/sbin/inetd --install-as-service
以上で、inetd が "CYGWIN inetd" という名前でサービスに登録されました。
tcp_wrappers をつかう
デフォルトのままの inetd.conf だと、直接 daemon が起動されて、
IP ベースのアクセス制御が行えません。
ので、そのためのソフトウェアである tcp_wrappers を導入しましょう。
方法は簡単です。
/etc/inetd.conf を以下のように編集するだけです。
デフォルト状態の /etc/inetd.conf (抜粋)
telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd
↓
tcp_wrappers を有効にした状態の /etc/inetd.conf (抜粋)
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
以上で inetd に tcp_wrappers が有効になりましたので、
次は tcp_wrappers のためのアクセス定義ファイルを作成しましょう。
まぁ、アクセス定義ファイルとたいそうな名前で呼んではみたものの、
ご存知の方も多い /etc/hosts.deny /etc/hosts.allow です。
説明はいろんなとこでされてるので、ここでは軽く例をあげるにとどめます。
/etc/hosts.deny は以下のようにする (デフォルト拒否の設定)
ALL : ALL
/etc/hosts.allow には許可したいサービスとホストを設定
ALL : 192.168.1.1 127.0.0.1
in.telnetd : 10.0.0.0/255.0.0.0
さらに、inetd.conf を編集して、使わないサービスを '#' で無効化しましょう。
以上の作業で、inetd.conf ( /etc/hosts.allow /etc/hosts.deny ) で
許可したサービスを使えるようになります。
実際につかうときの注意点
基本的に Cygwin の inetutils が普通にインストールできれば、
サービスの起動までは特に問題なく行えるはずですので、
tcp_wrappers で許可したホストからのアクセスがうまくいかないときの調査法です。
以下のコマンドを実行すれば、どういうアクセスが許可されてるか表示できます。
$ tcpdchk -v
Using network configuration file: /etc/inetd.conf
>>> Rule /etc/hosts.allow line 1:
daemons: ALL
clients: 192.168.1.1 127.0.0.1
warning: /etc/hosts.allow, line 1: host name/address mismatch: 127.0.0.1 != HOSTNAME
access: granted
>>> Rule /etc/hosts.allow line 2:
daemons: in.telnetd
clients: 10.0.0.0/255.0.0.0
access: granted
>>> Rule /etc/hosts.deny line 1:
daemons: ALL
clients: ALL
access: denied
そして、実行結果をみてわかるのは自分自身に 127.0.0.1 でアクセスできないということ。
どうやら、
127.0.0.1 -逆引き->
HOSTNAME -正引き->
192.168.1.1
となるために、127.0.0.1 では自分自身にアクセスできません。
変に設定で回避しようとすると、セキュリティ的に甘くなったりしますので
あきらめて自分自身に正常にふられている HOSTNAME なり、
IP アドレスなりでアクセスするようにしましょう。
パスワードの変更だけを許可する (参考)
「telnet をなぜ使うか」を記述したときに書いたので、その方法を簡単に紹介します。
マイクロソフトドメイン (アクティブディレクトリ) を構築していない場合に、
ファイルサーバを作ると、ファイルサーバ上でパスワードを変更しない限り、
ユーザのパスワードを変更できない状態になります。
この場合、ほとんどの人が管理者の設定したデフォルトパスワードになってしまい、
とてもよろしくない状態になります。
とはいっても、ファイルサーバに一般の人がログオンできるようにするのは
さらによろしくない感じです。
そういうときにこそ、Cygwin の telnet を活用しましょう。
うまく利用した方法は以下の方法です。
- 新しくグループ ms-share を作成
- [ローカルセキュリティポリシー]-[ユーザー権利の割り当て] より
ms-share に [ネットワーク経由でコンピュータへアクセス] の権利のみを割り当てる
- Windows NT / 2000 / XP 上で共有のみにアクセスするためのユーザを作る
- 作成したユーザを users グループの所属を解除し、ms-share グループのみに所属させる
- 作成したユーザに "" (NULL) 以外のパスワードを設定する(超重要)
- Windows 上のユーザ/グループを Cygwin 上に以下のような方法で反映させる。
$ mkpasswd -l | grep 'ユーザ名' >> /etc/passwd
$ mkgroup -l | grep 'ms-share' >> /etc/group
- vi /etc/passwd にてログインシェルを /usr/bin/passwd に変更
- vi /etc/shells に /usr/bin/passwd のエントリを追加する
この方法で作成したユーザは telnet で接続すれば、
パスワードの変更だけを行うことができ、
このパスワードの変更は、Windows 上のアカウントのパスワードにも反映されます(当然)。
これによって、
ユーザが任意のタイミングで自分のパスワードの変更ができます。
Samba よりはこっちのほうが安定して動くかも?
でも、機能的には明らかに Samba の方が上だけれど・・・
inetd を使わなくなったら
Windows 上のサービスからアンインストール
Cygwin をアンインストールするときや、
inetd を使わなくなったときなどはサービスからアンインストールしましょう。
以下のコマンドでアンインストールができます。
$ inetd --remove-as-service
サービスから名前が消えていることを確認してください。