Windows Serverでtftpサービスを起動する:Tech TIPS
tftpは、UDPを使った軽量なファイル転送プロトコルである。Windowsでは、RISやPXEサービスといった、ネットワークブート環境で利用される。Windows Server OSにはtftpのサーバプログラムtftpd.exeが用意されているので、これを使ってtftpサーバを構築できる。セキュリティ対策のため、可能ならば書き込み(アップロード)を禁止しておくとよい。
対象OS:Windows 2000 Server/Windows Server 2003
■記事内目次
[本Tech TIPSに対する注意事項]
2006年12月13日、マイクロソフトからセキュリティ更新プログラムMS06-077が公開された。これは本Tech TIPSで解説しているtftpd.exeに関する脆弱性に対処するためものである。そのため本Tech TIPSの方法でtftpdサービスをインストールした後は、MS06-077のセキュリティ対策を施す必要がある。またすでに本Tech TIPSの方法に基づいてこのサービスを利用している場合も、同様の対策を行う必要がある。詳細については、稿末の解説を参照していただきたい。
tftp(Trivial File Transfer Protocol)プロトコルは、UDPを使った簡易ファイル転送プロトコルである(プロトコルはRFC1350で定義されている)。TCPを使った通常のFTPプロトコルと比べると低機能な半面、非常に「軽量な」プロトコルだ(ネットワークでは、機能がシンプルで制御が容易なものを「軽量」と呼ぶことが多い)。
tftpはユーザーが直接使う機会は少なく、システム起動時のブートストラップ用プロトコルとして使われることが多い。システム起動時には、TCPのような複雑で高度な制御が必要なプロトコルを実装して利用することは困難だからだ。
tftpは、Windows Server OSのRIS(リモートインストールサービス)やPXE(Preboot eXecution Environment。ブート前実行環境)でも利用されているし、一般的にはディスクレスコンピュータのブート用途などで利用されている。これらの環境では、BOOTPやDHCPで各コンピュータの構成情報を取得し、さらにtftpで実際のOSコードなどをサーバからダウンロードしてシステムを起動している。
Windows Server OSではRISを導入するとtftpdサービスが利用できるようになる。ただし、RISを使わない場合でも、単独でtftpdサービスを導入することも可能である。本Tech TIPSではこの方法について解説する。
●セキュリティ対策に対する追記
冒頭でも述べているように、RISのtftpdサービスに対して、現在ではセキュリティ修正プログラムが提供されている。以下の方法でtftpdサービスを手動で導入すると、このセキュリティ修正プログラムの適用対象外となる。可能ならRISサービスを導入し、tftpdサービスだけを利用する、といった運用方法も検討していただきたい(これならば適用対象となる)。
手順1――tftpd.exeファイルを用意する
tftpdサービスをセットアップするには、管理者としてログオンし、以下の操作を行う。
tftpdのサーバプログラムである「tfptd.exe」ファイルは、デフォルトでは「%windir%\system32\dllcache」の下に置かれているので、これを手動で「%windir%\system32」フォルダへコピーする。「%windir%」はWindows OSのシステムファイルが置かれているフォルダであり、Windows 2000では「C:\WINNT」、Windows Server 2003では「C:\Windows」がデフォルトとなっている。
C:\>cd C:\WINDOWS\system32
C:\WINDOWS\system32>copy dllcache\tftpd.exe ……ファイルをコピーする
1 個のファイルをコピーしました。
手順2――tftpd.exeをサービスとして登録する
次はtftpd.exeをサービスとしてシステムに登録し、OS起動時に自動的にサービスが開始されるように設定する。このためには、「sc.exe」というコマンドツールを利用する。
sc.exeは、コマンドラインからサービスを制御するためのツールであり、Windows XPやWindows Server 2003には標準で含まれている。Windows 2000 Serverの場合はリソースキットに含まれているので、リソースキットをインストールするか、Windows XPやWindows Server 2003を使ってリモートから操作すればよい。
scコマンドの一般的なフォーマットは「sc <コマンド名> <パラメータ>……」である。ただし、リモートのコンピュータを指定する場合は「sc \\<サーバ名> <コマンド名> <パラメータ>……」とする。
tftpd.exeを「tftpd」というサービス名でシステムに登録するには、次のコマンド(sc createコマンド)を実行する。
C:\>sc \\<サーバ名> create tftpd binPath= c:\windows\system32\tftpd.exe
[SC] CreateService SUCCESS
「\\<サーバ名>」は対象となるサーバ名の指定である。ローカルのコンピュータの場合はこの部分は省略してもよい。
「tftpd」はサービス名、「binPath= c:\windows\system32\tftpd.exe」は登録するプログラムのパス名の指定である(パス名に空白文字が含まれている場合は引用符で囲む。また「binPath=」の直後には空白を入れること)。
手順3――tftpdサービスを確認して開始する
tftpdサービスを登録したら、その内容を確認し、システム起動時に自動的に開始するように設定する。このためにはscコマンドを使うか、[管理ツール]の[サービス]を利用する。サービスの開始/停止には、sc start/sc stopコマンドだけでなく、net start/net stopコマンドも利用できる 。
C:\>sc \\<サーバ名> query tftpd ……サービスの確認
SERVICE_NAME: tftpd
TYPE : 10 WIN32_OWN_PROCESS
STATE : 1 STOPPED
(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 1077 (0x435)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
C:\>sc \\<サーバ名> config tftpd start= auto ……自動開始に設定する
[SC] ChangeServiceConfig SUCCESS
C:\>net start tftpd ……サービスの開始
tftpd サービスを開始します.
tftpd サービスは正常に開始されました。
サービスの管理ツールを使う場合は、以下の設定を行う。
手順4――tftpdフォルダを作成する
tftpdはデフォルトでは、システムドライブの「\tftpdroot」フォルダ(c:\tftpdroot)をファイル転送のルートとして利用する。そのため、このフォルダを作成しておく必要がある。
C:\>mkdir c:\tftpdroot
クライアントからtftpコマンドでファイルをputするとこの中に書き込まれ、getする場合はこの中のファイルしかアクセスすることはできない。tftpプロトコルにはユーザー認証がないので、FTPと違って、ファイルやフォルダごとに個別のアクセス権限を付けることはできない。だが、tftpd.exeではレジストリを設定することにより、いくらかのアクセス制限やログファイルの設定などを行うことができる(後述)。
手順5――tftpサーバの動作を確認する
tftpのクライアントプログラムであるtftp.exeは、ServerでないWindows OSにも搭載されているので、これを使って動作を確認する。
●tftpサーバからファイルを取得してみる
tftpサーバからファイルをダウンロードするには、次のようなコマンドを実行する。
C:\>tftp <サーバ名> get testfile.data local-testfile.data
Transfer successful: 3983 bytes in 1 second, 3983 bytes/s
これは、<サーバ名>のサーバ上のtestfile.dataというファイルをローカルへ転送するコマンドである。ローカル側のファイル名(local-testfile.data)を省略すると、同じ名前のファイルがローカル側に作成される。ワイルドカードは使用できないし、サーバ側のファイル名の一覧を取得することもできない。
●tftpサーバにファイルを送信してみる
逆に、tftpサーバへ送信するには、putを使う。
C:\>tftp <サーバ名> put testfile.data dest-testfile.data
Transfer successful: 3983 bytes in 1 second, 3983 bytes/s
これは、ローカル側のtestfile.dataというファイルをtftpサーバへdest-testfile.dataという名前で保存するコマンドである(サーバ側のファイル名は省略可能)。
いずれも、デフォルトではアスキーモードで転送されるが(行末コードの変換が行われる)、バイナリモードで転送するには、「tftp -i <サーバ名> get testfile.data」「tftp -i <サーバ名> put testfile.data」というように、先頭に「-i」オプションを指定する。
tftpの送信機能を禁止する
デフォルトでは、tftpサーバに対する送信(put、アップロード)が許可されている。だが、tftpでは認証機能がないため、不正なアップロードでファイルが破壊されたり、上書きされたりする可能がある。またWindows 2000 Serverの場合は、セキュリティ情報MS06-077で示されるように、脆弱性が悪用される危険性もある。そのため、必要がなければ送信機能は無効にしておくのがよい。システムのブートやRISなどの用途ではtftpでアップロードできる必要はない。具体的な禁止方法については最後の部分を参照していただきたい。
●tftpd.exeの設定変更
tftpd.exeは、レジストリを変更することにより、接続可能IPアドレスの制限や、書き込み(クライアントからサーバへの転送)の禁止など、いくつかのアクセス制限やログ、設定などを行うことができる。詳細については、tftpd -?で表示されるヘルプメッセージを参考にしていただきたい。ただしこのメッセージはWindows Server 2003では表示されないので、以下にWindows 2000 Server上での実行結果を掲載しておく。
C:\>tftpd -?
==============================================================
Abstract:
This implements an RFC 783 tftp daemon.
It listens on port 69 for requests
and spawns a thread to process each request.
TFTPD USAGE and Installation:
md d:/tftpd (the StartDirectory).
copy //MohsinA_p90/test/tftpd.exe .
sc create tftpd binPath= d:/tftpd/tftpd.exe (give full path).
sc query tftpd (check if installed).
Start:
sc start tftpd -f (creates a log file).
or sc start tftpd
or net start tftpd
or sc start tftpd [-dStartDirectory] [-e] [-f]
Options: -e use event log.
-f log to file.
-dStartDirectory
Info:
sc interrogate tftpd (logs will be updated).
sc query tftpd Check whether running.
Stop:
sc stop tftpd
net stop tftpd
Variables that control what files can be read/written and by whom:
StartDirectory - only files there will be accessible.
LogFile is created here.
ValidClients - Clients matching this ip address can read files.
eg. you can set it to "157.55.8?.*"
ValidMasters - clients matching this can write and read files.
eg. you can set it to "" and no one can write.
ValidReadFiles - only matching files will be served out, eg. "r*.t?t"
ValidWriteFiles- only matching files will be accepted, eg. "w*.txt"
Client:
tftp [-i] servername {get|put} src_file dest_file
-i from binary mode, else ascii mode is used.
==============================================================
TFTPD_DEFAULT_DIR is \tftpdroot\
TFTPD_LOGFILE is tftpd.log
Registry key names, all strings: HKEY_LOCAL_MACHINE System\CurrentControlSet\Services\tftpd\parameters
o StartDirectory keyname "directory"
These keys are shell patterns with * and ? (see examples above):
o ValidClients keyname "clients"
o ValidMasters keyname "masters"
o Readable files keyname "readable"
o writable files keyname "writable"
C:\>
●セキュリティ更新プログラムMS06-077に対する措置
2006年12月13日、マイクロソフトからセキュリティ更新プログラムMS06-077が公開された。これは本Tech TIPSで解説しているtftpd.exeに関する脆弱性に対処するためのものである。
そのため本Tech TIPSの方法でtftpdサービスを手動でインストールした後は、MS06-077のセキュリティ対策を施す必要がある。またすでに本Tech TIPSの方法に基づいてこのサービスを利用している場合も、同様の対策を行う必要がある(Windows 2000 Serverだけでなく、Windows Server 2003の場合も行うこと)。
RISサービスをWindows 2000 Serve上にインストールすると、本Tech TIPSでも解説しているtftpd.exeを使ったtftpdサービスが導入される。そのtftpサーバの機能に問題がある。tftpには認証機能がないため、すでに存在するファイルに対するアップロード要求の場合には、認証されずに上書きされてしまう。その結果、不正なファイルがクライアントへtftpでダウンロードされ、利用される可能性がある。
これを防ぐため、MS06-077の更新プログラムでは、tftpdサービスに対するアップロード(tftpのクライアントから本tftpdサービスに対するput転送)を禁止し、ダウンロードのみ(クライアントから見るとgetのみ)を許可するようにレジストリを設定する。
MS06-077のタイトルは「RISサービス」となっているものの、対象は、RISサービスを構成するコンポーネントの1つであるtftpd.exeである。ただしMS06-077の修正プログラムではこのファイルそのものはいっさい更新せず、tftpdサービスが参照するレジストリのみを更新する。
tftpdでは、デフォルトでファイルの送受信が可能になっている。そこでMS06-077では、レジストリを変更して、クライアントからのアップロード(クライアントからのputによる書き込み)を禁止している。これにより、不正なファイルを含め、すべてのアップロードが禁止される。ダウンロードしかできなくなるものの、通常のリモートブートの用途ではダウンロードしか行わないので、このような対処方法でも問題ないだろう。
Windows Server 2003の場合は少し事情が異なっている。
- RISサービスのインストール時に該当するレジストリが自動的に設定されるので、デフォルトでアップロードは禁止されている
- レジストリを解除してアップロードを許可しても、すでに存在するファイルへの上書きはエラーとなる
これらの理由により、Windows 2000 Serverの場合よりも問題は少ない。だが手動でtftpdサービスをセットアップした場合にはレジストリエントリは存在しないので、アップロード可になっている(ただし上書きはできない)。安全性を考えると、アップロードは常時禁止とすることが望ましい。
●MS06-077のインストールのための前提条件
MS06-077はレジストリを変更する際、RISサービスがすでにインストール済みかどうかを確認する。そしてRISサービスがインストールされていなければ実行を中止する。そのため、本Tech TIPのように、RISサービスをインストールせず、tftpd.exeを直接サービスとして登録、実行している環境では、MS06-077を実行しても何も修正されない。また自動更新やWindows Update、Microsoft Update、MBSAなどでも、このようなケースでは何も検出されない。
そのため、本Tech TIPSの方法で手動でtftpd.exeを登録した場合は、MS06-077に示されている回避策(「TFTP サービスを読み取り専用に設定する」)を、自分自身で行う必要がある。以下にその方法を示す。
●回避策:tftpに対するファイルアップロードの禁止
MS06-077の脆弱性を回避するには、該当Webページで指示されている回避策を、ユーザー自身が手動で行う。これは修正プログラムが行っている処理と同じものである。具体的には、以下のレジストリキーと値を新規追加し、その値を空の文字列に設定する。これにより、tftpサーバに対するアップロード(put)ができなくなる。
[注意]
レジストリに不正な値を書き込んでしまうと、システムに重大な障害を及ぼし、最悪の場合、システムの再インストールを余儀なくされることもあります。レジストリの操作は慎重に行うとともに、あくまでご自分のリスクで設定を行ってください。何らかの障害が発生した場合でも、本Windows Server Insider編集部では責任を負いかねます。ご了承ください。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEの System\CurrentControlSet\Services\TFTPD\Parameters |
値の名前 | Masters |
型 | REG_SZ |
値の内容 | (空の文字列) |
tftpでアップロード禁止にするための設定 |
上記のレジストリ設定にある値「Masters」は、本来はアップロードを許可するクライアント(コンピュータ名)のリストを記述するために使われる。これを空文字列に設定することにより、すべてのクライアントからのアップロードが禁止される。
なおMS06-077のWebページの回避策の記述では、DWORD型のMastersという値を新規作成し値を0にする、となっている。この方法でもアップロードは禁止できるようだ。しかし、実際のMS06-077のセキュリティ更新プログラムでは、REG_SZ型の値を作成しているので、ここではその方法を記述しておく。
Windows Server 2003の場合は、RISサービス導入時に自動的にこの値(REG_SZ型の空文字列値)が作成される。ただし、手動でtftpdサービスを導入した場合には存在しないので、必ず作成して、アップロードを禁止しておくこと。
レジストリの設定が済んだら、有効化するために、tftpdサービスを再起動する。[サービス]管理ツールで再起動してもよいし、次のようなコマンドを使って再起動してもよい。
C:\>net stop tftpd ……サービスの停止
tftpd サービスは正常に停止されました。
C:\>net start tftpd ……サービスの再起動
tftpd サービスを開始します.
tftpd サービスは正常に開始されました。
C:\>
●ファイルアップロード禁止の確認
以上で設定は終了である。クライアントからtftpでファイルをputし、アクセスが拒否されることを確認する。
C:\>tftp sysserver01 put sample.txt ……ファイルの書き込み(アップロード)
Error on server : Access violation ……拒否されている
C:\>
■この記事と関連性の高い別の記事
■更新履歴
【2006/12/15】セキュリティ更新情報MS06-077について追記しました。
【2005/05/07】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.