アプリ開発ときどきアウトドア

主にJavaを使ったアプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

1. システムエンジニアリング windows 基盤技術 開発標準化

開発・検証用の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コマンドでユーザを作成する。
    PS > net user ftpuser1 mypassword /add /fullname:"ftpuser1"
    コマンドは正常に終了しました。
    PS > wmic useraccount where "NAME='ftpuser1'" set PasswordExpires=false
    '....Domain="myserver",Name="ftpuser1"' のプロパティを更新しています
    プロパティは正しく更新されました。
    
    可能な限り下記の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コマンドで動作確認を行います。
    C:\Users\test>ftp localhost
    myserver に接続しました。
    220 Microsoft FTP Service
    200 OPTS UTF8 command successful - UTF8 encoding now ON.
    ユーザー (myserver:(none)): ftpuser1
    331 Password required
    パスワード:
    230 User logged in.
    ftp> ls
    200 EPRT command successful.
    125 Data connection already open; Transfer starting.
    tmp
    226 Transfer complete.
    ftp: 8 バイトが受信されました 0.00秒 8000.00KB/秒。
    ftp> cd tmp
    250 CWD command successful.
    ftp> put test.txt
    200 EPRT command successful.
    125 Data connection already open; Transfer starting.
    226 Transfer complete.
    ftp: 14 バイトが送信されました 0.00秒 14.00KB/秒。
    ftp> get test.txt test2.txt
    200 EPRT command successful.
    125 Data connection already open; Transfer starting.
    226 Transfer complete.
    ftp: 14 バイトが受信されました 0.00秒 14000.00KB/秒。
    ftp> quit
    221 Goodbye.
    

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

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

  1. IISマネージャのFTPサイトホームで、[FTPユーザーの分離]をダブルクリックする。
  2. [ユーザー名ディレクトリ]を選択する。
  3. ホームディレクトリを作成する。
    FTPサイトの物理パスの直下に、各ユーザ用のホームディレクトリを格納するためのLocalUserフォルダ(C:\inetpub\ftproot\LocalUser)を作成する。
    またその直下に、ログインユーザー名と同名のフォルダを作成し、アクセス許可を設定する。下記例ではフルコントロールを設定している。
  4. 前回同様にコマンドプロンプトやPowerShellにて、ftpコマンドで動作確認を行います。
    PS C:\Users\test> ftp localhost
    myserver に接続しました。
    220 Microsoft FTP Service
    200 OPTS UTF8 command successful - UTF8 encoding now ON.
    ユーザー (myserver:(none)): ftpuser1
    331 Password required
    パスワード:
    230 User logged in.
    ftp> dir
    200 EPRT command successful.
    125 Data connection already open; Transfer starting.
    226 Transfer complete.
    ftp> pwd
    257 "/" is current directory.
    ftp> put test.txt
    200 EPRT command successful.
    125 Data connection already open; Transfer starting.
    226 Transfer complete.
    ftp: 14 バイトが送信されました 0.00秒 14000.00KB/秒。
    ftp> get test.txt test2.txt
    200 EPRT command successful.
    125 Data connection already open; Transfer starting.
    226 Transfer complete.
    ftp: 14 バイトが受信されました 0.00秒 14000.00KB/秒。
    ftp> quit
    221 Goodbye.
    

【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”、パスワードは任意(空でも良い)を指定します。

    C:\Users\test>ftp localhost
    myserverに接続しました。
    220 Microsoft FTP Service
    200 OPTS UTF8 command successful - UTF8 encoding now ON.
    ユーザー (myserver:(none)): anonymous
    331 Anonymous access allowed, send identity (e-mail name) as password.
    パスワード:
    230 User logged in.
    ftp> ls
    200 EPRT command successful.
    125 Data connection already open; Transfer starting.
    readme.txt
    226 Transfer complete.
    ftp: 15 バイトが受信されました 0.00秒 15000.00KB/秒。
    ftp> get readme.txt
    200 EPRT command successful.
    125 Data connection already open; Transfer starting.
    226 Transfer complete.
    ftp: 12 バイトが受信されました 0.00秒 12000.00KB/秒。
    ftp> put test.txt
    200 EPRT command successful.
    550-Access is denied.
     Win32 error:   Access is denied.
     Error details: File system denied the access.
    550 End
    ftp> quit
    221 Goodbye.

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

このような条件のアクセスは一般的に考えづらいが、次のように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


(adsbygoogle = window.adsbygoogle || []).push({});


(adsbygoogle = window.adsbygoogle || []).push({});

-1. システムエンジニアリング, windows, 基盤技術, 開発標準化

執筆者:

関連記事

wildflyアップロードサイズ上限

多くのWebサーバやAPサーバでは、サーバリソースの過剰な消費やDoS攻撃に対する対処として、アップロードの最大サイズが決められている。(厳密には、ブラウザから入力値やファイル等のデータを送信するため …

技術検証

Linuxでの gdrive の使い方

wordpressのデータをgoogle driveにバックアップするための基礎調査を行っている。 google driveに接続可能なライブラリは幾つかあるようだが、ここでは無料でお手軽に始められそ …

Javaでのパスワード付きzipファイルの圧縮/解凍方法(ZipCrypto/AES)

先日、JavaでのZIP暗号化の考察という記事を書きましたが、zip4jのメンテナンスが再開されており、バージョン2系が公開されていましたので、これを使って通常のzip圧縮/解凍、パスワード付きzip …

Javaによるzipファイルの安全な解凍方法

以前、業務アプリ(Java)でzipファイルの操作が必要となったため、Javaにおけるzip圧縮解凍について調査しました。また、zip4jを使った圧縮・解凍についても説明しました。 ここでは、もう少し …

WebサイトのSSL化

次のようなGoogleウェブマスター向け公式ブログでの推奨や、リモートか管理の安全性向上の向上のためにSSL(TLS)を有効にする。 概要 Googleさんの考え 保護されたウェブの普及を目指して(2 …

プロフィール ゆっきーです。
都内でシステムエンジニアをやっています。
もっと詳細を見る