開発・検証用のFTPサーバ(IIS)を構築

FTPで外部連携するためのプログラムを開発する際に、接続先のFTPサーバの準備に困る場合があります。
ここでは、Widnwos10上に開発・検証用のFTPサーバを構築するための手順を説明します。
「IIS(FTPサーバ)のインストール」でIISをインストール後、用途に応じて「認証が必要なFTPサイトの構成方法」または「匿名アクセスが可能なFTPサイトの構成方法」を実施してください。

前提

  • 開発者がWindows10を使用しており、この環境でFTPを使用するアプリケーションを開発する想定をしています。開発者自身が自由にFTPサーバを操作できるようローカルに、FTPサーバを構築する前提となります。
  • 企業によっては、外部からのソフトウェアのダウンロードやインストールが禁止されている場合があります。このような制約を受けないようにするために、Windowsの標準コンポーネントに含まれるIISを使用します。
  • ローカルのプログラムからFTP接続する想定であるため、外部からのFTP操作を行うような設定は考慮していません。外部からFTP操作を行いたい場合、Windows Firewallの設定やバインドアドレスの変更が必要になる場合があります。

IIS(FTPサーバ)のインストール

  1. [コントロールパネル]-[システムとセキュリティ]-[プログラム]-[Windowsの機能の有効化または無効化]をクリックする。
  2. 表示された[Windowsの機能]ウインドウで、[インターネット インフォーメーション サービス]を開く。[FTPサーバー]と[Web管理ツール]をチェックし、[OK]をクリックする。その後、インストールが完了するまで待つ。

    【参考】[FTPサーバー]に含まれる[FTP拡張]は、ユーザ独自の認証/認可を開発する場合に使用するコンポーネントです。詳細はこちらを参照のこと。

認証が必要なFTPサイトの構成方法

接続用ユーザを作成後に、認証が必要なFTPサイトを構成し、接続用ユーザを使って動作を確認します。

接続用ユーザの作成

ドメインユーザを利用することもできるようですが、ここではローカルPC上のWindowsユーザを作成します。
以降では、ftpuser1というユーザを作成する場合の手順例です。

コマンドラインから作成する方法:
  1. コマンドプロンプトまたはPowerShellを管理者権限で起動する。
  2. 次のようにnet/wmicコマンドでユーザを作成する。
    可能な限り下記のGUIと同じユーザ属性が設定されるよう、fullnameオプション等を選択しています。net userコマンドで[パスワードを無期限にする」を設定するには、”/EXPIRES:NEVER”を指定すれば良さそうに見えますが、これはアカウントの有効期限を設定するオプションであり、ユーザ作成後にGUIで確認してもチェックは入っていません。(詳細はMSのリファレンスを参照のこと。”/EXPIRES”オプションの説明として、”Causes the user account to expire if you specify the date”とあります。)
    パスワードの有効期限を設定するにはwmicを使うそうです。
GUIから作成する方法:
  1. [スタートメニュー]右クリック-[コンピューターの管理]をクリックする。
  2. [コンピューターの管理]-[ローカルユーザーとグループ]-[ユーザー]を右クリックし、[新しいユーザー]をクリックする。
  3. ユーザ情報を入力し、[OK]をクリックする。
    開発用ユーザであるため[ユーザーは次回ログイン時にパスワードの変更が必要]のチェックを外し、[パスワードを無期限にする]をチェックする。

FTPサイトの構成

認証されたユーザがファイルをアップロード・ダウンロードできるサイトを構成します。

  1. [コントロール パネル]-[システムとセキュリティ]-[管理ツール]を開き、[インターネット インフォメーション サービス (IIS) マネージャー]をダブルクリックする。
    (または、Windows+Rから”inetmgr”を入力して起動できます。)
  2. [接続]タブで[サイト]を右クリックし、[FTPサイトの追加…]をクリックします。
  3. FTPサイト名と物理フォルダを指定する。
  4. バインドとSSLの設定を指定する。
    今回、SSLを指定する予定はないので[無し]を指定する。
  5. 認証と承認(認証と認可)の設定を指定する。
    [認証]は[基本]をチェックする。[アクセス許可]では[すべてのユーザー]を指定する。実運用のFTPサーバであればアクセス可能なユーザを制限すべきですが、今回は開発用なので、これで良しとします。
  6. 動作確認用の読み書き可能なフォルダを作成する。
    下記例は、認証されたユーザで共通のフォルダtmpを使用する想定であり、認証されたユーザに対してフルコントロールを付与する。
  7. コマンドプロンプトやPowerShellにて、ftpコマンドで動作確認を行います。

ユーザ毎のホームディレクトリを使用する場合

業務要件やテスト等の目的で、ユーザ毎に異なるホームディレクトリを使用(別のユーザのディレクトリは参照できない)ようにしたい場合があります。
これは、IISの「FTPユーザの分離」(FTP User Isolation)という機能を使って実現できます。この機能で、ユーザを分離するためにいくつかのモードを選択でき、このモードやユーザの種別によってホームディレクトリが暗黙的に決まる仕組みになっています。詳細は本節最後にある【参考】をご覧ください。

  1. IISマネージャのFTPサイトホームで、[FTPユーザーの分離]をダブルクリックする。
  2. [ユーザー名ディレクトリ]を選択する。
  3. ホームディレクトリを作成する。
    FTPサイトの物理パスの直下に、各ユーザ用のホームディレクトリを格納するためのLocalUserフォルダ(C:\inetpub\ftproot\LocalUser)を作成する。
    またその直下に、ログインユーザー名と同名のフォルダを作成し、アクセス許可を設定する。下記例ではフルコントロールを設定している。
  4. 前回同様にコマンドプロンプトやPowerShellにて、ftpコマンドで動作確認を行います。

【FTPユーザ分離の考察】

FTPユーザ分離とは、ユーザによるアクセス先をユーザディレクトリに限定する機能であり、この機能が有効な場合、別のログインユーザのディレクトリを参照できなくなります。FTPユーザ分離の公式リファレンスはこちらです。
FTPユーザ分離にはいくつかのモードがあります。GUI上のユーザ分離モードと、リファレンスのモードの対応は次の通り。(GUIでモードを変更し、”C:\Windows\System32\inetsrv\Config\applicationHost.config”のuserIsolation要素がどう変わるか検証した結果です。)

分類GUIのモード表記リファレンスのモード表記
ユーザを分離しないFTPルートディレクトリNone
ユーザー名ディレクトリStartInUsersDirectory
ユーザを分離するユーザー名ディレクトリ
(グローバルな仮想ディレクトリを無効にします)
IsolateAllDirectories
ユーザー名物理ディレクトリ
(グローバルな仮想ディレクトリを有効にします)
IsolateRootDirectoryOnly
ActiveDirectoryで構成されたFTPホームディレクトリActiveDirectory
(未検証)
カスタムCustom
(未検証)

ユーザ分離モードがIsolateRootDirectoryOnlyまたはIsolateAllDirectories)」の場合、物理・仮想ディレクトリは次の階層にする必要があるとのこと。今回の場合、IsolateAllDirectoriesモードを使う想定であり、認証対象はWindowsローカルユーザ(“Local Windows user accounts”)であるため、ユーザのホームディレクトリは”%FtpRoot%\LocalUser\%UserName%”になります。(2019年12月時点で、”%FtpRoot%\LocalUser%UserName%”とありますが、”%FtpRoot%\LocalUser\%UserName%”の間違いと思われます。)

匿名アクセスが可能なFTPサイトの構成方法

匿名ユーザ(anonymous)でログインし、ファイルをダウンロードできるFTPサイトを構成します。
(匿名ユーザが書き込み可能だとセキュリティ的に問題があるので、読み取りのみ可能な構成を前提とします。)

FTPサイトの構成

  1. [コントロール パネル]-[システムとセキュリティ]-[管理ツール]を開き、[インターネット インフォメーション サービス (IIS) マネージャー]をダブルクリックする。
    (または、Windows+Rから”inetmgr”を入力して起動できます。)
  2. [接続]タブで[サイト]を右クリックし、[FTPサイトの追加…]をクリックします。
  3. FTPサイト名と物理フォルダを指定する。
  4. バインドとSSLの設定を指定する。
    今回、SSLを指定する予定はないので[無し]を指定する。
  5. 認証と承認(認証と認可)の設定を指定する。
    [認証]は[匿名]をチェックする。
    [アクセス許可]では[すべてのユーザー]を指定する。
  6. コマンドプロンプトやPowerShellにて、ftpコマンドで動作確認を行います。
    ユーザ名には”anonymous”、パスワードは任意(空でも良い)を指定します。

匿名アクセスに書き込みを許可する場合

このような条件のアクセスは一般的に考えづらいが、次のようにFTPサイトのディレクトリ(C:\inetpub\wwwroot)に「匿名アクセス用ユーザ(既定ではIUSR)が変更できる権限」を付与することで実現できる。

匿名アクセスに使われるユーザアカウントは、[FTP認証]の[匿名認証]で確認できる。

トラブルシューティング

ディレクトリ構造やアクセス権限の設定が正しくない場合、ログイン時に下記のエラーが発生し、ログインに失敗します。このケースの場合、まずどのフォルダが要求されているのかを設定内容から推測する必要があります。

530-User cannot log in, home directory inaccessible. Win32 error:The system cannot find the file specified. Error details: File system returned an error.530 Endログインできませんでした。

書き込みの際に、対象フォルダのNTFSアクセス権がない場合は次のエラーが発生します。

550-Access is denied. Win32 error:Access is denied. Error details: File system denied the access.550 End

書き込みの際に、ユーザに対して「書き込み」が許可されていない場合([FTPの承認規制]の[アクセス許可]-[書き込み])、次のエラーが発生します。

550-Access is denied. Win32 error:Access is denied. Error details: Authorization rules denied the access.550 End